Merge branch 'dev' into filebrowser-catalog-speedups

This commit is contained in:
Ingo Weyrich 2019-07-30 16:16:46 +02:00
commit c82aafb748
7 changed files with 65 additions and 50 deletions

View File

@ -168,10 +168,12 @@ void BatchQueueEntry::getIconSize (int& w, int& h) const
} }
Glib::ustring BatchQueueEntry::getToolTip (int x, int y) const std::tuple<Glib::ustring, bool> BatchQueueEntry::getToolTip (int x, int y) const
{ {
// get the parent class' tooltip first // 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 // add the saving param options
if (!outFileName.empty()) { 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);
} }

View File

@ -70,7 +70,7 @@ public:
std::vector<Glib::RefPtr<Gdk::Pixbuf>> getIconsOnImageArea () override; std::vector<Glib::RefPtr<Gdk::Pixbuf>> getIconsOnImageArea () override;
void getIconSize (int& w, int& h) const override; void getIconSize (int& w, int& h) const override;
Glib::ustring getToolTip (int x, int y) const override; std::tuple<Glib::ustring, bool> getToolTip (int x, int y) const override;
// bqentryupdatelistener interface // bqentryupdatelistener interface
void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) override; void updateImage (guint8* img, int w, int h, int origw, int origh, guint8* newOPreview) override;

View File

