*/
#include "disobedience.h"
+#include "bits.h"
static GtkWidget *users_window;
static GtkListStore *users_list;
static GtkWidget *users_details_email;
static GtkWidget *users_details_password;
static GtkWidget *users_details_password2;
-//static GtkWidget *users_details_rights;
+static GtkWidget *users_details_rights[32];
static const char *users_who, *users_email, *users_rights, *users_password;
* @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,
- rights_type value) {
+static void 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);
+ users_details_rights[leftmost_bit(value)] = check;
+ users_detail_generic(table, rowp, title, check);
+}
+
+/** @brief Set sensitivity of particular mine/random rights bits */
+static void users_details_sensitize(rights_type r) {
+ const int bit = leftmost_bit(r);
+ const GtkWidget *all = users_details_rights[bit];
+ const int sensitive = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(all));
+
+ gtk_widget_set_sensitive(users_details_rights[bit + 1], sensitive);
+ gtk_widget_set_sensitive(users_details_rights[bit + 2], sensitive);
+}
+
+/** @brief Set sensitivity of all mine/random rights bits */
+static void users_details_sensitize_all(void) {
+ users_details_sensitize(RIGHT_MOVE_ANY);
+ users_details_sensitize(RIGHT_REMOVE_ANY);
+ users_details_sensitize(RIGHT_SCRATCH_ANY);
+}
+
+/** @brief Called when an _ALL widget is toggled
+ *
+ * Modifies sensitivity of the corresponding _MINE and _RANDOM widgets. We
+ * just do the lot rather than trying to figure out which one changed,
+ */
+static void users_any_toggled(GtkToggleButton attribute((unused)) *togglebutton,
+ gpointer attribute((unused)) user_data) {
+ users_details_sensitize_all();
}
/** @brief Add a checkbox for a three-right group
* @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]) {
+ rights_type mask) {
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);
+ const uint32_t first = mask / 7;
+ const int bit = leftmost_bit(first);
/* 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;
+ bits >>= bit;
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_details_rights[bit] = any;
+ users_details_rights[bit + 1] = mine;
+ users_details_rights[bit + 2] = random;
users_detail_generic(table, rowp, title, hbox);
+ g_signal_connect(any, "toggled", G_CALLBACK(users_any_toggled), NULL);
}
/** @brief Create the user details window
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);
- 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_group(table, &row, "Move", r, RIGHT_MOVE__MASK);
+ users_add_right_group(table, &row, "Remove", r, RIGHT_REMOVE__MASK);
+ users_add_right_group(table, &row, "Scratch", r, RIGHT_SCRATCH__MASK);
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, "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);
+ users_details_sensitize_all();
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) {
+ /* TODO */
}
static void users_deleted_error(struct callbackdata attribute((unused)) *cbd,