From 9b9512df42f30aad06971a2639c3992cd1fc8c32 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Sun, 5 Jan 2020 22:27:56 +0000 Subject: [PATCH 1/7] Gui test script --- GuiSpike.ahk | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 GuiSpike.ahk diff --git a/GuiSpike.ahk b/GuiSpike.ahk new file mode 100644 index 0000000..cc5f32d --- /dev/null +++ b/GuiSpike.ahk @@ -0,0 +1,173 @@ +cascadeGutterSize := 25 +columnGutterSize := 10 +gridGutterSize := 15 +spanMonitorGutterSize := 20 +restoreDesktopIconsOnStartup := true +restoreWindowPositionsOnStartup := true +windowPositionsIncludeOffScreenWindows := false +windowPositionsFilesToKeep := 19 +desktopIconsFilesToKeep := 21 + +shit := "This.iscrap" + +crap := Instr(shit, ".") ? StrSplit(shit, ".")[2] : shit + +MsgBox,,, %crap% + + +ShowConfigGui() + +return + +BuildGui() +{ + global cascadeGutterSize + global columnGutterSize + global gridGutterSize + global spanMonitorGutterSize + global restoreDesktopIconsOnStartup + global restoreWindowPositionsOnStartup + global MenuLocationValues + global windowPositionsIncludeOffScreenWindows + global windowPositionsFilesToKeep + global desktopIconsFilesToKeep + + menuLocationItemsText := "None|Window Menu|Tray Menu|Both" + + col1 := 20 + col2 := 220 + tabHeight := 40 + rowHeight := 30 + textOffSet := 3 + + row1 := tabHeight + (rowHeight * 0) + row2 := tabHeight + (rowHeight * 1) + row3 := tabHeight + (rowHeight * 2) + row4 := tabHeight + (rowHeight * 3) + + row1t := row1 + textOffset + row2t := row2 + textOffset + row3t := row3 + textOffset + row4t := row4 + textOffset + + Gui, Config:New, -SysMenu, Configuration + Gui, Config:Margin, 5, 5 + Gui, Config:Add, Tab3, -Wrap w370 h230, General|Startup|Menu Control|Window Positions|Desktop Icons + + ; Tab 1 - General + Gui, Config:Tab, 1 + ; Row 1 + Gui, Config:Add, Text, x%col1% y%row1t%, C&ascade Gutter Size: + Gui, Config:Add, Edit, x%col2% y%row1% w80 x%col2% + Gui, Config:Add, UpDown, vcascadeGutterSize Range0-100, %cascadeGutterSize% + ; Row 2 + Gui, Config:Add, Text, x%col1% y%row2t%, C&olumn Gutter Size: + Gui, Config:Add, Edit, w80 x%col2% y%row2% + Gui, Config:Add, UpDown, vcolumnGutterSize Range0-100, %columnGutterSize% + ; Row 3 + Gui, Config:Add, Text, x%col1% y%row3t%, &Grid Gutter Size: + Gui, Config:Add, Edit, w80 x%col2% y%row3% + Gui, Config:Add, UpDown, vgridGutterSize Range0-100, %gridGutterSize% + ; Row 4 + Gui, Config:Add, Text, x%col1% y%row4t%, Span &Monitor Gutter Size: + Gui, Config:Add, Edit, w80 x%col2% y%row4% + Gui, Config:Add, UpDown, vspanMonitorGutterSize Range0-100, %spanMonitorGutterSize% + + ; Tab 2 - Startup + Gui, Config:Tab, 2 + ; Row 1 + Gui, Config:Add, Checkbox, x%col1% y%row1t% vrestoreWindowPositionsOnStartup Checked%restoreWindowPositionsOnStartup%, Restore Window &Positions on Startup + ; Row 2 + Gui, Config:Add, Checkbox, x%col1% y%row2t% vrestoreDesktopIconsOnStartup Checked%restoreDesktopIconsOnStartup%, Restore Desktop &Icons on Startup + + ; Tab 3 - Menu Control + Gui, Config:Tab, 3 + ; Row 1 + Gui, Config:Add, Text, x%col1% y%row1t%, Window &Positions Menu Location: + Gui, Config:Add, DropDownList, x%col2% y%row1% vwindowPositionsMenuLocation AltSubmit Choose%windowPositionsMenuLocationChoice%, %menuLocationItemsText% + ; Row 2 + Gui, Config:Add, Text, x%col1% y%row2t%, Desktop &Icons Menu Location: + Gui, Config:Add, DropDownList, x%col2% y%row2% vdesktopIconsMenuLocation AltSubmit Choose%desktopIconsMenuLocationChoice%, %menuLocationItemsText% + + ; Tab 4 - Window Positions + Gui, Config:Tab, 4 + ; Row 1 + Gui, Config:Add, Text, x%col1% y%row1t%, Number of saved files to &keep : + Gui, Config:Add, Edit, w80 x%col2% y%row1% + Gui, Config:Add, UpDown, vwindowPositionsFilesToKeep Range0-100, %windowPositionsFilesToKeep% + ; Row 2 + Gui, Config:Add, Checkbox, x%col1% y%row2t% vwindowPositionsIncludeOffScreenWindows Checked%windowPositionsIncludeOffScreenWindows%, Include Off-Screen Windows + + ; Tab 5 - Desktop Icons + Gui, Config:Tab, 5 + ; Row 1 + Gui, Config:Add, Text, x%col1% y%row1t%, Number of saved files to &keep : + Gui, Config:Add, Edit, w80 x%col2% y%row1% + Gui, Config:Add, UpDown, vdesktopIconsFilesToKeep Range0-100, %desktopIconsFilesToKeep% + + ; Button Bar + Gui, Config:Tab + Gui, Config:Add, Button, default x205 y240 w80, OK ; The label ButtonOK (if it exists) will be run when the button is pressed. + Gui, Config:Add, Button, x295 y240 w80, Cancel ; The label ButtonCancel (if it exists) will be run when the button is pressed. +} + +DestroyUserConfigGui() +{ + Gui, Config:Destroy +} + +ShowConfigGui() +{ + global G_UserConfig + + BuildGui() + + Gui, Config:Show +} + +ConfigGuiEscape: +{ + DestroyUserConfigGui() + ExitApp +} + +ConfigGuiClose: +{ + DestroyUserConfigGui() + ExitApp +} + +ConfigButtonCancel: +{ + DestroyUserConfigGui() + ExitApp +} + +ConfigButtonOK: +{ + global cascadeGutterSize + global columnGutterSize + global gridGutterSize + global spanMonitorGutterSize + global restoreDesktopIconsOnStartup + global restoreWindowPositionsOnStartup + global MenuLocationValues + global windowPositionsIncludeOffScreenWindows + + Gui, Config:Submit + + G_UserConfig.CascadeGutterSize := cascadeGutterSize + G_UserConfig.ColumnGutterSize := columnGutterSize + G_UserConfig.GridGutterSize := gridGutterSize + G_UserConfig.SpanMonitorGutterSize := spanMonitorGutterSize + G_UserConfig.RestoreDesktopIconsOnStartup := restoreDesktopIconsOnStartup + G_UserConfig.RestoreWindowPositionsOnStartup := restoreWindowPositionsOnStartup + G_UserConfig.DesktopIconsMenuLocation := MenuLocationValues[desktopIconsMenuLocation] + G_UserConfig.WindowPositionsMenuLocation := MenuLocationValues[windowPositionsMenuLocation] + G_UserConfig.WindowPositions_IncludeOffScreenWindows := windowPositionsIncludeOffScreenWindows + G_UserConfig.Save() + + DestroyUserConfigGui() + + ExitApp +} From d60d009bcd03fe7e1bac750d893ce66aa5535bb3 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Sun, 5 Jan 2020 22:28:25 +0000 Subject: [PATCH 2/7] Support Section names better --- Lib/UserConfig.ahk | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/Lib/UserConfig.ahk b/Lib/UserConfig.ahk index 6bc0074..0f9a8e7 100644 --- a/Lib/UserConfig.ahk +++ b/Lib/UserConfig.ahk @@ -1,5 +1,5 @@ -#Include Lib\UserDataUtils.ahk #Include Lib\Logging.ahk +#Include Lib\UserDataUtils.ahk #Include Lib\WindowPositions.ahk ;-------------------------------------------------------------------------------- @@ -13,8 +13,9 @@ UserConfig_OnInit() ; UserConfig base class class UserConfig { - Properties := [] DataFileName := + Properties := [] + ObsoleteProperties := [] __New(fileName) { @@ -60,9 +61,7 @@ class UserConfig GetSectionNameFromFunc(func, defaultName := "General") { - bits := StrSplit(func, ".") - - sectionName := bits[2] + sectionName := Instr(func, ".") ? StrSplit(func, ".")[2] : func if (sectionName =) sectionName := func @@ -78,9 +77,7 @@ class UserConfig GetPropertyNameFromFunc(func) { - bits := StrSplit(func, ".") - - propertyName := bits[2] + propertyName := Instr(func, ".") ? StrSplit(func, ".")[2] : func if (propertyName =) propertyName := func @@ -92,6 +89,14 @@ class UserConfig return propertyName } + RemoveProperty(section, propertyName) + { + dataFileName := this.DataFileName + + LogText("Removing: [" . section . "]." . propertyName) + IniDelete, %dataFileName%, %section%, %propertyName% + } + Save() { for index, propertyName in this.Properties @@ -99,5 +104,9 @@ class UserConfig value := this[propertyName] this[propertyName] := value } + for index, propertyName in this.ObsoleteProperties + { + this.RemoveProperty(this.GetSectionNameFromFunc(propertyName), this.GetPropertyNameFromFunc(propertyName)) + } } } From ce1411bf3d2768c4936955ed67da074dfe3834d8 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Sun, 5 Jan 2020 22:29:01 +0000 Subject: [PATCH 3/7] Rename Config settings to contain section names --- TrayMenu.ahk | 6 +- WindowExtensionsUserConfig.ahk | 109 +++++++++++++++++++++------------ WindowMenu.ahk | 36 +++++------ 3 files changed, 90 insertions(+), 61 deletions(-) diff --git a/TrayMenu.ahk b/TrayMenu.ahk index dfb71b2..6eb7d1d 100644 --- a/TrayMenu.ahk +++ b/TrayMenu.ahk @@ -43,7 +43,7 @@ BuildTrayMenu() menuIndex := AddMenuItemWithIcon(TrayMenuName, "Con&figure...", "TrayConfigureHandler", A_ScriptFullPath, 0, menuIndex) ; Window Positions - if (ContainsFlag(G_UserConfig.WindowPositionsMenuLocation, MenuLocationTrayMenu)) + if (ContainsFlag(G_UserConfig.MenuControl_WindowPositionsMenuLocation, MenuLocationTrayMenu)) { menuIndex := AddMenuItemSeparator(TrayMenuName, menuIndex) @@ -58,7 +58,7 @@ BuildTrayMenu() } ; Desktop Icons - if (ContainsFlag(G_UserConfig.DesktopIconsMenuLocation, MenuLocationTrayMenu)) + if (ContainsFlag(G_UserConfig.MenuControl_DesktopIconsMenuLocation, MenuLocationTrayMenu)) { menuIndex := AddMenuItemSeparator(TrayMenuName, menuIndex) @@ -81,7 +81,7 @@ BuildTrayMenu() ;-------------------------------------------------------------------------------- TrayConfigureHandler: -ShowUserConfigGui() +ShowConfigGui() return ;-------------------------------------------------------------------------------- diff --git a/WindowExtensionsUserConfig.ahk b/WindowExtensionsUserConfig.ahk index 2b52073..6719d6f 100644 --- a/WindowExtensionsUserConfig.ahk +++ b/WindowExtensionsUserConfig.ahk @@ -47,34 +47,37 @@ WindowExtensionsUserConfig_OnStartup() { global G_UserConfig - if (G_UserConfig.RestoreDesktopIconsOnStartup) + if (G_UserConfig.Startup_RestoreDesktopIcons) { - RestoreDesktopIcons() + RestoreDesktopIcons() } - if (G_UserConfig.RestoreWindowPositionsOnStartup) + if (G_UserConfig.Startup_RestoreWindowPositions) { - RestoreWindowPositions(G_UserConfig.WindowPositions_IncludeOffScreenWindows) + RestoreWindowPositions(G_UserConfig.WindowPositions_IncludeOffScreenWindows) } } class WindowExtensionsUserConfig extends UserConfig { -DefaultCascadeGutterSize := 30 -DefaultColumnGutterSize := 5 -DefaultGridGutterSize := 5 -DefaultSpanMonitorGutterSize := 5 -DefaultRestoreDesktopIconsOnStartup := false -DefaultRestoreWindowPositionsOnStartup := false -DefaultWindowPositionsMenuLocation := 2 -DefaultDesktopIconsMenuLocation := 2 -DefaultWindowPositions_IncludeOffScreenWindows := false +Default_About_Version := "" +Default_General_CascadeGutterSize := 30 +Default_General_ColumnGutterSize := 5 +Default_General_GridGutterSize := 5 +Default_General_SpanMonitorGutterSize := 5 +Default_Startup_RestoreDesktopIcons := false +Default_Startup_RestoreWindowPositions := false +Default_MenuControl_WindowPositionsMenuLocation := 0 +Default_MenuControl_DesktopIconsMenuLocation := 0 +Default_WindowPositions_IncludeOffScreenWindows := false InitDefaults() { + global AppVersion global MenuLocationTrayMenu - this.DefaultWindowPositionsMenuLocation := MenuLocationTrayMenu - this.DefaultDesktopIconsMenuLocation := MenuLocationTrayMenu + this.Default_About_Version := AppVersion + this.Default_MenuControl_WindowPositionsMenuLocation := MenuLocationTrayMenu + this.Default_MenuControl_DesktopIconsMenuLocation := MenuLocationTrayMenu } __New() @@ -87,22 +90,40 @@ DefaultWindowPositions_IncludeOffScreenWindows := false base.__New(fileName) - this.Properties.push("CascadeGutterSize") - this.Properties.push("ColumnGutterSize") - this.Properties.push("GridGutterSize") - this.Properties.push("SpanMonitorGutterSize") - this.Properties.push("RestoreDesktopIconsOnStartup") - this.Properties.push("RestoreWindowPositionsOnStartup") - this.Properties.push("WindowPositionsMenuLocation") - this.Properties.push("DesktopIconsMenuLocation") + this.Properties.push("About_Version") + this.Properties.push("General_CascadeGutterSize") + this.Properties.push("General_ColumnGutterSize") + this.Properties.push("General_GridGutterSize") + this.Properties.push("General_SpanMonitorGutterSize") + this.Properties.push("Startup_RestoreDesktopIcons") + this.Properties.push("Startup_RestoreWindowPositions") + this.Properties.push("MenuControl_WindowPositionsMenuLocation") + this.Properties.push("MenuControl_DesktopIconsMenuLocation") this.Properties.push("WindowPositions_IncludeOffScreenWindows") + + this.ObsoleteProperties.push("General_RestoreDesktopIconsOnStartup") + this.ObsoleteProperties.push("General_RestoreWindowPositionsOnStartup") + this.ObsoleteProperties.push("General_DesktopIconsMenuLocation") + this.ObsoleteProperties.push("General_WindowPositionsMenuLocation") + } + + About_Version + { + get + { + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.Default_General_CascadeGutterSize, "string") + } + set + { + base.SetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.Default_About_Version) + } } - CascadeGutterSize + General_CascadeGutterSize { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultCascadeGutterSize, "integer") + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.Default_General_CascadeGutterSize, "integer") } set { @@ -110,11 +131,11 @@ DefaultWindowPositions_IncludeOffScreenWindows := false } } - ColumnGutterSize + General_ColumnGutterSize { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultColumnGutterSize, "integer") + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.Default_General_ColumnGutterSize, "integer") } set { @@ -122,11 +143,11 @@ DefaultWindowPositions_IncludeOffScreenWindows := false } } - GridGutterSize + General_GridGutterSize { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultGridGutterSize, "integer") + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.Default_General_GridGutterSize, "integer") } set { @@ -134,11 +155,11 @@ DefaultWindowPositions_IncludeOffScreenWindows := false } } - SpanMonitorGutterSize + General_SpanMonitorGutterSize { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultSpanMonitorGutterSize, "integer") + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.Default_General_SpanMonitorGutterSize, "integer") } set { @@ -146,11 +167,13 @@ DefaultWindowPositions_IncludeOffScreenWindows := false } } - RestoreDesktopIconsOnStartup + Startup_RestoreDesktopIcons { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultRestoreDesktopIconsOnStartup, "boolean") + oldValue1 := base.GetValue("General", "RestoreDesktopIconsOnStartup", this.Default_Startup_RestoreDesktopIcons, "boolean") + + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), oldValue1, "boolean") } set { @@ -158,11 +181,13 @@ DefaultWindowPositions_IncludeOffScreenWindows := false } } - RestoreWindowPositionsOnStartup + Startup_RestoreWindowPositions { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultRestoreWindowPositionsOnStartup, "boolean") + oldValue1 := base.GetValue("General", "RestoreWindowPositionsOnStartup", this.Default_Startup_RestoreWindowPositions, "boolean") + + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), oldValue1, "boolean") } set { @@ -170,11 +195,13 @@ DefaultWindowPositions_IncludeOffScreenWindows := false } } - WindowPositionsMenuLocation + MenuControl_WindowPositionsMenuLocation { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultWindowPositionsMenuLocation, "integer") + oldValue1 := base.GetValue("General", "WindowPositionsMenuLocation", this.Default_MenuControl_WindowPositionsMenuLocation, "integer") + + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), oldValue1, "integer") } set { @@ -182,11 +209,13 @@ DefaultWindowPositions_IncludeOffScreenWindows := false } } - DesktopIconsMenuLocation + MenuControl_DesktopIconsMenuLocation { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultDesktopIconsMenuLocation, "integer") + oldValue1 := base.GetValue("General", "DesktopIconsMenuLocation", this.Default_MenuControl_WindowPositionsMenuLocation, "integer") + + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), oldValue1, "integer") } set { @@ -198,7 +227,7 @@ DefaultWindowPositions_IncludeOffScreenWindows := false { get { - return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.DefaultWindowPositions_IncludeOffScreenWindows, "boolean") + return base.GetValue(base.GetSectionNameFromFunc(A_ThisFunc), base.GetPropertyNameFromFunc(A_ThisFunc), this.Default_WindowPositions_IncludeOffScreenWindows, "boolean") } set { diff --git a/WindowMenu.ahk b/WindowMenu.ahk index 0f04824..a2ec729 100644 --- a/WindowMenu.ahk +++ b/WindowMenu.ahk @@ -83,7 +83,7 @@ BuildWindowMenu() } ; Window Positions - if (ContainsFlag(G_UserConfig.WindowPositionsMenuLocation, MenuLocationWindowMenu)) + if (ContainsFlag(G_UserConfig.MenuControl_WindowPositionsMenuLocation, MenuLocationWindowMenu)) { menuIndex := AddMenuItemSeparator(WindowMenuName, menuIndex) @@ -127,7 +127,7 @@ BuildWindowMenu() menuIndex := AddMenuItemWithIcon(WindowMenuName, "Send to Bac&k", "SendToBackHandler", IconLibraryFileName, GetIconLibraryIndex("POSITION_ZORDER_SENDTOBACK"), menuIndex) ; Desktop Icons - if (ContainsFlag(G_UserConfig.DesktopIconsMenuLocation, MenuLocationWindowMenu)) + if (ContainsFlag(G_UserConfig.MenuControl_DesktopIconsMenuLocation, MenuLocationWindowMenu)) { menuIndex := AddMenuItemSeparator(WindowMenuName, menuIndex) @@ -201,59 +201,59 @@ GetIconLibraryIndex(iconName) ;-------------------------------------------------------------------------------- OptimumSizeHandler: -SetWindowByGutter(G_ActiveWindow, (G_UserConfig.CascadeGutterSize * 1)) +SetWindowByGutter(G_ActiveWindow, (G_UserConfig.General_CascadeGutterSize * 1)) return SubOptimumSizeHandler: -SetWindowByGutter(G_ActiveWindow, (G_UserConfig.CascadeGutterSize * 2)) +SetWindowByGutter(G_ActiveWindow, (G_UserConfig.General_CascadeGutterSize * 2)) return MediumSizeHandler: -SetWindowByGutter(G_ActiveWindow, (G_UserConfig.CascadeGutterSize * 3)) +SetWindowByGutter(G_ActiveWindow, (G_UserConfig.General_CascadeGutterSize * 3)) return SmallSizeHandler: -SetWindowByGutter(G_ActiveWindow, (G_UserConfig.CascadeGutterSize * 4)) +SetWindowByGutter(G_ActiveWindow, (G_UserConfig.General_CascadeGutterSize * 4)) return TinySizeHandler: -SetWindowByGutter(G_ActiveWindow, (G_UserConfig.CascadeGutterSize * 5)) +SetWindowByGutter(G_ActiveWindow, (G_UserConfig.General_CascadeGutterSize * 5)) return ;-------------------------------------------------------------------------------- MoveColumnLeftHandler: -SetWindowByColumn(G_ActiveWindow, 1, 3, G_UserConfig.ColumnGutterSize) +SetWindowByColumn(G_ActiveWindow, 1, 3, G_UserConfig.General_ColumnGutterSize) return MoveColumnCentreHandler: -SetWindowByColumn(G_ActiveWindow, 2, 3, G_UserConfig.ColumnGutterSize) +SetWindowByColumn(G_ActiveWindow, 2, 3, G_UserConfig.General_ColumnGutterSize) return MoveColumnRightHandler: -SetWindowByColumn(G_ActiveWindow, 3, 3, G_UserConfig.ColumnGutterSize) +SetWindowByColumn(G_ActiveWindow, 3, 3, G_UserConfig.General_ColumnGutterSize) return ;-------------------------------------------------------------------------------- SpanCurrentMonitorHandler: monitor := new Monitor(G_ActiveWindow.MonitorIndex) monitorWorkArea := monitor.WorkArea -SetWindowSpanMonitors(G_ActiveWindow, monitorWorkArea.Left, monitorWorkArea.Top, monitorWorkArea.Right, monitorWorkArea.Bottom, G_UserConfig.SpanMonitorGutterSize) +SetWindowSpanMonitors(G_ActiveWindow, monitorWorkArea.Left, monitorWorkArea.Top, monitorWorkArea.Right, monitorWorkArea.Bottom, G_UserConfig.General_SpanMonitorGutterSize) return SpanMonitorWidthHandler: monitor := new Monitor(G_ActiveWindow.MonitorIndex) monitorWorkArea := monitor.WorkArea -SetWindowSpanMonitors(G_ActiveWindow, "", monitorWorkArea.Top, "", monitorWorkArea.Bottom, G_UserConfig.SpanMonitorGutterSize) +SetWindowSpanMonitors(G_ActiveWindow, "", monitorWorkArea.Top, "", monitorWorkArea.Bottom, G_UserConfig.General_SpanMonitorGutterSize) return SpanMonitorHeightHandler: monitor := new Monitor(G_ActiveWindow.MonitorIndex) monitorWorkArea := monitor.WorkArea -SetWindowSpanMonitors(G_ActiveWindow, monitorWorkArea.Left, "", monitorWorkArea.Right, "", G_UserConfig.SpanMonitorGutterSize) +SetWindowSpanMonitors(G_ActiveWindow, monitorWorkArea.Left, "", monitorWorkArea.Right, "", G_UserConfig.General_SpanMonitorGutterSize) return SpanAllMonitorsHandler: -SetWindowSpanMonitors(G_ActiveWindow, "", "", "", "", G_UserConfig.SpanMonitorGutterSize) +SetWindowSpanMonitors(G_ActiveWindow, "", "", "", "", G_UserConfig.General_SpanMonitorGutterSize) return ;-------------------------------------------------------------------------------- @@ -271,19 +271,19 @@ SetWindowToCentre(G_ActiveWindow) return MoveTopLeftHandler: -SetWindowByGrid(G_ActiveWindow, 1, 1, 2, 2, G_UserConfig.GridGutterSize) +SetWindowByGrid(G_ActiveWindow, 1, 1, 2, 2, G_UserConfig.General_GridGutterSize) return MoveTopRightHandler: -SetWindowByGrid(G_ActiveWindow, 1, 2, 2, 2, G_UserConfig.GridGutterSize) +SetWindowByGrid(G_ActiveWindow, 1, 2, 2, 2, G_UserConfig.General_GridGutterSize) return MoveBottomLeftHandler: -SetWindowByGrid(G_ActiveWindow, 2, 1, 2, 2, G_UserConfig.GridGutterSize) +SetWindowByGrid(G_ActiveWindow, 2, 1, 2, 2, G_UserConfig.General_GridGutterSize) return MoveBottomRightHandler: -SetWindowByGrid(G_ActiveWindow, 2, 2, 2, 2, G_UserConfig.GridGutterSize) +SetWindowByGrid(G_ActiveWindow, 2, 2, 2, 2, G_UserConfig.General_GridGutterSize) return ;-------------------------------------------------------------------------------- From 671845dbb67a2e008cb1e78d3e37630f5ff6613a Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Sun, 5 Jan 2020 22:29:18 +0000 Subject: [PATCH 4/7] Reworked Config Gui to be tabbed and use new config variables --- WindowExtensionsUserConfigGui.ahk | 272 +++++++++++++++++++++--------- 1 file changed, 193 insertions(+), 79 deletions(-) diff --git a/WindowExtensionsUserConfigGui.ahk b/WindowExtensionsUserConfigGui.ahk index 24e2c3f..68d482d 100644 --- a/WindowExtensionsUserConfigGui.ahk +++ b/WindowExtensionsUserConfigGui.ahk @@ -2,126 +2,240 @@ #Include Lib/ArrayUtils.ahk #Include WindowExtensionsUserConfig.ahk -cascadeGutterSize := 0 -columnGutterSize := 0 -gridGutterSize := 0 -spanMonitorGutterSize := 0 +;-------------------------------------------------------------------------------- +; Config Gui Values +general_cascadeGutterSize := 0 +general_columnGutterSize := 0 +general_gridGutterSize := 0 +general_spanMonitorGutterSize := 0 +startup_restoreWindowPositions := false +startup_restoreDesktopIcons := false +menuControl_windowPositionsMenuLocation := 0 +menuControl_desktopIconsMenuLocation := 0 +menuControl_desktopIconsMenuLocationChoice := 0 +menuControl_windowPositionsMenuLocationChoice := 0 +windowPositions_NumberOfFilesToKeep := 20 +windowPositions_IncludeOffScreenWindows := false +desktopIcons_NumberOfFilesToKeep := 20 -BuildUserConfigGui(windowExtensionsUserConfig) +;-------------------------------------------------------------------------------- +; LoadConfigGuiValues - Populate gui variables with values from User Config +LoadConfigGuiValues(userConfig) { - global cascadeGutterSize - global columnGutterSize - global gridGutterSize - global spanMonitorGutterSize - global restoreDesktopIconsOnStartup - global restoreWindowPositionsOnStartup - global desktopIconsMenuLocation - global windowPositionsMenuLocation - global windowPositionsIncludeOffScreenWindows + global general_cascadeGutterSize + global general_columnGutterSize + global general_gridGutterSize + global general_spanMonitorGutterSize + global startup_restoreWindowPositions + global startup_restoreDesktopIcons + global menuControl_windowPositionsMenuLocation + global menuControl_windowPositionsMenuLocationChoice + global menuControl_desktopIconsMenuLocation + global menuControl_desktopIconsMenuLocationChoice + global windowPositions_IncludeOffScreenWindows global MenuLocationValues global MenuLocationItems - cascadeGutterSize := windowExtensionsUserConfig.CascadeGutterSize - columnGutterSize := windowExtensionsUserConfig.ColumnGutterSize - gridGutterSize := windowExtensionsUserConfig.GridGutterSize - spanMonitorGutterSize := windowExtensionsUserConfig.SpanMonitorGutterSize - restoreDesktopIconsOnStartup := windowExtensionsUserConfig.RestoreDesktopIconsOnStartup ? 1 : 0 - restoreWindowPositionsOnStartup := windowExtensionsUserConfig.RestoreWindowPositionsOnStartup ? 1 : 0 - desktopIconsMenuLocation := windowExtensionsUserConfig.DesktopIconsMenuLocation - windowPositionsMenuLocation := windowExtensionsUserConfig.WindowPositionsMenuLocation - windowPositionsIncludeOffScreenWindows := windowExtensionsUserConfig.WindowPositions_IncludeOffScreenWindows ? 1 : 0 + if (!userConfig) + return + + general_cascadeGutterSize := userConfig.General_CascadeGutterSize + general_columnGutterSize := userConfig.General_ColumnGutterSize + general_gridGutterSize := userConfig.General_GridGutterSize + general_spanMonitorGutterSize := userConfig.General_SpanMonitorGutterSize + startup_restoreWindowPositions := userConfig.Startup_RestoreWindowPositions ? 1 : 0 + startup_restoreDesktopIcons := userConfig.Startup_RestoreDesktopIcons ? 1 : 0 + menuControl_windowPositionsMenuLocation := userConfig.MenuControl_WindowPositionsMenuLocation + menuControl_windowPositionsMenuLocationChoice := IndexOf(MenuLocationValues, menuControl_windowPositionsMenuLocation) + menuControl_desktopIconsMenuLocation := userConfig.MenuControl_DesktopIconsMenuLocation + menuControl_desktopIconsMenuLocationChoice := IndexOf(MenuLocationValues, menuControl_desktopIconsMenuLocation) + windowPositions_IncludeOffScreenWindows := userConfig.WindowPositions_IncludeOffScreenWindows ? 1 : 0 +} + +;-------------------------------------------------------------------------------- +; SaveConfigGuiValues +SaveConfigGuiValues(userConfig) +{ + global general_cascadeGutterSize + global general_columnGutterSize + global general_gridGutterSize + global general_spanMonitorGutterSize + global startup_restoreWindowPositions + global startup_restoreDesktopIcons + global menuControl_windowPositionsMenuLocation + global menuControl_windowPositionsMenuLocationChoice + global menuControl_desktopIconsMenuLocation + global menuControl_desktopIconsMenuLocationChoice + global windowPositions_IncludeOffScreenWindows - desktopIconsMenuLocationChoice := IndexOf(MenuLocationValues, desktopIconsMenuLocation) - windowPositionsMenuLocationChoice := IndexOf(MenuLocationValues, windowPositionsMenuLocation) + global MenuLocationValues + + if (!userConfig) + return + userConfig.General_CascadeGutterSize := general_cascadeGutterSize + userConfig.General_ColumnGutterSize := general_columnGutterSize + userConfig.General_GridGutterSize := general_gridGutterSize + userConfig.General_SpanMonitorGutterSize := general_spanMonitorGutterSize + userConfig.Startup_RestoreWindowPositions := startup_restoreWindowPositions + userConfig.Startup_RestoreDesktopIcons := startup_restoreDesktopIcons + userConfig.MenuControl_WindowPositionsMenuLocation := MenuLocationValues[menuControl_windowPositionsMenuLocation] + userConfig.MenuControl_DesktopIconsMenuLocation := MenuLocationValues[menuControl_desktopIconsMenuLocation] + userConfig.WindowPositions_IncludeOffScreenWindows := windowPositions_IncludeOffScreenWindows + + userConfig.Save() + + OnUserConfigUpdated() +} + +;-------------------------------------------------------------------------------- +; BuildConfigGui - Build the Config Gui +BuildConfigGui() +{ + global AppName + global MenuLocationItems + + global general_cascadeGutterSize + global general_columnGutterSize + global general_gridGutterSize + global general_spanMonitorGutterSize + global startup_restoreWindowPositions + global startup_restoreDesktopIcons + global menuControl_windowPositionsMenuLocation + global menuControl_windowPositionsMenuLocationChoice + global menuControl_desktopIconsMenuLocation + global menuControl_desktopIconsMenuLocationChoice + global windowPositions_IncludeOffScreenWindows + menuLocationItemsText := JoinItems("|", MenuLocationItems) - Gui, Config:New, -SysMenu - Gui, Config:Add, Text,, Cascade Gutter Size: - Gui, Config:Add, Text,, Column Gutter Size: - Gui, Config:Add, Text,, Grid Gutter Size: - Gui, Config:Add, Text,, Span Monitor Gutter Size: - Gui, Config:Add, Text,, Restore Desktop Icons on Startup: - Gui, Config:Add, Text,, Restore Window Positions on Startup: - Gui, Config:Add, Text,, Save / Restore Window Positions Menu Location: - Gui, Config:Add, Text,, Save / Restore Desktop Icons Menu Location: - Gui, Config:Add, Text,, Include Off-Screen Windows on Save / Restore: - Gui, Config:Add, Edit, ym w80 - Gui, Config:Add, UpDown, vcascadeGutterSize Range0-100, %cascadeGutterSize% - Gui, Config:Add, Edit, w80 - Gui, Config:Add, UpDown, vcolumnGutterSize Range0-100, %columnGutterSize% - Gui, Config:Add, Edit, w80 - Gui, Config:Add, UpDown, vgridGutterSize Range0-100, %gridGutterSize% - Gui, Config:Add, Edit, w80 - Gui, Config:Add, UpDown, vspanMonitorGutterSize Range0-100, %spanMonitorGutterSize% - Gui, Config:Add, Checkbox, vrestoreDesktopIconsOnStartup Checked%restoreDesktopIconsOnStartup% - Gui, Config:Add, Checkbox, vrestoreWindowPositionsOnStartup Checked%restoreWindowPositionsOnStartup%, `n - Gui, Config:Add, DropDownList, vwindowPositionsMenuLocation AltSubmit Choose%windowPositionsMenuLocationChoice%, %menuLocationItemsText% - Gui, Config:Add, DropDownList, vdesktopIconsMenuLocation AltSubmit Choose%desktopIconsMenuLocationChoice%, %menuLocationItemsText% - Gui, Config:Add, Checkbox, vwindowPositionsIncludeOffScreenWindows x257 y223 Checked%windowPositionsIncludeOffScreenWindows% - Gui, Config:Add, Button, default x245 y245 w80, OK ; The label ButtonOK (if it exists) will be run when the button is pressed. - Gui, Config:Add, Button, x330 y245 w80, Cancel ; The label ButtonCancel (if it exists) will be run when the button is pressed. + marginSize := 5 + col1 := 20 + col2 := 220 + tabHeight := 40 + rowHeight := 30 + textOffSet := 3 + + row1 := tabHeight + (rowHeight * 0) + row2 := tabHeight + (rowHeight * 1) + row3 := tabHeight + (rowHeight * 2) + row4 := tabHeight + (rowHeight * 3) + + row1t := row1 + textOffset + row2t := row2 + textOffset + row3t := row3 + textOffset + row4t := row4 + textOffset + + ; Start Gui + Gui, Config:New, -SysMenu, %AppName% Configuration + Gui, Config:Margin, %marginSize%, %marginSize% + ;Gui, Config:Add, Tab3, -Wrap w370 h230, General|Startup|Menu Control|Window Positions|Desktop Icons + Gui, Config:Add, Tab3, -Wrap w370 h230, General|Startup|Menu Control|Window Positions + + ; Tab 1 - General + Gui, Config:Tab, 1 + ; Row 1 + Gui, Config:Add, Text, x%col1% y%row1t%, C&ascade Gutter Size: + Gui, Config:Add, Edit, x%col2% y%row1% w80 x%col2% + Gui, Config:Add, UpDown, vgeneral_cascadeGutterSize Range0-100, %general_cascadeGutterSize% + ; Row 2 + Gui, Config:Add, Text, x%col1% y%row2t%, C&olumn Gutter Size: + Gui, Config:Add, Edit, w80 x%col2% y%row2% + Gui, Config:Add, UpDown, vgeneral_columnGutterSize Range0-100, %general_columnGutterSize% + ; Row 3 + Gui, Config:Add, Text, x%col1% y%row3t%, &Grid Gutter Size: + Gui, Config:Add, Edit, w80 x%col2% y%row3% + Gui, Config:Add, UpDown, vgeneral_gridGutterSize Range0-100, %general_gridGutterSize% + ; Row 4 + Gui, Config:Add, Text, x%col1% y%row4t%, Span &Monitor Gutter Size: + Gui, Config:Add, Edit, w80 x%col2% y%row4% + Gui, Config:Add, UpDown, vgeneral_spanMonitorGutterSize Range0-100, %general_spanMonitorGutterSize% + + ; Tab 2 - Startup + Gui, Config:Tab, 2 + ; Row 1 + Gui, Config:Add, Checkbox, x%col1% y%row1t% vstartup_restoreWindowPositions Checked%startup_restoreWindowPositions%, Restore Window &Positions on Startup + ; Row 2 + Gui, Config:Add, Checkbox, x%col1% y%row2t% vstartup_restoreDesktopIcons Checked%startup_restoreDesktopIcons%, Restore Desktop &Icons on Startup + + ; Tab 3 - Menu Control + Gui, Config:Tab, 3 + ; Row 1 + Gui, Config:Add, Text, x%col1% y%row1t%, Window &Positions Menu Location: + Gui, Config:Add, DropDownList, x%col2% y%row1% vmenuControl_windowPositionsMenuLocation AltSubmit Choose%menuControl_windowPositionsMenuLocationChoice%, %menuLocationItemsText% + ; Row 2 + Gui, Config:Add, Text, x%col1% y%row2t%, Desktop &Icons Menu Location: + Gui, Config:Add, DropDownList, x%col2% y%row2% vmenuControl_desktopIconsMenuLocation AltSubmit Choose%menuControl_desktopIconsMenuLocationChoice%, %menuLocationItemsText% + + ; Tab 4 - Window Positions + Gui, Config:Tab, 4 + ; Row 1 + ;Gui, Config:Add, Text, x%col1% y%row1t%, Number of saved files to &keep : + ;Gui, Config:Add, Edit, w80 x%col2% y%row1% + ;Gui, Config:Add, UpDown, vwindowPositions_NumberOfFilesToKeep Range0-100, %windowPositions_NumberOfFilesToKeep% + ; Row 2 + Gui, Config:Add, Checkbox, x%col1% y%row1t% vwindowPositions_IncludeOffScreenWindows Checked%windowPositions_IncludeOffScreenWindows%, Include Off-Screen Windows + + ; Tab 5 - Desktop Icons + ;Gui, Config:Tab, 5 + ; Row 1 + ;Gui, Config:Add, Text, x%col1% y%row1t%, Number of saved files to &keep : + ;Gui, Config:Add, Edit, w80 x%col2% y%row1% + ;Gui, Config:Add, UpDown, vdesktopIcons_NumberOfFilesToKeep Range0-100, %desktopIcons_NumberOfFilesToKeep% + + ; Button Bar + Gui, Config:Tab + Gui, Config:Add, Button, default x205 y240 w80, OK ; The label ButtonOK (if it exists) will be run when the button is pressed. + Gui, Config:Add, Button, x295 y240 w80, Cancel ; The label ButtonCancel (if it exists) will be run when the button is pressed. } -DestroyUserConfigGui() +;-------------------------------------------------------------------------------- +; DestroyConfigGui - Destroy the Config Gui +DestroyConfigGui() { Gui, Config:Destroy } -ShowUserConfigGui() +;-------------------------------------------------------------------------------- +; ShowUserConfigGui - Build, Populate and Show the Config Gui +ShowConfigGui() { global G_UserConfig - BuildUserConfigGui(G_UserConfig) + LoadConfigGuiValues(G_UserConfig) + + BuildConfigGui() - Gui, Config:Show,,%AppName% Configuration + Gui, Config:Show } ConfigGuiEscape: { - DestroyUserConfigGui() + DestroyConfigGui() return } ConfigGuiClose: { - DestroyUserConfigGui() + DestroyConfigGui() return } ConfigButtonCancel: { - DestroyUserConfigGui() + DestroyConfigGui() return } ConfigButtonOK: { - global cascadeGutterSize - global columnGutterSize - global gridGutterSize - global spanMonitorGutterSize - global restoreDesktopIconsOnStartup - global restoreWindowPositionsOnStartup - global MenuLocationValues - global windowPositionsIncludeOffScreenWindows + global G_UserConfig Gui, Config:Submit - G_UserConfig.CascadeGutterSize := cascadeGutterSize - G_UserConfig.ColumnGutterSize := columnGutterSize - G_UserConfig.GridGutterSize := gridGutterSize - G_UserConfig.SpanMonitorGutterSize := spanMonitorGutterSize - G_UserConfig.RestoreDesktopIconsOnStartup := restoreDesktopIconsOnStartup - G_UserConfig.RestoreWindowPositionsOnStartup := restoreWindowPositionsOnStartup - G_UserConfig.DesktopIconsMenuLocation := MenuLocationValues[desktopIconsMenuLocation] - G_UserConfig.WindowPositionsMenuLocation := MenuLocationValues[windowPositionsMenuLocation] - G_UserConfig.WindowPositions_IncludeOffScreenWindows := windowPositionsIncludeOffScreenWindows - G_UserConfig.Save() - - OnUserConfigUpdated() - - DestroyUserConfigGui() + SaveConfigGuiValues(G_UserConfig) + + DestroyConfigGui() return } From 4b849a687145a630cc08c492960b4f8ab1062458 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Sun, 5 Jan 2020 22:29:32 +0000 Subject: [PATCH 5/7] Version bump and release notes --- Docs/releasenotes.md | 5 +++++ Setup/WindowMenu_Setup.iss | 2 +- WindowExtensions.ahk | 6 ++++-- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Docs/releasenotes.md b/Docs/releasenotes.md index 14c40ed..ca94104 100644 --- a/Docs/releasenotes.md +++ b/Docs/releasenotes.md @@ -1,5 +1,10 @@ # Release Notes +## v1.6.2 - 2020-01-05 + +- Redesigned Configuration dialog to tabbed dialog +- Reformatted user options data file to have values in appropriate sections + ## v1.6.1 - 2020-01-04 - Fixed issue with Restore Window Positions which would position Windows Settings screen when it wasn't visible before diff --git a/Setup/WindowMenu_Setup.iss b/Setup/WindowMenu_Setup.iss index 7055823..1988916 100644 --- a/Setup/WindowMenu_Setup.iss +++ b/Setup/WindowMenu_Setup.iss @@ -1,6 +1,6 @@ #define AppName "WindowExtensions" #define AppTitle "Window Extensions" -#define AppVersion "1.6.1" +#define AppVersion "1.6.2" [Setup] AppName={#AppName} diff --git a/WindowExtensions.ahk b/WindowExtensions.ahk index 48e2222..513bd22 100644 --- a/WindowExtensions.ahk +++ b/WindowExtensions.ahk @@ -15,7 +15,7 @@ AppDescription := "Window Extensions Menu and HotKeys" AppCopyright := "Copyright © 2020 Martin Smith" AppNotes := "Concise and consistent control over Window Positions. Right-click right half of Window Caption bar to invoke, or hit WinKey-W" AppURL := "https://github.com/martinsmith1968/WindowExtensions" -AppVersion := "1.6.1.0" +AppVersion := "1.6.2.0" ;-------------------------------------------------------------------------------- ; Includes @@ -54,7 +54,7 @@ OnExit, ExitHandler ;-------------------------------------------------------------------------------- ; Auto-Execute section -OnInit() ; Perform module initialisation - not reliant on other modules +OnInit() ; Perform module initialisation - not reliant on other modules or globals InitGlobals() ; OnStartup() ; Perform module startup - may rely on other modules Init @@ -64,7 +64,9 @@ return ; End of script's auto-execute section. ;-------------------------------------------------------------------------------- ; Exit Handler ExitHandler: +LogText("Raising OnExit...") OnExit() +LogText("Exiting...") ; Must do this for the OnExit subroutine to actually Exit the script. ExitApp From 5914a021f64a30c57b657c40bc75e4602e5b86df Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Tue, 7 Jan 2020 01:06:33 +0000 Subject: [PATCH 6/7] Updated Configuration Dialog docs --- Docs/ConfigurationDialog.png | Bin 6132 -> 0 bytes Docs/ConfigurationDialog1.png | Bin 0 -> 8956 bytes Docs/ConfigurationDialog2.png | Bin 0 -> 5862 bytes Docs/ConfigurationDialog3.png | Bin 0 -> 6734 bytes Docs/ConfigurationDialog4.png | Bin 0 -> 4886 bytes README.md | 8 +++++++- 6 files changed, 7 insertions(+), 1 deletion(-) delete mode 100644 Docs/ConfigurationDialog.png create mode 100644 Docs/ConfigurationDialog1.png create mode 100644 Docs/ConfigurationDialog2.png create mode 100644 Docs/ConfigurationDialog3.png create mode 100644 Docs/ConfigurationDialog4.png diff --git a/Docs/ConfigurationDialog.png b/Docs/ConfigurationDialog.png deleted file mode 100644 index be67c7fdee04a6513c66965bf83f78df885415d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6132 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 diff --git a/Docs/ConfigurationDialog1.png b/Docs/ConfigurationDialog1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8759ee54380239aafccf6d7b593a5a3bc46cc7 GIT binary patch literal 8956 zcmeHt_gfR)+I0|=-a!N%v!fr_h-GOEF|pWaP>d_2p_4(uZlQyi5Yi|b*SOY8e_U0wuT-lyEs_vhj{z^OaLf8G;+g;kTTHfECyd1nN z-CH`7Y*Kozr$_63b-~HdvdO`CxaY%Q*mhESetu5MGiK7}7I9#(y1c=8{5lvOa6Tw6 zQFl_|xg2m6#CiM>Zn*IGht-0Zt?kCO?)j$U zc-1bMr_FX?wf(CnS}FV_V4ApZ;bq=;w66^JnjhCzhHim3_ove ztQzKR`-!v*Ce`&s5yQ_Wxv!4Do(nJkdb3pV{`{Mr#AS_S`RZb%+VSWHr|X-m%Z^|> z|MvSdCn=nj7e!HT?hp(~XwLtD1^6eQwPS;1dWcQtbsJ8HOng=mXI_msATq{h=!dQ1 zX9cInj`*Pa&z>U{Sk89m`&*eofn*O#i|Q-H369cT2?yuYcae+Sq zbB&IW6NDz*;06efysrj&__bD(_*njHi6mOyinWz9Z5cg`kdw$wD?+X-+E%*9aZnj)V;duRp*Hv*KUHAY1tl{jvumN%Mw?=kKuRm1eLmn z%YE`+M6l6(IM5Uj-P_0RQ`V_Xf2##it45NBp+v`zI5SjxP z?-2P-;MAE9mgDPMyKj>|s;wMJ6YO~${2cPptG4YtJTIqJQ>(u;Pzr)2qc!%m!XSI1 z576oz4_UGgK7EJSdk=tL5SHljv-ipA2j>RUA0{5Os-H(&nUT{;J!<3J>>_huO^yA| zOU?59{d5JL78AdImUf4JTeCxG(n)sN8?f_BY}etP;cumzdXGP8`3nj~i>8*#yDi^T zc<-ja<3(QI61>N{Az$S~f2Y_a77S_eKDKP(x^yP%_BFj!1g!@aLmlQD=%0A0ackuB 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 literal 0 HcmV?d00001 diff --git a/Docs/ConfigurationDialog2.png b/Docs/ConfigurationDialog2.png new file mode 100644 index 0000000000000000000000000000000000000000..74dbcde46dcb703ab6c9153a56e601f81f4781f6 GIT binary patch literal 5862 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 S8%O&@039tu&BA+6-~Jb3ROFEW literal 0 HcmV?d00001 diff --git a/Docs/ConfigurationDialog4.png b/Docs/ConfigurationDialog4.png new file mode 100644 index 0000000000000000000000000000000000000000..6585a9f9b984f8957a3f20e083025d80368fcbaa GIT binary patch literal 4886 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index a12e9bf..8f0f959 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,13 @@ Selecting any of the entries applies to the target window, shown at the top of t A Configuration dialog, available from the tray icon, allows controlling some aspects of the functionality. -![Configuration Dialog](Docs/ConfigurationDialog.png) +![Configuration Dialog Tab 1](Docs/ConfigurationDialog1.png) + +![Configuration Dialog Tab 2](Docs/ConfigurationDialog2.png) + +![Configuration Dialog Tab 3](Docs/ConfigurationDialog3.png) + +![Configuration Dialog Tab 4](Docs/ConfigurationDialog4.png) ## Features From 3f926fb32bed5e730449412af1aa6c7e068cbfe5 Mon Sep 17 00:00:00 2001 From: Martin Smith Date: Tue, 7 Jan 2020 01:08:03 +0000 Subject: [PATCH 7/7] Doc update to remove ToDo item completed --- Docs/todo.md | 1 - 1 file changed, 1 deletion(-) diff --git a/Docs/todo.md b/Docs/todo.md index f7b6ba2..99fc2fb 100644 --- a/Docs/todo.md +++ b/Docs/todo.md @@ -3,7 +3,6 @@ - History list of Saved Window Positions - History list of Saved Desktop Icon Positions - Add icons to other context menu items -- Convert Configuration dialog to use Tabbed controls - Auto-Save Window Positions on a schedule - Auto-Save Desktop Icons on a schedule