[gnome-todo] task-list-panel: Handle renaming lists



commit 8873274c5d168791ccc8bf84cdb202d961a843bc
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Sat Dec 15 23:54:08 2018 -0200

    task-list-panel: Handle renaming lists
    
    Also in order to implement the proposed mockups.

 src/gtd-task-list-panel.c           | 78 +++++++++++++++++++++++++++++++++
 src/gtd-task-list-panel.ui          | 60 +++++++++++++++++++++++++
 src/sidebar/gtd-sidebar-list-row.c  | 87 +------------------------------------
 src/sidebar/gtd-sidebar-list-row.ui | 57 ------------------------
 4 files changed, 139 insertions(+), 143 deletions(-)
---
diff --git a/src/gtd-task-list-panel.c b/src/gtd-task-list-panel.c
index ee92184..5f0dd40 100644
--- a/src/gtd-task-list-panel.c
+++ b/src/gtd-task-list-panel.c
@@ -35,6 +35,8 @@ struct _GtdTaskListPanel
 
   GtkFlowBox         *colors_flowbox;
   GtkPopover         *popover;
+  GtkWidget          *rename_button;
+  GtkEntry           *rename_entry;
   GtdTaskListView    *task_list_view;
 
   GtkWidget          *previous_color_button;
@@ -145,6 +147,38 @@ update_selected_color (GtdTaskListPanel *self)
     }
 }
 
