[gnome-todo] task-row: split new task row



commit d1a434a919a12eb276181e80c433037ff63ba939
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Mon Feb 13 21:06:05 2017 -0200

    task-row: split new task row
    
    The new task mode is not working very well, and the
    GtdTaskRow code is getting confusing and bloated.
    
    Fix that by splitting the row code into GtdNewTaskRow,
    and adapting GtdTaskListView to handle that.

 data/Makefile.am         |    1 +
 data/todo.gresource.xml  |    1 +
 data/ui/list-view.ui     |    4 +-
 data/ui/new-task-row.ui  |   65 +++++++++++
 data/ui/task-row.ui      |  263 +++++++++++++++++----------------------------
 src/Makefile.am          |    2 +
 src/gtd-dnd-row.c        |   17 ++--
 src/gtd-dnd-row.h        |    4 +-
 src/gtd-new-task-row.c   |  207 ++++++++++++++++++++++++++++++++++++
 src/gtd-new-task-row.h   |   40 +++++++
 src/gtd-task-list-view.c |  120 ++++++++++++----------
 src/gtd-task-row.c       |  165 +----------------------------
 src/gtd-task-row.h       |    5 -
 13 files changed, 499 insertions(+), 395 deletions(-)
---
diff --git a/data/Makefile.am b/data/Makefile.am
index 61c8835..6faa9a0 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -44,6 +44,7 @@ EXTRA_DIST=                     \
   ui/list-selector-list-item.ui \
   ui/list-selector-panel.ui \
   ui/list-view.ui \
+  ui/new-task-row.ui \
   ui/notification.ui \
   ui/plugin-dialog.ui \
   ui/plugin-row.ui \
diff --git a/data/todo.gresource.xml b/data/todo.gresource.xml
index c180086..c53e344 100644
--- a/data/todo.gresource.xml
+++ b/data/todo.gresource.xml
@@ -10,6 +10,7 @@
     <file compressed="true" preprocess="xml-stripblanks">ui/list-selector-list-item.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">ui/list-selector-panel.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">ui/list-view.ui</file>
+    <file compressed="true" preprocess="xml-stripblanks">ui/new-task-row.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">ui/notification.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">ui/plugin-dialog.ui</file>
     <file compressed="true" preprocess="xml-stripblanks">ui/plugin-row.ui</file>
diff --git a/data/ui/list-view.ui b/data/ui/list-view.ui
index 30bc6aa..d9f63ba 100644
--- a/data/ui/list-view.ui
+++ b/data/ui/list-view.ui
@@ -43,10 +43,10 @@
                         <signal name="drag-motion" handler="listbox_drag_motion" object="GtdTaskListView" 
swapped="no" />
                         <signal name="row-activated" handler="listbox_row_activated" 
object="GtdTaskListView" swapped="no" />
                         <child>
-                          <object class="GtdTaskRow" id="new_task_row">
+                          <object class="GtdNewTaskRow" id="new_task_row">
                             <property name="visible">True</property>
-                            <property name="new-task-mode">True</property>
                             <signal name="create-task" handler="gtd_task_list_view__create_task" 
object="GtdTaskListView" swapped="no" />
+                            <signal name="enter" handler="task_row_entered_cb" object="GtdTaskListView" 
swapped="yes" />
                             <signal name="exit" handler="task_row_exited_cb" object="GtdTaskListView" 
swapped="yes" />
                           </object>
                         </child>
diff --git a/data/ui/new-task-row.ui b/data/ui/new-task-row.ui
new file mode 100644
index 0000000..806f01b
--- /dev/null
+++ b/data/ui/new-task-row.ui
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <requires lib="gtk+" version="3.16"/>
+  <template class="GtdNewTaskRow" parent="GtkListBoxRow">
+    <property name="width_request">100</property>
+    <property name="visible">True</property>
+    <property name="can_focus">True</property>
+    <property name="activatable">True</property>
+    <property name="selectable">False</property>
+    <child>
+      <object class="GtkBox">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="margin">6</property>
+        <property name="margin_start">24</property>
+        <property name="margin_end">24</property>
+        <property name="spacing">12</property>
+        <child>
+          <object class="GtkImage" id="add_task_image">
+            <property name="width_request">16</property>
+            <property name="height_request">16</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="halign">center</property>
+            <property name="valign">center</property>
+            <property name="icon_name">list-add-symbolic</property>
+          </object>
+        </child>
+        <child>
+          <object class="GtkStack" id="stack">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="hexpand">True</property>
+            <property name="transition_type">crossfade</property>
+            <child>
+              <object class="GtkLabel" id="label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="label" translatable="yes">New task…</property>
+                <property name="xalign">0</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+              <packing>
+                <property name="name">label</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkEntry" id="entry">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <signal name="activate" handler="entry_activated_cb" object="GtdNewTaskRow" swapped="yes" />
+              </object>
+              <packing>
+                <property name="name">entry</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/data/ui/task-row.ui b/data/ui/task-row.ui
index 89b32f7..8a01fe0 100644
--- a/data/ui/task-row.ui
+++ b/data/ui/task-row.ui
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.18.1 -->
 <interface>
   <requires lib="gtk+" version="3.16"/>
   <template class="GtdTaskRow" parent="GtkListBoxRow">
@@ -15,223 +14,159 @@
         <property name="transition_type">slide-down</property>
         <property name="transition_duration">200</property>
         <child>
-          <object class="GtkStack" id="stack">
+          <object class="GtkBox" id="task_box">
             <property name="visible">True</property>
             <property name="can_focus">False</property>
             <property name="border_width">6</property>
             <property name="margin_start">18</property>
             <property name="margin_end">18</property>
+            <property name="spacing">12</property>
             <child>
-              <object class="GtkBox" id="task_box">
+              <object class="GtkBox" id="dnd_box">
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="spacing">12</property>
                 <child>
-                  <object class="GtkBox" id="dnd_box">
+                  <object class="GtkEventBox" id="dnd_event_box">
                     <property name="visible">True</property>
