Factor out the three thumbnail browser selection modes without changing their behaviour.

This commit is contained in:
Adam Reichold
2015-11-28 23:21:17 +01:00
parent 5758f4d9ad
commit 88ab82cee9
3 changed files with 114 additions and 110 deletions

View File

@@ -704,4 +704,20 @@ public:
#define MYWRITERLOCK_RELEASE(ln) ln.release(); #define MYWRITERLOCK_RELEASE(ln) ln.release();
#endif #endif
#ifdef PROTECT_VECTORS
#define IFPV_MYREADERLOCK(l, e) MYREADERLOCK(l, e)
#define IFPV_MYWRITERLOCK(l, e) MYWRITERLOCK(l, e)
#define IFPV_MYREADERLOCK_ACQUIRE(l) MYREADERLOCK_ACQUIRE(l)
#define IFPV_MYWRITERLOCK_ACQUIRE(l) MYWRITERLOCK_ACQUIRE(l)
#define IFPV_MYREADERLOCK_RELEASE(l) MYREADERLOCK_RELEASE(l)
#define IFPV_MYWRITERLOCK_RELEASE(l) MYWRITERLOCK_RELEASE(l)
#else
#define IFPV_MYREADERLOCK(l, e)
#define IFPV_MYWRITERLOCK(l, e)
#define IFPV_MYREADERLOCK_ACQUIRE(l)
#define IFPV_MYWRITERLOCK_ACQUIRE(l)
#define IFPV_MYREADERLOCK_RELEASE(l)
#define IFPV_MYWRITERLOCK_RELEASE(l)
#endif
#endif /* _THREADUTILS_ */ #endif /* _THREADUTILS_ */

View File

