diff --git a/rtgui/batchqueueentry.cc b/rtgui/batchqueueentry.cc index a5dfb6dde..23982095c 100644 --- a/rtgui/batchqueueentry.cc +++ b/rtgui/batchqueueentry.cc @@ -168,10 +168,12 @@ void BatchQueueEntry::getIconSize (int& w, int& h) const } -Glib::ustring BatchQueueEntry::getToolTip (int x, int y) const +std::tuple BatchQueueEntry::getToolTip (int x, int y) const { // get the parent class' tooltip first - Glib::ustring tooltip = ThumbBrowserEntryBase::getToolTip(x, y); + Glib::ustring tooltip; + bool useMarkup; + std::tie(tooltip, useMarkup) = ThumbBrowserEntryBase::getToolTip(x, y); // add the saving param options if (!outFileName.empty()) { @@ -198,7 +200,7 @@ Glib::ustring BatchQueueEntry::getToolTip (int x, int y) const } } - return tooltip; + return std::make_tuple(std::move(tooltip), useMarkup); } diff --git a/rtgui/batchqueueentry.h b/rtgui/batchqueueentry.h index d13dfe827..0ea56e403 100644 --- a/rtgui/batchqueueentry.h +++ b/rtgui/batchqueueentry.h @@ -70,7 +70,7 @@ public: std::vector> getIconsOnImageArea () override; void getIconSize (int& w, int& h) const override; - Glib::ustring getToolTip (int x, int y) const override; + std::tuple getToolTip (int x, int y) const override; // bqentryupdatelistener interface void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) override; diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 4326c1666..90a3cc68d 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -668,6 +668,7 @@ void FileBrowser::close () MYWRITERLOCK(l, entryRW); selected.clear (); + anchor = nullptr; MYWRITERLOCK_RELEASE(l); // notifySelectionListener will need read access! @@ -783,16 +784,20 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) { MYWRITERLOCK(l, entryRW); - selected.clear (); + selected.clear(); - for (size_t i = 0; i < fd.size(); i++) - if (checkFilter (fd[i])) { + for (size_t i = 0; i < fd.size(); ++i) { + if (checkFilter(fd[i])) { fd[i]->selected = true; - selected.push_back (fd[i]); + selected.push_back(fd[i]); } + } + if (!anchor && !selected.empty()) { + anchor = selected[0]; + } } queue_draw (); - notifySelectionListener (); + notifySelectionListener(); } else if( m == copyTo) { tbl->copyMoveRequested (mselected, false); } @@ -1438,12 +1443,12 @@ void FileBrowser::applyFilter (const BrowserFilter& filter) } for (size_t i = 0; i < fd.size(); i++) { - if (checkFilter (fd[i])) { + if (checkFilter(fd[i])) { numFiltered++; - } else if (fd[i]->selected ) { + } else if (fd[i]->selected) { fd[i]->selected = false; - std::vector::iterator j = std::find (selected.begin(), selected.end(), fd[i]); - selected.erase (j); + std::vector::iterator j = std::find(selected.begin(), selected.end(), fd[i]); + selected.erase(j); if (lastClicked == fd[i]) { lastClicked = nullptr; @@ -1452,6 +1457,9 @@ void FileBrowser::applyFilter (const BrowserFilter& filter) selchanged = true; } } + if (selected.empty() || (anchor && std::find(selected.begin(), selected.end(), anchor) == selected.end())) { + anchor = nullptr; + } } if (selchanged) { diff --git a/rtgui/thumbbrowserbase.cc b/rtgui/thumbbrowserbase.cc index 88c2c3cce..16566ae21 100644 --- a/rtgui/thumbbrowserbase.cc +++ b/rtgui/thumbbrowserbase.cc @@ -28,7 +28,7 @@ using namespace std; ThumbBrowserBase::ThumbBrowserBase () - : location(THLOC_FILEBROWSER), inspector(nullptr), isInspectorActive(false), eventTime(0), lastClicked(nullptr), previewHeight(options.thumbSize), numOfCols(1), lastRowHeight(0), arrangement(TB_Horizontal) + : location(THLOC_FILEBROWSER), inspector(nullptr), isInspectorActive(false), eventTime(0), lastClicked(nullptr), anchor(nullptr), previewHeight(options.thumbSize), numOfCols(1), lastRowHeight(0), arrangement(TB_Horizontal) { inW = -1; inH = -1; @@ -164,30 +164,31 @@ inline void removeFromSelection (const ThumbIterator& iterator, ThumbVector& sel void ThumbBrowserBase::selectSingle (ThumbBrowserEntryBase* clicked) { - clearSelection (selected); + clearSelection(selected); + anchor = clicked; - if (clicked) - addToSelection (clicked, selected); + if (clicked) { + addToSelection(clicked, selected); + } } void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additional) { - if (selected.empty()) { - addToSelection(clicked, selected); - return; + if (!anchor) { + anchor = clicked; + if (selected.empty()) { + addToSelection(clicked, selected); + return; + } } if (!additional || !lastClicked) { // Extend the current range w.r.t to first selected entry. - ThumbIterator front = std::find(fd.begin(), fd.end(), selected.front()); - ThumbIterator back; - ThumbIterator current = std::find(fd.begin(), fd.end(), clicked); + ThumbIterator back = std::find(fd.begin(), fd.end(), clicked); + ThumbIterator front = anchor == clicked ? back : std::find(fd.begin(), fd.end(), anchor); - if (front > current) { - front = current; - back = std::find(fd.begin(), fd.end(), selected.back()); - } else { - back = current; + if (front > back) { + std::swap(front, back); } clearSelection(selected); @@ -198,7 +199,7 @@ void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additio } else { // Add an additional range w.r.t. the last clicked entry. ThumbIterator last = std::find(fd.begin(), fd.end(), lastClicked); - ThumbIterator current = std::find (fd.begin(), fd.end(), clicked); + ThumbIterator current = std::find(fd.begin(), fd.end(), clicked); if (last > current) { std::swap(last, current); @@ -212,13 +213,14 @@ void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additio void ThumbBrowserBase::selectSet (ThumbBrowserEntryBase* clicked) { - const ThumbIterator iterator = std::find (selected.begin (), selected.end (), clicked); + const ThumbIterator iterator = std::find(selected.begin(), selected.end(), clicked); - if (iterator != selected.end ()) { - removeFromSelection (iterator, selected); + if (iterator != selected.end()) { + removeFromSelection(iterator, selected); } else { - addToSelection (clicked, selected); + addToSelection(clicked, selected); } + anchor = clicked; } static void scrollToEntry (double& h, double& v, int iw, int ih, ThumbBrowserEntryBase* entry) @@ -618,7 +620,6 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry) for (unsigned int ct = 0; ct < fd.size(); ++ct) { // arrange items in the column - int curry = 0; for (; ct < fd.size() && fd[ct]->filtered; ++ct) { fd[ct]->drawable = false; @@ -627,10 +628,9 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry) if (ct < fd.size()) { const int maxw = fd[ct]->getMinimalWidth(); - fd[ct]->setPosition(currx, curry, maxw, rowHeight); + fd[ct]->setPosition(currx, 0, maxw, rowHeight); fd[ct]->drawable = true; currx += maxw; - curry += rowHeight; } } @@ -684,7 +684,6 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry) } } - bool arrangeAll = true; // arrange files int curry = 0; size_t ct = 0; @@ -710,6 +709,7 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry) } } + bool arrangeAll = true; if (oldNumOfCols == numOfCols) { arrangeAll = false; for (int i = 0; i < numOfCols; ++i) { @@ -720,13 +720,13 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry) } } if (!arrangeAll) { - int i = 0; + int j = 0; // Find currently added entry - for (; ct < fd.size() && fd[ct] != entry; i += !fd[ct]->filtered, ++ct) { + for (; ct < fd.size() && fd[ct] != entry; j += !fd[ct]->filtered, ++ct) { } //Calculate the position of currently added entry - const int row = i / numOfCols; - const int col = i % numOfCols; + const int row = j / numOfCols; + const int col = j % numOfCols; curry = row * rowHeight; int currx = 0; for (int c = 0; c < col; ++c) { @@ -831,20 +831,24 @@ void ThumbBrowserBase::Internal::on_realize() bool ThumbBrowserBase::Internal::on_query_tooltip (int x, int y, bool keyboard_tooltip, const Glib::RefPtr& tooltip) { // Gtk signals automatically acquire the GUI (i.e. this method is enclosed by gdk_thread_enter and gdk_thread_leave) - Glib::ustring ttip = ""; - + Glib::ustring ttip; + bool useMarkup = false; { MYREADERLOCK(l, parent->entryRW); for (size_t i = 0; i < parent->fd.size(); i++) if (parent->fd[i]->drawable && parent->fd[i]->inside (x, y)) { - ttip = parent->fd[i]->getToolTip (x, y); + std::tie(ttip, useMarkup) = parent->fd[i]->getToolTip (x, y); break; } } if (!ttip.empty()) { - tooltip->set_text(ttip); + if (useMarkup) { + tooltip->set_markup(ttip); + } else { + tooltip->set_text(ttip); + } return true; } else { return false; @@ -859,7 +863,6 @@ void ThumbBrowserBase::on_style_updated () ThumbBrowserBase::Internal::Internal () : ofsX(0), ofsY(0), parent(nullptr), dirty(true) { - Glib::RefPtr style = get_style_context(); set_name("FileCatalog"); } diff --git a/rtgui/thumbbrowserbase.h b/rtgui/thumbbrowserbase.h index e9e69416c..aefd72044 100644 --- a/rtgui/thumbbrowserbase.h +++ b/rtgui/thumbbrowserbase.h @@ -171,6 +171,7 @@ protected: std::vector fd; std::vector selected; ThumbBrowserEntryBase* lastClicked; + ThumbBrowserEntryBase* anchor; int previewHeight; int numOfCols; diff --git a/rtgui/thumbbrowserentrybase.cc b/rtgui/thumbbrowserentrybase.cc index f9e2b41b5..e660e794b 100644 --- a/rtgui/thumbbrowserentrybase.cc +++ b/rtgui/thumbbrowserentrybase.cc @@ -724,7 +724,7 @@ bool ThumbBrowserEntryBase::releaseNotify (int button, int type, int bstate, int return buttonSet ? buttonSet->releaseNotify (x, y) : false; } -Glib::ustring ThumbBrowserEntryBase::getToolTip (int x, int y) const +std::tuple ThumbBrowserEntryBase::getToolTip (int x, int y) const { Glib::ustring tooltip; @@ -734,6 +734,7 @@ Glib::ustring ThumbBrowserEntryBase::getToolTip (int x, int y) const // Always show the filename in the tooltip since the filename in the thumbnail could be truncated. // If "Show Exif info" is disabled, also show Exif info in the tooltip. + bool useMarkup = !tooltip.empty(); if (inside(x, y) && tooltip.empty()) { tooltip = dispname; @@ -748,7 +749,7 @@ Glib::ustring ThumbBrowserEntryBase::getToolTip (int x, int y) const } } - return tooltip; + return std::make_tuple(std::move(tooltip), useMarkup); } diff --git a/rtgui/thumbbrowserentrybase.h b/rtgui/thumbbrowserentrybase.h index 12e64c60d..6cbcb37d0 100644 --- a/rtgui/thumbbrowserentrybase.h +++ b/rtgui/thumbbrowserentrybase.h @@ -19,7 +19,7 @@ #pragma once #include - +#include #include #include "cursormanager.h" @@ -190,7 +190,7 @@ public: virtual bool motionNotify (int x, int y); virtual bool pressNotify (int button, int type, int bstate, int x, int y); virtual bool releaseNotify (int button, int type, int bstate, int x, int y); - virtual Glib::ustring getToolTip (int x, int y) const; + virtual std::tuple getToolTip (int x, int y) const; inline ThumbBrowserEntryBase* getOriginal() const {