+                    <signal name="button-press-event" handler="button_press_event" object="GtdTaskRow" 
swapped="no" />
+                    <signal name="drag-begin" handler="drag_begin_cb" object="GtdTaskRow" swapped="no" />
+                    <signal name="enter-notify-event" handler="mouse_over_event" object="GtdTaskRow" 
swapped="no" />
+                    <signal name="leave-notify-event" handler="mouse_out_event" object="GtdTaskRow" 
swapped="no" />
                     <child>
-                      <object class="GtkEventBox" id="dnd_event_box">
+                      <object class="GtkImage" id="dnd_icon">
                         <property name="visible">True</property>
-                        <signal name="button-press-event" handler="button_press_event" object="GtdTaskRow" 
swapped="no" />
-                        <signal name="drag-begin" handler="drag_begin_cb" object="GtdTaskRow" swapped="no" />
-                        <signal name="enter-notify-event" handler="mouse_over_event" object="GtdTaskRow" 
swapped="no" />
-                        <signal name="leave-notify-event" handler="mouse_out_event" object="GtdTaskRow" 
swapped="no" />
-                        <child>
-                          <object class="GtkImage" id="dnd_icon">
-                            <property name="visible">True</property>
-                            <property name="icon-name">open-menu-symbolic</property>
-                            <property name="pixel-size">12</property>
-                            <style>
-                              <class name="dim-label" />
-                            </style>
-                          </object>
-                        </child>
+                        <property name="icon-name">open-menu-symbolic</property>
+                        <property name="pixel-size">12</property>
+                        <style>
+                          <class name="dim-label" />
+                        </style>
                       </object>
                     </child>
                   </object>
                 </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkCheckButton" id="done_check">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">False</property>
+                <property name="halign">center</property>
+                <property name="valign">center</property>
+                <property name="vexpand">True</property>
+                <property name="draw_indicator">True</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkStack" id="task_stack">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="transition_type">crossfade</property>
+                <property name="hexpand">True</property>
                 <child>
-                  <object class="GtkCheckButton" id="done_check">
-                    <property name="visible">True</property>
-                    <property name="can_focus">True</property>
-                    <property name="receives_default">False</property>
-                    <property name="halign">center</property>
-                    <property name="valign">center</property>
-                    <property name="vexpand">True</property>
-                    <property name="draw_indicator">True</property>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkStack" id="task_stack">
+                  <object class="GtkBox" id="title_label_box">
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="transition_type">crossfade</property>
-                    <property name="hexpand">True</property>
+                    <property name="spacing">12</property>
                     <child>
-                      <object class="GtkBox" id="title_label_box">
+                      <object class="GtkLabel" id="title_label">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="spacing">12</property>
-                        <child>
-                          <object class="GtkLabel" id="title_label">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="xalign">0</property>
-                            <property name="label" bind-source="title_entry" bind-property="text" />
-                          </object>
-                        </child>
-                        <child>
-                          <object class="GtkSpinner" id="task_loading_spinner">
-                            <property name="visible">False</property>
-                            <property name="can_focus">False</property>
-                            <property name="active">True</property>
-                            <property name="halign">start</property>
-                          </object>
-                        </child>
+                        <property name="xalign">0</property>
+                        <property name="label" bind-source="title_entry" bind-property="text" />
                       </object>
-                      <packing>
-                        <property name="name">label</property>
-                      </packing>
                     </child>
                     <child>
-                      <object class="GtkEntry" id="title_entry">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="hexpand">True</property>
+                      <object class="GtkSpinner" id="task_loading_spinner">
+                        <property name="visible">False</property>
+                        <property name="can_focus">False</property>
+                        <property name="active">True</property>
+                        <property name="halign">start</property>
                       </object>
-                      <packing>
-                        <property name="name">title</property>
-                        <property name="position">1</property>
-                      </packing>
                     </child>
                   </object>
                   <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
+                    <property name="name">label</property>
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkBox" id="task_extras_box">
-                    <property name="visible">False</property>
-                    <property name="can_focus">False</property>
-                    <property name="halign">end</property>
-                    <property name="valign">center</property>
-                    <property name="hexpand">True</property>
-                    <property name="spacing">6</property>
-                    <child>
-                      <object class="GtkButton" id="task_attachment_button">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="relief">none</property>
-                        <child>
-                          <object class="GtkImage" id="task_attachment_button_image">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="icon_name">text-x-generic-symbolic</property>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="task_alarm_button">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="relief">none</property>
-                        <child>
-                          <object class="GtkImage" id="task_alarm_button_image">
-                            <property name="visible">True</property>
-                            <property name="can_focus">False</property>
-                            <property name="icon_name">alarm-symbolic</property>
-                          </object>
-                        </child>
-                      </object>
-                    </child>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="task_date_label">
+                  <object class="GtkEntry" id="title_entry">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="xalign">1</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="task_list_label">
-                    <property name="visible">False</property>
-                    <property name="can_focus">False</property>
-                    <property name="xalign">1</property>
-                    <property name="width_chars">18</property>
-                    <property name="max_width_chars">18</property>
-                    <property name="ellipsize">middle</property>
-                    <style>
-                      <class name="dim-label"/>
-                    </style>
+                    <property name="can_focus">True</property>
+                    <property name="hexpand">True</property>
                   </object>
+                  <packing>
+                    <property name="name">title</property>
+                    <property name="position">1</property>
+                  </packing>
                 </child>
               </object>
               <packing>
-                <property name="name">task</property>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
               </packing>
             </child>
             <child>
-              <object class="GtkBox" id="new_task_box">
-                <property name="visible">True</property>
+              <object class="GtkBox" id="task_extras_box">
+                <property name="visible">False</property>
                 <property name="can_focus">False</property>
-                <property name="spacing">12</property>
-                <child>
-                  <object class="GtkImage" id="add_task_image">
-                    <property name="width_request">16</property>
-                    <property name="height_request">16</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="halign">center</property>
-                    <property name="valign">center</property>
-                    <property name="icon_name">list-add-symbolic</property>
-                  </object>
-                </child>
+                <property name="halign">end</property>
+                <property name="valign">center</property>
+                <property name="hexpand">True</property>
+                <property name="spacing">6</property>
                 <child>
-                  <object class="GtkStack" id="new_task_stack">
+                  <object class="GtkButton" id="task_attachment_button">
                     <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="hexpand">True</property>
