From: Richard Kettlewell Date: Fri, 18 Apr 2008 20:45:54 +0000 (+0100) Subject: move/scratch/remove right checkboxes X-Git-Tag: 4.0~115^2~24 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/commitdiff_plain/c49dfc5025d48dcafe9b2a1d5fd38475c11384be move/scratch/remove right checkboxes --- diff --git a/disobedience/users.c b/disobedience/users.c index 6910d43..d342c3f 100644 --- a/disobedience/users.c +++ b/disobedience/users.c @@ -124,6 +124,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,6 +140,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 @@ -186,9 +235,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);