From 20118c401928cb0fc73d9b9cdd154938c627d7c9 Mon Sep 17 00:00:00 2001 From: Hombre Date: Sun, 2 Sep 2018 10:47:44 +0200 Subject: [PATCH 1/4] Partially hidden toolbars can now be scrolled with the mouse wheel ...thanks to the new MyScrolledToolbar class (guiutils.h/cc). This is valid for the FileBrowser tab (first and second line can be scrolled individually) and the top and bottom bar of the Editor(s) tab. see #4035 --- rtgui/editorpanel.cc | 9 ++++++-- rtgui/filecatalog.cc | 39 ++++++++++++++++++++------------ rtgui/filecatalog.h | 1 + rtgui/guiutils.cc | 53 +++++++++++++++++++++++++++++++++++++++++++- rtgui/guiutils.h | 12 ++++++++++ 5 files changed, 97 insertions(+), 17 deletions(-) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index c99ed2dbd..ff57ecace 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -630,7 +630,9 @@ EditorPanel::EditorPanel (FilePanel* filePanel) beforeAfterBox->set_name ("BeforeAfterContainer"); beforeAfterBox->pack_start (*afterBox); - editbox->pack_start (*toolBarPanel, Gtk::PACK_SHRINK, 2); + MyScrolledToolbar *stb1 = Gtk::manage(new MyScrolledToolbar()); + stb1->add(*toolBarPanel); + editbox->pack_start (*stb1, Gtk::PACK_SHRINK, 2); editbox->pack_start (*beforeAfterBox); // build right side panel @@ -763,7 +765,10 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iops->attach_next_to (*tbShowHideSidePanels, Gtk::POS_RIGHT, 1, 1); iops->attach_next_to (*tbRightPanel_1, Gtk::POS_RIGHT, 1, 1); - editbox->pack_start (*iops, Gtk::PACK_SHRINK, 0); + MyScrolledToolbar *stb2 = Gtk::manage(new MyScrolledToolbar()); + stb2->add(*iops); + + editbox->pack_start (*stb2, Gtk::PACK_SHRINK, 0); editbox->show_all (); // build screen diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index a0d767d79..ae332754f 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -48,6 +48,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : listener(nullptr), fslistener(nullptr), iatlistener(nullptr), + hbToolBar1STB(nullptr), hasValidCurrentEFS(false), filterPanel(nullptr), exportPanel(nullptr), @@ -127,13 +128,17 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // if NOT a single row toolbar if (!options.FileBrowserToolbarSingleRow) { - pack_start (*hbToolBar1, Gtk::PACK_SHRINK, 0); + hbToolBar1STB = Gtk::manage(new MyScrolledToolbar()); + hbToolBar1STB->add(*hbToolBar1); + pack_start (*hbToolBar1STB, Gtk::PACK_SHRINK, 0); } // setup button bar buttonBar = Gtk::manage( new Gtk::HBox () ); buttonBar->set_name ("ToolBarPanelFileBrowser"); - pack_start (*buttonBar, Gtk::PACK_SHRINK); + MyScrolledToolbar *stb = Gtk::manage(new MyScrolledToolbar()); + stb->add(*buttonBar); + pack_start (*stb, Gtk::PACK_SHRINK); tbLeftPanel_1 = new Gtk::ToggleButton (); iLeftPanel_1_Show = new RTImage("panel-to-right.png"); @@ -692,6 +697,9 @@ void FileCatalog::enableTabMode(bool enable) } else { buttonBar->show(); hbToolBar1->show(); + if (hbToolBar1STB) { + hbToolBar1STB->show(); + } exifInfo->set_active( options.showFileNames ); } @@ -910,8 +918,8 @@ void FileCatalog::refreshHeight () newHeight = h; } - if (hbToolBar1->is_visible() && !options.FileBrowserToolbarSingleRow) { - newHeight += hbToolBar1->get_height(); + if (hbToolBar1STB && hbToolBar1STB->is_visible()) { + newHeight += hbToolBar1STB->get_height(); } if (buttonBar->is_visible()) { @@ -2039,17 +2047,20 @@ void FileCatalog::updateFBQueryTB (bool singleRow) hbToolBar1->reference(); if (singleRow) { - bool removed = removeIfThere(this, hbToolBar1, false); - - if (removed) { + if (hbToolBar1STB) { + hbToolBar1STB->remove_with_viewport(); + removeIfThere(this, hbToolBar1STB, false); buttonBar->pack_start(*hbToolBar1, Gtk::PACK_EXPAND_WIDGET, 0); + hbToolBar1STB = nullptr; } } else { - bool removed = removeIfThere(buttonBar, hbToolBar1, false); - - if (removed) { - pack_start(*hbToolBar1, Gtk::PACK_SHRINK, 0); - reorder_child(*hbToolBar1, 0); + if (!hbToolBar1STB) { + removeIfThere(buttonBar, hbToolBar1, false); + hbToolBar1STB = Gtk::manage(new MyScrolledToolbar()); + hbToolBar1STB->add(*hbToolBar1); + hbToolBar1STB->show(); + pack_start (*hbToolBar1STB, Gtk::PACK_SHRINK, 0); + reorder_child(*hbToolBar1STB, 0); } } @@ -2592,7 +2603,7 @@ bool FileCatalog::handleShortcutKey (GdkEventKey* event) void FileCatalog::showToolBar() { if (!options.FileBrowserToolbarSingleRow) { - hbToolBar1->show(); + hbToolBar1STB->show(); } buttonBar->show(); @@ -2601,7 +2612,7 @@ void FileCatalog::showToolBar() void FileCatalog::hideToolBar() { if (!options.FileBrowserToolbarSingleRow) { - hbToolBar1->hide(); + hbToolBar1STB->hide(); } buttonBar->hide(); diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h index 66f14b6b2..af16fc8ae 100644 --- a/rtgui/filecatalog.h +++ b/rtgui/filecatalog.h @@ -73,6 +73,7 @@ private: Gtk::HBox* buttonBar; Gtk::HBox* hbToolBar1; + MyScrolledToolbar* hbToolBar1STB; Gtk::HBox* fltrRankbox; Gtk::HBox* fltrLabelbox; diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 28d3f6324..f957a90a0 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -955,7 +955,7 @@ bool MyScrolledWindow::on_scroll_event (GdkEventScroll* event) if (value2 != value) { scroll->set_value(value2); } - } else { + } else if (event->direction == GDK_SCROLL_UP) { value2 = value - step; if (value2 < lower) { @@ -981,6 +981,57 @@ void MyScrolledWindow::get_preferred_height_for_width_vfunc (int width, int &min natural_height = minimum_height = 50; } +/* + * + * Derived class of some widgets to properly handle the scroll wheel ; + * the user has to use the Shift key to be able to change the widget's value, + * otherwise the mouse wheel will scroll the toolbar. + * + */ +MyScrolledToolbar::MyScrolledToolbar () +{ + set_policy (Gtk::POLICY_EXTERNAL, Gtk::POLICY_NEVER); + set_propagate_natural_height(true); +} + +bool MyScrolledToolbar::on_scroll_event (GdkEventScroll* event) +{ + Glib::RefPtr adjust = get_hadjustment(); + Gtk::Scrollbar *scroll = get_hscrollbar(); + + if (adjust && scroll) { + double upper = adjust->get_upper(); + double lower = adjust->get_lower(); + double value = adjust->get_value(); + double step = adjust->get_step_increment() * 2; + double value2 = 0.; + + if (event->direction == GDK_SCROLL_DOWN) { + value2 = value + step; + + if (value2 > upper) { + value2 = upper; + } + + if (value2 != value) { + scroll->set_value(value2); + } + } else if (event->direction == GDK_SCROLL_UP) { + value2 = value - step; + + if (value2 < lower) { + value2 = lower; + } + + if (value2 != value) { + scroll->set_value(value2); + } + } + } + + return true; +} + MyComboBoxText::MyComboBoxText (bool has_entry) : Gtk::ComboBoxText(has_entry) { minimumWidth = naturalWidth = 70; diff --git a/rtgui/guiutils.h b/rtgui/guiutils.h index 2861b4913..89d05bfce 100644 --- a/rtgui/guiutils.h +++ b/rtgui/guiutils.h @@ -293,6 +293,18 @@ public: MyScrolledWindow(); }; +/** + * @brief subclass of Gtk::ScrolledWindow in order to handle the large toolbars (wider than available space) + */ +class MyScrolledToolbar : public Gtk::ScrolledWindow +{ + + bool on_scroll_event (GdkEventScroll* event); + +public: + MyScrolledToolbar(); +}; + /** * @brief subclass of Gtk::ComboBox in order to handle the scrollwheel */ From 758299aa2c7c6fd5acd67124fb4e93efdb111b2e Mon Sep 17 00:00:00 2001 From: Hombre Date: Mon, 3 Sep 2018 00:18:03 +0200 Subject: [PATCH 2/4] Support of GDK_SCROLL_SMOOTH sent by some devices. See #4035. --- rtgui/guiutils.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index f957a90a0..27e385b23 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -1026,6 +1026,27 @@ bool MyScrolledToolbar::on_scroll_event (GdkEventScroll* event) if (value2 != value) { scroll->set_value(value2); } + } else if (event->direction == GDK_SCROLL_SMOOTH) { + step = 0.; + if (event->delta_x) { // if the user use a pad, it can scroll horizontally + step = event->delta_x; + } else if (event->delta_y) { + step = event->delta_y; + } + + if (step != 0.) { + value2 = value + step /* * 2 */; // we could use a multiplicator here + + if (value2 < lower) { + value2 = lower; + } else if (value2 > upper) { + value2 = upper; + } + + if (value2 != value) { + scroll->set_value(value2); + } + } } } From b226c125ce833ce41d0a8fa6fad062e695594506 Mon Sep 17 00:00:00 2001 From: Hombre Date: Mon, 3 Sep 2018 23:19:37 +0200 Subject: [PATCH 3/4] Scrollable toolbars has been named, and 'scrollableToolbar' class added see #4035 --- rtgui/editorpanel.cc | 2 ++ rtgui/filecatalog.cc | 3 +++ rtgui/guiutils.cc | 1 + 3 files changed, 6 insertions(+) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index ff57ecace..7f7dfd148 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -631,6 +631,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) beforeAfterBox->pack_start (*afterBox); MyScrolledToolbar *stb1 = Gtk::manage(new MyScrolledToolbar()); + stb1->set_name("EditorToolbarTop"); stb1->add(*toolBarPanel); editbox->pack_start (*stb1, Gtk::PACK_SHRINK, 2); editbox->pack_start (*beforeAfterBox); @@ -766,6 +767,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iops->attach_next_to (*tbRightPanel_1, Gtk::POS_RIGHT, 1, 1); MyScrolledToolbar *stb2 = Gtk::manage(new MyScrolledToolbar()); + stb2->set_name("EditorToolbarBottom"); stb2->add(*iops); editbox->pack_start (*stb2, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index ae332754f..ae471dea5 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -129,6 +129,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : // if NOT a single row toolbar if (!options.FileBrowserToolbarSingleRow) { hbToolBar1STB = Gtk::manage(new MyScrolledToolbar()); + hbToolBar1STB->set_name("FileBrowserQueryToolbar"); hbToolBar1STB->add(*hbToolBar1); pack_start (*hbToolBar1STB, Gtk::PACK_SHRINK, 0); } @@ -137,6 +138,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : buttonBar = Gtk::manage( new Gtk::HBox () ); buttonBar->set_name ("ToolBarPanelFileBrowser"); MyScrolledToolbar *stb = Gtk::manage(new MyScrolledToolbar()); + stb->set_name("FileBrowserIconToolbar"); stb->add(*buttonBar); pack_start (*stb, Gtk::PACK_SHRINK); @@ -2057,6 +2059,7 @@ void FileCatalog::updateFBQueryTB (bool singleRow) if (!hbToolBar1STB) { removeIfThere(buttonBar, hbToolBar1, false); hbToolBar1STB = Gtk::manage(new MyScrolledToolbar()); + hbToolBar1STB->set_name("FileBrowserQueryToolbar"); hbToolBar1STB->add(*hbToolBar1); hbToolBar1STB->show(); pack_start (*hbToolBar1STB, Gtk::PACK_SHRINK, 0); diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 27e385b23..76484ceba 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -992,6 +992,7 @@ MyScrolledToolbar::MyScrolledToolbar () { set_policy (Gtk::POLICY_EXTERNAL, Gtk::POLICY_NEVER); set_propagate_natural_height(true); + get_style_context()->add_class("scrollableToolbar"); } bool MyScrolledToolbar::on_scroll_event (GdkEventScroll* event) From 98fc85b68d4fd637ae5ceeb8c88e2d70c92ce318 Mon Sep 17 00:00:00 2001 From: Hombre Date: Tue, 4 Sep 2018 23:06:17 +0200 Subject: [PATCH 4/4] Revert GDK_SCROLL_SMOOTH scrolling of Toolbars to a fixed step also remove GUI space in "FileBrowser" widget see #4035 --- rtgui/filecatalog.cc | 1 - rtgui/guiutils.cc | 34 ++++++---------------------------- 2 files changed, 6 insertions(+), 29 deletions(-) diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc index ae471dea5..2271c05c7 100644 --- a/rtgui/filecatalog.cc +++ b/rtgui/filecatalog.cc @@ -62,7 +62,6 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) : inTabMode = false; set_name ("FileBrowser"); - set_spacing (2); // construct and initialize thumbnail browsers fileBrowser = Gtk::manage( new FileBrowser() ); diff --git a/rtgui/guiutils.cc b/rtgui/guiutils.cc index 76484ceba..447c9d8af 100644 --- a/rtgui/guiutils.cc +++ b/rtgui/guiutils.cc @@ -1008,45 +1008,23 @@ bool MyScrolledToolbar::on_scroll_event (GdkEventScroll* event) double value2 = 0.; if (event->direction == GDK_SCROLL_DOWN) { - value2 = value + step; - - if (value2 > upper) { - value2 = upper; - } - + value2 = rtengine::min(value + step, upper); if (value2 != value) { scroll->set_value(value2); } } else if (event->direction == GDK_SCROLL_UP) { - value2 = value - step; - - if (value2 < lower) { - value2 = lower; - } - + value2 = rtengine::max(value - step, lower); if (value2 != value) { scroll->set_value(value2); } } else if (event->direction == GDK_SCROLL_SMOOTH) { - step = 0.; if (event->delta_x) { // if the user use a pad, it can scroll horizontally - step = event->delta_x; + value2 = rtengine::LIM(value + (event->delta_x > 0 ? 30 : -30), lower, upper); } else if (event->delta_y) { - step = event->delta_y; + value2 = rtengine::LIM(value + (event->delta_y > 0 ? 30 : -30), lower, upper); } - - if (step != 0.) { - value2 = value + step /* * 2 */; // we could use a multiplicator here - - if (value2 < lower) { - value2 = lower; - } else if (value2 > upper) { - value2 = upper; - } - - if (value2 != value) { - scroll->set_value(value2); - } + if (value2 != value) { + scroll->set_value(value2); } } }