Factor out the three thumbnail browser selection modes without changing their behaviour.
This commit is contained in:
@@ -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_ */
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user