-                    <property name="transition_type">crossfade</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
                     <child>
-                      <object class="GtkLabel" id="new_task_label">
+                      <object class="GtkImage" id="task_attachment_button_image">
                         <property name="visible">True</property>
                         <property name="can_focus">False</property>
-                        <property name="label" translatable="yes">New task…</property>
-                        <property name="xalign">0</property>
-                        <style>
-                          <class name="dim-label"/>
-                        </style>
+                        <property name="icon_name">text-x-generic-symbolic</property>
                       </object>
-                      <packing>
-                        <property name="name">label</property>
-                      </packing>
                     </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkButton" id="task_alarm_button">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">True</property>
+                    <property name="relief">none</property>
                     <child>
-                      <object class="GtkEntry" id="new_task_entry">
+                      <object class="GtkImage" id="task_alarm_button_image">
                         <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <signal name="activate" handler="gtd_task_row__entry_activated" object="GtdTaskRow" 
swapped="no" />
+                        <property name="can_focus">False</property>
+                        <property name="icon_name">alarm-symbolic</property>
                       </object>
-                      <packing>
-                        <property name="name">entry</property>
-                        <property name="position">1</property>
-                      </packing>
                     </child>
                   </object>
                 </child>
               </object>
-              <packing>
-                <property name="name">new</property>
-                <property name="position">1</property>
-              </packing>
+            </child>
+            <child>
+              <object class="GtkLabel" id="task_date_label">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">1</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
+            </child>
+            <child>
+              <object class="GtkLabel" id="task_list_label">
+                <property name="visible">False</property>
+                <property name="can_focus">False</property>
+                <property name="xalign">1</property>
+                <property name="width_chars">18</property>
+                <property name="max_width_chars">18</property>
+                <property name="ellipsize">middle</property>
+                <style>
+                  <class name="dim-label"/>
+                </style>
+              </object>
             </child>
           </object>
         </child>
diff --git a/src/Makefile.am b/src/Makefile.am
index f6d1194..edf4e6a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -71,6 +71,8 @@ gnome_todo_SOURCES = \
        gtd-enums.h \
        gtd-initial-setup-window.c \
        gtd-initial-setup-window.h \
+       gtd-new-task-row.c \
+       gtd-new-task-row.h \
        gtd-object.c \
        gtd-object.h \
        gtd-plugin-dialog.c \
diff --git a/src/gtd-dnd-row.c b/src/gtd-dnd-row.c
index fbe7291..11c9a4a 100644
--- a/src/gtd-dnd-row.c
+++ b/src/gtd-dnd-row.c
@@ -17,6 +17,7 @@
  */
 
 #include "gtd-dnd-row.h"
+#include "gtd-new-task-row.h"
 #include "gtd-provider.h"
 #include "gtd-task.h"
 #include "gtd-task-list.h"
@@ -31,7 +32,7 @@ struct _GtdDndRow
   GtkWidget          *box;
   GtkWidget          *icon;
 
-  GtdTaskRow         *row_above;
+  GtkListBoxRow      *row_above;
   gint                depth;
 };
 
@@ -51,7 +52,7 @@ get_real_task_for_depth (GtdDndRow *self)
   GtdTask *task;
   gint i, task_depth;
 
-  task = self->row_above ? gtd_task_row_get_task (self->row_above) : NULL;
+  task = self->row_above ? gtd_task_row_get_task (GTD_TASK_ROW (self->row_above)) : NULL;
   task_depth = task ? gtd_task_get_depth (task) : -1;
 
   /* Find the real parent */
@@ -153,7 +154,7 @@ gtd_dnd_row_new (void)
   return g_object_new (GTD_TYPE_DND_ROW, NULL);
 }
 
-GtdTaskRow*
+GtkListBoxRow*
 gtd_dnd_row_get_row_above (GtdDndRow *self)
 {
   g_return_val_if_fail (GTD_IS_DND_ROW (self), NULL);
@@ -162,8 +163,8 @@ gtd_dnd_row_get_row_above (GtdDndRow *self)
 }
 
 void
