GTG

Merge lp:~parthpanchl/gtg/fix-calendar into lp:~gtg/gtg/old-trunk

Proposed by Parth Panchal
Status: Merged
Merged at revision: 1372
Proposed branch: lp:~parthpanchl/gtg/fix-calendar
Merge into: lp:~gtg/gtg/old-trunk
Diff against target: 467 lines (+181/-119)
8 files modified
CHANGELOG (+2/-0)
GTG/gtk/browser/browser.py (+49/-6)
GTG/gtk/browser/taskbrowser.ui (+20/-10)
GTG/gtk/editor/__init__.py (+1/-0)
GTG/gtk/editor/calendar.py (+10/-7)
GTG/gtk/editor/calendar.ui (+96/-0)
GTG/gtk/editor/editor.py (+3/-1)
GTG/gtk/editor/taskeditor.ui (+0/-95)
To merge this branch: bzr merge lp:~parthpanchl/gtg/fix-calendar
Reviewer Review Type Date Requested Status
Nimit Shah Pending
Review via email: mp+211215@code.launchpad.net

Commit message

Description of the change

Fixes Bug #931904 & Bug #1289284
- Adds "Pick a date" option to set start/due date in task browser's context menu to set date from calendar window
- Removes 'Now' option from 'Set due date' context menu in task browser
- Detaches calendar ui from taskeditor.ui
- Updates calendar ui to be consistent with parent window

To post a comment you must log in.
Revision history for this message
Nimit Shah (nimit-svnit) wrote :

Hi Parth,
The branch fixes the problems but I want you to modify the UI a bit. There should be a quicker way to set dates to popular choices like today,tomorrow,next week or next month.
For this, you can create sub menu where you can give option for this and for a specific one say "Pick a date..."

lp:~parthpanchl/gtg/fix-calendar updated
1366. By Parth Panchal

Updated UI of task browser's context menu

1367. By Parth Panchal

Resolves conflicts

Revision history for this message
Parth Panchal (parthpanchl) wrote :

Nimit,
I imagined the same UI that you're suggesting but then thought that the popular choices like today, tomorrow, next week or next month could be easily understood by the users from calendar. So to reduce the average clicks to change the start/due date, I chose that UI.

Now, I've pushed the desired changes.

lp:~parthpanchl/gtg/fix-calendar updated
1368. By Parth Panchal

Fixes calendar pop up bug

1369. By Parth Panchal

