瀏覽代碼

Merge pull request #1626 from IvanSavenko/setting_ux_improvements

New settings window ux improvements
Ivan Savenko 2 年之前
父節點
當前提交
ddb7bcaf42
共有 78 個文件被更改,包括 1054 次插入602 次删除
  1. 二進制
      Mods/vcmi/Data/settingsWindow/checkBoxEmpty.png
  2. 二進制
      Mods/vcmi/Data/settingsWindow/frameAudio.png
  3. 二進制
      Mods/vcmi/Data/settingsWindow/frameMovement.png
  4. 二進制
      Mods/vcmi/Data/settingsWindow/frameStackQueue.png
  5. 二進制
      Mods/vcmi/Data/settingsWindow/gear.png
  6. 二進制
      Mods/vcmi/Data/settingsWindow/lineHorizontal.png
  7. 二進制
      Mods/vcmi/Data/settingsWindow/lineVertical.png
  8. 二進制
      Mods/vcmi/Data/settingsWindow/scrollSpeed1.png
  9. 二進制
      Mods/vcmi/Data/settingsWindow/scrollSpeed2.png
  10. 二進制
      Mods/vcmi/Data/settingsWindow/scrollSpeed3.png
  11. 二進制
      Mods/vcmi/Data/settingsWindow/scrollSpeed4.png
  12. 二進制
      Mods/vcmi/Data/settingsWindow/scrollSpeed5.png
  13. 二進制
      Mods/vcmi/Data/settingsWindow/scrollSpeed6.png
  14. 二進制
      Mods/vcmi/Data/vcmiSettingsWindow.png
  15. 二進制
      Mods/vcmi/Sprites/buttons/quadwide-normal-selected.png
  16. 二進制
      Mods/vcmi/Sprites/buttons/quadwide-normal.png
  17. 二進制
      Mods/vcmi/Sprites/buttons/quadwide-pressed-selected.png
  18. 二進制
      Mods/vcmi/Sprites/buttons/quadwide-pressed.png
  19. 0 10
      Mods/vcmi/Sprites/buttons/quadwide.json
  20. 0 8
      Mods/vcmi/Sprites/buttons/resolution.json
  21. 二進制
      Mods/vcmi/Sprites/buttons/resolutionNormal.png
  22. 二進制
      Mods/vcmi/Sprites/buttons/resolutionPressed.png
  23. 二進制
      Mods/vcmi/Sprites/buttons/square-normal-selected.png
  24. 二進制
      Mods/vcmi/Sprites/buttons/square-normal.png
  25. 二進制
      Mods/vcmi/Sprites/buttons/square-pressed-selected.png
  26. 二進制
      Mods/vcmi/Sprites/buttons/square-pressed.png
  27. 0 10
      Mods/vcmi/Sprites/buttons/square.json
  28. 二進制
      Mods/vcmi/Sprites/buttons/triplewide-normal-selected.png
  29. 二進制
      Mods/vcmi/Sprites/buttons/triplewide-normal.png
  30. 二進制
      Mods/vcmi/Sprites/buttons/triplewide-pressed-selected.png
  31. 二進制
      Mods/vcmi/Sprites/buttons/triplewide-pressed.png
  32. 0 10
      Mods/vcmi/Sprites/buttons/triplewide.json
  33. 10 0
      Mods/vcmi/Sprites/settingsWindow/button190.json
  34. 二進制
      Mods/vcmi/Sprites/settingsWindow/button190Normal.png
  35. 二進制
      Mods/vcmi/Sprites/settingsWindow/button190NormalSelected.png
  36. 二進制
      Mods/vcmi/Sprites/settingsWindow/button190Pressed.png
  37. 二進制
      Mods/vcmi/Sprites/settingsWindow/button190PressedSelected.png
  38. 10 0
      Mods/vcmi/Sprites/settingsWindow/button32.json
  39. 二進制
      Mods/vcmi/Sprites/settingsWindow/button32Normal.png
  40. 二進制
      Mods/vcmi/Sprites/settingsWindow/button32NormalSelected.png
  41. 二進制
      Mods/vcmi/Sprites/settingsWindow/button32Pressed.png
  42. 二進制
      Mods/vcmi/Sprites/settingsWindow/button32PressedSelected.png
  43. 10 0
      Mods/vcmi/Sprites/settingsWindow/button46.json
  44. 二進制
      Mods/vcmi/Sprites/settingsWindow/button46Normal.png
  45. 二進制
      Mods/vcmi/Sprites/settingsWindow/button46NormalSelected.png
  46. 二進制
      Mods/vcmi/Sprites/settingsWindow/button46Pressed.png
  47. 二進制
      Mods/vcmi/Sprites/settingsWindow/button46PressedSelected.png
  48. 10 0
      Mods/vcmi/Sprites/settingsWindow/button80.json
  49. 二進制
      Mods/vcmi/Sprites/settingsWindow/button80Normal.png
  50. 二進制
      Mods/vcmi/Sprites/settingsWindow/button80NormalSelected.png
  51. 二進制
      Mods/vcmi/Sprites/settingsWindow/button80Pressed.png
  52. 二進制
      Mods/vcmi/Sprites/settingsWindow/button80PressedSelected.png
  53. 45 36
      Mods/vcmi/config/vcmi/english.json
  54. 63 7
      Mods/vcmi/config/vcmi/ukrainian.json
  55. 2 1
      client/CMT.cpp
  56. 0 1
      client/CPlayerInterface.h
  57. 1 2
      client/battle/BattleInterface.cpp
  58. 0 1
      client/battle/BattleInterfaceClasses.h
  59. 17 17
      client/battle/BattleWindow.cpp
  60. 1 1
      client/battle/BattleWindow.h
  61. 21 19
      client/gui/CGuiHandler.cpp
  62. 8 5
      client/gui/CGuiHandler.h
  63. 12 8
      client/mapView/MapViewActions.cpp
  64. 1 1
      client/mapView/MapViewActions.h
  65. 1 2
      client/widgets/Buttons.cpp
  66. 2 2
      client/windows/CCastleInterface.cpp
  67. 0 1
      client/windows/GUIClasses.h
  68. 54 5
      client/windows/settings/AdventureOptionsTab.cpp
  69. 24 10
      client/windows/settings/BattleOptionsTab.cpp
  70. 4 4
      client/windows/settings/BattleOptionsTab.h
  71. 30 18
      client/windows/settings/GeneralOptionsTab.cpp
  72. 22 15
      client/windows/settings/SettingsMainWindow.cpp
  73. 2 0
      client/windows/settings/SettingsMainWindow.h
  74. 21 6
      config/schemas/settings.json
  75. 237 100
      config/widgets/settings/adventureOptionsTab.json
  76. 248 180
      config/widgets/settings/battleOptionsTab.json
  77. 164 82
      config/widgets/settings/generalOptionsTab.json
  78. 34 40
      config/widgets/settings/settingsMainContainer.json

二進制
Mods/vcmi/Data/settingsWindow/checkBoxEmpty.png


二進制
Mods/vcmi/Data/settingsWindow/frameAudio.png


二進制
Mods/vcmi/Data/settingsWindow/frameMovement.png


二進制
Mods/vcmi/Data/settingsWindow/frameStackQueue.png


二進制
Mods/vcmi/Data/settingsWindow/gear.png


二進制
Mods/vcmi/Data/settingsWindow/lineHorizontal.png


二進制
Mods/vcmi/Data/settingsWindow/lineVertical.png


二進制
Mods/vcmi/Data/settingsWindow/scrollSpeed1.png


二進制
Mods/vcmi/Data/settingsWindow/scrollSpeed2.png


二進制
Mods/vcmi/Data/settingsWindow/scrollSpeed3.png


二進制
Mods/vcmi/Data/settingsWindow/scrollSpeed4.png


二進制
Mods/vcmi/Data/settingsWindow/scrollSpeed5.png


二進制
Mods/vcmi/Data/settingsWindow/scrollSpeed6.png


二進制
Mods/vcmi/Data/vcmiSettingsWindow.png


二進制
Mods/vcmi/Sprites/buttons/quadwide-normal-selected.png


二進制
Mods/vcmi/Sprites/buttons/quadwide-normal.png


二進制
Mods/vcmi/Sprites/buttons/quadwide-pressed-selected.png


二進制
Mods/vcmi/Sprites/buttons/quadwide-pressed.png


+ 0 - 10
Mods/vcmi/Sprites/buttons/quadwide.json

@@ -1,10 +0,0 @@
-{
-	"basepath" : "buttons/",
-	"images" :
-	[
-		{ "frame" : 0, "file" : "quadwide-normal.png"},
-		{ "frame" : 1, "file" : "quadwide-pressed-selected.png"},
-		{ "frame" : 2, "file" : "quadwide-pressed.png"},
-		{ "frame" : 3, "file" : "quadwide-normal-selected.png"},
-	]
-}

+ 0 - 8
Mods/vcmi/Sprites/buttons/resolution.json

@@ -1,8 +0,0 @@
-{
-	"basepath" : "buttons/",
-	"images" :
-	[
-		{ "frame" : 0, "file" : "resolutionNormal.png"},
-		{ "frame" : 1, "file" : "resolutionPressed.png"}
-	]
-}

二進制
Mods/vcmi/Sprites/buttons/resolutionNormal.png


二進制
Mods/vcmi/Sprites/buttons/resolutionPressed.png


二進制
Mods/vcmi/Sprites/buttons/square-normal-selected.png


二進制
Mods/vcmi/Sprites/buttons/square-normal.png


二進制
Mods/vcmi/Sprites/buttons/square-pressed-selected.png


二進制
Mods/vcmi/Sprites/buttons/square-pressed.png


+ 0 - 10
Mods/vcmi/Sprites/buttons/square.json

@@ -1,10 +0,0 @@
-{
-	"basepath" : "buttons/",
-	"images" :
-	[
-		{ "frame" : 0, "file" : "square-normal.png"},
-		{ "frame" : 1, "file" : "square-pressed-selected.png"},
-		{ "frame" : 2, "file" : "square-pressed.png"},
-		{ "frame" : 3, "file" : "square-normal-selected.png"}
-	]
-}

二進制
Mods/vcmi/Sprites/buttons/triplewide-normal-selected.png


二進制
Mods/vcmi/Sprites/buttons/triplewide-normal.png


二進制
Mods/vcmi/Sprites/buttons/triplewide-pressed-selected.png


二進制
Mods/vcmi/Sprites/buttons/triplewide-pressed.png


+ 0 - 10
Mods/vcmi/Sprites/buttons/triplewide.json

@@ -1,10 +0,0 @@
-{
-	"basepath" : "buttons/",
-	"images" :
-	[
-		{ "frame" : 0, "file" : "triplewide-normal.png"},
-		{ "frame" : 1, "file" : "triplewide-pressed-selected.png"},
-		{ "frame" : 2, "file" : "triplewide-pressed.png"},
-		{ "frame" : 3, "file" : "triplewide-normal-selected.png"}
-	]
-}

+ 10 - 0
Mods/vcmi/Sprites/settingsWindow/button190.json

@@ -0,0 +1,10 @@
+{
+	"basepath" : "settingsWindow/",
+	"images" :
+	[
+		{ "frame" : 0, "file" : "button190Normal.png"},
+		{ "frame" : 1, "file" : "button190PressedSelected.png"},
+		{ "frame" : 2, "file" : "button190Pressed.png"},
+		{ "frame" : 3, "file" : "button190NormalSelected.png"}
+	]
+}

二進制
Mods/vcmi/Sprites/settingsWindow/button190Normal.png


二進制
Mods/vcmi/Sprites/settingsWindow/button190NormalSelected.png


二進制
Mods/vcmi/Sprites/settingsWindow/button190Pressed.png


二進制
Mods/vcmi/Sprites/settingsWindow/button190PressedSelected.png


+ 10 - 0
Mods/vcmi/Sprites/settingsWindow/button32.json

@@ -0,0 +1,10 @@
+{
+	"basepath" : "settingsWindow/",
+	"images" :
+	[
+		{ "frame" : 0, "file" : "button32Normal.png"},
+		{ "frame" : 1, "file" : "button32PressedSelected.png"},
+		{ "frame" : 2, "file" : "button32Pressed.png"},
+		{ "frame" : 3, "file" : "button32NormalSelected.png"}
+	]
+}

二進制
Mods/vcmi/Sprites/settingsWindow/button32Normal.png


二進制
Mods/vcmi/Sprites/settingsWindow/button32NormalSelected.png


二進制
Mods/vcmi/Sprites/settingsWindow/button32Pressed.png


二進制
Mods/vcmi/Sprites/settingsWindow/button32PressedSelected.png


+ 10 - 0
Mods/vcmi/Sprites/settingsWindow/button46.json

@@ -0,0 +1,10 @@
+{
+	"basepath" : "settingsWindow/",
+	"images" :
+	[
+		{ "frame" : 0, "file" : "button46Normal.png"},
+		{ "frame" : 1, "file" : "button46PressedSelected.png"},
+		{ "frame" : 2, "file" : "button46Pressed.png"},
+		{ "frame" : 3, "file" : "button46NormalSelected.png"}
+	]
+}

二進制
Mods/vcmi/Sprites/settingsWindow/button46Normal.png


二進制
Mods/vcmi/Sprites/settingsWindow/button46NormalSelected.png


二進制
Mods/vcmi/Sprites/settingsWindow/button46Pressed.png


二進制
Mods/vcmi/Sprites/settingsWindow/button46PressedSelected.png


+ 10 - 0
Mods/vcmi/Sprites/settingsWindow/button80.json

@@ -0,0 +1,10 @@
+{
+	"basepath" : "settingsWindow/",
+	"images" :
+	[
+		{ "frame" : 0, "file" : "button80Normal.png"},
+		{ "frame" : 1, "file" : "button80PressedSelected.png"},
+		{ "frame" : 2, "file" : "button80Pressed.png"},
+		{ "frame" : 3, "file" : "button80NormalSelected.png"}
+	]
+}

