Parth Panchal has proposed merging lp:~parthpanchl/gtg/fix-931904 into lp:gtg.
Commit message: Fixes Bug #931904 Requested reviews: Gtg developers (gtg) Related bugs: Bug #931904 in Getting Things GNOME!: "Scheduling many task" https://bugs.launchpad.net/gtg/+bug/931904 For more details, see: https://code.launchpad.net/~parthpanchl/gtg/fix-931904/+merge/209907 Fixes Bug #316922 - Replaces the tasks' context menu entry to directly open calendar widget to set date for multiple tasks, reducing no. of clicks - Detaches the calender ui from task editor ui so that opening calendar widget doesn't need to load whole task editor ui -- https://code.launchpad.net/~parthpanchl/gtg/fix-931904/+merge/209907 Your team Gtg developers is requested to review the proposed merge of lp:~parthpanchl/gtg/fix-931904 into lp:gtg.
=== modified file 'AUTHORS' --- AUTHORS 2014-03-01 21:15:24 +0000 +++ AUTHORS 2014-03-07 12:28:35 +0000 @@ -132,4 +132,5 @@ * Sagar Ghuge <[email protected]> * Sushant Raikar <[email protected]> * Atit Anand <[email protected]> -* Sara Ribeiro <[email protected]> +* Parth P. Panchal <[email protected]> +* Sara Ribeiro <[email protected]> \ No newline at end of file === modified file 'CHANGELOG' --- CHANGELOG 2014-03-01 21:15:24 +0000 +++ CHANGELOG 2014-03-07 12:28:35 +0000 @@ -18,6 +18,7 @@ * Fix for bug #1286491 : RTM sync backend fails to load, by Pawan Hegde * Fix for bug #1286493 : GTG cannot connect to RTM, by Pawan Hegde * Fix for bug #1288011 : More intuitive title label for tasks, by Sara Ribeiro + * Fix for bug #931904 : Scheduling many task, by Parth Panchal 2013-11-24 Getting Things GNOME! 0.3.1 * Fix for bug #1024473: Have 'Show Main Window' in notification area, by Antonio Roquentin === modified file 'GTG/gtk/browser/browser.py' --- GTG/gtk/browser/browser.py 2014-02-17 12:55:55 +0000 +++ GTG/gtk/browser/browser.py 2014-03-07 12:28:35 +0000 @@ -39,6 +39,7 @@ from GTG.gtk.browser.modifytags_dialog import ModifyTagsDialog from GTG.gtk.browser.tag_context_menu import TagContextMenu from GTG.gtk.browser.treeview_factory import TreeviewFactory +from GTG.gtk.editor.calendar import GTGCalendar from GTG.tools.dates import Date from GTG.tools.logger import Log @@ -180,12 +181,14 @@ def _init_ui_widget(self): """ Sets the main pane with the tree with active tasks and - create ModifyTagsDialog """ + create ModifyTagsDialog & Calendar""" # The Active tasks treeview self.main_pane.add(self.vtree_panes['active']) tag_completion = TagCompletion(self.req.get_tag_tree()) self.modifytags_dialog = ModifyTagsDialog(tag_completion, self.req) + self.calendar = GTGCalendar() + self.calendar.connect("date-changed", self.on_date_changed) def init_tags_sidebar(self): """ @@ -268,34 +271,10 @@ self.on_mark_as_done, "on_mark_as_started": self.on_mark_as_started, - "on_start_for_tomorrow": - self.on_start_for_tomorrow, - "on_start_for_next_week": - self.on_start_for_next_week, - "on_start_for_next_month": - self.on_start_for_next_month, - "on_start_for_next_year": - self.on_start_for_next_year, - "on_start_clear": - self.on_start_clear, - "on_set_due_today": - self.on_set_due_today, - "on_set_due_tomorrow": - self.on_set_due_tomorrow, - "on_set_due_next_week": - self.on_set_due_next_week, - "on_set_due_next_month": - self.on_set_due_next_month, - "on_set_due_next_year": - self.on_set_due_next_year, - "on_set_due_now": - self.on_set_due_now, - "on_set_due_soon": - self.on_set_due_soon, - "on_set_due_someday": - self.on_set_due_someday, - "on_set_due_clear": - self.on_set_due_clear, + "on_start_for_specific_date": + self.on_start_for_specific_date, + "on_set_due_for_specific_date": + self.on_set_due_for_specific_date, "on_dismiss_task": self.on_dismiss_task, "on_move": @@ -1053,20 +1032,47 @@ def on_mark_as_started(self, widget): self.update_start_date(widget, "today") - def on_start_for_tomorrow(self, widget): - self.update_start_date(widget, "tomorrow") - - def on_start_for_next_week(self, widget): - self.update_start_date(widget, "next week") - - def on_start_for_next_month(self, widget): - self.update_start_date(widget, "next month") - - def on_start_for_next_year(self, widget): - self.update_start_date(widget, "next year") - - def on_start_clear(self, widget): - self.update_start_date(widget, None) + def on_start_for_specific_date(self, widget): + """ Run Calendar dialog for selected tasks """ + # Disable widget as drag source + widget.drag_source_unset() + # Get task from task name + task = self.req.get_task(self.get_selected_tasks()[0]) + date = task.get_start_date() + self.calendar.set_date(date, GTGCalendar.DATE_KIND_START) + # Shows the calendar just above the mouse on widget's line of symmetry + rect = widget.get_allocation() + result, x, y = widget.get_window().get_origin() + self.calendar.show_at_position(x + rect.x + rect.width, + y + rect.y) + + def on_set_due_for_specific_date(self, widget): + """ Run Calendar dialog for selected tasks """ + # Disable widget as drag source + widget.drag_source_unset() + # Get task from task name + task = self.req.get_task(self.get_selected_tasks()[0]) + if not task.get_due_date(): + date = task.get_start_date() + else: + date = task.get_due_date() + self.calendar.set_date(date, GTGCalendar.DATE_KIND_DUE) + # Shows the calendar just above the mouse on widget's line of symmetry + rect = widget.get_allocation() + result, x, y = widget.get_window().get_origin() + self.calendar.show_at_position(x + rect.x + rect.width, + y + rect.y) + + def on_date_changed(self, calendar): + # Get tasks' list from task names' list + tasks = [self.req.get_task(task) for task in self.get_selected_tasks()] + date, date_kind = calendar.get_selected_date() + if date_kind == GTGCalendar.DATE_KIND_DUE: + for task in tasks: + task.set_due_date(date) + elif date_kind == GTGCalendar.DATE_KIND_START: + for task in tasks: + task.set_start_date(date) def update_due_date(self, widget, new_due_date): tasks = [self.req.get_task(uid) @@ -1079,33 +1085,6 @@ for task in tasks: task.set_due_date(due_date) - def on_set_due_today(self, widget): - self.update_due_date(widget, "today") - - def on_set_due_tomorrow(self, widget): - self.update_due_date(widget, "tomorrow") - - def on_set_due_next_week(self, widget): - self.update_due_date(widget, "next week") - - def on_set_due_next_month(self, widget): - self.update_due_date(widget, "next month") - - def on_set_due_next_year(self, widget): - self.update_due_date(widget, "next year") - - def on_set_due_now(self, widget): - self.update_due_date(widget, "now") - - def on_set_due_soon(self, widget): - self.update_due_date(widget, "soon") - - def on_set_due_someday(self, widget): - self.update_due_date(widget, "someday") - - def on_set_due_clear(self, widget): - self.update_due_date(widget, None) - def on_modify_tags(self, widget): """ Run Modify Tags dialog on selected tasks """ tasks = self.get_selected_tasks() === 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-07 12:28:35 +0000 @@ -998,201 +998,23 @@ </object> </child> <child> - <object class="GtkImageMenuItem" id="tcm_start_menu"> - <property name="label" translatable="yes">_Set Start Date</property> + <object class="GtkImageMenuItem" id="tcm_start_for_specific_date"> + <property name="label" translatable="yes">Set Start Date...</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="use_stock">False</property> - <child type="submenu"> - <object class="GtkMenu" id="start_for_context_menu"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkImageMenuItem" id="tcm_mark_as_started"> - <property name="label" translatable="yes">T_oday</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_mark_as_started" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_start_for_tomorrow"> - <property name="label" translatable="yes">_Tomorrow</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_start_for_tomorrow" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_start_for_next_week"> - <property name="label" translatable="yes">Next _Week</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_start_for_next_week" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_start_for_next_month"> - <property name="label" translatable="yes">Next _Month</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_start_for_next_month" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_start_for_next_year"> - <property name="label" translatable="yes">Next _Year</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_start_for_next_year" swapped="no"/> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="menuitem1"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_start_clear"> - <property name="label" translatable="yes">_Clear Start Date</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_start_clear" swapped="no"/> - </object> - </child> - </object> - </child> + <signal name="activate" handler="on_start_for_specific_date" swapped="no"/> </object> </child> <child> - <object class="GtkImageMenuItem" id="tcm_due_menu"> - <property name="label" translatable="yes">Set Due Date</property> + <object class="GtkImageMenuItem" id="tcm_due_specific_date"> + <property name="label" translatable="yes">Set Due Date...</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_underline">True</property> <property name="use_stock">False</property> - <child type="submenu"> - <object class="GtkMenu" id="due_context_menu"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <child> - <object class="GtkImageMenuItem" id="tcm_due_today"> - <property name="label" translatable="yes">T_oday</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_today" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_tomorrow"> - <property name="label" translatable="yes">_Tomorrow</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_tomorrow" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_next_week"> - <property name="label" translatable="yes">Next _Week</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_next_week" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_next_month"> - <property name="label" translatable="yes">Next _Month</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_next_month" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_next_year"> - <property name="label" translatable="yes">Next _Year</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_next_year" swapped="no"/> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="menuitem2"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_now"> - <property name="label" translatable="yes">_Now</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_now" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_soon"> - <property name="label" translatable="yes">_Soon</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_soon" swapped="no"/> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_someday"> - <property name="label" translatable="yes">_Someday</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_someday" swapped="no"/> - </object> - </child> - <child> - <object class="GtkSeparatorMenuItem" id="menuitem3"> - <property name="visible">True</property> - <property name="can_focus">False</property> - </object> - </child> - <child> - <object class="GtkImageMenuItem" id="tcm_due_clear"> - <property name="label" translatable="yes">_Clear Due Date</property> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="use_underline">True</property> - <property name="use_stock">False</property> - <signal name="activate" handler="on_set_due_clear" swapped="no"/> - </object> - </child> - </object> - </child> + <signal name="activate" handler="on_set_due_for_specific_date" swapped="no"/> </object> </child> <child> === 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-07 12:28:35 +0000 @@ -27,6 +27,7 @@ class GnomeConfig: current_rep = os.path.dirname(os.path.abspath(__file__)) EDITOR_UI_FILE = os.path.join(current_rep, "taskeditor.ui") + CALENDAR_UI_FILE = os.path.join(current_rep, "calendar.ui") MARK_DONE = _("Mark as Done") MARK_UNDONE = _("Mark as not Done") === modified file 'GTG/gtk/editor/calendar.py' --- GTG/gtk/editor/calendar.py 2014-02-21 10:03:07 +0000 +++ GTG/gtk/editor/calendar.py 2014-03-07 12:28:35 +0000 @@ -19,8 +19,9 @@ import datetime -from gi.repository import GObject, Gdk +from gi.repository import GObject, Gdk, Gtk +from GTG.gtk.editor import GnomeConfig from GTG.tools.dates import Date @@ -39,9 +40,10 @@ __gsignals__ = {'date-changed': __signal_type__, } - def __init__(self, Gtk_builder): + def __init__(self): super(GTGCalendar, self).__init__() - self.__builder = Gtk_builder + self.__builder = Gtk.Builder() + self.__builder.add_from_file(GnomeConfig.CALENDAR_UI_FILE) self.__date_kind = None self.__date = Date.no_date() self.__init_gtk__() === 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-07 12:28:35 +0000 @@ -0,0 +1,99 @@ +<?xml version="1.0" encoding="UTF-8"?> +<interface> + <!-- interface-requires gtk+ 3.0 --> + <object class="GtkWindow" id="calendar"> + <property name="can_focus">False</property> + <property name="events">GDK_STRUCTURE_MASK | GDK_PROXIMITY_OUT_MASK</property> + <property name="type">popup</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="destroy_with_parent">True</property> + <property name="type_hint">dropdown-menu</property> + <property name="skip_taskbar_hint">True</property> + <property name="skip_pager_hint">True</property> + <property name="transient_for">TaskEditor</property> + <child> + <object class="GtkBox" id="vbox5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkCalendar" id="calendar1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="fuzzydate_btns"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkButton" id="button_now"> + <property name="label" translatable="yes">Now</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_soon"> + <property name="label" translatable="yes">Soon</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_someday"> + <property name="label" translatable="yes">Someday</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="button_clear"> + <property name="label">gtk-clear</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> +</interface> \ No newline at end of file === modified file 'GTG/gtk/editor/editor.py' --- GTG/gtk/editor/editor.py 2013-11-25 02:37:46 +0000 +++ GTG/gtk/editor/editor.py 2014-03-07 12:28:35 +0000 @@ -116,7 +116,7 @@ if conf_font_value != "": self.textview.override_font(Pango.FontDescription(conf_font_value)) # Voila! it's done - self.calendar = GTGCalendar(self.builder) + self.calendar = GTGCalendar() self.duedate_widget = self.builder.get_object("duedate_entry") self.startdate_widget = self.builder.get_object("startdate_entry") self.closeddate_widget = self.builder.get_object("closeddate_entry") === modified file 'GTG/gtk/editor/taskeditor.ui' --- GTG/gtk/editor/taskeditor.ui 2014-02-18 21:25:17 +0000 +++ GTG/gtk/editor/taskeditor.ui 2014-03-07 12:28:35 +0000 @@ -373,99 +373,4 @@ </object> </child> </object> - <object class="GtkWindow" id="calendar"> - <property name="can_focus">False</property> - <property name="events">GDK_STRUCTURE_MASK | GDK_PROXIMITY_OUT_MASK</property> - <property name="type">popup</property> - <property name="resizable">False</property> - <property name="modal">True</property> - <property name="destroy_with_parent">True</property> - <property name="type_hint">dropdown-menu</property> - <property name="skip_taskbar_hint">True</property> - <property name="skip_pager_hint">True</property> - <property name="transient_for">TaskEditor</property> - <child> - <object class="GtkBox" id="vbox5"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="orientation">vertical</property> - <child> - <object class="GtkCalendar" id="calendar1"> - <property name="visible">True</property> - <property name="can_focus">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkBox" id="fuzzydate_btns"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="homogeneous">True</property> - <child> - <object class="GtkButton" id="button_now"> - <property name="label" translatable="yes">Now</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button_soon"> - <property name="label" translatable="yes">Soon</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button_someday"> - <property name="label" translatable="yes">Someday</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">2</property> - </packing> - </child> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> - </packing> - </child> - <child> - <object class="GtkButton" id="button_clear"> - <property name="label">gtk-clear</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="receives_default">True</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> - </child> - </object> - </child> - </object> </interface>
_______________________________________________ Mailing list: https://launchpad.net/~gtg Post to : [email protected] Unsubscribe : https://launchpad.net/~gtg More help : https://help.launchpad.net/ListHelp

