chiark / gitweb /
Add OK and Help buttons to playlists, and Help button to track
authorRichard Kettlewell <rjk@greenend.org.uk>
Fri, 27 Nov 2009 20:16:01 +0000 (20:16 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Fri, 27 Nov 2009 20:16:01 +0000 (20:16 +0000)
properties.

Fiddle with button positioning a bit to get a little more consistent
with Gnome HIG.

disobedience/disobedience.h
disobedience/help.c
disobedience/login.c
disobedience/menu.c
disobedience/misc.c
disobedience/playlists.c
disobedience/properties.c
disobedience/users.c

index 11da2c361a972408174a50ccc527435f94410bb0..8ce1601942d26be3921ac77e166fd5d488968250 100644 (file)
@@ -85,6 +85,11 @@ struct button {
   void (*clicked)(GtkButton *button, gpointer userdata);
   const char *tip;
   GtkWidget *widget;
   void (*clicked)(GtkButton *button, gpointer userdata);
   const char *tip;
   GtkWidget *widget;
+  void (*pack)(GtkBox *box,
+               GtkWidget *child,
+               gboolean expand,
+               gboolean fill,
+               guint padding);
 };
 
 /* Variables --------------------------------------------------------------- */
 };
 
 /* Variables --------------------------------------------------------------- */
@@ -228,7 +233,7 @@ void manage_users(void);
 
 /* Help */
 
 
 /* Help */
 
-void popup_help(void);
+void popup_help(const char *what);
 
 /* RTP */
 
 
 /* RTP */
 
index 5ebe457c464a80cfdac7dc081d85ef24746f490d..5b708e8a2076b02dd7d77ff231b68077d4d61cc6 100644 (file)
 #include <unistd.h>
 
 /** @brief Display the manual page */
 #include <unistd.h>
 
 /** @brief Display the manual page */
-void popup_help(void) {
+void popup_help(const char *what) {
   char *path;
   pid_t pid;
   int w;
 
   char *path;
   pid_t pid;
   int w;
 
-  byte_xasprintf(&path, "%s/index.html", dochtmldir);
+  if(!what)
+    what = "index.html";
+  byte_xasprintf(&path, "%s/%s", dochtmldir, what);
   if(!(pid = xfork())) {
     exitfn = _exit;
     if(!xfork()) {
   if(!(pid = xfork())) {
     exitfn = _exit;
     if(!xfork()) {
index 36850c11da60b9f201c59da9b0033c3bea1cdedc..4031c3a654759e2cd683382e166e978a1df8cc0a 100644 (file)
@@ -254,13 +254,15 @@ static struct button buttons[] = {
     "Login",
     login_ok,
     "(Re-)connect using these settings",
     "Login",
     login_ok,
     "(Re-)connect using these settings",
-    0
+    0,
+    NULL,
   },
   {
     GTK_STOCK_CLOSE,
     login_cancel,
     "Discard changes and close window",
   },
   {
     GTK_STOCK_CLOSE,
     login_cancel,
     "Discard changes and close window",
-    0
+    0,
+    NULL,
   },
 };
 
   },
 };
 
index f04f7203d89ed4cbbb51d3b13d669f153991953c..86ea17755da5690cf9d0b2e4b4c070bf89b91a4e 100644 (file)
@@ -134,7 +134,7 @@ static void manual_popup(gpointer attribute((unused)) callback_data,
                        GtkWidget attribute((unused)) *menu_item) {
   D(("manual_popup"));
 
                        GtkWidget attribute((unused)) *menu_item) {
   D(("manual_popup"));
 
-  popup_help();
+  popup_help(NULL);
 }
 
 /** @brief Called when version arrives, displays about... popup */
 }
 
 /** @brief Called when version arrives, displays about... popup */
index 96e175030c1d5ebca495615c9e80f4e1b1035e41..41fcd136cabf74113dd997380f6a46af26b9ab10 100644 (file)
@@ -187,7 +187,14 @@ GtkWidget *create_buttons_box(struct button *buttons,
     gtk_widget_set_style(buttons[n].widget, tool_style);
     g_signal_connect(G_OBJECT(buttons[n].widget), "clicked",
                      G_CALLBACK(buttons[n].clicked), 0);
     gtk_widget_set_style(buttons[n].widget, tool_style);
     g_signal_connect(G_OBJECT(buttons[n].widget), "clicked",
                      G_CALLBACK(buttons[n].clicked), 0);
-    gtk_box_pack_start(GTK_BOX(box), buttons[n].widget, FALSE, FALSE, 1);
+    void (*pack)(GtkBox *box,
+                 GtkWidget *child,
+                 gboolean expand,
+                 gboolean fill,
+                 guint padding);
+    if(!(pack = buttons[n].pack))
+      pack = gtk_box_pack_start;
+    pack(GTK_BOX(box), buttons[n].widget, FALSE, FALSE, 1);
     gtk_widget_set_tooltip_text(buttons[n].widget, buttons[n].tip);
   }
   return box;
     gtk_widget_set_tooltip_text(buttons[n].widget, buttons[n].tip);
   }
   return box;
index c4e8e04573e21ec92c050dc7b7082bf25032bf43..1f836ad89c0f8b5e9206c4a463bb8198757ce03f 100644 (file)
@@ -129,6 +129,8 @@ static gboolean playlist_picker_button(GtkWidget *widget,
 static gboolean playlist_editor_keypress(GtkWidget *widget,
                                          GdkEventKey *event,
                                          gpointer user_data);
 static gboolean playlist_editor_keypress(GtkWidget *widget,
                                          GdkEventKey *event,
                                          gpointer user_data);
+static void playlist_editor_ok(GtkButton *button, gpointer userdata);
+static void playlist_editor_help(GtkButton *button, gpointer userdata);
 
 /** @brief Playlist editing window */
 static GtkWidget *playlist_window;
 
 /** @brief Playlist editing window */
 static GtkWidget *playlist_window;
@@ -878,13 +880,15 @@ static struct button playlist_picker_buttons[] = {
     GTK_STOCK_ADD,
     playlist_picker_add,
     "Create a new playlist",
     GTK_STOCK_ADD,
     playlist_picker_add,
     "Create a new playlist",
-    0
+    0,
+    NULL,
   },
   {
     GTK_STOCK_REMOVE,
     playlist_picker_delete,
     "Delete a playlist",
   },
   {
     GTK_STOCK_REMOVE,
     playlist_picker_delete,
     "Delete a playlist",
-    0
+    0,
+    NULL,
   },
 };
 #define NPLAYLIST_PICKER_BUTTONS (sizeof playlist_picker_buttons / sizeof *playlist_picker_buttons)
   },
 };
 #define NPLAYLIST_PICKER_BUTTONS (sizeof playlist_picker_buttons / sizeof *playlist_picker_buttons)
@@ -1048,6 +1052,26 @@ static GtkWidget *playlist_editor_public;
 static GtkWidget *playlist_editor_private;
 static int playlist_editor_setting_buttons;
 
 static GtkWidget *playlist_editor_private;
 static int playlist_editor_setting_buttons;
 
+/** @brief Buttons for the playlist window */
+static struct button playlist_editor_buttons[] = {
+  {
+    GTK_STOCK_OK,
+    playlist_editor_ok,
+    "Close window",
+    0,
+    gtk_box_pack_end,
+  },
+  {
+    GTK_STOCK_HELP,
+    playlist_editor_help,
+    "Go to manual",
+    0,
+    gtk_box_pack_end,
+  },
+};
+
+#define NPLAYLIST_EDITOR_BUTTONS (int)(sizeof playlist_editor_buttons / sizeof *playlist_editor_buttons)
+
 static GtkWidget *playlists_editor_create(void) {
   assert(ql_playlist.view == NULL);     /* better not be set up already */
 
 static GtkWidget *playlists_editor_create(void) {
   assert(ql_playlist.view == NULL);     /* better not be set up already */
 
@@ -1072,6 +1096,9 @@ static GtkWidget *playlists_editor_create(void) {
   gtk_box_pack_start(GTK_BOX(hbox), playlist_editor_private,
                      FALSE/*expand*/, FALSE/*fill*/, 0);
   playlist_editor_set_buttons(0,0,0);
   gtk_box_pack_start(GTK_BOX(hbox), playlist_editor_private,
                      FALSE/*expand*/, FALSE/*fill*/, 0);
   playlist_editor_set_buttons(0,0,0);
+  create_buttons_box(playlist_editor_buttons,
+                     NPLAYLIST_EDITOR_BUTTONS,
+                     hbox);
 
   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
   GtkWidget *view = init_queuelike(&ql_playlist);
 
   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
   GtkWidget *view = init_queuelike(&ql_playlist);
@@ -1222,6 +1249,16 @@ static void playlists_editor_received_tracks(void *v,
   ql_new_queue(&ql_playlist, newq);
 }
 
   ql_new_queue(&ql_playlist, newq);
 }
 
+static void playlist_editor_ok(GtkButton attribute((unused)) *button, 
+                               gpointer attribute((unused)) userdata) {
+  gtk_widget_destroy(playlist_window);
+}
+
+static void playlist_editor_help(GtkButton attribute((unused)) *button, 
+                                 gpointer attribute((unused)) userdata) {
+  popup_help("playlists.html");
+}
+
 /* Playlist mutation -------------------------------------------------------- */
 
 /** @brief State structure for guarded playlist modification
 /* Playlist mutation -------------------------------------------------------- */
 
 /** @brief State structure for guarded playlist modification
index 092e8dbe5edc48e42f0aed0de2646bdda86e689d..6600cf947ed88b0b7f0ed1caccd7e7cf212cf15d 100644 (file)
@@ -46,6 +46,7 @@ static void prefdata_completed(void *v, const char *err, const char *value);
 static void properties_ok(GtkButton *button, gpointer userdata);
 static void properties_apply(GtkButton *button, gpointer userdata);
 static void properties_cancel(GtkButton *button, gpointer userdata);
 static void properties_ok(GtkButton *button, gpointer userdata);
 static void properties_apply(GtkButton *button, gpointer userdata);
 static void properties_cancel(GtkButton *button, gpointer userdata);
+static void properties_help(GtkButton *button, gpointer userdata);
 
 static void properties_logged_in(const char *event,
                                  void *eventdata,
 
 static void properties_logged_in(const char *event,
                                  void *eventdata,
@@ -125,23 +126,33 @@ static const struct pref {
 
 /* Buttons that appear at the bottom of the window */
 static struct button buttons[] = {
 
 /* Buttons that appear at the bottom of the window */
 static struct button buttons[] = {
+  {
+    GTK_STOCK_HELP,
+    properties_help,
+    "Go to manual",
+    0,
+    gtk_box_pack_start,
+  },
   {
     GTK_STOCK_OK,
     properties_ok,
     "Apply all changes and close window",
   {
     GTK_STOCK_OK,
     properties_ok,
     "Apply all changes and close window",
-    0
-  },
-  {
-    GTK_STOCK_APPLY,
-    properties_apply,
-    "Apply all changes and keep window open",
-    0
+    0,
+    gtk_box_pack_end,
   },
   {
     GTK_STOCK_CANCEL,
     properties_cancel,
     "Discard all changes and close window",
   },
   {
     GTK_STOCK_CANCEL,
     properties_cancel,
     "Discard all changes and close window",
-    0
+    0,
+    gtk_box_pack_end
+  },
+  {
+    GTK_STOCK_APPLY,
+    properties_apply,
+    "Apply all changes and keep window open",
+    0,
+    gtk_box_pack_end,
   },
 };
 
   },
 };
 
@@ -490,6 +501,11 @@ static void properties_cancel(GtkButton attribute((unused)) *button,
   properties_event = 0;
 }
 
   properties_event = 0;
 }
 
+static void properties_help(GtkButton attribute((unused)) *button,
+                            gpointer attribute((unused)) userdata) {
+  popup_help("properties.html");
+}
+
 /** @brief Called when we've just logged in
  *
  * Destroys the current properties window.
 /** @brief Called when we've just logged in
  *
  * Destroys the current properties window.
index 1d2a169c3910c7134a85df084b128cb81e5e1591..b07869842e24249ed8b6610c16948891b9189529 100644 (file)
@@ -660,13 +660,15 @@ static struct button users_buttons[] = {
     GTK_STOCK_ADD,
     users_add,
     "Create a new user",
     GTK_STOCK_ADD,
     users_add,
     "Create a new user",
-    0
+    0,
+    NULL,
   },
   {
     GTK_STOCK_REMOVE,
     users_delete,
     "Delete a user",
   },
   {
     GTK_STOCK_REMOVE,
     users_delete,
     "Delete a user",
-    0
+    0,
+    NULL,
   },
 };
 #define NUSERS_BUTTONS (sizeof users_buttons / sizeof *users_buttons)
   },
 };
 #define NUSERS_BUTTONS (sizeof users_buttons / sizeof *users_buttons)