protected void OnSaveApplyTemplate(object sender, RoutedEventArgs e) { Logger.LogTrace(); var mainEditor = App.Overlay; if (mainEditor.CurrentDataContext is LayoutModel model) { // If new custom Canvas layout is created (i.e. edited Blank layout), // it's type needs to be updated if (model.Type == LayoutType.Blank) { model.Type = LayoutType.Custom; } model.Persist(); MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; settings.SetAppliedModel(model); App.Overlay.SetLayoutSettings(App.Overlay.Monitors[App.Overlay.CurrentDesktop], model); } App.FancyZonesEditorIO.SerializeLayoutTemplates(); App.FancyZonesEditorIO.SerializeCustomLayouts(); App.FancyZonesEditorIO.SerializeAppliedLayouts(); Close(); }
public App() { // DebugModeCheck(); FancyZonesEditorIO = new FancyZonesEditorIO(); Overlay = new Overlay(); MainWindowSettings = new MainWindowSettingsModel(); }
private void ArrangeGridRects(Size arrangeSize) { var workArea = App.Overlay.WorkArea; Preview.Width = workArea.Width; Preview.Height = workArea.Height; GridLayoutModel model = Model; if (model == null) { return; } if (model.Rows != model.RowPercents.Count || model.Columns != model.ColumnPercents.Count) { // Merge was not finished return; } MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; int spacing = settings.ShowSpacing ? settings.Spacing : 0; _data.RecalculateZones(spacing, arrangeSize); _data.ArrangeZones(Preview.Children, spacing); _dragHandles.InitDragHandles(model); _data.ArrangeResizers(AdornerLayer.Children, spacing); }
private void OnStartup(object sender, StartupEventArgs e) { AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; RunnerHelper.WaitForPowerToysRunner(PowerToysPID, () => { Logger.LogInfo("Runner exited"); Environment.Exit(0); }); _themeManager = new ThemeManager(this); if (!FancyZonesEditorIO.ParseParams().Result) { FancyZonesEditorIO.ParseCommandLineArguments(); } var parseResult = FancyZonesEditorIO.ParseZoneSettings(); // 10ms retry loop with 1 second timeout if (!parseResult.Result) { CancellationTokenSource ts = new CancellationTokenSource(); Task t = Task.Run(() => { while (!parseResult.Result && !ts.IsCancellationRequested) { Task.Delay(10).Wait(); parseResult = FancyZonesEditorIO.ParseZoneSettings(); } }); try { bool result = t.Wait(1000, ts.Token); ts.Cancel(); } catch (OperationCanceledException) { ts.Dispose(); } } // Error message if parsing failed if (!parseResult.Result) { Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Zones_Settings_Title, MessageBoxButton.OK); } MainWindowSettingsModel settings = ((App)Current).MainWindowSettings; settings.UpdateSelectedLayoutModel(); Overlay.Show(); }
public App() { // DebugModeCheck(); FancyZonesEditorIO = new FancyZonesEditorIO(); Overlay = new Overlay(); MainWindowSettings = new MainWindowSettingsModel(); _exitWaitThread = new Thread(App_WaitExit); _exitWaitThread.Start(); }
private void OnStartup(object sender, StartupEventArgs e) { AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; RunnerHelper.WaitForPowerToysRunner(PowerToysPID, () => { Logger.LogInfo("Runner exited"); Environment.Exit(0); }); _themeManager = new ThemeManager(this); var parseResult = FancyZonesEditorIO.ParseParams(); if (!parseResult.Result) { Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); } parseResult = FancyZonesEditorIO.ParseAppliedLayouts(); if (!parseResult.Result) { Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); } parseResult = FancyZonesEditorIO.ParseCustomLayouts(); if (!parseResult.Result) { Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); } parseResult = FancyZonesEditorIO.ParseLayoutHotkeys(); if (!parseResult.Result) { Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); } parseResult = FancyZonesEditorIO.ParseLayoutTemplates(); if (!parseResult.Result) { Logger.LogError(ParsingErrorReportTag + ": " + parseResult.Message + "; " + ParsingErrorDataTag + ": " + parseResult.MalformedData); MessageBox.Show(parseResult.Message, FancyZonesEditor.Properties.Resources.Error_Parsing_Data_Title, MessageBoxButton.OK); } MainWindowSettingsModel settings = ((App)Current).MainWindowSettings; settings.UpdateSelectedLayoutModel(); Overlay.Show(); }
private void DoSplit(Orientation orientation, double offset) { int spacing = 0; MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; if (settings.ShowSpacing) { spacing = settings.Spacing; } Split?.Invoke(this, new SplitEventArgs(orientation, offset, spacing)); }
public App() { // DebugModeCheck(); FancyZonesEditorIO = new FancyZonesEditorIO(); Overlay = new Overlay(); MainWindowSettings = new MainWindowSettingsModel(); new Thread(() => { _eventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, interop.Constants.FZEExitEvent()); if (_eventHandle.WaitOne()) { Environment.Exit(0); } }).Start(); }
private void OnStartup(object sender, StartupEventArgs e) { AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; RunnerHelper.WaitForPowerToysRunner(PowerToysPID, () => { Environment.Exit(0); }); FancyZonesEditorIO.ParseCommandLineArguments(); FancyZonesEditorIO.ParseDeviceInfoData(); MainWindowSettingsModel settings = ((App)Current).MainWindowSettings; settings.UpdateSelectedLayoutModel(); Overlay.Show(); }
private void Resizer_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e) { MergeCancelClick(null, null); GridResizer resizer = (GridResizer)sender; double delta = (resizer.Orientation == Orientation.Vertical) ? e.HorizontalChange : e.VerticalChange; if (delta == 0) { return; } GridData.ResizeInfo resizeInfo = _data.CalculateResizeInfo(resizer, delta); if (resizeInfo.IsResizeAllowed) { if (_dragHandles.HasSnappedNonAdjacentResizers(resizer)) { double spacing = 0; MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; if (settings.ShowSpacing) { spacing = settings.Spacing; } _data.SplitOnDrag(resizer, delta, spacing); _dragHandles.UpdateAfterDetach(resizer, delta); } else { _data.DragResizer(resizer, resizeInfo); if (_data.SwapNegativePercents(resizer.Orientation, resizer.StartRow, resizer.EndRow, resizer.StartCol, resizer.EndCol)) { _dragHandles.UpdateAfterSwap(resizer, delta); } } } Rect workingArea = App.Overlay.WorkArea; Size actualSize = new Size(workingArea.Width, workingArea.Height); ArrangeGridRects(actualSize); AdornerLayer.UpdateLayout(); }
private void EditLayout_Click(object sender, RoutedEventArgs e) { var mainEditor = App.Overlay; if (!(mainEditor.CurrentDataContext is LayoutModel model)) { return; } model.IsSelected = false; Hide(); bool isPredefinedLayout = MainWindowSettingsModel.IsPredefinedLayout(model); if (!MainWindowSettingsModel.CustomModels.Contains(model) || isPredefinedLayout) { if (isPredefinedLayout) { // make a copy model = model.Clone(); mainEditor.CurrentDataContext = model; } int maxCustomIndex = 0; foreach (LayoutModel customModel in MainWindowSettingsModel.CustomModels) { string name = customModel.Name; if (name.StartsWith(_defaultNamePrefix)) { if (int.TryParse(name.Substring(_defaultNamePrefix.Length), out int i)) { if (maxCustomIndex < i) { maxCustomIndex = i; } } } } model.Name = _defaultNamePrefix + (++maxCustomIndex); } mainEditor.OpenEditor(model); }
public void ShowLayout() { MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; CurrentDataContext = settings.UpdateSelectedLayoutModel(); var window = CurrentLayoutWindow; window.Content = _layoutPreview; window.DataContext = CurrentDataContext; if (_layoutPreview != null) { _layoutPreview.UpdatePreview(); } for (int i = 0; i < DesktopsCount; i++) { Monitors[i].Window.Show(); } }
private void Reset_Click(object sender, RoutedEventArgs e) { var overlay = App.Overlay; MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; if (overlay.CurrentDataContext is LayoutModel model) { model.IsSelected = false; model.IsApplied = false; } overlay.CurrentLayoutSettings.ZonesetUuid = settings.BlankModel.Uuid; overlay.CurrentLayoutSettings.Type = LayoutType.Blank; overlay.CurrentDataContext = settings.BlankModel; App.FancyZonesEditorIO.SerializeAppliedLayouts(); if (!overlay.MultiMonitorMode) { Close(); } }
private void OnStartup(object sender, StartupEventArgs e) { AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; RunnerHelper.WaitForPowerToysRunner(PowerToysPID, () => { Environment.Exit(0); }); _themeManager = new ThemeManager(this); if (!FancyZonesEditorIO.ParseParams().Result) { FancyZonesEditorIO.ParseCommandLineArguments(); } var parseResult = FancyZonesEditorIO.ParseZoneSettings(); // 10ms retry loop with 1 second timeout if (!parseResult.Result) { CancellationTokenSource ts = new CancellationTokenSource(); Task t = Task.Run(() => { while (!parseResult.Result && !ts.IsCancellationRequested) { Task.Delay(10).Wait(); parseResult = FancyZonesEditorIO.ParseZoneSettings(); } }); try { bool result = t.Wait(1000, ts.Token); ts.Cancel(); } catch (OperationCanceledException) { ts.Dispose(); } } // Error message if parsing failed if (!parseResult.Result) { var sb = new StringBuilder(); sb.AppendLine(); sb.AppendLine("## " + ParsingErrorReportTag); sb.AppendLine(); sb.AppendLine(parseResult.Message); sb.AppendLine(); sb.AppendLine(ParsingErrorDataTag); sb.AppendLine(parseResult.MalformedData); string message = parseResult.Message + Environment.NewLine + Environment.NewLine + FancyZonesEditor.Properties.Resources.Error_Parsing_Zones_Settings_User_Choice; if (MessageBox.Show(message, FancyZonesEditor.Properties.Resources.Error_Parsing_Zones_Settings_Title, MessageBoxButton.YesNo) == MessageBoxResult.No) { // TODO: log error ShowExceptionReportMessageBox(sb.ToString()); Environment.Exit(0); } ShowExceptionReportMessageBox(sb.ToString()); } MainWindowSettingsModel settings = ((App)Current).MainWindowSettings; settings.UpdateSelectedLayoutModel(); Overlay.Show(); }
private void RenderSmallScalePreview(GridLayoutModel grid) { foreach (int percent in grid.RowPercents) { RowDefinition def = new RowDefinition { Height = new GridLength(percent, GridUnitType.Star), }; Body.RowDefinitions.Add(def); } foreach (int percent in grid.ColumnPercents) { ColumnDefinition def = new ColumnDefinition { Width = new GridLength(percent, GridUnitType.Star), }; Body.ColumnDefinitions.Add(def); } MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; Thickness margin = new Thickness(settings.ShowSpacing ? settings.Spacing / 20 : 0); List <int> visited = new List <int>(); for (int row = 0; row < grid.Rows; row++) { for (int col = 0; col < grid.Columns; col++) { int childIndex = grid.CellChildMap[row, col]; if (!visited.Contains(childIndex)) { visited.Add(childIndex); Rectangle rect = new Rectangle(); Grid.SetRow(rect, row); Grid.SetColumn(rect, col); int span = 1; int walk = row + 1; while ((walk < grid.Rows) && grid.CellChildMap[walk, col] == childIndex) { span++; walk++; } Grid.SetRowSpan(rect, span); span = 1; walk = col + 1; while ((walk < grid.Columns) && grid.CellChildMap[row, walk] == childIndex) { span++; walk++; } Grid.SetColumnSpan(rect, span); rect.Margin = margin; rect.StrokeThickness = 1; rect.Stroke = Brushes.DarkGray; rect.Fill = Brushes.LightGray; Body.Children.Add(rect); } } } }
private void RenderActualScalePreview(GridLayoutModel grid) { int rows = grid.Rows; int cols = grid.Columns; RowColInfo[] rowInfo = (from percent in grid.RowPercents select new RowColInfo(percent)).ToArray(); RowColInfo[] colInfo = (from percent in grid.ColumnPercents select new RowColInfo(percent)).ToArray(); MainWindowSettingsModel settings = ((App)Application.Current).MainWindowSettings; int spacing = settings.ShowSpacing ? settings.Spacing : 0; var workArea = App.Overlay.WorkArea; double width = workArea.Width - (spacing * (cols + 1)); double height = workArea.Height - (spacing * (rows + 1)); double top = spacing; for (int row = 0; row < rows; row++) { double cellHeight = rowInfo[row].Recalculate(top, height); top += cellHeight + spacing; } double left = spacing; for (int col = 0; col < cols; col++) { double cellWidth = colInfo[col].Recalculate(left, width); left += cellWidth + spacing; } Viewbox viewbox = new Viewbox { Stretch = Stretch.Uniform, }; Body.Children.Add(viewbox); Canvas frame = new Canvas { Width = workArea.Width, Height = workArea.Height, }; viewbox.Child = frame; for (int row = 0; row < rows; row++) { for (int col = 0; col < cols; col++) { int childIndex = grid.CellChildMap[row, col]; if (((row == 0) || (grid.CellChildMap[row - 1, col] != childIndex)) && ((col == 0) || (grid.CellChildMap[row, col - 1] != childIndex))) { // this is not a continuation of a span Rectangle rect = new Rectangle(); left = colInfo[col].Start; top = rowInfo[row].Start; Canvas.SetTop(rect, top); Canvas.SetLeft(rect, left); int maxRow = row; while (((maxRow + 1) < rows) && (grid.CellChildMap[maxRow + 1, col] == childIndex)) { maxRow++; } int maxCol = col; while (((maxCol + 1) < cols) && (grid.CellChildMap[row, maxCol + 1] == childIndex)) { maxCol++; } rect.Width = Math.Max(0, colInfo[maxCol].End - left); rect.Height = Math.Max(0, rowInfo[maxRow].End - top); rect.StrokeThickness = 1; rect.Stroke = Brushes.DarkGray; rect.Fill = Brushes.LightGray; frame.Children.Add(rect); _zones.Add(new Int32Rect( (int)left, (int)top, (int)rect.Width, (int)rect.Height)); } } } if (App.DebugMode) { TextBlock text = new TextBlock(); text.Text = "(" + workArea.X + "," + workArea.Y + ")"; text.FontSize = 42; frame.Children.Add(text); } }