From e56f8fdf233a25c0749425dbf908efcf2efbabad Mon Sep 17 00:00:00 2001 From: Diego Garcia Gangl Date: Mon, 22 Apr 2024 19:03:31 -0300 Subject: [PATCH] Run pre commit hook This mostly removes trailing whitespace --- .github/workflows/weekly_flatpak.yml | 1 - GTG/backends/unmaintained/README.txt | 3 +- GTG/core/datastore.py | 20 ++--- GTG/core/filters.py | 18 ++-- GTG/core/firstrun_tasks.py | 2 +- GTG/core/plugins/api.py | 4 +- GTG/core/saved_searches.py | 2 +- GTG/core/sorters.py | 19 ++-- GTG/core/tags.py | 10 +-- GTG/core/tasks.py | 58 ++++++------ GTG/gtk/application.py | 12 +-- GTG/gtk/browser/adaptive_button.py | 1 - GTG/gtk/browser/delete_task.py | 2 +- GTG/gtk/browser/main_window.py | 60 ++++++------- GTG/gtk/browser/quick_add.py | 1 - GTG/gtk/browser/sidebar.py | 60 ++++++------- GTG/gtk/browser/sidebar_context_menu.py | 8 +- GTG/gtk/browser/tag_editor.py | 4 +- GTG/gtk/browser/tag_pill.py | 14 +-- GTG/gtk/browser/task_pane.py | 88 +++++++++---------- GTG/gtk/data/main_window.ui | 2 +- GTG/gtk/data/style.css | 14 +-- GTG/gtk/editor/editor.py | 16 ++-- GTG/gtk/editor/taskview.py | 2 +- GTG/gtk/errorhandler.py | 1 - GTG/gtk/general_preferences.py | 2 +- GTG/gtk/tag_completion.py | 2 +- .../export_templates/template_pocketmod.tex | 2 +- .../export_templates/template_sexy.html | 13 ++- .../export_templates/template_simple.html | 19 ++-- GTG/plugins/unmaintained/README.txt | 3 +- .../geolocalized_tasks/geolocalized.ui | 2 +- .../icons/hicolor/svg/assign-location.svg | 2 +- .../icons/hicolor/svg/geolocalization.svg | 2 +- .../notification_area/notification_area.ui | 2 +- NEWS | 40 ++++----- build-aux/requirements.txt | 2 +- .../bryce/xdg/data/gtg/gtg_tasks.xml | 1 - .../screenshots/xdg/config/gtg/gtg.conf | 5 +- .../screenshots/xdg/config/gtg/tasks.conf | 1 - .../screenshots/xdg/data/gtg/gtg_tasks.xml | 16 ++-- docs/contributors/DBus API v1.md | 10 +-- docs/contributors/DBus API v2.md | 10 +-- .../bug reporting and triaging.md | 12 +-- docs/contributors/coding best practices.md | 2 +- .../contributing to the user manual.md | 24 ++--- docs/contributors/file format.md | 2 - docs/contributors/plugin development guide.md | 10 +-- docs/user_manual/C/gtg-add-sync.page | 7 +- docs/user_manual/C/gtg-add-tag.page | 8 +- docs/user_manual/C/gtg-caldav.page | 8 +- .../C/gtg-complete-delete-dismiss-task.page | 24 ++--- docs/user_manual/C/gtg-create-new-task.page | 5 +- docs/user_manual/C/gtg-create-plugin.page | 3 +- docs/user_manual/C/gtg-create-sync.page | 7 +- .../C/gtg-developer-resources.page | 3 +- docs/user_manual/C/gtg-edit-task.page | 4 +- docs/user_manual/C/gtg-faq.page | 13 ++- docs/user_manual/C/gtg-main-window.page | 7 +- docs/user_manual/C/gtg-plugins.page | 3 +- docs/user_manual/C/gtg-preferences.page | 11 ++- docs/user_manual/C/gtg-quickadd.page | 10 +-- docs/user_manual/C/gtg-recurring-task.page | 4 +- docs/user_manual/C/gtg-search-intro.page | 2 +- docs/user_manual/C/gtg-set-task-date.page | 2 +- docs/user_manual/C/gtg-shortcut-keys.page | 4 +- docs/user_manual/C/gtg-subtasks.page | 20 ++--- docs/user_manual/C/gtg-sync.page | 9 +- docs/user_manual/C/gtg-tag-color.page | 10 +-- docs/user_manual/C/gtg-tags.page | 6 +- docs/user_manual/C/gtg-taskview.page | 12 +-- docs/user_manual/C/index.page | 2 +- docs/user_manual/meson.build | 1 - launch.sh | 2 +- snap/snapcraft.yaml | 4 +- tests/conftest.py | 1 - tests/core/test_saved_search.py | 1 - tests/core/test_task.py | 2 - 78 files changed, 386 insertions(+), 415 deletions(-) diff --git a/.github/workflows/weekly_flatpak.yml b/.github/workflows/weekly_flatpak.yml index 396ea269aa..5f7444de6a 100644 --- a/.github/workflows/weekly_flatpak.yml +++ b/.github/workflows/weekly_flatpak.yml @@ -19,4 +19,3 @@ jobs: bundle: org.gnome.GTG.Devel.flatpak manifest-path: build-aux/org.gnome.GTG.Devel.json cache-key: flatpak-builder-${{ github.sha }} - diff --git a/GTG/backends/unmaintained/README.txt b/GTG/backends/unmaintained/README.txt index d7b2941736..cb8cb0ea73 100644 --- a/GTG/backends/unmaintained/README.txt +++ b/GTG/backends/unmaintained/README.txt @@ -5,7 +5,7 @@ and support them. If you are interested in taking over one of these, let us know in the bug tracker! ---- +--- Evolution synchronization service has dependencies: * python3-evolution @@ -27,4 +27,3 @@ version of Tweety library. Remember the Milk synchronization service is shipped with a library for RTM api. It has an external dependency: * python3-dateutil - diff --git a/GTG/core/datastore.py b/GTG/core/datastore.py index c4f533e36c..eb02863b82 100644 --- a/GTG/core/datastore.py +++ b/GTG/core/datastore.py @@ -236,13 +236,13 @@ def count_tasks(count: dict, tasklist: list): 'closed': {'all': 0, 'untagged': 0}, } - count_tasks(self.task_count['open'], + count_tasks(self.task_count['open'], self.tasks.filter(Filter.ACTIVE)) - count_tasks(self.task_count['closed'], + count_tasks(self.task_count['closed'], self.tasks.filter(Filter.CLOSED)) - count_tasks(self.task_count['actionable'], + count_tasks(self.task_count['actionable'], self.tasks.filter(Filter.ACTIONABLE)) @@ -259,7 +259,7 @@ def refresh_tag_stats(self) -> None: def notify_tag_change(self, tag) -> None: """Notify tasks that this tag has changed.""" - + for task in self.tasks.lookup.values(): if tag in task.tags: task.notify('icons') @@ -280,14 +280,14 @@ def do_first_run_versioning(self, filepath: str) -> None: """If there is an old file around needing versioning, convert it, then rename the old file.""" old_path = self.find_old_path(DATA_DIR) - + if old_path is not None: log.warning('Found old file: %r. Running versioning code.', old_path) tree = versioning.convert(old_path, self) self.load_data(tree) self.save(filepath) os.rename(old_path, old_path + '.imported') - + else: self.first_run(self.data_path) @@ -297,13 +297,13 @@ def find_old_path(self, datadir: str) -> Optional[str]: # used by which version? path = os.path.join(datadir, 'gtg_tasks.xml') - + if os.path.isfile(path): return path - + # used by (at least) 0.3.1-4 path = os.path.join(datadir, 'projects.xml') - + if os.path.isfile(path): return self.find_old_uuid_path(path) @@ -315,7 +315,7 @@ def find_old_uuid_path(self, path: str) -> Optional[str]: with open(path, 'r') as stream: xml_tree = et.parse(stream) - + for backend in xml_tree.findall('backend'): module = backend.get('module') if module == 'backend_localfile': diff --git a/GTG/core/filters.py b/GTG/core/filters.py index 4207f4a635..0b1c056fcb 100644 --- a/GTG/core/filters.py +++ b/GTG/core/filters.py @@ -26,9 +26,9 @@ def unwrap(row, expected_type): """Find an item in TreeRow widget (sometimes nested).""" - + item = row.get_item() - + while type(item) is not expected_type: item = item.get_item() @@ -58,7 +58,7 @@ def do_match(self, item) -> bool: else: return True - + class TaskPaneFilter(Gtk.Filter): __gtype_name__ = 'TaskPaneFilter' @@ -90,13 +90,13 @@ def get_children(children: set) -> None: if tag.children: get_children(tag.children) - + return result def match_tags(self, task: Task) -> bool: """Match selected tags to task tags.""" - + all_tags = self.expand_tags() return len(all_tags.intersection(set(task.tags))) >= len(self.tags) @@ -108,7 +108,7 @@ def do_match(self, item) -> bool: show = task.status is Status.ACTIVE elif self.pane == 'workview': show = task.is_actionable - + if self.expand: item.set_expanded(True) self.expand = False @@ -144,7 +144,7 @@ def __init__(self, ds, pane): def set_query(self, query: str) -> None: self.query = query - + try: self.checks = search.parse_search_query(query) except search.InvalidQuery: @@ -153,7 +153,7 @@ def set_query(self, query: str) -> None: def match_tags(self, task: Task) -> bool: """Match selected tags to task tags.""" - + return len(self.tags.intersection(set(task.tags))) >= len(self.tags) @@ -179,4 +179,4 @@ def do_match(self, item) -> bool: return search.search_filter(task, self.checks) else: - return False \ No newline at end of file + return False diff --git a/GTG/core/firstrun_tasks.py b/GTG/core/firstrun_tasks.py index 42bbaba83e..c9610525e5 100644 --- a/GTG/core/firstrun_tasks.py +++ b/GTG/core/firstrun_tasks.py @@ -410,5 +410,5 @@ def generate() -> etree.Element: tag_tag = etree.SubElement(taglist, 'tag') tag_tag.set('id', tid) tag_tag.set('name', tag) - + return etree.ElementTree(root) diff --git a/GTG/core/plugins/api.py b/GTG/core/plugins/api.py index 7fe7f3d095..01e898e522 100644 --- a/GTG/core/plugins/api.py +++ b/GTG/core/plugins/api.py @@ -51,7 +51,7 @@ def __init__(self, self.app = app self.ds = app.ds self.browser = app.browser - + self.selection_changed_callback_listeners = [] if taskeditor: @@ -60,7 +60,7 @@ def __init__(self, else: self.__ui = self.browser self.__task_id = None - + for pane in self.browser.panes.values(): pane.task_selection.connect('selection-changed', self.__selection_changed, pane) diff --git a/GTG/core/saved_searches.py b/GTG/core/saved_searches.py index f9b45f002d..b6fc36b6ec 100644 --- a/GTG/core/saved_searches.py +++ b/GTG/core/saved_searches.py @@ -172,7 +172,7 @@ def new(self, name: str, query: str, parent: UUID = None) -> SavedSearch: self.model.append(search) return search - + def add(self, item, parent_id: UUID = None) -> None: """Add a tag to the tagstore.""" diff --git a/GTG/core/sorters.py b/GTG/core/sorters.py index f2e8fb1178..0eb5464f4c 100644 --- a/GTG/core/sorters.py +++ b/GTG/core/sorters.py @@ -23,9 +23,9 @@ def unwrap(row, expected_type): """Find an item in TreeRow widget (sometimes nested).""" - + item = row - + while type(item) is not expected_type: item = item.get_item() @@ -40,7 +40,7 @@ def __init__(self): def do_compare(self, a, b) -> Gtk.Ordering: - + a = unwrap(a, Task) b = unwrap(b, Task) @@ -63,7 +63,7 @@ def __init__(self): def do_compare(self, a, b) -> Gtk.Ordering: - + a = unwrap(a, Task) b = unwrap(b, Task) @@ -86,7 +86,7 @@ def __init__(self): def do_compare(self, a, b) -> Gtk.Ordering: - + a = unwrap(a, Task) b = unwrap(b, Task) @@ -109,7 +109,7 @@ def __init__(self): def do_compare(self, a, b) -> Gtk.Ordering: - + a = unwrap(a, Task) b = unwrap(b, Task) @@ -133,14 +133,14 @@ def __init__(self): def get_first_letter(self, tags) -> str: """Get first letter of the first tag in a set of tags.""" - + # Fastest way to get the first item # on a set in Python for t in tags: return t.name[0] def do_compare(self, a, b) -> Gtk.Ordering: - + a = unwrap(a, Task) b = unwrap(b, Task) @@ -170,7 +170,7 @@ def __init__(self): def do_compare(self, a, b) -> Gtk.Ordering: - + a = unwrap(a, Task) b = unwrap(b, Task) @@ -183,4 +183,3 @@ def do_compare(self, a, b) -> Gtk.Ordering: return Gtk.Ordering.SMALLER else: return Gtk.Ordering.EQUAL - diff --git a/GTG/core/tags.py b/GTG/core/tags.py index b19db37c8b..c2d5dd5a0e 100644 --- a/GTG/core/tags.py +++ b/GTG/core/tags.py @@ -136,7 +136,7 @@ def has_icon(self) -> bool: return self._icon - + @GObject.Property(type=int, default=0) def task_count_open(self) -> int: @@ -181,8 +181,8 @@ def get_ancestors(self) -> List['Tag']: def __hash__(self): return id(self) - - + + class TagStore(BaseStore): """A tree of tags.""" @@ -226,7 +226,7 @@ def __str__(self) -> str: def get_all_tag_names(self) -> List[str]: """Return all tag names.""" return list(self.lookup_names.keys()) - + def find(self, name: str) -> Tag: """Get a tag by name.""" @@ -347,7 +347,7 @@ def rand_color() -> str: r = random.randint(0, 255) g = random.randint(0, 255) b = random.randint(0, 255) - + return f'#{r:02x}{g:02x}{b:02x}' color = rand_color() diff --git a/GTG/core/tasks.py b/GTG/core/tasks.py index 2c960239a2..3f05287a7e 100644 --- a/GTG/core/tasks.py +++ b/GTG/core/tasks.py @@ -108,7 +108,7 @@ def __init__(self, id: UUID, title: str) -> None: self._is_recurring = False self.recurring_term = None self.recurring_updated_date = datetime.datetime.now() - + self.attributes = {} self.duplicate_cb = NotImplemented @@ -162,7 +162,7 @@ def set_status(self, status: Status, propagated: bool = False) -> None: if self.status == Status.ACTIVE: for t in self.tags: t.task_count_open -= 1 - + if self.is_actionable: for t in self.tags: t.task_count_actionable -= 1 @@ -184,10 +184,10 @@ def set_status(self, status: Status, propagated: bool = False) -> None: # 1- It is recurring. # 2- It has no parent or no recurring parent. # 3- It was directly marked as done (not by propagation from its parent). - if (self._is_recurring and not propagated and + if (self._is_recurring and not propagated and not self.is_parent_recurring()): self.duplicate_cb(self) - + else: self.date_closed = Date.no_date() @@ -197,7 +197,7 @@ def set_status(self, status: Status, propagated: bool = False) -> None: if status == Status.ACTIVE: for t in self.tags: t.task_count_open += 1 - + if self.is_actionable: for t in self.tags: t.task_count_actionable += 1 @@ -206,7 +206,7 @@ def set_status(self, status: Status, propagated: bool = False) -> None: for t in self.tags: t.task_count_closed += 1 - + for child in self.children: child.set_status(status, propagated=True) @@ -220,7 +220,7 @@ def date_due(self) -> Date: def date_due(self, value: Date) -> None: self._date_due = value self.has_date_due = bool(value) - + if value: self.date_due_str = self._date_due.to_readable_string() else: @@ -228,9 +228,9 @@ def date_due(self, value: Date) -> None: for tag in self.tags: if self.is_actionable: - tag.task_count_actionable += 1 + tag.task_count_actionable += 1 else: - tag.task_count_actionable -= 1 + tag.task_count_actionable -= 1 if not value or value.is_fuzzy(): return @@ -328,9 +328,9 @@ def add_tag(self, tag: Tag) -> None: if self.status == Status.ACTIVE: tag.task_count_open += 1 - else: + else: tag.task_count_closed += 1 - + if self.is_actionable: tag.task_count_actionable += 1 else: @@ -346,9 +346,9 @@ def remove_tag(self, tag_name: str) -> None: if self.status == Status.ACTIVE: t.task_count_open -= 1 - else: + else: t.task_count_closed -= 1 - + if self.is_actionable: t.task_count_actionable -= 1 @@ -387,7 +387,7 @@ def set_recurring(self, recurring: bool, recurring_term: str = None, newtask=Fal when creating a new task, the due date is calculated from either the current date or the start date, while we get the next occurrence of a task not from the current date but from the due date itself. - + However when we are retrieving the task from the XML files, we should only set the the recurring_term. @@ -459,7 +459,7 @@ def is_valid_term(): if self._is_recurring: child.date_due = newdate - + self.notify('is_recurring') @@ -489,9 +489,9 @@ def inherit_recursion(self): def is_parent_recurring(self): """Determine if the parent task is recurring.""" - - return (self.parent and - self.parent.status == Status.ACTIVE + + return (self.parent and + self.parent.status == Status.ACTIVE and self.parent._is_recurring) @@ -513,7 +513,7 @@ def get_next_occurrence(self): """ today = datetime.date.today() - + if today <= self.date_due: try: nextdate = self.date_due.parse_from_date(self.recurring_term, newtask=False) @@ -532,7 +532,7 @@ def get_next_occurrence(self): while next_date < datetime.date.today(): next_date = next_date.parse_from_date(self.recurring_term, newtask=False) - + return next_date except Exception: @@ -542,8 +542,8 @@ def get_next_occurrence(self): # Bind Properties # # Since PyGobject doesn't support bind_property_full() yet - # we can't do complex binds. These props below serve as a - # workaround so that we can use them with the regular + # we can't do complex binds. These props below serve as a + # workaround so that we can use them with the regular # bind_property(). # ----------------------------------------------------------------------- @@ -629,7 +629,7 @@ def row_css(self) -> str: @GObject.Property(type=str) def tag_colors(self) -> str: - return ','.join(t.color for t in self.tags + return ','.join(t.color for t in self.tags if t.color and not t.icon) @@ -641,7 +641,7 @@ def show_tag_colors(self) -> str: @property def tag_names(self) -> List[str]: return [ t.name for t in self.tags ] - + def set_attribute(self, att_name, att_value, namespace="") -> None: """Set an arbitrary attribute.""" @@ -729,14 +729,14 @@ def get(self, tid: UUID) -> Task: def duplicate_for_recurrent(self, task: Task) -> Task: """Duplicate a task for the next ocurrence.""" - + new_task = self.new(task.title) new_task.tags = task.tags new_task.content = task.content new_task.date_added = task.date_added new_task.date_due = task.get_next_occurrence() - # Only goes through for the first task + # Only goes through for the first task if task.parent and task.parent.is_active: self.parent(new_task.id, task.parent.id) @@ -746,7 +746,7 @@ def duplicate_for_recurrent(self, task: Task) -> Task: log.debug("Duplicated task %s as task %s", task.id, new_task.id) return new_task - + def new(self, title: str = None, parent: UUID = None) -> Task: """Create a new task and add it to the store.""" @@ -900,7 +900,7 @@ def add(self, item: Any, parent_id: UUID = None) -> None: if not parent_id: self.model.append(item) - + item.duplicate_cb = self.duplicate_for_recurrent self.notify('task_count_all') self.notify('task_count_no_tags') @@ -1029,7 +1029,7 @@ def task_count_all(self) -> str: @GObject.Property(type=str) def task_count_no_tags(self) -> str: i = 0 - + for task in self.lookup.values(): if not task.tags: i += 1 diff --git a/GTG/gtk/application.py b/GTG/gtk/application.py index 43503210b0..bf854b0bdb 100644 --- a/GTG/gtk/application.py +++ b/GTG/gtk/application.py @@ -119,7 +119,7 @@ def do_startup(self): self.config_core = CoreConfig() self.config = self.config_core.get_subconfig('browser') - self.config_plugins = self.config_core.get_subconfig('plugins') + self.config_plugins = self.config_core.get_subconfig('plugins') self.clipboard = clipboard.TaskClipboard(self.ds) @@ -150,7 +150,7 @@ def do_activate(self): try: self.init_shared() self.browser.present() - self.browser.restore_editor_windows() + self.browser.restore_editor_windows() log.debug("Application activation finished") except Exception as e: @@ -337,7 +337,7 @@ def new_subtask(self, param, action): def add_parent(self, param, action): """Callback to add a parent to a task""" - + self.browser.on_add_parent() @@ -365,7 +365,7 @@ def dismiss(self, param, action): self.browser.on_dismiss_task() finally: self.browser.get_pane().refresh() - + def reopen(self, param, action): """Callback to mark task as open.""" @@ -455,7 +455,7 @@ def purge_old_tasks(self, widget=None): today = Date.today() max_days = self.config.get('autoclean_days') closed_tasks = self.ds.tasks.filter(Filter.CLOSED) - + to_remove = [t for t in closed_tasks if (today - t.date_closed).days > max_days] @@ -549,7 +549,7 @@ def open_task(self, task, new=False): If a Task editor is already opened for a given task, we present it. Otherwise, we create a new one. """ - + if task.id in self.open_tasks: editor = self.open_tasks[task.id] editor.present() diff --git a/GTG/gtk/browser/adaptive_button.py b/GTG/gtk/browser/adaptive_button.py index db6fbac53e..7340dc2ee4 100644 --- a/GTG/gtk/browser/adaptive_button.py +++ b/GTG/gtk/browser/adaptive_button.py @@ -293,4 +293,3 @@ def do_set_child_property(self, child: Gtk.Widget, property_id: int, # We don't have any child properties anyway log.debug("Unimplemented child=%r, property_id=%r, value=%r, pspec=%r", child, property_id, value, pspec) - diff --git a/GTG/gtk/browser/delete_task.py b/GTG/gtk/browser/delete_task.py index bd6337b012..af83e07242 100644 --- a/GTG/gtk/browser/delete_task.py +++ b/GTG/gtk/browser/delete_task.py @@ -58,7 +58,7 @@ def recursive_list_tasks(self, tasklist, root): tasklist.append(root) [self.recursive_list_tasks(tasklist, t) - for t in root.children + for t in root.children if t not in tasklist] diff --git a/GTG/gtk/browser/main_window.py b/GTG/gtk/browser/main_window.py index 5bb567057f..c4e53de667 100644 --- a/GTG/gtk/browser/main_window.py +++ b/GTG/gtk/browser/main_window.py @@ -518,7 +518,7 @@ def on_search(self, data): def on_save_search(self, action, param): query = self.search_entry.get_text() - name = re.sub(r'!(?=\w)+', '', query) + name = re.sub(r'!(?=\w)+', '', query) self.app.ds.saved_searches.new(name, query) @@ -800,9 +800,9 @@ def on_quickadd_activate(self, widget) -> None: tasks = self.get_pane().get_selection() for t in tasks: self.app.open_task(t) - + return - + tags = self.sidebar.selected_tags(names_only=True) data = quick_add.parse(text) @@ -1002,20 +1002,20 @@ def on_add_subtask(self, widget=None): def on_add_parent(self, widget=None): selection = self.get_pane().get_selection() - + if not selection: return - + parent = selection[0].parent # Check all tasks have the same parent if any(t.parent != parent for t in selection): return - + if parent: if parent.status == Status.ACTIVE: new_parent = self.app.ds.tasks.new(parent=parent.id) - + for task in selection: self.app.ds.tasks.refresh_lookup_cache() self.app.ds.tasks.unparent(task.id, parent.id) @@ -1026,7 +1026,7 @@ def on_add_parent(self, widget=None): for task in selection: self.app.ds.tasks.refresh_lookup_cache() self.app.ds.tasks.parent(task.id, new_parent.id) - + self.app.open_task(new_parent) self.get_pane().refresh() @@ -1237,43 +1237,43 @@ def on_sort_start(self, action, params) -> None: """Callback when changing task sorting.""" self.get_pane().set_sorter('Start') - + def on_sort_due(self, action, params) -> None: """Callback when changing task sorting.""" - + self.get_pane().set_sorter('Due') - + def on_sort_added(self, action, params) -> None: """Callback when changing task sorting.""" - + self.get_pane().set_sorter('Added') - + def on_sort_title(self, action, params) -> None: """Callback when changing task sorting.""" - + self.get_pane().set_sorter('Title') - + def on_sort_modified(self, action, params) -> None: """Callback when changing task sorting.""" - + self.get_pane().set_sorter('Modified') - + def on_sort_added(self, action, params) -> None: """Callback when changing task sorting.""" - + self.get_pane().set_sorter('Added') - + def on_sort_tags(self, action, params) -> None: """Callback when changing task sorting.""" - + self.get_pane().set_sorter('Tags') - + def close_all_task_editors(self, task_id): """ Including editors of subtasks """ @@ -1328,12 +1328,12 @@ def on_pane_switch(self, obj, pspec): # so their subtasks "exist" when switching # to actionable self.stack_switcher.get_stack().get_first_child().get_first_child().emit('expand-all') - + self.get_pane().set_filter_tags(set(self.sidebar.selected_tags())) self.sidebar.change_pane(current_pane) self.get_pane().sort_btn.set_popover(None) self.get_pane().sort_btn.set_popover(self.sort_menu) - + if search_query := self.search_entry.get_text(): self.get_pane().set_search_query(search_query) @@ -1385,24 +1385,24 @@ def get_selected_pane(self): def get_pane(self): """Get the selected pane.""" - + return self.stack_switcher.get_stack().get_visible_child().get_first_child() - - + + @GObject.Property(type=bool, default=True) def is_pane_open(self) -> bool: return self.get_selected_pane() == 'active' - + @GObject.Property(type=bool, default=False) def is_pane_actionable(self) -> bool: return self.get_selected_pane() == 'workview' - - + + @GObject.Property(type=bool, default=False) def is_pane_closed(self) -> bool: return self.get_selected_pane() == 'closed' - + def get_selected_tree(self, refresh: bool = False): return self.req.get_tasks_tree(name=self.get_selected_pane(), diff --git a/GTG/gtk/browser/quick_add.py b/GTG/gtk/browser/quick_add.py index d392f03a8f..15d73f79e1 100644 --- a/GTG/gtk/browser/quick_add.py +++ b/GTG/gtk/browser/quick_add.py @@ -113,4 +113,3 @@ def parse(text: str) -> Dict: result['title'] = text return result - diff --git a/GTG/gtk/browser/sidebar.py b/GTG/gtk/browser/sidebar.py index 9c8c20770f..656766c510 100644 --- a/GTG/gtk/browser/sidebar.py +++ b/GTG/gtk/browser/sidebar.py @@ -45,14 +45,14 @@ class SearchBox(Gtk.Box): def unwrap(row, expected_type): """Find an item in TreeRow widget (sometimes nested).""" - + item = row.get_item() - + while type(item) is not expected_type: item = item.get_item() return item - + # Shorthands BIND_FLAGS = GObject.BindingFlags.DEFAULT | GObject.BindingFlags.SYNC_CREATE @@ -61,7 +61,7 @@ def unwrap(row, expected_type): class Sidebar(Gtk.ScrolledWindow): """The sidebar widget""" - + def __init__(self, app, ds: Datastore, browser): super(Sidebar, self).__init__() @@ -97,7 +97,7 @@ def __init__(self, app, ds: Datastore, browser): self.general_box.select_row(self.general_box.get_row_at_index(0)) self.box_handle = self.general_box.connect('row-selected', self.on_general_box_selected) - + # ------------------------------------------------------------------------------- # Saved Searches Section # ------------------------------------------------------------------------------- @@ -144,7 +144,7 @@ def __init__(self, app, ds: Datastore, browser): self.filtered_tags = Gtk.FilterListModel() self.filtered_tags.set_model(ds.tags.tree_model) self.filtered_tags.set_filter(self.tags_filter) - + self.tag_selection = Gtk.MultiSelection.new(self.filtered_tags) self.tag_handle = self.tag_selection.connect('selection-changed', self.on_tag_selected) @@ -199,21 +199,21 @@ def __init__(self, app, ds: Datastore, browser): def refresh_tags(self) -> None: """Refresh tags list.""" - + self.filtered_tags.items_changed(0, 0, 0) self.tags_filter.changed(Gtk.FilterChange.DIFFERENT) def change_pane(self, pane: str) -> None: """Change pane for the tag list.""" - + self.tags_filter.pane = pane self.tags_filter.changed(Gtk.FilterChange.DIFFERENT) - + def on_tag_RMB_click(self, gesture, sequence) -> None: """Callback when right-clicking on a tag.""" - + menu = TagContextMenu(self.ds, self.app, gesture.get_widget().tag) menu.set_parent(gesture.get_widget()) menu.set_halign(Gtk.Align.START) @@ -308,7 +308,7 @@ def tags_setup_cb(self, factory, listitem, user_data=None) -> None: # Drag ... - source = Gtk.DragSource() + source = Gtk.DragSource() source.connect('prepare', self.prepare) source.connect('drag-begin', self.drag_begin) source.connect('drag-end', self.drag_end) @@ -380,21 +380,21 @@ def tags_bind_cb(self, signallistitem, listitem, user_data=None) -> None: item.bind_property('children_count',expander,'hide-expander',BIND_FLAGS, lambda _,x: x==0), ] - + self.browser.bind_property('is_pane_open', open_count_label, 'visible', BIND_FLAGS) self.browser.bind_property('is_pane_actionable', actionable_count_label, 'visible', BIND_FLAGS) self.browser.bind_property('is_pane_closed', closed_count_label, 'visible', BIND_FLAGS) - + def tags_unbind_cb(self, signallistitem, listitem, user_data=None) -> None: """Clean up bindings made in tags_bind_cb""" for binding in listitem.bindings: binding.unbind() - + def unselect_tags(self) -> None: """Clear tags selection""" - + with signal_block(self.tag_selection, self.tag_handle): self.tag_selection.unselect_all() @@ -426,7 +426,7 @@ def on_general_box_selected(self, listbox, user_data=None): self.app.browser.get_pane().set_filter_tags() elif index == 1: self.app.browser.get_pane().set_filter_notags() - + def on_search_selected(self, model, position, user_data=None): """Callback when selecting a saved search""" @@ -445,15 +445,15 @@ def selected_tags(self, names_only: bool = False) -> list: selection = self.tag_selection.get_selection() result, iterator, _ = Gtk.BitsetIter.init_first(selection) selected = [] - + while iterator.is_valid(): val = iterator.get_value() item = unwrap(self.tag_selection.get_item(val), Tag) selected.append(item.name if names_only else item) iterator.next() - + return selected - + def on_tag_selected(self, model, position, n_items, user_data=None): """Callback when selecting one or more tags""" @@ -469,14 +469,14 @@ def on_tag_reveal(self, event) -> None: """Callback for clicking on the tags title button (revealer).""" self.revealer.set_reveal_child(not self.revealer.get_reveal_child()) - + def on_search_reveal(self, event) -> None: """Callback for clicking on the search title button (revealer).""" self.searches_revealer.set_reveal_child(not self.searches_revealer.get_reveal_child()) - - + + def searches_setup_cb(self, factory, listitem, user_data=None) -> None: """Setup for a row in the saved searches listview""" @@ -559,14 +559,14 @@ def drag_end(self, source, drag, unused): def check_parent(self, value, target) -> bool: """Check to parenting a parent to its own children""" - + item = target while item.parent: if item.parent == value: return False - + item = item.parent - + return True @@ -579,12 +579,12 @@ def drag_drop(self, target, value, x, y): if value.parent: self.ds.tags.unparent(value.id, value.parent.id) - + self.ds.tags.parent(value.id, dropped.id) self.ds.refresh_tag_stats() self.ds.tags.tree_model.emit('items-changed', 0, 0, 0) self.refresh_tags() - + def drop_enter(self, target, x, y, user_data=None): @@ -625,11 +625,11 @@ def multi_task_drag_drop(self, target, tasklist, x, y): def notify_task(self, task: Task) -> None: """Notify that tasks props have changed.""" - + task.notify('row_css') task.notify('icons') task.notify('tag_colors') - + def on_toplevel_tag_drop(self, drop_target, tag, x, y): if tag.parent: @@ -642,7 +642,7 @@ def on_toplevel_tag_drop(self, drop_target, tag, x, y): expander.activate_action('listitem.toggle-expand') except RuntimeError: pass - + self.ds.tags.tree_model.emit('items-changed', 0, 0, 0) return True else: diff --git a/GTG/gtk/browser/sidebar_context_menu.py b/GTG/gtk/browser/sidebar_context_menu.py index c7f356a440..3e8289a62c 100644 --- a/GTG/gtk/browser/sidebar_context_menu.py +++ b/GTG/gtk/browser/sidebar_context_menu.py @@ -18,8 +18,8 @@ """ sidebar_context_menu: -Implements a context (pop-up) menu for the tag or saved search item in the -sidebar. It is supposed to be a generic sidebar context for all kind of item +Implements a context (pop-up) menu for the tag or saved search item in the +sidebar. It is supposed to be a generic sidebar context for all kind of item displayed there. Also, it is supposed to handle more complex menus (with non-std widgets, like a color picker). @@ -44,7 +44,7 @@ def __init__(self, ds, app, tag): actions = [ ("edit_tag", self.on_mi_cc_activate), ("generate_tag_color", self.on_mi_ctag_activate), - ("delete_tag", lambda w, a, p: + ("delete_tag", lambda w, a, p: self.app.browser.on_delete_tag_activate([self.tag])) ] @@ -92,7 +92,7 @@ def __init__(self, ds, app, search): actions = [ ("edit_search", lambda w, a, p: app.open_search_editor(search)), - ("delete_search", lambda w, a, p: + ("delete_search", lambda w, a, p: ds.saved_searches.remove(self.search.id)) ] diff --git a/GTG/gtk/browser/tag_editor.py b/GTG/gtk/browser/tag_editor.py index 4cdd51bfcd..cc921ff742 100644 --- a/GTG/gtk/browser/tag_editor.py +++ b/GTG/gtk/browser/tag_editor.py @@ -245,7 +245,7 @@ def _apply(self): for t in self.app.ds.tasks.lookup.values(): t.rename_tag(self.tag.name, self.tag_name) - + self.tag.name = self.tag_name self.app.ds.refresh_task_count() @@ -274,7 +274,7 @@ def _random_color(self, widget: GObject.Object): c.red, c.green, c.blue, c.alpha = 1.0, 1.0, 1.0, 1.0 c.parse('#' + color) self.tag_rgba = c - + @Gtk.Template.Callback('activate_color') def _activate_color(self, widget: GObject.Object): """ diff --git a/GTG/gtk/browser/tag_pill.py b/GTG/gtk/browser/tag_pill.py index d2bf752240..f786e5a225 100644 --- a/GTG/gtk/browser/tag_pill.py +++ b/GTG/gtk/browser/tag_pill.py @@ -23,9 +23,9 @@ class TagPill(Gtk.DrawingArea): """Color pill widget for tags.""" - + __gtype_name__ = 'TagPill' - + default_color = '#666666' def __init__(self, radius: int = 5): @@ -53,7 +53,7 @@ def set_colors(self, value) -> None: for color in value.split(','): rgba = Gdk.RGBA() valid = rgba.parse(color) - + if valid: self.colors.append(rgba) else: @@ -68,13 +68,13 @@ def set_colors(self, value) -> None: self.queue_draw() - def draw_rect(self, context, x: int, w: int, h: int, + def draw_rect(self, context, x: int, w: int, h: int, color: Gdk.RGBA = None) -> None: """Draw a single color rectangle.""" - + y = 0 # No change in Y axis r = self.radius - + if color: context.set_source_rgba(color.red, color.green, color.blue) @@ -117,7 +117,7 @@ def draw_rect(self, context, x: int, w: int, h: int, def do_draw_function(self, area, context, w, h, user_data=None): """Drawing callback.""" - + for i, color in enumerate(self.colors): x = i * (16 + 6) self.draw_rect(context, x, 16, h, color) diff --git a/GTG/gtk/browser/task_pane.py b/GTG/gtk/browser/task_pane.py index 46a29f395d..9e3924fec7 100644 --- a/GTG/gtk/browser/task_pane.py +++ b/GTG/gtk/browser/task_pane.py @@ -43,7 +43,7 @@ def __init__(self, config, is_actionable=False): self.expander.set_indent_for_icon(True) self.expander.set_indent_for_depth(True) - self.check = Gtk.CheckButton() + self.check = Gtk.CheckButton() self.check.set_margin_end(6) self.append(self.expander) @@ -62,7 +62,7 @@ def set_has_children(self, value) -> bool: if self.is_actionable: value = False - + @GObject.Property(type=bool, default=True) def is_active(self) -> None: @@ -75,7 +75,7 @@ def set_is_active(self, value) -> bool: self.remove_css_class('closed-task') else: self.add_css_class('closed-task') - + @GObject.Property(type=str) def row_css(self) -> None: @@ -93,7 +93,7 @@ def set_row_css(self, value) -> None: return except AttributeError: return - + val = str.encode(value) self.provider = Gtk.CssProvider() @@ -103,9 +103,9 @@ def set_row_css(self, value) -> None: def unwrap(row, expected_type): """Find an item in TreeRow widget (sometimes nested).""" - + item = row.get_item() - + while type(item) is not expected_type: item = item.get_item() @@ -114,7 +114,7 @@ def unwrap(row, expected_type): class TaskPane(Gtk.ScrolledWindow): """The task pane widget""" - + def __init__(self, browser, pane): super(TaskPane, self).__init__() @@ -126,7 +126,7 @@ def __init__(self, browser, pane): self.set_vexpand(True) self.set_hexpand(True) - + # ------------------------------------------------------------------------------- # Title # ------------------------------------------------------------------------------- @@ -137,17 +137,17 @@ def __init__(self, browser, pane): title_box.set_margin_bottom(32) title_box.set_margin_start(24) title_box.set_margin_end(24) - + self.title = Gtk.Label() self.title.set_halign(Gtk.Align.START) self.title.set_hexpand(True) self.title.add_css_class('title-1') title_box.append(self.title) - + self.sort_btn = Gtk.MenuButton() self.sort_btn.set_icon_name('view-more-symbolic') self.sort_btn.add_css_class('flat') - + title_box.append(self.sort_btn) @@ -156,14 +156,14 @@ def __init__(self, browser, pane): # ------------------------------------------------------------------------------- self.search_filter = SearchTaskFilter(self.ds, pane) - self.task_filter = TaskPaneFilter(self.app.ds, pane) + self.task_filter = TaskPaneFilter(self.app.ds, pane) self.filtered = Gtk.FilterListModel() self.filtered.set_model(self.app.ds.tasks.tree_model) self.filtered.set_filter(self.task_filter) self.sort_model = Gtk.TreeListRowSorter() - + self.main_sorter = Gtk.SortListModel() self.main_sorter.set_model(self.filtered) self.main_sorter.set_sorter(self.sort_model) @@ -212,7 +212,7 @@ def set_title(self) -> None: self.title.set_text(_('Actionable Tasks')) if self.pane == 'closed': self.title.set_text(_('All Closed Tasks')) - + else: tags = ', '.join('@' + t.name for t in self.task_filter.tags) @@ -222,7 +222,7 @@ def set_title(self) -> None: self.title.set_text(_('{0} (Actionable)'.format(tags))) if self.pane == 'closed': self.title.set_text(_('{0} (Closed)'.format(tags))) - + def set_search_query(self, query) -> None: """Change tasks filter.""" @@ -277,7 +277,7 @@ def set_filter_notags(self, tags=[]) -> None: def refresh(self): """Refresh the task filter""" - + self.task_filter.changed(Gtk.FilterChange.DIFFERENT) self.main_sorter.items_changed(0,0,0) @@ -305,13 +305,13 @@ def set_sorter(self, method=None) -> None: def on_listview_activated(self, listview, position, user_data = None): """Callback when double clicking on a row.""" - + self.app.browser.on_edit_active_task() def on_key_released(self, controller, keyval, keycode, state): """Callback when a key is released. """ - + is_enter = keyval in (Gdk.KEY_Return, Gdk.KEY_KP_Enter) is_left = keyval == Gdk.KEY_Left is_right = keyval == Gdk.KEY_Right @@ -326,14 +326,14 @@ def on_key_released(self, controller, keyval, keycode, state): def select_last(self) -> None: """Select last position in the task list.""" - + position = self.app.ds.tasks.tree_model.get_n_items() self.task_selection.select_item(position - 1, True) - + def select_task(self, task: Task) -> None: """Select a task in the list.""" - + position = None for i in range(self.main_sorter.get_n_items()): @@ -353,7 +353,7 @@ def get_selection(self, indices: bool = False) -> list: selection = self.task_selection.get_selection() result, iterator, _ = Gtk.BitsetIter.init_first(selection) selected = [] - + while iterator.is_valid(): val = iterator.get_value() @@ -361,7 +361,7 @@ def get_selection(self, indices: bool = False) -> list: selected.append(val) else: selected.append(unwrap(self.task_selection.get_item(val), Task)) - + iterator.next() return selected @@ -372,12 +372,12 @@ def expand_selected(self, expand) -> None: selection = self.task_selection.get_selection() result, iterator, _ = Gtk.BitsetIter.init_first(selection) - + while iterator.is_valid(): val = iterator.get_value() row = self.task_selection.get_item(val) row.set_expanded(expand) - + iterator.next() @@ -390,12 +390,12 @@ def get_selected_number(self) -> int: def on_checkbox_toggled(self, button, task=None): """Callback when clicking a checkbox.""" - + if task.status == Status.DISMISSED: task.toggle_dismiss() else: task.toggle_active() - + task.notify('is_active') self.task_filter.changed(Gtk.FilterChange.DIFFERENT) @@ -404,18 +404,18 @@ def task_setup_cb(self, factory, listitem, user_data=None): """Setup widgets for rows""" box = TaskBox(self.app.config, self.pane == 'workview') - label = Gtk.Label() - separator = Gtk.Separator() - icons = Gtk.Label() + label = Gtk.Label() + separator = Gtk.Separator() + icons = Gtk.Label() color = TagPill() - due = Gtk.Label() - due_icon = Gtk.Image.new_from_icon_name('alarm-symbolic') - start = Gtk.Label() - start_icon = Gtk.Image.new_from_icon_name('media-playback-start-symbolic') - recurring_icon = Gtk.Label() + due = Gtk.Label() + due_icon = Gtk.Image.new_from_icon_name('alarm-symbolic') + start = Gtk.Label() + start_icon = Gtk.Image.new_from_icon_name('media-playback-start-symbolic') + recurring_icon = Gtk.Label() color.set_size_request(16, 16) - + color.set_vexpand(False) color.set_valign(Gtk.Align.CENTER) @@ -449,7 +449,7 @@ def on_notify_visibility(obj, gparamstring): start.set_margin_end(12) # DnD stuff - source = Gtk.DragSource() + source = Gtk.DragSource() source.connect('prepare', self.drag_prepare) source.connect('drag-begin', self.drag_begin) source.connect('drag-end', self.drag_end) @@ -551,7 +551,7 @@ def drag_prepare(self, source, x, y): """Callback to prepare for the DnD operation""" selection = self.get_selection() - + if len(selection) > 1: data = Gio.ListStore() data.splice(0, 0, selection) @@ -605,14 +605,14 @@ def drop_enter(self, target, x, y, user_data=None): def check_parent(self, value, target) -> bool: """Check to parenting a parent to its own children""" - + item = target while item.parent: if item.parent == value: return False - + item = item.parent - + return True @@ -626,7 +626,7 @@ def drag_drop(self, target, task, x, y): if task.parent: self.ds.tasks.unparent(task.id, task.parent.id) - + self.ds.tasks.parent(task.id, dropped.id) self.refresh() self.emit('collapse-all') @@ -636,7 +636,7 @@ def drag_drop(self, target, task, x, y): def on_task_RMB_click(self, gesture, sequence) -> None: """Callback when right-clicking on an open task.""" - widget = gesture.get_widget() + widget = gesture.get_widget() task = widget.task if self.get_selected_number() <= 1: @@ -653,7 +653,7 @@ def on_task_RMB_click(self, gesture, sequence) -> None: rect = Gdk.Rectangle() rect.x = x rect.y = y - + menu.set_pointing_to(rect) menu.popup() diff --git a/GTG/gtk/data/main_window.ui b/GTG/gtk/data/main_window.ui index b12dbd511b..251b8a0b08 100644 --- a/GTG/gtk/data/main_window.ui +++ b/GTG/gtk/data/main_window.ui @@ -221,7 +221,7 @@ Sort by Modified Date win.sort_by_modified - + Sort by Tags win.sort_by_tags diff --git a/GTG/gtk/data/style.css b/GTG/gtk/data/style.css index 68549cf24e..2d3f1b6984 100644 --- a/GTG/gtk/data/style.css +++ b/GTG/gtk/data/style.css @@ -10,8 +10,8 @@ border-top: 1px solid rgb(213, 208, 204); } -/* - We have to get move the padding into the boxes +/* + We have to get move the padding into the boxes so the background color of the rows reaches all the way to the edges */ @@ -21,7 +21,7 @@ .task-list row > box { padding: 15px 16px; -} +} /* -------------------------------------------------------------------------------- * ERROR HANDLER @@ -87,10 +87,10 @@ textview check { .hide { opacity: 0.2; } .color-pill { - background: #999; - padding: 0; - min-height: 16px; - min-width: 16px; + background: #999; + padding: 0; + min-height: 16px; + min-width: 16px; border: none; } diff --git a/GTG/gtk/editor/editor.py b/GTG/gtk/editor/editor.py index 8873dea4e2..d01be5cfe9 100644 --- a/GTG/gtk/editor/editor.py +++ b/GTG/gtk/editor/editor.py @@ -299,7 +299,7 @@ def sync_tag_store(self, widget=None): self.tag_store.clear() used = set() - + for used_tag in self.task.tags: # First parameter marks the tag as used self.tag_store.append((True, used_tag.name)) @@ -308,7 +308,7 @@ def sync_tag_store(self, widget=None): for tag_name in self.ds.tags.lookup_names.keys(): if tag_name not in used: self.tag_store.append((False, tag_name)) - + def sync_repeat_button(self, object=None, pspec=None): if self.recurring_menu.is_task_recurring: @@ -575,7 +575,7 @@ def reload_editor(self): textview = self.textview task_text = task.content task_title = task.title - + textview.set_text(f"{task_title}\n") if task_text: @@ -716,7 +716,7 @@ def open_subtask(self, tid): task = self.ds.tasks.lookup[tid] self.app.open_task(task) - + if task.parent: self.app.close_task(task.parent.id) @@ -725,19 +725,19 @@ def new_subtask(self, title=None, tid=None): self.app.ds.tasks.parent(self.task.id, tid) return self.app.ds.tasks.lookup[tid] - + elif title and not tid: t = self.app.ds.tasks.new(title, self.task.id) tid = t.id self.app.ds.tasks.refresh_lookup_cache() return t - + elif title and tid: t = self.app.ds.tasks.new(title, self.task.id) t.id = tid self.app.ds.tasks.refresh_lookup_cache() - + return t def remove_subtask(self, tid): @@ -873,7 +873,7 @@ def on_window_focus_change(self, window, gparam): def is_new(self) -> bool: - return (self.task.title == DEFAULT_TITLE + return (self.task.title == DEFAULT_TITLE and self.textview.get_text() == '') diff --git a/GTG/gtk/editor/taskview.py b/GTG/gtk/editor/taskview.py index a1574739b5..23dfb3f279 100644 --- a/GTG/gtk/editor/taskview.py +++ b/GTG/gtk/editor/taskview.py @@ -239,7 +239,7 @@ def process(self,mask_current_word:bool=False) -> None: cur_pos = cursor_iter.get_line_offset() text = TaskView.mask_current_word(text,cur_pos) - self.detect_tag(text, start) + self.detect_tag(text, start) start.forward_line() diff --git a/GTG/gtk/errorhandler.py b/GTG/gtk/errorhandler.py index 1ee73ec135..6cc70c4273 100644 --- a/GTG/gtk/errorhandler.py +++ b/GTG/gtk/errorhandler.py @@ -220,4 +220,3 @@ def restore_excepthook() -> bool: return False sys.excepthook = original_excepthook original_excepthook = None - diff --git a/GTG/gtk/general_preferences.py b/GTG/gtk/general_preferences.py index d6e06e6f36..6b26a5e3a0 100644 --- a/GTG/gtk/general_preferences.py +++ b/GTG/gtk/general_preferences.py @@ -178,4 +178,4 @@ def on_dark_mode_toggled(self, widget, state): """Toggle darkmode.""" self.config.set("dark_mode", state) - self.app.toggle_darkmode(state) \ No newline at end of file + self.app.toggle_darkmode(state) diff --git a/GTG/gtk/tag_completion.py b/GTG/gtk/tag_completion.py index febe71c561..f9ee28cfb0 100644 --- a/GTG/gtk/tag_completion.py +++ b/GTG/gtk/tag_completion.py @@ -111,7 +111,7 @@ def _on_tag_added(self, tag): def _try_delete(self, name): """ Delete an item if it is in the list """ - + for row in self.tags: if row[0] == name: self.tags.remove(row.iter) diff --git a/GTG/plugins/export/export_templates/template_pocketmod.tex b/GTG/plugins/export/export_templates/template_pocketmod.tex index 592c323027..9d88ac80a4 100644 --- a/GTG/plugins/export/export_templates/template_pocketmod.tex +++ b/GTG/plugins/export/export_templates/template_pocketmod.tex @@ -28,7 +28,7 @@ #end if #if $task.has_due_date - \textit{Due: $task.due_date}\\ + \textit{Due: $task.due_date}\\ #end if #if $task.has_subtasks diff --git a/GTG/plugins/export/export_templates/template_sexy.html b/GTG/plugins/export/export_templates/template_sexy.html index 97e53d8ae8..2d11c35a6b 100644 --- a/GTG/plugins/export/export_templates/template_sexy.html +++ b/GTG/plugins/export/export_templates/template_sexy.html @@ -31,12 +31,12 @@