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();
#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_ */

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

View File

@@ -110,6 +110,12 @@ public:
void scroll (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 selectNext (int distance, bool enlarge);
void selectFirst (bool enlarge);