二進制
Mods/vcmi/Sprites/settingsWindow/button80Normal.png


二進制
Mods/vcmi/Sprites/settingsWindow/button80NormalSelected.png


二進制
Mods/vcmi/Sprites/settingsWindow/button80Pressed.png


二進制
Mods/vcmi/Sprites/settingsWindow/button80PressedSelected.png


+ 45 - 36
Mods/vcmi/config/vcmi/english.json

@@ -26,57 +26,66 @@
 	"vcmi.server.confirmReconnect"           : "Connect to the last session?",
 
 	"vcmi.settingsMainWindow.generalTab.hover" : "General",
-	"vcmi.settingsMainWindow.generalTab.help"     : "Switches to System Options tab - these settings are related to general game client behavior",
+	"vcmi.settingsMainWindow.generalTab.help"     : "Switches to General Options tab, which contains settings related to general game client behavior",
 	"vcmi.settingsMainWindow.battleTab.hover" : "Battle",
-	"vcmi.settingsMainWindow.battleTab.help"     : "Switches to Battle Options tab - these settings allow configuring battle interface and related things",
+	"vcmi.settingsMainWindow.battleTab.help"     : "Switches to Battle Options tab, which allows configuring game behavior during battles",
 	"vcmi.settingsMainWindow.adventureTab.hover" : "Adventure Map",
 	"vcmi.settingsMainWindow.adventureTab.help"  : "Switches to Adventure Map Options tab - adventure map is part of the game where you can move your heroes",
-	"vcmi.settingsMainWindow.otherTab.hover"     : "Other Settings",
-	"vcmi.settingsMainWindow.otherTab.help"      : "Switches to Other Settings tab - these options do not fit into other categories for various reasons",
+
+	"vcmi.systemOptions.videoGroup" : "Video Settings",
+	"vcmi.systemOptions.audioGroup" : "Audio Settings",
+	"vcmi.systemOptions.otherGroup" : "Other Settings", // unused right now
+	"vcmi.systemOptions.townsGroup" : "Town Screen",
 
 	"vcmi.systemOptions.fullscreenButton.hover" : "Fullscreen",
 	"vcmi.systemOptions.fullscreenButton.help"  : "{Fullscreen}\n\n If selected, VCMI will run in fullscreen mode, otherwise VCMI will run in window",
-	"vcmi.systemOptions.resolutionButton.hover" : "Resolution",
-	"vcmi.systemOptions.resolutionButton.help"  : "{Select resolution}\n\n Change in-game screen resolution. Game restart required to apply new resolution.",
-	"vcmi.systemOptions.resolutionMenu.hover"   : "Select resolution",
+	"vcmi.systemOptions.resolutionButton.hover" : "Resolution: %wx%h",
+	"vcmi.systemOptions.resolutionButton.help"  : "{Select Resolution}\n\n Change in-game screen resolution. Game restart required to apply new resolution.",
+	"vcmi.systemOptions.resolutionMenu.hover"   : "Select Resolution",
 	"vcmi.systemOptions.resolutionMenu.help"    : "Change in-game screen resolution.",
 	"vcmi.systemOptions.fullscreenFailed"       : "{Fullscreen}\n\n Failed to switch to fullscreen mode! Current resolution is not supported by display!",
 	"vcmi.systemOptions.framerateButton.hover"  : "Show FPS",
-	"vcmi.systemOptions.framerateButton.help"   : "{Show FPS}\n\n Toggle on/off showing Frames Per Second counter in corner of game window.",
+	"vcmi.systemOptions.framerateButton.help"   : "{Show FPS}\n\n Toggles visibility of Frames Per Second counter in corner of game window.",
 
-	"vcmi.adventureOptions.numericQuantities.hover" : "Numeric creatures quantities",
-	"vcmi.adventureOptions.numericQuantities.help" : "{Numeric creatures quantities}\n\n Shows inaccurate enemy creatures quantities in numeric A-B format.",
-	"vcmi.adventureOptions.forceMovementInfo.hover" : "Always show move info in status bar",
-	"vcmi.adventureOptions.forceMovementInfo.help" : "{Always show move info in status bar}\n\n Replaces default status bar info with movement points data without need to hold ALT button.",
-	"vcmi.adventureOptions.showGrid.hover" : "Show grid",
-	"vcmi.adventureOptions.showGrid.help" : "{Show grid}\n\n Shows grid overlay, showing borders between adventure map tiles.",
-	"vcmi.adventureOptions.mapScrollSpeed4.hover": "4",
-	"vcmi.adventureOptions.mapScrollSpeed4.help": "Set map scrolling speed to very fast",
-	"vcmi.adventureOptions.mapScrollSpeed5.hover": "5",
-	"vcmi.adventureOptions.mapScrollSpeed5.help": "Set map scrolling speed to extremely fast",
+	"vcmi.adventureOptions.numericQuantities.hover" : "Numeric Creature Quantities",
+	"vcmi.adventureOptions.numericQuantities.help" : "{Numeric Creature Quantities}\n\n Shows approximate enemy creatures quantities in numeric A-B format.",
+	"vcmi.adventureOptions.forceMovementInfo.hover" : "Always Show Movement Cost",
+	"vcmi.adventureOptions.forceMovementInfo.help" : "{Always Show Movement Cost}\n\n Replaces default status bar info with movement points data without need to hold ALT button.",
+	"vcmi.adventureOptions.showGrid.hover" : "Show Grid",
+	"vcmi.adventureOptions.showGrid.help" : "{Show Grid}\n\n Shows grid overlay, showing borders between adventure map tiles.",
+	"vcmi.adventureOptions.mapSwipe.hover" : "Map Swipe",
+	"vcmi.adventureOptions.mapSwipe.help" : "{Map Swipe}\n\n Allows map movement via finger swipe gesture on systems with touchscreen. As of right now, can also be accessed via left mouse button.",
+	"vcmi.adventureOptions.mapScrollSpeed1.hover": "",
+	"vcmi.adventureOptions.mapScrollSpeed5.hover": "",
+	"vcmi.adventureOptions.mapScrollSpeed6.hover": "",
+	"vcmi.adventureOptions.mapScrollSpeed1.help": "Set map scrolling speed to very slow",
+	"vcmi.adventureOptions.mapScrollSpeed5.help": "Set map scrolling speed to very fast",
+	"vcmi.adventureOptions.mapScrollSpeed6.help": "Set map scrolling speed to instantaneous.",
 
-	"vcmi.battleOptions.showQueue.hover": "Show queue",
-	"vcmi.battleOptions.showQueue.help": "{Show queue}\n\n Show queue that displays movement order of creature stacks.",
-	"vcmi.battleOptions.queueSizeLabel.hover": "Queue size (takes effect on next battle)",
+	"vcmi.battleOptions.queueSizeLabel.hover": "Show Creature Turn Order",
+	"vcmi.battleOptions.queueSizeNoneButton.hover": "OFF",
 	"vcmi.battleOptions.queueSizeAutoButton.hover": "AUTO",
-	"vcmi.battleOptions.queueSizeAutoButton.help": "Sets queue size depending on game resolution (small if width < 700 pixels, big otherwise)",
 	"vcmi.battleOptions.queueSizeSmallButton.hover": "SMALL",
-	"vcmi.battleOptions.queueSizeSmallButton.help": "Sets queue size to small",
 	"vcmi.battleOptions.queueSizeBigButton.hover": "BIG",
-	"vcmi.battleOptions.queueSizeBigButton.help": "Sets queue size to big (not supported if game resolution width < 700 pixels)",
-	"vcmi.battleOptions.animationsSpeed4.hover": "4",
-	"vcmi.battleOptions.animationsSpeed4.help": "Sets animation speed to very fast",
-	"vcmi.battleOptions.animationsSpeed5.hover": "5",
-	"vcmi.battleOptions.animationsSpeed5.help": "Sets animation speed to super fast",
-	"vcmi.battleOptions.animationsSpeed6.hover": "6",
-	"vcmi.battleOptions.animationsSpeed6.help": "Sets animation speed to extremely fast",
-	"vcmi.battleOptions.skipBattleIntroMusic.hover": "Skip intro music",
-	"vcmi.battleOptions.skipBattleIntroMusic.help": "{Skip intro music}\n\n Skip short music that plays at beginning of each battle before action starts. Can also be skipped by pressing ESC key.",
+	"vcmi.battleOptions.queueSizeNoneButton.help": "Completely disables visibility of creature turn order in battle",
+	"vcmi.battleOptions.queueSizeAutoButton.help": "Sets turn order size depending on game resolution (small when playing with screen resolution below 700 pixels high, big otherwise)",
+	"vcmi.battleOptions.queueSizeSmallButton.help": "Sets turn order size to small",
+	"vcmi.battleOptions.queueSizeBigButton.help": "Sets turn order size to big (not supported if game resolution is less than 700 pixels high)",
+	"vcmi.battleOptions.animationsSpeed1.hover": "",
+	"vcmi.battleOptions.animationsSpeed5.hover": "",
+	"vcmi.battleOptions.animationsSpeed6.hover": "",
+	"vcmi.battleOptions.animationsSpeed1.help": "Sets animation speed to very slow",
+	"vcmi.battleOptions.animationsSpeed5.help": "Sets animation speed to very fast",
+	"vcmi.battleOptions.animationsSpeed6.help": "Sets animation speed to instantaneous",
+	"vcmi.battleOptions.skipBattleIntroMusic.hover": "Skip Intro Music",
+	"vcmi.battleOptions.skipBattleIntroMusic.help": "{Skip Intro Music}\n\n Skip short music that plays at beginning of each battle before action starts. Can also be skipped by pressing ESC key.",
 
-	"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Show available creatures in town summary",
-	"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Show available creatures in town summary}\n\n Shows creatures available to purchase instead of their growth in town summary (bottom-left corner).",
-	"vcmi.otherOptions.compactTownCreatureInfo.hover": "Compact creature info in town summary",
-	"vcmi.otherOptions.compactTownCreatureInfo.help": "{Compact creature info in town summary}\n\n Smaller town creatures information in town summary.",
+	"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Show Available Creatures",
+	"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Show Available Creatures}\n\n Shows creatures available to purchase instead of their growth in town summary (bottom-left corner).",
+	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Show Weekly Growth of Creatures",
+	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.help" : "{Show Weekly Growth of Creatures}\n\n Shows creatures' weekly growth instead of avaialable amount in town summary (bottom-left corner).",
+	"vcmi.otherOptions.compactTownCreatureInfo.hover": "Compact Creature Info",
+	"vcmi.otherOptions.compactTownCreatureInfo.help": "{Compact Creature Info}\n\n Smaller town creatures information in town summary.",
 
 	"vcmi.townHall.missingBase"             : "Base building %s must be built first",
 	"vcmi.townHall.noCreaturesToRecruit"    : "There are no creatures to recruit!",

+ 63 - 7
Mods/vcmi/config/vcmi/ukrainian.json

@@ -26,13 +26,69 @@
 	"vcmi.server.errors.modsIncompatibility" : "Потрібні модифікації для завантаження гри:",
 	"vcmi.server.confirmReconnect"           : "Підключитися до минулої сесії?",
 
-	"vcmi.systemOptions.fullscreenButton.hover" : "Режим на весь екран",
-	"vcmi.systemOptions.fullscreenButton.help"  : "{Режим на весь екран}\n\n Якщо обрано, VCMI буде запускатися в режимі на весь екран, інакше — віконний режим",
-	"vcmi.systemOptions.resolutionButton.hover" : "Розширення екрану",
-	"vcmi.systemOptions.resolutionButton.help"  : "{Розширення екрану}\n\n Зміна розширення екрану в грі. Аби зміни набули чинності необхідно перезавантажити гру.",
-	"vcmi.systemOptions.resolutionMenu.hover"   : "Обрати розширення екрану",
-	"vcmi.systemOptions.resolutionMenu.help"    : "Змінити розширення екрану в грі.",
-	
+	"vcmi.settingsMainWindow.generalTab.hover" : "Загальні",
+	"vcmi.settingsMainWindow.generalTab.help"     : "Перемикає на вкладку загальних параметрів, яка містить налаштування, пов'язані із загальною поведінкою ігрового клієнта",
+	"vcmi.settingsMainWindow.battleTab.hover" : "Бої",
+	"vcmi.settingsMainWindow.battleTab.help"     : "Перемикає на вкладку параметрів бою, яка дозволяє налаштувати поведінку гри під час бою",
+	"vcmi.settingsMainWindow.adventureTab.hover" : "Мапа Пригод",
+	"vcmi.settingsMainWindow.adventureTab.help"  : "Перемикає на вкладку параметрів мапи пригод - мапа пригод є частиною гри, де ви можете переміщати своїх героїв",
+
+	"vcmi.systemOptions.videoGroup" : "Налаштування відео",
+	"vcmi.systemOptions.audioGroup" : "Налаштування аудіо",
+	"vcmi.systemOptions.otherGroup" : "Інші налаштування",
+	"vcmi.systemOptions.townsGroup" : "Екран міста",
+
+	"vcmi.systemOptions.fullscreenButton.hover" : "Повноекранний режим",
+	"vcmi.systemOptions.fullscreenButton.help"  : "{Повноекранний режим}\n\n Якщо обрано, VCMI буде запускатися в режимі на весь екран, інакше — віконний режим",
+	"vcmi.systemOptions.resolutionButton.hover" : "Роздільна здатність: %wx%h",
+	"vcmi.systemOptions.resolutionButton.help"  : "{Роздільна здатність}\n\n Зміна розширення екрану в грі. Аби зміни набули чинності необхідно перезавантажити гру.",
+	"vcmi.systemOptions.resolutionMenu.hover"   : "Обрати роздільну здатність екрану",
+	"vcmi.systemOptions.resolutionMenu.help"    : "Змінити роздільну здатність екрану в грі.",
+	"vcmi.systemOptions.fullscreenFailed"       : "{Повноекранний режим}\n\n Не вдалося перейти в повноекранний режим! Поточна роздільна здатність не підтримується дисплеєм!",
+	"vcmi.systemOptions.framerateButton.hover"  : "Лічильник кадрів",
+	"vcmi.systemOptions.framerateButton.help"   : "{Лічильник кадрів}\n\n Перемикає видимість лічильника кадрів на секунду у кутку ігрового вікна",
+
+	"vcmi.adventureOptions.numericQuantities.hover" : "Числовий показник кількості",
+	"vcmi.adventureOptions.numericQuantities.help" : "{Числовий показник кількості}\n\n Показує приблизну кількість ворожих істот у числовому форматі А-Б.",
+	"vcmi.adventureOptions.forceMovementInfo.hover" : "Завжди показувати вартість руху",
+	"vcmi.adventureOptions.forceMovementInfo.help" : "{Завжди показувати вартість руху}\n\n Замінює стандартну інформацію в рядку стану на вартість переміщення без необхідності утримувати клавішу ALT.",
+	"vcmi.adventureOptions.showGrid.hover" : "Показувати сітку",
+	"vcmi.adventureOptions.showGrid.help" : "{Показувати сітку}\n\n Відображає сітку, що показує межі між клітинками на мапі пригод.",
+	"vcmi.adventureOptions.mapSwipe.hover" : "Прокрутка мапи жестом",
+	"vcmi.adventureOptions.mapSwipe.help" : "{Прокрутка мапи жестом}\n\n Дозволяє переміщати мапу пальцем на системах з сенсорним екраном. Станом на зараз, також доступний за допомогою лівої кнопки миші.",
+	"vcmi.adventureOptions.mapScrollSpeed1.hover": "",
+	"vcmi.adventureOptions.mapScrollSpeed5.hover": "",
+	"vcmi.adventureOptions.mapScrollSpeed6.hover": "",
+	"vcmi.adventureOptions.mapScrollSpeed1.help": "Встановити швидкість розгортання мапи - дуже повільно",
+	"vcmi.adventureOptions.mapScrollSpeed5.help": "Встановити швидкість розгортання мапи - дуже швидко",
+	"vcmi.adventureOptions.mapScrollSpeed6.help": "Встановити швидкість розгортання мапи - миттєво",
+
+	"vcmi.battleOptions.queueSizeLabel.hover": "Вигляд черги ходу істот",
+	"vcmi.battleOptions.queueSizeNoneButton.hover": "ВИМК",
+	"vcmi.battleOptions.queueSizeAutoButton.hover": "АВТО",
+	"vcmi.battleOptions.queueSizeSmallButton.hover": "МАЛА",
+	"vcmi.battleOptions.queueSizeBigButton.hover": "ВЕЛИКА",
+	"vcmi.battleOptions.queueSizeNoneButton.help": "Повністю вимикає видимість черги ходу істот у бою",
+	"vcmi.battleOptions.queueSizeAutoButton.help": "Встановлює розмір черги ходу істот залежно від роздільної здатності гри (малий, якщо грає з вертикальною роздільною здатністю екрана нижче 700 пікселів, великий інакше)",
+	"vcmi.battleOptions.queueSizeSmallButton.help": "Встановлює розмір черги ходу істот на малий",
+	"vcmi.battleOptions.queueSizeBigButton.help": "Встановлює розмір черги на великий (не підтримується, якщо вертикальна роздільна здатність гри менше 700 пікселів)",
+	"vcmi.battleOptions.animationsSpeed1.hover": "",
+	"vcmi.battleOptions.animationsSpeed5.hover": "",
+	"vcmi.battleOptions.animationsSpeed6.hover": "",
+	"vcmi.battleOptions.animationsSpeed1.help": "Встановити дуже низьку швидкість анімації",
+	"vcmi.battleOptions.animationsSpeed5.help": "Встановити дуже високу швидкість анімації",
+	"vcmi.battleOptions.animationsSpeed6.help": "Встановити миттєву швидкість анімації",
+	"vcmi.battleOptions.skipBattleIntroMusic.hover": "Пропускати вступну музику",
+	"vcmi.battleOptions.skipBattleIntroMusic.help": "{Пропускати вступну музику}\n\n Пропускати коротку музику, яка грає на початку кожної битви перед початком дії. Також можна пропустити, натиснувши клавішу ESC.",
+
+	"vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover" : "Показувати доступних істот",
+	"vcmi.otherOptions.availableCreaturesAsDwellingLabel.help" : "{Показувати доступних істот}\n\n Показує істот, яких можна придбати, замість їхнього приросту у зведенні по місту (нижній лівий кут).",
+	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover" : "Показувати приріст істот",
+	"vcmi.otherOptions.creatureGrowthAsDwellingLabel.help" : "{Показувати приріст істот}\n\n Показує щотижневий приріст істот, замість кількості яку можна придбати у зведенні по місту (нижній лівий кут).",
+
+	"vcmi.otherOptions.compactTownCreatureInfo.hover": "Компактне відображення істот у місті",
+	"vcmi.otherOptions.compactTownCreatureInfo.help": "{Компактне відображення істот у місті}\n\n Показує інформацію про істот у місті у зведенні по місту у більш компактному вигляді.",
+
 	"vcmi.townHall.missingBase"             : "Спочатку необхідно звести початкову будівлю: %s",
 	"vcmi.townHall.noCreaturesToRecruit"    : "Немає істот, яких можна завербувати!",
 	"vcmi.townHall.greetingManaVortex"      : "Неподалік %s ваше тіло наповнюється новою силою. Ваша звична магічна енергія сьогодні подвоєна.",

+ 2 - 1
client/CMT.cpp

@@ -1046,7 +1046,8 @@ static void mainLoop()
 	resChanged([](const JsonNode &newState){  CGuiHandler::pushUserEvent(EUserEvent::FULLSCREEN_TOGGLED); });
 
 	inGuiThread.reset(new bool(true));
-	GH.mainFPSmng->init();
+	assert(GH.mainFPSmng);
+	GH.mainFPSmng->init(settings["video"]["targetfps"].Integer());
 
 	while(1) //main SDL events loop
 	{

+ 0 - 1
client/CPlayerInterface.h

@@ -37,7 +37,6 @@ struct CPathsInfo;
 VCMI_LIB_NAMESPACE_END
 
 class CButton;
-class CToggleGroup;
 class CAdvMapInt;
 class CCastleInterface;
 class BattleInterface;

+ 1 - 2
client/battle/BattleInterface.cpp

@@ -745,8 +745,7 @@ void BattleInterface::executeOnAnimationCondition( EAnimationEvents event, bool
 
 void BattleInterface::setBattleQueueVisibility(bool visible)
 {
+	windowObject->hideQueue();
 	if(visible)
 		windowObject->showQueue();
-	else
-		windowObject->hideQueue();
 }

+ 0 - 1
client/battle/BattleInterfaceClasses.h

@@ -35,7 +35,6 @@ class CPicture;
 class CFilledTexture;
 class CButton;
 class CToggleButton;
-class CToggleGroup;
 class CLabel;
 class CTextBox;
 class CAnimImage;

+ 17 - 17
client/battle/BattleWindow.cpp

@@ -72,6 +72,20 @@ BattleWindow::BattleWindow(BattleInterface & owner):
 	owner.fieldController.reset( new BattleFieldController(owner));
 	owner.fieldController->createHeroes();
 
+	createQueue();
+
+	if ( owner.tacticsMode )
+		tacticPhaseStarted();
+	else
+		tacticPhaseEnded();
+
+	addUsedEvents(RCLICK | KEYBOARD);
+}
+
+void BattleWindow::createQueue()
+{
+	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
+
 	//create stack queue and adjust our own position
 	bool embedQueue;
 	std::string queueSize = settings["battle"]["queueSize"].String();
@@ -89,13 +103,6 @@ BattleWindow::BattleWindow(BattleInterface & owner):
 		pos.h += queue->pos.h;
 		pos = center();
 	}
-
-	if ( owner.tacticsMode )
-		tacticPhaseStarted();
-	else
-		tacticPhaseEnded();
-
-	addUsedEvents(RCLICK | KEYBOARD);
 }
 
 BattleWindow::~BattleWindow()
@@ -147,16 +154,9 @@ void BattleWindow::showQueue()
 	Settings showQueue = settings.write["battle"]["showQueue"];
 	showQueue->Bool() = true;
 
-	queue->enable();
-
-	if (!queue->embedded)
-	{
-		//re-center, taking into account stack queue position
-		pos.y -= queue->pos.h;
-		pos.h += queue->pos.h;
-		pos = center();
-		GH.totalRedraw();
-	}
+	createQueue();
+	updateQueue();
+	GH.totalRedraw();
 }
 
 void BattleWindow::updateQueue()

+ 1 - 1
client/battle/BattleWindow.h

@@ -57,7 +57,7 @@ class BattleWindow : public InterfaceObjectConfigurable
 
 	/// flip battle queue visibility to opposite
 	void toggleQueueVisibility();
-
+	void createQueue();
 
 	std::shared_ptr<BattleConsole> buildBattleConsole(const JsonNode &) const;
 

+ 21 - 19
client/gui/CGuiHandler.cpp

