diff options
-rw-r--r-- | plugins/gtkui/ddblistview.c | 2 | ||||
-rw-r--r-- | plugins/gtkui/gtkui.c | 14 | ||||
-rw-r--r-- | plugins/gtkui/widgets.c | 140 | ||||
-rw-r--r-- | plugins/gtkui/widgets.h | 9 |
4 files changed, 159 insertions, 6 deletions
diff --git a/plugins/gtkui/ddblistview.c b/plugins/gtkui/ddblistview.c index a992b62b..21d7c109 100644 --- a/plugins/gtkui/ddblistview.c +++ b/plugins/gtkui/ddblistview.c @@ -736,6 +736,7 @@ ddb_listview_list_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { + printf ("ddb_listview_list_expose_event\n"); DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner")); widget = ps->list; if (widget->window) { @@ -2577,6 +2578,7 @@ ddb_listview_list_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { + printf ("ddb_listview_list_button_press_event\n"); gtk_widget_grab_focus (widget); DdbListview *ps = DDB_LISTVIEW (g_object_get_data (G_OBJECT (widget), "owner")); if (event->button == 1) { diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c index 3914547b..2ee38dca 100644 --- a/plugins/gtkui/gtkui.c +++ b/plugins/gtkui/gtkui.c @@ -980,15 +980,19 @@ gtkui_thread (void *ctx) { gtk_disable_setlocale (); gtk_init (&argc, (char ***)&argv); + // register widget types + w_reg_widget ("tabbed_playlist", w_tabbed_playlist_create); + w_reg_widget ("box", w_create_box); + w_reg_widget ("vsplitter", w_create_vsplitter); + mainwin = create_mainwin (); // construct mainwindow widgets { - // root widget is a box - rootwidget = w_create_box (); + rootwidget = w_create ("box"); gtk_widget_show (rootwidget->widget); gtk_box_pack_start (GTK_BOX(lookup_widget(mainwin, "plugins_bottom_vbox")), rootwidget->widget, TRUE, TRUE, 0); - ddb_gtkui_widget_t *plt = w_tabbed_playlist_create (); + ddb_gtkui_widget_t *plt = w_create ("tabbed_playlist"); w_append (rootwidget, plt); gtk_box_pack_start (GTK_BOX(rootwidget->widget), plt->widget, TRUE, TRUE, 0); gtk_widget_show (plt->widget); @@ -1063,6 +1067,10 @@ gtkui_thread (void *ctx) { gtk_main (); + w_unreg_widget ("tabbed_playlist"); + w_unreg_widget ("box"); + w_unreg_widget ("vsplitter"); + if (refresh_timeout) { g_source_remove (refresh_timeout); refresh_timeout = 0; diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c index 344d8530..ac718aab 100644 --- a/plugins/gtkui/widgets.c +++ b/plugins/gtkui/widgets.c @@ -25,6 +25,14 @@ #include "ddblistview.h" #include "mainplaylist.h" +typedef struct w_creator_s { + const char *type; + ddb_gtkui_widget_t *(*create_func) (void); + struct w_creator_s *next; +} w_creator_t; + +static w_creator_t *w_creators; + typedef struct { ddb_gtkui_widget_t base; } w_splitter_t; @@ -257,12 +265,81 @@ w_tabbed_playlist_destroy (ddb_gtkui_widget_t *w) { free (tp); } +int hidden = 0; + +void +hide_widget (GtkWidget *widget, gpointer data) { + gtk_widget_hide (widget); + printf ("hide %s\n", G_OBJECT_TYPE_NAME (widget)); +} + +void +show_widget (GtkWidget *widget, gpointer data) { + gtk_widget_show (widget); + printf ("show %s\n", G_OBJECT_TYPE_NAME (widget)); +} + +void +w_menu_deactivate (GtkMenuShell *menushell, gpointer user_data) { + gtk_container_foreach (GTK_CONTAINER (user_data), show_widget, NULL); + + // for some reason, after gtk_widget_show, eventbox appears behind, + // so here we have a workaround -- push it back on top + gtk_event_box_set_above_child (GTK_EVENT_BOX (user_data), FALSE); + gtk_event_box_set_above_child (GTK_EVENT_BOX (user_data), TRUE); + hidden = 0; +} + +gboolean +w_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { + printf ("w_button_press_event\n"); + gtk_container_foreach (GTK_CONTAINER (widget), hide_widget, NULL); + hidden = 1; + gtk_widget_queue_draw (widget); + GtkWidget *menu; + GtkWidget *item; + menu = gtk_menu_new (); + item = gtk_menu_item_new_with_mnemonic ("Replace"); + gtk_widget_show (item); + gtk_container_add (GTK_CONTAINER (menu), item); + g_signal_connect ((gpointer) menu, "deactivate", G_CALLBACK (w_menu_deactivate), widget); + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, widget, 0, gtk_get_current_event_time()); + return FALSE; +} + +gboolean +w_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { + if (hidden) { + GdkColor clr = { + .red = 0x2d00, + .green = 0x0000, + .blue = 0xd600 + }; + GdkGC *gc = gdk_gc_new (widget->window); + gdk_gc_set_rgb_fg_color (gc, &clr); + gdk_draw_rectangle (widget->window, gc, TRUE, widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height); + g_object_unref (gc); + return TRUE; + } + + return FALSE; +} + ddb_gtkui_widget_t * w_tabbed_playlist_create (void) { w_tabbed_playlist_t *w = malloc (sizeof (w_tabbed_playlist_t)); memset (w, 0, sizeof (w_tabbed_playlist_t)); - w->base.widget = gtk_vbox_new (FALSE, 0); + w->base.widget = gtk_event_box_new (); + gtk_event_box_set_above_child (GTK_EVENT_BOX (w->base.widget), TRUE); + gtk_event_box_set_visible_window (GTK_EVENT_BOX (w->base.widget), FALSE); + gtk_widget_set_events (w->base.widget, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); + g_signal_connect ((gpointer) w->base.widget, "button_press_event", G_CALLBACK (w_button_press_event), w); + g_signal_connect ((gpointer) w->base.widget, "expose_event", G_CALLBACK (w_expose_event), w); + + GtkWidget *vbox = gtk_vbox_new (FALSE, 0); + gtk_widget_show (vbox); + gtk_container_add (GTK_CONTAINER (w->base.widget), vbox); GtkWidget *tabstrip = ddb_tabstrip_new (); w->tabstrip = (DdbTabStrip *)tabstrip; @@ -273,12 +350,12 @@ w_tabbed_playlist_create (void) { GtkWidget *frame = gtk_frame_new (NULL); gtk_widget_show (frame); - gtk_box_pack_start (GTK_BOX (w->base.widget), tabstrip, FALSE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), tabstrip, FALSE, TRUE, 0); gtk_widget_set_size_request (tabstrip, -1, 24); GTK_WIDGET_UNSET_FLAGS (tabstrip, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (tabstrip, GTK_CAN_DEFAULT); - gtk_box_pack_start (GTK_BOX (w->base.widget), frame, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (vbox), frame, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (frame), 1); gtk_container_add (GTK_CONTAINER (frame), list); @@ -305,3 +382,60 @@ w_create_playlist (void) { w->base.widget = ddb_listview_new (); return (ddb_gtkui_widget_t*)w; } + +void +draw_designmode_rect (GtkWidget *widget, gpointer data) { + gdk_draw_rectangle (widget->window, widget->style->black_gc, TRUE, widget->allocation.x, widget->allocation.y, widget->allocation.width, widget->allocation.height); +} + +void +w_reg_widget (const char *type, ddb_gtkui_widget_t *(*create_func) (void)) { + w_creator_t *c; + for (c = w_creators; c; c = c->next) { + if (!strcmp (c->type, type)) { + fprintf (stderr, "gtkui w_reg_widget: widget type %s already registered\n"); + return; + } + } + c = malloc (sizeof (w_creator_t)); + memset (c, 0, sizeof (w_creator_t)); + c->type = type; + c->create_func = create_func; + c->next = w_creators; + w_creators = c; +} + +void +w_unreg_widget (const char *type) { + w_creator_t *c, *prev = NULL; + for (c = w_creators; c; c = c->next) { + if (!strcmp (c->type, type)) { + if (prev) { + prev->next = c->next; + } + else { + w_creators = c->next; + } + free (c); + return; + } + prev = c; + } + fprintf (stderr, "gtkui w_unreg_widget: widget type %s is not registered\n"); +} + +ddb_gtkui_widget_t * +w_create (const char *type) { + for (w_creator_t *c = w_creators; c; c = c->next) { + if (!strcmp (c->type, type)) { + ddb_gtkui_widget_t *w = c->create_func (); + + // add design mode signal handlers +// g_signal_connect ((gpointer) w->widget, "button_press_event", G_CALLBACK (w_button_press_event), w); +// g_signal_connect_after ((gpointer) w->widget, "expose_event", G_CALLBACK (w_expose_event), w); + + return w; + } + } + return NULL; +} diff --git a/plugins/gtkui/widgets.h b/plugins/gtkui/widgets.h index 17fd2af6..bac4e77c 100644 --- a/plugins/gtkui/widgets.h +++ b/plugins/gtkui/widgets.h @@ -22,6 +22,15 @@ #include "gtkui_api.h" void +w_reg_widget (const char *type, ddb_gtkui_widget_t *(*create_func) (void)); + +void +w_unreg_widget (const char *type); + +ddb_gtkui_widget_t * +w_create (const char *type); + +void w_append (ddb_gtkui_widget_t *cont, ddb_gtkui_widget_t *child); ddb_gtkui_widget_t * |