chiark / gitweb /
Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/disorder
[disorder] / disobedience / queue-generic.h
index c2cb119a1014383e40ce4e5a4f943ecdbd8b13d9..b774f226f838d4b5f2b726970d4b06d741ee8d25 100644 (file)
@@ -1,21 +1,22 @@
 /*
  * This file is part of DisOrder
- * Copyright (C) 2006-2008 Richard Kettlewell
+ * Copyright (C) 2006-2009 Richard Kettlewell
  *
- * This program is free software; you can redistribute it and/or modify
+ * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
  *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
- * USA
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+/** @file disobedience/queue-generic.h
+ * @brief Disobedience queue widgets
  */
 #ifndef QUEUE_GENERIC_H
 #define QUEUE_GENERIC_H
@@ -45,28 +46,6 @@ struct queue_column {
 /** @brief Right-algin column */
 #define COL_RIGHT 0x0004
 
-/** @brief An item in the queue's popup menu */
-struct queue_menuitem {
-  /** @brief Menu item name */
-  const char *name;
-
-  /** @brief Called to activate the menu item */
-  void (*activate)(GtkMenuItem *menuitem,
-                   gpointer user_data);
-  
-  /** @brief Called to determine whether the menu item is usable.
-   *
-   * Returns @c TRUE if it should be sensitive and @c FALSE otherwise.
-   */
-  int (*sensitive)(struct queuelike *ql);
-
-  /** @brief Signal handler ID */
-  gulong handlerid;
-
-  /** @brief Widget for menu item */
-  GtkWidget *w;
-};
-
 /** @brief Definition of a queue-like window */
 struct queuelike {
 
@@ -76,7 +55,7 @@ struct queuelike {
   const char *name;
   
   /** @brief Initialization function */
-  void (*init)(void);
+  void (*init)(struct queuelike *ql);
 
   /** @brief Columns */
   const struct queue_column *columns;
@@ -85,7 +64,7 @@ struct queuelike {
   int ncolumns;
 
   /** @brief Items for popup menu */
-  struct queue_menuitem *menuitems;
+  struct menuitem *menuitems;
 
   /** @brief Number of menu items */
   int nmenuitems;
@@ -108,36 +87,90 @@ struct queuelike {
   
   /** @brief The popup menu */
   GtkWidget *menu;
+
+  /** @brief Menu callbacks */
+  struct tabtype tabtype;
+
+  /** @brief Drag-drop callback, or NULL for no drag+drop
+   * @param ql Owning queuelike
+   * @param ntracks Number of tracks to be dropped
+   * @param tracks List of track names
+   * @param ids List of track IDs
+   * @param after_me Drop after this or NULL to drop at head
+   *
+   * If the rearrangement is impossible then the displayed queue must be put
+   * back.
+   */
+  void (*drop)(struct queuelike *ql, int ntracks, char **tracks, char **ids,
+               struct queue_entry *after_me);
+
+  /** @brief Source target list */
+  const GtkTargetEntry *drag_source_targets;
+
+  /** @brief Drag source actions */
+  GdkDragAction drag_source_actions;
+  
+  /** @brief Destination target list */
+  const GtkTargetEntry *drag_dest_targets;
+
+  /** @brief Drag destination actions */
+  GdkDragAction drag_dest_actions;
+  
 };
 
+enum {
+  PLAYABLE_TRACKS_ID,
+  QUEUED_TRACKS_ID,
+  PLAYLIST_TRACKS_ID
+};
+
+#define PLAYABLE_TRACKS (char *)"text/x-disorder-playable-tracks"
+#define QUEUED_TRACKS (char *)"text/x-disorder-queued-tracks"
+#define PLAYLIST_TRACKS (char *)"text/x-disorder-playlist-tracks"
+
+enum {
+  QUEUEPOINTER_COLUMN,
+  FOREGROUND_COLUMN,
+  BACKGROUND_COLUMN,
+
+  EXTRA_COLUMNS
+};
+
+#define BG_PLAYING "#e0ffe0"
+#define FG_PLAYING "black"
+
 extern struct queuelike ql_queue;
 extern struct queuelike ql_recent;
 extern struct queuelike ql_added;
 
 extern time_t last_playing;
 
-int ql_selectall_sensitive(struct queuelike *ql);
+int ql_selectall_sensitive(void *extra);
 void ql_selectall_activate(GtkMenuItem *menuitem,
                            gpointer user_data);
-int ql_selectnone_sensitive(struct queuelike *ql);
+int ql_selectnone_sensitive(void *extra);
 void ql_selectnone_activate(GtkMenuItem *menuitem,
                             gpointer user_data);
-int ql_properties_sensitive(struct queuelike *ql);
+int ql_properties_sensitive(void *extra);
 void ql_properties_activate(GtkMenuItem *menuitem,
                             gpointer user_data);
-int ql_scratch_sensitive(struct queuelike *ql);
+int ql_scratch_sensitive(void *extra);
 void ql_scratch_activate(GtkMenuItem *menuitem,
                          gpointer user_data);
-int ql_remove_sensitive(struct queuelike *ql);
+int ql_remove_sensitive(void *extra);
 void ql_remove_activate(GtkMenuItem *menuitem,
                         gpointer user_data);
-int ql_play_sensitive(struct queuelike *ql);
+int ql_play_sensitive(void *extra);
 void ql_play_activate(GtkMenuItem *menuitem,
                       gpointer user_data);
+int ql_adopt_sensitive(void *extra);
+void ql_adopt_activate(GtkMenuItem *menuitem,
+                       gpointer user_data);
 gboolean ql_button_release(GtkWidget *widget,
                            GdkEventButton *event,
                            gpointer user_data);
 GtkWidget *init_queuelike(struct queuelike *ql);
+void destroy_queuelike(struct queuelike *ql);
 void ql_update_list_store(struct queuelike *ql) ;
 void ql_update_row(struct queue_entry *q,
                    GtkTreeIter *iter);
@@ -152,6 +185,10 @@ const char *column_namepart(const struct queue_entry *q,
 const char *column_length(const struct queue_entry *q,
                           const char *data);
 struct tabtype *ql_tabtype(struct queuelike *ql);
+struct queue_entry *ql_iter_to_q(GtkTreeModel *model,
+                                 GtkTreeIter *iter);
+struct queue_entry *ql_path_to_q(GtkTreeModel *model,
+                                 GtkTreePath *path);
 
 #endif /* QUEUE_GENERIC_H */