summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/gtkui/ddblistview.c2
-rw-r--r--plugins/gtkui/gtkui.c14
-rw-r--r--plugins/gtkui/widgets.c140
-rw-r--r--plugins/gtkui/widgets.h9
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 *