+static void
+rename_list (GtdTaskListPanel *self)
+{
+  g_autofree gchar *new_name = NULL;
+  GtdTaskList *list;
+
+  g_assert (gtk_widget_get_visible (GTK_WIDGET (self->popover)));
+  g_assert (g_utf8_validate (gtk_entry_get_text (self->rename_entry), -1, NULL));
+
+  list = GTD_TASK_LIST (gtd_task_list_view_get_model (self->task_list_view));
+  g_assert (list != NULL);
+
+  new_name = g_strdup (gtk_entry_get_text (self->rename_entry));
+  new_name = g_strstrip (new_name);
+
+  /*
+   * Even though the Rename button is insensitive, we may still reach here
+   * by activating the entry.
+   */
+  if (!new_name || new_name[0] == '\0')
+    return;
+
+  if (g_strcmp0 (gtk_entry_get_text (self->rename_entry), gtd_task_list_get_name (list)) != 0)
+    {
+      gtd_task_list_set_name (list, gtk_entry_get_text (self->rename_entry));
+      gtd_provider_update_task_list (gtd_task_list_get_provider (list), list);
+    }
+
+  gtk_popover_popdown (self->popover);
+  gtk_entry_set_text (self->rename_entry, "");
+}
+
 
 /*
  * Callbacks
@@ -197,6 +231,44 @@ on_delete_button_clicked_cb (GtkModelButton   *button,
   g_signal_emit (self, signals[LIST_DELETED], 0, list);
 }
 
+static void
+on_popover_hidden_cb (GtkPopover       *popover,
+                      GtdTaskListPanel *self)
+{
+  gtk_entry_set_text (self->rename_entry, "");
+}
+
+static void
+on_rename_button_clicked_cb (GtkButton        *button,
+                             GtdTaskListPanel *self)
+{
+  rename_list (self);
+}
+
+static void
+on_rename_entry_activated_cb (GtkEntry         *entry,
+                              GtdTaskListPanel *self)
+{
+  rename_list (self);
+}
+
+static void
+on_rename_entry_text_changed_cb (GtkEntry         *entry,
+                                 GParamSpec       *pspec,
+                                 GtdTaskListPanel *self)
+{
+
+  g_autofree gchar *new_name = NULL;
+  gboolean valid;
+
+  new_name = g_strdup (gtk_entry_get_text (self->rename_entry));
+  new_name = g_strstrip (new_name);
+
+  valid = new_name && new_name[0] != '\0';
+
+  gtk_widget_set_sensitive (self->rename_button, valid);
+}
+
 
 /*
  * GtdPanel iface
@@ -363,10 +435,16 @@ gtd_task_list_panel_class_init (GtdTaskListPanelClass *klass)
 
   gtk_widget_class_bind_template_child (widget_class, GtdTaskListPanel, colors_flowbox);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskListPanel, popover);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListPanel, rename_button);
+  gtk_widget_class_bind_template_child (widget_class, GtdTaskListPanel, rename_entry);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskListPanel, task_list_view);
 
   gtk_widget_class_bind_template_callback (widget_class, on_colors_flowbox_child_activated_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_delete_button_clicked_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_popover_hidden_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_rename_button_clicked_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_rename_entry_activated_cb);
+  gtk_widget_class_bind_template_callback (widget_class, on_rename_entry_text_changed_cb);
 }
 
 static void
diff --git a/src/gtd-task-list-panel.ui b/src/gtd-task-list-panel.ui
index 6ffe714..01a23c2 100644
--- a/src/gtd-task-list-panel.ui
+++ b/src/gtd-task-list-panel.ui
@@ -15,6 +15,8 @@
   <!-- Popover -->
   <object class="GtkPopoverMenu" id="popover">
     <property name="visible">false</property>
+    <signal name="hide" handler="on_popover_hidden_cb" object="GtdTaskListPanel" swapped="no" />
+
     <child>
       <object class="GtkBox">
         <property name="orientation">vertical</property>
@@ -31,6 +33,13 @@
           </object>
         </child>
 
+        <child>
+          <object class="GtkModelButton">
+            <property name="text" translatable="yes">Rename</property>
+            <property name="menu-name">rename</property>
+          </object>
+        </child>
+
         <child>
           <object class="GtkModelButton">
             <property name="text" translatable="yes">Clear completed tasks…</property>
@@ -51,5 +60,56 @@
         </child>
       </object>
     </child>
+
+    <!-- Rename submenu -->
+    <child>
+      <object class="GtkBox">
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="spacing">12</property>
+        <property name="margin">12</property>
+
+        <child>
+          <object class="GtkModelButton" id="rename_header_button">
+            <property name="text" translatable="yes">Rename</property>
+            <property name="menu-name">main</property>
+            <property name="inverted">true</property>
+            <property name="centered">true</property>
+          </object>
+        </child>
+
+        <child>
+          <object class="GtkBox">
+            <property name="can_focus">False</property>
+            <property name="spacing">12</property>
+
+            <!-- Entry -->
+            <child>
+              <object class="GtkEntry" id="rename_entry">
+                <signal name="activate" handler="on_rename_entry_activated_cb" object="GtdTaskListPanel" 
swapped="no" />
+                <signal name="notify::text" handler="on_rename_entry_text_changed_cb" 
object="GtdTaskListPanel" swapped="no" />
+              </object>
+            </child>
+
+            <!-- Button -->
+            <child>
+              <object class="GtkButton" id="rename_button">
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">Rename</property>
+                <signal name="clicked" handler="on_rename_button_clicked_cb" object="GtdTaskListPanel" 
swapped="no" />
+                <style>
+                  <class name="destructive-action"/>
+                </style>
+              </object>
+            </child>
+
+          </object>
+        </child>
+
+      </object>
+      <packing>
+        <property name="submenu">rename</property>
+      </packing>
+    </child>
   </object>
 </interface>
diff --git a/src/sidebar/gtd-sidebar-list-row.c b/src/sidebar/gtd-sidebar-list-row.c
index 4f35d2d..4224304 100644
--- a/src/sidebar/gtd-sidebar-list-row.c
+++ b/src/sidebar/gtd-sidebar-list-row.c
@@ -38,10 +38,6 @@ struct _GtdSidebarListRow
 
   GtkImage           *color_icon;
   GtkLabel           *name_label;
-  GtkWidget          *rename_button;
-  GtkEntry           *rename_entry;
-  GtkLabel           *rename_label;
-  GtkPopover         *rename_popover;
   GtkLabel           *tasks_counter_label;
 
   GActionMap         *action_group;
@@ -142,28 +138,6 @@ set_list (GtdSidebarListRow *self,
                           G_BINDING_DEFAULT | G_BINDING_SYNC_CREATE);
 }
 
-static void
-rename_list (GtdSidebarListRow *self)
-{
-  g_assert (gtk_widget_get_visible (GTK_WIDGET (self->rename_popover)));
-  g_assert (g_utf8_validate (gtk_entry_get_text (self->rename_entry), -1, NULL));
-
-  /*
-   * Even though the Rename button is insensitive, we may still reach here
-   * by activating the entry.
-   */
-  if (gtk_entry_get_text_length (self->rename_entry) == 0)
-    return;
-
-  if (g_strcmp0 (gtk_entry_get_text (self->rename_entry), gtd_task_list_get_name (self->list)) != 0)
-    {
-      gtd_task_list_set_name (self->list, gtk_entry_get_text (self->rename_entry));
-      gtd_provider_update_task_list (gtd_task_list_get_provider (self->list), self->list);
-    }
-
-  gtk_popover_popdown (self->rename_popover);
-}
-
 static void
 popup_menu (GtdSidebarListRow *self)
 {
@@ -182,31 +156,6 @@ popup_menu (GtdSidebarListRow *self)
  * Callbacks
  */
 
-static void
-on_rename_action_activated_cb (GSimpleAction *action,
-                               GVariant      *parameters,
-                               gpointer       user_data)
-{
-  GtdSidebarListRow *self;
-  g_autofree gchar *text;
-
-  GTD_ENTRY;
-
-  self = GTD_SIDEBAR_LIST_ROW (user_data);
-
-  g_assert (self->list != NULL);
-
-  text = g_strdup_printf (_("Rename %s"), gtd_task_list_get_name (self->list));
-  gtk_label_set_label (self->rename_label, text);
-
-  gtk_entry_set_text (self->rename_entry, gtd_task_list_get_name (self->list));
-
-  gtk_popover_set_relative_to (self->rename_popover, GTK_WIDGET (self));
-  gtk_popover_popup (self->rename_popover);
-
-  GTD_EXIT;
-}
-
 static void
 on_gesture_multipress_released_cb (GtkGesture        *gesture,
                                    guint              n_press,
@@ -243,30 +192,6 @@ on_list_color_changed_cb (GtdTaskList       *list,
   update_color_icon (self);
 }
 
-static void
-on_rename_button_clicked_cb (GtkButton         *button,
-                             GtdSidebarListRow *self)
-{
-  rename_list (self);
-}
-
-static void
-on_rename_entry_activated_cb (GtkEntry          *entry,
-                              GtdSidebarListRow *self)
-{
-  rename_list (self);
-}
-
-static void
-on_rename_entry_text_changed_cb (GtkEntry          *entry,
-                                 GParamSpec        *pspec,
-                                 GtdSidebarListRow *self)
-{
-  gboolean valid = gtk_entry_get_text_length (entry) > 0;
-
-  gtk_widget_set_sensitive (self->rename_button, valid);
-}
-
 static void
 on_rename_popover_hidden_cb (GtkPopover        *popover,
                              GtdSidebarListRow *self)
@@ -356,27 +281,17 @@ gtd_sidebar_list_row_class_init (GtdSidebarListRowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, color_icon);
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, menu);
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, name_label);
-  gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, rename_button);
-  gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, rename_entry);
-  gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, rename_label);
-  gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, rename_popover);
   gtk_widget_class_bind_template_child (widget_class, GtdSidebarListRow, tasks_counter_label);
 
   gtk_widget_class_bind_template_callback (widget_class, on_gesture_long_press_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_gesture_multipress_released_cb);