@ -668,6 +668,7 @@ void FileBrowser::close ()
MYWRITERLOCK(l, entryRW); MYWRITERLOCK(l, entryRW);
selected.clear (); selected.clear ();
anchor = nullptr;
MYWRITERLOCK_RELEASE(l); // notifySelectionListener will need read access! MYWRITERLOCK_RELEASE(l); // notifySelectionListener will need read access!
@ -785,12 +786,16 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m)
selected.clear(); selected.clear();
for (size_t i = 0; i < fd.size(); i++) for (size_t i = 0; i < fd.size(); ++i) {
if (checkFilter(fd[i])) { if (checkFilter(fd[i])) {
fd[i]->selected = true; fd[i]->selected = true;
selected.push_back(fd[i]); selected.push_back(fd[i]);
} }
} }
if (!anchor && !selected.empty()) {
anchor = selected[0];
}
}
queue_draw (); queue_draw ();
notifySelectionListener(); notifySelectionListener();
} else if( m == copyTo) { } else if( m == copyTo) {
@ -1452,6 +1457,9 @@ void FileBrowser::applyFilter (const BrowserFilter& filter)
selchanged = true; selchanged = true;
} }
} }
if (selected.empty() || (anchor && std::find(selected.begin(), selected.end(), anchor) == selected.end())) {
anchor = nullptr;
}
} }
if (selchanged) { if (selchanged) {

View File

@ -28,7 +28,7 @@
using namespace std; using namespace std;
ThumbBrowserBase::ThumbBrowserBase () 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; inW = -1;
inH = -1; inH = -1;
@ -165,29 +165,30 @@ inline void removeFromSelection (const ThumbIterator& iterator, ThumbVector& sel
void ThumbBrowserBase::selectSingle (ThumbBrowserEntryBase* clicked) void ThumbBrowserBase::selectSingle (ThumbBrowserEntryBase* clicked)
{ {
clearSelection(selected); clearSelection(selected);
anchor = clicked;
if (clicked) if (clicked) {
addToSelection(clicked, selected); addToSelection(clicked, selected);
} }
}
void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additional) void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* clicked, bool additional)
{ {
if (!anchor) {
anchor = clicked;
if (selected.empty()) { if (selected.empty()) {
addToSelection(clicked, selected); addToSelection(clicked, selected);
return; return;
} }
}
if (!additional || !lastClicked) { if (!additional || !lastClicked) {
// Extend the current range w.r.t to first selected entry. // Extend the current range w.r.t to first selected entry.
ThumbIterator front = std::find(fd.begin(), fd.end(), selected.front()); ThumbIterator back = std::find(fd.begin(), fd.end(), clicked);
ThumbIterator back; ThumbIterator front = anchor == clicked ? back : std::find(fd.begin(), fd.end(), anchor);
ThumbIterator current = std::find(fd.begin(), fd.end(), clicked);
if (front > current) { if (front > back) {
front = current; std::swap(front, back);
back = std::find(fd.begin(), fd.end(), selected.back());
} else {
back = current;
} }
clearSelection(selected); clearSelection(selected);
@ -219,6 +220,7 @@ void ThumbBrowserBase::selectSet (ThumbBrowserEntryBase* clicked)
} else { } else {
addToSelection(clicked, selected); addToSelection(clicked, selected);
} }
anchor = clicked;
} }
static void scrollToEntry (double& h, double& v, int iw, int ih, ThumbBrowserEntryBase* entry) 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) { for (unsigned int ct = 0; ct < fd.size(); ++ct) {
// arrange items in the column // arrange items in the column
int curry = 0;
for (; ct < fd.size() && fd[ct]->filtered; ++ct) { for (; ct < fd.size() && fd[ct]->filtered; ++ct) {
fd[ct]->drawable = false; fd[ct]->drawable = false;
@ -627,10 +628,9 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry)
if (ct < fd.size()) { if (ct < fd.size()) {
const int maxw = fd[ct]->getMinimalWidth(); const int maxw = fd[ct]->getMinimalWidth();
fd[ct]->setPosition(currx, curry, maxw, rowHeight); fd[ct]->setPosition(currx, 0, maxw, rowHeight);
fd[ct]->drawable = true; fd[ct]->drawable = true;
currx += maxw; currx += maxw;
curry += rowHeight;
} }
} }
@ -684,7 +684,6 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry)
} }
} }
bool arrangeAll = true;
// arrange files // arrange files
int curry = 0; int curry = 0;
size_t ct = 0; size_t ct = 0;
@ -710,6 +709,7 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry)
} }
} }
bool arrangeAll = true;
if (oldNumOfCols == numOfCols) { if (oldNumOfCols == numOfCols) {
arrangeAll = false; arrangeAll = false;
for (int i = 0; i < numOfCols; ++i) { for (int i = 0; i < numOfCols; ++i) {
@ -720,13 +720,13 @@ void ThumbBrowserBase::arrangeFiles(ThumbBrowserEntryBase* entry)
} }
} }
if (!arrangeAll) { if (!arrangeAll) {
int i = 0; int j = 0;
// Find currently added entry // 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 //Calculate the position of currently added entry
const int row = i / numOfCols; const int row = j / numOfCols;
const int col = i % numOfCols; const int col = j % numOfCols;
curry = row * rowHeight; curry = row * rowHeight;
int currx = 0; int currx = 0;
for (int c = 0; c < col; ++c) { 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<Gtk::Tooltip>& tooltip) bool ThumbBrowserBase::Internal::on_query_tooltip (int x, int y, bool keyboard_tooltip, const Glib::RefPtr<Gtk::Tooltip>& tooltip)
{ {
// Gtk signals automatically acquire the GUI (i.e. this method is enclosed by gdk_thread_enter and gdk_thread_leave) // 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); MYREADERLOCK(l, parent->entryRW);
for (size_t i = 0; i < parent->fd.size(); i++) for (size_t i = 0; i < parent->fd.size(); i++)
if (parent->fd[i]->drawable && parent->fd[i]->inside (x, y)) { 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; break;
} }
} }
if (!ttip.empty()) { if (!ttip.empty()) {
if (useMarkup) {
tooltip->set_markup(ttip);
} else {
tooltip->set_text(ttip); tooltip->set_text(ttip);
}
return true; return true;
} else { } else {
return false; return false;
@ -859,7 +863,6 @@ void ThumbBrowserBase::on_style_updated ()
ThumbBrowserBase::Internal::Internal () : ofsX(0), ofsY(0), parent(nullptr), dirty(true) ThumbBrowserBase::Internal::Internal () : ofsX(0), ofsY(0), parent(nullptr), dirty(true)
{ {
Glib::RefPtr<Gtk::StyleContext> style = get_style_context();
set_name("FileCatalog"); set_name("FileCatalog");
} }

View File

@ -171,6 +171,7 @@ protected:
std::vector<ThumbBrowserEntryBase*> fd; std::vector<ThumbBrowserEntryBase*> fd;
std::vector<ThumbBrowserEntryBase*> selected; std::vector<ThumbBrowserEntryBase*> selected;
ThumbBrowserEntryBase* lastClicked; ThumbBrowserEntryBase* lastClicked;
ThumbBrowserEntryBase* anchor;
int previewHeight; int previewHeight;
int numOfCols; int numOfCols;

View File

@ -724,7 +724,7 @@ bool ThumbBrowserEntryBase::releaseNotify (int button, int type, int bstate, int
return buttonSet ? buttonSet->releaseNotify (x, y) : false; return buttonSet ? buttonSet->releaseNotify (x, y) : false;
} }
Glib::ustring ThumbBrowserEntryBase::getToolTip (int x, int y) const std::tuple<Glib::ustring, bool> ThumbBrowserEntryBase::getToolTip (int x, int y) const
{ {
Glib::ustring tooltip; 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. // 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. // If "Show Exif info" is disabled, also show Exif info in the tooltip.
bool useMarkup = !tooltip.empty();
if (inside(x, y) && tooltip.empty()) { if (inside(x, y) && tooltip.empty()) {
tooltip = dispname; 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);
} }

View File

@ -19,7 +19,7 @@
#pragma once #pragma once
#include <atomic> #include <atomic>
#include <tuple>
#include <gtkmm.h> #include <gtkmm.h>
#include "cursormanager.h" #include "cursormanager.h"
@ -190,7 +190,7 @@ public:
virtual bool motionNotify (int x, int y); virtual bool motionNotify (int x, int y);
virtual bool pressNotify (int button, int type, int bstate, 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 bool releaseNotify (int button, int type, int bstate, int x, int y);
virtual Glib::ustring getToolTip (int x, int y) const; virtual std::tuple<Glib::ustring, bool> getToolTip (int x, int y) const;
inline ThumbBrowserEntryBase* getOriginal() const inline ThumbBrowserEntryBase* getOriginal() const
{ {