Pick up user details rather than making them up.
[disorder] / disobedience / users.c
index 6910d43..6835d27 100644 (file)
@@ -34,6 +34,8 @@ static GtkWidget *users_details_password;
 static GtkWidget *users_details_password2;
 //static GtkWidget *users_details_rights;
 
+static const char *users_who, *users_email, *users_rights, *users_password;
+
 static int usercmp(const void *a, const void *b) {
   return strcmp(*(char **)a, *(char **)b);
 }
@@ -124,6 +126,13 @@ static GtkWidget *users_add_detail(GtkWidget *table,
   return users_detail_generic(table, rowp, title, entry);
 }
 
+/** @brief Add a checkbox for a right
+ * @param table Containing table
+ * @param rowp Pointer to row number, incremented
+ * @param title Label for this row
+ * @param value Right bit (masked but not necessarily normalized)
+ * @return Checkbox widget
+ */
 static GtkWidget *users_add_right(GtkWidget *table,
                                   int *rowp,
                                   const char *title,
@@ -133,7 +142,48 @@ static GtkWidget *users_add_right(GtkWidget *table,
   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), !!value);
   return users_detail_generic(table, rowp, title, check);
 }
-                                                   
+
+/** @brief Add a checkbox for a three-right group
+ * @param table Containing table
+ * @param rowp Pointer to row number, incremented
+ * @param title Label for this row
+ * @param bits Rights bits (not masked or normalized)
+ * @param mask Mask for this group (must be 7.2^n)
+ * @param checks Where to store triple of check widgets
+ * @return Checkbox widget
+ */
+static void users_add_right_group(GtkWidget *table,
+                                  int *rowp,
+                                  const char *title,
+                                  rights_type bits,
+                                  rights_type mask,
+                                  GtkWidget *checks[3]) {
+  GtkWidget *any = gtk_check_button_new_with_label("Any");
+  GtkWidget *mine = gtk_check_button_new_with_label("Own");
+  GtkWidget *random = gtk_check_button_new_with_label("Random");
+  GtkWidget *hbox = gtk_hbox_new(FALSE, 2);
+
+  /* Discard irrelevant bits */
+  bits &= mask;
+  /* Shift down to bits 0-2; the mask is always 3 contiguous bits */
+  bits /= (mask / 7);
+  /* If _ANY is set then the other two are implied; we'll take them out when we
+   * set. */
+  if(bits & 1)
+    bits = 7;
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(any), !!(bits & 1));
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(mine), !!(bits & 2));
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(random), !!(bits & 4));
+  gtk_box_pack_start(GTK_BOX(hbox), any, FALSE, FALSE, 0);
+  gtk_box_pack_start(GTK_BOX(hbox), mine, FALSE, FALSE, 0);
+  gtk_box_pack_start(GTK_BOX(hbox), random, FALSE, FALSE, 0);
+  if(checks) {
+    checks[0] = any;
+    checks[1] = mine;
+    checks[2] = random;
+  }
+  users_detail_generic(table, rowp, title, hbox);
+}
 
 /** @brief Create the user details window
  * @param title Window title
@@ -186,9 +236,9 @@ static void users_makedetails(const char *title,
   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_group(table, &row, "Move", r, RIGHT_MOVE__MASK, NULL);
+  users_add_right_group(table, &row, "Remove", r, RIGHT_REMOVE__MASK, NULL);
+  users_add_right_group(table, &row, "Scratch", r, RIGHT_SCRATCH__MASK, NULL);
   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);
@@ -258,13 +308,32 @@ static void users_delete(GtkButton attribute((unused)) *button,
   }
 }
 
+static void users_got_email(void attribute((unused)) *v, const char *value) {
+  users_email = value;
+}
+
+static void users_got_rights(void attribute((unused)) *v, const char *value) {
+  users_rights = value;
+}
+
+static void users_got_password(void attribute((unused)) *v, const char *value) {
+  users_password = value;
+  users_makedetails("editing user details",
+                    users_who,
+                    users_email,
+                    users_rights,
+                    users_password);
+}
+
 static void users_edit(GtkButton attribute((unused)) *button,
                       gpointer attribute((unused)) userdata) {
-  char *who;
-  
-  if(!(who = users_getuser()))
+  if(!(users_who = users_getuser()))
     return;
-  users_makedetails("editing user details", who, "foo@bar", "play", "wobble");
+  /* Schedule user lookups for all the properties we know about.  This is all a
+   * bit ad-hoc but will do for now. */
+  disorder_eclient_userinfo(client, users_got_email, users_who, "email", 0);
+  disorder_eclient_userinfo(client, users_got_rights, users_who, "rights", 0);
+  disorder_eclient_userinfo(client, users_got_password, users_who, "password", 0);
 }
 
 static const struct button users_buttons[] = {