On 07/01/16 12:31, Greg Ercolano wrote:
> On 06/30/16 13:27, Rob McDonald wrote:
>> I would like to allow the user to drag-n-drop items in the list to re-order them. Is this possible?
>
> I would think it should be possible, and perhaps not that hard.
> [..]
> I might give it a shot; if I can I'll post some demo code..
Yep, not too hard:
___________________________________________________________________________ snip
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Browser.H>
#include <FL/fl_draw.H>
#include <string.h> // sprintf()
//
// Demonstrate draggable Fl_Browser items -
er...@seriss.com 07/01/16
//
class MyBrowser : public Fl_Browser {
void *dragitem;
void change_cursor(Fl_Cursor newcursor) {
fl_cursor(newcursor, FL_BLACK, FL_WHITE);
}
void *item_under_mouse() {
int X, Y, W, H; bbox(X, Y, W, H);
if (!Fl::event_inside(X, Y, W, H)) return 0; // probably scrollbar
return find_item(Fl::event_y());
}
int handle(int event) {
int ret = 0;
switch ( event ) {
case FL_PUSH: {
if ( Fl::event_button() == 1 ) { // left mouse to start drag?
if ( (dragitem = item_under_mouse()) ) { // clicked on an item?
item_select(dragitem, 1); redraw(); // select the dragged item
change_cursor(FL_CURSOR_HAND); // change cursor
ret = 1;
}
}
break;
}
case FL_DRAG: {
if ( dragitem ) {
ret = 1;
void *dst_item = item_under_mouse();
if ( dst_item != dragitem ) {
item_swap(dragitem, dst_item); redraw();
}
}
break;
}
case FL_LEAVE:
case FL_RELEASE: {
if ( dragitem ) {
change_cursor(FL_CURSOR_DEFAULT); // ensure normal cursor
item_select(dragitem, 0); redraw(); // deselect dragged item
dragitem = 0; // disable item drag mode
ret = 1;
}
break;
}
}
if ( dragitem ) return(1); // dragging? don't pass event to Fl_Browser
return(Fl_Browser::handle(event) ? 1 : ret);
}
public:
MyBrowser(int X,int Y,int W,int H) : Fl_Browser(X,Y,W,H)
{ dragitem = 0; }
~MyBrowser()
{ }
};
int main(int argc, char **argv) {
char s[80];
Fl_Double_Window *win = new Fl_Double_Window(300,600);
win->begin();
MyBrowser *brow = new MyBrowser(10,10,win->w()-20,win->h()-20);
for ( int t=0; t<50; t++ ) // Add 50 numbered items
{ sprintf(s, "item %d", t); brow->add(s); }
win->end();
win->resizable(brow);
win->show();
return Fl::run();
}
___________________________________________________________________________ snip