@@ -98,6 +98,84 @@ void ThumbBrowserBase::scrollPage (int direction)
} }
} }
void ThumbBrowserBase::selectSingle (ThumbBrowserEntryBase* fileDescr)
{
for (size_t i = 0; i < selected.size(); i++) {
selected[i]->selected = false;
}
selected.clear ();
if (fileDescr) {
selected.push_back (fileDescr);
fileDescr->selected = true;
}
}
void ThumbBrowserBase::selectRange (ThumbBrowserEntryBase* fileDescr)
{
if (selected.empty()) {
selected.push_back (fileDescr);
fileDescr->selected = true;
} else {
// find the start and the end of the selection interval
size_t startx = fd.size() - 1;
if (lastClicked) {
for (; startx > 0; startx--)
if (fd[startx] == lastClicked) {
break;
}
} else {
for (; startx > 0; startx--)
if (fd[startx] == selected[0]) {
break;
}
}
size_t endx = 0;
for (; endx < fd.size(); endx++)
if (fd[endx] == fileDescr) {
break;
}
if (endx < startx) {
int tmp = endx;
endx = startx;
startx = tmp;
}
// clear current selection
for (size_t i = 0; i < selected.size(); i++) {
selected[i]->selected = false;
}
selected.clear ();
// select thumbnails in the interval
for (size_t i = startx; i <= endx; i++) {
if (!fd[i]->filtered) {
fd[i]->selected = true;
selected.push_back (fd[i]);
}
}
}
}
void ThumbBrowserBase::selectSet (ThumbBrowserEntryBase* fileDescr)
{
std::vector<ThumbBrowserEntryBase*>::iterator i = std::find (selected.begin(), selected.end(), fileDescr);
if (i != selected.end()) {
(*i)->selected = false;
selected.erase (i);
} else {
selected.push_back (fileDescr);
fileDescr->selected = true;
}
}
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)
{ {
const int hmin = entry->getX (); const int hmin = entry->getX ();
@@ -726,9 +804,7 @@ void ThumbBrowserBase::buttonPressed (int x, int y, int button, GdkEventType typ
bool handled = false; bool handled = false;
{ {
#if PROTECT_VECTORS IFPV_MYREADERLOCK(l, entryRW);
MYREADERLOCK(l, entryRW);
#endif
for (size_t i = 0; i < fd.size(); i++) for (size_t i = 0; i < fd.size(); i++)
if (fd[i]->drawable) { if (fd[i]->drawable) {
@@ -746,125 +822,31 @@ void ThumbBrowserBase::buttonPressed (int x, int y, int button, GdkEventType typ
} }
{ {
#if PROTECT_VECTORS IFPV_MYWRITERLOCK(l, entryRW);
MYWRITERLOCK(l, entryRW);
#endif
if (selected.size() == 1 && type == GDK_2BUTTON_PRESS && button == 1) { if (selected.size() == 1 && type == GDK_2BUTTON_PRESS && button == 1) {
doubleClicked (selected[0]); doubleClicked (selected[0]);
} else if (button == 1 && type == GDK_BUTTON_PRESS) { } else if (button == 1 && type == GDK_BUTTON_PRESS) {
if (fileDescr && (state & GDK_SHIFT_MASK)) { if (fileDescr && (state & GDK_SHIFT_MASK))
if (selected.empty()) { selectRange (fileDescr);
selected.push_back (fileDescr); else if (fileDescr && (state & GDK_CONTROL_MASK))
fileDescr->selected = true; selectSet (fileDescr);
lastClicked = fileDescr; else
#if PROTECT_VECTORS selectSingle (fileDescr);
MYWRITERLOCK_RELEASE(l);
#endif
selectionChanged ();
} else {
// find the start and the end of the selection interval
size_t startx = fd.size() - 1;
if (lastClicked) { lastClicked = fileDescr;
for (; startx > 0; startx--) IFPV_MYWRITERLOCK_RELEASE(l);
if (fd[startx] == lastClicked) { selectionChanged ();
break;
}
} else {
for (; startx > 0; startx--)
if (fd[startx] == selected[0]) {
break;
}
}
size_t endx = 0;
for (; endx < fd.size(); endx++)
if (fd[endx] == fileDescr) {
break;
}
if (endx < startx) {
int tmp = endx;
endx = startx;
startx = tmp;
}
// clear current selection
for (size_t i = 0; i < selected.size(); i++) {
selected[i]->selected = false;
}
selected.clear ();
// select thumbnails in the interval
for (size_t i = startx; i <= endx; i++) {
if (!fd[i]->filtered) {
fd[i]->selected = true;
selected.push_back (fd[i]);
}
}
lastClicked = fileDescr;
#if PROTECT_VECTORS
MYWRITERLOCK_RELEASE(l);
#endif
selectionChanged ();
}
} else if (fileDescr && (state & GDK_CONTROL_MASK)) {
std::vector<ThumbBrowserEntryBase*>::iterator i = std::find (selected.begin(), selected.end(), fileDescr);
if (i != selected.end()) {
(*i)->selected = false;
selected.erase (i);
} else {
selected.push_back (fileDescr);
fileDescr->selected = true;
}
lastClicked = fileDescr;
#if PROTECT_VECTORS
MYWRITERLOCK_RELEASE(l);
#endif
selectionChanged ();
} else {
for (size_t i = 0; i < selected.size(); i++) {
selected[i]->selected = false;
}
selected.clear ();
if (fileDescr) {
selected.push_back (fileDescr);
fileDescr->selected = true;
}
lastClicked = fileDescr;
#if PROTECT_VECTORS
MYWRITERLOCK_RELEASE(l);
#endif
selectionChanged ();
}
} else if (fileDescr && button == 3 && type == GDK_BUTTON_PRESS) { } else if (fileDescr && button == 3 && type == GDK_BUTTON_PRESS) {
if (!fileDescr->selected) { if (!fileDescr->selected) {
for (size_t i = 0; i < selected.size(); i++) { selectSingle (fileDescr);
selected[i]->selected = false;
}
selected.clear ();
fileDescr->selected = true;
selected.push_back (fileDescr);
lastClicked = fileDescr; lastClicked = fileDescr;
#if PROTECT_VECTORS IFPV_MYWRITERLOCK_RELEASE(l);
MYWRITERLOCK_RELEASE(l);
#endif
selectionChanged (); selectionChanged ();
} }
#if PROTECT_VECTORS IFPV_MYWRITERLOCK_RELEASE(l);
MYWRITERLOCK_RELEASE(l);
#endif
rightClicked (fileDescr); rightClicked (fileDescr);
} }
} // end of MYWRITERLOCK(l, entryRW); } // end of MYWRITERLOCK(l, entryRW);

View File

@@ -110,6 +110,12 @@ public:
void scroll (int direction); void scroll (int direction);
void scrollPage (int direction); void scrollPage (int direction);
private:
void selectSingle (ThumbBrowserEntryBase* fileDescr);
void selectRange (ThumbBrowserEntryBase* fileDescr);
void selectSet (ThumbBrowserEntryBase* fileDescr);
public:
void selectPrev (int distance, bool enlarge); void selectPrev (int distance, bool enlarge);
void selectNext (int distance, bool enlarge); void selectNext (int distance, bool enlarge);
void selectFirst (bool enlarge); void selectFirst (bool enlarge);