-  gtk_widget_class_bind_template_callback (widget_class, on_rename_button_clicked_cb);
-  gtk_widget_class_bind_template_callback (widget_class, on_rename_entry_activated_cb);
-  gtk_widget_class_bind_template_callback (widget_class, on_rename_entry_text_changed_cb);
   gtk_widget_class_bind_template_callback (widget_class, on_rename_popover_hidden_cb);
 }
 
 static void
 gtd_sidebar_list_row_init (GtdSidebarListRow *self)
 {
-  const GActionEntry entries[] =
-  {
-    { "rename", on_rename_action_activated_cb },
-  };
+  const GActionEntry entries[] = { };
 
   gtk_widget_init_template (GTK_WIDGET (self));
 
diff --git a/src/sidebar/gtd-sidebar-list-row.ui b/src/sidebar/gtd-sidebar-list-row.ui
index b38904c..b371eb3 100644
--- a/src/sidebar/gtd-sidebar-list-row.ui
+++ b/src/sidebar/gtd-sidebar-list-row.ui
@@ -60,63 +60,6 @@
     </child>
   </template>
 
-  <!-- Rename popover -->
-  <object class="GtkPopover" id="rename_popover">
-    <property name="visible">false</property>
-    <property name="can_focus">False</property>
-    <property name="position">right</property>
-    <signal name="hide" handler="on_rename_popover_hidden_cb" object="GtdSidebarListRow" swapped="no" />
-
-    <child>
-      <object class="GtkBox">
-        <property name="can_focus">False</property>
-        <property name="orientation">vertical</property>
-        <property name="spacing">12</property>
-        <property name="margin">12</property>
-
-        <child>
-          <object class="GtkLabel" id="rename_label">
-            <property name="can_focus">False</property>
-            <property name="hexpand">True</property>
-            <property name="xalign">0.0</property>
-            <attributes>
-              <attribute name="weight" value="bold"/>
-            </attributes>
-          </object>
-        </child>
-
-        <child>
-          <object class="GtkBox">
-            <property name="can_focus">False</property>
-            <property name="spacing">12</property>
-
-            <!-- Entry -->
-            <child>
-              <object class="GtkEntry" id="rename_entry">
-                <signal name="activate" handler="on_rename_entry_activated_cb" object="GtdSidebarListRow" 
swapped="no" />
-                <signal name="notify::text" handler="on_rename_entry_text_changed_cb" 
object="GtdSidebarListRow" swapped="no" />
-              </object>
-            </child>
-
-            <!-- Button -->
-            <child>
-              <object class="GtkButton" id="rename_button">
-                <property name="can_focus">False</property>
-                <property name="label" translatable="yes">Rename</property>
-                <signal name="clicked" handler="on_rename_button_clicked_cb" object="GtdSidebarListRow" 
swapped="no" />
-                <style>
-                  <class name="destructive-action"/>
-                </style>
-              </object>
-            </child>
-
-          </object>
-        </child>
-
-      </object>
-    </child>
-  </object>
-
   <!-- Right-click menu -->
   <menu id="menu">
     <section>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]