diff --git a/InkCanvasForClass/MainWindow.xaml b/InkCanvasForClass/MainWindow.xaml index 3d489de..6df6bde 100644 --- a/InkCanvasForClass/MainWindow.xaml +++ b/InkCanvasForClass/MainWindow.xaml @@ -118,18 +118,6 @@ - - - - - - - - - - - - diff --git a/InkCanvasForClass/MainWindow.xaml.cs b/InkCanvasForClass/MainWindow.xaml.cs index 6999a14..1728c15 100644 --- a/InkCanvasForClass/MainWindow.xaml.cs +++ b/InkCanvasForClass/MainWindow.xaml.cs @@ -214,6 +214,8 @@ namespace Ink_Canvas { analyzer.Analyze(); } + public FloatingToolBarV2 FloatingToolBarV2; + private async void Window_Loaded(object sender, RoutedEventArgs e) { loadPenCanvas(); //加载设置 @@ -229,6 +231,9 @@ namespace Ink_Canvas { isLoaded = true; + FloatingToolBarV2 = new FloatingToolBarV2(); + FloatingToolBarV2.Show(); + BlackBoardLeftSidePageListView.ItemsSource = blackBoardSidePageListViewObservableCollection; BlackBoardRightSidePageListView.ItemsSource = blackBoardSidePageListViewObservableCollection; @@ -270,9 +275,6 @@ namespace Ink_Canvas { new HWND(new WindowInteropHelper(this).Handle) }); - var ftv2 = new FloatingToolBarV2(); - ftv2.Show(); - UpdateIndexInfoDisplay(); } diff --git a/InkCanvasForClass/MainWindow_cs/MW_Colors.cs b/InkCanvasForClass/MainWindow_cs/MW_Colors.cs index 30ad1ec..920a6b8 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_Colors.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_Colors.cs @@ -699,34 +699,29 @@ namespace Ink_Canvas { #region PenPaletteV2 private void PenPaletteV2Init() { - PenPaletteV2.ColorSelectionChanged += PenpaletteV2_ColorSelectionChanged; - PenPaletteV2.ColorModeChanged += PenpaletteV2_ColorModeChanged; - PenPaletteV2.CustomColorChanged += PenpaletteV2_CustomColorChanged; - PenPaletteV2.PaletteShouldCloseEvent += PenpaletteV2_PaletteShouldCloseEvent; - PenPaletteV2.PenModeChanged += PenpaletteV2_PenModeChanged; - PenPaletteV2.SelectedColor = ColorPalette.ColorPaletteColor.ColorRed; + FloatingToolBarV2.PenPaletteV2_ColorSelectionChanged += PenpaletteV2_ColorSelectionChanged; + FloatingToolBarV2.PenPaletteV2_ColorModeChanged += PenpaletteV2_ColorModeChanged; + FloatingToolBarV2.PenPaletteV2_CustomColorChanged += PenpaletteV2_CustomColorChanged; + FloatingToolBarV2.PenPaletteV2_PenModeChanged += PenpaletteV2_PenModeChanged; + FloatingToolBarV2.PenPaletteV2.SelectedColor = ColorPalette.ColorPaletteColor.ColorRed; } private void PenpaletteV2_ColorSelectionChanged(object sender, ColorPalette.ColorSelectionChangedEventArgs e) { if (e.TriggerMode == ColorPalette.TriggerMode.TriggeredByCode) return; - drawingAttributes.Color = PenPaletteV2.GetColor(e.NowColor, false, null); + drawingAttributes.Color = FloatingToolBarV2.PenPaletteV2.GetColor(e.NowColor, false, null); } private void PenpaletteV2_ColorModeChanged(object sender, ColorPalette.ColorModeChangedEventArgs e) { if (e.TriggerMode == ColorPalette.TriggerMode.TriggeredByCode) return; - drawingAttributes.Color = PenPaletteV2.GetColor(PenPaletteV2.SelectedColor, false, null); + drawingAttributes.Color = FloatingToolBarV2.PenPaletteV2.GetColor(FloatingToolBarV2.PenPaletteV2.SelectedColor, false, null); } private void PenpaletteV2_CustomColorChanged(object sender, ColorPalette.CustomColorChangedEventArgs e) { if (e.TriggerMode == ColorPalette.TriggerMode.TriggeredByCode) return; - if (PenPaletteV2.SelectedColor == ColorPalette.ColorPaletteColor.ColorCustom) + if (FloatingToolBarV2.PenPaletteV2.SelectedColor == ColorPalette.ColorPaletteColor.ColorCustom) drawingAttributes.Color = e.NowColor??new Color(); } - private void PenpaletteV2_PaletteShouldCloseEvent(object sender, RoutedEventArgs e) { - PenPaletteV2Popup.IsOpen = false; - } - private void PenpaletteV2_PenModeChanged(object sender, ColorPalette.PenModeChangedEventArgs e) { penType = e.NowMode == ColorPalette.PenMode.HighlighterMode ? 1 : 0; drawingAttributes.Width = e.NowMode == ColorPalette.PenMode.HighlighterMode ? Settings.Canvas.HighlighterWidth / 2 : Settings.Canvas.InkWidth; diff --git a/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs b/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs index 6a2fd54..e63de26 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs @@ -338,9 +338,7 @@ namespace Ink_Canvas { } // new popup - PenPaletteV2Popup.IsOpen = false; - SelectionPopupV2.IsOpen = false; - ShapeDrawingPopupV2.IsOpen = false; + FloatingToolBarV2.HideAllPopups(); await Task.Delay(20); isHidingSubPanelsWhenInking = false; @@ -919,14 +917,6 @@ namespace Ink_Canvas { // AnimationsHelper.ShowWithSlideFromBottomAndFade(PenPalette); // AnimationsHelper.ShowWithSlideFromBottomAndFade(BoardPenPalette); //} - - if (PenPaletteV2Popup.IsOpen == false) { - var transform = Pen_Icon.TransformToVisual(Main_Grid); - var pt = transform.Transform(new Point(0, 0)); - PenPaletteV2Popup.VerticalOffset = pt.Y; - PenPaletteV2Popup.HorizontalOffset = pt.X - 32; - } - PenPaletteV2Popup.IsOpen = !PenPaletteV2Popup.IsOpen; } else { @@ -954,16 +944,6 @@ namespace Ink_Canvas { if (ShapeDrawingV2Layer.IsInShapeDrawingMode) ShapeDrawingV2Layer.EndShapeDrawing(); - if (SelectedMode == ICCToolsEnum.LassoMode) { - if (SelectionPopupV2.IsOpen == false) { - var transform = SymbolIconSelect.TransformToVisual(Main_Grid); - var pt = transform.Transform(new Point(0, 0)); - SelectionPopupV2.VerticalOffset = pt.Y; - SelectionPopupV2.HorizontalOffset = pt.X - 32; - } - SelectionPopupV2.IsOpen = !SelectionPopupV2.IsOpen; - } else HideSubPanels("select"); - forceEraser = true; drawingShapeMode = 0; inkCanvas.IsManipulationEnabled = false; diff --git a/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs b/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs index c6b0acb..57b2b0c 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs @@ -1308,15 +1308,15 @@ namespace Ink_Canvas { #region SelectionV2 Popup private void SelectionV2Init() { - SelectionV2.SelectAllEvent += (sender, args) => { + FloatingToolBarV2.SelectionV2_SelectAllEvent += (sender, args) => { inkCanvas.Select(inkCanvas.Strokes); - SelectionPopupV2.IsOpen = false; + FloatingToolBarV2.SelectionPopupV2.IsOpen = false; }; - SelectionV2.UnSelectEvent += (sender, args) => { + FloatingToolBarV2.SelectionV2_UnSelectEvent += (sender, args) => { CancelCurrentStrokesSelection(); - SelectionPopupV2.IsOpen = false; + FloatingToolBarV2.SelectionPopupV2.IsOpen = false; }; - SelectionV2.ReverseSelectEvent += (sender, args) => { + FloatingToolBarV2.SelectionV2_ReverseSelectEvent += (sender, args) => { var strokes = new StrokeCollection(inkCanvas.Strokes.Where(stroke => !inkCanvas.GetSelectedStrokes().Contains(stroke)).Where(stroke=>!stroke.ContainsPropertyData(IsLockGuid))); if (strokes.Any()) { @@ -1324,39 +1324,36 @@ namespace Ink_Canvas { } else { CancelCurrentStrokesSelection(); } - SelectionPopupV2.IsOpen = false; + FloatingToolBarV2.SelectionPopupV2.IsOpen = false; }; - SelectionV2.ApplyScaleToStylusTip = Settings.Canvas.ApplyScaleToStylusTip; - SelectionV2.OnlyHitTestFullyContainedStrokes = Settings.Canvas.OnlyHitTestFullyContainedStrokes; - SelectionV2.AllowClickToSelectLockedStroke = Settings.Canvas.AllowClickToSelectLockedStroke; - SelectionV2.SelectionModeSelected = (SelectionPopup.SelectionMode)Settings.Canvas.SelectionMethod; - SelectionV2.ApplyScaleToStylusTipChanged += (sender, args) => { + FloatingToolBarV2.SelectionV2.ApplyScaleToStylusTip = Settings.Canvas.ApplyScaleToStylusTip; + FloatingToolBarV2.SelectionV2.OnlyHitTestFullyContainedStrokes = Settings.Canvas.OnlyHitTestFullyContainedStrokes; + FloatingToolBarV2.SelectionV2.AllowClickToSelectLockedStroke = Settings.Canvas.AllowClickToSelectLockedStroke; + FloatingToolBarV2.SelectionV2.SelectionModeSelected = (SelectionPopup.SelectionMode)Settings.Canvas.SelectionMethod; + FloatingToolBarV2.SelectionV2_ApplyScaleToStylusTipChanged += (sender, args) => { if (!isLoaded) return; - Settings.Canvas.ApplyScaleToStylusTip = SelectionV2.ApplyScaleToStylusTip; - ToggleSwitchApplyScaleToStylusTip.IsOn = SelectionV2.ApplyScaleToStylusTip; + Settings.Canvas.ApplyScaleToStylusTip = FloatingToolBarV2.SelectionV2.ApplyScaleToStylusTip; + ToggleSwitchApplyScaleToStylusTip.IsOn = FloatingToolBarV2.SelectionV2.ApplyScaleToStylusTip; SaveSettingsToFile(); }; - SelectionV2.OnlyHitTestFullyContainedStrokesChanged += (sender, args) => { + FloatingToolBarV2.SelectionV2_OnlyHitTestFullyContainedStrokesChanged += (sender, args) => { if (!isLoaded) return; - Settings.Canvas.OnlyHitTestFullyContainedStrokes = SelectionV2.OnlyHitTestFullyContainedStrokes; - ToggleSwitchOnlyHitTestFullyContainedStrokes.IsOn = SelectionV2.OnlyHitTestFullyContainedStrokes; + Settings.Canvas.OnlyHitTestFullyContainedStrokes = FloatingToolBarV2.SelectionV2.OnlyHitTestFullyContainedStrokes; + ToggleSwitchOnlyHitTestFullyContainedStrokes.IsOn = FloatingToolBarV2.SelectionV2.OnlyHitTestFullyContainedStrokes; SaveSettingsToFile(); }; - SelectionV2.AllowClickToSelectLockedStrokeChanged += (sender, args) => { + FloatingToolBarV2.SelectionV2_AllowClickToSelectLockedStrokeChanged += (sender, args) => { if (!isLoaded) return; - Settings.Canvas.AllowClickToSelectLockedStroke = SelectionV2.AllowClickToSelectLockedStroke; - ToggleSwitchAllowClickToSelectLockedStroke.IsOn = SelectionV2.AllowClickToSelectLockedStroke; + Settings.Canvas.AllowClickToSelectLockedStroke = FloatingToolBarV2.SelectionV2.AllowClickToSelectLockedStroke; + ToggleSwitchAllowClickToSelectLockedStroke.IsOn = FloatingToolBarV2.SelectionV2.AllowClickToSelectLockedStroke; SaveSettingsToFile(); }; - SelectionV2.SelectionModeChanged += (sender, args) => { + FloatingToolBarV2.SelectionV2_SelectionModeChanged += (sender, args) => { if (!isLoaded) return; Settings.Canvas.SelectionMethod = (int)args.NowMode; ComboBoxSelectionMethod.SelectedIndex = (int)args.NowMode; SaveSettingsToFile(); }; - SelectionV2.SelectionPopupShouldCloseEvent += (sender, args) => { - SelectionPopupV2.IsOpen = false; - }; } #endregion diff --git a/InkCanvasForClass/MainWindow_cs/MW_Settings.cs b/InkCanvasForClass/MainWindow_cs/MW_Settings.cs index a1ea3a0..8cc00c8 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_Settings.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_Settings.cs @@ -1013,28 +1013,28 @@ namespace Ink_Canvas { private void ToggleSwitchApplyScaleToStylusTip_OnToggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; Settings.Canvas.ApplyScaleToStylusTip = ToggleSwitchApplyScaleToStylusTip.IsOn; - SelectionV2.ApplyScaleToStylusTip = ToggleSwitchApplyScaleToStylusTip.IsOn; + FloatingToolBarV2.SelectionV2.ApplyScaleToStylusTip = ToggleSwitchApplyScaleToStylusTip.IsOn; SaveSettingsToFile(); } private void ToggleSwitchOnlyHitTestFullyContainedStrokes_OnToggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; Settings.Canvas.OnlyHitTestFullyContainedStrokes = ToggleSwitchOnlyHitTestFullyContainedStrokes.IsOn; - SelectionV2.OnlyHitTestFullyContainedStrokes = ToggleSwitchOnlyHitTestFullyContainedStrokes.IsOn; + FloatingToolBarV2.SelectionV2.OnlyHitTestFullyContainedStrokes = ToggleSwitchOnlyHitTestFullyContainedStrokes.IsOn; SaveSettingsToFile(); } private void ToggleSwitchAllowClickToSelectLockedStroke_OnToggled(object sender, RoutedEventArgs e) { if (!isLoaded) return; Settings.Canvas.AllowClickToSelectLockedStroke = ToggleSwitchAllowClickToSelectLockedStroke.IsOn; - SelectionV2.AllowClickToSelectLockedStroke = ToggleSwitchAllowClickToSelectLockedStroke.IsOn; + FloatingToolBarV2.SelectionV2.AllowClickToSelectLockedStroke = ToggleSwitchAllowClickToSelectLockedStroke.IsOn; SaveSettingsToFile(); } private void ComboBoxSelectionMethod_SelectionChanged(object sender, RoutedEventArgs e) { if (!isLoaded) return; Settings.Canvas.SelectionMethod = ComboBoxSelectionMethod.SelectedIndex; - SelectionV2.SelectionModeSelected = (SelectionPopup.SelectionMode)ComboBoxSelectionMethod.SelectedIndex; + FloatingToolBarV2.SelectionV2.SelectionModeSelected = (SelectionPopup.SelectionMode)ComboBoxSelectionMethod.SelectedIndex; SaveSettingsToFile(); } diff --git a/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs index b92210a..c357ac7 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_ShapeDrawing.cs @@ -21,16 +21,6 @@ namespace Ink_Canvas { if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) ((Panel)lastBorderMouseDownObject).Background = new SolidColorBrush(Colors.Transparent); if (sender == ShapeDrawFloatingBarBtn && lastBorderMouseDownObject != ShapeDrawFloatingBarBtn) return; - - if (ShapeDrawingPopupV2.IsOpen == false) { - var transform = ShapeDrawFloatingBarBtn.TransformToVisual(Main_Grid); - var pt = transform.Transform(new Point(0, 0)); - ShapeDrawingPopupV2.VerticalOffset = pt.Y; - ShapeDrawingPopupV2.HorizontalOffset = pt.X - 32; - ShapeDrawingPopupV2.IsOpen = true; - } else { - HideSubPanels(); - } } #endregion Floating Bar Control @@ -1586,10 +1576,7 @@ namespace Ink_Canvas { public void ShapeDrawingV2Init() { ShapeDrawingV2Layer.MainWindow = this; - ShapeDrawingV2.ShapeDrawingPopupShouldCloseEvent += (sender, args) => { - ShapeDrawingPopupV2.IsOpen = false; - }; - ShapeDrawingV2.ShapeSelectedEvent += (sender, args) => { + FloatingToolBarV2.ShapeDrawingV2_ShapeSelectedEvent += (sender, args) => { ShapeDrawingV2Layer.StartShapeDrawing(args.Type, args.Name); }; } diff --git a/InkCanvasForClass/Popups/FloatingToolBarV2.xaml b/InkCanvasForClass/Popups/FloatingToolBarV2.xaml index 9b0e5db..06334e2 100644 --- a/InkCanvasForClass/Popups/FloatingToolBarV2.xaml +++ b/InkCanvasForClass/Popups/FloatingToolBarV2.xaml @@ -4,13 +4,15 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:Ink_Canvas" + xmlns:popups="clr-namespace:Ink_Canvas.Popups" + Topmost="True" Loaded="FloatingBarV2_Loaded" mc:Ignorable="d" WindowStyle="None" Background="Transparent" AllowsTransparency="True" ResizeMode="NoResize" Title="FloatingToolBarV2"> - - + + @@ -33,17 +35,16 @@ - - + - - - - + + + + @@ -77,12 +78,17 @@ - + - - - + + + + + + + + @@ -105,80 +111,114 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/InkCanvasForClass/Popups/FloatingToolBarV2.xaml.cs b/InkCanvasForClass/Popups/FloatingToolBarV2.xaml.cs index 004ad23..477e086 100644 --- a/InkCanvasForClass/Popups/FloatingToolBarV2.xaml.cs +++ b/InkCanvasForClass/Popups/FloatingToolBarV2.xaml.cs @@ -9,12 +9,16 @@ using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; +using System.Windows.Controls.Primitives; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; +using static Ink_Canvas.Popups.ColorPalette; +using static Ink_Canvas.Popups.SelectionPopup; +using static Ink_Canvas.Popups.ShapeDrawingPopup; namespace Ink_Canvas { @@ -31,11 +35,15 @@ namespace Ink_Canvas public bool Selected { get; set; } = false; public bool IsVisible { get; set; } = true; public string IconSourceResourceKey { get; set; } + public double IconHeight { get; set; } = 21; + public Color? IconColor { get; set; } = null; // 该属性仅用于纯色图标用于在动态透明模式下恢复图标原来的自定义颜色 + public bool IsSemiTransparent { get; set; } = false; + public Color? PressFeedbackColor { get; set; } = null; public FloatingBarItemType Type { get; set; } public MainWindow.ICCToolsEnum ToolType { get; set; } public SolidColorBrush _backgroundBrush { get { - if (Selected) return new SolidColorBrush(Color.FromRgb(37, 99, 235)); + if (Selected) return new SolidColorBrush(Color.FromArgb((byte)(IsSemiTransparent ? 128 : 255) ,37, 99, 235)); return new SolidColorBrush(Colors.Transparent); } } @@ -51,6 +59,16 @@ namespace Ink_Canvas return Type != FloatingBarItemType.Separator ? Visibility.Collapsed : Visibility.Visible; } } + public double _separatorOpacity { + get => IsSemiTransparent ? 0.35 : 1; + } + public SolidColorBrush _pressFeedbackColorBrush { + get { + if (PressFeedbackColor == null) return new SolidColorBrush(Color.FromArgb((byte)(IsSemiTransparent ? 96 : 255),225, 225, 225)); + return new SolidColorBrush(Color.FromArgb((byte)(IsSemiTransparent ? 96 : 255),((Color)PressFeedbackColor).R, + ((Color)PressFeedbackColor).G, ((Color)PressFeedbackColor).B)); + } + } } /// @@ -71,6 +89,7 @@ namespace Ink_Canvas IconSourceResourceKey = "CursorIcon", IsVisible = true, Selected = false, + IconHeight = 21.5, ToolType = MainWindow.ICCToolsEnum.CursorMode, Type = FloatingBarItemType.StateButton, }); @@ -79,6 +98,7 @@ namespace Ink_Canvas IconSource = FindResource("PenIcon") as DrawingImage, IconSourceResourceKey = "PenIcon", IsVisible = true, + IconHeight = 21.5, Selected = false, ToolType = MainWindow.ICCToolsEnum.PenMode, Type = FloatingBarItemType.StateButton, @@ -88,7 +108,10 @@ namespace Ink_Canvas IconSource = FindResource("TrashBinIcon") as DrawingImage, IconSourceResourceKey = "TrashBinIcon", IsVisible = true, + IconColor = Color.FromRgb(224, 27, 36), + IconHeight = 22, Selected = false, + PressFeedbackColor = Color.FromRgb(254, 226, 226), Type = FloatingBarItemType.Button, }); ToolbarItems.Add(new FloatingBarItem() { @@ -101,6 +124,7 @@ namespace Ink_Canvas IconSource = FindResource("EraserIcon") as DrawingImage, IconSourceResourceKey = "EraserIcon", IsVisible = true, + IconHeight = 21.5, Selected = false, ToolType = MainWindow.ICCToolsEnum.EraseByGeometryMode, Type = FloatingBarItemType.StateButton, @@ -110,6 +134,7 @@ namespace Ink_Canvas IconSource = FindResource("ShapesIcon") as DrawingImage, IconSourceResourceKey = "ShapesIcon", IsVisible = true, + IconHeight = 21.5, Selected = false, Type = FloatingBarItemType.Button, }); @@ -118,6 +143,7 @@ namespace Ink_Canvas IconSource = FindResource("SelectIcon") as DrawingImage, IconSourceResourceKey = "SelectIcon", IsVisible = true, + IconHeight = 21.5, Selected = false, ToolType = MainWindow.ICCToolsEnum.LassoMode, Type = FloatingBarItemType.StateButton, @@ -132,6 +158,7 @@ namespace Ink_Canvas IconSource = FindResource("UndoIcon") as DrawingImage, IconSourceResourceKey = "UndoIcon", IsVisible = true, + IconHeight = 21.5, Selected = false, Type = FloatingBarItemType.Button, }); @@ -140,6 +167,7 @@ namespace Ink_Canvas IconSource = FindResource("RedoIcon") as DrawingImage, IconSourceResourceKey = "RedoIcon", IsVisible = true, + IconHeight = 21.5, Selected = false, Type = FloatingBarItemType.Button, }); @@ -148,11 +176,21 @@ namespace Ink_Canvas IsVisible = true, Type = FloatingBarItemType.Separator, }); + ToolbarItems.Add(new FloatingBarItem() { + Name = "Whiteboard", + IconSource = FindResource("WhiteboardIcon") as DrawingImage, + IconSourceResourceKey = "WhiteboardIcon", + IsVisible = true, + IconHeight = 21.5, + Selected = false, + Type = FloatingBarItemType.Button, + }); ToolbarItems.Add(new FloatingBarItem() { Name = "Gesture", IconSource = FindResource("GestureIcon") as DrawingImage, IconSourceResourceKey = "GestureIcon", IsVisible = true, + IconHeight = 23, Selected = false, Type = FloatingBarItemType.Button, }); @@ -161,6 +199,7 @@ namespace Ink_Canvas IconSource = FindResource("MoreIcon") as DrawingImage, IconSourceResourceKey = "MoreIcon", IsVisible = true, + IconHeight = 21.5, Selected = false, Type = FloatingBarItemType.Button, }); @@ -169,6 +208,7 @@ namespace Ink_Canvas IconSource = FindResource("FoldIcon") as DrawingImage, IconSourceResourceKey = "FoldIcon", IsVisible = true, + IconHeight = 22.5, Selected = false, Type = FloatingBarItemType.Button, }); @@ -176,6 +216,7 @@ namespace Ink_Canvas ReMeasureToolBar(); UpdateToolBarSelectedTool(MainWindow.ICCToolsEnum.CursorMode); UpdateToolBarVariant(1); + UpdateToolBarDynamicOpacityVariant(1); double widthInDevicePixels = GetSystemMetrics(0); // SM_CXSCREEN double widthInDIP = SystemParameters.WorkArea.Right; // Device independent pixels. @@ -184,6 +225,122 @@ namespace Ink_Canvas } + public void FloatingBarV2_Loaded(object sender, RoutedEventArgs e) { + + } + + public void HideAllPopups() { + PenPaletteV2Popup.IsOpen = false; + SelectionPopupV2.IsOpen = false; + ShapeDrawingPopupV2.IsOpen = false; + } + + #region PopupV2 事件转发和内部处理 + + /// + /// 绑定调色盘V2的事件,部分事件会在内部进行处理后转发到外部 + /// + /// + /// + private void PenPaletteV2_Loaded(object sender, RoutedEventArgs e) { + PenPaletteV2.ColorSelectionChanged += (o, args) => { + PenPaletteV2_ColorSelectionChanged?.Invoke(o, args); + }; + PenPaletteV2.CustomColorChanged += (o, args) => { + PenPaletteV2_CustomColorChanged?.Invoke(o, args); + }; + PenPaletteV2.PenModeChanged += (o, args) => { + PenPaletteV2_PenModeChanged?.Invoke(o, args); + }; + PenPaletteV2.InkRecognitionChanged += (o, args) => { + PenPaletteV2_InkRecognitionChanged?.Invoke(o, args); + }; + PenPaletteV2.PressureSimulationChanged += (o, args) => { + PenPaletteV2_PressureSimulationChanged?.Invoke(o, args); + }; + PenPaletteV2.ColorModeChanged += (o, args) => { + PenPaletteV2_ColorModeChanged?.Invoke(o, args); + }; + PenPaletteV2.QuickActionsVisibilityChanged += (o, args) => { + PenPaletteV2_QuickActionsVisibilityChanged?.Invoke(o, args); + }; + PenPaletteV2.PaletteShouldCloseEvent += (o, args) => { + PenPaletteV2Popup.IsOpen = false; + PenPaletteV2_PaletteShouldCloseEvent?.Invoke(o, args); + }; + } + + public event EventHandler PenPaletteV2_ColorSelectionChanged; + public event EventHandler PenPaletteV2_CustomColorChanged; + public event EventHandler PenPaletteV2_PenModeChanged; + public event EventHandler PenPaletteV2_InkRecognitionChanged; + public event EventHandler PenPaletteV2_PressureSimulationChanged; + public event EventHandler PenPaletteV2_ColorModeChanged; + public event EventHandler PenPaletteV2_QuickActionsVisibilityChanged; + public event EventHandler PenPaletteV2_PaletteShouldCloseEvent; + + /// + /// 绑定选择弹窗V2的事件,部分事件会在内部进行处理后转发到外部 + /// + /// + /// + private void SelectionV2_Loaded(object sender, RoutedEventArgs e) { + SelectionV2.SelectionPopupShouldCloseEvent += (o, args) => { + SelectionPopupV2.IsOpen = false; + SelectionV2_SelectionPopupShouldCloseEvent?.Invoke(o, args); + }; + SelectionV2.SelectAllEvent += (o, args) => { + SelectionV2_SelectAllEvent?.Invoke(o, args); + }; + SelectionV2.UnSelectEvent += (o, args) => { + SelectionV2_UnSelectEvent?.Invoke(o, args); + }; + SelectionV2.ReverseSelectEvent += (o, args) => { + SelectionV2_ReverseSelectEvent?.Invoke(o, args); + }; + SelectionV2.ApplyScaleToStylusTipChanged += (o, args) => { + SelectionV2_ApplyScaleToStylusTipChanged?.Invoke(o, args); + }; + SelectionV2.OnlyHitTestFullyContainedStrokesChanged += (o, args) => { + SelectionV2_OnlyHitTestFullyContainedStrokesChanged?.Invoke(o, args); + }; + SelectionV2.AllowClickToSelectLockedStrokeChanged += (o, args) => { + SelectionV2_AllowClickToSelectLockedStrokeChanged?.Invoke(o, args); + }; + SelectionV2.SelectionModeChanged += (o, args) => { + SelectionV2_SelectionModeChanged?.Invoke(o, args); + }; + } + + public event EventHandler SelectionV2_SelectionPopupShouldCloseEvent; + public event EventHandler SelectionV2_SelectAllEvent; + public event EventHandler SelectionV2_UnSelectEvent; + public event EventHandler SelectionV2_ReverseSelectEvent; + public event EventHandler SelectionV2_ApplyScaleToStylusTipChanged; + public event EventHandler SelectionV2_OnlyHitTestFullyContainedStrokesChanged; + public event EventHandler SelectionV2_AllowClickToSelectLockedStrokeChanged; + public event EventHandler SelectionV2_SelectionModeChanged; + + /// + /// 绑定形状绘制弹窗V2的事件,部分事件会在内部进行处理后转发到外部 + /// + /// + /// + private void ShapeDrawingV2_Loaded(object sender, RoutedEventArgs e) { + ShapeDrawingV2.ShapeDrawingPopupShouldCloseEvent += (o, args) => { + ShapeDrawingPopupV2.IsOpen = false; + ShapeDrawingV2_ShapeDrawingPopupShouldCloseEvent?.Invoke(o, args); + }; + ShapeDrawingV2.ShapeSelectedEvent += (o, args) => { + ShapeDrawingV2_ShapeSelectedEvent?.Invoke(o, args); + }; + } + + public event EventHandler ShapeDrawingV2_ShapeDrawingPopupShouldCloseEvent; + public event EventHandler ShapeDrawingV2_ShapeSelectedEvent; + + #endregion + private double ScalingFactor; public ObservableCollection ToolbarItems { get; set; } = @@ -215,19 +372,24 @@ namespace Ink_Canvas /// /// 修改工具栏的变体 /// - /// 0为全长,1为鼠标模式下变体,2为迷你,3为仅小图标 + /// 0为全长,1为鼠标模式下变体,2为迷你,3为仅HeadIcon图标 private void UpdateToolBarVariant(int variant) { + var _snapTypeTemp = SnapType; + ToolBarNowVariantMode = variant; + HideAllPopups(); IEnumerable items; if (variant == 0) items = ToolbarItems.AsEnumerable(); else if (variant == 1) items = ToolbarItems.Where((item, i) => (new string[] { - "Cursor", "Pen", "Clear", "SeparatorC", "Gesture", "Menu", "Fold" + "Cursor", "Pen", "Clear", "SeparatorC", "Whiteboard", "Gesture", "Menu", "Fold" }).Contains(item.Name)); else if (variant == 2) items = ToolbarItems.Where((item, i) => (new string[] { "Cursor", "Pen", "Clear" }).Contains(item.Name)); - else throw new NotImplementedException(); + else if (variant == 3) + items = ToolbarItems.Where((item, i) => item.Selected); + else return; foreach (var fi in ToolbarItems) { fi.IsVisible = items.Contains(fi); @@ -235,6 +397,15 @@ namespace Ink_Canvas CollectionViewSource.GetDefaultView(ToolbarItems).Refresh(); ReMeasureToolBar(); + if (_snapTypeTemp == ToolBarSnapType.RightSide) { + Left = System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth + 24; + } else if (_snapTypeTemp == ToolBarSnapType.RightTopCorner) { + Top = -24; + Left = System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth + 24; + } else if (_snapTypeTemp == ToolBarSnapType.RightBottomCorner) { + Top = System.Windows.SystemParameters.PrimaryScreenHeight - ActualHeight + 24; + Left = System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth + 24; + } } private void UpdateToolBarSelectedTool(MainWindow.ICCToolsEnum type) { @@ -263,14 +434,197 @@ namespace Ink_Canvas private void ReMeasureToolBar() { var barWidth = CaculateToolBarWindowWidth(ToolbarItems); ToolBarV2Grid.Width = barWidth; - Width = barWidth + 6 * 2; // 6是工具栏和窗口的Margin - Height = 48 + 6 * 2; // 48是工具栏高度 + Width = barWidth + 24 * 2; // 6是工具栏和窗口的Margin + Height = 48 + 24 * 2; // 48是工具栏高度 + var offset = ToolBarNowVariantMode == 3 ? 0 : 6; + var offsetCp = ToolBarNowVariantMode == 3 ? 0.5 : 6.5; + var path = GenerateSuperEllipsePathByContentWidth(barWidth + offset, 48); + ToolBarBackgroundBorder.Geometry = Geometry.Parse(path); + var cg = GenerateSuperEllipsePathClipGeometry(barWidth + offsetCp, 48); + BackgroundBorderDrawingGroup.ClipGeometry = Geometry.Parse(cg); + + Top = Math.Max(Math.Min(Top, + System.Windows.SystemParameters.PrimaryScreenHeight-ActualHeight +24),-24); + Left = Math.Max(Math.Min(Left, + System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth +24),-24); + } + + public int ToolBarNowVariantMode = -1; + + private string GenerateSuperEllipsePathClipGeometry(double width, double renderingHeight) { + double acutalHeight = 119.33; + double renderingScalingFactor = acutalHeight / renderingHeight; + double actualFullWidth = width * renderingScalingFactor; + double actualCenterWidth = actualFullWidth - 119.34 < 0 ? 0 : actualFullWidth - 119.34; + + var cg = $"M0,0 V120 H{Math.Round(actualFullWidth, 0)} V0 H0 Z"; + return cg; + } + + /// + /// 根据给定的渲染高度计算比例,并根据实际内容宽度计算超椭圆圆角矩形的SVG路径 + /// + /// + /// + /// + private string GenerateSuperEllipsePathByContentWidth(double width, double renderingHeight) { + double acutalHeight = 119.33; + double renderingScalingFactor = acutalHeight / renderingHeight; + double actualFullWidth = width * renderingScalingFactor; + double actualCenterWidth = actualFullWidth - 119.34 < 0 ? 0 : actualFullWidth - 119.34; + + var sb = "M64.3285 " + + "0.015625" + + $"H{Math.Round(64.3395 + actualCenterWidth,3)}" + + $"C{Math.Round(90.3185 + actualCenterWidth,3)} " + + "0.015625 " + + $"{Math.Round(99.3081 + actualCenterWidth, 3)} " + + "0.015625 " + + $"{Math.Round(108.103 + actualCenterWidth, 3)} " + + "7.11388" + + $"C{Math.Round(109.871 + actualCenterWidth, 3)} " + + "8.54031 " + + $"{Math.Round(111.481 + actualCenterWidth, 3)} " + + "10.1509 " + + $"{Math.Round(112.908 + actualCenterWidth, 3)} " + + "11.9183" + + $"C{Math.Round(120.006 + actualCenterWidth, 3)} " + + "20.7134 " + + $"{Math.Round(120.006 + actualCenterWidth, 3)} " + + "33.7029 " + + $"{Math.Round(120.006 + actualCenterWidth, 3)} " + + "59.6819" + + $"C{Math.Round(120.006 + actualCenterWidth, 3)} " + + "85.661 " + + $"{Math.Round(120.006 + actualCenterWidth, 3)} " + + "98.6505 " + + $"{Math.Round(112.908 + actualCenterWidth, 3)} " + + "107.446" + + $"C{Math.Round(111.481 + actualCenterWidth, 3)} " + + "109.213 " + + $"{Math.Round(109.871 + actualCenterWidth, 3)} " + + "110.824 " + + $"{Math.Round(108.103 + actualCenterWidth, 3)} " + + "112.25" + + $"C{Math.Round(99.3081 + actualCenterWidth, 3)} " + + "119.348 " + + $"{Math.Round(90.3185 + actualCenterWidth, 3)} " + + "119.348 " + + $"{Math.Round(64.3395 + actualCenterWidth, 3)} " + + "119.348" + + "H64.3285C38.3494 " + + "119.348 " + + "21.3599 " + + "119.348 " + + "12.5648 " + + "112.25" + + "C10.7973 " + + "110.824 " + + "9.1868 " + + "109.213 " + + "7.76037 " + + "107.446" + + "C0.662109 " + + "98.6505 " + + "0.662109 " + + "85.661 " + + "0.662109 " + + "59.6819" + + "C0.662109 " + + "33.7029 " + + "0.662109 " + + "20.7134 " + + "7.76037 " + + "11.9183" + + "C9.1868 " + + "10.1509 " + + "10.7973 " + + "8.54031 " + + "12.5648 " + + "7.11388" + + "C21.3599 " + + "0.015625 " + + "38.3494 " + + "0.015625 " + + "64.3285 " + + "0.015625" + + "Z"; + + return sb; + } + + public enum ToolBarSnapType { + NoSnap, + LeftTopCorner, + RightTopCorner, + LeftBottomCorner, + RightBottomCorner, + RightSide, + LeftSide, + BottomSide, + TopSide + } + + public ToolBarSnapType SnapType { + get { + if (Top <= -24 && Left <= -24) return ToolBarSnapType.LeftTopCorner; + if (Top >= System.Windows.SystemParameters.PrimaryScreenHeight - ActualHeight + 24 && Left <= -24) return ToolBarSnapType.LeftBottomCorner; + if (Top <= -24 && Left >= System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth + 24) return ToolBarSnapType.RightTopCorner; + if (Top >= System.Windows.SystemParameters.PrimaryScreenHeight - ActualHeight + 24 && + Left >= System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth + 24) return ToolBarSnapType.RightBottomCorner; + if (Top <= -24) return ToolBarSnapType.TopSide; + if (Top >= System.Windows.SystemParameters.PrimaryScreenHeight - ActualHeight + 24) + return ToolBarSnapType.BottomSide; + if (Left <= -24) return ToolBarSnapType.LeftSide; + if (Left >= System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth + 24) + return ToolBarSnapType.RightSide; + return ToolBarSnapType.NoSnap; + } } private void OnToolSelectionChanged(FloatingBarItem sender) { - if (sender.Selected && sender.ToolType != MainWindow.ICCToolsEnum.CursorMode) - UpdateToolBarVariant(0); - else UpdateToolBarVariant(1); + if (ToolBarNowVariantMode == 3) return; + HideAllPopups(); + if (sender.Selected && sender.ToolType != MainWindow.ICCToolsEnum.CursorMode) { + if (ToolBarNowVariantMode != 0) UpdateToolBarVariant(0); + } else { + if (ToolBarNowVariantMode != 1) UpdateToolBarVariant(1); + } + } + + private void OnToolButtonClicked(FloatingBarItem sender, Grid container) { + + if (sender.ToolType == MainWindow.ICCToolsEnum.PenMode) { + if (PenPaletteV2Popup.IsOpen) { + HideAllPopups(); + } else { + var containerPoint = container.TranslatePoint(new Point(0, 0), ToolBarV2Grid); + PenPaletteV2Popup.HorizontalOffset = containerPoint.X; + if (System.Windows.SystemParameters.PrimaryScreenHeight - Top - Height + 24 > PenPaletteV2.Height) PenPaletteV2Popup.VerticalOffset = Height -24 ; + else PenPaletteV2Popup.VerticalOffset = 0 - PenPaletteV2.Height + 24; + PenPaletteV2Popup.IsOpen = true; + } + } else if (sender.ToolType == MainWindow.ICCToolsEnum.LassoMode) { + if (SelectionPopupV2.IsOpen) { + HideAllPopups(); + } else { + var containerPoint = container.TranslatePoint(new Point(0, 0), ToolBarV2Grid); + SelectionPopupV2.HorizontalOffset = containerPoint.X; + if (System.Windows.SystemParameters.PrimaryScreenHeight - Top - Height + 24 > SelectionV2.Height) SelectionPopupV2.VerticalOffset = Height - 24 ; + else SelectionPopupV2.VerticalOffset = 0 - SelectionV2.Height + 24; + SelectionPopupV2.IsOpen = true; + } + } else if (sender.Name == "ShapeDrawing") { + if (ShapeDrawingPopupV2.IsOpen) { + HideAllPopups(); + } else { + var containerPoint = container.TranslatePoint(new Point(0, 0), ToolBarV2Grid); + ShapeDrawingPopupV2.HorizontalOffset = containerPoint.X; + if (System.Windows.SystemParameters.PrimaryScreenHeight - Top - Height + 24 > ShapeDrawingV2.Height) ShapeDrawingPopupV2.VerticalOffset = Height - 24 ; + else ShapeDrawingPopupV2.VerticalOffset = 0 - ShapeDrawingV2.Height + 24; + ShapeDrawingPopupV2.IsOpen = true; + } + } } private void ToolbarButton_MouseDown(object sender, MouseButtonEventArgs e) { @@ -282,6 +636,7 @@ namespace Ink_Canvas var bgImg = gd.Children[1] as Image; bgImg.Opacity = 1; } + gd.RenderTransform = new ScaleTransform(0.9, 0.9); } private void ToolbarButton_MouseUp(object sender, MouseButtonEventArgs e) { @@ -290,12 +645,88 @@ namespace Ink_Canvas var gd = sender as Grid; var itemData = gd.Tag as FloatingBarItem; - if (itemData.Type == FloatingBarItemType.StateButton) { + if (itemData.Type == FloatingBarItemType.StateButton && !itemData.Selected) { UpdateToolBarSelectedTool(itemData.ToolType); OnToolSelectionChanged(itemData); + } else { + OnToolButtonClicked(itemData, gd); } } + public int DynamicTransparentVariant { get; set; } = 1; + + /// + /// 根据提供的变体ID修改工具栏动态透明的变体类型 + /// + /// 0为透明,1为不透明 + private void UpdateToolBarDynamicOpacityVariant(int variant) { + DynamicTransparentVariant = variant; + if (variant == 0) { + FallbackBackgroundLayer.Opacity = 0.05; + ToolBarBackgroundBorder.Pen = new Pen() { + Brush = new SolidColorBrush(Color.FromArgb(48, 34, 34, 34)), + Thickness = 3, + }; + ToolBarBackgroundBorder.Brush = new SolidColorBrush(Color.FromArgb(16, 255,255,255)); + HeadIcon.Opacity = 0.5; + ToolBarItemsControl.Opacity = 0.92; + foreach (var fi in ToolbarItems) { + fi.IsSemiTransparent = true; + if (fi.Type == FloatingBarItemType.Separator) continue; + if (fi.IconSourceResourceKey == "") continue; + var icon = FindResource(fi.IconSourceResourceKey) as DrawingImage; + foreach (var gd in (icon.Drawing as DrawingGroup).Children) { + var _gd = gd as GeometryDrawing; + _gd.Pen = new Pen() { + Brush = new SolidColorBrush(Color.FromArgb(148, 34,34,34)), + Thickness = 1, + }; + if (fi.IconColor != null) + _gd.Brush = new SolidColorBrush(Color.FromArgb(96, (byte)Math.Min(((Color)fi.IconColor).R * 4.25,255), + (byte)Math.Min(((Color)fi.IconColor).G * 4.25,255),(byte)Math.Min(((Color)fi.IconColor).B * 4.25,255))); + else _gd.Brush = new SolidColorBrush(Color.FromArgb(96, 255,255,255)); + } + + if (fi.Selected) { + var clonedIcon = icon.Clone(); + foreach (var d in (clonedIcon.Drawing as DrawingGroup).Children) + ((GeometryDrawing)d).Brush = new SolidColorBrush(Colors.White); + fi.IconSource = clonedIcon; + } + } + } else if (variant == 1) { + FallbackBackgroundLayer.Opacity = 1; + ToolBarBackgroundBorder.Pen = new Pen() { + Brush = new SolidColorBrush(Color.FromRgb(212,212,216)), + Thickness = 3, + }; + ToolBarBackgroundBorder.Brush = new SolidColorBrush(Color.FromRgb(250, 250, 250)); + HeadIcon.Opacity = 1; + ToolBarItemsControl.Opacity = 1; + foreach (var fi in ToolbarItems) { + fi.IsSemiTransparent = false; + if (fi.Type == FloatingBarItemType.Separator) continue; + if (fi.IconSourceResourceKey == "") continue; + var icon = FindResource(fi.IconSourceResourceKey) as DrawingImage; + foreach (var gd in (icon.Drawing as DrawingGroup).Children) { + var _gd = gd as GeometryDrawing; + _gd.Pen = null; + _gd.Brush = new SolidColorBrush(fi.IconColor??Color.FromRgb(34,34,34)); + } + + if (fi.Selected) { + var clonedIcon = icon.Clone(); + foreach (var d in (clonedIcon.Drawing as DrawingGroup).Children) + ((GeometryDrawing)d).Brush = new SolidColorBrush(Colors.White); + fi.IconSource = clonedIcon; + } + } + } + + CollectionViewSource.GetDefaultView(ToolbarItems).Refresh(); + ReMeasureToolBar(); + } + [DllImport("USER32.DLL", SetLastError = true)] public static extern int GetSystemMetrics(int nIndex); @@ -306,47 +737,100 @@ namespace Ink_Canvas var bgImg = _mouseDownButton.Children[1] as Image; bgImg.Opacity = 0; } + _mouseDownButton.RenderTransform = null; _mouseDownButton = null; } public Point prevPoint = new Point(0,0); - public Point lastPoint = new Point(0, 0); public bool isInMovingMode = false; public double winLeft = 0; public double winTop = 0; + public ToolBarSnapType _snapTypeTemp = ToolBarSnapType.NoSnap; private void HeadIconButton_MouseDown(object sender, MouseButtonEventArgs e) { if (_isMouseDownHeadIcon) return; - _isMouseDownHeadIcon = true; - var gd = sender as Grid; - prevPoint = e.GetPosition(ToolBarV2Grid); - winLeft = Left; - winTop = Top; - Trace.WriteLine(prevPoint); - gd.CaptureMouse(); - gd.RenderTransform = new ScaleTransform(0.95, 0.95); - isInMovingMode = false; + if (e.RightButton == MouseButtonState.Pressed) { + UpdateToolBarDynamicOpacityVariant(Math.Abs(DynamicTransparentVariant-1)); + } else { + _isMouseDownHeadIcon = true; + var gd = sender as Grid; + prevPoint = e.GetPosition(ToolBarV2Grid); + winLeft = Left; + winTop = Top; + Trace.WriteLine(prevPoint); + gd.CaptureMouse(); + gd.RenderTransform = new ScaleTransform(0.92, 0.92); + isInMovingMode = false; + _snapTypeTemp = SnapType; + } + } private void HeadIconButton_MouseMove(object sender, MouseEventArgs e) { if (_isMouseDownHeadIcon == false) return; - var nowPt = e.GetPosition(ToolBarV2Grid); - lastPoint = nowPt; - var deltaX = nowPt.X - prevPoint.X; - var deltaY = nowPt.Y - prevPoint.Y; - if (Math.Abs(deltaY) > 16 || Math.Abs(deltaX) > 16) isInMovingMode = true; + var mp = System.Windows.Forms.Control.MousePosition; + var mpLogical = new Point(mp.X * ScalingFactor, mp.Y * ScalingFactor); + var deltaX = mpLogical.X - prevPoint.X - winLeft - 24; + var deltaY = mpLogical.Y - prevPoint.Y - winTop - 24; + var movingLimitation = _snapTypeTemp == ToolBarSnapType.NoSnap ? 12 : 24; + if (Math.Abs(deltaY) > movingLimitation || Math.Abs(deltaX) > movingLimitation) isInMovingMode = true; if (isInMovingMode) { + HideAllPopups(); ToolbarV2.RenderTransform = null; + ToolBarV2Grid.RenderTransform = null; HeadIconImage.RenderTransform = null; - var mp = System.Windows.Forms.Control.MousePosition; - Top = mp.Y * ScalingFactor - prevPoint.Y - 6; - Left = mp.X * ScalingFactor - prevPoint.X - 6; + Top = Math.Max(Math.Min(mp.Y * ScalingFactor - prevPoint.Y - 24, + System.Windows.SystemParameters.PrimaryScreenHeight - ActualHeight +24),-24); + Left = Math.Max(Math.Min(mp.X * ScalingFactor - prevPoint.X - 24, + System.Windows.SystemParameters.PrimaryScreenWidth - ActualWidth +24),-24); } else { - ToolbarV2.RenderTransform = new TranslateTransform(deltaX / 3, deltaY / 3); - HeadIconImage.RenderTransform = new TranslateTransform(deltaX / 8, deltaY / 8); + double tbMovingX = deltaX/3, tbMovingY = deltaY/3; + if (_snapTypeTemp == ToolBarSnapType.LeftSide) { + tbMovingX = Math.Max(deltaX / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(0, 0.5); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1 + tbMovingX /350, 1); + } else if (_snapTypeTemp == ToolBarSnapType.RightSide) { + tbMovingX = Math.Min(deltaX / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(1, 0.5); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1 - tbMovingX /350, 1); + } else if (_snapTypeTemp == ToolBarSnapType.TopSide) { + tbMovingY = Math.Max(deltaY / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(0.5, 0); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1, 1 + tbMovingY /120); + } else if (_snapTypeTemp == ToolBarSnapType.BottomSide) { + tbMovingY = Math.Min(deltaY / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(0.5, 1); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1, 1 - tbMovingY /120); + } else if (_snapTypeTemp == ToolBarSnapType.LeftTopCorner) { + tbMovingX = Math.Max(deltaX / 3, 0); + tbMovingY = Math.Max(deltaY / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(0, 0); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1 + tbMovingX /350, 1 + tbMovingY /120); + } else if (_snapTypeTemp == ToolBarSnapType.LeftBottomCorner) { + tbMovingX = Math.Max(deltaX / 3, 0); + tbMovingY = Math.Min(deltaY / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(0, 1); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1 + tbMovingX /350, 1 - tbMovingY /120); + } else if (_snapTypeTemp == ToolBarSnapType.RightTopCorner) { + tbMovingX = Math.Min(deltaX / 3, 0); + tbMovingY = Math.Max(deltaY / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(1, 0); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1 - tbMovingX /350, 1 + tbMovingY /120); + } else if (_snapTypeTemp == ToolBarSnapType.RightBottomCorner) { + tbMovingX = Math.Min(deltaX / 3, 0); + tbMovingY = Math.Min(deltaY / 3, 0); + ToolBarV2Grid.RenderTransformOrigin = new Point(1, 1); + ToolBarV2Grid.RenderTransform = new ScaleTransform(1 - tbMovingX /350, 1 - tbMovingY /120); + } + ToolbarV2.RenderTransform = new TranslateTransform(tbMovingX, tbMovingY); + HeadIconImage.RenderTransform = new TranslateTransform(tbMovingX / 2, tbMovingY / 2); } } + public FloatingBarItem SelectedItem { + get => ToolbarItems.Single(item => item.Selected); + } + private void HeadIconButton_MouseUp(object sender, MouseButtonEventArgs e) { if (_isMouseDownHeadIcon == false) return; _isMouseDownHeadIcon = false; @@ -354,7 +838,21 @@ namespace Ink_Canvas gd.ReleaseMouseCapture(); gd.RenderTransform = null; ToolbarV2.RenderTransform = null; + ToolBarV2Grid.RenderTransform = null; HeadIconImage.RenderTransform = null; + if (!isInMovingMode) { + var mp = System.Windows.Forms.Control.MousePosition; + var mpLogical = new Point(mp.X * ScalingFactor, mp.Y * ScalingFactor); + if (Math.Abs(mpLogical.X - prevPoint.X - winLeft - 24) < 4 || Math.Abs(mpLogical.Y - prevPoint.Y - winTop - 24) < 4) { + if (ToolBarNowVariantMode == 3) { + if (SelectedItem.ToolType != MainWindow.ICCToolsEnum.CursorMode) + UpdateToolBarVariant(0); + else UpdateToolBarVariant(1); + } else { + UpdateToolBarVariant(3); + } + } + } isInMovingMode = false; } } diff --git a/InkCanvasForClass/Windows/SettingsWindow.xaml.cs b/InkCanvasForClass/Windows/SettingsWindow.xaml.cs index 080e770..0c052ac 100644 --- a/InkCanvasForClass/Windows/SettingsWindow.xaml.cs +++ b/InkCanvasForClass/Windows/SettingsWindow.xaml.cs @@ -381,6 +381,7 @@ namespace Ink_Canvas.Windows { var _thumb = thumb as Border; _thumb.CornerRadius = new CornerRadius(4); _thumb.Width = 8; + _thumb.Margin = new Thickness(-0.75, 0, 1, 0); _thumb.Background = new SolidColorBrush(Color.FromRgb(138, 138, 138)); } } @@ -406,6 +407,7 @@ namespace Ink_Canvas.Windows { var _thumb = thumb as Border; _thumb.CornerRadius = new CornerRadius(1.5); _thumb.Width = 3; + _thumb.Margin = new Thickness(0); _thumb.Background = new SolidColorBrush(Color.FromRgb(195, 195, 195)); } }