diff --git a/InkCanvasForClass/MainWindow.xaml b/InkCanvasForClass/MainWindow.xaml index 6a1075d..5e3631e 100644 --- a/InkCanvasForClass/MainWindow.xaml +++ b/InkCanvasForClass/MainWindow.xaml @@ -127,6 +127,7 @@ + @@ -3460,6 +3461,10 @@ + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/InkCanvasForClass/MainWindow.xaml.cs b/InkCanvasForClass/MainWindow.xaml.cs index e872ba3..8feeaa1 100644 --- a/InkCanvasForClass/MainWindow.xaml.cs +++ b/InkCanvasForClass/MainWindow.xaml.cs @@ -23,6 +23,7 @@ using Ink_Canvas.Popups; using iNKORE.UI.WPF.Modern.Controls; using System.Windows.Forms; using System.Windows.Input; +using Vanara.PInvoke; using Application = System.Windows.Application; using Button = System.Windows.Controls.Button; using TextBox = System.Windows.Controls.TextBox; @@ -143,6 +144,7 @@ namespace Ink_Canvas { drawingAttributes.FitToCurve = Settings.Canvas.FitToCurve; inkCanvas.EditingMode = InkCanvasEditingMode.Ink; + inkCanvas.DeleteKeyCommandFired += InkCanvasDeleteCommandFiredEvent; //inkCanvas.Gesture += InkCanvas_Gesture; } catch { } @@ -196,7 +198,7 @@ namespace Ink_Canvas { const uint MF_GRAYED = 0x00000001; const uint SC_CLOSE = 0xF060; - private static void PreloadIALibrary(object state) { + private static void PreloadIALibrary() { GC.KeepAlive(typeof(InkAnalyzer)); GC.KeepAlive(typeof(AnalysisAlternate)); GC.KeepAlive(typeof(InkDrawingNode)); @@ -242,7 +244,7 @@ namespace Ink_Canvas { BoardBackgroundPopup.Visibility = Visibility.Collapsed; // 提前加载IA库,优化第一笔等待时间 - ThreadPool.QueueUserWorkItem(PreloadIALibrary); + PreloadIALibrary(); SystemEvents.DisplaySettingsChanged += SystemEventsOnDisplaySettingsChanged; @@ -263,6 +265,10 @@ namespace Ink_Canvas { SelectionV2Init(); InitStorageManagementModule(); + + InitFreezeWindow(new HWND[] { + new HWND(new WindowInteropHelper(this).Handle) + }); } private void SystemEventsOnDisplaySettingsChanged(object sender, EventArgs e) { @@ -318,7 +324,10 @@ namespace Ink_Canvas { } if (e.Cancel) LogHelper.WriteLogToFile("Ink Canvas closing cancelled", LogHelper.LogType.Event); - else Application.Current.Shutdown(); + else { + DisposeFreezeFrame(); + Application.Current.Shutdown(); + } } [DllImport("user32.dll", SetLastError = true)] diff --git a/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs b/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs index 0400e6c..4df4fd8 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_FloatingBarIcons.cs @@ -116,6 +116,10 @@ namespace Ink_Canvas { /// 控制是否顯示浮動工具欄的“手勢”按鈕 /// private void CheckEnableTwoFingerGestureBtnVisibility(bool isVisible) { + if (CheckboxEnableFloatingBarGesture.IsChecked == false) { + EnableTwoFingerGestureBorder.Visibility = Visibility.Collapsed; + return; + } if (StackPanelCanvasControls.Visibility != Visibility.Visible || BorderFloatingBarMainControls.Visibility != Visibility.Visible) { EnableTwoFingerGestureBorder.Visibility = Visibility.Collapsed; @@ -319,15 +323,15 @@ namespace Ink_Canvas { if (mode != null && autoAlignCenter) { if (BorderFloatingBarExitPPTBtn.Visibility == Visibility.Visible) { - await Task.Delay(1); + await Task.Delay(10); ViewboxFloatingBarMarginAnimation(60); } else if (Topmost == true) //非黑板 { - await Task.Delay(1); + await Task.Delay(10); ViewboxFloatingBarMarginAnimation(100, true); } else //黑板 { - await Task.Delay(1); + await Task.Delay(10); ViewboxFloatingBarMarginAnimation(60); } } @@ -336,7 +340,7 @@ namespace Ink_Canvas { PenPaletteV2Popup.IsOpen = false; SelectionPopupV2.IsOpen = false; - await Task.Delay(10); + await Task.Delay(20); isHidingSubPanelsWhenInking = false; } @@ -646,6 +650,54 @@ namespace Ink_Canvas { iconLabelsWhiteboard[wmi].Foreground = new SolidColorBrush(Colors.GhostWhite); } + FloatingbarFreezeBtnBGCanvas.Visibility = mode != ICCToolsEnum.CursorMode ? Visibility.Visible : Visibility.Collapsed; + if (mode == ICCToolsEnum.CursorMode) IsAnnotationFreezeOn = false; + } + + #endregion + + #region 画面定格 + + private bool _isAnnotationFreezeOn { get; set; } = false; + + private bool IsAnnotationFreezeOn { + get => _isAnnotationFreezeOn; + set { + _isAnnotationFreezeOn = value; + UpdateFloatingBarFreezeIconCheckedStatus(); + var t = new Thread(() => { + ApplyFreezeFrame(); + }); + t.Start(); + } + } + + private async void ApplyFreezeFrame() { + if (!isFreezeFrameLoaded) return; + if (_isAnnotationFreezeOn) { + var bmp = await GetFreezedFrameAsync(); + Dispatcher.InvokeAsync(() => { + FreezeFrameBackgroundImage.Source = BitmapToImageSource(bmp); + FreezeFrameBackgroundImage.Visibility = Visibility.Visible; + }); + } else { + Dispatcher.InvokeAsync(() => { + FreezeFrameBackgroundImage.Source = null; + FreezeFrameBackgroundImage.Visibility = Visibility.Collapsed; + }); + } + } + + private void UpdateFloatingBarFreezeIconCheckedStatus() { + if (IsAnnotationFreezeOn) { + FreezeIconGeometry.Brush = new SolidColorBrush(Colors.White); + FreezeToolbarTextBlock.Foreground = new SolidColorBrush(Colors.White); + FloatingbarFreezeBtnBG.Visibility = Visibility.Visible; + } else { + FreezeIconGeometry.Brush = new SolidColorBrush(Color.FromRgb(27, 27, 27)); + FreezeToolbarTextBlock.Foreground = new SolidColorBrush(Colors.Black); + FloatingbarFreezeBtnBG.Visibility = Visibility.Hidden; + } } #endregion @@ -665,6 +717,14 @@ namespace Ink_Canvas { } } + private void FreezeFloatingBarBtn_MouseUp(object sender, MouseButtonEventArgs e) { + if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) + ((Panel)lastBorderMouseDownObject).Background = new SolidColorBrush(Colors.Transparent); + if (sender == FreezeFloatingBarBtn && lastBorderMouseDownObject != FreezeFloatingBarBtn) return; + + IsAnnotationFreezeOn = !IsAnnotationFreezeOn; + } + private async void CursorIcon_Click(object sender, RoutedEventArgs e) { if (lastBorderMouseDownObject != null && lastBorderMouseDownObject is Panel) @@ -753,8 +813,8 @@ namespace Ink_Canvas { ((Panel)lastBorderMouseDownObject).Background = new SolidColorBrush(Colors.Transparent); if (sender == Pen_Icon && lastBorderMouseDownObject != Pen_Icon) return; - if (Pen_Icon.Background == null || StackPanelCanvasControls.Visibility == Visibility.Collapsed) - { + if (Pen_Icon.Background == null || StackPanelCanvasControls.Visibility == Visibility.Collapsed) { + inkCanvas.EditingMode = InkCanvasEditingMode.Ink; GridTransparencyFakeBackground.Opacity = 1; @@ -980,6 +1040,28 @@ namespace Ink_Canvas { #region 按钮布局更新 + public void UpdateFloatingBarIconsVisibility() { + + var items = new FrameworkElement[] { + ShapeDrawFloatingBarBtn, + FreezeFloatingBarBtn, + HandFloatingBarBtn, + SymbolIconUndo, + SymbolIconRedo, + CursorWithDelFloatingBarBtn, + SymbolIconSelect, + WhiteboardFloatingBarBtn, + Fold_Icon, + EnableTwoFingerGestureBorder + }; + + var floatingBarIconsVisibilityValue = Settings.Appearance.FloatingBarIconsVisibility; + var fbivca = floatingBarIconsVisibilityValue.ToCharArray(); + for (var i = 0; i < fbivca.Length; i++) { + items[i].Visibility = fbivca[i] == '1' ? Visibility.Visible : Visibility.Collapsed; + } + } + public void UpdateFloatingBarIconsLayout() { FrameworkElement[] IconsArray = new FrameworkElement[13] { Cursor_Icon, @@ -1388,10 +1470,10 @@ namespace Ink_Canvas { private bool isViewboxFloatingBarMarginAnimationRunning = false; - public async void ViewboxFloatingBarMarginAnimation(int MarginFromEdge, + public void ViewboxFloatingBarMarginAnimation(int MarginFromEdge, bool PosXCaculatedWithTaskbarHeight = false) { if (MarginFromEdge == 60) MarginFromEdge = 55; - await Dispatcher.InvokeAsync(() => { + Dispatcher.InvokeAsync(() => { if (Topmost == false) MarginFromEdge = -60; else @@ -1437,20 +1519,20 @@ namespace Ink_Canvas { } } + var sb = new Storyboard(); var marginAnimation = new ThicknessAnimation { - Duration = TimeSpan.FromSeconds(0.35), + Duration = TimeSpan.FromSeconds(0.20), From = ViewboxFloatingBar.Margin, To = new Thickness(pos.X, pos.Y, 0, -20) }; marginAnimation.EasingFunction = new CircleEase(); - ViewboxFloatingBar.BeginAnimation(MarginProperty, marginAnimation); - }); - - await Task.Delay(200); - - await Dispatcher.InvokeAsync(() => { - ViewboxFloatingBar.Margin = new Thickness(pos.X, pos.Y, -2000, -200); - if (Topmost == false) ViewboxFloatingBar.Visibility = Visibility.Hidden; + sb.Children.Add(marginAnimation); + Storyboard.SetTargetProperty(sb, new PropertyPath(FrameworkElement.MarginProperty)); + sb.Completed += (sender, args) => { + ViewboxFloatingBar.Margin = new Thickness(pos.X, pos.Y, 0, -20); + if (Topmost == false) ViewboxFloatingBar.Visibility = Visibility.Hidden; + }; + sb.Begin(ViewboxFloatingBar); }); } diff --git a/InkCanvasForClass/MainWindow_cs/MW_Freeze.cs b/InkCanvasForClass/MainWindow_cs/MW_Freeze.cs new file mode 100644 index 0000000..2fa5c0a --- /dev/null +++ b/InkCanvasForClass/MainWindow_cs/MW_Freeze.cs @@ -0,0 +1,169 @@ +using OSVersionExtension; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using Vanara.PInvoke; + +namespace Ink_Canvas { + public partial class MainWindow : Window { + + public IntPtr MagnificationWinHandle; + public IntPtr MagnificationHostWindowHandle; + + public bool isFreezeFrameLoaded = false; + + [DllImport("user32.dll")] + static extern bool UpdateWindow(IntPtr hWnd); + + /// + /// 初始化画面定格窗口 + /// + /// + public void InitFreezeWindow(HWND[] hwndsList) { + isFreezeFrameLoaded = false; + if (OSVersion.GetOperatingSystem() < OSVersionExtension.OperatingSystem.Windows81) return; + if (!Magnification.MagInitialize()) return; + // 註冊宿主窗體類名 + var wndClassEx = new WNDCLASSEX { + cbSize = (uint)Marshal.SizeOf(), style = CS_HREDRAW | CS_VREDRAW, + lpfnWndProc = StaticWndProcDelegate, hInstance = IntPtr.Zero, + hCursor = LoadCursor(IntPtr.Zero, IDC_ARROW), hbrBackground = (IntPtr)(1 + COLOR_BTNFACE), + lpszClassName = "ICCMagnifierWindowHostForFreezeFrame", + hIcon = IntPtr.Zero, hIconSm = IntPtr.Zero + }; + RegisterClassEx(ref wndClassEx); + // 創建宿主窗體 + var windowHostHandle = CreateWindowEx( + WS_EX_TOPMOST | WS_EX_LAYERED, "ICCMagnifierWindowHostForFreezeFrame", "ICCMagnifierWindowHostWindowForFreezeFrame", + WS_SIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN | WS_CAPTION | WS_MAXIMIZEBOX, 0, 0, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, + IntPtr.Zero); + // 設定分層窗體 + SetLayeredWindowAttributes(windowHostHandle, 0, 0, LWA_ALPHA); + // 創建放大鏡窗體 + var hwndMag = CreateWindowEx( + 0, Magnification.WC_MAGNIFIER, "ICCMagnifierWindowForFreezeFrame", WS_CHILD | WS_VISIBLE | MS_CLIPAROUNDCURSOR, 0, 0, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height, windowHostHandle, + IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); + // 設定窗體樣式和排布 + int style = GetWindowLong(windowHostHandle, GWL_STYLE); + style &= ~WS_CAPTION; // 隐藏标题栏 + style &= ~WS_THICKFRAME; // 禁止窗口拉伸 + SetWindowLong(windowHostHandle, GWL_STYLE, style); + SetWindowPos(windowHostHandle, IntPtr.Zero, 0, 0, 0, 0, SWP_NOSIZE | SWP_FRAMECHANGED); + // 設定額外樣式 + int exStyle = GetWindowLong(windowHostHandle, GWL_EXSTYLE); + exStyle |= WS_EX_TOOLWINDOW; /* <- 隐藏任务栏图标 */ + exStyle &= ~WS_EX_APPWINDOW; + SetWindowLong(windowHostHandle, GWL_EXSTYLE, exStyle); + // 导出成员 + MagnificationWinHandle = hwndMag; + MagnificationHostWindowHandle = windowHostHandle; + // 設定放大鏡工廠 + Magnification.MAGTRANSFORM matrix = new Magnification.MAGTRANSFORM(); + matrix[0, 0] = 1.0f; + matrix[0, 1] = 0.0f; + matrix[0, 2] = 0.0f; + matrix[1, 0] = 0.0f; + matrix[1, 1] = 1.0f; + matrix[1, 2] = 0.0f; + matrix[2, 0] = 1.0f; + matrix[2, 1] = 0.0f; + matrix[2, 2] = 0.0f; + if (!Magnification.MagSetWindowTransform(hwndMag, matrix)) return; + // 設定放大鏡轉化矩乘陣列 + Magnification.MAGCOLOREFFECT magEffect = new Magnification.MAGCOLOREFFECT(); + magEffect[0, 0] = 1.0f; + magEffect[0, 1] = 0.0f; + magEffect[0, 2] = 0.0f; + magEffect[0, 3] = 0.0f; + magEffect[0, 4] = 0.0f; + magEffect[1, 0] = 0.0f; + magEffect[1, 1] = 1.0f; + magEffect[1, 2] = 0.0f; + magEffect[1, 3] = 0.0f; + magEffect[1, 4] = 0.0f; + magEffect[2, 0] = 0.0f; + magEffect[2, 1] = 0.0f; + magEffect[2, 2] = 1.0f; + magEffect[2, 3] = 0.0f; + magEffect[2, 4] = 0.0f; + magEffect[3, 0] = 0.0f; + magEffect[3, 1] = 0.0f; + magEffect[3, 2] = 0.0f; + magEffect[3, 3] = 1.0f; + magEffect[3, 4] = 0.0f; + magEffect[4, 0] = 0.0f; + magEffect[4, 1] = 0.0f; + magEffect[4, 2] = 0.0f; + magEffect[4, 3] = 0.0f; + magEffect[4, 4] = 1.0f; + if (!Magnification.MagSetColorEffect(hwndMag, magEffect)) return; + // 顯示窗體 + ShowWindow(windowHostHandle, SW_SHOW); + // 过滤窗口 + var hwnds = new List { hwndMag }; + hwnds.AddRange(hwndsList); + if (!Magnification.MagSetWindowFilterList(hwndMag, Magnification.MW_FILTERMODE.MW_FILTERMODE_EXCLUDE, + hwnds.Count, hwnds.ToArray())) return; + // 设置窗口 Source + if (!Magnification.MagSetWindowSource(hwndMag, new RECT(0, 0, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height))) return; + InvalidateRect(hwndMag, IntPtr.Zero, true); + isFreezeFrameLoaded = true; + } + + public async Task InitFreezeWindowAsync(HWND[] hwndsList) { + return await Task.Run(() => { + InitFreezeWindow(hwndsList); + return true; + }); + } + + public void DisposeFreezeFrame() { + // 反注册宿主窗口 + UnregisterClass("ICCMagnifierWindowHostForFreezeFrame", IntPtr.Zero); + // 销毁宿主窗口 + Magnification.MagUninitialize(); + DestroyWindow(MagnificationHostWindowHandle); + } + + public void SetFreezeFrameWindowsFilterList(HWND[] hwndsList) { + if (!isFreezeFrameLoaded) return; + var hwnds = new List { MagnificationWinHandle }; + hwnds.AddRange(hwndsList); + if (!Magnification.MagSetWindowFilterList(MagnificationWinHandle, Magnification.MW_FILTERMODE.MW_FILTERMODE_EXCLUDE, + hwnds.Count, hwnds.ToArray())) return; + } + + public Bitmap GetFreezedFrame() { + if (!isFreezeFrameLoaded) return new Bitmap(1,1); + if (!Magnification.MagSetWindowSource(MagnificationWinHandle, new RECT(0, 0, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, + System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height))) return new Bitmap(1,1); + InvalidateRect(MagnificationWinHandle, IntPtr.Zero, true); + UpdateWindow(MagnificationHostWindowHandle); + RECT rect; + GetWindowRect(MagnificationWinHandle, out rect); + Bitmap bmp = new Bitmap(rect.Width, rect.Height); + Graphics memoryGraphics = Graphics.FromImage(bmp); + PrintWindow(MagnificationWinHandle, memoryGraphics.GetHdc(), PW_RENDERFULLCONTENT); + memoryGraphics.ReleaseHdc(); + return bmp; + } + + public async Task GetFreezedFrameAsync() { + if (!isFreezeFrameLoaded) return null; + var result = await Task.Run(GetFreezedFrame); + return result; + } + } +} \ No newline at end of file diff --git a/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs b/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs index 49838b8..f1e02d3 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_InkCanvas.cs @@ -1,22 +1,40 @@ using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; +using System.Collections.Specialized; +using System.Reflection; using System.Windows; using System.Windows.Controls; -using System.Windows.Ink; using System.Windows.Input; -using System.Windows.Input.StylusPlugIns; -using System.Windows.Media; -namespace Ink_Canvas -{ +namespace Ink_Canvas { public class IccInkCanvas : InkCanvas { public IccInkCanvas() { - + // 通过反射移除InkCanvas自带的默认 Delete按键事件 + var commandBindingsField = + typeof(CommandManager).GetField("_classCommandBindings", BindingFlags.NonPublic | BindingFlags.Static); + var bnds = commandBindingsField.GetValue(null) as HybridDictionary; + var inkCanvasBindings = bnds[typeof(InkCanvas)] as CommandBindingCollection; + var enumerator = inkCanvasBindings.GetEnumerator(); + while (enumerator.MoveNext()) { + var item = (CommandBinding)enumerator.Current; + if (item.Command == ApplicationCommands.Delete) { + var executedField = + typeof(CommandBinding).GetField("Executed", BindingFlags.NonPublic | BindingFlags.Instance); + var canExecuteField = + typeof(CommandBinding).GetField("CanExecute", BindingFlags.NonPublic | BindingFlags.Instance); + executedField.SetValue(item, new ExecutedRoutedEventHandler((sender, args) => { })); + canExecuteField.SetValue(item, new CanExecuteRoutedEventHandler((sender, args) => { })); + } + } + + // 为IccInkCanvas注册自定义的 Delete按键Command并Invoke OnDeleteCommandFired。 + CommandManager.RegisterClassCommandBinding(typeof(IccInkCanvas), new CommandBinding(ApplicationCommands.Delete, + (sender, args) => { + DeleteKeyCommandFired?.Invoke(this, new RoutedEventArgs()); + }, (sender, args) => { + args.CanExecute = GetSelectedStrokes().Count != 0; + })); } + + public event EventHandler DeleteKeyCommandFired; } -} +} \ No newline at end of file diff --git a/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs b/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs index 6409c81..384ff18 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_SelectionGestures.cs @@ -121,15 +121,6 @@ namespace Ink_Canvas { // toolbutton BorderStrokeSelectionToolButton_MouseLeave(sender, e); - - // cancel - GridInkCanvasSelectionCover.Visibility = Visibility.Collapsed; - inkCanvas.Opacity = 1; - InkSelectionStrokesOverlay.Visibility = Visibility.Collapsed; - InkSelectionStrokesBackgroundInkCanvas.Visibility = Visibility.Collapsed; - InkSelectionStrokesOverlay.DrawStrokes(new StrokeCollection(), new Matrix()); - UpdateStrokeSelectionBorder(false, null); - RectangleSelectionHitTestBorder.Visibility = Visibility.Visible; } @@ -298,6 +289,10 @@ namespace Ink_Canvas { CancelCurrentStrokesSelection(); } + private void InkCanvasDeleteCommandFiredEvent(object sender, RoutedEventArgs e) { + SymbolIconDelete_MouseUp(null, null); + } + private void RectangleSelectionHitTestBorder_MouseDown(object sender, MouseButtonEventArgs e) { var pt = e.GetPosition(Main_Grid); var nt = inkCanvas.Strokes.HitTest(pt, 8); diff --git a/InkCanvasForClass/MainWindow_cs/MW_Settings.cs b/InkCanvasForClass/MainWindow_cs/MW_Settings.cs index 4c4856e..6350c54 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_Settings.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_Settings.cs @@ -18,9 +18,12 @@ using System.Xml.Linq; using iNKORE.UI.WPF.Modern.Media.Animation; using System.Security.Principal; using System.IO; +using System.Linq; using System.Reflection; +using System.Text; using System.Threading; using System.Timers; +using ColorPicker.Models; using Ink_Canvas.Popups; using Ookii.Dialogs.Wpf; using Microsoft.Office.Interop.PowerPoint; @@ -789,6 +792,38 @@ namespace Ink_Canvas { SaveSettingsToFile(); } + private void CheckboxFloatingBarIconsVisibility_CheckedChanged(object sender, RoutedEventArgs e) { + if (!isLoaded) return; + + var items = new CheckBox[] { + CheckboxEnableFloatingBarShapes, + CheckboxEnableFloatingBarFreeze, + CheckboxEnableFloatingBarHand, + CheckboxEnableFloatingBarUndo, + CheckboxEnableFloatingBarRedo, + CheckboxEnableFloatingBarCAM, + CheckboxEnableFloatingBarLasso, + CheckboxEnableFloatingBarWhiteboard, + CheckboxEnableFloatingBarFold, + CheckboxEnableFloatingBarGesture + }; + + if (!items.Contains((CheckBox)sender)) return; + if (Settings.Appearance.FloatingBarIconsVisibility.Length != 10) { + Settings.Appearance.FloatingBarIconsVisibility = + Settings.Appearance.FloatingBarIconsVisibility.PadRight(10, '1'); + SaveSettingsToFile(); + } + var value = Settings.Appearance.FloatingBarIconsVisibility; + var vsb = new StringBuilder(value); + vsb[Array.IndexOf(items, (CheckBox)sender)] = (bool)((CheckBox)sender).IsChecked ? '1' : '0'; + Settings.Appearance.FloatingBarIconsVisibility = vsb.ToString(); + + UpdateFloatingBarIconsVisibility(); + + SaveSettingsToFile(); + } + #endregion #region Canvas @@ -1520,6 +1555,7 @@ namespace Ink_Canvas { Settings.Advanced.IsEnableDPIChangeDetection = false; Settings.Advanced.IsEnableResolutionChangeDetection = false; Settings.Advanced.IsDisableCloseWindow = true; + Settings.Advanced.EnableForceTopMost = false; Settings.Appearance.IsEnableDisPlayNibModeToggler = false; Settings.Appearance.IsColorfulViewboxFloatingBar = false; @@ -1540,7 +1576,7 @@ namespace Ink_Canvas { Settings.Appearance.ViewboxFloatingBarOpacityInPPTValue = 1.0; Settings.Appearance.EnableTrayIcon = true; Settings.Appearance.FloatingBarButtonLabelVisibility = true; - Settings.Advanced.EnableForceTopMost = false; + Settings.Appearance.FloatingBarIconsVisibility = "11111111"; Settings.Automation.IsAutoFoldInEasiNote = true; Settings.Automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno = true; @@ -1603,7 +1639,7 @@ namespace Ink_Canvas { Settings.Canvas.HideStrokeWhenSelecting = false; Settings.Canvas.ClearCanvasAndClearTimeMachine = false; Settings.Canvas.FitToCurve = false; - Settings.Canvas.UsingWhiteboard = false; + //Settings.Canvas.UsingWhiteboard = false; Settings.Canvas.HyperbolaAsymptoteOption = 0; Settings.Canvas.BlackboardBackgroundColor = BlackboardBackgroundColorEnum.White; Settings.Canvas.BlackboardBackgroundPattern = BlackboardBackgroundPatternEnum.None; diff --git a/InkCanvasForClass/MainWindow_cs/MW_SettingsToLoad.cs b/InkCanvasForClass/MainWindow_cs/MW_SettingsToLoad.cs index ede48b5..c1751aa 100644 --- a/InkCanvasForClass/MainWindow_cs/MW_SettingsToLoad.cs +++ b/InkCanvasForClass/MainWindow_cs/MW_SettingsToLoad.cs @@ -5,8 +5,10 @@ using Ookii.Dialogs.Wpf; using OSVersionExtension; using System; using System.Diagnostics; +using System.Linq; using System.Reflection; using System.Security.Principal; +using System.Text; using System.Threading; using System.Windows; using System.Windows.Controls; @@ -326,6 +328,33 @@ namespace Ink_Canvas { ToggleSwitchFloatingBarButtonLabelVisibility.IsOn = Settings.Appearance.FloatingBarButtonLabelVisibility; + var items = new CheckBox[] { + CheckboxEnableFloatingBarShapes, + CheckboxEnableFloatingBarFreeze, + CheckboxEnableFloatingBarHand, + CheckboxEnableFloatingBarUndo, + CheckboxEnableFloatingBarRedo, + CheckboxEnableFloatingBarCAM, + CheckboxEnableFloatingBarLasso, + CheckboxEnableFloatingBarWhiteboard, + CheckboxEnableFloatingBarFold, + CheckboxEnableFloatingBarGesture + }; + + if (Settings.Appearance.FloatingBarIconsVisibility.Length != 10) { + Settings.Appearance.FloatingBarIconsVisibility = + Settings.Appearance.FloatingBarIconsVisibility.PadRight(10, '1'); + SaveSettingsToFile(); + } + + var floatingBarIconsVisibilityValue = Settings.Appearance.FloatingBarIconsVisibility; + var fbivca = floatingBarIconsVisibilityValue.ToCharArray(); + for (var i = 0; i < fbivca.Length; i++) { + items[i].IsChecked = fbivca[i] == '1'; + } + + UpdateFloatingBarIconsVisibility(); + FloatingBarTextVisibilityBindingLikeAPieceOfShit.Visibility = Settings.Appearance.FloatingBarButtonLabelVisibility ? Visibility.Visible : Visibility.Collapsed; SystemEvents_UserPreferenceChanged(null, null); @@ -631,6 +660,11 @@ namespace Ink_Canvas { ToggleSwitchIsEnableAutoConvertInkColorWhenBackgroundChanged.IsOn = Settings.Canvas.IsEnableAutoConvertInkColorWhenBackgroundChanged; + + ComboBoxSelectionMethod.SelectedIndex = Settings.Canvas.SelectionMethod; + ToggleSwitchAllowClickToSelectLockedStroke.IsOn = Settings.Canvas.AllowClickToSelectLockedStroke; + ToggleSwitchOnlyHitTestFullyContainedStrokes.IsOn = Settings.Canvas.OnlyHitTestFullyContainedStrokes; + ToggleSwitchApplyScaleToStylusTip.IsOn = Settings.Canvas.ApplyScaleToStylusTip; } else { Settings.Canvas = new Canvas(); } diff --git a/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs b/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs index 6855f7e..72af71c 100644 --- a/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs +++ b/InkCanvasForClass/Popups/ScreenshotWindow.xaml.cs @@ -167,7 +167,7 @@ namespace Ink_Canvas.Popups return result; } - private BitmapImage BitmapToImageSource(Bitmap bitmap) + public BitmapImage BitmapToImageSource(Bitmap bitmap) { using (MemoryStream memory = new MemoryStream()) { diff --git a/InkCanvasForClass/Resources/Settings.cs b/InkCanvasForClass/Resources/Settings.cs index ee46291..8493dd0 100644 --- a/InkCanvasForClass/Resources/Settings.cs +++ b/InkCanvasForClass/Resources/Settings.cs @@ -230,9 +230,10 @@ namespace Ink_Canvas public bool IsShowModeFingerToggleSwitch { get; set; } = true; [JsonProperty("theme")] public int Theme { get; set; } = 0; - [JsonProperty("floatingBarButtonLabelVisibility")] public bool FloatingBarButtonLabelVisibility = true; + [JsonProperty("FloatingBarIconsVisibility")] + public string FloatingBarIconsVisibility = "11111111"; } public class PowerPointSettings