-gtd_dnd_row_set_row_above (GtdDndRow  *self,
-                           GtdTaskRow *row)
+gtd_dnd_row_set_row_above (GtdDndRow     *self,
+                           GtkListBoxRow *row)
 {
   g_return_if_fail (GTD_IS_DND_ROW (self));
 
@@ -186,12 +187,12 @@ gtd_dnd_row_drag_motion (GtkWidget      *widget,
 
   self = GTD_DND_ROW (widget);
 
-  if (self->row_above)
+  if (self->row_above && GTD_IS_TASK_ROW (self->row_above))
     {
       GtdTask *task;
       gint offset;
 
-      task = gtd_task_row_get_task (self->row_above);
+      task = gtd_task_row_get_task (GTD_TASK_ROW (self->row_above));
       offset = gtk_widget_get_margin_start (self->box) + gtk_widget_get_allocated_width (self->icon) + 12;
       self->depth = CLAMP (floor ((x - offset) / 32),
                            0,
@@ -245,7 +246,7 @@ gtd_dnd_row_drag_drop (GtkWidget      *widget,
   gtk_widget_show (row);
 
   /* Do not allow dropping on itself, nor on the new task row */
-  if (!row || row == widget || gtd_task_row_get_new_task_mode (GTD_TASK_ROW (row)))
+  if (!row || row == widget || GTD_IS_NEW_TASK_ROW (row))
     {
       gdk_drag_status (context, 0, time);
       return FALSE;
diff --git a/src/gtd-dnd-row.h b/src/gtd-dnd-row.h
index 4c6da9b..ca1b4cc 100644
--- a/src/gtd-dnd-row.h
+++ b/src/gtd-dnd-row.h
@@ -31,10 +31,10 @@ G_DECLARE_FINAL_TYPE (GtdDndRow, gtd_dnd_row, GTD, DND_ROW, GtkListBoxRow)
 
 GtkWidget*           gtd_dnd_row_new                             (void);
 
-GtdTaskRow*          gtd_dnd_row_get_row_above                   (GtdDndRow          *self);
+GtkListBoxRow*       gtd_dnd_row_get_row_above                   (GtdDndRow          *self);
 
 void                 gtd_dnd_row_set_row_above                   (GtdDndRow          *self,
-                                                                  GtdTaskRow         *row);
+                                                                  GtkListBoxRow      *row);
 
 
 gboolean             gtd_dnd_row_drag_drop                       (GtkWidget          *widget,
diff --git a/src/gtd-new-task-row.c b/src/gtd-new-task-row.c
new file mode 100644
index 0000000..e0bc40e
--- /dev/null
+++ b/src/gtd-new-task-row.c
@@ -0,0 +1,207 @@
+/* gtd-new-task-row.c
+ *
+ * Copyright (C) 2017 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gtd-new-task-row.h"
+#include "gtd-task.h"
+
+struct _GtdNewTaskRow
+{
+  GtkListBoxRow       parent;
+
+  GtkEntry           *entry;
+  GtkStack           *stack;
+};
+
+G_DEFINE_TYPE (GtdNewTaskRow, gtd_new_task_row, GTK_TYPE_LIST_BOX_ROW)
+
+enum
+{
+  ENTER,
+  EXIT,
+  CREATE_TASK,
+  NUM_SIGNALS
+};
+
+enum
+{
+  PROP_0,
+  N_PROPS
+};
+
+static guint          signals [NUM_SIGNALS] = { 0, };
+
+/*
+ * Auxiliary methods
+ */
+
+static gboolean
+gtd_new_task_row_focus_in_event (GtkWidget     *widget,
+                                 GdkEventFocus *event)
+{
+  GtdNewTaskRow *self = GTD_NEW_TASK_ROW (widget);
+
+  gtd_new_task_row_set_active (self, TRUE);
+
+  return GDK_EVENT_PROPAGATE;
+}
+
+/*
+ * Callbacks
+ */
+
+static void
+entry_activated_cb (GtdNewTaskRow *self)
+{
+  GtdTask *new_task;
+
+  /* Cannot create empty tasks */
+  if (gtk_entry_get_text_length (self->entry) == 0)
+    return;
+
+  new_task = gtd_task_new (NULL);
+  gtd_task_set_title (new_task, gtk_entry_get_text (self->entry));
+  gtd_task_save (new_task);
+
+  g_signal_emit (self, signals[CREATE_TASK], 0, new_task);
+
+  gtk_entry_set_text (self->entry, "");
+}
+
+static void
+gtd_new_task_row_get_property (GObject    *object,
+                               guint       prop_id,
+                               GValue     *value,
+                               GParamSpec *pspec)
+{
+  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+}
+
+static void
+gtd_new_task_row_set_property (GObject      *object,
+                               guint         prop_id,
+                               const GValue *value,
+                               GParamSpec   *pspec)
+{
+  G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+}
+
+static void
+gtd_new_task_row_class_init (GtdNewTaskRowClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->get_property = gtd_new_task_row_get_property;
+  object_class->set_property = gtd_new_task_row_set_property;
+
+  widget_class->focus_in_event = gtd_new_task_row_focus_in_event;
+
+  /**
+   * GtdNewTaskRow::enter:
+   *
+   * Emitted when the row is focused and in the editing state.
+   */
+  signals[ENTER] = g_signal_new ("enter",
+                                 GTD_TYPE_NEW_TASK_ROW,
+                                 G_SIGNAL_RUN_LAST,
+                                 0,
+                                 NULL,
+                                 NULL,
+                                 NULL,
+                                 G_TYPE_NONE,
+                                 0);
+
+  /**
+   * GtdNewTaskRow::exit:
+   *
+   * Emitted when the row is unfocused and leaves the editing state.
+   */
+  signals[EXIT] = g_signal_new ("exit",
+                                GTD_TYPE_NEW_TASK_ROW,
+                                G_SIGNAL_RUN_LAST,
+                                0,
+                                NULL,
+                                NULL,
+                                NULL,
+                                G_TYPE_NONE,
+                                0);
+
+  /**
+   * GtdNewTaskRow::create-task:
+   *
+   * Emitted when the row wants the parent widget to create a new task.
+   */
+  signals[CREATE_TASK] = g_signal_new ("create-task",
+                                       GTD_TYPE_NEW_TASK_ROW,
+                                       G_SIGNAL_RUN_LAST,
+                                       0,
+                                       NULL,
+                                       NULL,
+                                       NULL,
+                                       G_TYPE_NONE,
+                                       1,
+                                       GTD_TYPE_TASK);
+
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/new-task-row.ui");
+
+  gtk_widget_class_bind_template_child (widget_class, GtdNewTaskRow, entry);
+  gtk_widget_class_bind_template_child (widget_class, GtdNewTaskRow, stack);
+
+  gtk_widget_class_bind_template_callback (widget_class, entry_activated_cb);
+
+  gtk_widget_class_set_css_name (widget_class, "taskrow");
+}
+
+static void
+gtd_new_task_row_init (GtdNewTaskRow *self)
+{
+  gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+GtkWidget*
+gtd_new_task_row_new (void)
+{
+  return g_object_new (GTD_TYPE_NEW_TASK_ROW, NULL);
+}
+
+gboolean
+gtd_new_task_row_get_active (GtdNewTaskRow *self)
+{
+  g_return_val_if_fail (GTD_IS_NEW_TASK_ROW (self), FALSE);
+
+  return g_str_equal (gtk_stack_get_visible_child_name (self->stack), "entry");
+}
+
+void
+gtd_new_task_row_set_active (GtdNewTaskRow *self,
+                             gboolean       active)
+{
+  g_return_if_fail (GTD_IS_NEW_TASK_ROW (self));
+
+  if (active)
+    {
+      gtk_stack_set_visible_child_name (self->stack, "entry");
+      gtk_widget_grab_focus (GTK_WIDGET (self->entry));
+      g_signal_emit (self, signals[ENTER], 0);
+    }
+  else
+    {
+      gtk_stack_set_visible_child_name (self->stack, "label");
+      gtk_widget_grab_focus (GTK_WIDGET (self->entry));
+    }
+}
diff --git a/src/gtd-new-task-row.h b/src/gtd-new-task-row.h
new file mode 100644
index 0000000..0b96933
--- /dev/null
+++ b/src/gtd-new-task-row.h
@@ -0,0 +1,40 @@
+/* gtd-new-task-row.h
+ *
+ * Copyright (C) 2017 Georges Basile Stavracas Neto <georges stavracas gmail com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef GTD_NEW_TASK_ROW_H
+#define GTD_NEW_TASK_ROW_H
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GTD_TYPE_NEW_TASK_ROW (gtd_new_task_row_get_type())
+
+G_DECLARE_FINAL_TYPE (GtdNewTaskRow, gtd_new_task_row, GTD, NEW_TASK_ROW, GtkListBoxRow)
+
+GtkWidget*           gtd_new_task_row_new                        (void);
+
+gboolean             gtd_new_task_row_get_active                 (GtdNewTaskRow      *self);
+
+void                 gtd_new_task_row_set_active                 (GtdNewTaskRow      *self,
+                                                                  gboolean            active);
+
+G_END_DECLS
+
+#endif /* GTD_NEW_TASK_ROW_H */
+
diff --git a/src/gtd-task-list-view.c b/src/gtd-task-list-view.c
index f790728..a878b41 100644
--- a/src/gtd-task-list-view.c
+++ b/src/gtd-task-list-view.c
@@ -22,6 +22,7 @@
 #include "gtd-empty-list-widget.h"
 #include "gtd-task-list-view.h"
 #include "gtd-manager.h"
+#include "gtd-new-task-row.h"
 #include "gtd-notification.h"
 #include "gtd-provider.h"
 #include "gtd-task.h"
@@ -69,7 +70,7 @@ typedef struct
   GtkRevealer           *edit_revealer;
   GtkWidget             *empty_box;
   GtkListBox            *listbox;
-  GtdTaskRow            *new_task_row;
+  GtkListBoxRow         *new_task_row;
   GtkRevealer           *revealer;
   GtkImage              *done_image;
   GtkLabel              *done_label;
@@ -178,12 +179,22 @@ set_active_row (GtdTaskListView *self,
     return;
 
   if (priv->active_row)
-    gtd_task_row_set_active (GTD_TASK_ROW (priv->active_row), FALSE);
+    {
+      if (GTD_IS_TASK_ROW (priv->active_row))
+        gtd_task_row_set_active (GTD_TASK_ROW (priv->active_row), FALSE);
+      else
+        gtd_new_task_row_set_active (GTD_NEW_TASK_ROW (priv->active_row), FALSE);
+    }
 
   priv->active_row = row;
 
   if (row)
-    gtd_task_row_set_active (GTD_TASK_ROW (row), TRUE);
+    {
+      if (GTD_IS_TASK_ROW (row))
+        gtd_task_row_set_active (GTD_TASK_ROW (row), TRUE);
+      else
+        gtd_new_task_row_set_active (GTD_NEW_TASK_ROW (row), TRUE);
+    }
 }
 
 /*
@@ -330,34 +341,41 @@ undo_remove_task_action (GtdNotification *notification,
  * Default sorting functions
  */
 static gint
-compare_task_rows (GtdTaskRow *row1,
-                   GtdTaskRow *row2)
+compare_task_rows (GtkListBoxRow *row1,
+                   GtkListBoxRow *row2)
 {
-  if (gtd_task_row_get_new_task_mode (row1))
-    return 1;
-  else if (gtd_task_row_get_new_task_mode (row2))
-    return -1;
+  if (GTD_IS_NEW_TASK_ROW (row1))
+    {
+      return 1;
+    }
+  else if (GTD_IS_NEW_TASK_ROW (row2))
+    {
+      return -1;
+    }
   else
-    return gtd_task_compare (gtd_task_row_get_task (row1), gtd_task_row_get_task (row2));
+    {
+      return gtd_task_compare (gtd_task_row_get_task (GTD_TASK_ROW (row1)),
+                               gtd_task_row_get_task (GTD_TASK_ROW (row2)));
+    }
 }
 
 static gint
 compare_dnd_rows (GtkListBoxRow *row1,
                   GtkListBoxRow *row2)
 {
-  GtdTaskRow *row_above, *current_row;
+  GtkListBoxRow *row_above, *current_row;
   gboolean reverse;
 
   if (GTD_IS_DND_ROW (row1))
     {
       row_above = gtd_dnd_row_get_row_above (GTD_DND_ROW (row1));
-      current_row = GTD_TASK_ROW (row2);
+      current_row = row2;
       reverse = FALSE;
     }
   else
     {
       row_above = gtd_dnd_row_get_row_above (GTD_DND_ROW (row2));
-      current_row = GTD_TASK_ROW (row1);
+      current_row = row1;
       reverse = TRUE;
     }
 
@@ -379,15 +397,15 @@ gtd_task_list_view__listbox_sort_func (GtkListBoxRow *row1,
   if (GTD_IS_DND_ROW (row1) || GTD_IS_DND_ROW (row2))
     return compare_dnd_rows (row1, row2);
 
-  return compare_task_rows (GTD_TASK_ROW (row1), GTD_TASK_ROW (row2));
+  return compare_task_rows (row1, row2);
 }
 
 /*
  * Custom sorting functions
  */
 static void
-internal_header_func (GtdTaskRow      *row,
-                      GtdTaskRow      *before,
+internal_header_func (GtkListBoxRow   *row,
+                      GtkListBoxRow   *before,
                       GtdTaskListView *view)
 {
   GtdTask *row_task;
@@ -398,11 +416,11 @@ internal_header_func (GtdTaskRow      *row,
 
   row_task = before_task = NULL;
 
-  if (row)
-    row_task = gtd_task_row_get_task (row);
+  if (row && GTD_IS_TASK_ROW (row))
+    row_task = gtd_task_row_get_task (GTD_TASK_ROW (row));
 
-  if (before)
-    before_task = gtd_task_row_get_task (before);
+  if (before && GTD_IS_TASK_ROW (row))
+    before_task = gtd_task_row_get_task (GTD_TASK_ROW (before));
 
   view->priv->header_func (GTK_LIST_BOX_ROW (row),
                            row_task,
@@ -413,23 +431,23 @@ internal_header_func (GtdTaskRow      *row,
 
 static gint
 internal_compare_task_rows (GtdTaskListView *self,
-                            GtdTaskRow      *row1,
-                            GtdTaskRow      *row2)
+                            GtkListBoxRow   *row1,
+                            GtkListBoxRow   *row2)
 {  GtdTask *row1_task;
   GtdTask *row2_task;
 
-  if (gtd_task_row_get_new_task_mode (row1))
+  if (row1 == self->priv->new_task_row)
     return 1;
-  else if (gtd_task_row_get_new_task_mode (row2))
+  else if (row2 == self->priv->new_task_row)
     return -1;
 
   row1_task = row2_task = NULL;
 
   if (row1)
-    row1_task = gtd_task_row_get_task (row1);
+    row1_task = gtd_task_row_get_task (GTD_TASK_ROW (row1));
 
   if (row2)
-    row2_task = gtd_task_row_get_task (row2);
+    row2_task = gtd_task_row_get_task (GTD_TASK_ROW (row2));
 
   return self->priv->sort_func (GTK_LIST_BOX_ROW (row1),
                                 row1_task,
@@ -443,19 +461,19 @@ internal_compare_dnd_rows (GtdTaskListView *self,
                            GtkListBoxRow   *row1,
                            GtkListBoxRow   *row2)
 {
-  GtdTaskRow *row_above, *current_row;
+  GtkListBoxRow *row_above, *current_row;
   gboolean reverse;
 
   if (GTD_IS_DND_ROW (row1))
     {
       row_above = gtd_dnd_row_get_row_above (GTD_DND_ROW (row1));
-      current_row = GTD_TASK_ROW (row2);
+      current_row = row2;
       reverse = FALSE;
     }
   else
     {
       row_above = gtd_dnd_row_get_row_above (GTD_DND_ROW (row2));
-      current_row = GTD_TASK_ROW (row1);
+      current_row = row1;
       reverse = TRUE;
     }
 
@@ -473,18 +491,13 @@ internal_sort_func (GtkListBoxRow   *a,
                     GtkListBoxRow   *b,
                     GtdTaskListView *view)
 {
-  GtdTaskRow *row1, *row2;
-
   if (!view->priv->sort_func)
     return 0;
 
   if (GTD_IS_DND_ROW (a) || GTD_IS_DND_ROW (b))
     return internal_compare_dnd_rows (view, a, b);
 
-  row1 = GTD_TASK_ROW (a);
-  row2 = GTD_TASK_ROW (b);
-
-  return internal_compare_task_rows (view, row1, row2);
+  return internal_compare_task_rows (view, a, b);
 }
 
 static void
@@ -812,9 +825,6 @@ task_row_entered_cb (GtdTaskListView *self,
   GtdTaskListViewPrivate *priv = self->priv;
   GtdTask *old_task;
 
-  if (row == priv->new_task_row)
-    return;
-
   old_task = gtd_edit_pane_get_task (priv->edit_pane);
 
   /* Save the task previously edited */
@@ -824,12 +834,19 @@ task_row_entered_cb (GtdTaskListView *self,
       real_save_task (self, old_task);
     }
 
+  set_active_row (self, GTK_WIDGET (row));
+
+  /* If we focused the new task row, only activate it */
+  if (GTD_IS_NEW_TASK_ROW (row))
+    {
+      gtk_revealer_set_reveal_child (priv->edit_revealer, FALSE);
+      return;
+    }
+
   gtd_edit_pane_set_task (priv->edit_pane, gtd_task_row_get_task (row));
 
   gtk_revealer_set_reveal_child (priv->edit_revealer, TRUE);
   gtd_arrow_frame_set_row (priv->arrow_frame, row);
-
-  set_active_row (self, GTK_WIDGET (row));
 }
 
 static void
@@ -1010,8 +1027,7 @@ gtd_task_list_view__remove_row_for_task (GtdTaskListView *view,
       if (!GTD_IS_TASK_ROW (l->data))
         continue;
 
-      if (!gtd_task_row_get_new_task_mode (l->data) &&
-          gtd_task_row_get_task (l->data) == task)
+      if (gtd_task_row_get_task (l->data) == task)
         {
           destroy_task_row (view, l->data);
           break;
@@ -1352,7 +1368,8 @@ listbox_drag_motion (GtkListBox      *listbox,
 {
   GtdTaskListViewPrivate *priv;
   GtkListBoxRow *hovered_row;
-  GtdTaskRow *task_row, *row_above_dnd;
+  GtkListBoxRow *task_row;
+  GtkListBoxRow *row_above_dnd;
   gint row_x, row_y, row_height;
 
   priv = gtd_task_list_view_get_instance_private (self);
@@ -1379,7 +1396,7 @@ listbox_drag_motion (GtkListBox      *listbox,
     goto success;
 
   row_above_dnd = NULL;
-  task_row = GTD_TASK_ROW (hovered_row);
+  task_row = hovered_row;
   row_height = gtk_widget_get_allocated_height (GTK_WIDGET (hovered_row));
   gtk_widget_translate_coordinates (GTK_WIDGET (listbox),
                                     GTK_WIDGET (hovered_row),
@@ -1393,7 +1410,7 @@ listbox_drag_motion (GtkListBox      *listbox,
    * the previous row. Also, when hovering the new task row, only show
    * the dnd row over it (never below).
    */
-  if (row_y < row_height / 2 || gtd_task_row_get_new_task_mode (task_row))
+  if (row_y < row_height / 2 || GTD_IS_NEW_TASK_ROW (task_row))
     {
       gint row_index, i;
 
@@ -1407,15 +1424,12 @@ listbox_drag_motion (GtkListBox      *listbox,
           aux = gtk_list_box_get_row_at_index (GTK_LIST_BOX (priv->listbox), i);
 
           /* Skip DnD, New task and hidden rows */
-          if (GTD_IS_DND_ROW (aux) ||
-              gtd_task_row_get_new_task_mode (GTD_TASK_ROW (aux)) ||
-              (aux && !gtk_widget_get_visible (GTK_WIDGET (aux))))
+          if (!GTD_IS_TASK_ROW (aux) || (aux && !gtk_widget_get_visible (GTK_WIDGET (aux))))
             {
               continue;
             }
 
-
-          row_above_dnd = GTD_TASK_ROW (aux);
+          row_above_dnd = aux;
 
           break;
         }
@@ -1434,7 +1448,7 @@ listbox_drag_motion (GtkListBox      *listbox,
       dnd_widget = gtk_drag_get_source_widget (context);
       dnd_row = gtk_widget_get_ancestor (dnd_widget, GTK_TYPE_LIST_BOX_ROW);
       dnd_task = gtd_task_row_get_task (GTD_TASK_ROW (dnd_row));
-      row_above_task = gtd_task_row_get_task (row_above_dnd);
+      row_above_task = gtd_task_row_get_task (GTD_TASK_ROW (row_above_dnd));
 
       /* Forbid DnD'ing a row into a subtask */
       if (row_above_task && gtd_task_is_subtask (dnd_task, row_above_task))
@@ -1624,6 +1638,7 @@ gtd_task_list_view_class_init (GtdTaskListViewClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, listbox_drag_leave);
   gtk_widget_class_bind_template_callback (widget_class, listbox_drag_motion);
   gtk_widget_class_bind_template_callback (widget_class, listbox_row_activated);
+  gtk_widget_class_bind_template_callback (widget_class, task_row_entered_cb);
   gtk_widget_class_bind_template_callback (widget_class, task_row_exited_cb);
 
   gtk_widget_class_set_css_name (widget_class, "task-list-view");
@@ -2012,9 +2027,6 @@ gtd_task_list_view_set_show_completed (GtdTaskListView *view,
               if (!GTD_IS_TASK_ROW (l->data))
                 continue;
 
-              if (gtd_task_row_get_new_task_mode (l->data))
-                continue;
-
               task = gtd_task_row_get_task (l->data);
 
               /* Remove completed tasks, and also tasks with a completed parent */
diff --git a/src/gtd-task-row.c b/src/gtd-task-row.c
index 1b21cb1..ed299ea 100644
--- a/src/gtd-task-row.c
+++ b/src/gtd-task-row.c
@@ -30,12 +30,9 @@ struct _GtdTaskRow
 
   /*<private>*/
   GtkRevealer               *revealer;
-  GtkStack                  *stack;
 
   /* new task widgets */
   GtkStack                  *done_check;
-  GtkEntry                  *new_task_entry;
-  GtkStack                  *new_task_stack;
 
   /* task widgets */
   GtkEntry                  *title_entry;
@@ -55,7 +52,6 @@ struct _GtdTaskRow
   gboolean                   handle_subtasks : 1;
 
   /* data */
-  gboolean                   new_task_mode;
   GtdTask                   *task;
 
   gint                       destroy_row_timeout_id;
@@ -71,14 +67,12 @@ G_DEFINE_TYPE (GtdTaskRow, gtd_task_row, GTK_TYPE_LIST_BOX_ROW)
 enum {
   ENTER,
   EXIT,
-  CREATE_TASK,
   NUM_SIGNALS
 };
 
 enum {
   PROP_0,
   PROP_HANDLE_SUBTASKS,
-  PROP_NEW_TASK_MODE,
   PROP_TASK,
   LAST_PROP
 };
@@ -336,17 +330,6 @@ gtd_task_row__date_changed_binding (GBinding     *binding,
   return TRUE;
 }
 
-static GtdTask*
-gtd_task_row__create_task_for_name (const gchar *name)
-{
-  GtdTask *task = gtd_task_new (NULL);
-
-  gtd_task_set_title (task, name);
-  gtd_task_save (task);
-
-  return task;
-}
-
 static gboolean
 gtd_task_row__destroy_cb (GtkWidget *row)
 {
@@ -373,17 +356,7 @@ gtd_task_row__key_press_event (GtkWidget   *row,
       !(event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK))) // No modifiers together
     {
       self->active = FALSE;
-
-      if (self->new_task_mode)
-        {
-          gtk_stack_set_visible_child_name (self->new_task_stack, "label");
-          gtk_entry_set_text (self->new_task_entry, "");
-          return TRUE;
-        }
-      else
-        {
-          g_signal_emit (row, signals[EXIT], 0);
-        }
+      g_signal_emit (row, signals[EXIT], 0);
     }
 
   return FALSE;
@@ -399,31 +372,6 @@ gtd_task_row_focus_in_event (GtkWidget     *widget,
 }
 
 static void
-gtd_task_row__entry_activated (GtkEntry *entry,
-                               gpointer  user_data)
-{
-  GtdTaskRow *self = GTD_TASK_ROW (user_data);
-
-  g_return_if_fail (GTD_IS_TASK_ROW (user_data));
-  g_return_if_fail (GTK_IS_ENTRY (entry));
-
-  if (entry == self->new_task_entry)
-    {
-      GtdTask *new_task;
-
-      /* Cannot create empty tasks */
-      if (gtk_entry_get_text_length (self->new_task_entry) == 0)
-        return;
-
-      new_task = gtd_task_row__create_task_for_name (gtk_entry_get_text (self->new_task_entry));
-
-      g_signal_emit (user_data, signals[CREATE_TASK], 0, new_task);
-
-      gtk_entry_set_text (self->new_task_entry, "");
-    }
-}
-
-static void
 gtd_task_row_finalize (GObject *object)
 {
   GtdTaskRow *self = GTD_TASK_ROW (object);
@@ -474,10 +422,6 @@ gtd_task_row_get_property (GObject    *object,
       g_value_set_boolean (value, self->handle_subtasks);
       break;
 
-    case PROP_NEW_TASK_MODE:
-      g_value_set_boolean (value, self->new_task_mode);
-      break;
-
     case PROP_TASK:
       g_value_set_object (value, self->task);
       break;
@@ -501,10 +445,6 @@ gtd_task_row_set_property (GObject      *object,
       gtd_task_row_set_handle_subtasks (self, g_value_get_boolean (value));
       break;
 
-    case PROP_NEW_TASK_MODE:
-      gtd_task_row_set_new_task_mode (self, g_value_get_boolean (value));
-      break;
-
     case PROP_TASK:
       gtd_task_row_set_task (self, g_value_get_object (value));
       break;
@@ -543,20 +483,6 @@ gtd_task_row_class_init (GtdTaskRowClass *klass)
                                 G_PARAM_READWRITE));
 
   /**
-   * GtdTaskRow::new-task-mode:
-   *
-   * If the row is used to add new tasks.
-   */
-  g_object_class_install_property (
-          object_class,
-          PROP_NEW_TASK_MODE,
-          g_param_spec_boolean ("new-task-mode",
-                                "If the row is used to add a new task",
-                                "Whether the row is used to add a new task",
-                                FALSE,
-                                G_PARAM_READWRITE));
-
-  /**
    * GtdTaskRow::task:
    *
    * The task that this row represents, or %NULL.
@@ -600,31 +526,12 @@ gtd_task_row_class_init (GtdTaskRowClass *klass)
                                 G_TYPE_NONE,
                                 0);
 
-  /**
-   * GtdTaskRow::create-task:
-   *
-   * Emitted when the row wants the parent widget to create a new task.
-   */
-  signals[CREATE_TASK] = g_signal_new ("create-task",
-                                       GTD_TYPE_TASK_ROW,
-                                       G_SIGNAL_RUN_LAST,
-                                       0,
-                                       NULL,
-                                       NULL,
-                                       NULL,
-                                       G_TYPE_NONE,
-                                       1,
-                                       GTD_TYPE_TASK);
-
   gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/todo/ui/task-row.ui");
 
   gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, dnd_box);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, dnd_event_box);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, dnd_icon);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, done_check);
-  gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, stack);
-  gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, new_task_entry);
-  gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, new_task_stack);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, revealer);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, task_date_label);
   gtk_widget_class_bind_template_child (widget_class, GtdTaskRow, task_list_label);
@@ -637,7 +544,6 @@ gtd_task_row_class_init (GtdTaskRowClass *klass)
   gtk_widget_class_bind_template_callback (widget_class, drag_begin_cb);
   gtk_widget_class_bind_template_callback (widget_class, mouse_out_event);
   gtk_widget_class_bind_template_callback (widget_class, mouse_over_event);
-  gtk_widget_class_bind_template_callback (widget_class, gtd_task_row__entry_activated);
 
   gtk_widget_class_set_css_name (widget_class, "taskrow");
 }
@@ -658,54 +564,6 @@ gtd_task_row_init (GtdTaskRow *self)
 }
 
 /**
- * gtd_task_row_get_new_task_mode:
- * @row: a #GtdTaskRow
- *
- * Whether @row is in new task mode.
- *
- * Returns: %TRUE if @row is in new task mode, %FALSE otherwise
- */
-gboolean
-gtd_task_row_get_new_task_mode (GtdTaskRow *row)
-{
-  g_return_val_if_fail (GTD_IS_TASK_ROW (row), FALSE);
-
-  return row->new_task_mode;
-}
-
-/**
- * gtd_task_row_set_new_task_mode:
- * @row: a #GtdTaskRow
- * @new_task_mode: %TRUE to set new task mode, %FALSE otherwise
- *
- * Sets @row new task mode to @new_task_mode. It is up to the caller
- * to set GtdTaskRow::task to %NULL.
- */
-void
-gtd_task_row_set_new_task_mode (GtdTaskRow *row,
-                                gboolean    new_task_mode)
-{
-  g_return_if_fail (GTD_IS_TASK_ROW (row));
-
-  if (row->new_task_mode != new_task_mode)
-    {
-      row->new_task_mode = new_task_mode;
-
-      if (new_task_mode)
-        {
-          gtk_stack_set_visible_child_name (GTK_STACK (row->stack), "new");
-          gtd_task_row_reveal (row);
-        }
-      else
-        {
-          gtk_stack_set_visible_child_name (GTK_STACK (row->stack), "task");
-        }
-
-      g_object_notify (G_OBJECT (row), "new-task-mode");
-    }
-}
-
-/**
  * gtd_task_row_get_task:
  * @row: a #GtdTaskRow
  *
@@ -907,26 +765,13 @@ gtd_task_row_set_active (GtdTaskRow *self,
 
   if (active)
     {
-      if (self->new_task_mode)
-        {
-          gtk_stack_set_visible_child_name (self->new_task_stack, "entry");
-          gtk_widget_grab_focus (GTK_WIDGET (self->new_task_entry));
+      gtk_stack_set_visible_child_name (self->task_stack, "title");
+      gtk_widget_grab_focus (GTK_WIDGET (self->title_entry));
 
-          g_signal_emit (self, signals[EXIT], 0);
-        }
-      else
-        {
-          gtk_stack_set_visible_child_name (self->task_stack, "title");
-          gtk_widget_grab_focus (GTK_WIDGET (self->title_entry));
-
-          g_signal_emit (self, signals[ENTER], 0);
-        }
+      g_signal_emit (self, signals[ENTER], 0);
     }
   else
     {
-      if (self->new_task_mode)
-        gtk_stack_set_visible_child_name (self->new_task_stack, "label");
-      else
-        gtk_stack_set_visible_child_name (self->task_stack, "label");
+      gtk_stack_set_visible_child_name (self->task_stack, "label");
     }
 }
diff --git a/src/gtd-task-row.h b/src/gtd-task-row.h
index d934670..4437ae8 100644
--- a/src/gtd-task-row.h
+++ b/src/gtd-task-row.h
@@ -32,11 +32,6 @@ G_DECLARE_FINAL_TYPE (GtdTaskRow, gtd_task_row, GTD, TASK_ROW, GtkListBoxRow)
 
 GtkWidget*                gtd_task_row_new                      (GtdTask             *task);
 
-gboolean                  gtd_task_row_get_new_task_mode        (GtdTaskRow          *row);
-
-void                      gtd_task_row_set_new_task_mode        (GtdTaskRow          *row,
-                                                                 gboolean             new_task_mode);
-
 GtdTask*                  gtd_task_row_get_task                 (GtdTaskRow          *row);
 
 void                      gtd_task_row_set_task                 (GtdTaskRow          *row,


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