summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-10-19 22:14:11 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2009-10-19 22:14:11 +0200
commit69cc2069986fa6e5d13d9d33e4f6b11e0adc0ba3 (patch)
tree6218093a68605c081a5777cfe76bb777d815f4bb
parent7c1ea7259b1f9e78fd5670819d04e52689f7d5ba (diff)
fixed bug after column header drag-drop
started working on column context menu
-rw-r--r--callbacks.c65
-rw-r--r--callbacks.h36
-rw-r--r--deadbeef.glade96
-rw-r--r--gtkplaylist.c78
-rw-r--r--gtkplaylist.h2
-rw-r--r--interface.c106
-rw-r--r--interface.h1
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);