chiark / gitweb /
First step towards user rights
[disorder] / disobedience / users.c
index 5509aa1389d8649ad840400b8e45c5110a95f266..6910d43f2fd0a40a6d554d5adcc8c2f141ccb5bb 100644 (file)
@@ -27,6 +27,13 @@ static GtkWidget *users_window;
 static GtkListStore *users_list;
 static GtkTreeSelection *users_selection;
 
+static GtkWidget *users_details_window;
+static GtkWidget *users_details_name;
+static GtkWidget *users_details_email;
+static GtkWidget *users_details_password;
+static GtkWidget *users_details_password2;
+//static GtkWidget *users_details_rights;
+
 static int usercmp(const void *a, const void *b) {
   return strcmp(*(char **)a, *(char **)b);
 }
@@ -63,6 +70,138 @@ static char *users_getuser(void) {
   return 0;
 }
 
+/** @brief Text should be visible */
+#define DETAIL_VISIBLE 1
+
+/** @brief Text should be editable */
+#define DETAIL_EDITABLE 2
+
+static GtkWidget *users_detail_generic(GtkWidget *table,
+                                       int *rowp,
+                                       const char *title,
+                                       GtkWidget *selector) {
+  const int row = (*rowp)++;
+  GtkWidget *const label = gtk_label_new(title);
+  gtk_misc_set_alignment(GTK_MISC(label), 1, 0);
+  gtk_table_attach(GTK_TABLE(table),
+                   label,
+                   0, 1,                /* left/right_attach */
+                   row, row+1,          /* top/bottom_attach */
+                   GTK_FILL,            /* xoptions */
+                   0,                   /* yoptions */
+                   1, 1);               /* x/ypadding */
+  gtk_table_attach(GTK_TABLE(table),
+                   selector,
+                   1, 2,                /* left/right_attach */
+                   row, row + 1,        /* top/bottom_attach */
+                   GTK_EXPAND|GTK_FILL, /* xoptions */
+                   GTK_FILL,            /* yoptions */
+                   1, 1);               /* x/ypadding */
+  return selector;
+}
+
+/** @brief Add a row to the user details table
+ * @param table Containin table widget
+ * @param rowp Pointer to row number, incremented
+ * @param title Label for this row
+ * @param value Initial value or NULL
+ * @param flags Flags word
+ * @return The text entry widget
+ */
+static GtkWidget *users_add_detail(GtkWidget *table,
+                                   int *rowp,
+                                   const char *title,
+                                   const char *value,
+                                   unsigned flags) {
+  GtkWidget *entry = gtk_entry_new();
+
+  gtk_entry_set_visibility(GTK_ENTRY(entry),
+                           !!(flags & DETAIL_VISIBLE));
+  gtk_editable_set_editable(GTK_EDITABLE(entry),
+                            !!(flags & DETAIL_EDITABLE));
+  if(value)
+    gtk_entry_set_text(GTK_ENTRY(entry), value);
+  return users_detail_generic(table, rowp, title, entry);
+}
+
+static GtkWidget *users_add_right(GtkWidget *table,
+                                  int *rowp,
+                                  const char *title,
+                                  rights_type value) {
+  GtkWidget *check = gtk_check_button_new();
+  
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), !!value);
+  return users_detail_generic(table, rowp, title, check);
+}
+                                                   
+
+/** @brief Create the user details window
+ * @param title Window title
+ * @param name User name (users_edit()) or NULL (users_add())
+ * @param email Email address
+ * @param rights User rights string
+ * @param password Password
+ *
+ * This is used both by users_add() and users_edit().
+ *
+ * The window contains:
+ * - display or edit fields for the username
+ * - edit fields for the email address
+ * - two hidden edit fields for the password (they must match)
+ * - check boxes for the rights
+ */
+static void users_makedetails(const char *title,
+                              const char *name,
+                              const char *email,
+                              const char *rights,
+                              const char *password) {
+  GtkWidget *table;
+  int row = 0;
+  rights_type r = 0;
+  
+  /* Create the window */
+  users_details_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_widget_set_style(users_details_window, tool_style);
+  g_signal_connect(users_details_window, "destroy",
+                  G_CALLBACK(gtk_widget_destroyed), &users_details_window);
+  gtk_window_set_title(GTK_WINDOW(users_details_window), title);
+  gtk_window_set_transient_for(GTK_WINDOW(users_details_window),
+                               GTK_WINDOW(users_window));
+  table = gtk_table_new(4, 2, FALSE/*!homogeneous*/);
+
+  users_details_name = users_add_detail(table, &row, "Username", name,
+                                        (name ? 0 : DETAIL_EDITABLE)
+                                        |DETAIL_VISIBLE);
+
+  users_details_email = users_add_detail(table, &row, "Email", email,
+                                         DETAIL_EDITABLE|DETAIL_VISIBLE);
+
+  users_details_password = users_add_detail(table, &row, "Password",
+                                            password,
+                                            DETAIL_EDITABLE);
+  users_details_password2 = users_add_detail(table, &row, "Password",
+                                             password,
+                                             DETAIL_EDITABLE);
+
+  parse_rights(rights, &r, 1);
+  users_add_right(table, &row, "Read operations", r & RIGHT_READ);
+  users_add_right(table, &row, "Play track", r & RIGHT_PLAY);
+  /* TODO move */
+  /* TODO remove */
+  /* TODO scratch */
+  users_add_right(table, &row, "Set volume", r & RIGHT_VOLUME);
+  users_add_right(table, &row, "Admin operations", r & RIGHT_ADMIN);
+  users_add_right(table, &row, "Rescan", r & RIGHT_RESCAN);
+  users_add_right(table, &row, "Register new users", r & RIGHT_REGISTER);
+  users_add_right(table, &row, "Modify own userinfo", r & RIGHT_USERINFO);
+  users_add_right(table, &row, "Modify track preferences", r & RIGHT_PREFS);
+  users_add_right(table, &row, "Modify global preferences", r & RIGHT_GLOBAL_PREFS);
+  users_add_right(table, &row, "Pause/resume tracks", r & RIGHT_PAUSE);
+
+  gtk_container_add(GTK_CONTAINER(users_details_window), table);
+  gtk_widget_show_all(users_details_window);
+}
+
 static void users_add(GtkButton attribute((unused)) *button,
                      gpointer attribute((unused)) userdata) {
 }
@@ -121,7 +260,11 @@ static void users_delete(GtkButton attribute((unused)) *button,
 
 static void users_edit(GtkButton attribute((unused)) *button,
                       gpointer attribute((unused)) userdata) {
+  char *who;
   
+  if(!(who = users_getuser()))
+    return;
+  users_makedetails("editing user details", who, "foo@bar", "play", "wobble");
 }
 
 static const struct button users_buttons[] = {