diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2009-10-19 22:14:11 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2009-10-19 22:14:11 +0200 |
commit | 69cc2069986fa6e5d13d9d33e4f6b11e0adc0ba3 (patch) | |
tree | 6218093a68605c081a5777cfe76bb777d815f4bb | |
parent | 7c1ea7259b1f9e78fd5670819d04e52689f7d5ba (diff) |
fixed bug after column header drag-drop
started working on column context menu
-rw-r--r-- | callbacks.c | 65 | ||||
-rw-r--r-- | callbacks.h | 36 | ||||
-rw-r--r-- | deadbeef.glade | 96 | ||||
-rw-r--r-- | gtkplaylist.c | 78 | ||||
-rw-r--r-- | gtkplaylist.h | 2 | ||||
-rw-r--r-- | interface.c | 106 | ||||
-rw-r--r-- | interface.h | 1 |
7 files changed, 340 insertions, 44 deletions
diff --git a/callbacks.c b/callbacks.c index 23bf56d0..02bb6cd3 100644 --- a/callbacks.c +++ b/callbacks.c @@ -1476,3 +1476,68 @@ on_pref_pluginlist_cursor_changed (GtkTreeView *treeview, gtk_entry_set_text (e, p->website ? p->website : ""); } + + +void +on_artist_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_album_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_tracknum_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_duration_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_playing_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_title_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_custom_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + + +void +on_remove_column_activate (GtkMenuItem *menuitem, + gpointer user_data) +{ + +} + diff --git a/callbacks.h b/callbacks.h index 2049f861..506484b0 100644 --- a/callbacks.h +++ b/callbacks.h @@ -594,3 +594,39 @@ on_pref_replaygain_mode_changed (GtkComboBox *combobox, void on_pref_pluginlist_cursor_changed (GtkTreeView *treeview, gpointer user_data); + +gboolean +on_header_popup_menu (GtkWidget *widget, + gpointer user_data); + +void +on_artist_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_album_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_tracknum_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_duration_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_playing_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_title_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_custom_activate (GtkMenuItem *menuitem, + gpointer user_data); + +void +on_remove_column_activate (GtkMenuItem *menuitem, + gpointer user_data); diff --git a/deadbeef.glade b/deadbeef.glade index 2386e3a0..c3682a0a 100644 --- a/deadbeef.glade +++ b/deadbeef.glade @@ -720,7 +720,7 @@ <widget class="GtkDrawingArea" id="header"> <property name="height_request">24</property> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <signal name="expose_event" handler="on_header_expose_event" last_modification_time="Thu, 06 Aug 2009 14:54:29 GMT"/> <signal name="configure_event" handler="on_header_configure_event" last_modification_time="Thu, 06 Aug 2009 14:54:33 GMT"/> <signal name="realize" handler="on_header_realize" last_modification_time="Thu, 06 Aug 2009 14:54:41 GMT"/> @@ -1997,4 +1997,98 @@ Album</property> </child> </widget> +<widget class="GtkMenu" id="headermenu"> + + <child> + <widget class="GtkMenuItem" id="add_column"> + <property name="visible">True</property> + <property name="label" translatable="yes">Add column</property> + <property name="use_underline">True</property> + + <child> + <widget class="GtkMenu" id="add_column_menu"> + + <child> + <widget class="GtkMenuItem" id="artist"> + <property name="visible">True</property> + <property name="label" translatable="yes">Artist</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_artist_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="album"> + <property name="visible">True</property> + <property name="label" translatable="yes">Album</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_album_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="tracknum"> + <property name="visible">True</property> + <property name="label" translatable="yes">Track number</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_tracknum_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="duration"> + <property name="visible">True</property> + <property name="label" translatable="yes">Duration</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_duration_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="playing"> + <property name="visible">True</property> + <property name="label" translatable="yes">Playing status</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_playing_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="title"> + <property name="visible">True</property> + <property name="label" translatable="yes">Title</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_title_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> + + <child> + <widget class="GtkSeparatorMenuItem" id="separator7"> + <property name="visible">True</property> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="custom"> + <property name="visible">True</property> + <property name="label" translatable="yes">Custom</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_custom_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> + </widget> + </child> + </widget> + </child> + + <child> + <widget class="GtkMenuItem" id="remove_column"> + <property name="visible">True</property> + <property name="label" translatable="yes">Remove this column</property> + <property name="use_underline">True</property> + <signal name="activate" handler="on_remove_column_activate" last_modification_time="Mon, 19 Oct 2009 19:30:04 GMT"/> + </widget> + </child> +</widget> + </glade-interface> diff --git a/gtkplaylist.c b/gtkplaylist.c index 5afaf959..5dcd6792 100644 --- a/gtkplaylist.c +++ b/gtkplaylist.c @@ -88,19 +88,15 @@ float colo_current[COLO_COUNT][3]; // playlist row height int rowheight = -1; -#if 0 -const char *colnames[pl_ncolumns] = { - "Playing", - "Artist / Album", - "Track №", - "Title / Track Artist", - "Duration" -}; -#endif - static uintptr_t play16_pixbuf; static uintptr_t pause16_pixbuf; +static GdkCursor* cursor_sz; +static GdkCursor* cursor_drag; +static int header_dragging = -1; +static int header_sizing = -1; +static int header_dragpt[2]; + // that must be called before gtk_init void gtkpl_init (void) { @@ -1177,9 +1173,10 @@ gtkpl_header_draw (gtkplaylist_t *ps) { x = -ps->hscrollpos; gtkpl_column_t *c; int need_draw_moving = 0; - for (c = ps->columns; c; c = c->next) { + int idx = 0; + for (c = ps->columns; c; c = c->next, idx++) { w = c->width; - if (!c->moving) { + if (header_dragging < 0 || idx != header_dragging) { if (x >= widget->allocation.width) { continue; } @@ -1198,9 +1195,10 @@ gtkpl_header_draw (gtkplaylist_t *ps) { } if (need_draw_moving) { x = -ps->hscrollpos; - for (c = ps->columns; c; c = c->next) { + idx = 0; + for (c = ps->columns; c; c = c->next, idx++) { w = c->width; - if (c->moving) { + if (idx == header_dragging) { // draw empty slot if (x < widget->allocation.width) { gtk_paint_box (widget->style, ps->backbuf_header, GTK_STATE_ACTIVE, GTK_SHADOW_ETCHED_IN, NULL, NULL, "button", x, 0, w, h); @@ -1251,12 +1249,6 @@ on_header_configure_event (GtkWidget *widget, } -GdkCursor* cursor_sz; -GdkCursor* cursor_drag; -int header_dragging = -1; -int header_sizing = -1; -int header_dragpt[2]; - void on_header_realize (GtkWidget *widget, gpointer user_data) @@ -1282,7 +1274,6 @@ on_header_motion_notify_event (GtkWidget *widget, gtkpl_column_t *c; int i; for (i = 0, c = ps->columns; i < header_dragging && c; c = c->next, i++); - c->moving = 1; c->movepos = event->x - header_dragpt[0]; // find closest column to the left @@ -1427,30 +1418,35 @@ on_header_button_release_event (GtkWidget *widget, gpointer user_data) { GTKPL_PROLOGUE; - int x = 0; - gtkpl_column_t *c; - for (c = ps->columns; c; c = c->next) { - int w = c->width; - if (event->x >= x + w - 2 && event->x <= x + w) { - gdk_window_set_cursor (widget->window, cursor_sz); - break; + if (event->button == 1) { + header_sizing = -1; + int x = 0; + gtkpl_column_t *c; + for (c = ps->columns; c; c = c->next) { + int w = c->width; + if (event->x >= x + w - 2 && event->x <= x + w) { + gdk_window_set_cursor (widget->window, cursor_sz); + break; + } + else { + gdk_window_set_cursor (widget->window, NULL); + } + x += w; } - else { - gdk_window_set_cursor (widget->window, NULL); + if (header_dragging >= 0) { + header_dragging = -1; + gtkpl_setup_hscrollbar (ps); + gtkpl_header_draw (ps); + gtkpl_expose_header (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height); + gtkpl_draw_playlist (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); + gtkpl_expose (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); + gtkpl_column_rewrite_config (ps); } - c->moving = 0; - x += w; } - if (header_dragging >= 0) { - gtkpl_setup_hscrollbar (ps); - gtkpl_header_draw (ps); - gtkpl_expose_header (ps, 0, 0, ps->header->allocation.width, ps->header->allocation.height); - gtkpl_draw_playlist (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); - gtkpl_expose (ps, 0, 0, ps->playlist->allocation.width, ps->playlist->allocation.height); - gtkpl_column_rewrite_config (ps); + else if (event->button == 3) { + GtkWidget *menu = create_headermenu (); + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, widget, 0, gtk_get_current_event_time()); } - header_dragging = -1; - header_sizing = -1; return FALSE; } diff --git a/gtkplaylist.h b/gtkplaylist.h index 22e83000..9cc4bc74 100644 --- a/gtkplaylist.h +++ b/gtkplaylist.h @@ -57,7 +57,7 @@ typedef struct gtkpl_column_s { int movepos; // valid only while `moving' is 1 struct gtkpl_column_s *next; unsigned align_right : 1; - unsigned moving : 1; +// unsigned moving : 1; } gtkpl_column_t; // structure of this kind must be set as user data for playlist, header and scrollbar widgets diff --git a/interface.c b/interface.c index f864a253..903a834e 100644 --- a/interface.c +++ b/interface.c @@ -462,7 +462,7 @@ create_mainwin (void) gtk_widget_show (header); gtk_box_pack_start (GTK_BOX (vbox3), header, FALSE, TRUE, 0); gtk_widget_set_size_request (header, -1, 24); - gtk_widget_set_events (header, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); + gtk_widget_set_events (header, GDK_POINTER_MOTION_MASK | GDK_BUTTON_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); playlist = gtk_drawing_area_new (); gtk_widget_show (playlist); @@ -1444,3 +1444,107 @@ create_prefwin (void) return prefwin; } +GtkWidget* +create_headermenu (void) +{ + GtkWidget *headermenu; + GtkWidget *add_column; + GtkWidget *add_column_menu; + GtkWidget *artist; + GtkWidget *album; + GtkWidget *tracknum; + GtkWidget *duration; + GtkWidget *playing; + GtkWidget *title; + GtkWidget *separator7; + GtkWidget *custom; + GtkWidget *remove_column; + + headermenu = gtk_menu_new (); + + add_column = gtk_menu_item_new_with_mnemonic ("Add column"); + gtk_widget_show (add_column); + gtk_container_add (GTK_CONTAINER (headermenu), add_column); + + add_column_menu = gtk_menu_new (); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (add_column), add_column_menu); + + artist = gtk_menu_item_new_with_mnemonic ("Artist"); + gtk_widget_show (artist); + gtk_container_add (GTK_CONTAINER (add_column_menu), artist); + + album = gtk_menu_item_new_with_mnemonic ("Album"); + gtk_widget_show (album); + gtk_container_add (GTK_CONTAINER (add_column_menu), album); + + tracknum = gtk_menu_item_new_with_mnemonic ("Track number"); + gtk_widget_show (tracknum); + gtk_container_add (GTK_CONTAINER (add_column_menu), tracknum); + + duration = gtk_menu_item_new_with_mnemonic ("Duration"); + gtk_widget_show (duration); + gtk_container_add (GTK_CONTAINER (add_column_menu), duration); + + playing = gtk_menu_item_new_with_mnemonic ("Playing status"); + gtk_widget_show (playing); + gtk_container_add (GTK_CONTAINER (add_column_menu), playing); + + title = gtk_menu_item_new_with_mnemonic ("Title"); + gtk_widget_show (title); + gtk_container_add (GTK_CONTAINER (add_column_menu), title); + + separator7 = gtk_separator_menu_item_new (); + gtk_widget_show (separator7); + gtk_container_add (GTK_CONTAINER (add_column_menu), separator7); + gtk_widget_set_sensitive (separator7, FALSE); + + custom = gtk_menu_item_new_with_mnemonic ("Custom"); + gtk_widget_show (custom); + gtk_container_add (GTK_CONTAINER (add_column_menu), custom); + + remove_column = gtk_menu_item_new_with_mnemonic ("Remove this column"); + gtk_widget_show (remove_column); + gtk_container_add (GTK_CONTAINER (headermenu), remove_column); + + g_signal_connect ((gpointer) artist, "activate", + G_CALLBACK (on_artist_activate), + NULL); + g_signal_connect ((gpointer) album, "activate", + G_CALLBACK (on_album_activate), + NULL); + g_signal_connect ((gpointer) tracknum, "activate", + G_CALLBACK (on_tracknum_activate), + NULL); + g_signal_connect ((gpointer) duration, "activate", + G_CALLBACK (on_duration_activate), + NULL); + g_signal_connect ((gpointer) playing, "activate", + G_CALLBACK (on_playing_activate), + NULL); + g_signal_connect ((gpointer) title, "activate", + G_CALLBACK (on_title_activate), + NULL); + g_signal_connect ((gpointer) custom, "activate", + G_CALLBACK (on_custom_activate), + NULL); + g_signal_connect ((gpointer) remove_column, "activate", + G_CALLBACK (on_remove_column_activate), + NULL); + + /* Store pointers to all widgets, for use by lookup_widget(). */ + GLADE_HOOKUP_OBJECT_NO_REF (headermenu, headermenu, "headermenu"); + GLADE_HOOKUP_OBJECT (headermenu, add_column, "add_column"); + GLADE_HOOKUP_OBJECT (headermenu, add_column_menu, "add_column_menu"); + GLADE_HOOKUP_OBJECT (headermenu, artist, "artist"); + GLADE_HOOKUP_OBJECT (headermenu, album, "album"); + GLADE_HOOKUP_OBJECT (headermenu, tracknum, "tracknum"); + GLADE_HOOKUP_OBJECT (headermenu, duration, "duration"); + GLADE_HOOKUP_OBJECT (headermenu, playing, "playing"); + GLADE_HOOKUP_OBJECT (headermenu, title, "title"); + GLADE_HOOKUP_OBJECT (headermenu, separator7, "separator7"); + GLADE_HOOKUP_OBJECT (headermenu, custom, "custom"); + GLADE_HOOKUP_OBJECT (headermenu, remove_column, "remove_column"); + + return headermenu; +} + diff --git a/interface.h b/interface.h index 23b18e11..89b2b08e 100644 --- a/interface.h +++ b/interface.h @@ -8,3 +8,4 @@ GtkWidget* create_traymenu (void); GtkWidget* create_addprogress (void); GtkWidget* create_helpwindow (void); GtkWidget* create_prefwin (void); +GtkWidget* create_headermenu (void); |