Removes 'Now' from 'Set due date' context menu in Task Browser

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'CHANGELOG'
--- CHANGELOG 2014-03-20 18:38:10 +0000
+++ CHANGELOG 2014-03-23 12:58:31 +0000
@@ -28,6 +28,8 @@
28 * Moving to Sphinx for documentation and improving the scripts, by Izidor Matušov28 * Moving to Sphinx for documentation and improving the scripts, by Izidor Matušov
29 * Fixing the error getting thrown on drag-drop of text in taskeditor, by Sagar Ghuge29 * Fixing the error getting thrown on drag-drop of text in taskeditor, by Sagar Ghuge
30 * Fixes #1 : Searching for something and then clicking on any place in the tag sidebar doesn't clear the quick-add bar text, by Parth Panchal30 * Fixes #1 : Searching for something and then clicking on any place in the tag sidebar doesn't clear the quick-add bar text, by Parth Panchal
31 * Fix for bug #931904 : Scheduling many task, by Parth Panchal
32 * Fix for bug #1289284 : Date gets dragged from calendar widget when its date is already set, by Parth Panchal
3133
322013-11-24 Getting Things GNOME! 0.3.1342013-11-24 Getting Things GNOME! 0.3.1
33 * Fix for bug #1024473: Have 'Show Main Window' in notification area, by Antonio Roquentin35 * Fix for bug #1024473: Have 'Show Main Window' in notification area, by Antonio Roquentin
3436
=== modified file 'GTG/gtk/browser/browser.py'
--- GTG/gtk/browser/browser.py 2014-03-20 18:38:10 +0000
+++ GTG/gtk/browser/browser.py 2014-03-23 12:58:31 +0000
@@ -39,6 +39,7 @@
39from GTG.gtk.browser.modifytags_dialog import ModifyTagsDialog39from GTG.gtk.browser.modifytags_dialog import ModifyTagsDialog
40from GTG.gtk.browser.tag_context_menu import TagContextMenu40from GTG.gtk.browser.tag_context_menu import TagContextMenu
41from GTG.gtk.browser.treeview_factory import TreeviewFactory41from GTG.gtk.browser.treeview_factory import TreeviewFactory
42from GTG.gtk.editor.calendar import GTGCalendar
42from GTG.tools.dates import Date43from GTG.tools.dates import Date
43from GTG.tools.logger import Log44from GTG.tools.logger import Log
4445
@@ -180,12 +181,15 @@
180181
181 def _init_ui_widget(self):182 def _init_ui_widget(self):
182 """ Sets the main pane with the tree with active tasks and183 """ Sets the main pane with the tree with active tasks and
183 create ModifyTagsDialog """184 create ModifyTagsDialog & Calendar """
184 # The Active tasks treeview185 # The Active tasks treeview
185 self.main_pane.add(self.vtree_panes['active'])186 self.main_pane.add(self.vtree_panes['active'])
186187
187 tag_completion = TagCompletion(self.req.get_tag_tree())188 tag_completion = TagCompletion(self.req.get_tag_tree())
188 self.modifytags_dialog = ModifyTagsDialog(tag_completion, self.req)189 self.modifytags_dialog = ModifyTagsDialog(tag_completion, self.req)
190 self.calendar = GTGCalendar()
191 self.calendar.set_transient_for(self.window)
192 self.calendar.connect("date-changed", self.on_date_changed)
189193
190 def init_tags_sidebar(self):194 def init_tags_sidebar(self):
191 """195 """
@@ -276,6 +280,8 @@
276 self.on_start_for_next_month,280 self.on_start_for_next_month,
277 "on_start_for_next_year":281 "on_start_for_next_year":
278 self.on_start_for_next_year,282 self.on_start_for_next_year,
283 "on_start_for_specific_date":
284 self.on_start_for_specific_date,
279 "on_start_clear":285 "on_start_clear":
280 self.on_start_clear,286 self.on_start_clear,
281 "on_set_due_today":287 "on_set_due_today":
@@ -288,12 +294,12 @@
288 self.on_set_due_next_month,294 self.on_set_due_next_month,
289 "on_set_due_next_year":295 "on_set_due_next_year":
290 self.on_set_due_next_year,296 self.on_set_due_next_year,
291 "on_set_due_now":
292 self.on_set_due_now,
293 "on_set_due_soon":297 "on_set_due_soon":
294 self.on_set_due_soon,298 self.on_set_due_soon,
295 "on_set_due_someday":299 "on_set_due_someday":
296 self.on_set_due_someday,300 self.on_set_due_someday,
301 "on_set_due_for_specific_date":
302 self.on_set_due_for_specific_date,
297 "on_set_due_clear":303 "on_set_due_clear":
298 self.on_set_due_clear,304 self.on_set_due_clear,
299 "on_dismiss_task":305 "on_dismiss_task":
@@ -1095,9 +1101,6 @@
1095 def on_set_due_next_year(self, widget):1101 def on_set_due_next_year(self, widget):
1096 self.update_due_date(widget, "next year")1102 self.update_due_date(widget, "next year")
10971103
1098 def on_set_due_now(self, widget):
1099 self.update_due_date(widget, "now")
1100
1101 def on_set_due_soon(self, widget):1104 def on_set_due_soon(self, widget):
1102 self.update_due_date(widget, "soon")1105 self.update_due_date(widget, "soon")
11031106
@@ -1107,6 +1110,46 @@
1107 def on_set_due_clear(self, widget):1110 def on_set_due_clear(self, widget):
1108 self.update_due_date(widget, None)1111 self.update_due_date(widget, None)
11091112
1113 def on_start_for_specific_date(self, widget):
1114 """ Display Calendar to set start date of selected tasks """
1115 self.calendar.set_title("Set Start Date")
1116 # Get task from task name
1117 task = self.req.get_task(self.get_selected_tasks()[0])
1118 date = task.get_start_date()
1119 self.calendar.set_date(date, GTGCalendar.DATE_KIND_START)
1120 # Shows the calendar just above the mouse on widget's line of symmetry
1121 rect = widget.get_allocation()
1122 result, x, y = widget.get_window().get_origin()
1123 self.calendar.show_at_position(x + rect.x + rect.width,
1124 y + rect.y)
1125
1126 def on_set_due_for_specific_date(self, widget):
1127 """ Display Calendar to set due date of selected tasks """
1128 self.calendar.set_title("Set Due Date")
1129 # Get task from task name
1130 task = self.req.get_task(self.get_selected_tasks()[0])
1131 if not task.get_due_date():
1132 date = task.get_start_date()
1133 else:
1134 date = task.get_due_date()
1135 self.calendar.set_date(date, GTGCalendar.DATE_KIND_DUE)
1136 # Shows the calendar just above the mouse on widget's line of symmetry
1137 rect = widget.get_allocation()
1138 result, x, y = widget.get_window().get_origin()
1139 self.calendar.show_at_position(x + rect.x + rect.width,
1140 y + rect.y)
1141
1142 def on_date_changed(self, calendar):
1143 # Get tasks' list from task names' list
1144 tasks = [self.req.get_task(task) for task in self.get_selected_tasks()]
1145 date, date_kind = calendar.get_selected_date()
1146 if date_kind == GTGCalendar.DATE_KIND_DUE:
1147 for task in tasks:
1148 task.set_due_date(date)
1149 elif date_kind == GTGCalendar.DATE_KIND_START:
1150 for task in tasks:
1151 task.set_start_date(date)
1152
1110 def on_modify_tags(self, widget):1153 def on_modify_tags(self, widget):
1111 """ Run Modify Tags dialog on selected tasks """1154 """ Run Modify Tags dialog on selected tasks """
1112 tasks = self.get_selected_tasks()1155 tasks = self.get_selected_tasks()
11131156
=== modified file 'GTG/gtk/browser/taskbrowser.ui'
--- GTG/gtk/browser/taskbrowser.ui 2013-11-25 02:37:46 +0000
+++ GTG/gtk/browser/taskbrowser.ui 2014-03-23 12:58:31 +0000
@@ -1059,6 +1059,16 @@
1059 </object>1059 </object>
1060 </child>1060 </child>
1061 <child>1061 <child>
1062 <object class="GtkImageMenuItem" id="tcm_start_for_specific_date">
1063 <property name="label" translatable="yes">Pick a date...</property>
1064 <property name="visible">True</property>
1065 <property name="can_focus">False</property>
1066 <property name="use_underline">True</property>
1067 <property name="use_stock">False</property>
1068 <signal name="activate" handler="on_start_for_specific_date" swapped="no"/>
1069 </object>
1070 </child>
1071 <child>
1062 <object class="GtkSeparatorMenuItem" id="menuitem1">1072 <object class="GtkSeparatorMenuItem" id="menuitem1">
1063 <property name="visible">True</property>1073 <property name="visible">True</property>
1064 <property name="can_focus">False</property>1074 <property name="can_focus">False</property>
@@ -1140,22 +1150,22 @@
1140 </object>1150 </object>
1141 </child>1151 </child>
1142 <child>1152 <child>
1153 <object class="GtkImageMenuItem" id="tcm_due_specific_date">
1154 <property name="label" translatable="yes">Pick a date...</property>
1155 <property name="visible">True</property>
1156 <property name="can_focus">False</property>
1157 <property name="use_underline">True</property>
1158 <property name="use_stock">False</property>
1159 <signal name="activate" handler="on_set_due_for_specific_date" swapped="no"/>
1160 </object>
1161 </child>
1162 <child>
1143 <object class="GtkSeparatorMenuItem" id="menuitem2">1163 <object class="GtkSeparatorMenuItem" id="menuitem2">
1144 <property name="visible">True</property>1164 <property name="visible">True</property>
1145 <property name="can_focus">False</property>1165 <property name="can_focus">False</property>
1146 </object>1166 </object>
1147 </child>1167 </child>
1148 <child>1168 <child>
1149 <object class="GtkImageMenuItem" id="tcm_due_now">
1150 <property name="label" translatable="yes">_Now</property>
1151 <property name="visible">True</property>
1152 <property name="can_focus">False</property>
1153 <property name="use_underline">True</property>
1154 <property name="use_stock">False</property>
1155 <signal name="activate" handler="on_set_due_now" swapped="no"/>
1156 </object>
1157 </child>
1158 <child>
1159 <object class="GtkImageMenuItem" id="tcm_due_soon">1169 <object class="GtkImageMenuItem" id="tcm_due_soon">
1160 <property name="label" translatable="yes">_Soon</property>1170 <property name="label" translatable="yes">_Soon</property>
1161 <property name="visible">True</property>1171 <property name="visible">True</property>
11621172
=== modified file 'GTG/gtk/editor/__init__.py'
--- GTG/gtk/editor/__init__.py 2013-11-25 02:37:46 +0000
+++ GTG/gtk/editor/__init__.py 2014-03-23 12:58:31 +0000
@@ -27,6 +27,7 @@
27class GnomeConfig:27class GnomeConfig:
28 current_rep = os.path.dirname(os.path.abspath(__file__))28 current_rep = os.path.dirname(os.path.abspath(__file__))
29 EDITOR_UI_FILE = os.path.join(current_rep, "taskeditor.ui")29 EDITOR_UI_FILE = os.path.join(current_rep, "taskeditor.ui")
30 CALENDAR_UI_FILE = os.path.join(current_rep, "calendar.ui")
3031
31 MARK_DONE = _("Mark as Done")32 MARK_DONE = _("Mark as Done")
32 MARK_UNDONE = _("Mark as not Done")33 MARK_UNDONE = _("Mark as not Done")
3334
=== modified file 'GTG/gtk/editor/calendar.py'
--- GTG/gtk/editor/calendar.py 2014-03-09 12:59:59 +0000
+++ GTG/gtk/editor/calendar.py 2014-03-23 12:58:31 +0000
@@ -19,8 +19,9 @@
1919
20import datetime20import datetime
2121
22from gi.repository import GObject, Gdk22from gi.repository import GObject, Gdk, Gtk
2323
24from GTG.gtk.editor import GnomeConfig
24from GTG.tools.dates import Date25from GTG.tools.dates import Date
2526
2627
@@ -39,9 +40,10 @@
3940
40 __gsignals__ = {'date-changed': __signal_type__, }41 __gsignals__ = {'date-changed': __signal_type__, }
4142
42 def __init__(self, Gtk_builder):43 def __init__(self):
43 super(GTGCalendar, self).__init__()44 super(GTGCalendar, self).__init__()
44 self.__builder = Gtk_builder45 self.__builder = Gtk.Builder()
46 self.__builder.add_from_file(GnomeConfig.CALENDAR_UI_FILE)
45 self.__date_kind = None47 self.__date_kind = None
46 self.__date = Date.no_date()48 self.__date = Date.no_date()
47 self.__init_gtk__()49 self.__init_gtk__()
@@ -117,9 +119,6 @@
117 width, height = self.__window.get_size()119 width, height = self.__window.get_size()
118 self.move_calendar_inside(width, height, x, y)120 self.move_calendar_inside(width, height, x, y)
119 self.__window.show()121 self.__window.show()
120 # some window managers ignore move before you show a window. (which
121 # ones? question by invernizzi)
122 self.move_calendar_inside(width, height, x, y)
123 self.__window.grab_add()122 self.__window.grab_add()
124123
125 #We grab the pointer in the calendar124 #We grab the pointer in the calendar
@@ -140,7 +139,10 @@
140 0,139 0,
141 )140 )
142141
143 self.__window.connect('button-press-event', self.__focus_out)142 if self.get_decorated():
143 self.__window.connect("delete-event", self.close_calendar)
144 else:
145 self.__window.connect('button-press-event', self.__focus_out)
144 self.__sigid = self.__calendar.connect("day-selected",146 self.__sigid = self.__calendar.connect("day-selected",
145 self.__day_selected,147 self.__day_selected,
146 "RealDate",)148 "RealDate",)
@@ -172,6 +174,7 @@
172 if self.__sigid_month is not None:174 if self.__sigid_month is not None:
173 self.__calendar.disconnect(self.__sigid_month)175 self.__calendar.disconnect(self.__sigid_month)
174 self.__sigid_month = None176 self.__sigid_month = None
177 return True
175178
176 def __day_selected(self, widget, date_type):179 def __day_selected(self, widget, date_type):
177 if date_type == "RealDate":180 if date_type == "RealDate":
178181
=== added file 'GTG/gtk/editor/calendar.ui'
--- GTG/gtk/editor/calendar.ui 1970-01-01 00:00:00 +0000
+++ GTG/gtk/editor/calendar.ui 2014-03-23 12:58:31 +0000
@@ -0,0 +1,96 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<interface>
3 <!-- interface-requires gtk+ 3.0 -->
4 <object class="GtkWindow" id="calendar">
5 <property name="can_focus">False</property>
6 <property name="events">GDK_STRUCTURE_MASK | GDK_PROXIMITY_OUT_MASK</property>
7 <property name="resizable">False</property>
8 <property name="modal">True</property>
9 <property name="destroy_with_parent">True</property>
10 <property name="skip_taskbar_hint">True</property>
11 <property name="skip_pager_hint">True</property>
12 <child>
13 <object class="GtkBox" id="vbox5">
14 <property name="visible">True</property>
15 <property name="can_focus">False</property>
16 <property name="orientation">vertical</property>
17 <child>
18 <object class="GtkCalendar" id="calendar1">
19 <property name="visible">True</property>
20 <property name="can_focus">True</property>
21 </object>
22 <packing>
23 <property name="expand">False</property>
24 <property name="fill">True</property>
25 <property name="position">0</property>
26 </packing>
27 </child>
28 <child>
29 <object class="GtkBox" id="fuzzydate_btns">
30 <property name="visible">True</property>
31 <property name="can_focus">False</property>
32 <property name="homogeneous">True</property>
33 <child>
34 <object class="GtkButton" id="button_now">
35 <property name="label" translatable="yes">Now</property>
36 <property name="visible">True</property>
37 <property name="can_focus">True</property>
38 <property name="receives_default">True</property>
39 </object>
40 <packing>
41 <property name="expand">False</property>
42 <property name="fill">True</property>
43 <property name="position">0</property>
44 </packing>
45 </child>
46 <child>
47 <object class="GtkButton" id="button_soon">
48 <property name="label" translatable="yes">Soon</property>
49 <property name="visible">True</property>
50 <property name="can_focus">True</property>
51 <property name="receives_default">True</property>
52 </object>
53 <packing>
54 <property name="expand">False</property>
55 <property name="fill">True</property>
56 <property name="position">1</property>
57 </packing>
58 </child>
59 <child>
60 <object class="GtkButton" id="button_someday">
61 <property name="label" translatable="yes">Someday</property>
62 <property name="visible">True</property>
63 <property name="can_focus">True</property>
64 <property name="receives_default">True</property>
65 </object>
66 <packing>
67 <property name="expand">False</property>
68 <property name="fill">True</property>
69 <property name="position">2</property>
70 </packing>
71 </child>
72 </object>
73 <packing>
74 <property name="expand">False</property>
75 <property name="fill">True</property>
76 <property name="position">1</property>
77 </packing>
78 </child>
79 <child>
80 <object class="GtkButton" id="button_clear">
81 <property name="label">gtk-clear</property>
82 <property name="visible">True</property>
83 <property name="can_focus">True</property>
84 <property name="receives_default">True</property>
85 <property name="use_stock">True</property>
86 </object>
87 <packing>
88 <property name="expand">False</property>
89 <property name="fill">False</property>
90 <property name="position">2</property>
91 </packing>
92 </child>
93 </object>
94 </child>
95 </object>
96</interface>
0\ No newline at end of file97\ No newline at end of file
198
=== modified file 'GTG/gtk/editor/editor.py'
--- GTG/gtk/editor/editor.py 2014-03-11 01:37:13 +0000
+++ GTG/gtk/editor/editor.py 2014-03-23 12:58:31 +0000
@@ -119,7 +119,9 @@
119 if conf_font_value != "":119 if conf_font_value != "":
120 self.textview.override_font(Pango.FontDescription(conf_font_value))120 self.textview.override_font(Pango.FontDescription(conf_font_value))
121 # Voila! it's done121 # Voila! it's done
122 self.calendar = GTGCalendar(self.builder)122 self.calendar = GTGCalendar()
123 self.calendar.set_transient_for(self.window)
124 self.calendar.set_decorated(False)
123 self.duedate_widget = self.builder.get_object("duedate_entry")125 self.duedate_widget = self.builder.get_object("duedate_entry")
124 self.startdate_widget = self.builder.get_object("startdate_entry")126 self.startdate_widget = self.builder.get_object("startdate_entry")
125 self.closeddate_widget = self.builder.get_object("closeddate_entry")127 self.closeddate_widget = self.builder.get_object("closeddate_entry")
126128
=== modified file 'GTG/gtk/editor/taskeditor.ui'
--- GTG/gtk/editor/taskeditor.ui 2014-03-05 19:25:18 +0000
+++ GTG/gtk/editor/taskeditor.ui 2014-03-23 12:58:31 +0000
@@ -403,99 +403,4 @@
403 </object>403 </object>
404 </child>404 </child>
405 </object>405 </object>
406 <object class="GtkWindow" id="calendar">
407 <property name="can_focus">False</property>
408 <property name="events">GDK_STRUCTURE_MASK | GDK_PROXIMITY_OUT_MASK</property>
409 <property name="type">popup</property>
410 <property name="resizable">False</property>
411 <property name="modal">True</property>
412 <property name="destroy_with_parent">True</property>
413 <property name="type_hint">dropdown-menu</property>
414 <property name="skip_taskbar_hint">True</property>
415 <property name="skip_pager_hint">True</property>
416 <property name="transient_for">TaskEditor</property>
417 <child>
418 <object class="GtkBox" id="vbox5">
419 <property name="visible">True</property>
420 <property name="can_focus">False</property>
421 <property name="orientation">vertical</property>
422 <child>
423 <object class="GtkCalendar" id="calendar1">
424 <property name="visible">True</property>
425 <property name="can_focus">True</property>
426 </object>
427 <packing>
428 <property name="expand">False</property>
429 <property name="fill">True</property>
430 <property name="position">0</property>
431 </packing>
432 </child>
433 <child>
434 <object class="GtkBox" id="fuzzydate_btns">
435 <property name="visible">True</property>
436 <property name="can_focus">False</property>
437 <property name="homogeneous">True</property>
438 <child>
439 <object class="GtkButton" id="button_now">
440 <property name="label" translatable="yes">Now</property>
441 <property name="visible">True</property>
442 <property name="can_focus">True</property>
443 <property name="receives_default">True</property>
444 </object>
445 <packing>
446 <property name="expand">False</property>
447 <property name="fill">True</property>
448 <property name="position">0</property>
449 </packing>
450 </child>
451 <child>
452 <object class="GtkButton" id="button_soon">
453 <property name="label" translatable="yes">Soon</property>
454 <property name="visible">True</property>
455 <property name="can_focus">True</property>
456 <property name="receives_default">True</property>
457 </object>
458 <packing>
459 <property name="expand">False</property>
460 <property name="fill">True</property>
461 <property name="position">1</property>
462 </packing>
463 </child>
464 <child>
465 <object class="GtkButton" id="button_someday">
466 <property name="label" translatable="yes">Someday</property>
467 <property name="visible">True</property>
468 <property name="can_focus">True</property>
469 <property name="receives_default">True</property>
470 </object>
471 <packing>
472 <property name="expand">False</property>
473 <property name="fill">True</property>
474 <property name="position">2</property>
475 </packing>
476 </child>
477 </object>
478 <packing>
479 <property name="expand">False</property>
480 <property name="fill">True</property>
481 <property name="position">1</property>
482 </packing>
483 </child>
484 <child>
485 <object class="GtkButton" id="button_clear">
486 <property name="label">gtk-clear</property>
487 <property name="visible">True</property>
488 <property name="can_focus">True</property>
489 <property name="receives_default">True</property>
490 <property name="use_stock">True</property>
491 </object>
492 <packing>
493 <property name="expand">False</property>
494 <property name="fill">False</property>
495 <property name="position">2</property>
496 </packing>
497 </child>
498 </object>
499 </child>
500 </object>
501</interface>406</interface>

Subscribers

People subscribed via source and target branches

to status/vote changes: