From 16de0a666c3a5d698e1c3c7b32447b82a9209657 Mon Sep 17 00:00:00 2001
From: ecorm <9456478-ecorm@users.noreply.gitlab.com>
Date: Mon, 22 Jan 2024 21:02:50 -0400
Subject: [PATCH] Horizontal/vertical zoom for Simulator plots

ADDED: Horizontal/vertical zoom for simulator plots, via mouse wheel,
toolbar buttons, menu commands, and hotkeys.

ADDED: Simulator preferences panel, populated with mouse wheel
and trackpad settings that control pan and zoom of simulator plots.

ADDED: Zoom In/Out Horizontally/Vertically commands that can be bound
to hotkeys.

CHANGED: Simulator plot scroll wheel gestures are no longer hard-coded
and can now be configured via the new Simulator preferences panel.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/16597

Other unreported bugs that were fixed:

- Fixed wierd, jumpy simulator plot view limiting behavior.

- Fixed Zoom In Center and Zoom Out Center commands not preserving
  the simulator plot center point.

- Fixed simulator plot nudging when exported as PNGs.

- Fixed rectangular selection zoom being able to exceed simulator plot
  view limits.

Notes:

- Provided new SIM_PREFERENCES struct to be used for future
  simulator preferences set via the simulator preferences dialog.

- Bundled pre-existing EESCHEMA_SETTINGS::SIMULATOR settings into
  EESCHEMA_SETTINGS::SIMULATOR::VIEW.

- Replaced mpWindow::EnableMouseWheelPan with more general
  SetMouseWheelActions.

- Refactored and tidied up wxMathPlot's mpWindow code involved with
  fitting, zooming, and panning.

- Consolidated long lists of duplicated member variable initializers to
  a new mpWindow private delegated constructor.

- Provided provisional Zoom In/Out Horizontally/Vertically toolbar
  icons that need improvement by a graphics designer.

- Provided gitignore entries for the Qt Creator IDE
---
 .gitignore                                    |    4 +
 AUTHORS.txt                                   |    1 +
 common/bitmap_info.cpp                        |   40 +
 common/eda_base_frame.cpp                     |    1 +
 common/tool/actions.cpp                       |   30 +-
 common/widgets/mathplot.cpp                   |  714 ++++----
 eeschema/CMakeLists.txt                       |    2 +
 .../dialogs/panel_simulator_preferences.cpp   |  168 ++
 .../dialogs/panel_simulator_preferences.fbp   | 1431 +++++++++++++++++
 .../dialogs/panel_simulator_preferences.h     |   49 +
 .../panel_simulator_preferences_base.cpp      |  166 ++
 .../panel_simulator_preferences_base.h        |   72 +
 eeschema/eeschema.cpp                         |    6 +-
 eeschema/eeschema_settings.cpp                |   49 +-
 eeschema/eeschema_settings.h                  |   22 +-
 eeschema/sim/sim_plot_tab.h                   |   24 +-
 eeschema/sim/sim_preferences.h                |  101 ++
 eeschema/sim/sim_tab.cpp                      |    6 +-
 eeschema/sim/sim_tab.h                        |    5 +-
 eeschema/sim/simulator_frame.cpp              |   12 +-
 eeschema/sim/simulator_frame.h                |    4 +-
 eeschema/sim/simulator_frame_ui.cpp           |   51 +-
 eeschema/sim/simulator_frame_ui.h             |    9 +-
 eeschema/sim/toolbars_simulator_frame.cpp     |    8 +
 eeschema/tools/simulator_control.cpp          |   30 +-
 eeschema/tools/simulator_control.h            |    3 +-
 include/bitmaps/bitmaps_list.h                |    6 +-
 include/frame_type.h                          |    3 +-
 include/tool/actions.h                        |    6 +-
 include/widgets/mathplot.h                    |   96 +-
 .../png/zoom_in_horizontally_16.png           |  Bin 0 -> 272 bytes
 .../png/zoom_in_horizontally_24.png           |  Bin 0 -> 379 bytes
 .../png/zoom_in_horizontally_32.png           |  Bin 0 -> 516 bytes
 .../png/zoom_in_horizontally_48.png           |  Bin 0 -> 778 bytes
 .../png/zoom_in_horizontally_64.png           |  Bin 0 -> 1016 bytes
 .../png/zoom_in_horizontally_dark_16.png      |  Bin 0 -> 381 bytes
 .../png/zoom_in_horizontally_dark_24.png      |  Bin 0 -> 498 bytes
 .../png/zoom_in_horizontally_dark_32.png      |  Bin 0 -> 694 bytes
 .../png/zoom_in_horizontally_dark_48.png      |  Bin 0 -> 1025 bytes
 .../png/zoom_in_horizontally_dark_64.png      |  Bin 0 -> 1356 bytes
 .../bitmaps_png/png/zoom_in_vertically_16.png |  Bin 0 -> 282 bytes
 .../bitmaps_png/png/zoom_in_vertically_24.png |  Bin 0 -> 378 bytes
 .../bitmaps_png/png/zoom_in_vertically_32.png |  Bin 0 -> 523 bytes
 .../bitmaps_png/png/zoom_in_vertically_48.png |  Bin 0 -> 747 bytes
 .../bitmaps_png/png/zoom_in_vertically_64.png |  Bin 0 -> 992 bytes
 .../png/zoom_in_vertically_dark_16.png        |  Bin 0 -> 392 bytes
 .../png/zoom_in_vertically_dark_24.png        |  Bin 0 -> 502 bytes
 .../png/zoom_in_vertically_dark_32.png        |  Bin 0 -> 697 bytes
 .../png/zoom_in_vertically_dark_48.png        |  Bin 0 -> 982 bytes
 .../png/zoom_in_vertically_dark_64.png        |  Bin 0 -> 1303 bytes
 .../png/zoom_out_horizontally_16.png          |  Bin 0 -> 264 bytes
 .../png/zoom_out_horizontally_24.png          |  Bin 0 -> 367 bytes
 .../png/zoom_out_horizontally_32.png          |  Bin 0 -> 505 bytes
 .../png/zoom_out_horizontally_48.png          |  Bin 0 -> 730 bytes
 .../png/zoom_out_horizontally_64.png          |  Bin 0 -> 965 bytes
 .../png/zoom_out_horizontally_dark_16.png     |  Bin 0 -> 369 bytes
 .../png/zoom_out_horizontally_dark_24.png     |  Bin 0 -> 486 bytes
 .../png/zoom_out_horizontally_dark_32.png     |  Bin 0 -> 677 bytes
 .../png/zoom_out_horizontally_dark_48.png     |  Bin 0 -> 969 bytes
 .../png/zoom_out_horizontally_dark_64.png     |  Bin 0 -> 1281 bytes
 .../png/zoom_out_vertically_16.png            |  Bin 0 -> 270 bytes
 .../png/zoom_out_vertically_24.png            |  Bin 0 -> 380 bytes
 .../png/zoom_out_vertically_32.png            |  Bin 0 -> 501 bytes
 .../png/zoom_out_vertically_48.png            |  Bin 0 -> 695 bytes
 .../png/zoom_out_vertically_64.png            |  Bin 0 -> 915 bytes
 .../png/zoom_out_vertically_dark_16.png       |  Bin 0 -> 382 bytes
 .../png/zoom_out_vertically_dark_24.png       |  Bin 0 -> 502 bytes
 .../png/zoom_out_vertically_dark_32.png       |  Bin 0 -> 686 bytes
 .../png/zoom_out_vertically_dark_48.png       |  Bin 0 -> 920 bytes
 .../png/zoom_out_vertically_dark_64.png       |  Bin 0 -> 1208 bytes
 .../sources/dark/zoom_in_horizontally.svg     |  122 ++
 .../sources/dark/zoom_in_vertically.svg       |  122 ++
 .../sources/dark/zoom_out_horizontally.svg    |  114 ++
 .../sources/dark/zoom_out_vertically.svg      |  114 ++
 .../sources/light/zoom_in_horizontally.svg    |  122 ++
 .../sources/light/zoom_in_vertically.svg      |  122 ++
 .../sources/light/zoom_out_horizontally.svg   |  114 ++
 .../sources/light/zoom_out_vertically.svg     |  114 ++
 78 files changed, 3704 insertions(+), 359 deletions(-)
 create mode 100644 eeschema/dialogs/panel_simulator_preferences.cpp
 create mode 100644 eeschema/dialogs/panel_simulator_preferences.fbp
 create mode 100644 eeschema/dialogs/panel_simulator_preferences.h
 create mode 100644 eeschema/dialogs/panel_simulator_preferences_base.cpp
 create mode 100644 eeschema/dialogs/panel_simulator_preferences_base.h
 create mode 100644 eeschema/sim/sim_preferences.h
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_64.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_dark_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_dark_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_dark_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_dark_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_horizontally_dark_64.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_64.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_dark_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_dark_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_dark_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_dark_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_in_vertically_dark_64.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_64.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_dark_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_dark_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_dark_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_dark_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_horizontally_dark_64.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_64.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_dark_16.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_dark_24.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_dark_32.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_dark_48.png
 create mode 100644 resources/bitmaps_png/png/zoom_out_vertically_dark_64.png
 create mode 100644 resources/bitmaps_png/sources/dark/zoom_in_horizontally.svg
 create mode 100644 resources/bitmaps_png/sources/dark/zoom_in_vertically.svg
 create mode 100644 resources/bitmaps_png/sources/dark/zoom_out_horizontally.svg
 create mode 100644 resources/bitmaps_png/sources/dark/zoom_out_vertically.svg
 create mode 100644 resources/bitmaps_png/sources/light/zoom_in_horizontally.svg
 create mode 100644 resources/bitmaps_png/sources/light/zoom_in_vertically.svg
 create mode 100644 resources/bitmaps_png/sources/light/zoom_out_horizontally.svg
 create mode 100644 resources/bitmaps_png/sources/light/zoom_out_vertically.svg

diff --git a/.gitignore b/.gitignore
index 7273096724..73f4cd0ee6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -113,6 +113,10 @@ compile_commands.json
 .kdev4/
 *.kdev4
 
+# Qt Creator
+CMakeLists.txt.user
+*.autosave
+
 # Translations
 *.mo
 i18n_status.svg
diff --git a/AUTHORS.txt b/AUTHORS.txt
index 3ac31a167b..2b3cc40d88 100644
--- a/AUTHORS.txt
+++ b/AUTHORS.txt
@@ -51,6 +51,7 @@ Thomas Pointhuber <thomas.pointhuber[at]gmx-dot-at>
 Roberto Fernandez Bautista <roberto.fer.bau[at]gmail-dot-com>
 Mikołaj Wielgus <wielgusmikolaj[at]gmail-dot-com>
 Mike Williams <mike[at]mikebwilliams-dot-com>
+Emile Cormier <emile.cormier.jr[at]gmail-dot-com>
 
 See git repo on GitLab for contributors at
 https://gitlab.com/kicad/code/kicad/-/graphs/master
diff --git a/common/bitmap_info.cpp b/common/bitmap_info.cpp
index e372fc2d1c..1bda9c334b 100644
--- a/common/bitmap_info.cpp
+++ b/common/bitmap_info.cpp
@@ -755,6 +755,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_24.png" ), 24, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_24.png" ), 24, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_24.png" ), 24, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_24.png" ), 24, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_24.png" ), 24, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_24.png" ), 24, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_24.png" ), 24, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_24.png" ), 24, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_dark_24.png" ), 24, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_dark_24.png" ), 24, wxT( "dark" ) );
@@ -1157,6 +1161,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_dark_24.png" ), 24, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_dark_24.png" ), 24, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_dark_24.png" ), 24, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_dark_24.png" ), 24, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_dark_24.png" ), 24, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_dark_24.png" ), 24, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_dark_24.png" ), 24, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_dark_24.png" ), 24, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_16.png" ), 16, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_16.png" ), 16, wxT( "light" ) );
@@ -1559,6 +1567,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_16.png" ), 16, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_16.png" ), 16, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_16.png" ), 16, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_16.png" ), 16, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_16.png" ), 16, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_16.png" ), 16, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_16.png" ), 16, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_16.png" ), 16, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_dark_16.png" ), 16, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_dark_16.png" ), 16, wxT( "dark" ) );
@@ -1961,6 +1973,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_dark_16.png" ), 16, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_dark_16.png" ), 16, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_dark_16.png" ), 16, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_dark_16.png" ), 16, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_dark_16.png" ), 16, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_dark_16.png" ), 16, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_dark_16.png" ), 16, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_dark_16.png" ), 16, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_32.png" ), 32, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_32.png" ), 32, wxT( "light" ) );
@@ -2363,6 +2379,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_32.png" ), 32, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_32.png" ), 32, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_32.png" ), 32, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_32.png" ), 32, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_32.png" ), 32, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_32.png" ), 32, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_32.png" ), 32, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_32.png" ), 32, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_dark_32.png" ), 32, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_dark_32.png" ), 32, wxT( "dark" ) );
@@ -2765,6 +2785,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_dark_32.png" ), 32, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_dark_32.png" ), 32, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_dark_32.png" ), 32, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_dark_32.png" ), 32, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_dark_32.png" ), 32, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_dark_32.png" ), 32, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_dark_32.png" ), 32, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_dark_32.png" ), 32, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_48.png" ), 48, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_48.png" ), 48, wxT( "light" ) );
@@ -3167,6 +3191,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_48.png" ), 48, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_48.png" ), 48, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_48.png" ), 48, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_48.png" ), 48, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_48.png" ), 48, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_48.png" ), 48, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_48.png" ), 48, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_48.png" ), 48, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_dark_48.png" ), 48, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_dark_48.png" ), 48, wxT( "dark" ) );
@@ -3569,6 +3597,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_dark_48.png" ), 48, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_dark_48.png" ), 48, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_dark_48.png" ), 48, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_dark_48.png" ), 48, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_dark_48.png" ), 48, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_dark_48.png" ), 48, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_dark_48.png" ), 48, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_dark_48.png" ), 48, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_64.png" ), 64, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_64.png" ), 64, wxT( "light" ) );
@@ -3971,6 +4003,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_64.png" ), 64, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_64.png" ), 64, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_64.png" ), 64, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_64.png" ), 64, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_64.png" ), 64, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_64.png" ), 64, wxT( "light" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_64.png" ), 64, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_64.png" ), 64, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::about].emplace_back( BITMAPS::about, wxT( "about_dark_64.png" ), 64, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::add_aligned_dimension].emplace_back( BITMAPS::add_aligned_dimension, wxT( "add_aligned_dimension_dark_64.png" ), 64, wxT( "dark" ) );
@@ -4373,6 +4409,10 @@ void BuildBitmapInfo( std::unordered_map<BITMAPS, std::vector<BITMAP_INFO>>& aBi
     aBitmapInfoCache[BITMAPS::zoom_center_on_screen].emplace_back( BITMAPS::zoom_center_on_screen, wxT( "zoom_center_on_screen_dark_64.png" ), 64, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_in].emplace_back( BITMAPS::zoom_in, wxT( "zoom_in_dark_64.png" ), 64, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_out].emplace_back( BITMAPS::zoom_out, wxT( "zoom_out_dark_64.png" ), 64, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_horizontally].emplace_back( BITMAPS::zoom_in_horizontally, wxT( "zoom_in_horizontally_dark_64.png" ), 64, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_horizontally].emplace_back( BITMAPS::zoom_out_horizontally, wxT( "zoom_out_horizontally_dark_64.png" ), 64, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_in_vertically].emplace_back( BITMAPS::zoom_in_vertically, wxT( "zoom_in_vertically_dark_64.png" ), 64, wxT( "dark" ) );
+    aBitmapInfoCache[BITMAPS::zoom_out_vertically].emplace_back( BITMAPS::zoom_out_vertically, wxT( "zoom_out_vertically_dark_64.png" ), 64, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::zoom_selection].emplace_back( BITMAPS::zoom_selection, wxT( "zoom_selection_dark_64.png" ), 64, wxT( "dark" ) );
     aBitmapInfoCache[BITMAPS::icon_bitmap2component_32].emplace_back( BITMAPS::icon_bitmap2component_32, wxT( "icon_bitmap2component_32_32.png" ), 32, wxT( "light" ) );
     aBitmapInfoCache[BITMAPS::icon_eeschema_32].emplace_back( BITMAPS::icon_eeschema_32, wxT( "icon_eeschema_32_32.png" ), 32, wxT( "light" ) );
diff --git a/common/eda_base_frame.cpp b/common/eda_base_frame.cpp
index 441e197719..b014763608 100644
--- a/common/eda_base_frame.cpp
+++ b/common/eda_base_frame.cpp
@@ -1137,6 +1137,7 @@ void EDA_BASE_FRAME::ShowPreferences( wxString aStartPage, wxString aStartParent
             book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_ANNO_OPTIONS ), _( "Annotation Options" ) );
             book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_COLORS ), _( "Colors" ) );
             book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_FIELD_NAME_TEMPLATES ), _( "Field Name Templates" ) );
+            book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_SIMULATOR ), _( "Simulator" ) );
         }
         catch( ... )
         {
diff --git a/common/tool/actions.cpp b/common/tool/actions.cpp
index b9417347ca..bbb32aca68 100644
--- a/common/tool/actions.cpp
+++ b/common/tool/actions.cpp
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2019-2023 CERN
- * Copyright (C) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2021-2024 KiCad Developers, see AUTHORS.txt for contributors.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -568,6 +568,34 @@ TOOL_ACTION ACTIONS::zoomOutCenter( TOOL_ACTION_ARGS()
         .FriendlyName( _( "Zoom Out" ) )
         .Icon( BITMAPS::zoom_out ) );
 
+TOOL_ACTION ACTIONS::zoomInHorizontally( TOOL_ACTION_ARGS()
+        .Name( "common.Control.zoomInHorizontally" )
+        .Scope( AS_GLOBAL )
+        .FriendlyName( _( "Zoom In Horizontally" ) )
+        .Tooltip( _( "Zoom In Horizontally" ) )
+        .Icon( BITMAPS::zoom_in_horizontally ) );
+
+TOOL_ACTION ACTIONS::zoomOutHorizontally( TOOL_ACTION_ARGS()
+        .Name( "common.Control.zoomOutHorizontally" )
+        .Scope( AS_GLOBAL )
+        .FriendlyName( _( "Zoom Out Horizontally" ) )
+        .Tooltip( _( "Zoom Out Horizontally" ) )
+        .Icon( BITMAPS::zoom_out_horizontally ) );
+
+TOOL_ACTION ACTIONS::zoomInVertically( TOOL_ACTION_ARGS()
+        .Name( "common.Control.zoomInVertically" )
+        .Scope( AS_GLOBAL )
+        .FriendlyName( _( "Zoom In Vertically" ) )
+        .Tooltip( _( "Zoom In Vertically" ) )
+        .Icon( BITMAPS::zoom_in_vertically ) );
+
+TOOL_ACTION ACTIONS::zoomOutVertically( TOOL_ACTION_ARGS()
+        .Name( "common.Control.zoomOutVertically" )
+        .Scope( AS_GLOBAL )
+        .FriendlyName( _( "Zoom Out Vertically" ) )
+        .Tooltip( _( "Zoom Out Vertically" ) )
+        .Icon( BITMAPS::zoom_out_vertically ) );
+
 TOOL_ACTION ACTIONS::zoomCenter( TOOL_ACTION_ARGS()
         .Name( "common.Control.zoomCenter" )
         .Scope( AS_GLOBAL )
diff --git a/common/widgets/mathplot.cpp b/common/widgets/mathplot.cpp
index cc27b9e49a..b8fd77ce59 100644
--- a/common/widgets/mathplot.cpp
+++ b/common/widgets/mathplot.cpp
@@ -5,9 +5,9 @@
 // Maintainer:      Davide Rondini
 // Contributors:    Jose Luis Blanco, Val Greene, Maciej Suminski, Tomasz Wlostowski
 // Created:         21/07/2003
-// Last edit:       2023
+// Last edit:       2024
 // Copyright:       (c) David Schalig, Davide Rondini
-// Copyright        (c) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
+// Copyright        (c) 2021-2024 KiCad Developers, see AUTHORS.txt for contributors.
 // Licence:         wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -1367,82 +1367,14 @@ EVT_MENU( mpID_ZOOM_REDO, mpWindow::onZoomRedo )
 END_EVENT_TABLE()
 
 mpWindow::mpWindow() :
-        wxWindow(),
-        m_minX( 0.0 ),
-        m_maxX( 0.0 ),
-        m_minY( 0.0 ),
-        m_maxY( 0.0 ),
-        m_scaleX( 1.0 ),
-        m_scaleY( 1.0 ),
-        m_posX( 0.0 ),
-        m_posY( 0.0 ),
-        m_scrX( 64 ),
-        m_scrY( 64 ),
-        m_clickedX( 0 ),
-        m_clickedY( 0 ),
-        m_yLocked( false ),
-        m_desiredXmin( 0.0 ),
-        m_desiredXmax( 1.0 ),
-        m_desiredYmin( 0.0 ),
-        m_desiredYmax( 1.0 ),
-        m_marginTop( 0 ),
-        m_marginRight( 0 ),
-        m_marginBottom( 0 ),
-        m_marginLeft( 0 ),
-        m_last_lx( 0 ),
-        m_last_ly( 0 ),
-        m_buff_bmp( nullptr ),
-        m_enableDoubleBuffer( false ),
-        m_enableMouseNavigation( true ),
-        m_enableMouseWheelPan( false ),
-        m_enableLimitedView( false ),
-        m_movingInfoLayer( nullptr ),
-        m_zooming( false )
+        mpWindow( DelegatingContructorTag() )
 {
-    if( wxGraphicsContext *ctx = m_buff_dc.GetGraphicsContext() )
-    {
-        if( !ctx->SetInterpolationQuality( wxINTERPOLATION_BEST )
-                || !ctx->SetInterpolationQuality( wxINTERPOLATION_GOOD ) )
-        {
-            ctx->SetInterpolationQuality( wxINTERPOLATION_FAST );
-        }
-
-        ctx->SetAntialiasMode( wxANTIALIAS_DEFAULT );
-    }
+    initializeGraphicsContext();
 }
 
 mpWindow::mpWindow( wxWindow* parent, wxWindowID id ) :
-        wxWindow( parent, id, wxDefaultPosition, wxDefaultSize, 0, wxT( "mathplot" ) ),
-        m_minX( 0.0 ),
-        m_maxX( 0.0 ),
-        m_minY( 0.0 ),
-        m_maxY( 0.0 ),
-        m_scaleX( 1.0 ),
-        m_scaleY( 1.0 ),
-        m_posX( 0.0 ),
-        m_posY( 0.0 ),
-        m_scrX( 64 ),
-        m_scrY( 64 ),
-        m_clickedX( 0 ),
-        m_clickedY( 0 ),
-        m_yLocked( false ),
-        m_desiredXmin( 0.0 ),
-        m_desiredXmax( 1.0 ),
-        m_desiredYmin( 0.0 ),
-        m_desiredYmax( 1.0 ),
-        m_marginTop( 0 ),
-        m_marginRight( 0 ),
-        m_marginBottom( 0 ),
-        m_marginLeft( 0 ),
-        m_last_lx( 0 ),
-        m_last_ly( 0 ),
-        m_buff_bmp( nullptr ),
-        m_enableDoubleBuffer( false ),
-        m_enableMouseNavigation( true ),
-        m_enableMouseWheelPan( false ),
-        m_enableLimitedView( false ),
-        m_movingInfoLayer( nullptr ),
-        m_zooming( false )
+        mpWindow( DelegatingContructorTag(),
+                  parent, id, wxDefaultPosition, wxDefaultSize, 0, wxT( "mathplot" ) )
 {
     m_popmenu.Append( mpID_ZOOM_UNDO, _( "Undo Last Zoom" ), _( "Return zoom to level prior to last zoom action" ) );
     m_popmenu.Append( mpID_ZOOM_REDO, _( "Redo Last Zoom" ), _( "Return zoom to level prior to last zoom undo" ) );
@@ -1462,17 +1394,7 @@ mpWindow::mpWindow( wxWindow* parent, wxWindowID id ) :
     // J.L.Blanco: Eliminates the "flick" with the double buffer.
     SetBackgroundStyle( wxBG_STYLE_CUSTOM );
 
-    if( wxGraphicsContext* ctx = m_buff_dc.GetGraphicsContext() )
-    {
-        if( !ctx->SetInterpolationQuality( wxINTERPOLATION_BEST )
-                || !ctx->SetInterpolationQuality( wxINTERPOLATION_GOOD ) )
-        {
-            ctx->SetInterpolationQuality( wxINTERPOLATION_FAST );
-        }
-
-        ctx->SetAntialiasMode( wxANTIALIAS_DEFAULT );
-    }
-
+    initializeGraphicsContext();
     UpdateAll();
 }
 
@@ -1524,56 +1446,37 @@ void mpWindow::onMouseWheel( wxMouseEvent& event )
         return;
     }
 
-    int       change = event.GetWheelRotation();
-    const int axis = event.GetWheelAxis();
-    double    changeUnitsX = change / m_scaleX;
-    double    changeUnitsY = change / m_scaleY;
+    const wxMouseWheelAxis axis = event.GetWheelAxis();
+    const int modifiers = event.GetModifiers();
+    MouseWheelAction action = MouseWheelAction::NONE;
 
-    if( ( !m_enableMouseWheelPan && ( event.ControlDown() || event.ShiftDown() ) )
-            || ( m_enableMouseWheelPan && !event.ControlDown() ) )
+    if( axis == wxMOUSE_WHEEL_HORIZONTAL )
     {
-        // Scrolling
-        if( m_enableMouseWheelPan )
-        {
-            if( axis == wxMOUSE_WHEEL_HORIZONTAL || event.ShiftDown() )
-            {
-                SetXView( m_posX + changeUnitsX, m_desiredXmax + changeUnitsX,
-                          m_desiredXmin + changeUnitsX );
-            }
-            else if( !m_yLocked )
-            {
-                SetYView( m_posY + changeUnitsY, m_desiredYmax + changeUnitsY,
-                          m_desiredYmin + changeUnitsY );
-            }
-        }
-        else
-        {
-            if( event.ControlDown() )
-            {
-                SetXView( m_posX + changeUnitsX, m_desiredXmax + changeUnitsX,
-                          m_desiredXmin + changeUnitsX );
-            }
-            else if( !m_yLocked )
-            {
-                SetYView( m_posY + changeUnitsY, m_desiredYmax + changeUnitsY,
-                          m_desiredYmin + changeUnitsY );
-            }
-        }
-
-        UpdateAll();
+        action = m_mouseWheelActions.horizontal;
+    }
+    else if( modifiers == wxMOD_NONE )
+    {
+        action = m_mouseWheelActions.verticalUnmodified;
+    }
+    else if( modifiers == wxMOD_CONTROL )
+    {
+        action = m_mouseWheelActions.verticalWithCtrl;
+    }
+    else if( modifiers == wxMOD_SHIFT )
+    {
+        action = m_mouseWheelActions.verticalWithShift;
+    }
+    else if( modifiers == wxMOD_ALT )
+    {
+        action = m_mouseWheelActions.verticalWithAlt;
     }
     else
     {
-        // zoom in/out
-        wxPoint clickPt( event.GetX(), event.GetY() );
-
-        if( event.GetWheelRotation() > 0 )
-            ZoomIn( clickPt );
-        else
-            ZoomOut( clickPt );
-
+        event.Skip();
         return;
     }
+
+    PerformMouseWheelAction( event, action );
 }
 
 
@@ -1716,107 +1619,151 @@ void mpWindow::Fit()
 
 // JL
 void mpWindow::Fit( double xMin, double xMax, double yMin, double yMax,
-                    const wxCoord* printSizeX, const wxCoord* printSizeY )
+                    const wxCoord* printSizeX, const wxCoord* printSizeY,
+                    wxOrientation directions )
 {
+    const bool isPrinting = printSizeX != nullptr && printSizeY != nullptr;
+
     // Save desired borders:
-    m_desiredXmin   = xMin; m_desiredXmax = xMax;
-    m_desiredYmin   = yMin; m_desiredYmax = yMax;
+    double newDesiredXmin = xMin;
+    double newDesiredXmax = xMax;
+    double newDesiredYmin = yMin;
+    double newDesiredYmax = yMax;
 
-    // Give a small margin to plot area
-    double  xExtra = fabs( xMax - xMin ) * 0.00;
-    double  yExtra = fabs( yMax - yMin ) * 0.03;
+    // Provide a gap between the extrema of the curve and the top/bottom edges of the
+    // plot area. Not to be confused with the left/right/top/bottom margins outside the plot area.
+    const double xGap = fabs( xMax - xMin ) * m_leftRightPlotGapFactor;
+    const double yGap = fabs( yMax - yMin ) * m_topBottomPlotGapFactor;
+    xMin -= xGap;
+    xMax += xGap;
+    yMin -= yGap;
+    yMax += yGap;
 
-    xMin    -= xExtra;
-    xMax    += xExtra;
-    yMin    -= yExtra;
-    yMax    += yExtra;
+    int newScrX = m_scrX;
+    int newScrY = m_scrY;
 
-    if( printSizeX != nullptr && printSizeY != nullptr )
+    if( isPrinting )
     {
         // Printer:
-        m_scrX  = *printSizeX;
-        m_scrY  = *printSizeY;
+        newScrX = *printSizeX;
+        newScrY = *printSizeY;
     }
     else
     {
         // Normal case (screen):
-        GetClientSize( &m_scrX, &m_scrY );
+        GetClientSize( &newScrX, &newScrY );
     }
 
-    double Ax = xMax - xMin;
-    double Ay = yMax - yMin;
+    // Compute the width/height in pixels for the plot area.
+    const int plotScreenWidth  = newScrX - m_marginLeft - m_marginRight;
+    const int plotScreenHeight = newScrY - m_marginTop  - m_marginBottom;
 
-    m_scaleX = (Ax != 0) ? (m_scrX - m_marginLeft - m_marginRight)  / Ax : 1;
-    m_scaleY = (Ay != 0) ? (m_scrY - m_marginTop  - m_marginBottom) / Ay : 1;
+    // Adjust scale so that desired X/Y span plus extra gap fits in the plot area
+    double desiredSpanX = xMax - xMin;
+    double desiredSpanY = yMax - yMin;
+    double newScaleX = (desiredSpanX != 0) ? double(plotScreenWidth)  / desiredSpanX : 1;
+    double newScaleY = (desiredSpanY != 0) ? double(plotScreenHeight) / desiredSpanY : 1;
 
-    // Adjusts corner coordinates: This should be simply:
-    // m_posX = m_minX;
-    // m_posY = m_maxY;
-    // But account for centering if we have lock aspect:
-    m_posX = (xMin + xMax) / 2 - ( (m_scrX - m_marginLeft - m_marginRight) / 2 + m_marginLeft ) /
-             m_scaleX;
-    m_posY = (yMin + yMax) / 2 + ( (m_scrY - m_marginTop - m_marginBottom) / 2 + m_marginTop ) /
-             m_scaleY;
+    // Adjust corner coordinates:
+    // Upstream's aspect lock code has been removed, so no need to account for centering.
+    double newPosX = xMin - (m_marginLeft / newScaleX);
+    double newPosY = yMax + (m_marginTop / newScaleY);
 
-    // It is VERY IMPORTANT to DO NOT call Refresh if we are drawing to the printer!!
+    // Commit above changes to member variables only if enabled for their respective dimension.
+    if( ((directions & wxHORIZONTAL) != 0) || isPrinting )
+    {
+        // Don't commit the passed desired bounds when printing
+        if (!isPrinting)
+        {
+            m_desiredXmin = newDesiredXmin;
+            m_desiredXmax = newDesiredXmax;
+        }
+
+        m_scrX   = newScrX;
+        m_scaleX = newScaleX;
+        m_posX   = newPosX;
+    }
+
+    if( ((directions & wxVERTICAL) != 0) || isPrinting )
+    {
+        // Don't commit the passed desired bounds when printing
+        if (!isPrinting)
+        {
+            m_desiredYmin = newDesiredYmin;
+            m_desiredYmax = newDesiredYmax;
+        }
+
+        m_scrY   = newScrY;
+        m_scaleY = newScaleY;
+        m_posY   = newPosY;
+    }
+
+    // It is VERY IMPORTANT to NOT call Refresh if we are drawing to the printer!!
     // Otherwise, the DC dimensions will be those of the window instead of the printer device
-    if( printSizeX == nullptr || printSizeY == nullptr )
+    // The caller wanting to print should perform another Fit() afterwards to restore this
+    // object's state.
+    if( !isPrinting )
         UpdateAll();
 }
 
 
-void mpWindow::AdjustLimitedView()
+void mpWindow::AdjustLimitedView( wxOrientation directions )
 {
     if( !m_enableLimitedView )
         return;
 
-    // m_min and m_max are plot limits for curves
-    // xMin, xMax, yMin, yMax are the full limits (plot limit + margin)
-    const double    xMin    = m_minX - m_marginLeft / m_scaleX;
-    const double    xMax    = m_maxX + m_marginRight / m_scaleX;
-    const double    yMin    = m_minY - m_marginBottom / m_scaleY;
-    const double    yMax    = m_maxY + m_marginTop / m_scaleY;
+    // The m_desired* members are expressed in plot coordinates.
+    // They should be clamped against their respective m_minX, m_maxX, m_minY, m_maxY limits.
 
-    if( m_desiredXmin < xMin )
+    if( (directions & wxHORIZONTAL) != 0 )
     {
-        double diff = xMin - m_desiredXmin;
-        m_posX += diff;
-        m_desiredXmax   += diff;
-        m_desiredXmin   = xMin;
+        if( m_desiredXmin < m_minX )
+        {
+            double diff = m_minX - m_desiredXmin;
+            m_posX += diff;
+            m_desiredXmax   += diff;
+            m_desiredXmin   = m_minX;
+        }
+
+        if( m_desiredXmax > m_maxX )
+        {
+            double diff = m_desiredXmax - m_maxX;
+            m_posX -= diff;
+            m_desiredXmin   -= diff;
+            m_desiredXmax   = m_maxX;
+        }
     }
 
-    if( m_desiredXmax > xMax )
+    if( (directions & wxVERTICAL) != 0 )
     {
-        double diff = m_desiredXmax - xMax;
-        m_posX -= diff;
-        m_desiredXmin   -= diff;
-        m_desiredXmax   = xMax;
-    }
+        if( m_desiredYmin < m_minY )
+        {
+            double diff = m_minY - m_desiredYmin;
+            m_posY += diff;
+            m_desiredYmax   += diff;
+            m_desiredYmin   = m_minY;
+        }
 
-    if( m_desiredYmin < yMin )
-    {
-        double diff = yMin - m_desiredYmin;
-        m_posY += diff;
-        m_desiredYmax   += diff;
-        m_desiredYmin   = yMin;
-    }
-
-    if( m_desiredYmax > yMax )
-    {
-        double diff = m_desiredYmax - yMax;
-        m_posY -= diff;
-        m_desiredYmin   -= diff;
-        m_desiredYmax   = yMax;
+        if( m_desiredYmax > m_maxY )
+        {
+            double diff = m_desiredYmax - m_maxY;
+            m_posY -= diff;
+            m_desiredYmin   -= diff;
+            m_desiredYmax   = m_maxY;
+        }
     }
 }
 
 
 bool mpWindow::SetXView( double pos, double desiredMax, double desiredMin )
 {
+    // TODO (ecorm): Investigate X scale flickering when panning at minimum zoom level
+    // Possible cause: When AdjustLimitedView subtracts the out-of-bound delta, it does not
+    // revert back to the exact same original coordinates due to floating point rounding errors.
     m_posX = pos;
     m_desiredXmax   = desiredMax;
     m_desiredXmin   = desiredMin;
-    AdjustLimitedView();
+    AdjustLimitedView( wxHORIZONTAL );
 
     return true;
 }
@@ -1827,7 +1774,7 @@ bool mpWindow::SetYView( double pos, double desiredMax, double desiredMin )
     m_posY = pos;
     m_desiredYmax   = desiredMax;
     m_desiredYmin   = desiredMin;
-    AdjustLimitedView();
+    AdjustLimitedView( wxVERTICAL );
 
     return true;
 }
@@ -1835,116 +1782,28 @@ bool mpWindow::SetYView( double pos, double desiredMax, double desiredMin )
 
 void mpWindow::ZoomIn( const wxPoint& centerPoint )
 {
-    ZoomIn( centerPoint, zoomIncrementalFactor );
+    ZoomIn( centerPoint, zoomIncrementalFactor, wxBOTH );
 }
 
 
-void mpWindow::ZoomIn( const wxPoint& centerPoint, double zoomFactor )
+void mpWindow::ZoomIn( const wxPoint& centerPoint, double zoomFactor, wxOrientation directions )
 {
-    pushZoomUndo( { m_desiredXmin, m_desiredXmax, m_desiredYmin, m_desiredYmax } );
-
-    wxPoint c( centerPoint );
-
-    if( c == wxDefaultPosition )
-    {
-        GetClientSize( &m_scrX, &m_scrY );
-        c.x = (m_scrX - m_marginLeft - m_marginRight) / 2 + m_marginLeft;   // c.x = m_scrX/2;
-        c.y = (m_scrY - m_marginTop - m_marginBottom) / 2 - m_marginTop;    // c.y = m_scrY/2;
-    }
-    else
-    {
-        c.x = std::max( c.x, m_marginLeft );
-        c.x = std::min( c.x, m_scrX - m_marginRight );
-        c.y = std::max( c.y, m_marginTop );
-        c.y = std::min( c.y, m_scrY - m_marginBottom );
-    }
-
-    // Preserve the position of the clicked point:
-    double  prior_layer_x   = p2x( c.x );
-    double  prior_layer_y   = p2y( c.y );
-
-    // Zoom in:
-    const double MAX_SCALE = 1e6;
-    double       newScaleX = m_scaleX * zoomFactor;
-    double       newScaleY = m_scaleY * zoomFactor;
-
-    // Baaaaad things happen when you zoom in too much..
-    if( newScaleX <= MAX_SCALE && newScaleY <= MAX_SCALE )
-    {
-        m_scaleX = newScaleX;
-
-        if( !m_yLocked )
-            m_scaleY = newScaleY;
-    }
-    else
-    {
-        return;
-    }
-
-    // Adjust the new m_posx/y:
-    m_posX = prior_layer_x - c.x / m_scaleX;
-
-    if( !m_yLocked )
-        m_posY = prior_layer_y + c.y / m_scaleY;
-
-    m_desiredXmin   = m_posX;
-    m_desiredXmax   = m_posX + (m_scrX - m_marginLeft - m_marginRight) / m_scaleX;
-    m_desiredYmax   = m_posY;
-    m_desiredYmin   = m_posY - (m_scrY - m_marginTop - m_marginBottom) / m_scaleY;
-    AdjustLimitedView();
-    UpdateAll();
+    DoZoom( centerPoint, zoomFactor, directions );
 }
 
 
 void mpWindow::ZoomOut( const wxPoint& centerPoint )
 {
-    ZoomOut( centerPoint, zoomIncrementalFactor );
+    ZoomOut( centerPoint, zoomIncrementalFactor, wxBOTH );
 }
 
 
-void mpWindow::ZoomOut( const wxPoint& centerPoint, double zoomFactor )
+void mpWindow::ZoomOut( const wxPoint& centerPoint, double zoomFactor,
+                        wxOrientation directions )
 {
-    pushZoomUndo( { m_desiredXmin, m_desiredXmax, m_desiredYmin, m_desiredYmax } );
-
-    wxPoint c( centerPoint );
-
-    if( c == wxDefaultPosition )
-    {
-        GetClientSize( &m_scrX, &m_scrY );
-        c.x = (m_scrX - m_marginLeft - m_marginRight) / 2 + m_marginLeft;
-        c.y = (m_scrY - m_marginTop - m_marginBottom) / 2 - m_marginTop;
-    }
-
-    // Preserve the position of the clicked point:
-    double  prior_layer_x   = p2x( c.x );
-    double  prior_layer_y   = p2y( c.y );
-
-    // Zoom out:
-    m_scaleX = m_scaleX / zoomFactor;
-
-    if( !m_yLocked )
-        m_scaleY = m_scaleY / zoomFactor;
-
-    // Adjust the new m_posx/y:
-    m_posX = prior_layer_x - c.x / m_scaleX;
-
-    if( !m_yLocked )
-        m_posY = prior_layer_y + c.y / m_scaleY;
-
-    m_desiredXmin   = m_posX;
-    m_desiredXmax   = m_posX + (m_scrX - m_marginLeft - m_marginRight) / m_scaleX;
-    m_desiredYmax   = m_posY;
-    m_desiredYmin   = m_posY - (m_scrY - m_marginTop - m_marginBottom) / m_scaleY;
-
-    AdjustLimitedView();
-
-    if( !CheckXLimits( m_desiredXmax, m_desiredXmin )
-        || !CheckYLimits( m_desiredYmax, m_desiredYmin ) )
-    {
-        Fit();
-    }
-
-    UpdateAll();
+    if (zoomFactor == 0)
+        zoomFactor = 1.0;
+    DoZoom( centerPoint, 1.0 / zoomFactor, directions );
 }
 
 
@@ -1952,6 +1811,20 @@ void mpWindow::ZoomRect( wxPoint p0, wxPoint p1 )
 {
     pushZoomUndo( { m_desiredXmin, m_desiredXmax, m_desiredYmin, m_desiredYmax } );
 
+    // Constrain given rectangle to plot area
+    const int pMinX = m_marginLeft;
+    const int pMaxX = m_scrX - m_marginRight;
+    const int pMinY = m_marginTop;
+    const int pMaxY = m_scrY - m_marginBottom;
+    p0.x = std::max( p0.x, pMinX );
+    p0.x = std::min( p0.x, pMaxX );
+    p0.y = std::max( p0.y, pMinY );
+    p0.y = std::min( p0.y, pMaxY );
+    p1.x = std::max( p1.x, pMinX );
+    p1.x = std::min( p1.x, pMaxX );
+    p1.y = std::max( p1.y, pMinY );
+    p1.y = std::min( p1.y, pMaxY );
+
     // Compute the 2 corners in graph coordinates:
     double  p0x = p2x( p0.x );
     double  p0y = p2y( p0.y );
@@ -1971,7 +1844,16 @@ void mpWindow::ZoomRect( wxPoint p0, wxPoint p1 )
     }
 
     Fit( zoom_x_min, zoom_x_max, zoom_y_min, zoom_y_max );
+
+    // Even with the input rectangle contrained to the plot area, it's still possible for the
+    // resulting view to exceed limits when a portion of the gap is grabbed.
     AdjustLimitedView();
+
+    // These additional checks are needed because AdjustLimitedView only adjusts the position
+    // and not the scale.
+    wxOrientation directionsNeedingRefitting = ViewNeedsRefitting( wxBOTH );
+    if( directionsNeedingRefitting != 0 )
+        Fit( m_minX, m_maxX, m_minY, m_maxY, nullptr, nullptr, directionsNeedingRefitting );
 }
 
 
@@ -2043,6 +1925,18 @@ void mpWindow::OnCenter( wxCommandEvent& WXUNUSED( event ) )
 }
 
 
+mpWindow::MouseWheelActionSet mpWindow::defaultMouseWheelActions()
+{
+    MouseWheelActionSet actions;
+    actions.verticalUnmodified = MouseWheelAction::ZOOM;
+    actions.verticalWithCtrl   = MouseWheelAction::PAN_LEFT_RIGHT;
+    actions.verticalWithShift  = MouseWheelAction::PAN_UP_DOWN;
+    actions.verticalWithAlt    = MouseWheelAction::NONE;
+    actions.horizontal         = MouseWheelAction::NONE;
+    return actions;
+}
+
+
 void mpWindow::onZoomIn( wxCommandEvent& WXUNUSED( event ) )
 {
     ZoomIn( wxPoint( m_mouseMClick.x, m_mouseMClick.y ) );
@@ -2188,6 +2082,199 @@ void mpWindow::OnPaint( wxPaintEvent& WXUNUSED( event ) )
         paintDC.Blit( 0, 0, m_scrX, m_scrY, targetDC, 0, 0 );
 }
 
+void mpWindow::DoZoom( const wxPoint& centerPoint, double zoomFactor,
+                       wxOrientation directions )
+{
+    if( m_yLocked )
+    {
+        if( directions == wxVERTICAL )
+            return;
+        directions = wxHORIZONTAL;
+    }
+
+    const bool horizontally = (directions & wxHORIZONTAL) != 0;
+    const bool vertically   = (directions & wxVERTICAL) != 0;
+
+    pushZoomUndo( { m_desiredXmin, m_desiredXmax, m_desiredYmin, m_desiredYmax } );
+
+    // Preserve the position of the clicked point:
+    wxPoint c( centerPoint );
+    if( c == wxDefaultPosition )
+    {
+        GetClientSize( &m_scrX, &m_scrY );
+        c.x = (m_scrX - m_marginLeft - m_marginRight)  / 2 + m_marginLeft;
+        c.y = (m_scrY - m_marginTop  - m_marginBottom) / 2 + m_marginTop;
+    }
+    else
+    {
+        c.x = std::max( c.x, m_marginLeft );
+        c.x = std::min( c.x, m_scrX - m_marginRight );
+        c.y = std::max( c.y, m_marginTop );
+        c.y = std::min( c.y, m_scrY - m_marginBottom );
+    }
+
+    // Zoom in/out:
+    const double MAX_SCALE = 1e6;
+    const double newScaleX = horizontally ? (m_scaleX * zoomFactor) : m_scaleX;
+    const double newScaleY = vertically   ? (m_scaleY * zoomFactor) : m_scaleY;
+
+    // Baaaaad things happen when you zoom in too much..
+    if( newScaleX > MAX_SCALE || newScaleY > MAX_SCALE )
+        return;
+
+    if ( horizontally )
+    {
+        // Transform the clicked X point to layer coordinates:
+        const double prior_layer_x = p2x( c.x );
+
+        // Adjust the new X scale and plot X origin:
+        m_scaleX = newScaleX;
+        m_posX   = prior_layer_x - c.x / newScaleX;
+
+        // Recompute the desired X view extents:
+        RecomputeDesiredX( m_desiredXmin, m_desiredXmax );
+    }
+
+    if ( vertically )
+    {
+        // Transform the clicked Y point to layer coordinates:
+        const double prior_layer_y = p2y( c.y );
+
+        // Adjust the new Y scale and plot Y origin:
+        m_scaleY = newScaleY;
+        m_posY   = prior_layer_y + c.y / newScaleY;
+
+        // Recompute the desired Y view extents:
+        RecomputeDesiredY( m_desiredYmin, m_desiredYmax );
+    }
+
+    AdjustLimitedView( directions );
+
+    if (zoomFactor < 1.0)
+    {
+        // These additional checks are needed because AdjustLimitedView only adjusts the position
+        // and not the scale.
+        wxOrientation directionsNeedingRefitting = ViewNeedsRefitting( directions );
+
+        // If the view is still out-of-limits after AdjustLimitedView is called, perform a Fit
+        // along the offending dimension(s).
+        if( directionsNeedingRefitting != 0 )
+            Fit( m_minX, m_maxX, m_minY, m_maxY, nullptr, nullptr, directionsNeedingRefitting );
+    }
+
+    UpdateAll();
+}
+
+
+void mpWindow::RecomputeDesiredX( double& min, double& max )
+{
+    const int plotScreenWidth = m_scrX - m_marginLeft - m_marginRight;
+    const double plotSpanX    = plotScreenWidth / m_scaleX;
+    const double desiredSpanX = plotSpanX / ( 2*m_leftRightPlotGapFactor + 1 );
+    const double xGap         = desiredSpanX * m_leftRightPlotGapFactor;
+    min = m_posX + ( m_marginLeft / m_scaleX ) + xGap;
+    max = m_desiredXmin + desiredSpanX;
+}
+
+
+void mpWindow::RecomputeDesiredY( double& min, double& max )
+{
+    const int plotScreenHeight = m_scrY - m_marginTop  - m_marginBottom;
+    const double plotSpanY     = plotScreenHeight / m_scaleY;
+    const double desiredSpanY  = plotSpanY / ( 2*m_topBottomPlotGapFactor + 1 );
+    const double yGap          = desiredSpanY * m_topBottomPlotGapFactor;
+    max = m_posY - ( m_marginTop / m_scaleY) - yGap;
+    min = m_desiredYmax - desiredSpanY;
+}
+
+
+wxOrientation mpWindow::ViewNeedsRefitting( wxOrientation directions ) const
+{
+    if( !m_enableLimitedView )
+        return static_cast<wxOrientation>( 0 );
+
+    // Allow a gap between the extrema of the curve and the edges of the plot area. Not to be
+    // confused with the left/right/top/bottom margins outside the plot area.
+    const double xGap = fabs( m_maxX - m_minX ) * m_leftRightPlotGapFactor;
+    const double yGap = fabs( m_maxY - m_minY ) * m_topBottomPlotGapFactor;
+
+    wxOrientation result = {};
+
+    if ( (directions & wxHORIZONTAL) != 0 )
+    {
+        if ( ( m_desiredXmax > m_maxX + xGap ) || ( m_desiredXmin < m_minX - xGap ) )
+            result = static_cast<wxOrientation>( result | wxHORIZONTAL );
+    }
+
+    if ( (directions & wxVERTICAL) != 0 )
+    {
+        if ( ( m_desiredYmax > m_maxY + yGap ) || ( m_desiredYmin < m_minY - yGap ) )
+            result = static_cast<wxOrientation>( result | wxVERTICAL );
+    }
+
+    return result;
+}
+
+
+void mpWindow::PerformMouseWheelAction( wxMouseEvent& event, MouseWheelAction action )
+{
+    const int change = event.GetWheelRotation();
+    const double changeUnitsX = change / m_scaleX;
+    const double changeUnitsY = change / m_scaleY;
+    const wxPoint clickPt( event.GetX(), event.GetY() );
+
+    switch (action)
+    {
+    case MouseWheelAction::NONE:
+        break;
+
+    case MouseWheelAction::PAN_LEFT_RIGHT:
+        SetXView( m_posX + changeUnitsX, m_desiredXmax + changeUnitsX,
+                  m_desiredXmin + changeUnitsX );
+        UpdateAll();
+        break;
+
+    case MouseWheelAction::PAN_RIGHT_LEFT:
+        SetXView( m_posX - changeUnitsX, m_desiredXmax - changeUnitsX,
+                  m_desiredXmin - changeUnitsX );
+        UpdateAll();
+        break;
+
+    case MouseWheelAction::PAN_UP_DOWN:
+        if( !m_yLocked )
+        {
+            SetYView( m_posY + changeUnitsY, m_desiredYmax + changeUnitsY,
+                      m_desiredYmin + changeUnitsY );
+            UpdateAll();
+        }
+        break;
+
+    case MouseWheelAction::ZOOM:
+        if( event.GetWheelRotation() > 0 )
+            ZoomIn( clickPt );
+        else
+            ZoomOut( clickPt );
+        break;
+
+    case MouseWheelAction::ZOOM_HORIZONTALLY:
+        if( event.GetWheelRotation() > 0 )
+            ZoomIn( clickPt, zoomIncrementalFactor, wxHORIZONTAL );
+        else
+            ZoomOut( clickPt, zoomIncrementalFactor, wxHORIZONTAL );
+        break;
+
+    case MouseWheelAction::ZOOM_VERTICALLY:
+        if( event.GetWheelRotation() > 0 )
+            ZoomIn( clickPt, zoomIncrementalFactor, wxVERTICAL );
+        else
+            ZoomOut( clickPt, zoomIncrementalFactor, wxVERTICAL );
+        break;
+
+    default:
+        break;
+    }
+}
+
 
 bool mpWindow::UpdateBBox()
 {
@@ -2392,6 +2479,59 @@ void mpWindow::SetColourTheme( const wxColour& bgColour, const wxColour& drawCol
 }
 
 
+template <typename... Ts>
+mpWindow::mpWindow( DelegatingContructorTag, Ts&&... windowArgs ) :
+        wxWindow( std::forward<Ts>( windowArgs )... ),
+        m_minX( 0.0 ),
+        m_maxX( 0.0 ),
+        m_minY( 0.0 ),
+        m_maxY( 0.0 ),
+        m_scaleX( 1.0 ),
+        m_scaleY( 1.0 ),
+        m_posX( 0.0 ),
+        m_posY( 0.0 ),
+        m_scrX( 64 ),
+        m_scrY( 64 ),
+        m_clickedX( 0 ),
+        m_clickedY( 0 ),
+        m_yLocked( false ),
+        m_desiredXmin( 0.0 ),
+        m_desiredXmax( 1.0 ),
+        m_desiredYmin( 0.0 ),
+        m_desiredYmax( 1.0 ),
+        m_topBottomPlotGapFactor( 0.03 ),
+        m_leftRightPlotGapFactor( 0.0 ),
+        m_marginTop( 0 ),
+        m_marginRight( 0 ),
+        m_marginBottom( 0 ),
+        m_marginLeft( 0 ),
+        m_last_lx( 0 ),
+        m_last_ly( 0 ),
+        m_buff_bmp( nullptr ),
+        m_enableDoubleBuffer( false ),
+        m_enableMouseNavigation( true ),
+        m_enableLimitedView( false ),
+        m_mouseWheelActions( defaultMouseWheelActions() ),
+        m_movingInfoLayer( nullptr ),
+        m_zooming( false )
+{}
+
+
+void mpWindow::initializeGraphicsContext()
+{
+    if( wxGraphicsContext* ctx = m_buff_dc.GetGraphicsContext() )
+    {
+        if( !ctx->SetInterpolationQuality( wxINTERPOLATION_BEST )
+            || !ctx->SetInterpolationQuality( wxINTERPOLATION_GOOD ) )
+        {
+            ctx->SetInterpolationQuality( wxINTERPOLATION_FAST );
+        }
+
+        ctx->SetAntialiasMode( wxANTIALIAS_DEFAULT );
+    }
+}
+
+
 // -----------------------------------------------------------------------------
 // mpFXYVector implementation - by Jose Luis Blanco (AGO-2007)
 // -----------------------------------------------------------------------------
diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt
index 014ce6ca40..801970d72c 100644
--- a/eeschema/CMakeLists.txt
+++ b/eeschema/CMakeLists.txt
@@ -186,6 +186,8 @@ set( EESCHEMA_DLGS
     dialogs/panel_setup_formatting_base.cpp
     dialogs/panel_setup_pinmap.cpp
     dialogs/panel_setup_pinmap_base.cpp
+    dialogs/panel_simulator_preferences.cpp
+    dialogs/panel_simulator_preferences_base.cpp
     dialogs/panel_sym_color_settings.cpp
     dialogs/panel_sym_color_settings_base.cpp
     dialogs/panel_sym_display_options.cpp
diff --git a/eeschema/dialogs/panel_simulator_preferences.cpp b/eeschema/dialogs/panel_simulator_preferences.cpp
new file mode 100644
index 0000000000..fe5f3e9097
--- /dev/null
+++ b/eeschema/dialogs/panel_simulator_preferences.cpp
@@ -0,0 +1,168 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <type_traits>
+#include <wx/defs.h>
+#include <pgm_base.h>
+#include <settings/settings_manager.h>
+#include "panel_simulator_preferences.h"
+#include "../eeschema_settings.h"
+
+
+PANEL_SIMULATOR_PREFERENCES::PANEL_SIMULATOR_PREFERENCES( wxWindow* aParent ) :
+        PANEL_SIMULATOR_PREFERENCES_BASE( aParent )
+{
+#ifdef __WXOSX_MAC__
+    m_lblVScrollCtrl->SetLabel( _( "Cmd" ) );
+    m_lblVScrollAlt->SetLabel( _( "Option" ) );
+#endif
+
+    // Populate the wxChoice items programmatically here instead of via the form builder
+    // to ease maintenance.
+
+    static const wxString verticalChoiceItems[] =
+    {
+        _("No action"),
+        _("Pan left/right"),
+        _("Pan right/left"),
+        _("Pan up/down"),
+        _("Zoom"),
+        _("Zoom horizontally"),
+        _("Zoom vertically")
+    };
+
+    static constexpr auto ACTION_COUNT = static_cast<unsigned>( SIM_MOUSE_WHEEL_ACTION::COUNT );
+
+    static_assert( std::extent<decltype(verticalChoiceItems)>::value == ACTION_COUNT,
+                   "verticalChoiceItems size does not match VERTICAL_SCROLL_ACTION::COUNT" );
+
+    m_choiceVScrollUnmodified->Set( ACTION_COUNT, verticalChoiceItems );
+    m_choiceVScrollCtrl      ->Set( ACTION_COUNT, verticalChoiceItems );
+    m_choiceVScrollShift     ->Set( ACTION_COUNT, verticalChoiceItems );
+    m_choiceVScrollAlt       ->Set( ACTION_COUNT, verticalChoiceItems );
+
+    static const wxString horizontalChoiceItems[] =
+    {
+        _("No action"),
+        _("Pan left/right"),
+        _("Zoom horizontally")
+    };
+
+    m_choiceHScroll->Set( std::extent<decltype(horizontalChoiceItems)>::value,
+                          horizontalChoiceItems );
+}
+
+
+PANEL_SIMULATOR_PREFERENCES::~PANEL_SIMULATOR_PREFERENCES() = default;
+
+
+void PANEL_SIMULATOR_PREFERENCES::ResetPanel()
+{
+    applyMouseScrollActionsToPanel( SIM_MOUSE_WHEEL_ACTION_SET::GetMouseDefaults() );
+}
+
+
+bool PANEL_SIMULATOR_PREFERENCES::TransferDataFromWindow()
+{
+    static constexpr auto toAction =
+            []( const wxChoice* aChoice )
+            {
+                return static_cast<SIM_MOUSE_WHEEL_ACTION>( aChoice->GetSelection() );
+            };
+
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    EESCHEMA_SETTINGS* settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    SIM_MOUSE_WHEEL_ACTION_SET& actions = settings->m_Simulator.preferences.mouse_wheel_actions;
+
+    actions.vertical_unmodified = toAction( m_choiceVScrollUnmodified );
+    actions.vertical_with_ctrl  = toAction( m_choiceVScrollCtrl );
+    actions.vertical_with_shift = toAction( m_choiceVScrollShift );
+    actions.vertical_with_alt   = toAction( m_choiceVScrollAlt );
+
+    actions.horizontal = horizontalScrollSelectionToAction( m_choiceHScroll->GetSelection() );
+
+    return true;
+}
+
+
+bool PANEL_SIMULATOR_PREFERENCES::TransferDataToWindow()
+{
+    SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
+    const EESCHEMA_SETTINGS* settings = mgr.GetAppSettings<EESCHEMA_SETTINGS>();
+    applyMouseScrollActionsToPanel( settings->m_Simulator.preferences.mouse_wheel_actions );
+    return true;
+}
+
+
+void PANEL_SIMULATOR_PREFERENCES::onMouseDefaults( wxCommandEvent& )
+{
+    applyMouseScrollActionsToPanel( SIM_MOUSE_WHEEL_ACTION_SET::GetMouseDefaults() );
+}
+
+
+void PANEL_SIMULATOR_PREFERENCES::onTrackpadDefaults( wxCommandEvent& )
+{
+    applyMouseScrollActionsToPanel( SIM_MOUSE_WHEEL_ACTION_SET::GetTrackpadDefaults() );
+}
+
+
+SIM_MOUSE_WHEEL_ACTION
+PANEL_SIMULATOR_PREFERENCES::horizontalScrollSelectionToAction( int aSelection )
+{
+    switch( aSelection )
+    {
+    case 0: return SIM_MOUSE_WHEEL_ACTION::NONE;
+    case 1: return SIM_MOUSE_WHEEL_ACTION::PAN_LEFT_RIGHT;
+    case 2: return SIM_MOUSE_WHEEL_ACTION::ZOOM_HORIZONTALLY;
+    default: break;
+    }
+
+    return SIM_MOUSE_WHEEL_ACTION::NONE;
+}
+
+int PANEL_SIMULATOR_PREFERENCES::actionToHorizontalScrollSelection( SIM_MOUSE_WHEEL_ACTION a )
+{
+    switch( a )
+    {
+    case SIM_MOUSE_WHEEL_ACTION::NONE:              return 0;
+    case SIM_MOUSE_WHEEL_ACTION::PAN_LEFT_RIGHT:    return 1;
+    case SIM_MOUSE_WHEEL_ACTION::ZOOM_HORIZONTALLY: return 2;
+    default:                                        break;
+    }
+
+    return 0;
+}
+
+
+void PANEL_SIMULATOR_PREFERENCES::applyMouseScrollActionsToPanel(
+        const SIM_MOUSE_WHEEL_ACTION_SET& anActionSet )
+{
+    static constexpr auto setSelection =
+            []( wxChoice* aChoice, auto action )
+            {
+                aChoice->SetSelection( static_cast<int>( action ) );
+            };
+
+    setSelection( m_choiceVScrollUnmodified, anActionSet.vertical_unmodified );
+    setSelection( m_choiceVScrollCtrl,       anActionSet.vertical_with_ctrl );
+    setSelection( m_choiceVScrollShift,      anActionSet.vertical_with_shift );
+    setSelection( m_choiceVScrollAlt,        anActionSet.vertical_with_alt );
+
+    m_choiceHScroll->SetSelection( actionToHorizontalScrollSelection( anActionSet.horizontal ) );
+}
diff --git a/eeschema/dialogs/panel_simulator_preferences.fbp b/eeschema/dialogs/panel_simulator_preferences.fbp
new file mode 100644
index 0000000000..9dfe23403a
--- /dev/null
+++ b/eeschema/dialogs/panel_simulator_preferences.fbp
@@ -0,0 +1,1431 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<wxFormBuilder_Project>
+    <FileVersion major="1" minor="16" />
+    <object class="Project" expanded="1">
+        <property name="class_decoration">; </property>
+        <property name="code_generation">C++</property>
+        <property name="disconnect_events">1</property>
+        <property name="disconnect_mode">source_name</property>
+        <property name="disconnect_php_events">0</property>
+        <property name="disconnect_python_events">0</property>
+        <property name="embedded_files_path">res</property>
+        <property name="encoding">UTF-8</property>
+        <property name="event_generation">connect</property>
+        <property name="file">panel_simulator_preferences_base</property>
+        <property name="first_id">1000</property>
+        <property name="help_provider">none</property>
+        <property name="image_path_wrapper_function_name"></property>
+        <property name="indent_with_spaces"></property>
+        <property name="internationalize">1</property>
+        <property name="name">PANEL_SIMULATOR_PREFERENCES_BASE</property>
+        <property name="namespace"></property>
+        <property name="path">.</property>
+        <property name="precompiled_header"></property>
+        <property name="relative_path">1</property>
+        <property name="skip_lua_events">1</property>
+        <property name="skip_php_events">1</property>
+        <property name="skip_python_events">1</property>
+        <property name="ui_table">UI</property>
+        <property name="use_array_enum">0</property>
+        <property name="use_enum">1</property>
+        <property name="use_microsoft_bom">0</property>
+        <object class="Panel" expanded="1">
+            <property name="aui_managed">0</property>
+            <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
+            <property name="bg"></property>
+            <property name="context_help"></property>
+            <property name="context_menu">1</property>
+            <property name="enabled">1</property>
+            <property name="event_handler">impl_virtual</property>
+            <property name="fg"></property>
+            <property name="font"></property>
+            <property name="hidden">0</property>
+            <property name="id">wxID_ANY</property>
+            <property name="maximum_size"></property>
+            <property name="minimum_size"></property>
+            <property name="name">PANEL_SIMULATOR_PREFERENCES_BASE</property>
+            <property name="pos"></property>
+            <property name="size">-1,-1</property>
+            <property name="subclass">RESETTABLE_PANEL; widgets/resettable_panel.h; Not forward_declare</property>
+            <property name="tooltip"></property>
+            <property name="two_step_creation">0</property>
+            <property name="window_extra_style"></property>
+            <property name="window_name"></property>
+            <property name="window_style">wxTAB_TRAVERSAL</property>
+            <object class="wxBoxSizer" expanded="1">
+                <property name="minimum_size"></property>
+                <property name="name">bMainSizer</property>
+                <property name="orient">wxVERTICAL</property>
+                <property name="permission">none</property>
+                <object class="sizeritem" expanded="1">
+                    <property name="border">5</property>
+                    <property name="flag"></property>
+                    <property name="proportion">1</property>
+                    <object class="wxBoxSizer" expanded="1">
+                        <property name="minimum_size"></property>
+                        <property name="name">bScrollSizer</property>
+                        <property name="orient">wxVERTICAL</property>
+                        <property name="permission">none</property>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">13</property>
+                            <property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
+                            <property name="proportion">0</property>
+                            <object class="wxStaticText" expanded="1">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="label">Scroll Gestures</property>
+                                <property name="markup">0</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">m_lblScrollHeading</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style"></property>
+                                <property name="subclass">; ; forward_declare</property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                                <property name="wrap">-1</property>
+                            </object>
+                        </object>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">5</property>
+                            <property name="flag">wxEXPAND|wxBOTTOM</property>
+                            <property name="proportion">0</property>
+                            <object class="wxStaticLine" expanded="1">
+                                <property name="BottomDockable">1</property>
+                                <property name="LeftDockable">1</property>
+                                <property name="RightDockable">1</property>
+                                <property name="TopDockable">1</property>
+                                <property name="aui_layer"></property>
+                                <property name="aui_name"></property>
+                                <property name="aui_position"></property>
+                                <property name="aui_row"></property>
+                                <property name="best_size"></property>
+                                <property name="bg"></property>
+                                <property name="caption"></property>
+                                <property name="caption_visible">1</property>
+                                <property name="center_pane">0</property>
+                                <property name="close_button">1</property>
+                                <property name="context_help"></property>
+                                <property name="context_menu">1</property>
+                                <property name="default_pane">0</property>
+                                <property name="dock">Dock</property>
+                                <property name="dock_fixed">0</property>
+                                <property name="docking">Left</property>
+                                <property name="enabled">1</property>
+                                <property name="fg"></property>
+                                <property name="floatable">1</property>
+                                <property name="font"></property>
+                                <property name="gripper">0</property>
+                                <property name="hidden">0</property>
+                                <property name="id">wxID_ANY</property>
+                                <property name="max_size"></property>
+                                <property name="maximize_button">0</property>
+                                <property name="maximum_size"></property>
+                                <property name="min_size"></property>
+                                <property name="minimize_button">0</property>
+                                <property name="minimum_size"></property>
+                                <property name="moveable">1</property>
+                                <property name="name">m_scrollLine</property>
+                                <property name="pane_border">1</property>
+                                <property name="pane_position"></property>
+                                <property name="pane_size"></property>
+                                <property name="permission">protected</property>
+                                <property name="pin_button">1</property>
+                                <property name="pos"></property>
+                                <property name="resize">Resizable</property>
+                                <property name="show">1</property>
+                                <property name="size"></property>
+                                <property name="style">wxLI_HORIZONTAL</property>
+                                <property name="subclass">; ; forward_declare</property>
+                                <property name="toolbar_pane">0</property>
+                                <property name="tooltip"></property>
+                                <property name="window_extra_style"></property>
+                                <property name="window_name"></property>
+                                <property name="window_style"></property>
+                            </object>
+                        </object>
+                        <object class="sizeritem" expanded="1">
+                            <property name="border">10</property>
+                            <property name="flag">wxEXPAND|wxTOP|wxRIGHT</property>
+                            <property name="proportion">1</property>
+                            <object class="wxBoxSizer" expanded="1">
+                                <property name="minimum_size"></property>
+                                <property name="name">bScrollMargins</property>
+                                <property name="orient">wxHORIZONTAL</property>
+                                <property name="permission">none</property>
+                                <object class="sizeritem" expanded="1">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxEXPAND|wxLEFT</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxBoxSizer" expanded="1">
+                                        <property name="minimum_size"></property>
+                                        <property name="name">bScrollSizerLeft</property>
+                                        <property name="orient">wxVERTICAL</property>
+                                        <property name="permission">none</property>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxLEFT|wxRIGHT</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxStaticText" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">Vertical touchpad or scroll wheel movement:</property>
+                                                <property name="markup">0</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_lblVScrollMovement</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass">; ; forward_declare</property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <property name="wrap">-1</property>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="1">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxEXPAND</property>
+                                            <property name="proportion">0</property>
+                                            <object class="spacer" expanded="1">
+                                                <property name="height">10</property>
+                                                <property name="permission">protected</property>
+                                                <property name="width">0</property>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="1">
+                                            <property name="border">24</property>
+                                            <property name="flag">wxRIGHT|wxLEFT</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxFlexGridSizer" expanded="1">
+                                                <property name="cols">2</property>
+                                                <property name="flexible_direction">wxBOTH</property>
+                                                <property name="growablecols">0</property>
+                                                <property name="growablerows"></property>
+                                                <property name="hgap">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="name">fgVScroll</property>
+                                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                                <property name="permission">none</property>
+                                                <property name="rows">0</property>
+                                                <property name="vgap">0</property>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_BOTTOM</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Modifier</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblVScrollModifier</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Action</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size">-1,-1</property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblVScrollAction</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">None:</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblVScrollUnmodified</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxChoice" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_choiceVScrollUnmodified</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">0</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Ctrl:</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblVScrollCtrl</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="1">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxChoice" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_choiceVScrollCtrl</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">0</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Shift:</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblVScrollShift</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="1">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxChoice" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_choiceVScrollShift</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">0</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="0">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="0">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Alt:</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblVScrollAlt</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="1">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxChoice" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_choiceVScrollAlt</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">0</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="1">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxEXPAND</property>
+                                            <property name="proportion">0</property>
+                                            <object class="spacer" expanded="1">
+                                                <property name="height">10</property>
+                                                <property name="permission">protected</property>
+                                                <property name="width">0</property>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="1">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxALL</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxStaticText" expanded="1">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">Horizontal touchpad movement:</property>
+                                                <property name="markup">0</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_lblHScrollMovement</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass">; ; forward_declare</property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <property name="wrap">-1</property>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="1">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxEXPAND</property>
+                                            <property name="proportion">0</property>
+                                            <object class="spacer" expanded="1">
+                                                <property name="height">10</property>
+                                                <property name="permission">protected</property>
+                                                <property name="width">0</property>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="1">
+                                            <property name="border">24</property>
+                                            <property name="flag">wxRIGHT|wxLEFT</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxFlexGridSizer" expanded="1">
+                                                <property name="cols">2</property>
+                                                <property name="flexible_direction">wxBOTH</property>
+                                                <property name="growablecols">0</property>
+                                                <property name="growablerows"></property>
+                                                <property name="hgap">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="name">fgHScroll</property>
+                                                <property name="non_flexible_grow_mode">wxFLEX_GROWMODE_SPECIFIED</property>
+                                                <property name="permission">none</property>
+                                                <property name="rows">0</property>
+                                                <property name="vgap">0</property>
+                                                <object class="sizeritem" expanded="1">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_BOTTOM</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Modifier</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblHScrollModifier</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="1">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Action</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size">-1,-1</property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblHScrollAction</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="1">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxStaticText" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="label">Any:</property>
+                                                        <property name="markup">0</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_lblHScrollAny</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                        <property name="wrap">-1</property>
+                                                    </object>
+                                                </object>
+                                                <object class="sizeritem" expanded="1">
+                                                    <property name="border">5</property>
+                                                    <property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
+                                                    <property name="proportion">0</property>
+                                                    <object class="wxChoice" expanded="1">
+                                                        <property name="BottomDockable">1</property>
+                                                        <property name="LeftDockable">1</property>
+                                                        <property name="RightDockable">1</property>
+                                                        <property name="TopDockable">1</property>
+                                                        <property name="aui_layer"></property>
+                                                        <property name="aui_name"></property>
+                                                        <property name="aui_position"></property>
+                                                        <property name="aui_row"></property>
+                                                        <property name="best_size"></property>
+                                                        <property name="bg"></property>
+                                                        <property name="caption"></property>
+                                                        <property name="caption_visible">1</property>
+                                                        <property name="center_pane">0</property>
+                                                        <property name="choices"></property>
+                                                        <property name="close_button">1</property>
+                                                        <property name="context_help"></property>
+                                                        <property name="context_menu">1</property>
+                                                        <property name="default_pane">0</property>
+                                                        <property name="dock">Dock</property>
+                                                        <property name="dock_fixed">0</property>
+                                                        <property name="docking">Left</property>
+                                                        <property name="enabled">1</property>
+                                                        <property name="fg"></property>
+                                                        <property name="floatable">1</property>
+                                                        <property name="font"></property>
+                                                        <property name="gripper">0</property>
+                                                        <property name="hidden">0</property>
+                                                        <property name="id">wxID_ANY</property>
+                                                        <property name="max_size"></property>
+                                                        <property name="maximize_button">0</property>
+                                                        <property name="maximum_size"></property>
+                                                        <property name="min_size"></property>
+                                                        <property name="minimize_button">0</property>
+                                                        <property name="minimum_size"></property>
+                                                        <property name="moveable">1</property>
+                                                        <property name="name">m_choiceHScroll</property>
+                                                        <property name="pane_border">1</property>
+                                                        <property name="pane_position"></property>
+                                                        <property name="pane_size"></property>
+                                                        <property name="permission">protected</property>
+                                                        <property name="pin_button">1</property>
+                                                        <property name="pos"></property>
+                                                        <property name="resize">Resizable</property>
+                                                        <property name="selection">0</property>
+                                                        <property name="show">1</property>
+                                                        <property name="size"></property>
+                                                        <property name="style"></property>
+                                                        <property name="subclass">; ; forward_declare</property>
+                                                        <property name="toolbar_pane">0</property>
+                                                        <property name="tooltip"></property>
+                                                        <property name="validator_data_type"></property>
+                                                        <property name="validator_style">wxFILTER_NONE</property>
+                                                        <property name="validator_type">wxDefaultValidator</property>
+                                                        <property name="validator_variable"></property>
+                                                        <property name="window_extra_style"></property>
+                                                        <property name="window_name"></property>
+                                                        <property name="window_style"></property>
+                                                    </object>
+                                                </object>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                                <object class="sizeritem" expanded="1">
+                                    <property name="border">5</property>
+                                    <property name="flag">wxTOP|wxLEFT|wxEXPAND</property>
+                                    <property name="proportion">0</property>
+                                    <object class="wxBoxSizer" expanded="1">
+                                        <property name="minimum_size"></property>
+                                        <property name="name">bScrollSizerRight</property>
+                                        <property name="orient">wxVERTICAL</property>
+                                        <property name="permission">none</property>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxALL|wxEXPAND</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxButton" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="auth_needed">0</property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="bitmap"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="current"></property>
+                                                <property name="default">0</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="disabled"></property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="focus"></property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">Reset to Mouse Defaults</property>
+                                                <property name="margins"></property>
+                                                <property name="markup">0</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_btnMouseDefaults</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="position"></property>
+                                                <property name="pressed"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass">; ; forward_declare</property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="validator_data_type"></property>
+                                                <property name="validator_style">wxFILTER_NONE</property>
+                                                <property name="validator_type">wxDefaultValidator</property>
+                                                <property name="validator_variable"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <event name="OnButtonClick">onMouseDefaults</event>
+                                            </object>
+                                        </object>
+                                        <object class="sizeritem" expanded="0">
+                                            <property name="border">5</property>
+                                            <property name="flag">wxALL|wxEXPAND</property>
+                                            <property name="proportion">0</property>
+                                            <object class="wxButton" expanded="0">
+                                                <property name="BottomDockable">1</property>
+                                                <property name="LeftDockable">1</property>
+                                                <property name="RightDockable">1</property>
+                                                <property name="TopDockable">1</property>
+                                                <property name="aui_layer"></property>
+                                                <property name="aui_name"></property>
+                                                <property name="aui_position"></property>
+                                                <property name="aui_row"></property>
+                                                <property name="auth_needed">0</property>
+                                                <property name="best_size"></property>
+                                                <property name="bg"></property>
+                                                <property name="bitmap"></property>
+                                                <property name="caption"></property>
+                                                <property name="caption_visible">1</property>
+                                                <property name="center_pane">0</property>
+                                                <property name="close_button">1</property>
+                                                <property name="context_help"></property>
+                                                <property name="context_menu">1</property>
+                                                <property name="current"></property>
+                                                <property name="default">0</property>
+                                                <property name="default_pane">0</property>
+                                                <property name="disabled"></property>
+                                                <property name="dock">Dock</property>
+                                                <property name="dock_fixed">0</property>
+                                                <property name="docking">Left</property>
+                                                <property name="enabled">1</property>
+                                                <property name="fg"></property>
+                                                <property name="floatable">1</property>
+                                                <property name="focus"></property>
+                                                <property name="font"></property>
+                                                <property name="gripper">0</property>
+                                                <property name="hidden">0</property>
+                                                <property name="id">wxID_ANY</property>
+                                                <property name="label">Reset to Trackpad Defaults</property>
+                                                <property name="margins"></property>
+                                                <property name="markup">0</property>
+                                                <property name="max_size"></property>
+                                                <property name="maximize_button">0</property>
+                                                <property name="maximum_size"></property>
+                                                <property name="min_size"></property>
+                                                <property name="minimize_button">0</property>
+                                                <property name="minimum_size"></property>
+                                                <property name="moveable">1</property>
+                                                <property name="name">m_btnTrackpadDefaults</property>
+                                                <property name="pane_border">1</property>
+                                                <property name="pane_position"></property>
+                                                <property name="pane_size"></property>
+                                                <property name="permission">protected</property>
+                                                <property name="pin_button">1</property>
+                                                <property name="pos"></property>
+                                                <property name="position"></property>
+                                                <property name="pressed"></property>
+                                                <property name="resize">Resizable</property>
+                                                <property name="show">1</property>
+                                                <property name="size"></property>
+                                                <property name="style"></property>
+                                                <property name="subclass">; ; forward_declare</property>
+                                                <property name="toolbar_pane">0</property>
+                                                <property name="tooltip"></property>
+                                                <property name="validator_data_type"></property>
+                                                <property name="validator_style">wxFILTER_NONE</property>
+                                                <property name="validator_type">wxDefaultValidator</property>
+                                                <property name="validator_variable"></property>
+                                                <property name="window_extra_style"></property>
+                                                <property name="window_name"></property>
+                                                <property name="window_style"></property>
+                                                <event name="OnButtonClick">onTrackpadDefaults</event>
+                                            </object>
+                                        </object>
+                                    </object>
+                                </object>
+                            </object>
+                        </object>
+                    </object>
+                </object>
+            </object>
+        </object>
+    </object>
+</wxFormBuilder_Project>
diff --git a/eeschema/dialogs/panel_simulator_preferences.h b/eeschema/dialogs/panel_simulator_preferences.h
new file mode 100644
index 0000000000..5704f536ab
--- /dev/null
+++ b/eeschema/dialogs/panel_simulator_preferences.h
@@ -0,0 +1,49 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef KICAD_PANEL_SIMULATOR_PREFERENCES_H
+#define KICAD_PANEL_SIMULATOR_PREFERENCES_H
+
+#include "panel_simulator_preferences_base.h"
+#include <sim/sim_preferences.h>
+
+
+class PANEL_SIMULATOR_PREFERENCES : public PANEL_SIMULATOR_PREFERENCES_BASE
+{
+public:
+    PANEL_SIMULATOR_PREFERENCES( wxWindow* aParent );
+    ~PANEL_SIMULATOR_PREFERENCES();
+    void ResetPanel() override;
+
+protected:
+    bool TransferDataFromWindow() override;
+    bool TransferDataToWindow() override;
+    void onMouseDefaults( wxCommandEvent& ) override;
+    void onTrackpadDefaults( wxCommandEvent& ) override;
+
+private:
+    static SIM_MOUSE_WHEEL_ACTION horizontalScrollSelectionToAction( int aSelection );
+
+    static int actionToHorizontalScrollSelection( SIM_MOUSE_WHEEL_ACTION anAction );
+
+    void applyMouseScrollActionsToPanel( const SIM_MOUSE_WHEEL_ACTION_SET& anActionSet );
+};
+
+
+#endif
diff --git a/eeschema/dialogs/panel_simulator_preferences_base.cpp b/eeschema/dialogs/panel_simulator_preferences_base.cpp
new file mode 100644
index 0000000000..f1c0dcbd6b
--- /dev/null
+++ b/eeschema/dialogs/panel_simulator_preferences_base.cpp
@@ -0,0 +1,166 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "panel_simulator_preferences_base.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+PANEL_SIMULATOR_PREFERENCES_BASE::PANEL_SIMULATOR_PREFERENCES_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : RESETTABLE_PANEL( parent, id, pos, size, style, name )
+{
+	wxBoxSizer* bMainSizer;
+	bMainSizer = new wxBoxSizer( wxVERTICAL );
+
+	wxBoxSizer* bScrollSizer;
+	bScrollSizer = new wxBoxSizer( wxVERTICAL );
+
+	m_lblScrollHeading = new wxStaticText( this, wxID_ANY, _("Scroll Gestures"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblScrollHeading->Wrap( -1 );
+	bScrollSizer->Add( m_lblScrollHeading, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 13 );
+
+	m_scrollLine = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
+	bScrollSizer->Add( m_scrollLine, 0, wxEXPAND|wxBOTTOM, 5 );
+
+	wxBoxSizer* bScrollMargins;
+	bScrollMargins = new wxBoxSizer( wxHORIZONTAL );
+
+	wxBoxSizer* bScrollSizerLeft;
+	bScrollSizerLeft = new wxBoxSizer( wxVERTICAL );
+
+	m_lblVScrollMovement = new wxStaticText( this, wxID_ANY, _("Vertical touchpad or scroll wheel movement:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblVScrollMovement->Wrap( -1 );
+	bScrollSizerLeft->Add( m_lblVScrollMovement, 0, wxLEFT|wxRIGHT, 5 );
+
+
+	bScrollSizerLeft->Add( 0, 10, 0, wxEXPAND, 5 );
+
+	wxFlexGridSizer* fgVScroll;
+	fgVScroll = new wxFlexGridSizer( 0, 2, 0, 0 );
+	fgVScroll->AddGrowableCol( 0 );
+	fgVScroll->SetFlexibleDirection( wxBOTH );
+	fgVScroll->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_lblVScrollModifier = new wxStaticText( this, wxID_ANY, _("Modifier"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblVScrollModifier->Wrap( -1 );
+	fgVScroll->Add( m_lblVScrollModifier, 0, wxALIGN_BOTTOM, 5 );
+
+	m_lblVScrollAction = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblVScrollAction->Wrap( -1 );
+	fgVScroll->Add( m_lblVScrollAction, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 5 );
+
+	m_lblVScrollUnmodified = new wxStaticText( this, wxID_ANY, _("None:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblVScrollUnmodified->Wrap( -1 );
+	fgVScroll->Add( m_lblVScrollUnmodified, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+	wxArrayString m_choiceVScrollUnmodifiedChoices;
+	m_choiceVScrollUnmodified = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVScrollUnmodifiedChoices, 0 );
+	m_choiceVScrollUnmodified->SetSelection( 0 );
+	fgVScroll->Add( m_choiceVScrollUnmodified, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_lblVScrollCtrl = new wxStaticText( this, wxID_ANY, _("Ctrl:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblVScrollCtrl->Wrap( -1 );
+	fgVScroll->Add( m_lblVScrollCtrl, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+	wxArrayString m_choiceVScrollCtrlChoices;
+	m_choiceVScrollCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVScrollCtrlChoices, 0 );
+	m_choiceVScrollCtrl->SetSelection( 0 );
+	fgVScroll->Add( m_choiceVScrollCtrl, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_lblVScrollShift = new wxStaticText( this, wxID_ANY, _("Shift:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblVScrollShift->Wrap( -1 );
+	fgVScroll->Add( m_lblVScrollShift, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+	wxArrayString m_choiceVScrollShiftChoices;
+	m_choiceVScrollShift = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVScrollShiftChoices, 0 );
+	m_choiceVScrollShift->SetSelection( 0 );
+	fgVScroll->Add( m_choiceVScrollShift, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+	m_lblVScrollAlt = new wxStaticText( this, wxID_ANY, _("Alt:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblVScrollAlt->Wrap( -1 );
+	fgVScroll->Add( m_lblVScrollAlt, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+	wxArrayString m_choiceVScrollAltChoices;
+	m_choiceVScrollAlt = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceVScrollAltChoices, 0 );
+	m_choiceVScrollAlt->SetSelection( 0 );
+	fgVScroll->Add( m_choiceVScrollAlt, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+	bScrollSizerLeft->Add( fgVScroll, 0, wxRIGHT|wxLEFT, 24 );
+
+
+	bScrollSizerLeft->Add( 0, 10, 0, wxEXPAND, 5 );
+
+	m_lblHScrollMovement = new wxStaticText( this, wxID_ANY, _("Horizontal touchpad movement:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblHScrollMovement->Wrap( -1 );
+	bScrollSizerLeft->Add( m_lblHScrollMovement, 0, wxALL, 5 );
+
+
+	bScrollSizerLeft->Add( 0, 10, 0, wxEXPAND, 5 );
+
+	wxFlexGridSizer* fgHScroll;
+	fgHScroll = new wxFlexGridSizer( 0, 2, 0, 0 );
+	fgHScroll->AddGrowableCol( 0 );
+	fgHScroll->SetFlexibleDirection( wxBOTH );
+	fgHScroll->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
+
+	m_lblHScrollModifier = new wxStaticText( this, wxID_ANY, _("Modifier"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblHScrollModifier->Wrap( -1 );
+	fgHScroll->Add( m_lblHScrollModifier, 0, wxALIGN_BOTTOM, 5 );
+
+	m_lblHScrollAction = new wxStaticText( this, wxID_ANY, _("Action"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblHScrollAction->Wrap( -1 );
+	fgHScroll->Add( m_lblHScrollAction, 0, wxALIGN_CENTER_HORIZONTAL|wxALIGN_BOTTOM, 5 );
+
+	m_lblHScrollAny = new wxStaticText( this, wxID_ANY, _("Any:"), wxDefaultPosition, wxDefaultSize, 0 );
+	m_lblHScrollAny->Wrap( -1 );
+	fgHScroll->Add( m_lblHScrollAny, 0, wxALIGN_CENTER_VERTICAL, 5 );
+
+	wxArrayString m_choiceHScrollChoices;
+	m_choiceHScroll = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceHScrollChoices, 0 );
+	m_choiceHScroll->SetSelection( 0 );
+	fgHScroll->Add( m_choiceHScroll, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
+
+
+	bScrollSizerLeft->Add( fgHScroll, 0, wxRIGHT|wxLEFT, 24 );
+
+
+	bScrollMargins->Add( bScrollSizerLeft, 0, wxEXPAND|wxLEFT, 5 );
+
+	wxBoxSizer* bScrollSizerRight;
+	bScrollSizerRight = new wxBoxSizer( wxVERTICAL );
+
+	m_btnMouseDefaults = new wxButton( this, wxID_ANY, _("Reset to Mouse Defaults"), wxDefaultPosition, wxDefaultSize, 0 );
+	bScrollSizerRight->Add( m_btnMouseDefaults, 0, wxALL|wxEXPAND, 5 );
+
+	m_btnTrackpadDefaults = new wxButton( this, wxID_ANY, _("Reset to Trackpad Defaults"), wxDefaultPosition, wxDefaultSize, 0 );
+	bScrollSizerRight->Add( m_btnTrackpadDefaults, 0, wxALL|wxEXPAND, 5 );
+
+
+	bScrollMargins->Add( bScrollSizerRight, 0, wxTOP|wxLEFT|wxEXPAND, 5 );
+
+
+	bScrollSizer->Add( bScrollMargins, 1, wxEXPAND|wxTOP|wxRIGHT, 10 );
+
+
+	bMainSizer->Add( bScrollSizer, 1, 0, 5 );
+
+
+	this->SetSizer( bMainSizer );
+	this->Layout();
+	bMainSizer->Fit( this );
+
+	// Connect Events
+	m_btnMouseDefaults->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SIMULATOR_PREFERENCES_BASE::onMouseDefaults ), NULL, this );
+	m_btnTrackpadDefaults->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SIMULATOR_PREFERENCES_BASE::onTrackpadDefaults ), NULL, this );
+}
+
+PANEL_SIMULATOR_PREFERENCES_BASE::~PANEL_SIMULATOR_PREFERENCES_BASE()
+{
+	// Disconnect Events
+	m_btnMouseDefaults->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SIMULATOR_PREFERENCES_BASE::onMouseDefaults ), NULL, this );
+	m_btnTrackpadDefaults->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_SIMULATOR_PREFERENCES_BASE::onTrackpadDefaults ), NULL, this );
+
+}
diff --git a/eeschema/dialogs/panel_simulator_preferences_base.h b/eeschema/dialogs/panel_simulator_preferences_base.h
new file mode 100644
index 0000000000..945c07ba1c
--- /dev/null
+++ b/eeschema/dialogs/panel_simulator_preferences_base.h
@@ -0,0 +1,72 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include <wx/artprov.h>
+#include <wx/xrc/xmlres.h>
+#include <wx/intl.h>
+#include "widgets/resettable_panel.h"
+#include <wx/string.h>
+#include <wx/stattext.h>
+#include <wx/gdicmn.h>
+#include <wx/font.h>
+#include <wx/colour.h>
+#include <wx/settings.h>
+#include <wx/statline.h>
+#include <wx/choice.h>
+#include <wx/sizer.h>
+#include <wx/button.h>
+#include <wx/bitmap.h>
+#include <wx/image.h>
+#include <wx/icon.h>
+#include <wx/panel.h>
+
+///////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_SIMULATOR_PREFERENCES_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_SIMULATOR_PREFERENCES_BASE : public RESETTABLE_PANEL
+{
+	private:
+
+	protected:
+		wxStaticText* m_lblScrollHeading;
+		wxStaticLine* m_scrollLine;
+		wxStaticText* m_lblVScrollMovement;
+		wxStaticText* m_lblVScrollModifier;
+		wxStaticText* m_lblVScrollAction;
+		wxStaticText* m_lblVScrollUnmodified;
+		wxChoice* m_choiceVScrollUnmodified;
+		wxStaticText* m_lblVScrollCtrl;
+		wxChoice* m_choiceVScrollCtrl;
+		wxStaticText* m_lblVScrollShift;
+		wxChoice* m_choiceVScrollShift;
+		wxStaticText* m_lblVScrollAlt;
+		wxChoice* m_choiceVScrollAlt;
+		wxStaticText* m_lblHScrollMovement;
+		wxStaticText* m_lblHScrollModifier;
+		wxStaticText* m_lblHScrollAction;
+		wxStaticText* m_lblHScrollAny;
+		wxChoice* m_choiceHScroll;
+		wxButton* m_btnMouseDefaults;
+		wxButton* m_btnTrackpadDefaults;
+
+		// Virtual event handlers, override them in your derived class
+		virtual void onMouseDefaults( wxCommandEvent& event ) { event.Skip(); }
+		virtual void onTrackpadDefaults( wxCommandEvent& event ) { event.Skip(); }
+
+
+	public:
+
+		PANEL_SIMULATOR_PREFERENCES_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+		~PANEL_SIMULATOR_PREFERENCES_BASE();
+
+};
+
diff --git a/eeschema/eeschema.cpp b/eeschema/eeschema.cpp
index 006bda132b..3a9c131e69 100644
--- a/eeschema/eeschema.cpp
+++ b/eeschema/eeschema.cpp
@@ -3,7 +3,7 @@
  *
  * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com
  * Copyright (C) 2008 Wayne Stambaugh <stambaughw@gmail.com>
- * Copyright (C) 2004-2023 KiCad Developers, see change_log.txt for contributors.
+ * Copyright (C) 2004-2024 KiCad Developers, see change_log.txt for contributors.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -39,6 +39,7 @@
 #include <symbol_lib_table.h>
 #include <dialogs/dialog_global_sym_lib_table_config.h>
 #include <dialogs/panel_grid_settings.h>
+#include <dialogs/panel_simulator_preferences.h>
 #include <dialogs/panel_sym_lib_table.h>
 #include <kiway.h>
 #include <settings/settings_manager.h>
@@ -294,6 +295,9 @@ static struct IFACE : public KIFACE_BASE, public UNITS_PROVIDER
         case PANEL_SCH_FIELD_NAME_TEMPLATES:
             return new PANEL_TEMPLATE_FIELDNAMES( aParent, nullptr );
 
+        case PANEL_SCH_SIMULATOR:
+            return new PANEL_SIMULATOR_PREFERENCES( aParent );
+
         default:
             return nullptr;
         }
diff --git a/eeschema/eeschema_settings.cpp b/eeschema/eeschema_settings.cpp
index 941aa39ea8..0a74b561b7 100644
--- a/eeschema/eeschema_settings.cpp
+++ b/eeschema/eeschema_settings.cpp
@@ -1,7 +1,7 @@
 /*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
-* Copyright (C) 2020-2023 KiCad Developers, see AUTHORS.txt for contributors.
+* Copyright (C) 2020-2024 KiCad Developers, see AUTHORS.txt for contributors.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
@@ -531,22 +531,57 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
             &m_Simulator.window.perspective, "" ) );
 
     m_params.emplace_back( new PARAM<int>( "simulator.plot_panel_width",
-            &m_Simulator.plot_panel_width, 0 ) );
+        &m_Simulator.view.plot_panel_width, 0 ) );
 
     m_params.emplace_back( new PARAM<int>( "simulator.plot_panel_height",
-            &m_Simulator.plot_panel_height, 0 ) );
+        &m_Simulator.view.plot_panel_height, 0 ) );
 
     m_params.emplace_back( new PARAM<int>( "simulator.signal_panel_height",
-            &m_Simulator.signal_panel_height, 0 ) );
+        &m_Simulator.view.signal_panel_height, 0 ) );
 
     m_params.emplace_back( new PARAM<int>( "simulator.cursors_panel_height",
-            &m_Simulator.cursors_panel_height, 0 ) );
+        &m_Simulator.view.cursors_panel_height, 0 ) );
 
     m_params.emplace_back( new PARAM<int>( "simulator.measurements_panel_height",
-            &m_Simulator.measurements_panel_height, 0 ) );
+        &m_Simulator.view.measurements_panel_height, 0 ) );
 
     m_params.emplace_back( new PARAM<bool>( "simulator.white_background",
-            &m_Simulator.white_background, false ) );
+        &m_Simulator.view.white_background, false ) );
+
+    m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>(
+            "simulator.mouse_wheel_actions.vertical_unmodified",
+            &m_Simulator.preferences.mouse_wheel_actions.vertical_unmodified,
+            SIM_MOUSE_WHEEL_ACTION::ZOOM,
+            SIM_MOUSE_WHEEL_ACTION::NONE,
+            SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY ) );
+
+    m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>(
+            "simulator.mouse_wheel_actions.vertical_with_ctrl",
+            &m_Simulator.preferences.mouse_wheel_actions.vertical_with_ctrl,
+            SIM_MOUSE_WHEEL_ACTION::PAN_LEFT_RIGHT,
+            SIM_MOUSE_WHEEL_ACTION::NONE,
+            SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY ) );
+
+    m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>(
+            "simulator.mouse_wheel_actions.vertical_with_shift",
+            &m_Simulator.preferences.mouse_wheel_actions.vertical_with_shift,
+            SIM_MOUSE_WHEEL_ACTION::PAN_UP_DOWN,
+            SIM_MOUSE_WHEEL_ACTION::NONE,
+            SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY) );
+
+    m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>(
+            "simulator.mouse_wheel_actions.vertical_with_alt",
+            &m_Simulator.preferences.mouse_wheel_actions.vertical_with_alt,
+            SIM_MOUSE_WHEEL_ACTION::NONE,
+            SIM_MOUSE_WHEEL_ACTION::NONE,
+            SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY) );
+
+    m_params.emplace_back( new PARAM_ENUM<SIM_MOUSE_WHEEL_ACTION>(
+            "simulator.mouse_wheel_actions.horizontal",
+            &m_Simulator.preferences.mouse_wheel_actions.horizontal,
+            SIM_MOUSE_WHEEL_ACTION::NONE,
+            SIM_MOUSE_WHEEL_ACTION::NONE,
+            SIM_MOUSE_WHEEL_ACTION::ZOOM_VERTICALLY) );
 
     m_params.emplace_back( new PARAM<int>( "symbol_chooser.sash_pos_h",
             &m_SymChooserPanel.sash_pos_h, -1 ) );
diff --git a/eeschema/eeschema_settings.h b/eeschema/eeschema_settings.h
index 425e9b6d6d..374d144dcd 100644
--- a/eeschema/eeschema_settings.h
+++ b/eeschema/eeschema_settings.h
@@ -1,7 +1,7 @@
 /*
 * This program source code file is part of KiCad, a free EDA CAD application.
 *
-* Copyright (C) 2020-2023 KiCad Developers, see AUTHORS.txt for contributors.
+* Copyright (C) 2020-2024 KiCad Developers, see AUTHORS.txt for contributors.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
@@ -27,7 +27,7 @@
 #include <wx/aui/framemanager.h>
 
 #include <settings/app_settings.h>
-
+#include <sim/sim_preferences.h>
 
 using KIGFX::COLOR4D;
 
@@ -278,13 +278,19 @@ public:
 
     struct SIMULATOR
     {
-        int plot_panel_width;
-        int plot_panel_height;
-        int signal_panel_height;
-        int cursors_panel_height;
-        int             measurements_panel_height;
-        bool white_background;
+        struct VIEW
+        {
+            int plot_panel_width;
+            int plot_panel_height;
+            int signal_panel_height;
+            int cursors_panel_height;
+            int measurements_panel_height;
+            bool white_background;
+        };
+
+        VIEW view;
         WINDOW_SETTINGS window;
+        SIM_PREFERENCES preferences;
     };
 
     struct FIND_REPLACE_EXTRA
diff --git a/eeschema/sim/sim_plot_tab.h b/eeschema/sim/sim_plot_tab.h
index aa6c5b475e..40d76c45bf 100644
--- a/eeschema/sim/sim_plot_tab.h
+++ b/eeschema/sim/sim_plot_tab.h
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2016-2023 CERN
- * Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2016-2024 KiCad Developers, see AUTHORS.txt for contributors.
  *
  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
  * @author Maciej Suminski <maciej.suminski@cern.ch>
@@ -195,6 +195,12 @@ public:
 
     virtual ~SIM_PLOT_TAB();
 
+    void ApplyPreferences( const SIM_PREFERENCES& aPrefs ) override
+    {
+        m_plotWin->SetMouseWheelActions(
+                convertMouseWheelActions( aPrefs.mouse_wheel_actions ) );
+    }
+
     wxString GetLabelX() const
     {
         return m_axis_x ? m_axis_x->GetName() : wxString( wxS( "" ) );
@@ -359,6 +365,22 @@ public:
     wxPoint m_LastLegendPosition;
 
 private:
+    static mpWindow::MouseWheelActionSet
+    convertMouseWheelActions(const SIM_MOUSE_WHEEL_ACTION_SET& s)
+    {
+        static_assert( static_cast<unsigned>(mpWindow::MouseWheelAction::COUNT) ==
+                               static_cast<unsigned>(SIM_MOUSE_WHEEL_ACTION::COUNT),
+                       "mpWindow::MouseWheelAction enum must match SIM_MOUSE_WHEEL_ACTION" );
+
+        using A = mpWindow::MouseWheelAction;
+        mpWindow::MouseWheelActionSet m;
+        m.verticalUnmodified = static_cast<A>( s.vertical_unmodified );
+        m.verticalWithCtrl   = static_cast<A>( s.vertical_with_ctrl );
+        m.verticalWithShift  = static_cast<A>( s.vertical_with_shift );
+        m.verticalWithAlt    = static_cast<A>( s.vertical_with_alt );
+        return m;
+    }
+
     wxString getTraceId( const wxString& aVectorName, int aType ) const
     {
         return wxString::Format( wxS( "%s%d" ), aVectorName, aType & SPT_Y_AXIS_MASK );
diff --git a/eeschema/sim/sim_preferences.h b/eeschema/sim/sim_preferences.h
new file mode 100644
index 0000000000..b415aa5054
--- /dev/null
+++ b/eeschema/sim/sim_preferences.h
@@ -0,0 +1,101 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * https://www.gnu.org/licenses/gpl-3.0.html
+ * or you may search the http://www.gnu.org website for the version 3 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+ */
+
+#ifndef __SIM_PREFERENCES__
+#define __SIM_PREFERENCES__
+
+
+/**
+ * @file sim_preferences.h
+ *
+ * Contains preferences pertaining to the simulator.
+ */
+
+/**
+ * Enumerates the possible mouse wheel actions that can be performed on simulator plots.
+ */
+enum class SIM_MOUSE_WHEEL_ACTION
+{
+    // Directly using mpWindow::MouseWheelAction would leak wxMathPlot via the eeschema_settings.h
+    // header, so we duplicate it here in this miminal header.
+
+    NONE,
+    PAN_LEFT_RIGHT,
+    PAN_RIGHT_LEFT,
+    PAN_UP_DOWN,
+    ZOOM,
+    ZOOM_HORIZONTALLY,
+    ZOOM_VERTICALLY,
+    COUNT // Internal use only
+};
+
+/**
+ * Contains the set of modified mouse wheel actions that can be performed on a simulator plot.
+ */
+struct SIM_MOUSE_WHEEL_ACTION_SET
+{
+    // Directly using mpWindow::MouseWheelActionSet would leak wxMathPlot via the
+    // eeschema_settings.h header, so we duplicate it here in this miminal header.
+
+    SIM_MOUSE_WHEEL_ACTION vertical_unmodified;
+    SIM_MOUSE_WHEEL_ACTION vertical_with_ctrl;
+    SIM_MOUSE_WHEEL_ACTION vertical_with_shift;
+    SIM_MOUSE_WHEEL_ACTION vertical_with_alt;
+    SIM_MOUSE_WHEEL_ACTION horizontal;
+
+    static SIM_MOUSE_WHEEL_ACTION_SET GetMouseDefaults()
+    {
+        // Returns defaults equivalent to the global Mouse and Touchpad default settings
+
+        SIM_MOUSE_WHEEL_ACTION_SET actions;
+        actions.vertical_unmodified = SIM_MOUSE_WHEEL_ACTION::ZOOM;
+        actions.vertical_with_ctrl  = SIM_MOUSE_WHEEL_ACTION::PAN_LEFT_RIGHT;
+        actions.vertical_with_shift = SIM_MOUSE_WHEEL_ACTION::PAN_UP_DOWN;
+        actions.vertical_with_alt   = SIM_MOUSE_WHEEL_ACTION::NONE;
+        actions.horizontal          = SIM_MOUSE_WHEEL_ACTION::NONE;
+        return actions;
+    }
+
+    static SIM_MOUSE_WHEEL_ACTION_SET GetTrackpadDefaults()
+    {
+        // Returns defaults equivalent to the global Mouse and Touchpad default settings
+
+        SIM_MOUSE_WHEEL_ACTION_SET actions;
+        actions.vertical_unmodified = SIM_MOUSE_WHEEL_ACTION::PAN_UP_DOWN;
+        actions.vertical_with_ctrl  = SIM_MOUSE_WHEEL_ACTION::ZOOM;
+        actions.vertical_with_shift = SIM_MOUSE_WHEEL_ACTION::PAN_LEFT_RIGHT;
+        actions.vertical_with_alt   = SIM_MOUSE_WHEEL_ACTION::NONE;
+        actions.horizontal          = SIM_MOUSE_WHEEL_ACTION::PAN_LEFT_RIGHT;
+        return actions;
+    }
+};
+
+/**
+ * Contains preferences pertaining to the simulator.
+ */
+struct SIM_PREFERENCES
+{
+    SIM_MOUSE_WHEEL_ACTION_SET mouse_wheel_actions;
+};
+
+#endif // __SIM_PREFERENCES__
diff --git a/eeschema/sim/sim_tab.cpp b/eeschema/sim/sim_tab.cpp
index 3ba2931860..4904cb8d25 100644
--- a/eeschema/sim/sim_tab.cpp
+++ b/eeschema/sim/sim_tab.cpp
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2016-2023 CERN
- * Copyright (C) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2021-2024 KiCad Developers, see AUTHORS.txt for contributors.
  * @author Sylwester Kocjan <s.kocjan@o2.pl>
  *
  * This program is free software; you can redistribute it and/or
@@ -67,6 +67,10 @@ bool SIM_TAB::IsPlottable( SIM_TYPE aSimType )
     }
 }
 
+void SIM_TAB::ApplyPreferences( const SIM_PREFERENCES& /*aPrefs*/ )
+{
+}
+
 
 SIM_TYPE SIM_TAB::GetSimType() const
 {
diff --git a/eeschema/sim/sim_tab.h b/eeschema/sim/sim_tab.h
index af70d528c9..ebdeaa20af 100644
--- a/eeschema/sim/sim_tab.h
+++ b/eeschema/sim/sim_tab.h
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2016-2023 CERN
- * Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2016-2024 KiCad Developers, see AUTHORS.txt for contributors.
  * @author Sylwester Kocjan <s.kocjan@o2.pl>
  *
  * This program is free software; you can redistribute it and/or
@@ -26,6 +26,7 @@
 #ifndef __SIM_PLOT_PANEL_BASE_H
 #define __SIM_PLOT_PANEL_BASE_H
 
+#include <sim/sim_preferences.h>
 #include <sim/sim_types.h>
 #include <sim/spice_circuit_model.h>
 #include <wx/panel.h>
@@ -44,6 +45,8 @@ public:
 
     virtual void OnLanguageChanged() = 0;
 
+    virtual void ApplyPreferences( const SIM_PREFERENCES& aPrefs );
+
     SIM_TYPE GetSimType() const;
 
     const wxString& GetSimCommand() const { return m_simCommand; }
diff --git a/eeschema/sim/simulator_frame.cpp b/eeschema/sim/simulator_frame.cpp
index 14bbfa7191..8871517303 100644
--- a/eeschema/sim/simulator_frame.cpp
+++ b/eeschema/sim/simulator_frame.cpp
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2016-2023 CERN
- * Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2016-2024 KiCad Developers, see AUTHORS.txt for contributors.
  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
  * @author Maciej Suminski <maciej.suminski@cern.ch>
  *
@@ -272,6 +272,16 @@ void SIMULATOR_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
 }
 
 
+void SIMULATOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
+{
+    KIWAY_PLAYER::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
+
+    auto* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( m_toolManager->GetSettings() );
+    wxASSERT( cfg != nullptr );
+    m_ui->ApplyPreferences( cfg->m_Simulator.preferences );
+}
+
+
 WINDOW_SETTINGS* SIMULATOR_FRAME::GetWindowSettings( APP_SETTINGS_BASE* aCfg )
 {
     EESCHEMA_SETTINGS* cfg = dynamic_cast<EESCHEMA_SETTINGS*>( aCfg );
diff --git a/eeschema/sim/simulator_frame.h b/eeschema/sim/simulator_frame.h
index 4da48bbcf5..39dc92c6d0 100644
--- a/eeschema/sim/simulator_frame.h
+++ b/eeschema/sim/simulator_frame.h
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2016-2023 CERN
- * Copyright (C) 2017-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2017-2024 KiCad Developers, see AUTHORS.txt for contributors.
  *
  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
  * @author Maciej Suminski <maciej.suminski@cern.ch>
@@ -162,6 +162,8 @@ public:
 
     void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
 
+    void CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged ) override;
+
     WINDOW_SETTINGS* GetWindowSettings( APP_SETTINGS_BASE* aCfg ) override;
 
     SCH_EDIT_FRAME* GetSchematicFrame() const { return m_schematicFrame; }
diff --git a/eeschema/sim/simulator_frame_ui.cpp b/eeschema/sim/simulator_frame_ui.cpp
index 3b29c47652..ea268eb309 100644
--- a/eeschema/sim/simulator_frame_ui.cpp
+++ b/eeschema/sim/simulator_frame_ui.cpp
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2016-2023 CERN
- * Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2016-2024 KiCad Developers, see AUTHORS.txt for contributors.
  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
  * @author Maciej Suminski <maciej.suminski@cern.ch>
  *
@@ -605,24 +605,45 @@ void SIMULATOR_FRAME_UI::ShowChangedLanguage()
 
 void SIMULATOR_FRAME_UI::LoadSettings( EESCHEMA_SETTINGS* aCfg )
 {
+    const EESCHEMA_SETTINGS::SIMULATOR& settings = aCfg->m_Simulator;
+
     // Read subwindows sizes (should be > 0 )
-    m_splitterLeftRightSashPosition      = aCfg->m_Simulator.plot_panel_width;
-    m_splitterPlotAndConsoleSashPosition = aCfg->m_Simulator.plot_panel_height;
-    m_splitterSignalsSashPosition        = aCfg->m_Simulator.signal_panel_height;
-    m_splitterCursorsSashPosition        = aCfg->m_Simulator.cursors_panel_height;
-    m_splitterTuneValuesSashPosition     = aCfg->m_Simulator.measurements_panel_height;
-    m_darkMode                           = !aCfg->m_Simulator.white_background;
+    m_splitterLeftRightSashPosition      = settings.view.plot_panel_width;
+    m_splitterPlotAndConsoleSashPosition = settings.view.plot_panel_height;
+    m_splitterSignalsSashPosition        = settings.view.signal_panel_height;
+    m_splitterCursorsSashPosition        = settings.view.cursors_panel_height;
+    m_splitterTuneValuesSashPosition     = settings.view.measurements_panel_height;
+    m_darkMode                           = !settings.view.white_background;
+
+    m_preferences = settings.preferences;
 }
 
 
 void SIMULATOR_FRAME_UI::SaveSettings( EESCHEMA_SETTINGS* aCfg )
 {
-    aCfg->m_Simulator.plot_panel_width          = m_splitterLeftRight->GetSashPosition();
-    aCfg->m_Simulator.plot_panel_height         = m_splitterPlotAndConsole->GetSashPosition();
-    aCfg->m_Simulator.signal_panel_height       = m_splitterSignals->GetSashPosition();
-    aCfg->m_Simulator.cursors_panel_height      = m_splitterCursors->GetSashPosition();
-    aCfg->m_Simulator.measurements_panel_height = m_splitterMeasurements->GetSashPosition();
-    aCfg->m_Simulator.white_background          = !m_darkMode;
+    EESCHEMA_SETTINGS::SIMULATOR& settings = aCfg->m_Simulator;
+    
+    settings.view.plot_panel_width          = m_splitterLeftRight->GetSashPosition();
+    settings.view.plot_panel_height         = m_splitterPlotAndConsole->GetSashPosition();
+    settings.view.signal_panel_height       = m_splitterSignals->GetSashPosition();
+    settings.view.cursors_panel_height      = m_splitterCursors->GetSashPosition();
+    settings.view.measurements_panel_height = m_splitterMeasurements->GetSashPosition();
+    settings.view.white_background          = !m_darkMode;
+}
+
+
+void SIMULATOR_FRAME_UI::ApplyPreferences( const SIM_PREFERENCES& aPrefs )
+{
+    m_preferences = aPrefs;
+
+    const std::size_t pageCount = m_plotNotebook->GetPageCount();
+    for( std::size_t i = 0; i<pageCount; ++i )
+    {
+        wxWindow* page = m_plotNotebook->GetPage( i );
+        auto simTab = dynamic_cast<SIM_TAB*>( page );
+        wxASSERT( simTab != nullptr );
+        simTab->ApplyPreferences( aPrefs );
+    }
 }
 
 
@@ -943,9 +964,7 @@ SIM_TAB* SIMULATOR_FRAME_UI::NewSimTab( const wxString& aSimCommand )
     {
         SIM_PLOT_TAB* panel = new SIM_PLOT_TAB( aSimCommand, m_plotNotebook );
         simTab = panel;
-
-        COMMON_SETTINGS::INPUT cfg = Pgm().GetCommonSettings()->m_Input;
-        panel->GetPlotWin()->EnableMouseWheelPan( cfg.scroll_modifier_zoom != 0 );
+        panel->ApplyPreferences( m_preferences );
     }
     else
     {
diff --git a/eeschema/sim/simulator_frame_ui.h b/eeschema/sim/simulator_frame_ui.h
index 157a195274..f8537f315a 100644
--- a/eeschema/sim/simulator_frame_ui.h
+++ b/eeschema/sim/simulator_frame_ui.h
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2016-2023 CERN
- * Copyright (C) 2017-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2017-2024 KiCad Developers, see AUTHORS.txt for contributors.
  *
  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
  * @author Maciej Suminski <maciej.suminski@cern.ch>
@@ -32,6 +32,7 @@
 #include <sim/simulator_frame_ui_base.h>
 #include <sim/sim_types.h>
 #include <sim/sim_plot_tab.h>
+#include <sim/sim_preferences.h>
 
 #include <wx/event.h>
 
@@ -185,6 +186,11 @@ public:
 
     void SaveSettings( EESCHEMA_SETTINGS* aCfg );
 
+    /**
+     * Called when settings are changed via the common Preferences dialog.
+     */
+    void ApplyPreferences( const SIM_PREFERENCES& aPrefs );
+
     // adjust the sash dimension of splitter windows after reading
     // the config settings
     // must be called after the config settings are read, and once the
@@ -342,6 +348,7 @@ private:
     bool                         m_darkMode;
     unsigned int                 m_plotNumber;
     wxTimer                      m_refreshTimer;
+    SIM_PREFERENCES              m_preferences;
 };
 
 #endif // SIMULATOR_FRAME_UI_H
diff --git a/eeschema/sim/toolbars_simulator_frame.cpp b/eeschema/sim/toolbars_simulator_frame.cpp
index 4d0edaf869..d8c2ad5dcd 100644
--- a/eeschema/sim/toolbars_simulator_frame.cpp
+++ b/eeschema/sim/toolbars_simulator_frame.cpp
@@ -58,6 +58,10 @@ void SIMULATOR_FRAME::ReCreateHToolbar()
     m_toolBar->AddScaledSeparator( this );
     m_toolBar->Add( ACTIONS::zoomInCenter );
     m_toolBar->Add( ACTIONS::zoomOutCenter );
+    m_toolBar->Add( ACTIONS::zoomInHorizontally );
+    m_toolBar->Add( ACTIONS::zoomOutHorizontally );
+    m_toolBar->Add( ACTIONS::zoomInVertically );
+    m_toolBar->Add( ACTIONS::zoomOutVertically );
     m_toolBar->Add( ACTIONS::zoomFitScreen );
 
     m_toolBar->AddScaledSeparator( this );
@@ -117,6 +121,10 @@ void SIMULATOR_FRAME::doReCreateMenuBar()
     viewMenu->AppendSeparator();
     viewMenu->Add( ACTIONS::zoomInCenter );
     viewMenu->Add( ACTIONS::zoomOutCenter );
+    viewMenu->Add( ACTIONS::zoomInHorizontally );
+    viewMenu->Add( ACTIONS::zoomOutHorizontally );
+    viewMenu->Add( ACTIONS::zoomInVertically );
+    viewMenu->Add( ACTIONS::zoomOutVertically );
     viewMenu->Add( ACTIONS::zoomFitScreen );
 
     viewMenu->AppendSeparator();
diff --git a/eeschema/tools/simulator_control.cpp b/eeschema/tools/simulator_control.cpp
index f171f4d5a6..2caf3a1087 100644
--- a/eeschema/tools/simulator_control.cpp
+++ b/eeschema/tools/simulator_control.cpp
@@ -1,7 +1,7 @@
 /*
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
- * Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2023-2024 KiCad Developers, see AUTHORS.txt for contributors.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -248,18 +248,36 @@ int SIMULATOR_CONTROL::Zoom( const TOOL_EVENT& aEvent )
 {
     if( SIM_PLOT_TAB* plotTab = dynamic_cast<SIM_PLOT_TAB*>( getCurrentSimTab() ) )
     {
+        mpWindow* plot = plotTab->GetPlotWin();
+
         if( aEvent.IsAction( &ACTIONS::zoomInCenter ) )
         {
-            plotTab->GetPlotWin()->ZoomIn();
+            plot->ZoomIn();
         }
         else if( aEvent.IsAction( &ACTIONS::zoomOutCenter ) )
         {
-            plotTab->GetPlotWin()->ZoomOut();
+            plot->ZoomOut();
+        }
+        else if( aEvent.IsAction( &ACTIONS::zoomInHorizontally ) )
+        {
+            plot->ZoomIn( wxDefaultPosition, mpWindow::zoomIncrementalFactor, wxHORIZONTAL );
+        }
+        else if( aEvent.IsAction( &ACTIONS::zoomOutHorizontally ) )
+        {
+            plot->ZoomOut( wxDefaultPosition, mpWindow::zoomIncrementalFactor, wxHORIZONTAL );
+        }
+        else if( aEvent.IsAction( &ACTIONS::zoomInVertically ) )
+        {
+            plot->ZoomIn( wxDefaultPosition, mpWindow::zoomIncrementalFactor, wxVERTICAL );
+        }
+        else if( aEvent.IsAction( &ACTIONS::zoomOutVertically ) )
+        {
+            plot->ZoomOut( wxDefaultPosition, mpWindow::zoomIncrementalFactor, wxVERTICAL );
         }
         else if( aEvent.IsAction( &ACTIONS::zoomFitScreen ) )
         {
             wxCommandEvent dummy;
-            plotTab->GetPlotWin()->OnFit( dummy );
+            plot->OnFit( dummy );
         }
     }
 
@@ -519,6 +537,10 @@ void SIMULATOR_CONTROL::setTransitions()
 
     Go( &SIMULATOR_CONTROL::Zoom,                   ACTIONS::zoomInCenter.MakeEvent() );
     Go( &SIMULATOR_CONTROL::Zoom,                   ACTIONS::zoomOutCenter.MakeEvent() );
+    Go( &SIMULATOR_CONTROL::Zoom,                   ACTIONS::zoomInHorizontally.MakeEvent() );
+    Go( &SIMULATOR_CONTROL::Zoom,                   ACTIONS::zoomOutHorizontally.MakeEvent() );
+    Go( &SIMULATOR_CONTROL::Zoom,                   ACTIONS::zoomInVertically.MakeEvent() );
+    Go( &SIMULATOR_CONTROL::Zoom,                   ACTIONS::zoomOutVertically.MakeEvent() );
     Go( &SIMULATOR_CONTROL::Zoom,                   ACTIONS::zoomFitScreen.MakeEvent() );
     Go( &SIMULATOR_CONTROL::UndoZoom,               ACTIONS::zoomUndo.MakeEvent() );
     Go( &SIMULATOR_CONTROL::RedoZoom,               ACTIONS::zoomRedo.MakeEvent() );
diff --git a/eeschema/tools/simulator_control.h b/eeschema/tools/simulator_control.h
index 596b68bcfa..b02a877896 100644
--- a/eeschema/tools/simulator_control.h
+++ b/eeschema/tools/simulator_control.h
@@ -1,7 +1,7 @@
 /*
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
- * Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2023-2024 KiCad Developers, see AUTHORS.txt for contributors.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -28,6 +28,7 @@
 #include <tool/tool_interactive.h>
 
 class SIMULATOR_FRAME;
+class SCH_EDIT_FRAME;
 class SPICE_CIRCUIT_MODEL;
 class SPICE_SIMULATOR;
 class SIM_TAB;
diff --git a/include/bitmaps/bitmaps_list.h b/include/bitmaps/bitmaps_list.h
index 642433e460..dba30cc731 100644
--- a/include/bitmaps/bitmaps_list.h
+++ b/include/bitmaps/bitmaps_list.h
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2007-2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
- * Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.TXT for contributors.
+ * Copyright (C) 1992-2024 KiCad Developers, see AUTHORS.TXT for contributors.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -653,6 +653,10 @@ enum class BITMAPS : unsigned int
     zoom_fit_to_objects,
     zoom_in,
     zoom_out,
+    zoom_in_horizontally,
+    zoom_out_horizontally,
+    zoom_in_vertically,
+    zoom_out_vertically,
     zoom_page,
     zoom_selection,
 };
diff --git a/include/frame_type.h b/include/frame_type.h
index 803bd89e0f..c5b7bca780 100644
--- a/include/frame_type.h
+++ b/include/frame_type.h
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2014 CERN
- * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 1992-2024 KiCad Developers, see AUTHORS.txt for contributors.
  * @author Maciej Suminski <maciej.suminski@cern.ch>
  *
  * This program is free software; you can redistribute it and/or
@@ -80,6 +80,7 @@ enum FRAME_T
     PANEL_SCH_ANNO_OPTIONS,
     PANEL_SCH_COLORS,
     PANEL_SCH_FIELD_NAME_TEMPLATES,
+    PANEL_SCH_SIMULATOR,
 
     PANEL_FP_DISPLAY_OPTIONS,
     PANEL_FP_GRIDS,
diff --git a/include/tool/actions.h b/include/tool/actions.h
index 365ab175b5..d131e916df 100644
--- a/include/tool/actions.h
+++ b/include/tool/actions.h
@@ -2,7 +2,7 @@
  * This program source code file is part of KiCad, a free EDA CAD application.
  *
  * Copyright (C) 2013-2016 CERN
- * Copyright (C) 2016-2023 KiCad Developers, see AUTHORS.txt for contributors.
+ * Copyright (C) 2016-2024 KiCad Developers, see AUTHORS.txt for contributors.
  * @author Maciej Suminski <maciej.suminski@cern.ch>
  *
  * This program is free software; you can redistribute it and/or
@@ -116,6 +116,10 @@ public:
     static TOOL_ACTION zoomOut;
     static TOOL_ACTION zoomInCenter;
     static TOOL_ACTION zoomOutCenter;
+    static TOOL_ACTION zoomInHorizontally;
+    static TOOL_ACTION zoomOutHorizontally;
+    static TOOL_ACTION zoomInVertically;
+    static TOOL_ACTION zoomOutVertically;
     static TOOL_ACTION zoomCenter;
     static TOOL_ACTION zoomFitScreen;
     static TOOL_ACTION zoomFitObjects; // Zooms to bbox of items on screen (except page border)
diff --git a/include/widgets/mathplot.h b/include/widgets/mathplot.h
index 2b31bfea6d..990cc4e647 100644
--- a/include/widgets/mathplot.h
+++ b/include/widgets/mathplot.h
@@ -7,7 +7,7 @@
 // Created:         21/07/2003
 // Last edit:       05/08/2016
 // Copyright:       (c) David Schalig, Davide Rondini
-// Copyright        (c) 2021-2023 KiCad Developers, see AUTHORS.txt for contributors.
+// Copyright        (c) 2021-2024 KiCad Developers, see AUTHORS.txt for contributors.
 // Licence:         wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -905,6 +905,38 @@ typedef std::deque<mpLayer*> wxLayerList;
 class WXDLLIMPEXP_MATHPLOT mpWindow : public wxWindow
 {
 public:
+    /**
+     * Enumerates the possible mouse wheel actions that can be performed on the plot.
+     */
+    enum class MouseWheelAction
+    {
+        NONE,
+        PAN_LEFT_RIGHT,
+        PAN_RIGHT_LEFT,
+        PAN_UP_DOWN,
+        ZOOM,
+        ZOOM_HORIZONTALLY,
+        ZOOM_VERTICALLY,
+        COUNT // Internal use only
+    };
+
+    /**
+     * Contains the set of modified mouse wheel actions that can be performed on the plot.
+     */
+    struct MouseWheelActionSet
+    {
+        /* If this bundled wxMathPlot implementation is to remain single-header and not dependent
+         * on any part of KiCad, then the SIM_MOUSE_WHEEL_ACTION_SET struct must be duplicated
+         * here. SIM_PLOT_TAB::convertMouseWheelActions is used to convert from
+         * SIM_MOUSE_WHEEL_ACTION_SET to mpWindow::MouseWheelActionSet. */
+
+        MouseWheelAction verticalUnmodified;
+        MouseWheelAction verticalWithCtrl;
+        MouseWheelAction verticalWithShift;
+        MouseWheelAction verticalWithAlt;
+        MouseWheelAction horizontal;
+    };
+
     mpWindow();
     mpWindow( wxWindow* parent, wxWindowID id );
     ~mpWindow();
@@ -1068,9 +1100,8 @@ public:
      */
     void EnableMousePanZoom( bool enabled ) { m_enableMouseNavigation = enabled; }
 
-    /** Enable/disable trackpad friendly panning (2-axis scroll wheel)
-     */
-    void EnableMouseWheelPan( bool enabled ) { m_enableMouseWheelPan = enabled; }
+    /** Set the pan/zoom actions corresponding to mousewheel/trackpad events. */
+    void SetMouseWheelActions( const MouseWheelActionSet& s ) {m_mouseWheelActions = s;}
 
     /** Set view to fit global bounding box of all plot layers and refresh display.
      *  Scale and position will be set to show all attached mpLayers.
@@ -1085,21 +1116,24 @@ public:
      *  as the "desired borders", since this use will be invoked only when printing.
      */
     void Fit( double xMin, double xMax, double yMin, double yMax,
-              const wxCoord* printSizeX = nullptr, const wxCoord* printSizeY = nullptr );
+              const wxCoord* printSizeX = nullptr, const wxCoord* printSizeY = nullptr,
+              wxOrientation directions = wxBOTH );
 
     /** Zoom into current view and refresh display
      * @param centerPoint The point (pixel coordinates) that will stay in the same
      * position on the screen after the zoom (by default, the center of the mpWindow).
      */
     void ZoomIn( const wxPoint& centerPoint = wxDefaultPosition );
-    void ZoomIn( const wxPoint& centerPoint, double zoomFactor );
+    void ZoomIn( const wxPoint& centerPoint, double zoomFactor,
+                 wxOrientation directions = wxBOTH );
 
     /** Zoom out current view and refresh display
      * @param centerPoint The point (pixel coordinates) that will stay in the same
      * position on the screen after the zoom (by default, the center of the mpWindow).
      */
     void ZoomOut( const wxPoint& centerPoint = wxDefaultPosition );
-    void ZoomOut( const wxPoint& centerPoint, double zoomFactor );
+    void ZoomOut( const wxPoint& centerPoint, double zoomFactor,
+                  wxOrientation directions = wxBOTH );
 
     /** Zoom view fitting given coordinates to the window (p0 and p1 do not need to be in any specific order)
      */
@@ -1219,7 +1253,7 @@ public:
      *  @return reference to axis colour used in theme */
     const wxColour& GetAxesColour() { return m_axColour; };
 
-    /** Limit zooming & panning to the area used by the plots */
+    /** Enable limiting of zooming & panning to the area used by the plots */
     void LimitView( bool aEnable )
     {
         m_enableLimitedView = aEnable;
@@ -1233,12 +1267,15 @@ public:
     int UndoZoomStackSize() const { return m_undoZoomStack.size(); }
     int RedoZoomStackSize() const { return m_redoZoomStack.size(); }
 
-    void AdjustLimitedView();
+    /** Limits the zoomed or panned view to the area used by the plots. */
+    void AdjustLimitedView( wxOrientation directions = wxBOTH );
 
     void OnFit( wxCommandEvent& event );
     void OnCenter( wxCommandEvent& event );
 
 protected:
+    static MouseWheelActionSet defaultMouseWheelActions();
+
     void pushZoomUndo( const std::array<double, 4>& aZoom );
 
     void OnPaint( wxPaintEvent& event );             // !< Paint handler, will plot all attached layers
@@ -1258,19 +1295,12 @@ protected:
     void onMouseLeftDown( wxMouseEvent& event );     // !< Mouse left click (for rect zoom)
     void onMouseLeftRelease( wxMouseEvent& event );  // !< Mouse left click (for rect zoom)
 
-    bool CheckXLimits( double& desiredMax, double& desiredMin ) const
-    {
-        return !( m_enableLimitedView
-                  && (desiredMax > m_maxX - m_marginRight / m_scaleX
-                      || desiredMin < m_minX - m_marginLeft / m_scaleX) );
-    }
+    void DoZoom( const wxPoint& centerPoint, double zoomFactor, wxOrientation directions );
+    void RecomputeDesiredX( double& min, double& max );
+    void RecomputeDesiredY( double& min, double& max );
+    wxOrientation ViewNeedsRefitting( wxOrientation directions ) const;
 
-    bool CheckYLimits( double& desiredMax, double& desiredMin ) const
-    {
-        return !( m_enableLimitedView
-                  && (desiredMax > m_maxY + m_marginTop / m_scaleY
-                      || desiredMin < m_minY - m_marginBottom / m_scaleY) );
-    }
+    void PerformMouseWheelAction( wxMouseEvent& event, MouseWheelAction action );
 
     /** Recalculate global layer bounding box, and save it in m_minX,...
      * \return true if there is any valid BBox information.
@@ -1309,11 +1339,19 @@ protected:
 
     bool m_yLocked;
 
-    /** These are updated in Fit() only, and may be different from the real borders
-     * (layer coordinates) only if lock aspect ratio is true.
+    /** These are updated in Fit, ZoomIn, ZoomOut, ZoomRect, SetXView, SetYView and may be different
+     *  from the real borders (layer coordinates) only if lock aspect ratio is true.
+     *
+     *  @note They use the plot area as their coordinate system, and not the layer coordinate
+     *        system used by m_posX/Y.
      */
     double m_desiredXmin, m_desiredXmax, m_desiredYmin, m_desiredYmax;
 
+    // These are gaps between the curve extrema and the edges of the plot area, expressed as
+    // a factor of global layer bounding box width/height.
+    double m_topBottomPlotGapFactor;
+    double m_leftRightPlotGapFactor;
+
     int m_marginTop, m_marginRight, m_marginBottom, m_marginLeft;
 
     int m_last_lx, m_last_ly;               // !< For double buffering
@@ -1321,11 +1359,11 @@ protected:
     wxBitmap*   m_buff_bmp;                 // !< For double buffering
     bool    m_enableDoubleBuffer;           // !< For double buffering
     bool    m_enableMouseNavigation;        // !< For pan/zoom with the mouse.
-    bool    m_enableMouseWheelPan;          // !< Trackpad pan/zoom
     bool    m_enableLimitedView;
+    MouseWheelActionSet m_mouseWheelActions;
     wxPoint m_mouseMClick;                  // !< For the middle button "drag" feature
     wxPoint m_mouseLClick;                  // !< Starting coords for rectangular zoom selection
-    mpInfoLayer* m_movingInfoLayer;          // !< For moving info layers over the window area
+    mpInfoLayer* m_movingInfoLayer;         // !< For moving info layers over the window area
     bool m_zooming;
     wxRect m_zoomRect;
     std::stack<std::array<double, 4>> m_undoZoomStack;
@@ -1333,6 +1371,14 @@ protected:
 
     DECLARE_DYNAMIC_CLASS( mpWindow )
     DECLARE_EVENT_TABLE()
+
+private:
+    struct DelegatingContructorTag {};
+
+    template <typename... Ts>
+    mpWindow( DelegatingContructorTag, Ts&&... windowArgs );
+
+    void initializeGraphicsContext();
 };
 
 // -----------------------------------------------------------------------------
diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_16.png b/resources/bitmaps_png/png/zoom_in_horizontally_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9712f40cc3e92898f4558c999f3e8913dfba2bd
GIT binary patch
literal 272
zcmV+r0q_2aP)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e0002jNkl<ZD9>Z~
z&ww8?P)C6$J2okZC=f;Sg+xGvLOFw7g57<&AiUtnP=2t2(2CGZkU)@i$cE4~Alw>c
z2UeaLQVvuQ${F$^<Z!65FIUKhG}cgqP%{UXkad2%p~fMHLtcb(G6d&^{0G9&P}k7p
zK>d(OAv1tdp`m^up<wY`xPlPR;CP@Vb3+z~+5>t1a0M_c{CGpwg))blh1fc<gl>uw
zgj<1dWT;cf#^A`1pwLYrcY`(HjzsY$e`sK6AW*k@$oXJxxHqu{RJdmF9C$#{I<f#L
WTi`BiH%E>D0000<MNUMnLSTXv)p39T

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_24.png b/resources/bitmaps_png/png/zoom_in_horizontally_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..df58ddc02758d13d144a2981599ae81bc0a34e91
GIT binary patch
literal 379
zcmV->0fhdEP)<h;3K|Lk000e1NJLTq000;O000;W1ONa4N`Cco0003(Nkl<ZILqCW
z%}Rn{5QUE!mJoCyxl)2^lj$ZQ7k+cb49Z$`4N1Eos5Whbz$>X$P-F`BgWW|CQk#M}
zEwt>@NZQJ*=AHAv{G1oU{{o`}`1CO0m!gwIxibvlu1CKCmaO`tl;auOeDMn}^j@v%
zt6cyQHhTc~`M{h{dz4u=?6?Q;9uWb8<teYTA_%_BmQM*b<0)Zl((kM&2&{OWvb+F+
zR}@7Ff}e9m5O`oGf)LE{Mi4p*)&wxyO(Y0>%}o>%c4*gZ^2k$rV|-4Je*^N&0FWLJ
z=IoTWe6-VGNnqP!A)v3NOJ5ANG|OgROW~od=yi_?KJOX9<5suLfuX}|wG%eD;8CHF
zV2vNPKCsq-!<GGxZ9cKZ?cy5We53Dhzgfd$9_!+z4id7)-{xbP??EzTzF`q0Jw8fb
Z^b-z8DB05W-WC7=002ovPDHLkV1j3Ase1qb

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_32.png b/resources/bitmaps_png/png/zoom_in_horizontally_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..529a7a0d60798810a9f502922f46ee692596a275
GIT binary patch
literal 516
zcmV+f0{i`mP)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0005YNkl<ZNXPAz
z&nrYx6vrR4B^C-%ib64>M6s|i3oG%?_cqNRVP&DLEd9vO63K7*F~h=-h*FCDj4~F4
z#?nq%*!VTidC!|?-n^?uHWs>@bMHOpbI-ZwhoULJTgpG+F9Af>Pt3lwtt0gO1VG&}
z08xRULn#-{7{Vl4s4(^pK~&iRt9F1$!3e^*g`XC1#ZsUlH3qN}1)w6lM+54Uag00i
zMD}VmUDCBL-3AC#i3PwsG=#__+~)NdLL$R3%~W$tkAh;;^v+ElgxF%<1bFlC%3FQ;
z^&@XS`%`NwFJae|N)Z;N20mbFzj^Zw0Kcb21NiH1ELYcXY{~oRumLn0Wq_KEXFGr<
zFsEmlW?A(f4+zkL{uTzXXb0d$&5-~wgBb=C;0UL9#1l@%36(RrPpnG-k`P+IGGYs1
z8-tP%oS#T#{9P5M(J~G`C0$F@Nk37N#$|C{pKQQNsM5$m5(UMfk|0f^vygmgxD{uO
z#Zg6l!3Kf0#BU18S;}gr*ktGqdeMa~4sp+Ld_01PDP?&xsnzJm21ABLji$6Ea$8vl
zM>ECK&WxCfARO%+-#`&Anr1}1bfCmJiCol)rvI`2*8m^5G4o(R&@V9n0000<MNUMn
GLSTa6vEvs2

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_48.png b/resources/bitmaps_png/png/zoom_in_horizontally_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..8221f8e4895c680b585e7a4c6c7d6bb89822ab79
GIT binary patch
literal 778
zcmV+l1NHogP)<h;3K|Lk000e1NJLTq001xm001xu1ONa4{R=S+0008fNkl<ZSi|ks
zOK4L;6oBDLDpsx5DuSShSPOzwT|_snZv+)llFWaaL=6--x=;`WK~TuXh4|XI5to8?
zBMKt!E7FCfiXvTTT3=NuwOHZ<HTJkjZqlUp-iB%sB+Mpr!_3E=GjnE)nyGE33RHnA
z@V@~vS62S%gpuaG^E?4g)AFYPEu8WIl64IJ6<|nay8;|Xy#SdmF>a9NCt3TN+Y;M6
z%@a^L<^t@j<*gTB!?qtqQNHsn|Lc`K;05r$ea1Mz9zxv!6R;Ohln0WGFH)l>vB0)*
z4@J4Yv(^<*4weB@!*h3lODH3<cigJBF^Jj@6L1CkoDe!dGQaRLKq4rgqU&7qvW#~q
zM_d85`^NyOAkXr^0BO?2)ba`?K4$nG>5`dFFWSm4Mr3|rRWC?0ke}&UDp&xl&40|b
z(ZYZP%KhT>`|45Dt{wwkLpf3CX-SI~03Nyn+(gGlU*@7{WKHo)v=x;u51_{c)EG6g
zqwJ3&@CHpR^aD~sKJ!CrTmiM))fhE&x&x^oSu#%S%Lmhw+b29hWwARzr!Qavj53lR
z+B<IW$6T`I@q~a+h+Z<fuU?IsaD#*-B%4swCL|;wCv*&xb<V9vh`f_*J5br>mjhXa
z%F_vw?7dAnh{`QLfQu++Cfuf_2hF~42JD%`Fr(3pS}Z7i3>ObpY&qZf9$i`h(jEuR
zr&Jt9?d$jwr@wnvE+=Z##24`n<!l9|!n@d+0Jl-wZ`YPrqS$hIkCJWMQc<z<F4r<s
z?xOtUs)U@%DJwX~S5$tXWMq8><=XGUks40&6-61Mn{Ga!C_gwaTgjk&W^)A>j{lXJ
zSin&pk<INgdO2$w)u>@ZIpKL_R&wdL&#;Zsl&mWWNg3gD=}-3AQcCzdThxRbBF&R|
zs>oKppkySZCej>kn1ZKcp13@PZ_{Y2y&_H3=X({X0{;Z~4WDlY$yE%c-2eap07*qo
IM6N<$g0)X!_5c6?

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_64.png b/resources/bitmaps_png/png/zoom_in_horizontally_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..a97206b51895d1b936f3c422133bc27a91cd432c
GIT binary patch
literal 1016
zcmV<U0|)$xP)<h;3K|Lk000e1NJLTq002M$002M;1ONa40ARUQ000BONkl<ZXx{CZ
zTSyd97=Ty1=|+W`B?V#DgH~eDg^EfmD2-N}J^#<HhPaXz6eUTd5Q$laK|;|*A1cU~
zKq?F(F^CX?BB+;q${>0u>Y)p!Wfylkb9S7anVp$)7Iv|R;XKWM{+aWgIsf%|WY5$N
zj|<=exBxDI3*Z9$hX6P;S&LbH*+PxfCkp`T1ORX&=}8s<>47a=0O(IDzyl5du7<EE
zfRyFmfI!FQ;38oFnXGjLfIC!$3lPjDXYdt-L7p7sEnJj}L;&!%13;hvCU^jq^Pvm=
zM3>f$Fx(C1@&F(#t+EAR3XT9+4DZ$DhT$@X$ZjYjHP8V=s&oXaH~=!-v;n}Sk)7EC
zfFH&c4SWt|o)i<>8hEJwhhrRozqs5I0J_!lv;pvMg<o`j0$WO^+bmGS0K-`A2p~h3
z1pwy2PbUB=3qCUXkYlLX1fx`IJW${WFdp@r=wzp6OfR8H86@BE@-;Sh(r|t$Z~%^n
z(oDxhy#ogg$5TkHq(f&ZGU+q{(EWWkTQ!1i`8;MH&v2UI!{tn`*=nD-T?d6R9y5yB
z1^_r6>sERIILl-^O+Wk~+s!4DIWC6ZRNm(ZAVZrDVDDV`!T}hjlGiaOZV5o;_o)0w
z^k^&rzTrF#0Gq7>OBA4TAzSEzFhDK)LWv`Q3{5IPC=EV11NgVG=W5OLb^uEPs$up=
zo?y@Z8CphB<aHc?Pd+aLAV(~xbpRO9?+6>L_37x=!nMI;Yyf0992Wo<tDie>3vgf6
z&t&>11OfO*fTiqNiab?i(3sJy41A$x1@=U)k~}S`Df$h9N5D72z%sq#@QsiVqtkMX
zkne`AsY)2eC&FHEg9YtuVK)>AMAu_8xg9|H9QbMs#@s-}55>5i$$De5pCUbHlAdDH
z+PFfoAsG!tQU?|qc00g!TVdL39}XI;AgKt(6vNb~Y?2>IZ#2!>B_n=1rk1VDkC=<f
zn4(tslVP$e?sUvANJu@K|BR)!70*gm4bT$Rn4*OW5}}f;jlDiWtHB)eoX?9blmAc&
z&sGSWl1!*5ZBQ%XF}Ou4afQ!Ym4Qo8f-8#Uvx@MYiZFobaTcXwWx0P{)RfGFydgfH
z7arLmaLaPB#-ufsRL~08)EnSa+!yJ7?Gd<*Nj$9?W@0HeLOZl$BbG}GjP_uSAkdm6
zsyVer5NJ*l*PdG;2({;lyP&9^4UZ?CvTT;{1w|sSXrc(@P#jk@i5wb2aLR7UFr6HA
mI#l<b&;@V-TmToq1^5SWvpFSr(gK+P0000<MNUMnLSTZV(zyZv

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_dark_16.png b/resources/bitmaps_png/png/zoom_in_horizontally_dark_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..c44f8b2d15e3c18443f5bca3b428882e22ce4b3e
GIT binary patch
literal 381
zcmV-@0fPRCP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003*Nkl<ZILp;j
zJxc>Y5Iry=3Q_zODi#I=8&N?Nu~7^NT3HB!g|_-TtSq#$vk(nfUm;i>h`V=iu=8;t
z5d0VG%xS{mDg<n_m|}O{d-G;yH}c*`zlrGY2sr0P1|?Ooy^C>9VXq46Ja<OX;2NjA
z(M`Hz)f}d{j|oon1q67G7LR)XNMVsux@QANWmtS9L(6>u!Lq@#Qa~$_#W#s3Ffgyx
zl$<2VFlXGLj27ZJt_kTb&-1!s6ssKNMr`3!4!#USyJTry;!s59<b1)FFH4f<GTQpU
zeBv#f1OkPDO_|4mwjr%u%l!=-UeO#Iw;c$4Z9#3SU4QF`)IPn^l8=2&@~yUMPX;Y~
zJH!lD$-qN7ZHrAAVoRK&IGGNH_|qD7O@)OW4XrFrrljhN%iL_R#z7xaVT&0Nxe6ZA
b|Nczx)Lr-uO9#iG00000NkvXXu0mjffuW!1

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_dark_24.png b/resources/bitmaps_png/png/zoom_in_horizontally_dark_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..ccbe647d4ff7dddbc4c59d3adb682ff1bc88e333
GIT binary patch
literal 498
zcmV<O0S*3%P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0005GNkl<ZNXP9}
zyGq1B6kQ+q0KpH@N)gmX)J8!I8z11K@f#FtL2YaW!7uO=v{(e+%4#x`DtBfA+X}L1
zqag9zF&mfNWFsuX7F!(1+_`hkea$2nhGFhMk!uMwmw<Xy{f!b<bNp_eh8;%IR>J~9
z?J!r30LYiMP$x-;0+(j7cLtPzH{c==w2<V>97fPmwLqJ8bs<Rr_FdRr7P09gI_0Qo
z*dDZ0he-l}!<?~zmU<q>5V$w4+K#jGXa;NPd0ro{ea{~tmxk@0F+K2q)<Q4F{y57V
zmJ6J*fD!5{60oR<<{UMhiwT6<1CHXgV@Ba~SK%LXXjk1@fhgTDMd01{{cdt-&`7nf
z1>G2_3rebkD3f;hyyo-y&Kd!LJetZB;KMdjsgJRKLIxgx2a+ZupAt&gl`4=?qD$kN
ziL??SlMx<{x+SXDWNska$`J;xKgLn<ck#N|YyBl{WH!0pm~zBCk|b!ne1U9F5Fz^U
zg&<Zl$29ArX-VrpBgq#{zwqcH!c8=O1-1{^*0L_zpPmXXRk>VMfyE-JPemh-U6kQx
o;P^x7k6nXca&CO<kJfww-{c<9a5x5%UjP6A07*qoM6N<$f_6FHQ~&?~

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_dark_32.png b/resources/bitmaps_png/png/zoom_in_horizontally_dark_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..234a555fa6be9243fe07fad504e5e63a021c936a
GIT binary patch
literal 694
zcmV;n0!jUeP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80007gNkl<ZSi|j>
zON-P%5XZ;ys^~#bQ4kbVP!|PJ(1Qo};Fs~_LGTm!z$b_zzD3;~J*<kNAP9<2R-B}h
zakA;EjtJfa4_<u6e|IL!B$H%%VHPhr6zQ%`s(w{nU7bc8$Bq9fjT)c^r~&ed&+TB<
zd^sz!J@Arp>BM{iut&!$0odmqEXWyV=#x9MmIWUmLFd@ztAIYJT(xm10BlPkca;MO
zx?crA)3k(Lc>(YIg@i2RBtRxG{%CX_wbTc-v<d*<-zx+N{csar_)`YZ?RFPq?Jb1K
zrSbf_^yF>;bpR0nYI!Muf#<OS0HpIa7Go@ub^zIusSQDw^qTV3ic}YMqLtj?HJJ<<
zC-QM7bFigt>hHA=?JENiif|nkekA~@$jMm)ZCbChLk{iDMRXStKhJ>rYO9V?Kl_TW
zm9<U3war<8B)ZHC830{y(9IO2^nu=%fs-WYB_cjj0iflg0SKLNH6}l*0LY^&sPtRu
zSymq1>>2$6`I?M*B8>{;GwjlxApk%1_E`a7enX2HJG=qL-yq6qJip=j-HZjj!`^Q1
z)zc~H9$EodZo#3V(^0ksaQGDZvsPPRQ-qNpZZpRRjVkMirvUe=UzgfazT9VBgf_=8
zaYk+35Bf4QhHBrL&VAos1UruM`8DPXtdF5hBMO3GneKl0_`P)G=Hm8Du67V1V(6N4
zYD6}z*fbtAnFN%dA*z#@AH)2KPJ86>3)~GR-KeX}d5FqZJeSKTX}f$H$McZ^5p*7x
z(VpIVQ(sU;5JNAc5njhlfL+T&484v=`a{x+7h-#^o1*jRu=NkgNX0<#QGo2Pe@bhB
c8lX)60q2J;gg_#9K>z>%07*qoM6N<$g3CxhvH$=8

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_dark_48.png b/resources/bitmaps_png/png/zoom_in_horizontally_dark_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..1d50790eb4ed82f6d27ace08470b0718b3c5c550
GIT binary patch
literal 1025
zcmV+c1pfPpP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000BXNkl<ZXx{CZ
zNoW*76owNO_Z>lqh`4|tQ4i|HT@e(#xPY2qE?)GYAPRz@M-Sq5@gg1t6+sk4JO&ia
z!C*4I=)|t7?wQdfNE9VeNlY^SZ@Ome^z<y%Gh~rI6v<T8>w4d-_g=lKnsho{Gm%?O
z1P}p401-e05CKF0;}L+j@_7l<S~J!PvKXsRXo&^N077Gzna(zkIRJDJ2D_vL&>icZ
zC3OB}+yLmJ$285^WdlIqJOI+F09a(It+S(C=MV4=j&J-y8$?SALp-Ii=H})p>Hs{=
zHGZxv0L!wbL4i-I0Jg>s2!q=s=V|?DzkPiPeE)<h09u!A+tW(|*g8LzU93!iS}1-a
zD+Br0uzpiAo~+Bx>FDTKguWv}6EAY}G=86qr2qgKcCt9Yqx57<v{V4FwYTK_ANaqq
zjQM*gzFZmckPJ{R0GjZ-px^hKyxUz0z|q-3Irlp^_@;8*!ihP{A=Bx~vNH+*1bw^^
zz$EylIbyQLKD)svcu>HSKWDbqV8?=!0e=PsTT*XQGx8KO*cOZr(axpJ)WQH)W|_4!
zI{ed#bR=E#0ARtxzF_mV;XGF`c!L~!6{I};d#=Z7>k0tglLojDFjhzxf;f~1fPuFv
z0I<+wncf-;o#Z)rL#z*U4|f;HjapOykPO~sW5-p-Wc!K=1OT8fC9S(SEC9Iz#{19)
zD1np>kl8hRZw>%y@TDTaBzZvf=KFl{g~@u}OoBd*`cv&4OH=?z=Sl!-sgDBCx9EqG
z3+w!=H>mNuy<&inF62-@1#2!Y+U)sEV;iVhnzbVrbTQtL?f1JJ#=p^S`cGLU7YY-^
zbO_0eus>`JAOWnEbM%UWI7}L)V_gC~2@8O7;-<_(S1L}U#SSt$RQwCX<MBCi`-fqX
z?Rg5iWr?6UK?jwkTPtOu*Dv0SWdS?Pl@78nr34f|E$1dNcd388v$b=kH%2`0b++M_
z5^$rd)hZ>z6mzvy=gX{M!#W#F)j?!=%<FP1S25_son2Kc=E9WIloBEHT*}}A!|qbH
z@mHB5CRStY8s_|xbBE;LUT*TO)hVaLUTCm$kh$nlj<&i7V6D{fyW3;M0f1b0OlLPK
zFZ=pz-P&1|3r!_gO1ikfx6eYhO`g=bEJlYM`Fle9xWcn5+e$$wUn#3~sV8fZvdm<w
z=z9edK?#UZm-^9uRw)J%>RBaM7Q|Tns6C&UjAG(vHn3$P$UJP3E)(KuaRh|MZ%@d#
v(aa^s5O*kcqSxsNAOeU0B7g|szX$jW%#D3n|1bqB00000NkvXXu0mjf!&TNQ

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_horizontally_dark_64.png b/resources/bitmaps_png/png/zoom_in_horizontally_dark_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8aa064ab6591a4d6ad11f16f0ece3ae94590339
GIT binary patch
literal 1356
zcmV-S1+)5zP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000FONkl<Zc-rln
zX=o%x6vvbGR#d!2LA*YA;(`Y%-hvmpc;W$~i@OMlE{doi3Z5vqpm^+lP(i;4K}A6f
zD@YJTMaI?XgH6))swSH?#19_muDc$|_<u9qnVL?Y(={+5_2EHCSJia=-m7<24>g<3
zq2(+?7Jvm{0aySQfCXRySO6A)1z-VK02V-s_`bjAQrlS3cP_M;^yJ#51_1B8#t49h
z6Pzbq@!paHfOnR4d0}M$(vhP}6##kkStS6<S1YAU^QHl8+p^^lRafUqU*60@K3%YN
zeCtuhEx@HFxpY?V09^Wz7cl`q{h*G;I?rJ}w+)rojfqD}y7E<=-!n`BfPBysfQH*R
z8I$L#0+^VXI22mgfOY;&+;p<cW6nnm%>aOTQ5UC`2B0m_GXUkNi=`ueift~C4!y1%
zaW^@1O~VmaD^J{o^ZKH4$cv5r17q%}2mm7AEd`)aZyeXHvGM?*!5cAmm$sSjc(Zsm
zoHb84;!KSFT(<^n;E`$o=s)3$6AJ^t%Wv$~L^%M692a5U-{Jf@X!fbGv9aAtSr4p2
z1IQ5WtN?(W;f6v0;Q5clgq^(tU=NQuvk`eV^<K}haK-spV|%#PF7`{k0^s>cktQL7
zqV<cMk|Q@mi;s0gos|B=^j2q{crxQ9hXLnaX!=p5)ZRHqDT*3jrjB#yboL{WB={4K
zGV3z|gxdQv*GnUIC%wd!GkN@i?{Mhb=16n5R8YQLwP2nOJzi9sILnu%9J^ZzM3?Qs
z=HReY09fSNLSZTe0P=<xG|ziQrjzvOzK&+ZYguEbf1EfP<Nj%nl^<6C!1JF;1P}zl
z0T}RW6#%Ue*B&#O8zo8rXm3z_5{~~X>BtlY;L`6@qXQQKU^6V7s3ZV@#*ffE?klDN
z;Qdxd<CPm+QUO4d{a6<OCW;3$RRA<Raj9nh@sKr4b-KLulA)09EIlzAdv<NDR@)<?
zE{V)|O%(u;pJ!?_`*r}h;=vM=69Hh2ThlZI->|OK`fV%P7*DCQqDx5t9NHh~9{{Al
zF)#jdSpbkvyBwiEeXwR>PnZQ@;0P#RTopZUxZ;NH@Hll)E5Gn)Bob)&d+i7W`ZHL}
zn;cRTinGwdXr0j`V8RIoZg4_cs4?OMJ-R6?#8z^GhQi<qEd~C{GyrJ*ohZGICo@LE
zprJ(Q?IJaJSpehX<NIUWZ&~SZ<wVFtDvbZ1qvhQr1**L$6@DoP*3;V9)qP8a(~2Q3
zEc8Ny3y+LqXj5mNxIR;>NNZW6S)Ctlk73M?sF{*hR&#--7i?U>l`e)%l*6I7-nr1x
z$!SVvme!NoR#L|z=ar|f?0Y$Eq#@$Twc7k&I7F7+eBcMCs!lI}t4oztHXCb*m}-f!
zv(a8)uGI&Gb>+?D_{<%o#a7trON<tUP^l$mtSQ<~f%R_i4rt<i_>tSE{NNPcEGJ3i
z(=nVp;rSbyw{M%hE2m;0Hcfv$y-#18q9)to*zDPf4k<5LaY?|6t_v;Vi?R?Zx5W)#
zjI7{@5O#ZW?gzv-(AYit?QSm+DqoEB>uQXP8g_~Zr4M7>=UG~R`*IaDb$E_%C=9{K
z)!3k2j+TL7<Z^Tnug8l*Fm^pYh#yGI)@S#FpBRgWNECE?8UH|HP(P7Lgy6~h`|^p*
zph_G93as0f-B)6K_7O!M>h+k~&*Urs3%~-f04x9tzyh!UEC35&dCLDhwDq98c{j@d
O0000<MNUMnLSTY?WPIEJ

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_16.png b/resources/bitmaps_png/png/zoom_in_vertically_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..63b5fd882253181fb4d06f2e63a25c9ab9c1d025
GIT binary patch
literal 282
zcmV+#0p<RQP)<h;3K|Lk000e1NJLTq000mG000mO1ONa4wfZ;e0002tNkl<ZD9?qF
zyAA<C7=<@+NeIDHAPN$(jkrXJC@ed3PJ~7w*-pHIXHY4q^n%1Ah|&`%HC|#33bH#Q
ze>F2-=3IWmH9o@#rkFDFefN2cafTaQHFwPWNe{p<NQdVaaH6A5Vb2dQ%mhJE(n`EN
z$fj&}qdx#q#!ksNJc_CY=ti+~LM+g%2eGx{{uC`v>^v4&vZyRtJ^&p#Rw8R`SW{Me
zKER4&%Ye#JsRwx&r8Fklz+Mg^c)(R=^f42(X^&D&<05k!K$M<E(R7VLR<1Nv<MgbW
gXKmGgmi2qx4>M`tI%Qdi8UO$Q07*qoM6N<$f}8Jc;s5{u

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_24.png b/resources/bitmaps_png/png/zoom_in_vertically_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6b57256e8da7702e6bf47d7abf5fd3c0579b223
GIT binary patch
literal 378
zcmV-=0fqjFP)<h;3K|Lk000e1NJLTq000;O000;W1ONa4N`Cco0003&Nkl<ZILob+
z%}PR16opSJmXP!yIZ^^^l39a<61;mYDJW~u+<`uT5LA<<!hMw*1=%$P6SKDnLTXYF
zyMc5=(sM5nd$teXVeOx_jhbn}JoD3Erle#GcTgyLpqaA*jfm``3;hW`qLPcv0E$V}
z#TA#H546M;7xiM&DhW0J|7xfj?C~D}3b?`uue@O?1b|ZvP~Z}y*hE(@0|0Jg$VD}>
z%#51j1@@(E2d=TBMh(uSsYZ>H#l024TVcMGl5_FU!v!;q2wr9mZVcpNPF7qz;7MF(
zLk&iZ+a%p`eL~U-dR9qNW`}V#TxDJj6Vj2RfVN5#U92&xrj$Y(pK=g9xC;9i;Tc1m
zl=tz@!w{>%_;;z;n?yov4=VU@(iVVK-w(BM#z`|_F%Vk5AG`nq{kA9u7K{Gj2!uH^
YUlUj=kAND<0{{R307*qoM6N<$f&r15kN^Mx

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_32.png b/resources/bitmaps_png/png/zoom_in_vertically_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..336db9af1f401ff4d9847d5504880a05383be1e7
GIT binary patch
literal 523
zcmV+m0`&cfP)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0005fNkl<ZNXNC6
z%_~G<6vhWzVxfj4p@yj;BGlAau&@&MeNJQk2rCO^WocOWD3S6tqA@I#h$uxqql^V(
z#L`Y#C}lF&>2_T+M%Q~MI-B=?oZr3gIp=v^n`$$QuHvp@^EXT$Q7K08iZ>Aum6idW
zE)hTssvhrHr#fkXs6_~IBiRVrQJQ`Q`0ViGT#IN@dPKkL_t_<DAX*avipO#hsfssZ
zgx8ry7v$nU0ip~&n7|x*)0hLw#T2*l4$C5l8(xJv@+<(_b8w0W(fWC<xW%=&{oX(m
z0H$$I1zKvMQlkG+n6@MVUI&kEi@udr?CYx<#HmIKz@>{C>vfzO>qGeEv@nY${$i0>
z<Pmzr6G9^BbueHID{_CZfCUCr;Dl%Y880}eGf~gr5!#Rg^dbD?7IrZ%E9W>h=t*lh
z(o0*87`4f^ag8q9b2M1BXw-U;Ey8qc%a8>4@^MEOovwtTzG6{_`ZJ|RSt+C~o`yXP
zV+h-9ZU@{E6*H*_6EP`nHq}jrOj5II>(69a{eZ9_Tt>{NA}nd2ve>It3`haI&O}S2
zDg!ZyZYhA`Ni@|jY0KMsB+1sJ7Hpk`oBqM_Cr4ZA;Yt;0+xqXv`v)m;^8j60`Cb43
N002ovPDHLkV1g-C=JWsn

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_48.png b/resources/bitmaps_png/png/zoom_in_vertically_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..685f44cf1d56626c86b2173d217df7122721d65c
GIT binary patch
literal 747
zcmV<H0u=p;P)<h;3K|Lk000e1NJLTq001xm001xu1ONa4{R=S+0008ANkl<ZSi|j@
zO-NKx6oB7om?mn35Ev2pL#t{rwbII@g%OI*{f^@#inORrVXL6sY+6Krn>NuhC^wN1
z(W0Fd5=coA5?JOBno*LBDe5?<#mqRPlQYhHGee6woA=(moR53Xx##CuYGqf_+AMYQ
zLSC6B%aw6}<uXmYLBk?LbV+{30RB9Lk5T1OF(Y!mew$-}6wqZpZB)Jn8I>L>vJL1g
zmL4WHQ@$oM_@yjuKy!)oFr89)RDR%>U1<SKjkx25nFOU1>vxzMM^VINqLVWkrdbE%
z=qCRMB)!q%<q@A*A!x?w6Yo~i#Fhc3#f(OxXNkqg)0jDz5rE|~w@{SV(%D|2mRi1Y
z)5dcY<>Be=jse_3nUk{#r#i)V)bysR4XJG3it@{I^sj6CnL@eb03Zd7p|r=H=cx?D
z611n5RpvHJb6WryAIi(vdq*jXnnQ8G2Pju;19*(aTVKjhwDoZ8i>DTq0sDXn)VDhs
zz@NuF%gO3<@>(1u5Vd_mJ$M_wYP?5fk1c@ZBE(z-Fq{DR8Fsb|*#@Y^S3(`7YN^$-
zQ{3W~6DVqY;ud$*bj%X$F0>m(y{Mc?<^ws1$_M*SzJSV;WB_iXT(b>mE@76C=lB{R
zpD)bDE|#~7MV37KoTQ42s2OkH8+~uu5%!5%YPDA|g>v0dF0x$op=Q(^*|_4Zl4+D+
z+ewGnREp#o$_n?z9nG9_fEz5JvWgOrI)?>E^0~@Fq=Oq|kZ&l;GB>4x0Lnb|j!UMm
zoXfl;h@ylT=DMj=OD&G2LZnr|y9-UFRCgAy3*{7u4D=1j5gBPsq=DZk0dZ%oFNz@U
z+6I`Bglsyweut;l+>`1o0@944gaIURl$vogfMk7y%K8wPlQA|YgLqDUCBzx5k$(E6
d@t>M-{s8=e20Fp3=Y9YH002ovPDHLkV1frjUW)(#

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_64.png b/resources/bitmaps_png/png/zoom_in_vertically_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d7b02c1e359a8e5556ca515a6033f2958863b19
GIT binary patch
literal 992
zcmV<610Vc}P)<h;3K|Lk000e1NJLTq002M$002M;1ONa40ARUQ000B0Nkl<ZXx{Ca
ze@GNT6vx$mY6YofQBk54XqiGKQIeKX8lAX1?{VjWq?84vND>iba!E=-K}Yrrsz3ZE
z@Q*MI#2`WtilF{65Hg7V2qKW8(zMiTc5c_az1?H>Zuag7d4KINyYtyMGw*%pO@c2W
zwieOLm<$cjfXOidz@^v-pTI}$3wSD*M-@Oy2M>&}!8Q91UR)g&04akG{w-i|&3=Mc
zUS}(SD-*mhW;nQJ6Qt9*$rb=-Hn|IbLJqFk6m(&(Pyi{PbiyRp;F?WC4;Bgmz#{0O
zpYw%dI6(GC1c1p{4_!evWIEtraBr*+9Vf!rIM8nT&&^SZ19JeF2WV{0oG2%wm}kQ|
zfEWWv>GDpt_KI9<q72~5B$sH^n-!qR2k=VyQ30r00k=)E;xs&RW!emY#i|VR!7y}S
z4LJnm<Op1bx0*6Sw~YWG!#GPiub@03QHQn-o~nL0V-tY92PPD`fh{HTjeAgED1g&g
zZ36%mqMzx<C$T1^k9JXI=!0?opv(<G?lA{n2zWUWPQclk#ky&ty94_L1CT7X@?YY-
zfO)TAE8?84ZzpTrClo+U!3T7$Cs_=*p<9k?;WusX77H*;Klv`G)ewNTKc?+tfm0I^
zK-DTX&~<KrTIR13VF2=8HmlV$ORv-~K-7iVs|u3C#}}xRP{7)c2?Idq>_4K1QZq?*
zXC_<+?HB<7Sgbnuswuz|wSOAxe_k9w8T+8*e{!diYpUjdt!4%GL~fBR^%$4K`Zo##
zaAvcCT6q^CAx4`v0sv2v5{7Yrdlx)lL3^dhIB;J{GSU_vfQn`Cl|LBs>VQJ#)UKfH
zr?g(twO(YcwStoo^s&FK)ctEW_6MpUDIZ3ag=v<u!!J<ez%NDdknJHoRRBMf$sz}B
z5G16IxpoB0OnYo*YJf^qzC2)ElC`QOn2z9zm?H&Sn2-F{%Zp%Dls2l0coZIzD$I4H
zxKnXGN^nzI`AiXhR1y043YeB<xx543n1y2Uo;VyS@XQKA7)J?D5~-vLSa&wS7kCsG
z`X|E*LinZHG%Uj=XoEIv!U`!Pa6RxN*mUINN3iYG%Zp&+!Ml11Jl8g5`J$NA2mT?D
zQvv~KP&O%2VV)_1OJtd@*;JCX8&zA$X;LS)PG||hjzVSh0E~;(IA{tmWJ9r9-W^G~
z9!iBw0oiK#!eUC;g+*Lk+00DG2A)eRvhn}Dwu_64%ec6@jf=}`QT7*C>pHdL&}4f6
O0000<MNUMnLSTZ*Kevzo

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_dark_16.png b/resources/bitmaps_png/png/zoom_in_vertically_dark_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..8e9305f5cf18eafe3ebe422f309c86d4cd74ebef
GIT binary patch
literal 392
zcmV;30eAk1P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003`Nkl<ZILoC|
z&npE{6n^DVMEEO^1tm5@iDW~Rg_VV}lYhbAU}eF|&O*Gho)vF1^>Xjrnws-tUN3Lq
zpSaE$CJJvZ7GF(w?)lDlzVqFh_rCTWI**+}vT&@>@1O2{IdIMmv&9oK@Jtr{J6_P@
zDYtm6CxH|XkfA*`a3r0ZC4mq=6ld~J@AOnqf*dVqfdUhp4<6yO2WW7O6W-{?-JxF*
zKmv=D(5=cYVDVm*EC&&2H!Y6ixSt)*>L^hZ)y2e{G)+e;3CPmA;7~|rr0W@5J_iGH
zg&&T#DhYA}o1DObjv*dg$`-EJ@XFhEvh7L&m8o+5weKr7@kC2L@^v9<v`u?F%tQyP
z5~Mp>-@cITiir)jfTCnFc#Rn2Xl`Lgp`As^gs5m`E}IS`knog2(oqV3Y(6C<7eP_h
m_<p<vXa-05Uytc8&-oP>!uPY`b>67}0000<MNUMnLSTZ;)U65t

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_dark_24.png b/resources/bitmaps_png/png/zoom_in_vertically_dark_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..1b566ccb28c41480fc62c718464b298aff8270ff
GIT binary patch
literal 502
zcmV<S0SW$zP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0005KNkl<ZNXN}q
zIZFdU6pjZTp!h?yQUtXTk3vBU3xk43V{eiC13_(U1^<FSL5m=0Jc(vz76SX;%tBg0
zf;I}WzBeXO6P09V5sMFYuJ^tBZ6XZAM56!?CK=7VY3LFPoYqojwZzau=p12@&RSdu
zTD8*iB=EW_xE@j~Sj%KG?M)FB3WZ+MI86ix781^Dg&T=yALlyFZz8*h1f;$p*o-X(
zF8Ch=fq+?Z%MqbOcqE(z5*A`1pmf|Kfr3f!2K&OpunqG#WwT4+o)dxbV8#ekp6B)O
z+V}i^5HMuVjOikhJ4%3LWC9X!j1uRngc7$2`_*;cjL@A+7lJ3>_d6jE14iKv*Mm_y
zhYEMgmbB8Hho%edGXX!gn%aWGTe868??Ays`A&&k*b$ZB)Ce>FlZ(ibVeU%~F49RN
zxvFRw2!FKFO^exLH=h{=>rQFP8goj5gfUK0+qO9-0xu{YucX9^bD?p^d{0R(G=0yh
zOL5qsz%SF@GwrR$(kj?hwE-m;E&WCkOTQ^w_!8v(!AJz$n(K#+PJQWDB%A{uY2eu5
sQb#~T$Z_B_GBQP^k@;6cKbGH?Hz%&p2dJn_HUIzs07*qoM6N<$f&lT?UH||9

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_dark_32.png b/resources/bitmaps_png/png/zoom_in_vertically_dark_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..735a479896dfe362c872f1558b6c3d82991ca21f
GIT binary patch
literal 697
zcmV;q0!ICbP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80007jNkl<ZSi{v<
zON$dh5MJX|(Sx8OA}aU*6-7}&(1RZQGoCyM{sJEdT|pGVH_E#1VPR1e1wrwNVy1gK
z&LmycBZ4=<gCHn6el?kuWHVWZY){lfG2NX^*EiKwUwu82rs>F_X0=@@HkUmHdMOE#
z)vS4xHGPGBV{NZF<u+6fzy@}cID^yguyls~fK6Ftw|fVWnASE9X&erI7C0`l2QF~C
z=L`U0UP_9NJ58^r4VyP-aU6C2SKgI9yygHlJ<u0`;=Pq8ApmU7j-$X5oopOR75KFO
z6To}bT!Z8~Oq$N&+^;xAM~1=!$m>O{?1j7>Ti}FS05XR0yKD`4;NH5$l>msMXd#@u
zgt1gY4@re~4*)d)BK}k94FmvneGwazGj7>$f@&noxxuTtBBUt*kb7PMP@UEZ)lxwF
zyNQY>@Wqe2fEu?|jzgZ_07$|K1NN@dlpISzw4MqJ`inqFmyzi=W&EKYuW%vV$a}*_
z*r)cG$0SlY;4`e~w#Nw2b+K$5@Oo_iBI^r^KI8c%?-8$1mOC=QnoeWwj?W`FD#=y$
z2oRBnSU>Bx9ZQ`X-r4PlCjstR=UPj*){0(m#vb%qhHYn57e45S%ob$(uIafkW&y$<
zIK$5|pXU`o9LGz9{ovq@D5GL}CM9h-K~iF^=ADW&;sMFD<rhCfshz_7B<A-e>`BN^
z&>N&WQY7J}G9U(1!x`=JD9ZD021L_&G^2g_?=@*qWkFQcW@`X;wG4>rdi{7hKUdHx
zB6Z9g0Fhn&B$>#yUJ!f&Kn{5WAi}esC@pH!Rmk#a7Fph`M3!eQ_HSHF{+X*;naink
f$)U?~AJ_9=30W;h1jjPd00000NkvXXu0mjfD@r&i

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_dark_48.png b/resources/bitmaps_png/png/zoom_in_vertically_dark_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e427610425e2d7858a94ab2bf8a4eb2c488de35
GIT binary patch
literal 982
zcmV;{11bE8P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000A>Nkl<ZXx{Bw
zOK1~O6m3-e;s+6giikg4sS9=GUt9<x=)zA0UAWMVqN{>CH!j5A#*MfXv<PBB#D$B3
zzakXd%%@G9_ufo1Qd3b;T9wwe@!a&KnNE^sn$Juoba83&-kr=j@7;Ufz4x^tl}a^)
zS*rHKT<5!l%3nd=3QZirSR@PtA_NwoKR{A0=@J?{n|hL(U5f-}2}K;|D%bM>pCqQr
znW?bzZEbCH0w<vB`dnI7q49Vz;5njk6J##i@9hP?6G%pri|FM5Vow`*uJmK)uJI1O
zwCV(6vDjh>{7VIZyF`2=BDQWXuNnc~%{MZIZ7U?SnjXN~Q~d_LBd{oh75wbQiEB2D
zhMquOoy0Q)W(bscGMg$p31@zcxX$6U{~#lf1ahQSnyXX_QE>vuZ;n!W;EFm!kiV|6
zUJyK2O9YUC^4pFu`3|dpCJ{?CW_055_zH}jK*INOLQmn348xcgI03HkyAsqdd_L_#
z{~&a~%JiY7+&ZBw@RrJsN$@|p#&>vrE^4jCGkxRFvP*#wNT<@U=d?L!>{LD-%smId
z_IxQb)7VbTkJ8RfH-W1N0jzkFT>Urs=3(DU9GT{p0t6q*1!(r20G#zHy}Xd!Q+}T<
zUc}aXI&v4tjM{xCkS%7!%2ElWOHq{%LWWDNl}oRI#}BB1T$?Xa4=CcJ^Dx7hLgRK<
ze3hRBB6#T-IiQO`kB5ThyVI%D-HHGR(2Ff1LC!ki7oFy^Ol4&##@-BQ9_3Bhs%^5#
zVg3j0rfHh<eI_7U(%@8nxKtlN0N5;bRR5!p!Y)Vx&q^hLbmESTLf3sKKphIX{bO*<
zJvlmvDwq?blkcE1RAaqN^oB&YSQAJp0pJ(qDkqrAR=el>I{FqmeZ)b&(bUFM37FB1
zAd@-jg|=ooZ7`?p#h#&+=d!P4s$#^7S^ERcMkyrXRDL0M0tF0vK+(pXWs0cSgt?p0
z`6G2l<=+A7WCvT&z}~T{R~_Keoi-5bAi?*f;~W?Ukz1B-9U$;>Y|vDVeSw#hRJg#l
zuK-Y|JgGCF>Co#Td+${~t#j<k?s7>~t=Oi6iNG?QZJ=gw!9Y+ZiJIsvltZFs+9TL0
z@`>LW$CiO0Tz#QQBouzncLLP7EtZW^19(ajROD#lKKV{42~;%-dAQ*4a^=(?*ab)E
zub4uA$yYbmtaWqIT~GgNkQ-8Ub_izjnuI>j+|U$||GwjViBlV|0000007*qoM6N<$
Ef|%jcE&u=k

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_in_vertically_dark_64.png b/resources/bitmaps_png/png/zoom_in_vertically_dark_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..9640242649deab87079e5745744471e78dc5d119
GIT binary patch
literal 1303
zcmV+y1?c*TP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000EuNkl<Zc-rlo
zd#F@J7{I+|npR+z4^k?U0@G5kL@Y8hdXZwKRDzUL2&G(<5Wxp3B?SeEJ)!!ee}el*
z6a}Inmq04wrtX<D-p845X0O-e5{OZ1zPIl?XV2Z)L-*{S^_<-~yXTJ&7IyaD`F``w
z_nMgzg+gIOD@()v@xadmV<i*oNa%CR0N|Y8pcu4EOZ*`j6pHdEFxajRtMN?>;COfU
z&7>qMds0(8D1S>PcPp-@Gz|ce6O)RH{}rNmP)-vFC+AE{EdVs<J4gvs=4=GTgK{2y
z#Mf{H?oJH=hdI-wEkDP}U%U#%gK}Bg(9zGGdyEBuO3$X%!pUBWQSqQ$LHR*)InNjX
zz~LcxQr_eWb(Di(!D9^r;Kp%Ft|il~C=9x5P>@yiw{Z?vlSkAg)L`7-6&Zjnwlqy1
zkO63Q0O+jl#l5;BisV^-MpG9<Enf|005SkA41h{wl~eOErCm-!+2paFW4AUn0Ixa}
zZ@U@ZaA~s*%B>)=u4ozny}iA+0E15>R)<&cH{TMpR0B|!S{P`3kvP(VkCY`|!TjLq
zyd|Dews;wAcvo3q2RlSKW@Rb?;0iv63Y^oF`Hhst@7h8;NS2t3WA~Sr!1AqB0l-Y|
zVXvFxH8XH!w{>=Qj*4VGXcZbjg0LzT0La7Rga?ZgzeJ{9b3c)Z1zvy9{afdfNRQ)R
zeFk3)nXe_bhKy}PIBRgFH!7vBtFV>)sPU800Q#-IJBPfz1-}+L3fBw^ip!-wD0Fn2
z!lAmYHg~Mx;!$G(l$X8o@lYpe!y8)ZyC<~!bfkAGj=SKEmERc)zzuPpQhgPpL<9hy
zV-?>Q$Da+`GL7pBGdX$4q#1k|HvrrwtNrncIgc0zAa9FBn)wGqRvYACvEJ|i-C5dV
zZ{WLUy1KfqE!$pP%_)tSuNenGG4aB1E94%AMr?^8gwKL0b(PV@005W*2fX<EHMGTl
zEOUf>V1j00o6Q5j#gqO7^GrNj9v=H|!b<N0y`PUO{JXXV9Q`}Am`^CAmTfUif=U(!
z?ZyFc&jd?*bZ6{N(1z!$4Y7?1gCn&R_+Z=saMi!^(`)CDGttyU=u5wN5jim{E&x3}
zJvZXGQ%R)5@g_oC&eOU(9aU6&ek%N41z0<@v8zolhW3@Bfmjy0s+iW&iiUN5ykmDb
z<2O^Hmeq9!Q1sUS4s~=G++TBP-FJKr{{A0-TPa&Tk&cFlEnnB-`AG_qk)sNCW~x#z
zfT~LsXAO{eON>Hc*%cS+16FbS>qOUyanwQ5tf(ZG+#5H9q)&z01Kr>=Xwu)HQ+tW-
z`;fAfBmsxpD0#x~Ki0gxXZB3?2SDtL^I~Q4C&M;8fGc+>YATHI1X|IOqD34?3PQaO
zMn+OZD0X`*oDYa!Fw=XLb3Qt-EfRrH|2x81)R0rec)kIZeTT&T%;i$LR9V3{#10`<
z2boDgNZn~}+z?WEq&=7$ydM2TXD~!Mjx(lZ?g#uY1Y5poBmg%(j(ACmE>=Z_fCbiz
zMgpKKZ#CoryQ;mhim=vG`faQaND@FQ@_?oU5b?4!tD!60or=rS!WIuU?7Dmo7MpZ5
zc3&MHOk6hZ!9@0CW;lyDDsPYN(bQ46D|<GVJ)F#*&SsCNv)kec$bX9L_Y@J<{s#a6
N002ovPDHLkV1kcfTOI%a

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_16.png b/resources/bitmaps_png/png/zoom_out_horizontally_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b9ad0a0d1a591cedc463c79350e7ae1b70d7b98
GIT binary patch
literal 264
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6&U?BzhG?8m{&BuR-YCGiQQcb4
za{|u<F27dJmLj&@EW3Xf9sHS@z`Ahv;j0dJ6kbo@U6|>x!}J8-5&m$#o2(%Mv&24`
zRGh14i(fZ^H*<{wC;PMsrFDB8CO>bn;q^`Ch!p)~|0H}u&5G=dq6Kvx86Fuc3<Z9(
zo^1KUa%xSBHpfSvKK@N?(TV&a&-lX`HXrIYPl?qqKGJo;H?XNdTcD4pl<TI1jHHmr
zF3l%-8`$nl)VTMApO=TXM~Eks-%@@J?{~Fr4P4h*BDr}rqTIz83cH>;)R_fV1HH!J
M>FVdQ&MBb@0N|5e(EtDd

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_24.png b/resources/bitmaps_png/png/zoom_out_horizontally_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb37664a3136145abe6e085515d31e7db191186e
GIT binary patch
literal 367
zcmV-#0g(QQP)<h;3K|Lk000e1NJLTq000;O000;W1ONa4N`Cco0003tNkl<ZILl-B
z&p;Yv7#<p8xgA)DQR=`F%MI2LAsZY+jE2zI2w9khYYj{Yi4f0_T_GPsK8GF*4McJZ
zW9VhLhLHauL2%{GA(uitL-|9QL!3iS2lv9ngM&l<gEfTOgtP%QoPk>F5ppGz2c{^2
zBlJRW7}TIMKviv_HVh#RKn4&7yMs0C4)H;DcaTNMNvJ_!RUr*<4IziX=6vyF57Y^6
z59t8GP~!%skoTZ43^{~Tg9A&DMes}r3~~gDd<<p7ssZYxBcb*vPBINShvp<yPX~vE
zo&uQ&4Fb;KQ^E0Qo<<MW;AtVJL##rX|1$*Ygq#TZ3yV~Euwse0xX=s0h<g)qB_t&*
zGUR7yEJnm(CXG-wn8QLMU|QfwgHYlNi3|A^WQ3IX2*V(wP|o3$MFA;EBQ84(mlps4
N002ovPDHLkV1mspi?aX#

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_32.png b/resources/bitmaps_png/png/zoom_out_horizontally_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..d39e9d2dab433b2c8b05b38250dd37c87294d736
GIT binary patch
literal 505
zcmV<V0S5kwP)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0005NNkl<ZNXKLN
z&p;Vu7&Tz97!WE=j#h{+Ff*hiLW*SV5+TJ118PEgFqH%=g%pQO4_OdW9;|^ywl|~(
z*?=#hqA2F`hs+B37jipfW$=oS>p<4300CtAK;e+js0REGX+lW*@rIlXxfkpL;|Ey>
zUkkn&DUMJP(hSrAF(6Vr*d=&Akozv04=z17<Zh@0nu{)m?tt;4`9j`>{12WV>=G%?
z5E2U141whk>2S4>zah>Tfo2f$FVq0au7K+aMK<82FBjPU;*eX|!ad|@NGFI+;0Sq!
z-GKigx!~}fAF>P-%fU-SRzYC!if}cc0h2;jgXQy(bYL?eWO2x1paJS3Cqm9ZVCbn}
z6QITkp<D4A0P{js$VIGP*b_1pzZal^7;Fd(E;DrP;mRSuLp`trBGzc!5PHFn7bOmO
zf-i<1XJEt<jo1=Wq)5o^(6fO$NQwFqP{pbSCM*dFdr}UP4BY`t4f{j-L%KtDhWrjW
z42+HcA@g8HU?ycOnJLIRWMarRpdm9t?f)}0Fafg_k`btxiKy%hG-4sb2$bwhY=IKW
v9J~l<L<dHJLP9aZ9NYy-ZllHeU@`yz%<$>K?$_h;00000NkvXXu0mjfv2xL&

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_48.png b/resources/bitmaps_png/png/zoom_out_horizontally_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..7db4e660e62b6f3d2edd0483418a818b8554e5d7
GIT binary patch
literal 730
zcmV<00ww*4P)<h;3K|Lk000e1NJLTq001xm001xu1ONa4{R=S+0007^Nkl<ZSi|j>
zPe_ze5WwGRq+)+8gusZ%gdpr>U9`d^C<$VB-|y+JwIE&WP!I({P~fG5^zYIoItJw>
z5+b@A(IK%Y#6xbTrG}U!Yl^z=bnsi<-S69PcWWhx<y}68nfbjpGvCZ8QR{nD0Z;%G
z0RIobSKGENpKi@ovp)$yJ=gOI;0E=nfGM*nU+zQYOxgirF1tK=qiN*{VU~#MQF=^k
z;|7=eUqKuIOthCe8)&Z{Mi7Jr=B=+0ea>0CxrA@d0HMR73OxD_g7Dge0#%|!1uJz6
zFA;>t%_R=kIgg|Re6~NFdk8b8&F1DflZftCo|Iq~^C>+*^w|`3AHq-nA;-MzVI1LN
ziZo<}a1Ee`2s37h2Re%qQ_BcKAYC&34J<Qbwy#M#ix{vxjS(g+N{O-r@#9YjLlEJW
zYrQ{0xSC+0lYGUT0R3xG<tbv1e##rfyh#AQ%?uEIVpaVs65Qbi=qzHEMN@2r^kj-J
zX8^sc#!(^`>bXs;f2HF1fS8?@R&P!K<srt5Wjbin`eDjMi8AkV1|)>&3$Zg>M2YfN
zn7ZT>4;|A);~gNo5G5p8cO&MMYg;~mn2)(7IiXDHK+H4OGQEp%GgFy{)BR|tH#1Gl
ze>9!@*1gQL;NP9@N7F-@Tg3%Lj|O%*xert^j?k5{Rk$@f<)H`B!}_58_GSVh+Hx$H
zX6MkZO__Otu*5@C7f-+0$1Ua%vy2cihqG<hX$Fod<{EPd!W4b<@f|@}<hE%df-p;C
zRs+XvWCkm_#5<xZwZR}=x>}SdjyNHlM`jj7zr9pfo0?F0k~0T{^U(j}wZ#cxTU&g!
z-ip6ivzqvY5HWReiMPU6o7dIRLfl`+-PGTpADEiL`d$DO0RIH=8wDi^x*7J@8~^|S
M07*qoM6N<$g2V?)!~g&Q

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_64.png b/resources/bitmaps_png/png/zoom_out_horizontally_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..77039322511a9b0cc5a56d41dfb6a3b345701949
GIT binary patch
literal 965
zcmV;$13LVPP)<h;3K|Lk000e1NJLTq002M$002M;1ONa40ARUQ000AwNkl<ZXx{CZ
zO-NNi6o8+al|~Egmx>aDz=|~bK_b!;O2enVJLmA84@Av$(?XJ<MI<H}EeZ<yTUd)W
zmW#*;!YCpr5*I<#qEv_$L7NCH)BJh2x#RVEf9B4er>|#=%UQjd^X7c_oHJ+6Oh64R
ztOR@jAHWCj0ek=-;6DPu#mO>iwqzQH<H-UbjeLNC<oKW|9X|2_M#-_H1fT&%-2jF#
zO@5)!3Z)Q%%Kpf@ILxP!Pp$x<VpwL8NDeuV?;!^2jF8W8HIy&&Ux-kBcK~=7ND(hk
zy%KK1#H?wP#Na_B$79o_z*{kZ3gtov7Qt8D+#p=TI&u`sNG)815BlgZMuqtwWLiRi
zK7sob7}IpHAIj{W!d>uG_roc{3a`BZR6NB0vvL6b(D^BBEnejEeYFfQhBYqcOLRYp
z0pJ-w=iwWjo5VU{itU46RBJ4p$DMu71;8kcp(aLZDTSP`>tu6hJ+oZVb_c%Xc(Bk&
z*9kbyq>=$Zw<Di>9OiQwUY|^zAb0tJ#77Q0_uT+uWT)-BF0k>#Ql(}+j8ol*Hmn`y
zy5R+&LYEC-kd6(=Ry*jS+P~|TS^(~GtOx)m!&^+nXAP@%SEK>z*&4;OBjL?386SX3
zI!)<wkVUn|sAeUA94T)~*Mm^N)-WCKaGP5@MF23aY%-!6Hh&Q|bM-a3Wt3~nj!`zS
z3Nl{+EYiQ`k}JStT|b-YpP3hcIRseB77R`Qie{0^^gj+EH%P7?@jRyAJf9F)l8~m5
zHr6iPauNHcjXw!3+psNFE5rCodKcVbMSIoUx1qBTX)cU~w#%5WSPnm&#W=n~<S50s
zmyLHz1>hXht(PywmHN>jJdB{1rDm09r<e~TTD#&rvMq-ZJN~rhMfy0VnXSzalik8|
zpa6cd5FUx+IF@ZlNF$s7j-{^7-^RKD+M-&|f%qB{QA^g&G^S`bxYj-w%*0m1hblaA
zL6B(4#7$|lo+%^HMXGUYFf*Ek8!-gewajN7;TIjD7c=J4lzO)1${yBObA=3%U@+5&
zGzY=6Etk2Nw55_N+5y|{2KWXWrtg+w1mVRbo~s#VV=1;k2XtTyR)kht^T8cKcr{Dh
z<y45^dO1z#_1qo7{d%6@2a1|y@M30DmMxKZph*1l#4G|iA@M}>FT_BIEZ8d<W{{I+
nm;3L8K7bG41NZ<wfL;Cq4t7I2G`}A800000NkvXXu0mjfl<~Z%

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_dark_16.png b/resources/bitmaps_png/png/zoom_out_horizontally_dark_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3783002f36b4593a60c5b4db716171ae2a304d9
GIT binary patch
literal 369
zcmV-%0gnEOP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003vNkl<ZILp;j
zJxjzu5Dj=D3WwMW7J?sGSXc@QqKJ*6U}0r(=&!mz;1!|=Hd>^!TF~1~B(O8HIS%hX
zXtT~l6EUlx*l6)!Gc)hKnb}R`y^nr_=x+#EYsY>{EIGvoC3I3R7~BrVQRAjd-1bln
zC+c~p;q+a=;0@m6T$zLfR$25yiV7IKB28<RyRoy(xh@2xfHXXEpe+G$6S7ijv?RoF
z+(3ipS(Y{54BNsHF1L>z4tT~hJ<tpp+G4a=WSLzL1)yQ2IH$C0dv=;@pI$j|76{}T
zc3c9-GDbCmcIzVGwA~8?>LW;-(ys6Lk!oqNZ*acb*Zrwrgin{4!Uh*yVuD93cEC&Q
zIs?d^ECfsZ>KakuWNu(zAkNgIc_!W2)Gh_r_}zz;n|!ex^}|E@-#^m}o0a=tJSeSH
P00000NkvXXu0mjf1)-mE

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_dark_24.png b/resources/bitmaps_png/png/zoom_out_horizontally_dark_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..da7369b1f98fe7480f011379afea896167c8d9cb
GIT binary patch
literal 486
zcmV<C0U7>@P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00054Nkl<ZNXP9}
z$w~u35FHm>Q1A=<15b(|B8YfU!HWu_;BxUp1R;9yD)<Y2f*yh*;u6H^?(s5RT?4t~
zAV|=Qf{ayhCXPMX#0WX$P$X1WzgPWg87B-w=ReJ96SM|F!7U7Av)S%ufif0jmI<`f
z!$z8oW)Tq9CSzIz`jP&3R=N-fy<jAqk`>8b$j$?)m#PqS(7CKY03k?NPGuv^9-Rp$
zfgB8lCt(-3FiXBWqu|hv2L&sPRVDxrrcgqLo%EYa2BW9vQGoJ1Z_oxp#6G(7Kys}9
z@DoOam0@g$vfgD!Y^ZSVTT3{j^Tldfql*(1bCXOciN)9{0($mEg5cHn{a)?r5mc~G
z&p(Jw3q8g)qnPKo1NrW+3HWj;Q)P~m7AQRv#S}@xo`wl5i7rv#bTx_SCF9ft_q8Re
zQDiP4`ETP4la{~A_wyMly<M}&_1csIkGLf%W|CX96wfsgaE;1**aMns(?$l(D82R7
zl00bUiCdTIutSAkC*K=SZUci>e^szlwp=99noW{g6@OiJ(F@-L*B`C8?3!T=&V_G(
c(OQq-6ASstXc>uahX4Qo07*qoM6N<$g4$)%>Hq)$

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_dark_32.png b/resources/bitmaps_png/png/zoom_out_horizontally_dark_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..ea2a6a0cf494e04b343e1bf5d2990e2b7cea5b97
GIT binary patch
literal 677
zcmV;W0$TlvP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80007PNkl<ZSi|j>
zOOFgu6vtcJh<GK4*Ny}W3lg!huwdZ}_!w+PLd1%VXFL)i67LY&#)gncEJQrg=(@LR
zx@+p5bIXuUY;4#G<$r2=T6Im;%pGRf)Z(P-zRv$w=bn3R)siHs{ZFe^02M$5F#htf
z6|VVLqFJqeCu`n6+8JFv+u}B`E1@+s5x_TxS({TXPClrSwc>;{U1Y`At)c@~*^Mr1
z*{9Q@RRTcYqIc2qvc=S-#jMO_%=-z80DKQ1ck$j%`+REH_jXCy`cLilQq22089>55
zA1PYg>2wxi{56b8(XRZs@y&Js4Fe(s)QZBdSA29#BLg6l#Uc50EgjVKC5oa&6ZTHi
z70e~s!$~8g$pgsa{FwL@-=ZN}qAA)!wWlZCH`&tx$1Pfq{vYJgPKPAhEZZT^0UwGE
z=5<875CHbM+w9KIoRA^(jW}nzrWX)A-fvqw59_<r0f3pkeR_lpQMogIhOJMxCE*4P
z$taQP0iS0@_kRPKeT5pX0BGM5OW!@-0OzmpmCdYS{0)xf))ZLNS@b>p8-V;49FpX6
z-2z19Ddu1J<1NT1VH`wT(sLg0wyDG;9j(LM?=~>I-ICDp7@|Hrz*tM_L78|E1Pc&;
z&j$Pw?Kw`z(6tbSVYp1H9|YbS&ul6#&!oghjHE<g-Kh{wrxeG-@hT}YQWHS`3}0~u
z?UQIfk+8=;KZi&o-9}AU^AHZD*zGbJE4zFSp?s8rXu5>UXh(0nE*Df8MEPYjv)6GQ
z{%#aOlwQX({zKA8<|3judr5a}${&(hu@r(&WQ$t$Q(6I30D1cb=m#YVr69^q00000
LNkvXXu0mjfFZesZ

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_dark_48.png b/resources/bitmaps_png/png/zoom_out_horizontally_dark_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..ab734c968f2aebdbedeb391e4661b01d3570f2b7
GIT binary patch
literal 969
zcmV;)12+7LP)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000A!Nkl<ZXx{Bu
zOK1~87;dZhz_$oOMZ^aPQcvo|7b=2+7a!oG*ozlED2Rd}=+T4tx_A+ff{GvtA|4Bh
zda&4LADXx`vztV1kSa>6(%LqDe=>=iC7aA{5}L{$hBmYR|Ih#Z@0pftHrq0pS4#vS
z0uTX+07L*H01<#@0l;FcBdH}9G^?__htErz)*62RI@>4=cA;4T2#sAN9V-LS#eiv=
zvztx%Oe`}?==_TU0G{O<KNIE<0H0>->=4)aJs5&R)*q}<tduasWBS(J-90sw^>uNU
zbW;L=)o<JOj35Wt8rv%jZcF~c8pitV*-HZ8u^_T7%bE_Jk3j%rq0n)~16rZ@wIZL+
zU&2~lsd%crK$A!$7Gdw8(8RNU^7&m-OvyMpKT+UQ27o10+>LO%A?bhM|4s$^ofOM?
z9&w)xP?6_Bb_!^%FaYR)qm_g^I@>2{zjK3cPz?zu<}3%#=R7YvRVDVj+&Yy702i@b
z(rN6In;3Ct;(ME4!csiv!ogsNgC-?2*e39fk>}E8dZ7<p8|hGD)SQk~AOtT0@FZE*
z17d&KP%!urN%JCfUDx>?X@GM+XB?=Y+qe<{B;MO{aSE?JlqI(_ECA^R3ZvIP0N>OO
zAZH<aR~g}HnJ0^DXi#mCF@!Zj$y#C{lkKjempTBH$>(JbrUo_W0rjM+EO^vi-LR+8
ze!4HQq(m0ZY$SkI5<m&)0r0-6ES-N%ze>+^@$@wufKLcHBm~W9Zqe<%_I#$Xb(NMk
z<RIf4dDGkZ>lZ>kNlZ;hR;fLq$77AJmFMUUOJct=N~4DS{wOQ}j1$*o6}nVo8O=9_
zAdM^@kI#|rABUH=236kDt(9`n8y4@xvY?HOns3dc1Qb6hX;a``s;WG|x7$X3lt36=
zu6dNGVVG;BIbT*P8`fH{VtLT@=O<S&>cpMx4H@QC$7w2waOYFWhYJk5P1VMm_#!4&
z<J%R`{F1a|^6wxw`R00$)4?t@uoA3#-lZIc-vAEop@rWWmuE)+<f>yjJ4kuCH)QM9
zwz^$t!d@xq;)2*d4H><%Qx_`+H93m+r1oKj%PU({K?Jx`*5^`B9wcR%$yU*Y+*dJ0
z5bBru33ygf1yTK3CB`~v9GHk_6L^Yp;%6bTWg#f_Dvc`8v1y+cOF(G+=A?WZ&0TT~
raf@;%dYz5{L;xZH5r7E5e-Gd<yg_+b97tOx00000NkvXXu0mjf2jR5^

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_horizontally_dark_64.png b/resources/bitmaps_png/png/zoom_out_horizontally_dark_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..3c910fb4648db18ecf3fa37ecac8387aa720693b
GIT binary patch
literal 1281
zcmV+c1^)VpP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000EYNkl<Zc-rln
zNoZYF7=V*j+p4(eU@KKrS}1hDq|_D>acDtX>0oP1YC+PfS#=RALKjj&sl|nYg4!;k
z3pd&<ii%KD8bZMilo0doVBX7_UWSHjq);1^CMM7Sf4TR)lbic;r}LWWEPhCMXZ+4T
zo&Vg5TrO8JpQS<r&;T?54L}3X05kv%Km*VKGyn}i18~H)?L~8Kqowxb+n8JY{kaAJ
z_EZ-hfXO=Nk`}bKwmt}ZN=E@O$V~R`oH>1yzlVE@1VEUK<{EPg%dw!|j*jIbC7$Ot
zKZwF?_F{Lsdv#d=z#h28GLZp*<b+9UR4qjODW2gbJq_cUAY(ZGB(a!))A}0hwMyB%
z7Cr2Y9~}Tl3jVK5vVcq`vjWWNEQ~ecyJ>$JgFY7!T0#Jo+~93V0OVjHyJOQg#LL{E
zw>+C8++g1bgC1oDdn0SmU2saZ%wnGlgIS)occ9IY1fGA7G*&zSu-F@MCI@f_p#PAx
zfSb74AdR91-2!bd$=U#B@nNh3Fxl1Q06?fsw?`sx@Ry+9J*WRDob1OfEiDg3wB1?>
zAVPR2(gCE{4v#j)2LR6Laug2_efpig|DmeKRbgt<7hsIL&R9cPGrK;#`LX8E0MO3R
z23_%USQxg##az}<G#`2@sTX%l$&DIULTw&H>}1C}0#HsCh3qQ;fD>*E^vnkRHE7~4
zqjOCG9{LVNc?5*dAETHfwEHbM($MqK0Kh3^ZL&GQ>6|IH=dY=X<vs10Ct%FsadYIq
z1Y~{BmdrB}0>F^?QviA5wCz-$&VmLyWB)6JSTY5GpTp%EF#w=bW9@8RiHTQ9puSQK
z0Q}Ukf<H3JD}HT=N!H>T%LxFb!Ef@cMPHTF-y5<j^I^&0hr$RZUwDI?U|zPUE=DE)
z>pGa=_u=;uAHXpGi$6Via#~aBgkWLy5yp45=$tpDo+`SK6nRq0J*F7|q`)38{zX&(
zAiqy=gm%v|Ny9#xP5{0pAZ)tRZId<W{)yqSYbng}WqzIz0vhujhSUir21!s+!&v=v
znLtS==r|zPMn6^V1TFSfP>3zN6ATE03#1hI57hwRbboLUfwYmwrXvi7NrYS#9HS|^
zN!8}l>GY#8=It=)aQPCU5UDV?`8MeS)u>SYKPhM-<O9l6VZ0c~7lnkEp{8Oqpl>QD
zXIH^k18y-T%(c4IWk|m8xrG+x*I~z74;CsqCVMV+@wBtI8v6g^nw7A`>t(qPD=&yx
zyiV%>H-^Zln<qBeD2lZJyj_Z^?f~U0h{P<3VJMU)AI;YRZSi<ezrNPKhp~b*NelC9
z;TNMoP*M_0R1_Ugfn|R(fT0v@@a-;}Y{1Q8lEiHG6edsb`?r#}A6I*mcX>cG^<3+D
z=zbMN6PLwdvs<OobZEhc8Qg%Q5zR3nBrA(6d>C1P5y7eU2D}f@>-dx<zfC5A5c^@I
zTu)<osX?a*Vdw+c>}M$Xziqx3lBbmcz9Bk<xKCp<@o_XRggB3*Gxm8r4ut5><1_pN
ziT+goBXFuM-VjL$S*+v(iP`XRgf9e(A6N2;%xn=a1oZgx?kh30eTX6_N~yU1OilyP
r05kv%Km*VKGyn}i1JD3806+O3(|Gf6D82SY00000NkvXXu0mjfYWq(3

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_16.png b/resources/bitmaps_png/png/zoom_out_vertically_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..464f9769eb7c38f5175c76c5bfb56f24d2c0c246
GIT binary patch
literal 270
zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6u6nvShG?8m{&BvcK`~NswNqH@
zGlg!)l>yr>Jh>pN=<ocG`QhdZvJP_6T}&I4j!x)QyzgAcs?T-pfB_?$a*A?Fplg7|
z!Z`=^4!+wLV<Ey4*`CAU%Y109V_AgAkD}Hbk7U-3G7(PKett~S;3(zw<-5Yq$;-)W
z%9do$!>Ty%;77-63EFQOPyI0z`SG!B4R>l=gy1esFM)1l=ebU1Z0>C=t$AEKyE!;R
z@;|k+wXwNzwykQP!+-6Vbil(|2a7$pvoca_ncc4i%S>bqna14pZh}sVA;S{MXGMt@
SuNwkA$l&Sf=d#Wzp$Pzj(_#4l

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_24.png b/resources/bitmaps_png/png/zoom_out_vertically_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..cac80014e36aca281852259c0b1d099f53b9c4a2
GIT binary patch
literal 380
zcmV-?0fYXDP)<h;3K|Lk000e1NJLTq000;O000;W1ONa4N`Cco0003)Nkl<ZILl-B
z&wvhtO+v~cFvt{B7Ks_n7pw$=Ax$Cwp|BMq63vHILjzMtXvkH#Vkiv06Po70f>i^U
z%NXn%auTLE^g>8nC^JqcAz-LS$f1x!p&r=euxh{usi7gnGh|oD$B@sV2SWpi&=Arb
zaw)_!ls}X?#5v@2a4!K3K<{1&<$>`MI6^N3hvC<-JH!W>A7l}760e4kFP`jyI>GHB
z9UvHL42;b8$kB#Hg9A&DMes}r3~~gDd<<p7=cFT{_9#v=4LOI`Nx@;Erw}HFat5CY
zjwcYT!P7!chggA9P@qo8iIBg+F@z&74w&dZhP(;65|R=Y8S*nUmWZSg$_8^-NCc`D
zB2rICT*$8=BmBwRCUke`kzij2Mrc?Wg>q6O1Cg9X;e|jeTzM1TLICbbTS!U@=?JpM
alm!6k`yy1+C9%H%0000<MNUMnLSTZp5tIJ_

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_32.png b/resources/bitmaps_png/png/zoom_out_vertically_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e3dbb7bebd4eae853c5cdbf7bcacb55412fd9cc
GIT binary patch
literal 501
zcmV<R0Sf+!P)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0005JNkl<ZNXNC6
zxl0345XM)n0*ZoHL@R}8VG%)W1T9Qq70kYG2>By|0gHfDN{_+=#GrTvMPp;5L=Y@Q
zJWwzeii&nNf*@iS%sM1$cFFGg7Ll)6cHjJVX5Ji%rkIOrK?Q~Ct<EV{AJiUb1qq)d
zfZT{6np0d4!2H+S2)TdpAW(-GUJb_IddCzsN`(-pX2^@d_>GO-j&eZdG>E61@iSrr
zRgROGgSZezm|S*eYymR*Pk?B~5N5HAsAzKxpi0aki+gN}4czck(khLnFZ~rb#bcrR
z)NXMtZq3Wt6o3Uh7;l|DN>fS_5cJ>!eMLcektMGbfKzv8>emrQr2t|H>-@(?v4&(`
zVk78bz%;hxJV+qHfL5H~JTE#EoeZ9&9XY@-(xxHoV@5874o+8BQEFR|p?=wG+@?!^
zg|Rn9nvRtcNkFIu_jD0x*A?{@w{<dBDqYHI1Eshc4lsdn>>-0gz6}kF#R!{bQoAvQ
zU53P|S5so8+*T$C2aU^!m12aW-lsCL%7~Faj5J1!A^iVC^-p8nezB-c@~ds$U>uiT
rZ9moL(*x8V$5S~}uV3#}Yjy4u5~}GHKKg4q00000NkvXXu0mjfO@Y;J

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_48.png b/resources/bitmaps_png/png/zoom_out_vertically_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..a05151e4d227b13c43b7cefce97ed8e444fef475
GIT binary patch
literal 695
zcmV;o0!aOdP)<h;3K|Lk000e1NJLTq001xm001xu1ONa4{R=S+0007hNkl<ZSi|j?
zO-NKx6oBt!m?Bn$5Ev1e(yG<eN(++~MkqG-J33P+(xNtnt%7!LT1bDJHqkODH<1w0
zqMa2HNJ$YA80HU}QId=)>Nux`Z=mtbpYP2B7jZTZ?tSOG_ndRjk5Ln>6u8Zfq8nst
zYXfYZg#Q&LU4Ys29ky;$fYwUsVaBC2oBX6#_H5cjofXoP;pDEH&?~z<`#?(RvR|?(
zw`0;H<-VQVyA9#9OZli=Y}{V7C^8}2!n>4m8Kz50iW;Vl!I~LlP?`gHXo0`v|A74N
zEtL))^OaQ+c7g%vC?rG+2G}+`=7i`nOU~E0y-*Z@3EA5y${Xp7R;y7HtFrC9Kv5o@
z-r*a-U6gq_=epG?exSDBgnR+yEXwc5v5ad6nMS$d10bc0qeQc<N9tK)K3k$L0AOP%
zuW}mjA<8w+0G^<3>u<P&%3JS%Ni?=MPbyzvC0Az6{d0o2gL>vFH}BV<8Xr;F=Luj!
zB$;;rBQC(N^;#ywo&jq3M)LelHEP;+r}q#NPMMB565VB9qo^O1GdTnK2r8evJNXhS
zPjl|LgL1<&ptX`Yl93bH);kWd#B$_-pHy)fwG+|(nbxA!Or!Mq%0(u`0BXnVQTOR(
z1|`vc(q}f6a(Rxj$^!|fGN&BoCX1-7p~R)ZXTgyYuCwU$phFDt9YtB;mNXGZS)kE(
z$&6KTl@BCPlq4hc*%~!!IGzu&sRG_zW^1Ijvmz}}^B{`QH{?bXr8SWz{-DGq99UoE
zAny5XejDVaytXZw3Vo#B-j~{~*}exlfCM^11v&%<KE}ER@mZJBNneAw>$Og~om|xU
dAaH<p`3r)~2`iev@mK%=002ovPDHLkV1g;>M8^OC

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_64.png b/resources/bitmaps_png/png/zoom_out_vertically_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb2bf2abcd4ee6396d0cd2900cb1386df3bb414e
GIT binary patch
literal 915
zcmV;E18n?>P)<h;3K|Lk000e1NJLTq002M$002M;1ONa40ARUQ000A8Nkl<ZXx{Ca
zOGs2<6vs!)%!w9iFABqKlO<?aVIgS`%85q2^ZgGq4)~&U(_%=17MYl&v?xfh$D&%e
z30y>B5E>DIR1~<#AZU8vB61UgX=6U-w3zEO$=va~Gxy#plCzqbZ#cjEoqOIkwk22M
z_zPU<jV|Q12A~D3A)QMA1_L<KQ47DOIvE)upVOYu4K$^p7VqLx{*iq3D-AJ0TdHv4
zwJzmvP+Pv-;CDbA#&ap<Lm*p<NiQLlqA!+m8Wc{`y+G_lFM?5&KX#Q^;)ZNvn^GWp
zFcVfjhdwH{EEI>$u?1ZSU|RHuZI<SONb%%&ax70qNzaB$0DldDlI<!X5UA9%(P98k
zuDD3Uk-<oOMwe1(2|)E4+=vK4krKo`Pp-)TRE96AIzPIpUL1o%)Zr4|s^5<5tqb**
zqf=loy@F$5zN2CcsP}NjBmmcb`~+i;TD3C0sKXQ(L8>tUK*`1^7_(F#^N#jm0*onl
zzTp7k78s245@rg5>6yU*A`dfQyrg9kXM4b4I%p^WI>BHZk@A#Hm<Hp%u>gKB-b;JS
z12BFpUJ*+JRIdkv#Z_s51~3@qh5@(^fWh<5WlO;!P!u`dl%^V?2n@za!vM$~`9$Q?
ztcq`j!?l#h=melL^@1;J0z6dDXMw?V&NzSyFqo9kCvT>>5^Xvlu8X|T33omiOg_T^
z+*`q5v`YsqA@8)3y&*=yG$`!_cfgpXwMNE)+h7Eh0-3Xwt1%`YjAiS9Jzy|;r3`QZ
z3`T>&$q4;mu&7!zYZhV>48L4+t^>fGj{q3sVpq(YD#CX#g5szN1&L?`gYk_jG*9fn
zM5siS%LDpLvUar>?xqb3e{<TY6@hR_dL)aWw<z_g74anQifY>Kw0kpYGby-+F|{Hb
zQ4#tn!<4ezwHrfPp;&wnPNyAD^dQ91O0=blDhw>_4d?}(pcNrw=s}2oJds5e)Qk>v
zP%~93>;8Nn<Pl72Ipq;d>w0AoOl-VsR^jQqQ##U<G9UPjAWkJ|NEJr#ByCJb8RE2P
zv|vyfJ4snIs-?ZA10;1=oy2jy{)Gh%8@8}WU}f_u;gyXeotnb=JwEx0vk5M(G-n0T
pq{W)O;eQW6UajRdT>s#-{1@i&M(T^O1=s)p002ovPDHLkV1lhQlUD!$

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_dark_16.png b/resources/bitmaps_png/png/zoom_out_vertically_dark_16.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad15715f5cbd62da10241af9f94cc2987a2b6cff
GIT binary patch
literal 382
zcmV-^0fGLBP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003+Nkl<ZILozD
zJxc>Y5Dgdw1rdLMg_Vkhg{7b%ir6R$7O5-*3-Qm`TUn+M4G4DESsh6B0}gIxc0=&~
zf?%`GEV)1==Ou#0gS*+;H?uSEH9`oDaX^DNWUw8f=(Z|v<i}b&N1Cok!z(HHAdO*w
zBF6Ykaw-W*_^w~&<U79j$@t>S4^FxD+75mKG^_}I%c(r*zxC%);ej*ms7Q;2sR+Qp
z4jFoK3a%qGzVIM-CnAt)ayd=Y*)o<SNfR|bW?8maOTfcBjGHjD#Z@l^pkO<GTRN#F
z@CuHdflGPD@CnN834v4jX)S@YDeZ=Km>I^C(ByS?daAcP*$^%4vyh%yjV&fS=OK2S
z1{|k_$~9t&OJ2j7Kq^z0*0_uJ+~%8q7LwO~gGuiHPs$@^iUt~(DH>}EGeteHg-bh&
cwX5>J0VHetC%ed3$N&HU07*qoM6N<$g3tS;5dZ)H

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_dark_24.png b/resources/bitmaps_png/png/zoom_out_vertically_dark_24.png
new file mode 100644
index 0000000000000000000000000000000000000000..96410f211a3257689792c13ae337c0b0fe35a975
GIT binary patch
literal 502
zcmV<S0SW$zP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0005KNkl<ZNXN}q
z$x6gP5FHm>K=dCxdvXDBLBxxK9y~ZGxLm|v@UDnnybAt;pP+|95phFIcjscNx+8NH
zWYCL(#Hwf@F&WJyBh2AJ=uXwE)bc6?&+`g@0VNI^ftz8V!l5*_iHDBkbU%uR-T+$Z
zEiKWD0(QdhuuW<LLbDcnfg-o#j-xOV!3fwWl}fF(5CmwV=;z4MRf6+-tzgwV@>*(6
zQ4)*|(^}yfgP+sdr6$OV#vpJ7%uvpc2^GQ%;nbBdUl#)ErfqU4m;`UJhl`39PSM#7
z)nh*w0T+{oO4+vE6}vO0!|x=ii<t??!3oX6Y}EiPGt4cVhv1bav>hzyGYWS}9`*u&
zfB}CXB|cXhvQz|Y>_@8fVHmE0$?tb6l)|>G1m{MWiK-$<f=5komm@{GNF>)u5tc8?
zoqT5$tmSG`60-wtNsurS=#F0#ftN<<4+>&A_n@(;eYGSHnttNer8=xr;g{&_jm}o;
zA{CsfpXs6$E&fJQ7rpuZ!gtql`ZE)tjbl7`+*!OMcvnR9ikx%d8)o7B@5+oVeOmA_
s=kz0xXX!_aXzB5=4*6Q7U^I>GClAodO)5T>O8@`>07*qoM6N<$f@|jCAOHXW

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_dark_32.png b/resources/bitmaps_png/png/zoom_out_vertically_dark_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..a061bceefd2ac610efbce101b196e82a6710ebd6
GIT binary patch
literal 686
zcmV;f0#W^mP)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F80007YNkl<ZSi{v<
zJ8KkC6ka!#5Ha8zts<yJ3Ik#zXb}tlfIlNBqzG79swt8Pl91pV#jK5ul0d*h%!{Zy
zkDJ}e%(-{MY7+>AkWO^`&dml^va>t0dxwzXursrF&iUq?@4RwR6y?&0|J^?!ZF#${
zIPz3leYvzRz|eK+P*hLIrkh3qD4|X(m+mT?26u%V8jk}YonW%|tbP|d+VVhP1t($j
zJ`8Ne8{Q+^2*+rp=$$ndf}f?*u_};_28OrTaI>#&ivvQ4PUX-YX$QY*46idd^+R=K
zPQqQO%vBB}=KU;u-Kw6J0hp4531H1$?FQKf5ce_Eg%>+%r!Hj<fR^bf$TtDf{e}35
z{}h0{!*xkNbE%M)h=~uD%jF|5vIvp&Dqi3Q*8pe*AiOjsIWYjF-cu;1MmerM<d6j*
z(?$VMkuE^-AF`;gDNvy<b2#|d7yu?5l&+@m)>nk-p*at@^c+los|yh7JDSWJCft7l
zGP0+tfFDbn-W&7)y=KwZmb?h%3;4?ATEYKINXsi4utOtw_R(Yr?lHL%&kQcj;`|e1
z07BvS>O2?nYSW3y@z3MzZzY0TM$=Hb@&gnXxgIp?lyJYLgq+9yA)^31&pXc54+g$r
zNa?9xp2_C+9D<a1mN#CC!<Fz17a6Vz;KgU8+A!{ia6iLt4_)~My`jJ$K*DE9K(y41
zcFL|CMS6bHKrknw8QrM<pXUaZ6hu~SHV<GglYq#s*B7D=gy)qW*IjzBKO>n2As_LX
zgFlq++gRStV&Yr=IpeDtuV1mdp-xA`tJ$8`jBzaX%dxm-za3-Vi(Aimbx*7BA9Tkg
U9O9)sh5!Hn07*qoM6N<$f;etIQvd(}

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_dark_48.png b/resources/bitmaps_png/png/zoom_out_vertically_dark_48.png
new file mode 100644
index 0000000000000000000000000000000000000000..600f3d567f7dc1e40f6b715ef8cf87a3351fbffd
GIT binary patch
literal 920
zcmV;J184k+P)<h;3K|Lk000e1NJLTq001xm001xu1^@s6R|5Hm000ADNkl<ZXx{Bv
zNoW&M7;aTu5En!cDk5%p@}!<zQ1Kv$pa)mbg9p7RdJ?>O@gQy&FXB<qB8UYM4;})p
z2*ozDw2AZHn`x$KA}UI&(%N?X{>e+71e;7U=`51NPm;-dZ~pJ!|Npf)j?<Q8YU*L8
z%9&8PQ;oRF2U`Fd1;G3GI;OCVQxO=nYXJZis+~dam^J{JOlAS3d=5-}^ucJIBtAns
zmu%f$GVLamPv_@LAa)a&FA(Frn=cC82XtMZEi`sQXgpgt;~F<f2=;4xUL2fwhET*o
zNK&uGI61nhuv4j2YF6x`5U5>fVjmcN`w!-ONn6eXXJ%}}Xjw?r*&dk5b0Yelh(wn7
zOxyy{0uYcWFPJJjjBt7%nUy2*{05DIa)?e{^k1{WXVU>7w(qCpR1rEyK)))U4FKTD
zH~~QH=hr=n>J_AaJeSFJl-6Xk*`;`P2+8j0<T{1lGYn%+<N&zBZ%U@V<NGlm>vv=A
zCt1LCk^mwDV5#hYWd0l1_-5bx($*^M`B2=;&PD>jE#zR&t~qGzNWJ@+#<pPZIBBll
z61ph>An~J8`Y#$i1AFgE0bB?j0G#!q+amg~`x;sxGkOy`fWOU*SQe-ZSNSk#w9zUx
z$crgK4OM`8T(gl;#5->?!!w1R+r8Q4VFGB!ODD(yD**KS=*GTyyD+y;hyVb+*dh=}
zMhhqXqQ_iZZQ@XzT$Gy}&iG2&G);4E$N)sAob&7rkOVhKt*GHgA%&fm03J1d2EQSr
z(B;qp(2Pi`e*%uVz25zXYOIlk-iYWED<df-!1x(y0y(C#6?K5`FtuVS0W-Q1Widxn
zh_2F{2j;ZNkL0<W?3t<<vohAsNUKo_iO9-Nq$be7usalODyvM97VGifRjm0b*N)52
zA+GbS(Ka;5qLAuE4|DFU6TrHO@H_9x1ET<P&C;!1#JqeqY^uhN$XiNkTwvSh!BCIP
z)Fq}V>GhMn4=C?fd$h7GD2VABY#}ibvrK1eX&5|ZAP5K|7L$b_AYwBffu_hOev}+r
z27+YGg~~uE{8pp@C^UkRXP}ofvG&`%yG@QJZj<k{#_Rw61xI49m=b%*m-uT|9~a#P
uAI#d3U3Aw3sPaKSP8{3&fy4udg8l%tlX!>)Zxx{c0000<MNUMnLSTZ|+p7Qo

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/png/zoom_out_vertically_dark_64.png b/resources/bitmaps_png/png/zoom_out_vertically_dark_64.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8d20325b6323f40e92cebdb107248e9cb0b9b77
GIT binary patch
literal 1208
zcmV;p1V{UcP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF000DkNkl<Zc-rk-
zNoW&c6mILTcyJd*ak;obD=w&rJ8r0GRb0Rgmy3s@2p+70qT)e8!R??Pya+vrq99eI
z2&IaaYUZDz%lu2y)Y^*(YHi&b-%B&iWNc`s{U@23<nSPn%%A^#^Zxg~xBNMgNF*nd
zB_)5t2rJ|&E3qR?VY__;09R=-CoEz|1YsAm0AvAhF#x)*4*<pX!e({5%1M+E09Djj
z**G|D7EoDP*)Ik}b?Ox73>6nb40O{G$m1&C2pfFopz;cWT~=1s*VR4%Lf9&JOBK=-
zS9lf3c33;tQ%;a+Y%wVCq!-GUqg8o63IsKMc9h@{*49nMUx<KM;F~aL2o2C#oY4EA
z;O|b9{)^T^6*|XvRQNxO2m~jCkGKX3w}AXYP=q3;`8F3wY7vA^K=FMtl=0bM7Jw`O
zSpX8Gp}Kkm#(A#sZ74{X>TBx9`5FN6UQB{;cOJqXNlJ)RCZgd{<@vq=ptiPlBqQur
z67rKw+TfXo2%4t>0CKaGEA*p9Ih`x)x=`qTNSf9M6}nESbRSdMC803Y^4qUY*9M&}
zgc8<jQsylx+f_z~R2Y8y+-wbSEKYa|07zYzz{Y<X93S578M`?=T7?Nf1YwUS06-59
z8*Yki{12LXFR1b&SmS$at=1q3PIo;3u+cm5LIyo8=_nad<CUuc2q|?_I=sEY-b6|w
zedK@|O`)TpQjM-~EdW@`HWe;c%UU=5p>}+G+KgO*KXNSqrV@Fbe8);3$JYKKqZ%w7
z0C?kLjJFTx_NoJg)&udTiN4Hr00dRK++_aNkd?~<Y$aB9yCVSL2JAN^94}22#3?gB
z<T?NZp*xbjA#7sUtq21Mx2=>~W^{2D0HDAYFMhcPCGn>Tj!+8^H(A&z_W_{MwZ;a6
zgl<U;kD+0Z>0RmWYyeoyO$@0CM+``isc~B5IskN{Pc@y<bJCrl%C<TYV&(P*;}p1D
zdS*%3J%e8BRr)Bm5}~_B@`6neS?ku+)C`3+zc@jM<&qVR&o@<fN+g>9*^cM{e8BC=
zP-#3G(9OM{F5&sGR<lt|k=Yt|1b~>gZt1A#5H`2RsdZgL0X+ZBI95UxYrIhqQTbt0
zJpYU#(soqQ^qC@F3&8AB$jkv8FNt9&Oz8Y#9Z(ZvyLt}ieXxRLvLf@K#536-I9n8L
zr@-cFa5I?n18{1)LYh7Ul|_=oG&T{*6MTQe<n7zdp74+bh|+LHc#vnx;-Kuj=!lE`
zF*%CUAu)@1=@ba5YK-JzM2J;;yXX(l*TD1+YMR#Hax5GHA?2+oOlr_6LOeeX%3eT;
ze%AOVAWx&a@D0*I@Khty2@pKj&6N#;CtKQ0fu<qgC(5iL632HlW<H=(5LA9NqlToc
zAPAN2%(yW*Jo^wujv@W_#h_$wk|$q{$_5pEq2~d}*kS2R9hXnVg$d%i3lr(NGQ)V<
zugoCpf(-8nUR+A!rKwLqi%+KY(v<zVfo_UQi+vLYvjAi|066Su`|>nlh1qHG6v#hO
W9QAz3C-(IK0000<MNUMnLSTaA#Us7|

literal 0
HcmV?d00001

diff --git a/resources/bitmaps_png/sources/dark/zoom_in_horizontally.svg b/resources/bitmaps_png/sources/dark/zoom_in_horizontally.svg
new file mode 100644
index 0000000000..e6eb885982
--- /dev/null
+++ b/resources/bitmaps_png/sources/dark/zoom_in_horizontally.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_in_horizontally.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="2.2679306"
+     inkscape:cy="11.120012"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#ded3dd;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#ded3dd;stroke-width:0.56030625;fill-opacity:1"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#ded3dd;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+  <line
+     class="cls-2"
+     x1="12.031396"
+     y1="10.092473"
+     x2="12.031396"
+     y2="14.011817"
+     id="line160593"
+     style="fill:none;stroke:#ded3dd;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="m 0.50000015,12 3.11398625,6.4965 v -4.048501 h 1.3846088 l 0.0014,-4.8800529 h -1.385992 l 0,-4.064446 z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="M 23.5,12 20.386014,5.5035001 v 4.048501 h -1.384609 l -0.0014,4.8800529 h 1.385987 V 18.4965 Z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/resources/bitmaps_png/sources/dark/zoom_in_vertically.svg b/resources/bitmaps_png/sources/dark/zoom_in_vertically.svg
new file mode 100644
index 0000000000..de6e48affd
--- /dev/null
+++ b/resources/bitmaps_png/sources/dark/zoom_in_vertically.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_in_vertically.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="-10.669569"
+     inkscape:cy="10.807512"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#ded3dd;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#ded3dd;stroke-width:0.56030625;fill-opacity:1"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#ded3dd;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+  <line
+     class="cls-2"
+     x1="12.031396"
+     y1="10.092473"
+     x2="12.031396"
+     y2="14.011817"
+     id="line160593"
+     style="fill:none;stroke:#ded3dd;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="M 12,0.5 5.5035003,3.6139863 H 9.552001 V 4.9985951 L 14.432054,5 V 3.614008 H 18.4965 Z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="m 12,23.5 6.4965,-3.113986 h -4.048501 v -1.384609 l -4.8800527,-0.0014 v 1.385987 h -4.064446 z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/resources/bitmaps_png/sources/dark/zoom_out_horizontally.svg b/resources/bitmaps_png/sources/dark/zoom_out_horizontally.svg
new file mode 100644
index 0000000000..a8a667e6a9
--- /dev/null
+++ b/resources/bitmaps_png/sources/dark/zoom_out_horizontally.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_out_horizontally.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="1.0179306"
+     inkscape:cy="9.620012"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#ded3dd;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#ded3dd;stroke-width:0.56030625;fill-opacity:1"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#ded3dd;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="m 4.9999952,12 -3.1139863,-6.4964999 0,4.048501 H 0.50140015 l -0.0014,4.8800529 H 1.8859921 l 0,4.064446 z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="m 19.000005,12 3.113986,6.4965 V 14.447999 H 23.4986 L 23.5,9.5679461 h -1.385987 l 0,-4.064446 z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/resources/bitmaps_png/sources/dark/zoom_out_vertically.svg b/resources/bitmaps_png/sources/dark/zoom_out_vertically.svg
new file mode 100644
index 0000000000..b2e901c37f
--- /dev/null
+++ b/resources/bitmaps_png/sources/dark/zoom_out_vertically.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_out_vertically.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="-10.232069"
+     inkscape:cy="10.307512"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#ded3dd;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#ded3dd;stroke-width:0.56030625;fill-opacity:1"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#ded3dd;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="m 12,19.000005 -6.4964999,3.113986 h 4.048501 V 23.4986 L 14.432054,23.5 V 22.114008 H 18.4965 Z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#ded3dd;stroke-width:0.45214424;fill-opacity:1"
+     d="m 12,4.9999951 6.4965,-3.113986 H 14.447999 V 0.50140012 l -4.8800529,-0.0014 V 1.8859871 h -4.064446 z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/resources/bitmaps_png/sources/light/zoom_in_horizontally.svg b/resources/bitmaps_png/sources/light/zoom_in_horizontally.svg
new file mode 100644
index 0000000000..48476a11ef
--- /dev/null
+++ b/resources/bitmaps_png/sources/light/zoom_in_horizontally.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_in_horizontally.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="1.3304306"
+     inkscape:cy="10.307512"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#545454;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#545454;stroke-width:0.56030625"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#545454;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round" />
+  <line
+     class="cls-2"
+     x1="12.031396"
+     y1="10.092473"
+     x2="12.031396"
+     y2="14.011817"
+     id="line160593"
+     style="fill:none;stroke:#545454;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="m 0.50000015,12 3.11398625,6.4965 v -4.048501 h 1.3846088 l 0.0014,-4.8800529 h -1.385992 l 0,-4.064446 z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="M 23.5,12 20.386014,5.5035001 v 4.048501 h -1.384609 l -0.0014,4.8800529 h 1.385987 V 18.4965 Z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/resources/bitmaps_png/sources/light/zoom_in_vertically.svg b/resources/bitmaps_png/sources/light/zoom_in_vertically.svg
new file mode 100644
index 0000000000..73d63ad31f
--- /dev/null
+++ b/resources/bitmaps_png/sources/light/zoom_in_vertically.svg
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_out_vertically.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="0.89293055"
+     inkscape:cy="10.807512"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#545454;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#545454;stroke-width:0.56030625"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#545454;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round" />
+  <line
+     class="cls-2"
+     x1="12.031396"
+     y1="10.092473"
+     x2="12.031396"
+     y2="14.011817"
+     id="line160593"
+     style="fill:none;stroke:#545454;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="M 12,0.5 5.5035003,3.6139863 H 9.552001 V 4.9985951 L 14.432054,5 V 3.614008 H 18.4965 Z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="m 12,23.5 6.4965,-3.113986 h -4.048501 v -1.384609 l -4.8800527,-0.0014 v 1.385987 h -4.064446 z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/resources/bitmaps_png/sources/light/zoom_out_horizontally.svg b/resources/bitmaps_png/sources/light/zoom_out_horizontally.svg
new file mode 100644
index 0000000000..30a0a5a52f
--- /dev/null
+++ b/resources/bitmaps_png/sources/light/zoom_out_horizontally.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_out_horizontally.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="1.3304306"
+     inkscape:cy="10.307512"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#545454;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#545454;stroke-width:0.56030625"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#545454;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="m 4.9999952,12 -3.1139863,-6.4964999 0,4.048501 H 0.50140015 l -0.0014,4.8800529 H 1.8859921 l 0,4.064446 z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="m 19.000005,12 3.113986,6.4965 V 14.447999 H 23.4986 L 23.5,9.5679461 h -1.385987 l 0,-4.064446 z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>
diff --git a/resources/bitmaps_png/sources/light/zoom_out_vertically.svg b/resources/bitmaps_png/sources/light/zoom_out_vertically.svg
new file mode 100644
index 0000000000..8021dd0d0f
--- /dev/null
+++ b/resources/bitmaps_png/sources/light/zoom_out_vertically.svg
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   id="Слой_1"
+   data-name="Слой 1"
+   viewBox="0 0 24 24"
+   version="1.1"
+   sodipodi:docname="zoom_out_vertically.svg"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+  <sodipodi:namedview
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1920"
+     inkscape:window-height="1055"
+     id="namedview30"
+     showgrid="true"
+     inkscape:zoom="16"
+     inkscape:cx="1.3304306"
+     inkscape:cy="10.307512"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:document-rotation="0"
+     inkscape:current-layer="Слой_1">
+    <inkscape:grid
+       type="xygrid"
+       id="grid_kicad"
+       spacingx="0.5"
+       spacingy="0.5"
+       color="#9999ff"
+       opacity="0.13"
+       empspacing="2" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata43">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <cc:license
+           rdf:resource="http://creativecommons.org/licenses/by-sa/4.0/" />
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title>zoom_in</dc:title>
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/licenses/by-sa/4.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Notice" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#Attribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+        <cc:requires
+           rdf:resource="http://creativecommons.org/ns#ShareAlike" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <defs
+     id="defs160583">
+    <style
+       id="style160581">.cls-1{fill:#545454;}.cls-2{fill:none;stroke:#545454;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style>
+  </defs>
+  <title
+     id="title160585">zoom_in</title>
+  <path
+     class="cls-1"
+     d="m 12.030079,17.085044 a 5.0417076,5.0427552 0 1 1 3.566044,-8.6077709 v 0 a 5.0402266,5.041274 0 0 1 -3.566044,8.6077709 z m 0,-9.1210729 a 4.0790482,4.0798958 0 1 0 2.886163,1.1933245 4.0685378,4.0693832 0 0 0 -2.886163,-1.1931334 z"
+     id="path160587"
+     style="fill:#545454;fill-opacity:1;stroke-width:0.56030625;stroke-miterlimit:4;stroke-dasharray:none"
+     inkscape:connector-curvature="0" />
+  <path
+     class="cls-1"
+     d="m 18.722544,19.333092 a 0.60055078,0.60055078 0 0 1 -0.42591,-0.17651 L 14.835681,15.69563 A 0.61229794,0.61229794 0 0 1 15.6875,14.84375 l 3.461014,3.460954 a 0.60241827,0.60241827 0 0 1 -0.42597,1.028388 z"
+     id="path160589"
+     style="fill:#545454;stroke-width:0.56030625"
+     inkscape:connector-curvature="0" />
+  <line
+     class="cls-2"
+     x1="10.070324"
+     y1="12.052376"
+     x2="13.989662"
+     y2="12.052376"
+     id="line160591"
+     style="fill:none;stroke:#545454;stroke-width:1.1206125px;stroke-linecap:round;stroke-linejoin:round" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="m 12,19.000005 -6.4964999,3.113986 h 4.048501 V 23.4986 L 14.432054,23.5 V 22.114008 H 18.4965 Z"
+     id="polygon27451"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+  <path
+     style="fill:#545454;stroke-width:0.45214424"
+     d="m 12,4.9999951 6.4965,-3.113986 H 14.447999 V 0.50140012 l -4.8800529,-0.0014 V 1.8859871 h -4.064446 z"
+     id="polygon27451-8"
+     inkscape:connector-curvature="0"
+     sodipodi:nodetypes="cccccccc" />
+</svg>