@@ -93,7 +93,8 @@ void CGuiHandler::processLists(const ui16 activityFlag, std::function<void (std:
 
 void CGuiHandler::init()
 {
-	mainFPSmng->init();
+	mainFPSmng = new CFramerateManager();
+	mainFPSmng->init(settings["video"]["targetfps"].Integer());
 	isPointerRelativeMode = settings["general"]["userRelativePointer"].Bool();
 	pointerSpeedMultiplier = settings["general"]["relativePointerSpeedMultiplier"].Float();
 }
@@ -593,7 +594,9 @@ void CGuiHandler::handleMouseMotion(const SDL_Event & current)
 {
 	//sending active, hovered hoverable objects hover() call
 	std::vector<CIntObject*> hlp;
-	for(auto & elem : hoverable)
+
+	auto hoverableCopy = hoverable;
+	for(auto & elem : hoverableCopy)
 	{
 		if(elem->pos.isInside(getCursorPosition()))
 		{
@@ -606,6 +609,7 @@ void CGuiHandler::handleMouseMotion(const SDL_Event & current)
 			(elem)->hovered = false;
 		}
 	}
+
 	for(auto & elem : hlp)
 	{
 		elem->hover(true);
@@ -660,7 +664,7 @@ void CGuiHandler::renderFrame()
 		if(nullptr != curInt)
 			curInt->update();
 
-		if(settings["general"]["showfps"].Bool())
+		if(settings["video"]["showfps"].Bool())
 			drawFPSCounter();
 
 		SDL_UpdateTexture(screenTexture, nullptr, screen->pixels, screen->pitch);
@@ -688,12 +692,9 @@ CGuiHandler::CGuiHandler()
 	, mouseButtonsMask(0)
 	, continueEventHandling(true)
 	, curInt(nullptr)
+	, mainFPSmng(nullptr)
 	, statusbar(nullptr)
 {
-	// Creates the FPS manager and sets the framerate to 48 which is doubled the value of the original Heroes 3 FPS rate
-	mainFPSmng = new CFramerateManager(60);
-	//do not init CFramerateManager here --AVS
-
 	terminate_cond = new CondSh<bool>(false);
 }
 
@@ -761,7 +762,7 @@ void CGuiHandler::drawFPSCounter()
 	static SDL_Rect overlay = { 0, 0, 64, 32};
 	uint32_t black = SDL_MapRGB(screen->format, 10, 10, 10);
 	SDL_FillRect(screen, &overlay, black);
-	std::string fps = boost::lexical_cast<std::string>(mainFPSmng->fps);
+	std::string fps = boost::lexical_cast<std::string>(mainFPSmng->getFramerate());
 	graphics->fonts[FONT_BIG]->renderTextLeft(screen, fps, Colors::YELLOW, Point(10, 10));
 }
 
@@ -847,19 +848,20 @@ void CGuiHandler::pushUserEvent(EUserEvent usercode, void * userdata)
 	SDL_PushEvent(&event);
 }
 
-CFramerateManager::CFramerateManager(int rate)
-{
-	this->rate = rate;
-	this->rateticks = (1000.0 / rate);
-	this->fps = 0;
-	this->accumulatedFrames = 0;
-	this->accumulatedTime = 0;
-	this->lastticks = 0;
-	this->timeElapsed = 0;
-}
+CFramerateManager::CFramerateManager()
+	: rate(0)
+	, rateticks(0)
+	, fps(0)
+	, accumulatedFrames(0)
+	, accumulatedTime(0)
+	, lastticks(0)
+	, timeElapsed(0)
+{}
 
-void CFramerateManager::init()
+void CFramerateManager::init(int newRate)
 {
+	rate = newRate;
+	rateticks = 1000.0 / rate;
 	this->lastticks = SDL_GetTicks();
 }
 

+ 8 - 5
client/gui/CGuiHandler.h

@@ -49,17 +49,20 @@ class CFramerateManager
 {
 private:
 	double rateticks;
-	ui32 lastticks, timeElapsed;
+	ui32 lastticks;
+	ui32 timeElapsed;
 	int rate;
-	ui32 accumulatedTime,accumulatedFrames;
-public:
 	int fps; // the actual fps value
+	ui32 accumulatedTime;
+	ui32 accumulatedFrames;
 
-	CFramerateManager(int rate); // initializes the manager with a given fps rate
-	void init(); // needs to be called directly before the main game loop to reset the internal timer
+public:
+	CFramerateManager(); // initializes the manager with a given fps rate
+	void init(int newRate); // needs to be called directly before the main game loop to reset the internal timer
 	void framerateDelay(); // needs to be called every game update cycle
 	ui32 getElapsedMilliseconds() const {return this->timeElapsed;}
 	ui32 getFrameNumber() const { return accumulatedFrames; }
+	ui32 getFramerate() const { return fps; };
 };
 
 // Handles GUI logic and drawing

+ 12 - 8
client/mapView/MapViewActions.cpp

@@ -26,11 +26,6 @@ MapViewActions::MapViewActions(MapView & owner, const std::shared_ptr<MapViewMod
 	, owner(owner)
 	, curHoveredTile(-1, -1, -1)
 	, isSwiping(false)
-#if defined(VCMI_ANDROID) || defined(VCMI_IOS)
-	, swipeEnabled(settings["general"]["swipe"].Bool())
-#else
-	, swipeEnabled(settings["general"]["swipeDesktop"].Bool())
-#endif
 {
 	pos.w = model->getPixelsVisibleDimensions().x;
 	pos.h = model->getPixelsVisibleDimensions().y;
@@ -38,6 +33,15 @@ MapViewActions::MapViewActions(MapView & owner, const std::shared_ptr<MapViewMod
 	addUsedEvents(LCLICK | RCLICK | MCLICK | HOVER | MOVE);
 }
 
+bool MapViewActions::swipeEnabled() const
+{
+#if defined(VCMI_ANDROID) || defined(VCMI_IOS)
+	return settings["general"]["swipe"].Bool();
+#else
+	return settings["general"]["swipeDesktop"].Bool();
+#endif
+}
+
 void MapViewActions::setContext(const std::shared_ptr<IMapRendererContext> & context)
 {
 	this->context = context;
@@ -59,7 +63,7 @@ void MapViewActions::clickLeft(tribool down, bool previousState)
 	if(indeterminate(down))
 		return;
 
-	if(swipeEnabled)
+	if(swipeEnabled())
 	{
 		if(handleSwipeStateChange(static_cast<bool>(down)))
 		{
@@ -103,11 +107,11 @@ void MapViewActions::mouseMoved(const Point & cursorPosition)
 void MapViewActions::handleSwipeMove(const Point & cursorPosition)
 {
 	// unless swipe is enabled, swipe move only works with middle mouse button
-	if(!swipeEnabled && !GH.isMouseButtonPressed(MouseButton::MIDDLE))
+	if(!swipeEnabled() && !GH.isMouseButtonPressed(MouseButton::MIDDLE))
 		return;
 
 	// on mobile platforms with enabled swipe any button is enough
-	if(swipeEnabled && (!GH.isMouseButtonPressed() || GH.multifinger))
+	if(swipeEnabled() && (!GH.isMouseButtonPressed() || GH.multifinger))
 		return;
 
 	if(!isSwiping)

+ 1 - 1
client/mapView/MapViewActions.h

@@ -18,7 +18,6 @@ class MapView;
 
 class MapViewActions : public CIntObject
 {
-	bool swipeEnabled;
 	bool isSwiping;
 
 	Point swipeInitialViewPos;
@@ -33,6 +32,7 @@ class MapViewActions : public CIntObject
 	void handleHover(const Point & cursorPosition);
 	void handleSwipeMove(const Point & cursorPosition);
 	bool handleSwipeStateChange(bool btnPressed);
+	bool swipeEnabled() const;
 
 public:
 	MapViewActions(MapView & owner, const std::shared_ptr<MapViewModel> & model);

+ 1 - 2
client/widgets/Buttons.cpp

@@ -457,8 +457,7 @@ void CToggleGroup::selectionChanged(int to)
 		buttons[to]->setSelected(true);
 
 	onChange(to);
-	if (parent)
-		parent->redraw();
+	redraw();
 }
 
 int CToggleGroup::getSelected() const

+ 2 - 2
client/windows/CCastleInterface.cpp

@@ -48,12 +48,12 @@
 
 static bool useCompactCreatureBox()
 {
-	return settings["gameTweaks"]["compactTownCreatureInfo"].isNumber() ? settings["gameTweaks"]["compactTownCreatureInfo"].Bool() : false;
+	return settings["gameTweaks"]["compactTownCreatureInfo"].Bool();
 }
 
 static bool useAvailableAmountAsCreatureLabel()
 {
-	return settings["gameTweaks"]["availableCreaturesAsDwellingLabel"].isNumber() ? settings["gameTweaks"]["availableCreaturesAsDwellingLabel"].Bool() : false;
+	return settings["gameTweaks"]["availableCreaturesAsDwellingLabel"].Bool();
 }
 
 CBuildingRect::CBuildingRect(CCastleBuildings * Par, const CGTownInstance * Town, const CStructure * Str)

+ 0 - 1
client/windows/GUIClasses.h

@@ -36,7 +36,6 @@ class CTextInput;
 class CListBox;
 class CLabelGroup;
 class CToggleButton;
-class CToggleGroup;
 class CVolumeSlider;
 class CGStatusBar;
 class CTextBox;

+ 54 - 5
client/windows/settings/AdventureOptionsTab.cpp

@@ -34,17 +34,51 @@ AdventureOptionsTab::AdventureOptionsTab()
 		: InterfaceObjectConfigurable()
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
+	type |= REDRAW_PARENT;
+
 	const JsonNode config(ResourceID("config/widgets/settings/adventureOptionsTab.json"));
-	addCallback("playerHeroSpeedChanged", [](int value)
+	addCallback("playerHeroSpeedChanged", [this](int value)
 	{
-		return setIntSetting("adventure", "heroMoveTime", value);
+		auto targetLabel = widget<CLabel>("heroSpeedValueLabel");
+		if (targetLabel)
+		{
+			if (value <= 0)
+			{
+				targetLabel->setText("-");
+			}
+			else
+			{
+				int valuePercentage = 100 * 100 / value;
+				targetLabel->setText(std::to_string(valuePercentage) + "%");
+			}
+		}
+		setIntSetting("adventure", "heroMoveTime", value);
 	});
-	addCallback("enemyHeroSpeedChanged", [](int value)
+	addCallback("enemyHeroSpeedChanged", [this](int value)
 	{
-		return setIntSetting("adventure", "enemyMoveTime", value);
+		auto targetLabel = widget<CLabel>("enemySpeedValueLabel");
+
+		if (targetLabel)
+		{
+			if (value <= 0)
+			{
+				targetLabel->setText("-");
+			}
+			else
+			{
+				int valuePercentage = 100 * 100 / value;
+				targetLabel->setText(std::to_string(valuePercentage) + "%");
+			}
+		}
+		setIntSetting("adventure", "enemyMoveTime", value);
 	});
-	addCallback("mapScrollSpeedChanged", [](int value)
+	addCallback("mapScrollSpeedChanged", [this](int value)
 	{
+		auto targetLabel = widget<CLabel>("mapScrollingValueLabel");
+		int valuePercentage = 100 * value / 1200; // H3 max value is "1200", displaying it to be 100%
+		if (targetLabel)
+			targetLabel->setText(std::to_string(valuePercentage) + "%");
+
 		return setIntSetting("adventure", "scrollSpeedPixels", value);
 	});
 	addCallback("heroReminderChanged", [](bool value)
@@ -68,6 +102,14 @@ AdventureOptionsTab::AdventureOptionsTab()
 	{
 		return setBoolSetting("gameTweaks", "showGrid", value);
 	});
+	addCallback("mapSwipeChanged", [](bool value)
+	{
+#if defined(VCMI_MOBILE)
+		setBoolSetting("general", "swipe", value);
+#else
+		setBoolSetting("general", "swipeDesktop", value);
+#endif
+	});
 	build(config);
 
 	std::shared_ptr<CToggleGroup> playerHeroSpeedToggle = widget<CToggleGroup>("heroMovementSpeedPicker");
@@ -93,4 +135,11 @@ AdventureOptionsTab::AdventureOptionsTab()
 
 	std::shared_ptr<CToggleButton> showGridCheckbox = widget<CToggleButton>("showGridCheckbox");
 	showGridCheckbox->setSelected(settings["gameTweaks"]["showGrid"].Bool());
+
+	std::shared_ptr<CToggleButton> mapSwipeCheckbox = widget<CToggleButton>("mapSwipeCheckbox");
+#if defined(VCMI_MOBILE)
+	mapSwipeCheckbox->setSelected(settings["general"]["swipe"].Bool());
+#else
+	mapSwipeCheckbox->setSelected(settings["general"]["swipeDesktop"].Bool());
+#endif
 }

+ 24 - 10
client/windows/settings/BattleOptionsTab.cpp

@@ -19,10 +19,10 @@
 #include "../../widgets/Buttons.h"
 #include "../../widgets/TextControls.h"
 
-BattleOptionsTab::BattleOptionsTab(BattleInterface * owner):
-		InterfaceObjectConfigurable()
+BattleOptionsTab::BattleOptionsTab(BattleInterface * owner)
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
+	type |= REDRAW_PARENT;
 
 	const JsonNode config(ResourceID("config/widgets/settings/battleOptionsTab.json"));
 	addCallback("viewGridChanged", [this, owner](bool value)
@@ -45,9 +45,9 @@ BattleOptionsTab::BattleOptionsTab(BattleInterface * owner):
 	{
 		showQueueChangedCallback(value, owner);
 	});
-	addCallback("queueSizeChanged", [this](int value)
+	addCallback("queueSizeChanged", [this, owner](int value)
 	{
-		queueSizeChangedCallback(value);
+		queueSizeChangedCallback(value, owner);
 	});
 	addCallback("skipBattleIntroMusicChanged", [this](bool value)
 	{
@@ -70,9 +70,6 @@ BattleOptionsTab::BattleOptionsTab(BattleInterface * owner):
 	std::shared_ptr<CToggleButton> mouseShadowCheckbox = widget<CToggleButton>("mouseShadowCheckbox");
 	mouseShadowCheckbox->setSelected(settings["battle"]["mouseShadow"].Bool());
 
-	std::shared_ptr<CToggleButton> showQueueCheckbox = widget<CToggleButton>("showQueueCheckbox");
-	showQueueCheckbox->setSelected(settings["battle"]["showQueue"].Bool());
-
 	std::shared_ptr<CToggleButton> skipBattleIntroMusicCheckbox = widget<CToggleButton>("skipBattleIntroMusicCheckbox");
 	skipBattleIntroMusicCheckbox->setSelected(settings["gameTweaks"]["skipBattleIntroMusic"].Bool());
 }
@@ -88,11 +85,13 @@ int BattleOptionsTab::getAnimSpeed() const
 int BattleOptionsTab::getQueueSizeId() const
 {
 	std::string text = settings["battle"]["queueSize"].String();
+	if(text == "none")
+		return -1;
 	if(text == "auto")
 		return 0;
-	else if(text == "small")
+	if(text == "small")
 		return 1;
-	else if(text == "big")
+	if(text == "big")
 		return 2;
 
 	return 0;
@@ -102,6 +101,8 @@ std::string BattleOptionsTab::getQueueSizeStringFromId(int value) const
 {
 	switch(value)
 	{
+		case -1:
+			return "none";
 		case 0:
 			return "auto";
 		case 1:
@@ -139,6 +140,11 @@ void BattleOptionsTab::animationSpeedChangedCallback(int value)
 {
 	Settings speed = settings.write["battle"]["speedFactor"];
 	speed->Float() = static_cast<float>(value);
+
+	auto targetLabel = widget<CLabel>("animationSpeedValueLabel");
+	int valuePercentage = value * 100 / 3; // H3 max value is "3", displaying it to be 100%
+	if (targetLabel)
+		targetLabel->setText(std::to_string(valuePercentage) + "%");
 }
 
 void BattleOptionsTab::showQueueChangedCallback(bool value, BattleInterface * parentBattleInterface)
@@ -154,11 +160,19 @@ void BattleOptionsTab::showQueueChangedCallback(bool value, BattleInterface * pa
 	}
 }
 
-void BattleOptionsTab::queueSizeChangedCallback(int value)
+void BattleOptionsTab::queueSizeChangedCallback(int value, BattleInterface * parentBattleInterface)
 {
+	if (value == -1)
+	{
+		showQueueChangedCallback(false, parentBattleInterface);
+		return;
+	}
+
 	std::string stringifiedValue = getQueueSizeStringFromId(value);
 	Settings size = settings.write["battle"]["queueSize"];
 	size->String() = stringifiedValue;
+
+	showQueueChangedCallback(true, parentBattleInterface);
 }
 
 void BattleOptionsTab::skipBattleIntroMusicChangedCallback(bool value)

+ 4 - 4
client/windows/settings/BattleOptionsTab.h

@@ -22,12 +22,12 @@ private:
 	int getAnimSpeed() const;
 	int getQueueSizeId() const;
 	std::string getQueueSizeStringFromId(int value) const;
-	void viewGridChangedCallback(bool value, BattleInterface * parentBattleInterface = nullptr);
-	void movementShadowChangedCallback(bool value, BattleInterface * parentBattleInterface = nullptr);
+	void viewGridChangedCallback(bool value, BattleInterface * parentBattleInterface);
+	void movementShadowChangedCallback(bool value, BattleInterface * parentBattleInterface);
 	void mouseShadowChangedCallback(bool value);
 	void animationSpeedChangedCallback(int value);
-	void showQueueChangedCallback(bool value, BattleInterface * parentBattleInterface = nullptr);
-	void queueSizeChangedCallback(int value);
+	void showQueueChangedCallback(bool value, BattleInterface * parentBattleInterface);
+	void queueSizeChangedCallback(int value, BattleInterface * parentBattleInterface);
 	void skipBattleIntroMusicChangedCallback(bool value);
 public:
 	BattleOptionsTab(BattleInterface * owner = nullptr);

+ 30 - 18
client/windows/settings/GeneralOptionsTab.cpp

@@ -33,13 +33,18 @@ static void setIntSetting(std::string group, std::string field, int value)
 
 static void setBoolSetting(std::string group, std::string field, bool value)
 {
-	Settings fullscreen = settings.write[group][field];
-	fullscreen->Bool() = value;
+	Settings entry = settings.write[group][field];
+	entry->Bool() = value;
 }
 
 static std::string resolutionToString(int w, int h)
 {
-	return std::to_string(w) + 'x' + std::to_string(h);
+	auto string = CGI->generaltexth->translate("vcmi.systemOptions.resolutionButton.hover");
+
+	boost::replace_all(string, "%w", std::to_string(w));
+	boost::replace_all(string, "%h", std::to_string(h));
+
+	return string;
 }
 
 GeneralOptionsTab::GeneralOptionsTab()
@@ -47,21 +52,30 @@ GeneralOptionsTab::GeneralOptionsTab()
 		  onFullscreenChanged(settings.listen["video"]["fullscreen"])
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
+	type |= REDRAW_PARENT;
 
 	const JsonNode config(ResourceID("config/widgets/settings/generalOptionsTab.json"));
 	addCallback("spellbookAnimationChanged", [](bool value)
 	{
-		return setBoolSetting("video", "spellbookAnimation", value);
+		setBoolSetting("video", "spellbookAnimation", value);
 	});
 	addCallback("setMusic", [this](int value)
 	{
 		setIntSetting("general", "music", value);
 		widget<CSlider>("musicSlider")->redraw();
+
+		auto targetLabel = widget<CLabel>("musicValueLabel");
+		if (targetLabel)
+			targetLabel->setText(std::to_string(value) + "%");
 	});
 	addCallback("setVolume", [this](int value)
 	{
 		setIntSetting("general", "sound", value);
 		widget<CSlider>("soundVolumeSlider")->redraw();
+
+		auto targetLabel = widget<CLabel>("soundValueLabel");
+		if (targetLabel)
+			targetLabel->setText(std::to_string(value) + "%");
 	});
 	//settings that do not belong to base game:
 	addCallback("fullscreenChanged", [this](bool value)
@@ -74,24 +88,26 @@ GeneralOptionsTab::GeneralOptionsTab()
 	});
 	addCallback("framerateChanged", [](bool value)
 	{
-		setBoolSetting("general", "showfps", value);
+		setBoolSetting("video", "showfps", value);
 	});
+
 	//moved from "other" tab that is disabled for now to avoid excessible tabs with barely any content
-	addCallback("availableCreaturesAsDwellingLabelChanged", [](bool value)
+	addCallback("availableCreaturesAsDwellingChanged", [=](int value)
 	{
-		setBoolSetting("gameTweaks", "availableCreaturesAsDwellingLabel", value);
+		setBoolSetting("gameTweaks", "availableCreaturesAsDwellingLabel", value > 0);
 	});
+
 	addCallback("compactTownCreatureInfoChanged", [](bool value)
 	{
-		return setBoolSetting("gameTweaks", "compactTownCreatureInfo", value);
+		setBoolSetting("gameTweaks", "compactTownCreatureInfo", value);
 	});
+
 	build(config);
 
 	std::shared_ptr<CLabel> resolutionLabel = widget<CLabel>("resolutionLabel");
 	const auto & currentResolution = settings["video"]["screenRes"];
 	resolutionLabel->setText(resolutionToString(currentResolution["width"].Integer(), currentResolution["height"].Integer()));
 
-
 	std::shared_ptr<CToggleButton> spellbookAnimationCheckbox = widget<CToggleButton>("spellbookAnimationCheckbox");
 	spellbookAnimationCheckbox->setSelected(settings["video"]["spellbookAnimation"].Bool());
 
@@ -103,7 +119,7 @@ GeneralOptionsTab::GeneralOptionsTab()
 	});
 
 	std::shared_ptr<CToggleButton> framerateCheckbox = widget<CToggleButton>("framerateCheckbox");
-	framerateCheckbox->setSelected(settings["general"]["showfps"].Bool());
+	framerateCheckbox->setSelected(settings["video"]["showfps"].Bool());
 
 	std::shared_ptr<CSlider> musicSlider = widget<CSlider>("musicSlider");
 	musicSlider->moveTo(CCS->musich->getVolume());
@@ -111,8 +127,8 @@ GeneralOptionsTab::GeneralOptionsTab()
 	std::shared_ptr<CSlider> volumeSlider = widget<CSlider>("soundVolumeSlider");
 	volumeSlider->moveTo(CCS->soundh->getVolume());
 
-	std::shared_ptr<CToggleButton> availableCreaturesAsDwellingLabelCheckbox = widget<CToggleButton>("availableCreaturesAsDwellingLabelCheckbox");
-	availableCreaturesAsDwellingLabelCheckbox->setSelected(settings["gameTweaks"]["availableCreaturesAsDwellingLabel"].Bool());
+	std::shared_ptr<CToggleGroup> creatureGrowthAsDwellingPicker = widget<CToggleGroup>("availableCreaturesAsDwellingPicker");
+	creatureGrowthAsDwellingPicker->setSelected(settings["gameTweaks"]["availableCreaturesAsDwellingLabel"].Bool());
 
 	std::shared_ptr<CToggleButton> compactTownCreatureInfo = widget<CToggleButton>("compactTownCreatureInfoCheckbox");
 	compactTownCreatureInfo->setSelected(settings["gameTweaks"]["compactTownCreatureInfo"].Bool());
@@ -173,11 +189,7 @@ void GeneralOptionsTab::setGameResolution(int index)
 	gameRes["width"].Float() = resolution.x;
 	gameRes["height"].Float() = resolution.y;
 
-	std::string resText;
-	resText += std::to_string(resolution.x);
-	resText += "x";
-	resText += std::to_string(resolution.y);
-	widget<CLabel>("resolutionLabel")->setText(resText);
+	widget<CLabel>("resolutionLabel")->setText(resolutionToString(resolution.x, resolution.y));
 }
 
 void GeneralOptionsTab::setFullscreenMode(bool on)
@@ -226,4 +238,4 @@ void GeneralOptionsTab::fillSelectableResolutions()
 	{
 		return left.x * left.y < right.x * right.y;
 	});
-}
+}

+ 22 - 15
client/windows/settings/SettingsMainWindow.cpp

@@ -9,25 +9,24 @@
  */
 
 #include "StdInc.h"
-
 #include "SettingsMainWindow.h"
 
-#include "GeneralOptionsTab.h"
 #include "AdventureOptionsTab.h"
 #include "BattleOptionsTab.h"
+#include "GeneralOptionsTab.h"
 #include "OtherOptionsTab.h"
 
-#include "filesystem/ResourceID.h"
+#include "CGameInfo.h"
 #include "CGeneralTextHandler.h"
+#include "CPlayerInterface.h"
+#include "CServerHandler.h"
+#include "filesystem/ResourceID.h"
 #include "gui/CGuiHandler.h"
 #include "lobby/CSavingScreen.h"
 #include "widgets/Buttons.h"
 #include "widgets/Images.h"
 #include "widgets/ObjectLists.h"
-#include "CGameInfo.h"
-#include "CPlayerInterface.h"
-#include "CServerHandler.h"
-
+#include "windows/CMessage.h"
 
 SettingsMainWindow::SettingsMainWindow(BattleInterface * parentBattleUi) : InterfaceObjectConfigurable()
 {
@@ -43,7 +42,7 @@ SettingsMainWindow::SettingsMainWindow(BattleInterface * parentBattleUi) : Inter
 	addCallback("closeWindow", [this](int) { backButtonCallback(); });
 	build(config);
 
-	std::shared_ptr<CPicture> background = widget<CPicture>("background");
+	std::shared_ptr<CIntObject> background = widget<CIntObject>("background");
 	pos.w = background->pos.w;
 	pos.h = background->pos.h;
 	pos = center();
@@ -57,12 +56,9 @@ SettingsMainWindow::SettingsMainWindow(BattleInterface * parentBattleUi) : Inter
 	std::shared_ptr<CButton> restartButton = widget<CButton>("restartButton");
 	assert(restartButton);
 
-	if(CSH->isGuest())
-	{
-		loadButton->block(true);
-		saveButton->block(true);
-		restartButton->block(true);
-	}
+	loadButton->block(CSH->isGuest());
+	saveButton->block(CSH->isGuest() || parentBattleUi);
+	restartButton->block(CSH->isGuest() || parentBattleUi);
 
 	int defaultTabIndex = 0;
 	if(parentBattleUi != nullptr)
@@ -72,6 +68,7 @@ SettingsMainWindow::SettingsMainWindow(BattleInterface * parentBattleUi) : Inter
 
 	parentBattleInterface = parentBattleUi;
 	tabContentArea = std::make_shared<CTabbedInt>(std::bind(&SettingsMainWindow::createTab, this, _1), Point(0, 0), defaultTabIndex);
+	tabContentArea->type |= REDRAW_PARENT;
 
 	std::shared_ptr<CToggleGroup> mainTabs = widget<CToggleGroup>("settingsTabs");
 	mainTabs->setSelected(defaultTabIndex);
@@ -147,4 +144,14 @@ void SettingsMainWindow::closeAndPushEvent(EUserEvent code)
 {
 	close();
 	GH.pushUserEvent(code);
-}
+}
+
+void SettingsMainWindow::showAll(SDL_Surface *to)
+{
+	auto color = LOCPLINT ? LOCPLINT->playerID : PlayerColor(1);
+	if(settings["session"]["spectate"].Bool())
+		color = PlayerColor(1); // TODO: Spectator shouldn't need special code for UI colors
+
+	CIntObject::showAll(to);
+	CMessage::drawBorder(color, to, pos.w+28, pos.h+29, pos.x-14, pos.y-15);
+}

+ 2 - 0
client/windows/settings/SettingsMainWindow.h

@@ -40,5 +40,7 @@ private:
 	void mainMenuButtonCallback();
 public:
 	SettingsMainWindow(BattleInterface * parentBattleInterface = nullptr);
+
+	void showAll(SDL_Surface * to);
 };
 

+ 21 - 6
config/schemas/settings.json

@@ -19,7 +19,6 @@
 			"additionalProperties" : false,
 			"required" : [
 				"playerName",
-				"showfps",
 				"music",
 				"sound",
 				"encoding",
@@ -39,10 +38,6 @@
 					"type":"string",
 					"default" : "Player"
 				},
-				"showfps" : {
-					"type" : "boolean",
-					"default" : false
-				},
 				"music" : {
 					"type" : "number",
 					"default" : 88
@@ -114,7 +109,19 @@
 			"type" : "object",
 			"additionalProperties" : false,
 			"default": {},
-			"required" : [ "screenRes", "bitsPerPixel", "fullscreen", "realFullscreen", "cursor", "spellbookAnimation", "driver", "showIntro", "displayIndex" ],
+			"required" : [ 
+				"screenRes", 
+				"bitsPerPixel", 
+				"fullscreen", 
+				"realFullscreen", 
+				"cursor", 
+				"spellbookAnimation", 
+				"driver", 
+				"showIntro", 
+				"displayIndex",
+				"showfps",
+				"targetfps"
+			],
 			"properties" : {
 				"screenRes" : {
 					"type" : "object",
@@ -159,6 +166,14 @@
 				"displayIndex" : {
 					"type" : "number",
 					"default" : 0
+				},
+				"showfps" : {
+					"type" : "boolean",
+					"default" : false
+				},
+				"targetfps" : {
+					"type" : "number",
+					"default" : 60
 				}
 			}
 		},

+ 237 - 100
config/widgets/settings/adventureOptionsTab.json

@@ -1,6 +1,32 @@
 {
 	"items":
 	[
+		{
+			"name": "lineLabelsEnd",
+			"type": "texture",
+			"image": "settingsWindow/lineHorizontal",
+			"rect": { "x" : 5, "y" : 289, "w": 365, "h": 3}
+		},
+/////////////////////////////////////// Left section - Hero Speed and Map Scrolling
+		{
+			"name": "frameHeroMovement",
+			"type": "picture",
+			"image": "settingsWindow/frameMovement",
+			"position": {"x": 6, "y": 50 }
+		},	
+		{
+			"name": "frameEnemyMovement",
+			"type": "picture",
+			"image": "settingsWindow/frameMovement",
+			"position": {"x": 6, "y": 110 }
+		},
+		{
+			"name": "frameMapMovement",
+			"type": "picture",
+			"image": "settingsWindow/frameMovement",
+			"position": {"x": 6, "y": 170 }
+		},
+
 		{
 			"name": "topSettingsLabels",
 			"type": "labelGroup",
@@ -10,24 +36,33 @@
 			"items":
 			[
 				{
-					"position": {"x": 122, "y": 52},
-					"text": "core.genrltxt.569"
+					"position": {"x": 150, "y": 62},
+					"text": "core.genrltxt.569" // Hero Speed
 				},
 				{
-					"position": {"x": 122, "y": 118},
-					"text": "core.genrltxt.570"
+					"position": {"x": 150, "y": 122},
+					"text": "core.genrltxt.570" // Enemy Speed
 				},
 				{
-					"position": {"x": 122, "y": 184},
-					"text": "core.genrltxt.571"
+					"position": {"x": 150, "y": 182},
+					"text": "core.genrltxt.571" // Scrolling Speed
 				}
 			]
 		},
+		
+		{
+			"name": "heroSpeedValueLabel",
+			"type": "label",
+			"font": "medium",
+			"alignment": "center",
+			"color": "yellow",
+			"position": {"x": 324, "y": 90}
+		},
 
 		{
 			"name": "heroMovementSpeedPicker",
 			"type": "toggleGroup",
-			"position": {"x": 28, "y": 65},
+			"position": {"x": 10, "y": 73},
 			"items":
 			[
 				{
@@ -37,7 +72,6 @@
 					"help": "core.help.349",
 					"position": {"x": 0, "y": 0}
 				},
-
 				{
 					"index": 150,
 					"type": "toggleButton",
@@ -45,44 +79,57 @@
 					"help": "core.help.350",
 					"position": {"x": 48, "y": 0}
 				},
-
 				{
 					"index": 100,
 					"type": "toggleButton",
+					"image": "sysopb5",
+					"help": "core.help.350",
+					"position": {"x": 96, "y": 0}
+				},
+				{
+					"index": 50,
+					"type": "toggleButton",
+					"image": "sysopb6",
+					"help": "core.help.351",
+					"position": {"x": 144, "y": 0}
+				},
+				{
+					"index": 25,
+					"type": "toggleButton",
 					"image": "sysopb3",
 					"help": "core.help.351",
-					"position": {"x": 96, "y": 0}
+					"position": {"x": 192, "y": 0}
 				},
-
 				{
 					"index": 0,
 					"type": "toggleButton",
 					"image": "sysopb4",
 					"help": "core.help.352",
-					"position": {"x": 144, "y": 0}
+					"position": {"x": 240, "y": 0}
 				}
-				//barely any difference compared to index 16 for now
-//				{
-//					"index": 9999,
-//					"type": "toggleButton",
-//					"image": "sysopb8",
-//					"help": "core.help.356",
-//					"position": {"x": 192, "y": 0}
-//				}
 			],
 			"callback": "playerHeroSpeedChanged"
 		},
 
+		{
+			"name": "enemySpeedValueLabel",
+			"type": "label",
+			"font": "medium",
+			"alignment": "center",
+			"color": "yellow",
+			"position": {"x": 324, "y": 150}
+		},
+
 		{
 			"name": "enemyMovementSpeedPicker",
 			"type": "toggleGroup",
-			"position": {"x": 28, "y": 132},
+			"position": {"x": 10, "y": 133},
 			"items":
 			[
 				{
 					"index": 150,
 					"type": "toggleButton",
-					"image": "sysopb5",
+					"image": "sysopb1",
 					"help": "core.help.353",
 					"position": {"x": 0, "y": 0}
 				},
@@ -90,9 +137,25 @@
 				{
 					"index": 100,
 					"type": "toggleButton",
+					"image": "sysopb5",
+					"help": "core.help.353",
+					"position": {"x": 48, "y": 0}
+				},
+
+				{
+					"index": 50,
+					"type": "toggleButton",
 					"image": "sysopb6",
 					"help": "core.help.354",
-					"position": {"x": 48, "y": 0}
+					"position": {"x": 96, "y": 0}
+				},
+
+				{
+					"index": 25,
+					"type": "toggleButton",
+					"image": "sysopb3",
+					"help": "core.help.354",
+					"position": {"x": 144, "y": 0}
 				},
 
 				{
@@ -100,7 +163,7 @@
 					"type": "toggleButton",
 					"image": "sysopb7",
 					"help": "core.help.355",
-					"position": {"x": 96, "y": 0}
+					"position": {"x": 192, "y": 0}
 				},
 
 				{
@@ -108,85 +171,132 @@
 					"type": "toggleButton",
 					"image": "sysopb8",
 					"help": "core.help.356",
-					"position": {"x": 144, "y": 0}
+					"position": {"x": 240, "y": 0}
 				}
 			],
 			"callback": "enemyHeroSpeedChanged"
 		},
 
+		{
+			"name": "mapScrollingValueLabel",
+			"type": "label",
+			"font": "medium",
+			"alignment": "center",
+			"color": "yellow",
+			"position": {"x": 324, "y": 210}
+		},
 		{
 			"name": "mapScrollSpeedPicker",
 			"type": "toggleGroup",
-			"position": {"x": 28, "y": 198},
+			"position": {"x": 10, "y": 193},
 			"items":
 			[
+				{
+					"index": 200,
+					"type": "toggleButton",
+					"image": "settingsWindow/button46",
+					"help": "vcmi.adventureOptions.mapScrollSpeed1",
+					"position": {"x": 0, "y": 0},
+					"items":
+					[
+						{
+							"name": "mapScrollSpeed1",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed1",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
+				},
+
 				{
 					"index": 400,
 					"type": "toggleButton",
-					"image": "sysopb9",
+					"image": "settingsWindow/button46",
 					"help": "core.help.357",
-					"position": {"x": 0, "y": 0}
+					"position": {"x": 48, "y": 0},
+					"items":
+					[
+						{
+							"name": "mapScrollSpeed2",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed2",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
 				},
 
 				{
 					"index": 800,
 					"type": "toggleButton",
-					"image": "sysob10",
+					"image": "settingsWindow/button46",
 					"help": "core.help.358",
-					"position": {"x": 64, "y": 0}
+					"position": {"x": 96, "y": 0},
+					"items":
+					[
+						{
+							"name": "mapScrollSpeed3",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed3",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
 				},
 
 				{
 					"index": 1200,
 					"type": "toggleButton",
-					"image": "sysob11",
+					"image": "settingsWindow/button46",
 					"help": "core.help.359",
-					"position": {"x": 128, "y": 0}
+					"position": {"x": 144, "y": 0},
+					"items":
+					[
+						{
+							"name": "mapScrollSpeed4",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed4",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
+				},
+				{
+					"index": 2400, // TODO
+					"type": "toggleButton",
+					"image": "settingsWindow/button46",
+					"help": "vcmi.adventureOptions.mapScrollSpeed5",
+					"position": {"x": 192, "y": 0},
+					"items":
+					[
+						{
+							"name": "mapScrollSpeed5",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed5",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
+				},
+				{
+					"index": 4800, // TODO
+					"type": "toggleButton",
+					"image": "settingsWindow/button46",
+					"help": "vcmi.adventureOptions.mapScrollSpeed6",
+					"position": {"x": 240, "y": 0},
+					"items":
+					[
+						{
+							"name": "mapScrollSpeed6",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed6",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
 				}
-
-				//not really functional yet...
-//				{
-//					"index": 6,
-//					"type": "toggleButton",
-//					"image": "buttons/square",
-//					"help": "vcmi.adventureOptions.mapScrollSpeed4",
-//					"position": {"x": 192, "y": 0},
-//					"items":
-//					[
-//						{
-//							"name": "mapScrollSpeed4",
-//							"type": "label",
-//							"font": "big",
-//							"alignment": "center",
-//							"color": "yellow",
-//							"text": "vcmi.adventureOptions.mapScrollSpeed4.hover"
-//						}
-//					]
-//				},
-//				{
-//					"index": 8,
-//					"type": "toggleButton",
-//					"image": "buttons/square",
-//					"help": "vcmi.adventureOptions.mapScrollSpeed5",
-//					"position": {"x": 224, "y": 0},
-//					"items":
-//					[
-//						{
-//							"name": "mapScrollSpeed5",
-//							"type": "label",
-//							"font": "big",
-//							"alignment": "center",
-//							"color": "yellow",
-//							"text": "vcmi.adventureOptions.mapScrollSpeed5.hover"
-//						}
-//					]
-//				}
 			],
 			"callback": "mapScrollSpeedChanged"
 		},
-
+		
+/////////////////////////////////////// Right section - Original H3 options
 		{
-			"name": "bottomCheckboxesLabels",
+			"name": "rightCheckboxesLabels",
 			"type": "labelGroup",
 			"font": "medium",
 			"alignment": "left",
@@ -194,65 +304,83 @@
 			"items":
 			[
 				{
-					"position": {"x": 64, "y": 278},
-					"text": "core.genrltxt.572"
-				},
-				{
-					"position": {"x": 64, "y": 314},
-					"text": "core.genrltxt.573"
+					"position": {"x": 415, "y": 55},
+					"text": "core.genrltxt.572" // TODO: show move path
 				},
 				{
-					"position": {"x": 64, "y": 350},
-					"text": "core.genrltxt.574"
+					"position": {"x": 415, "y": 85},
+					"text": "core.genrltxt.573" // show hero reminder
 				},
 				{
-					"position": {"x": 64, "y": 386},
-					"text": "vcmi.adventureOptions.numericQuantities.hover"
-				},
-				{
-					"position": {"x": 64, "y": 422},
-					"text": "vcmi.adventureOptions.forceMovementInfo.hover"
-				},
-				{
-					"position": {"x": 64, "y": 458},
-					"text": "vcmi.adventureOptions.showGrid.hover"
+					"position": {"x": 415, "y": 115},
+					"text": "core.genrltxt.574" // quick combat
 				}
 			]
 		},
-
+		{
+			"name": "showMovePathPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 380, "y": 53},
+		},
 		{
 			"name": "heroReminderCheckbox",
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "core.help.361",
-			"position": {"x": 28, "y": 312},
+			"position": {"x": 380, "y": 83},
 			"callback": "heroReminderChanged"
 		},
-
 		{
 			"name": "quickCombatCheckbox",
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "core.help.362",
-			"position": {"x": 28, "y": 348},
+			"position": {"x": 380, "y": 113},
 			"callback": "quickCombatChanged"
 		},
-
+		
+/////////////////////////////////////// Bottom section - VCMI Options
+		{
+			"name": "bottomCheckboxesLabels",
+			"type": "labelGroup",
+			"font": "medium",
+			"alignment": "left",
+			"color": "white",
+			"items":
+			[
+				{
+					"position": {"x": 45, "y": 295},
+					"text": "vcmi.adventureOptions.numericQuantities.hover"
+				},
+				{
+					"position": {"x": 45, "y": 325},
+					"text": "vcmi.adventureOptions.forceMovementInfo.hover"
+				},
+				{
+					"position": {"x": 45, "y": 355},
+					"text": "vcmi.adventureOptions.showGrid.hover"
+				},
+				{
+					"position": {"x": 45, "y": 385},
+					"text": "vcmi.adventureOptions.mapSwipe.hover"
+				}
+			]
+		},
 		{
 			"name": "numericQuantitiesCheckbox",
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "vcmi.adventureOptions.numericQuantities",
-			"position": {"x": 28, "y": 384},
+			"position": {"x": 10, "y": 293},
 			"callback": "numericQuantitiesChanged"
 		},
-
 		{
 			"name": "forceMovementInfoCheckbox",
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "vcmi.adventureOptions.forceMovementInfo",
-			"position": {"x": 28, "y": 420},
+			"position": {"x": 10, "y": 323},
 			"callback": "forceMovementInfoChanged"
 		},
 		{
@@ -260,8 +388,17 @@
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "vcmi.adventureOptions.showGrid",
-			"position": {"x": 28, "y": 456},
+			"position": {"x": 10, "y": 353},
 			"callback": "showGridChanged"
-		}
+		},
+		{
+			"name": "mapSwipeCheckbox",
+			"type": "toggleButton",
+			"image": "sysopchk.def",
+			"help": "vcmi.adventureOptions.mapSwipe",
+			"position": {"x": 10, "y": 383},
+			"callback": "mapSwipeChanged"
+		},
+
 	]
 }

+ 248 - 180
config/widgets/settings/battleOptionsTab.json

@@ -2,133 +2,158 @@
 	"items":
 	[
 		{
-			"name": "animationSpeedLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "center",
-			"color": "yellow",
-			"text": "core.genrltxt.393",
-			"position": {"x": 122, "y": 224}
-		},
-		{
-			"name": "autoCombatOptionsLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "center",
-			"color": "yellow",
-			"text": "core.genrltxt.396",
-			"position": {"x": 353, "y": 56}
+			"name": "lineCreatureInfo",
+			"type": "texture",
+			"image": "settingsWindow/lineHorizontal",
+			"rect": { "x" : 5, "y" : 199, "w": 365, "h": 3}
 		},
 		{
-			"name": "creatureInfoLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "center",
-			"color": "yellow",
-			"text": "core.genrltxt.397",
-			"position": {"x": 98, "y": 295}
+			"name": "lineAnimationSpeed",
+			"type": "texture",
+			"image": "settingsWindow/lineHorizontal",
+			"rect": { "x" : 5, "y" : 289, "w": 365, "h": 3}
 		},
 
 		{
-			"name": "creaturesAutoCombatLabel",
-			"type": "label",
+			"name": "titlesLabels",
+			"type": "labelGroup",
 			"font": "medium",
 			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.398",
-			"position": {"x": 283, "y": 76}
+			"color": "yellow",
+			"items":
+			[
+				{
+					"text": "core.genrltxt.396", // Auto-combat options
+					"position": {"x": 380, "y": 55}
+				},
+				{
+					"text": "core.genrltxt.397", // Creature info
+					"position": {"x": 10, "y": 205}
+				}
+			]
 		},
+/////////////////////////////////////// Right section - Auto-combat settings (NOT IMPLEMENTED)
 		{
-			"name": "spellsAutoCombatLabel",
-			"type": "label",
+			"name": "autoCombatLabels",
+			"type": "labelGroup",
 			"font": "medium",
 			"alignment": "left",
 			"color": "white",
-			"text": "core.genrltxt.399",
-			"position": {"x": 283, "y": 106}
+			"items":
+			[
+				{
+					"text": "core.genrltxt.398", // Creatures
+					"position": {"x": 415, "y": 85}
+				},
+				{
+					"text": "core.genrltxt.399", // Spells
+					"position": {"x": 415, "y": 115}
+				},
+				{
+					"text": "core.genrltxt.400", // Catapult
+					"position": {"x": 415, "y": 145}
+				},
+				{
+					"text": "core.genrltxt.151", // Ballista
+					"position": {"x": 415, "y": 175}
+				},
+				{
+					"text": "core.genrltxt.401", // First Aid Tent
+					"position": {"x": 415, "y": 205}
+				}
+			]
 		},
 		{
-			"name": "catapultAutoCombatLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.400",
-			"position": {"x": 283, "y": 136}
+			"name": "autoCombatCreaturesPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 380, "y": 83},
 		},
 		{
-			"name": "ballistaAutoCombatLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.151",
-			"position": {"x": 283, "y": 166}
+			"name": "autoCombatSpellsPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 380, "y": 113},
 		},
 		{
-			"name": "aidTentAutoCombatLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.401",
-			"position": {"x": 283, "y": 196}
+			"name": "autoCombatCatapultPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 380, "y": 143},
 		},
-
 		{
-			"name": "creatureInfoAllStatsLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.402",
-			"position": {"x": 61, "y": 315}
+			"name": "autoCombatBallistaPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 380, "y": 173},
 		},
 		{
-			"name": "creatureInfoOnlySpellsLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.403",
-			"position": {"x": 61, "y": 345}
+			"name": "autoCombatFirstAidTentPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 380, "y": 203},
 		},
-
+/////////////////////////////////////// Left section - checkboxes
 		{
-			"name": "viewGridLabel",
-			"type": "label",
+			"name": "creatureInfoLabels",
+			"type": "labelGroup",
 			"font": "medium",
 			"alignment": "left",
 			"color": "white",
-			"text": "core.genrltxt.404",
-			"position": {"x": 61, "y": 57}
+			"items":
+			[
+				{
+					"text": "core.genrltxt.402", // All Stats
+					"position": {"x": 45, "y": 235}
+				},
+				{
+					"text": "core.genrltxt.403", // Spells only
+					"position": {"x": 45, "y": 265}
+				}
+			]
 		},
 		{
-			"name": "showMovementRangeLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.405",
-			"position": {"x": 61, "y": 90}
+			"name": "creatureInfoAllPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 10, "y": 233},
 		},
 		{
-			"name": "mouseShadowLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "core.genrltxt.406",
-			"position": {"x": 61, "y": 123}
+			"name": "creatureInfoSpellsPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 10, "y": 263},
 		},
+
 		{
-			"name": "battleCasualtiesLabel",
-			"type": "label",
+			"name": "generalOptionsLabels",
+			"type": "labelGroup",
 			"font": "medium",
 			"alignment": "left",
 			"color": "white",
-			"text": "core.genrltxt.407",
-			"position": {"x": 61, "y": 156}
+			"items":
+			[
+				{
+					"text": "core.genrltxt.404",
+					"position": {"x": 45, "y": 55}
+				},
+				{
+					"text": "core.genrltxt.405",
+					"position": {"x": 45, "y": 85}
+				},
+				{
+					"text": "core.genrltxt.406",
+					"position": {"x": 45, "y": 115}
+				},
+				{
+					"text": "core.genrltxt.407",
+					"position": {"x": 45, "y": 145}
+				},
+				{
+					"text": "vcmi.battleOptions.skipBattleIntroMusic.hover",
+					"position": {"x": 45, "y": 175}
+				}
+			]
 		},
 
 		{
@@ -136,7 +161,7 @@
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "core.help.427",
-			"position": {"x": 25, "y": 56},
+			"position": {"x": 10, "y": 53},
 			"callback": "viewGridChanged"
 		},
 		{
@@ -144,7 +169,7 @@
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "core.help.428",
-			"position": {"x": 25, "y": 89},
+			"position": {"x": 10, "y": 83},
 			"callback": "movementShadowChanged"
 		},
 		{
@@ -152,90 +177,146 @@
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "core.help.429",
-			"position": {"x": 25, "y": 122},
+			"position": {"x": 10, "y": 113},
 			"callback": "mouseShadowChanged"
 		},
-
+		{
+			"name": "battleFieldCasualtiesPlaceholder",
+			"type": "picture",
+			"image": "settingsWindow/checkBoxEmpty",
+			"position": {"x": 10, "y": 143},
+		},
+		{
+			"name": "skipBattleIntroMusicCheckbox",
+			"type": "toggleButton",
+			"image": "sysopchk.def",
+			"help": "vcmi.battleOptions.skipBattleIntroMusic",
+			"position": {"x": 10, "y": 173},
+			"callback": "skipBattleIntroMusicChanged"
+		},
+/////////////////////////////////////// Bottom section - Animation Speed and Turn Order
+		{
+			"name": "frameAnimationSpeed",
+			"type": "picture",
+			"image": "settingsWindow/frameMovement",
+			"position": {"x": 6, "y": 350 }
+		},
+		{
+			"name": "animationSpeedLabel",
+			"type": "label",
+			"font": "medium",
+			"alignment": "center",
+			"color": "yellow",
+			"text": "core.genrltxt.393",
+			"position": {"x": 150, "y": 362}
+		},
+		{
+			"name": "animationSpeedValueLabel",
+			"type": "label",
+			"font": "medium",
+			"alignment": "center",
+			"color": "yellow",
+			"position": {"x": 324, "y": 390}
+		},
 		{
 			"name": "animationSpeedPicker",
 			"type": "toggleGroup",
-			"position": {"x": 28, "y": 233},
+			"position": {"x": 10, "y": 373},
 			"items":
 			[
 				{
 					"index": 1,
 					"type": "toggleButton",
-					"image": "sysopb9",
-					"help": "core.help.422",
-					"position": {"x": 0, "y": 0}
+					"image": "settingsWindow/button46",
+					"help": "vcmi.battleOptions.animationsSpeed1",
+					"position": {"x": 0, "y": 0},
+					"items":
+					[
+						{
+							"name": "battleScrollSpeed1",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed1",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
 				},
-
 				{
 					"index": 2,
 					"type": "toggleButton",
-					"image": "sysob10",
-					"help": "core.help.423",
-					"position": {"x": 64, "y": 0}
+					"image": "settingsWindow/button46",
+					"help": "core.help.422",
+					"position": {"x": 48, "y": 0},
+					"items":
+					[
+						{
+							"name": "battleScrollSpeed2",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed2",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
 				},
-
 				{
 					"index": 3,
 					"type": "toggleButton",
-					"image": "sysob11",
-					"help": "core.help.424",
-					"position": {"x": 128, "y": 0}
+					"image": "settingsWindow/button46",
+					"help": "core.help.423",
+					"position": {"x":96, "y": 0},
+					"items":
+					[
+						{
+							"name": "battleScrollSpeed3",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed3",
+							"position": {"x": 0, "y": 0 }
+						}
+					]
 				},
 				{
 					"index": 6,
 					"type": "toggleButton",
-					"image": "buttons/square",
-					"help": "vcmi.battleOptions.animationsSpeed4",
-					"position": {"x": 192, "y": 0},
+					"image": "settingsWindow/button46",
+					"help": "core.help.424",
+					"position": {"x": 144, "y": 0},
 					"items":
 					[
 						{
-							"name": "battleAnimationsSpeed4",
-							"type": "label",
-							"font": "big",
-							"alignment": "center",
-							"color": "yellow",
-							"text": "vcmi.battleOptions.animationsSpeed4.hover"
+							"name": "battleScrollSpeed4",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed4",
+							"position": {"x": 0, "y": 0 }
 						}
 					]
 				},
 				{
 					"index": 12,
 					"type": "toggleButton",
-					"image": "buttons/square",
+					"image": "settingsWindow/button46",
 					"help": "vcmi.battleOptions.animationsSpeed5",
-					"position": {"x": 229, "y": 0},
+					"position": {"x": 192, "y": 0},
 					"items":
 					[
 						{
-							"name": "battleAnimationsSpeed5",
-							"type": "label",
-							"font": "big",
-							"alignment": "center",
-							"color": "yellow",
-							"text": "vcmi.battleOptions.animationsSpeed5.hover"
+							"name": "battleScrollSpeed5",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed5",
+							"position": {"x": 0, "y": 0 }
 						}
 					]
 				},
 				{
 					"index": 24,
 					"type": "toggleButton",
-					"image": "buttons/square",
+					"image": "settingsWindow/button46",
 					"help": "vcmi.battleOptions.animationsSpeed6",
-					"position": {"x": 266, "y": 0},
+					"position": {"x": 240, "y": 0},
 					"items":
 					[
 						{
-							"name": "battleAnimationsSpeed6",
-							"type": "label",
-							"font": "big",
-							"alignment": "center",
-							"color": "yellow",
-							"text": "vcmi.battleOptions.animationsSpeed6.hover"
+							"name": "battleScrollSpeed6",
+							"type": "picture",
+							"image": "settingsWindow/scrollSpeed6",
+							"position": {"x": 0, "y": 0 }
 						}
 					]
 				}
@@ -244,52 +325,58 @@
 		},
 
 		{
-			"name": "showQueueLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "vcmi.battleOptions.showQueue.hover",
-			"position": {"x": 61, "y": 393}
-		},
-
-		{
-			"name": "showQueueCheckbox",
-			"type": "toggleButton",
-			"image": "sysopchk.def",
-			"help": "vcmi.battleOptions.showQueue",
-			"position": {"x": 25, "y": 391},
-			"callback": "showQueueChanged"
+			"name": "frameQueueSize",
+			"type": "picture",
+			"image": "settingsWindow/frameStackQueue",
+			"position": {"x": 6, "y": 410 }
 		},
 
 		{
 			"name": "queueSizeLabel",
 			"type": "label",
 			"font": "medium",
-			"alignment": "left",
+			"alignment": "center",
 			"color": "yellow",
 			"text": "vcmi.battleOptions.queueSizeLabel.hover",
-			"position": {"x": 60, "y": 429}
+			"position": {"x": 170, "y": 422}
 		},
 
 		{
 			"name": "queueSizePicker",
 			"type": "toggleGroup",
-			"position": {"x": 28, "y": 450},
+			"position": {"x": 10, "y": 434},
 			"items":
 			[
 				{
-					"index": 0, //auto
+					"index": -1, //off
 					"type": "toggleButton",
-					"image": "buttons/triplewide",
+					"image": "settingsWindow/button80",
 					"help": "vcmi.battleOptions.queueSizeAutoButton",
 					"position": {"x": 0, "y": 0},
 					"items":
+					[
+						{
+							"name": "queueSizeNoneText",
+							"type": "label",
+							"font": "medium",
+							"alignment": "center",
+							"color": "yellow",
+							"text": "vcmi.battleOptions.queueSizeNoneButton.hover"
+						}
+					]
+				},
+				{
+					"index": 0, //auto
+					"type": "toggleButton",
+					"image": "settingsWindow/button80",
+					"help": "vcmi.battleOptions.queueSizeAutoButton",
+					"position": {"x": 85, "y": 0},
+					"items":
 					[
 						{
 							"name": "queueSizeAutoText",
 							"type": "label",
-							"font": "big",
+							"font": "medium",
 							"alignment": "center",
 							"color": "yellow",
 							"text": "vcmi.battleOptions.queueSizeAutoButton.hover"
@@ -299,15 +386,15 @@
 				{
 					"index": 1, //small
 					"type": "toggleButton",
-					"image": "buttons/triplewide",
+					"image": "settingsWindow/button80",
 					"help": "vcmi.battleOptions.queueSizeSmallButton",
-					"position": {"x": 113, "y": 0},
+					"position": {"x": 170, "y": 0},
 					"items":
 					[
 						{
 							"name": "queueSizeSmallText",
 							"type": "label",
-							"font": "big",
+							"font": "medium",
 							"alignment": "center",
 							"color": "yellow",
 							"text": "vcmi.battleOptions.queueSizeSmallButton.hover"
@@ -317,15 +404,15 @@
 				{
 					"index": 2, //large
 					"type": "toggleButton",
-					"image": "buttons/triplewide",
+					"image": "settingsWindow/button80",
 					"help": "vcmi.battleOptions.queueSizeBigButton",
-					"position": {"x": 226, "y": 0},
+					"position": {"x": 255, "y": 0},
 					"items":
 					[
 						{
 							"name": "queueSizeBigText",
 							"type": "label",
-							"font": "big",
+							"font": "medium",
 							"alignment": "center",
 							"color": "yellow",
 							"text": "vcmi.battleOptions.queueSizeBigButton.hover"
@@ -334,25 +421,6 @@
 				}
 			],
 			"callback": "queueSizeChanged"
-		},
-
-		{
-			"name": "skipBattleIntroMusicLabel",
-			"type": "label",
-			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "vcmi.battleOptions.skipBattleIntroMusic.hover",
-			"position": {"x": 61, "y": 502}
-		},
-
-		{
-			"name": "skipBattleIntroMusicCheckbox",
-			"type": "toggleButton",
-			"image": "sysopchk.def",
-			"help": "vcmi.battleOptions.skipBattleIntroMusic",
-			"position": {"x": 25, "y": 500},
-			"callback": "skipBattleIntroMusicChanged"
 		}
 	]
-}
+}

+ 164 - 82
config/widgets/settings/generalOptionsTab.json

@@ -2,73 +2,65 @@
 	"items":
 	[
 		{
-			"name": "topSettingsLabels",
+			"name": "lineLabelsEnd",
+			"type": "texture",
+			"image": "settingsWindow/lineHorizontal",
+			"rect": { "x" : 5, "y" : 289, "w": 365, "h": 3}
+		},
+		
+		{
+			"name": "settingGroupTitles",
 			"type": "labelGroup",
 			"font": "medium",
-			"alignment": "center",
+			"alignment": "left",
 			"color": "yellow",
 			"items":
 			[
 				{
-					"position": {"x": 122, "y": 50},
-					"text": "vcmi.systemOptions.resolutionButton.hover"
+					"position": {"x": 10, "y": 55},
+					"text": "vcmi.systemOptions.videoGroup"
 				},
 				{
-					"position": {"x": 122, "y": 135},
-					"text": "core.genrltxt.394"
+					"position": {"x": 380, "y": 55},
+					"text": "vcmi.systemOptions.audioGroup"
 				},
 				{
-					"position": {"x": 122, "y": 200},
-					"text": "core.genrltxt.395"
+					"position": {"x": 10, "y": 295},
+					"text": "vcmi.systemOptions.townsGroup"
 				}
 			]
 		},
-
-		{
-			"name": "resolutionButton",
-			"type": "button",
-			"position": {"x": 28, "y": 63},
-			"image": "buttons/resolution",
-			"help": "vcmi.systemOptions.resolutionButton",
-			"callback": "setGameResolution",
-			"hotkey": "g"
-		},
-
+/////////////////////////////////////// Left section - Video Settings
 		{
 			"name": "resolutionLabel",
 			"type": "label",
 			"font": "medium",
-			"alignment": "center",
-			"color": "yellow",
-			"position": {"x": 170, "y": 80}
-		},
-
-		{
-			"name": "musicSlider",
-			"type": "slider",
-			"position": {"x": 29, "y": 147},
-			"size": 190,
-			"style": "brown",
-			"orientation": "horizontal",
-			"itemsVisible": 0,
-			"itemsTotal": 100,
-			"callback": "setMusic"
+			"alignment": "left",
+			"color": "white",
+			"position": {"x": 45, "y": 85},
+			"text": "vcmi.systemOptions.resolutionButton.hover"
 		},
-
 		{
-			"name": "soundVolumeSlider",
-			"type": "slider",
-			"position": {"x": 29, "y": 213},
-			"size": 190,
-			"style": "brown",
-			"orientation": "horizontal",
-			"itemsVisible": 0,
-			"itemsTotal": 100,
-			"callback": "setVolume"
+			"name": "resolutionButton",
+			"type": "button",
+			"position": {"x": 10, "y": 83},
+			"image": "settingsWindow/button32",
+			"help": "vcmi.systemOptions.resolutionButton",
+			"callback": "setGameResolution",
+			"hotkey": "g",			
+			"items":
+			[
+				{
+					"name": "gearIcon",
+					"type": "picture",
+					"image": "settingsWindow/gear",
+					"position": {"x": 0, "y": 0 }
+				}
+			]
 		},
-
+		
 		{
-			"name": "bottomCheckboxesLabels",
+			"name": "topCheckboxesLabels",
 			"type": "labelGroup",
 			"font": "medium",
 			"alignment": "left",
@@ -76,74 +68,164 @@
 			"items":
 			[
 				{
-					"position": {"x": 64, "y": 278},
-					"text": "core.genrltxt.577"
-				},
-				{
-					"position": {"x": 64, "y": 314},
+					"position": {"x": 45, "y": 115},
 					"text": "vcmi.systemOptions.fullscreenButton.hover"
 				},
 				{
-					"position": {"x": 64, "y": 350},
+					"position": {"x": 45, "y": 145},
 					"text": "vcmi.systemOptions.framerateButton.hover"
-				}
-			]
-		},
+				},
+				{
+					"position": {"x": 45, "y": 175},
+					"text": "core.genrltxt.577"
+				},
 
-		{
-			"name": "spellbookAnimationCheckbox",
-			"type": "toggleButton",
-			"image": "sysopchk.def",
-			"help": "core.help.364",
-			"position": {"x": 28, "y": 276},
-			"callback": "spellbookAnimationChanged"
+			]
 		},
-
 		{
 			"name": "fullscreenCheckbox",
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "vcmi.systemOptions.fullscreenButton",
-			"position": {"x": 28, "y": 312},
+			"position": {"x": 10, "y": 113},
 			"callback": "fullscreenChanged"
 		},
-
 		{
 			"name": "framerateCheckbox",
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "vcmi.systemOptions.framerateButton",
-			"position": {"x": 28, "y": 348},
+			"position": {"x": 10, "y": 143},
 			"callback": "framerateChanged"
 		},
+		
+		{
+			"name": "spellbookAnimationCheckbox",
+			"type": "toggleButton",
+			"image": "sysopchk.def",
+			"help": "core.help.364",
+			"position": {"x": 10, "y": 173},
+			"callback": "spellbookAnimationChanged"
+		},
 
+/////////////////////////////////////// Right section - Audio Settings
 		{
-			"name": "availableCreaturesAsDwellingLabelText",
-			"type": "label",
+			"name": "settingAudioTitles",
+			"type": "labelGroup",
 			"font": "medium",
-			"alignment": "left",
-			"color": "white",
-			"text": "vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover",
-			"position": {"x": 64, "y": 386}
+			"alignment": "center",
+			"color": "yellow",
+			"items":
+			[
+				{
+					"position": {"x": 460, "y": 98},
+					"text": "core.genrltxt.394" // Music Volume
+				},
+				{
+					"position": {"x": 460, "y": 158},
+					"text": "core.genrltxt.395" // Effects volume
+				}
+			]
 		},
 
 		{
-			"name": "availableCreaturesAsDwellingLabelCheckbox",
-			"type": "toggleButton",
-			"image": "sysopchk.def",
-			"help": "vcmi.otherOptions.availableCreaturesAsDwellingLabel",
-			"position": {"x": 28, "y": 384},
-			"callback": "availableCreaturesAsDwellingLabelChanged"
+			"name": "frameMusic",
+			"type": "picture",
+			"image": "settingsWindow/frameAudio",
+			"position": {"x": 380, "y": 80 }
+		},
+		{
+			"name": "musicSlider",
+			"type": "slider",
+			"position": {"x": 385, "y": 115},
+			"size": 200,
+			"style": "brown",
+			"orientation": "horizontal",
+			"itemsVisible": 0,
+			"itemsTotal": 100,
+			"callback": "setMusic"
+		},
+		{
+			"name": "musicValueLabel",
+			"type": "label",
+			"font": "medium",
+			"alignment": "center",
+			"color": "yellow",
+			"position": {"x": 565, "y": 98}
+		},
+		
+		{
+			"name": "frameSound",
+			"type": "picture",
+			"image": "settingsWindow/frameAudio",
+			"position": {"x": 380, "y": 140 }
 		},
 
 		{
-			"name": "compactTownCreatureInfoLabel",
+			"name": "soundVolumeSlider",
+			"type": "slider",
+			"position": {"x": 385, "y": 175},
+			"size": 200,
+			"style": "brown",
+			"orientation": "horizontal",
+			"itemsVisible": 0,
+			"itemsTotal": 100,
+			"callback": "setVolume"
+		},
+		{
+			"name": "soundValueLabel",
 			"type": "label",
 			"font": "medium",
+			"alignment": "center",
+			"color": "yellow",
+			"position": {"x": 565, "y": 158}
+		},
+/////////////////////////////////////// Bottom section - Towns Settings
+		{
+			"name": "townCheckboxesLabels",
+			"type": "labelGroup",
+			"font": "medium",
 			"alignment": "left",
 			"color": "white",
-			"text": "vcmi.otherOptions.compactTownCreatureInfo.hover",
-			"position": {"x": 64, "y": 422}
+			"items":
+			[
+				{
+					"text": "vcmi.otherOptions.creatureGrowthAsDwellingLabel.hover",
+					"position": {"x": 45, "y": 325}
+				},
+				{
+					"text": "vcmi.otherOptions.availableCreaturesAsDwellingLabel.hover",
+					"position": {"x": 45, "y": 355}
+				},
+				{
+					"text": "vcmi.otherOptions.compactTownCreatureInfo.hover",
+					"position": {"x": 45, "y": 385}
+				}
+			]
+		},
+		
+		{
+			"name": "availableCreaturesAsDwellingPicker",
+			"type": "toggleGroup",
+			"position": {"x": 10, "y": 323},
+			"items":
+			[
+				{
+					"index": 0,
+					"type": "toggleButton",
+					"image": "sysopchk.def",
+					"help": "vcmi.otherOptions.creatureGrowthAsDwellingLabel",
+					"position": {"x": 0, "y": 0}
+				},
+				{
+					"index": 1,
+					"type": "toggleButton",
+					"image": "sysopchk.def",
+					"help": "vcmi.otherOptions.availableCreaturesAsDwellingLabel",
+					"position": {"x": 0, "y": 30}
+				},
+			],
+			"callback": "availableCreaturesAsDwellingChanged"
 		},
 
 		{
@@ -151,7 +233,7 @@
 			"type": "toggleButton",
 			"image": "sysopchk.def",
 			"help": "vcmi.otherOptions.compactTownCreatureInfo",
-			"position": {"x": 28, "y": 420},
+			"position": {"x": 10, "y": 383},
 			"callback": "compactTownCreatureInfoChanged"
 		}
 	]

+ 34 - 40
config/widgets/settings/settingsMainContainer.json

@@ -3,9 +3,21 @@
 	[
 		{
 			"name": "background",
-			"type": "picture",
-			"image": "vcmiSettingsWindow",
-			"position": {"x": 0, "y": 0}
+			"type": "texture",
+			"image": "DiBoxBck",
+			"rect": {"w": 600, "h": 480}
+		},
+		{
+			"name": "lineTabs",
+			"type": "texture",
+			"image": "settingsWindow/lineHorizontal",
+			"rect": { "x" : 10, "y" : 45, "w": 580, "h": 3}
+		},
+		{
+			"name": "lineColumns",
+			"type": "texture",
+			"image": "settingsWindow/lineVertical",
+			"rect": { "x" : 370, "y" : 50, "w": 3, "h": 420}
 		},
 
 		{
@@ -20,8 +32,8 @@
 				{
 					"index": 0,
 					"type": "toggleButton",
-					"position": {"x": 0, "y": 0},
-					"image": "buttons/quadwide",
+					"position": {"x": 10, "y": 5},
+					"image": "settingsWindow/button190",
 					"help": "vcmi.settingsMainWindow.generalTab",
 					"items":
 					[
@@ -39,8 +51,8 @@
 				{
 					"index": 1,
 					"type": "toggleButton",
-					"position": {"x": 150, "y": 0},
-					"image": "buttons/quadwide",
+					"position": {"x": 205, "y": 5},
+					"image": "settingsWindow/button190",
 					"help": "vcmi.settingsMainWindow.adventureTab",
 					"items":
 					[
@@ -58,8 +70,8 @@
 				{
 					"index": 2,
 					"type": "toggleButton",
-					"position": {"x": 300, "y": 0},
-					"image": "buttons/quadwide",
+					"position": {"x": 400, "y": 5},
+					"image": "settingsWindow/button190",
 					"help": "vcmi.settingsMainWindow.battleTab",
 					"items":
 					[
@@ -73,88 +85,70 @@
 						}
 					]
 				}
-				//disabled, due to being redundant for now
-//				{
-//					"index": 3,
-//					"type": "toggleButton",
-//					"position": {"x": 450, "y": 0},
-//					"image": "buttons/quadwide",
-//					"help": "vcmi.settingsMainWindow.otherTab",
-//					"items":
-//					[
-//						{
-//							"name": "otherTabButtonTitle",
-//							"type": "label",
-//							"font": "big",
-//							"alignment": "center",
-//							"color": "yellow",
-//							"text": "vcmi.settingsMainWindow.otherTab.hover"
-//						}
-//					]
-//				}
 			],
 			"callback": "activateSettingsTab"
 		},
 
+		{
+			"name": "lineButtons",
+			"type": "texture",
+			"image": "settingsWindow/lineHorizontal",
+			"rect": { "x" : 375, "y" : 289, "w": 220, "h": 3}
+		},
 		{
 			"name": "loadButton",
 			"type": "button",
-			"position": {"x": 386, "y": 383},
+			"position": {"x": 380, "y": 306},
 			"image": "SOLOAD.DEF",
 			"imageOrder": [1, 0, 2, 3],
 			"help": "core.help.321",
 			"callback": "loadGame",
 			"hotkey": "l"
 		},
-
 		{
 			"name": "saveButton",
 			"type": "button",
-			"position": {"x": 497, "y": 383},
+			"position": {"x": 490, "y": 306},
 			"image": "SOSAVE.DEF",
 			"imageOrder": [1, 0, 2, 3],
 			"help": "core.help.322",
 			"callback": "saveGame",
 			"hotkey": "s"
 		},
-
 		{
 			"name": "restartButton",
 			"type": "button",
-			"position": {"x": 386, "y": 442},
+			"position": {"x": 380, "y": 364},
 			"image": "SORSTRT.DEF",
 			"imageOrder": [1, 0, 2, 3],
 			"help": "core.help.323",
 			"callback": "restartGame",
 			"hotkey": "r"
 		},
-
 		{
 			"name": "mainMenuButton",
 			"type": "button",
-			"position": {"x": 497, "y": 442},
+			"position": {"x": 490, "y": 364},
 			"image": "SOMAIN.DEF",
 			"imageOrder": [1, 0, 2, 3],
 			"help": "core.help.320",
 			"callback": "returnToMainMenu",
 			"hotkey": "m"
 		},
-
 		{
 			"name": "quitButton",
 			"type": "button",
-			"position": {"x": 386, "y": 500},
+			"position": {"x": 380, "y": 422},
 			"image": "soquit.def",
 			"imageOrder": [1, 0, 2, 3],
 			"help": "core.help.324",
 			"callback": "quitGame",
 			"hotkey": "q"
 		},
-
 		{
 			"name": "closeSettingsButton",
 			"type": "button",
-			"position": {"x": 497, "y": 500},
+			"position": {"x": 490, "y": 422},
 			"image": "soretrn.def",
 			"imageOrder": [1, 0, 2, 3],
 			"help": "core.help.325",
@@ -162,4 +156,4 @@
 			"hotkey": ["esc", "backspace"]
 		}
 	]
-}
+}