diff options
Diffstat (limited to 'gtk/PlatGTK.cxx')
-rw-r--r-- | gtk/PlatGTK.cxx | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index 432fc9ea0..5252e890c 100644 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -1196,8 +1196,7 @@ class ListBoxX : public ListBox { GtkCssProvider *cssProvider; #endif public: - CallBackAction doubleClickAction; - void *doubleClickActionData; + IListBoxDelegate *delegate; ListBoxX() : widCached(0), frame(0), list(0), scroller(0), pixhash(NULL), pixbuf_renderer(0), renderer(0), @@ -1206,7 +1205,7 @@ public: #if GTK_CHECK_VERSION(3,0,0) cssProvider(NULL), #endif - doubleClickAction(NULL), doubleClickActionData(NULL) { + delegate(nullptr) { } ~ListBoxX() override { if (pixhash) { @@ -1243,10 +1242,7 @@ public: void RegisterImage(int type, const char *xpm_data) override; void RegisterRGBAImage(int type, int width, int height, const unsigned char *pixelsImage) override; void ClearRegisteredImages() override; - void SetDoubleClickAction(CallBackAction action, void *data) override { - doubleClickAction = action; - doubleClickActionData = data; - } + void SetDelegate(IListBoxDelegate *lbDelegate) override; void SetList(const char *listText, char separator, char typesep) override; }; @@ -1337,8 +1333,9 @@ static void small_scroller_init(SmallScroller *){} static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) { try { ListBoxX* lb = static_cast<ListBoxX*>(p); - if (ev->type == GDK_2BUTTON_PRESS && lb->doubleClickAction != NULL) { - lb->doubleClickAction(lb->doubleClickActionData); + if (ev->type == GDK_2BUTTON_PRESS && lb->delegate) { + ListBoxEvent event(ListBoxEvent::EventType::doubleClick); + lb->delegate->ListNotify(&event); return TRUE; } @@ -1348,6 +1345,20 @@ static gboolean ButtonPress(GtkWidget *, GdkEventButton* ev, gpointer p) { return FALSE; } +static gboolean ButtonRelease(GtkWidget *, GdkEventButton* ev, gpointer p) { + try { + ListBoxX* lb = static_cast<ListBoxX*>(p); + if (ev->type != GDK_2BUTTON_PRESS && lb->delegate) { + ListBoxEvent event(ListBoxEvent::EventType::selectionChange); + lb->delegate->ListNotify(&event); + return TRUE; + } + } catch (...) { + // No pointer back to Scintilla to save status + } + return FALSE; +} + /* Change the active color to the selected color so the listbox uses the color scheme that it would use if it had the focus. */ static void StyleSet(GtkWidget *w, GtkStyle*, void*) { @@ -1472,6 +1483,8 @@ void ListBoxX::Create(Window &parent, int, Point, int, bool, int) { gtk_widget_show(widget); g_signal_connect(G_OBJECT(widget), "button_press_event", G_CALLBACK(ButtonPress), this); + g_signal_connect(G_OBJECT(widget), "button_release_event", + G_CALLBACK(ButtonRelease), this); GtkWidget *top = gtk_widget_get_toplevel(static_cast<GtkWidget *>(parent.GetID())); gtk_window_set_transient_for(GTK_WINDOW(static_cast<GtkWidget *>(wid)), @@ -1747,6 +1760,11 @@ void ListBoxX::Select(int n) { } else { gtk_tree_selection_unselect_all(selection); } + + if (delegate) { + ListBoxEvent event(ListBoxEvent::EventType::selectionChange); + delegate->ListNotify(&event); + } } int ListBoxX::GetSelection() { @@ -1843,6 +1861,10 @@ void ListBoxX::ClearRegisteredImages() { images.Clear(); } +void ListBoxX::SetDelegate(IListBoxDelegate *lbDelegate) { + delegate = lbDelegate; +} + void ListBoxX::SetList(const char *listText, char separator, char typesep) { Clear(); int count = strlen(listText) + 1; |