From 08098b86c58fb3280191258eeb32c025d7c42feb Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Tue, 1 Sep 2015 21:34:05 +0200 Subject: Change button editing from a GtkDialog to a GtkPopover --- rcm-client-receive.c | 112 ++++++++++++---------- rcm-client.ui | 258 +++++++++++++++++++++------------------------------ 2 files changed, 172 insertions(+), 198 deletions(-) diff --git a/rcm-client-receive.c b/rcm-client-receive.c index 828d07e..7c54645 100644 --- a/rcm-client-receive.c +++ b/rcm-client-receive.c @@ -55,6 +55,7 @@ struct state { bool editing; GtkWidget *stack; GtkWidget *title; + GtkWidget *popover; }; static struct state state; @@ -214,19 +215,73 @@ new_button_widget(struct rcbutton *rcb, const gchar *protocol, guint64 scancode, static GtkWidget * new_blank_widget(struct rcbutton *rcb); +static void +edit_button_ok(GtkButton *button, gpointer user_data) +{ + struct rcbutton *rcb = user_data; + GtkComboBoxText *keycode_cbox; + gchar *keycode; + + keycode_cbox = GTK_COMBO_BOX_TEXT(get_object("edit_button_keycode_value")); + keycode = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(keycode_cbox)); + if (!keycode) + goto out; + + printf("New keycode is %s\n", keycode); + + if (rcb->name) + g_free(rcb->name); + + if (rcb->button) + gtk_widget_destroy(rcb->button); + + rcb->name = keycode; + rcb->type = RCBUTTON_TYPE_NORMAL; + rcb->button = new_button_widget(rcb, "dummy", 0xf001f001, keycode); + gtk_widget_set_sensitive(rcb->button, true); + gtk_widget_show_all(rcb->button); + +out: + gtk_widget_hide(state.popover); +} + +static void +edit_button_delete(GtkButton *button, gpointer user_data) +{ + struct rcbutton *rcb = user_data; + + if (rcb->type == RCBUTTON_TYPE_BLANK) + goto out; + + g_free(rcb->name); + rcb->name = NULL; + rcb->type = RCBUTTON_TYPE_BLANK; + gtk_widget_destroy(rcb->button); + rcb->button = new_blank_widget(rcb); + gtk_revealer_set_reveal_child(GTK_REVEALER(rcb->button), true); + gtk_widget_show_all(rcb->button); + +out: + gtk_widget_hide(state.popover); +} + static void edit_button_dialog(GtkButton *button, struct rcbutton *rcb) { - GtkWidget *dialog; GtkComboBoxText *keycode_cbox; GtkEntry *comment_entry; - gint r; GList *ke; unsigned i; - dialog = GTK_WIDGET(gtk_builder_get_object(global->builder, "edit_button")); + if (!state.popover) { + GtkWidget *popover; - keycode_cbox = GTK_COMBO_BOX_TEXT(gtk_builder_get_object(global->builder, "edit_button_keycode_value")); + popover = GTK_WIDGET(get_object("edit_button")); + gtk_popover_set_position(GTK_POPOVER(popover), GTK_POS_BOTTOM); + state.popover = popover; + } + + keycode_cbox = GTK_COMBO_BOX_TEXT(get_object("edit_button_keycode_value")); gtk_combo_box_text_remove_all(keycode_cbox); for (ke = rcb->remote->keymap, i = 0; ke; ke = ke->next, i++) { struct keymap_entry *entry = ke->data; @@ -236,53 +291,14 @@ edit_button_dialog(GtkButton *button, struct rcbutton *rcb) gtk_combo_box_set_active(GTK_COMBO_BOX(keycode_cbox), i); } - comment_entry = GTK_ENTRY(gtk_builder_get_object(global->builder, "edit_button_comment_value")); + comment_entry = GTK_ENTRY(get_object("edit_button_comment_value")); gtk_entry_set_text(comment_entry, ""); - gtk_widget_show_all(dialog); - - r = gtk_dialog_run(GTK_DIALOG(dialog)); - switch (r) { - case 1: { - gchar *keycode; - keycode = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(keycode_cbox)); - if (!keycode) - goto out; - - printf("New keycode is %s\n", keycode); + g_signal_replace_id("edit_button_ok", "clicked", G_CALLBACK(edit_button_ok), rcb); + g_signal_replace_id("edit_button_delete", "clicked", G_CALLBACK(edit_button_delete), rcb); - if (rcb->name) - g_free(rcb->name); - - if (rcb->button) - gtk_widget_destroy(rcb->button); - - rcb->name = keycode; - rcb->type = RCBUTTON_TYPE_NORMAL; - rcb->button = new_button_widget(rcb, "dummy", 0xf001f001, keycode); - gtk_widget_show_all(rcb->button); - break; - } - - case 2: - if (rcb->type == RCBUTTON_TYPE_BLANK) - goto out; - - g_free(rcb->name); - rcb->name = NULL; - rcb->type = RCBUTTON_TYPE_BLANK; - gtk_widget_destroy(rcb->button); - rcb->button = new_blank_widget(rcb); - gtk_revealer_set_reveal_child(GTK_REVEALER(rcb->button), true); - gtk_widget_show_all(rcb->button); - break; - - default: - break; - } - -out: - gtk_widget_hide(dialog); + gtk_popover_set_relative_to(GTK_POPOVER(state.popover), GTK_WIDGET(button)); + gtk_widget_show_all(state.popover); } static void diff --git a/rcm-client.ui b/rcm-client.ui index 5aaabb0..2880b1a 100644 --- a/rcm-client.ui +++ b/rcm-client.ui @@ -779,6 +779,114 @@ Show raw events received from the kernel advanced_add_cancel + + False + + + True + False + 12 + 12 + 12 + 12 + 12 + 12 + + + True + False + False + Keycode + 1 + + + 0 + 0 + + + + + True + False + False + Comment + 1 + + + 0 + 1 + + + + + True + False + + + 1 + 0 + + + + + True + True + 100 + No comment + + + 1 + 1 + + + + + True + False + 6 + center + + + Delete + True + True + True + + + + True + True + 0 + + + + + OK + True + True + True + + + + True + True + 1 + + + + + 0 + 2 + 2 + + + + + 1 100 @@ -921,156 +1029,6 @@ Currently connected receivers/transmitters - - False - Edit Button - True - True - dialog - main_window - - - False - 18 - 18 - 18 - 18 - vertical - 2 - - - False - end - - - Delete - True - True - True - - - True - True - 0 - - - - - OK - True - True - True - - - True - True - 1 - - - - - Cancel - True - True - True - - - True - True - 2 - - - - - False - False - 0 - - - - - True - False - 18 - 6 - 12 - - - True - False - 0 - preferences-desktop-keyboard - 6 - - - 0 - 0 - 2 - - - - - True - False - False - Keycode - 1 - - - 1 - 0 - - - - - True - False - False - Comment - 1 - - - 1 - 1 - - - - - True - False - - - 2 - 0 - - - - - True - True - 100 - No comment - - - 2 - 1 - - - - - False - True - 1 - - - - - - edit_button_delete - edit_button_ok - edit_button_cancel - - False Hardware Properties -- cgit v1.2.3