Supports magnifier window 39/262139/1
authorInHong Han <inhong1.han@samsung.com>
Wed, 30 Jun 2021 05:57:21 +0000 (14:57 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Tue, 3 Aug 2021 05:26:19 +0000 (14:26 +0900)
Change-Id: I64a0b811268ba746b02ae779f6cb69992a93c6c2

ISEDefaultNUI/Common/ResourceManager.cs
ISEDefaultNUI/ISEDefaultNUI.cs
ISEDefaultNUI/Interop/Interop.SclNui.cs
ISEDefaultNUI/MagnifierWindow.cs [new file with mode: 0644]
ISEDefaultNUI/SCLNUI.cs

index 1f2649e..1eea3c2 100644 (file)
@@ -11,6 +11,7 @@ namespace ISEDefaultNUI
         public const int MinSelectedLanguages = 1;
         public const int MaxSelectedLanguages = 4;
         public const int BackButtonSize = 50;
+        public const uint MagnifierShowDuration = 300;
 
         public const string IseConfigKeypadMode = "/ise-default/KeypadMode";
         public const string IseConfigSelectedLanguage = "/ise-default/SelectedLanguage";
index f642e40..5f87f62 100644 (file)
@@ -51,6 +51,7 @@ namespace ISEDefaultNUI
             SclNui.SetCurrentSublayout("DEFAULT");
             SclNui.SetStringSubstitution("_LANGUAGE_", currentLanguage.DisplayName);
             SclNui.SetUpdatePending(false);
+            SclNui.EnableMagnifier(IseConfig.Instance.PreviewOn);
             navigator.Push(SclNui);
         }
 
index 26e69b4..5ff8b40 100644 (file)
@@ -161,11 +161,11 @@ internal static partial class Interop
         //internal delegate void DrawTextCallback(SclFontInfo fontinfo, SclColor color, IntPtr str, int x, int y, int w, int h, int label_alignment, int padding_x, int padding_y, int inner_width, int inner_height, IntPtr userData);
         internal delegate void DrawTextCallback(IntPtr font_name, short font_size, bool is_italic, bool is_bold, int r, int g, int b, int a,
                                                 IntPtr str, int pos_x, int pos_y, int w, int h,
-                                                int align, int padding_x, int padding_y, int inner_width, int inner_height, IntPtr user_data);
+                                                int align, int padding_x, int padding_y, int inner_width, int inner_height, int type, IntPtr user_data);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         internal delegate void DrawImageCallback(IntPtr image_path, int dest_x, int dest_y, int dest_weight, int dest_height, 
-                                                 int src_x, int src_y, int src_width, int src_height, IntPtr user_data);
+                                                 int src_x, int src_y, int src_width, int src_height, int type, IntPtr user_data);
 
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         internal delegate void DrawRectangleCallback(int pos_x, int pos_y, int width, int height,
@@ -180,6 +180,9 @@ internal static partial class Interop
         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
         internal delegate int DragStateChangedCallback(IntPtr eventDesc);
 
+        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+        internal delegate void UpdateWindowPositionCallback(int type, int x, int y, int rotationX, int rotationY, IntPtr user_data);
+
         [DllImport(Libraries.SclNui, EntryPoint = "scl_nui_init")]
         internal static extern int SclNuiInit(string entry_filepath);
 
@@ -228,6 +231,12 @@ internal static partial class Interop
         [DllImport(Libraries.SclNui, EntryPoint = "scl_nui_set_drag_state_changed_cb")]
         internal static extern int SclNuiDragStateChangedCb(DragStateChangedCallback callbackFunction);
 
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_nui_set_update_window_position_cb")]
+        internal static extern int SclNuiUpdateWindowPositionCb(UpdateWindowPositionCallback callbackFunction, IntPtr userData);
+
+        [DllImport(Libraries.SclNui, EntryPoint = "scl_nui_enable_magnifier")]
+        internal static extern int SclNuiEnableMagnifier(bool enabled);
+
         [DllImport(Libraries.SclNui, EntryPoint = "scl_dbus_init")]
         internal static extern int SclDbusInit();
 
diff --git a/ISEDefaultNUI/MagnifierWindow.cs b/ISEDefaultNUI/MagnifierWindow.cs
new file mode 100644 (file)
index 0000000..8bf28c4
--- /dev/null
@@ -0,0 +1,119 @@
+using System.Collections.Generic;
+using Tizen.NUI;
+using Tizen.NUI.BaseComponents;
+using Tizen;
+
+namespace ISEDefaultNUI
+{
+    public class MagnifierPosition
+    {
+        public int X;
+        public int Y;
+        public int rotationX;
+        public int rotationY;
+
+        public MagnifierPosition(int X, int Y, int rotationX, int rotationY)
+        {
+            this.X = X;
+            this.Y = Y;
+            this.rotationX = rotationX;
+            this.rotationY = rotationY;
+        }
+    }
+
+    public class MagnifierWindow
+    {
+        private static MagnifierWindow instance;
+        private Timer timer;
+        private List<ImageView> imageList;
+        private List<TextLabel> labelList;
+        private MagnifierPosition position;
+
+        private MagnifierWindow()
+        {
+            timer = new Timer(ResourceManager.MagnifierShowDuration);
+            timer.Tick += TimerTick;
+            imageList = new List<ImageView>();
+            labelList = new List<TextLabel>();
+        }
+
+        private bool TimerTick(object source, Timer.TickEventArgs e)
+        {
+            if (IsExists())
+                Hide();
+
+            return true;
+        }
+
+        public static MagnifierWindow Instance
+        {
+            get
+            {
+                if (instance == null)
+                    instance = new MagnifierWindow();
+
+                return instance;
+            }
+        }
+
+        public void Show(View parent)
+        {
+            imageList.ForEach(image => parent.Add(image));
+            labelList.ForEach(label => parent.Add(label));
+            timer.Start();
+        }
+
+        public void Hide()
+        {
+            timer.Stop();
+
+            labelList.ForEach(label =>
+            {
+                label.Unparent();
+                label.Dispose();
+            });
+
+            imageList.ForEach(image =>
+            {
+                image.Unparent();
+                image.Dispose();
+            });
+
+            labelList.Clear();
+            imageList.Clear();
+        }
+
+        public void SetPosition(MagnifierPosition newPosition)
+        {
+            position = newPosition;
+        }
+
+        public MagnifierPosition GetPosition()
+        {
+            return position;
+        }
+
+        public void AddImage(ImageView imageView)
+        {
+            imageList.Add(imageView);
+        }
+
+        public void AddLabel(TextLabel textLabel)
+        {
+            labelList.Add(textLabel);
+        }
+
+        public bool IsExists()
+        {
+            if (imageList.Count != 0 || labelList.Count != 0)
+                return true;
+
+            return false;
+        }
+
+        public bool IsRunning()
+        {
+            return timer.IsRunning();
+        }
+    }
+}
index acfb32c..dd3913d 100644 (file)
@@ -18,6 +18,7 @@ namespace ISEDefaultNUI
         private UpdateWindowCallback _update_window_cb = null;
         private KeyClickEventCallback _onKeyClickEvent = null;
         private DragStateChangedCallback _onDragStateChangedEvent = null;
+        private UpdateWindowPositionCallback _updateWindowPositionChangedEvent = null;
 
         private List<ImageView> image_list;
         private List<TextLabel> label_list;
@@ -30,6 +31,8 @@ namespace ISEDefaultNUI
         private int beforePositionX = 0;
         private int afterPositionX = 0;
 
+        private MagnifierWindow magnifier = MagnifierWindow.Instance;
+
         enum LabelAlignment
         {
             LABEL_ALIGN_LEFT_TOP = 0,
@@ -44,6 +47,14 @@ namespace ISEDefaultNUI
             MAX_LABEL_ALIGNMENT
         }
 
+        enum WindowType
+        {
+            Keypad = 0,
+            Magnifier,
+            Dim,
+            Popup,
+        }
+
         struct SclPoint
         {
             public int x, y;
@@ -66,34 +77,55 @@ namespace ISEDefaultNUI
             //_draw_text_cb = (SclFontInfo fontinfo, SclColor color, IntPtr str, int x, int y, int w, int h, int label_alignment, int padding_x, int padding_y, int inner_width, int inner_height, IntPtr userData) =>
             _draw_text_cb = (IntPtr font_name, short font_size, bool is_italic, bool is_bold, int r, int g, int b, int a,
                              IntPtr str, int pos_x, int pos_y, int width, int height,
-                             int label_align, int padding_x, int padding_y, int inner_width, int inner_height, IntPtr user_data) =>
+                             int label_align, int padding_x, int padding_y, int inner_width, int inner_height, int type, IntPtr user_data) =>
             {
                 Log.Info("NUIIME", "### start draw text");
 
                 string FontName = Marshal.PtrToStringAnsi(font_name);
                 LabelAlignment align = (LabelAlignment)label_align;
                 string keystr = Marshal.PtrToStringAnsi(str);
+                WindowType windowType = (WindowType)type;
 
-                keyText = draw_text(FontName, font_size, is_italic, is_bold, r, g, b, a,
+                if (windowType == WindowType.Magnifier)
+                {
+                    MagnifierPosition magnifierPosition = magnifier.GetPosition();
+                    TextLabel magnifierText = draw_text(FontName, font_size, is_italic, is_bold, r, g, b, a,
+                                                        keystr, magnifierPosition.X, magnifierPosition.Y, width, height,
+                                                        align, padding_x, padding_y, inner_width, inner_height);
+                    magnifier.AddLabel(magnifierText);
+                }
+                else
+                {
+                    keyText = draw_text(FontName, font_size, is_italic, is_bold, r, g, b, a,
                                             keystr, pos_x, pos_y, width, height,
                                             align, padding_x, padding_y, inner_width, inner_height);
-                Add(keyText);
-                label_list.Add(keyText);
-
+                    Add(keyText);
+                    label_list.Add(keyText);
+                }
             };
             SclNuiSetDrawTextCb(_draw_text_cb, (IntPtr)null);
 
             /* Draw image */
-            _draw_image_cb = (IntPtr image_path, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height, IntPtr user_data) =>
+            _draw_image_cb = (IntPtr image_path, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height, int type, IntPtr user_data) =>
             {
                 string image_path_str = Marshal.PtrToStringAnsi(image_path);
+                WindowType windowType = (WindowType)type;
                 Log.Info("NUIIME", "image: " + image_path_str + ", x: " + dest_x + ", y: " + dest_y);
                 if (image_path_str.EndsWith("/"))
                     return;
 
-                imageView = draw_image(image_path_str, dest_x, dest_y, dest_weight, dest_height, src_x, src_y, src_width, src_height);
-                Add(imageView);
-                image_list.Add(imageView);
+                if (windowType == WindowType.Magnifier)
+                {
+                    MagnifierPosition magnifierPosition = magnifier.GetPosition();
+                    ImageView magnifierImageView = draw_image(image_path_str, magnifierPosition.X, magnifierPosition.Y, dest_weight, dest_height, src_x, src_y, src_width, src_height);
+                    magnifier.AddImage(magnifierImageView);
+                }
+                else
+                {
+                    imageView = draw_image(image_path_str, dest_x, dest_y, dest_weight, dest_height, src_x, src_y, src_width, src_height);
+                    Add(imageView);
+                    image_list.Add(imageView);
+                }
             };
             SclNuiSetDrawImageCb(_draw_image_cb, (IntPtr)null);
 
@@ -114,7 +146,10 @@ namespace ISEDefaultNUI
             {
                 Log.Info("NUIIME", "update_window");
 
-                UpdateArea(x, y, width, height);                
+                UpdateArea(x, y, width, height);
+
+                if (magnifier.IsExists() && !magnifier.IsRunning())
+                    magnifier.Show(this);
             };
             SclNuiUpdateWindowCb(_update_window_cb, (IntPtr)null);
 
@@ -182,6 +217,29 @@ namespace ISEDefaultNUI
             {
                 NUIApplication.Current.Exit();
             };
+
+            Preference.EventContext context = null;
+            Preference.GetEventContext(ResourceManager.IseConfigPreviewOn).TryGetTarget(out context);
+            if (context != null)
+            {
+                context.Changed += PreviewModeChanged;
+            }
+
+            _updateWindowPositionChangedEvent = (int type, int x, int y, int rotationX, int rotationY, IntPtr user_data) =>
+            {
+                WindowType windowType = (WindowType)type;
+                if (windowType == WindowType.Magnifier)
+                {
+                    magnifier.SetPosition(new MagnifierPosition(x, y, rotationX, rotationY));
+                }
+            };
+            SclNuiUpdateWindowPositionCb(_updateWindowPositionChangedEvent, (IntPtr)null);
+        }
+
+        private void PreviewModeChanged(object sender, PreferenceChangedEventArgs e)
+        {
+            IseConfig.Instance.ReadIsePreviewOn();
+            this.EnableMagnifier(IseConfig.Instance.PreviewOn);
         }
 
         ~SCLNUI()
@@ -313,7 +371,7 @@ namespace ISEDefaultNUI
 
             Log.Info("NUIIME", "### end draw text");
 
-            return key_text;            
+            return key_text;
         }
 
         View draw_rectangle(int pos_x, int pos_y, int width, int height, bool fill, int fill_color_r, int fill_color_g, int fill_color_b, int fill_color_a)
@@ -329,7 +387,7 @@ namespace ISEDefaultNUI
         ImageView draw_image(string image_path_str, int dest_x, int dest_y, int dest_weight, int dest_height, int src_x, int src_y, int src_width, int src_height)
         {
             Log.Info("NUIIME", "### start draw image");
-            
+
 
             ImageView imageView = new ImageView(image_path_str);
             imageView.Position = new Position(dest_x, dest_y);
@@ -337,11 +395,11 @@ namespace ISEDefaultNUI
 
             Log.Info("NUIIME", "### end draw image");
 
-            return imageView;            
+            return imageView;
         }
 
         void dispose_all_objects()
-        { 
+        {
             Log.Info("NUIIME", "Clear all objects");
 
             int i = 0;
@@ -362,7 +420,7 @@ namespace ISEDefaultNUI
             {
                 i++;
                 label_element.Unparent();
-                label_element.Dispose();                    
+                label_element.Dispose();
             }
             Log.Info("NUIIME", "Dispose labels (" + i + ")");
             label_list.Clear();
@@ -383,6 +441,9 @@ namespace ISEDefaultNUI
                 // - Set the mTouchedInButton to false
                 case PointStateType.Down:
                     {
+                        if (magnifier.IsExists())
+                            magnifier.Hide();
+
                         Log.Info("NUIIME", "[MOUSE DOWN] x=" + e.Touch.GetScreenPosition(0).X + ", y=" + e.Touch.GetScreenPosition(0).Y);
                         SclControllerMousePress((int)e.Touch.GetScreenPosition(0).X, (int)e.Touch.GetScreenPosition(0).Y);
                         beforePositionX = (int)e.Touch.GetScreenPosition(0).X;
@@ -423,5 +484,10 @@ namespace ISEDefaultNUI
         {
             return SclNuiSetStringSubstitution(original, substitute);
         }
+
+        public int EnableMagnifier(bool enabled)
+        {
+            return SclNuiEnableMagnifier(enabled);
+        }
     }
 }