From f48d1ae58b203b2f5b2b79c5dc24278d345b3d49 Mon Sep 17 00:00:00 2001 From: Grzegorz Sobczyk Date: Fri, 14 Aug 2020 15:13:18 +0200 Subject: [PATCH 1/8] Update edit_activity.py to every component in form be aware of selected date For activity in cmdline: `some activity` (without date and time) - checked incrementing and decrementing day - checked date picker - checked date picker set to one date and cmdline on another date (cmdline has higher priority) This fixes #627 Adding activities in retrospect is very hard. --- NEWS.md | 4 ++++ src/hamster/edit_activity.py | 40 ++++++++++++++++-------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/NEWS.md b/NEWS.md index 83509b0b4..af1273880 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +## Changes in 3.0.3 (unreleased) + +* Fixed Adding activities in retrospect is very hard (issue 627) + ## Changes in 3.0.2 * Switch from deprecated xml2po to itstool for translating help files diff --git a/src/hamster/edit_activity.py b/src/hamster/edit_activity.py index 59c2d6f43..dd098d837 100644 --- a/src/hamster/edit_activity.py +++ b/src/hamster/edit_activity.py @@ -135,15 +135,8 @@ def date(self): @date.setter def date(self, value): - delta = value - self._date if self._date else None self._date = value self.cmdline.default_day = value - if self.fact and delta: - if self.fact.start_time: - self.fact.start_time += delta - if self.fact.end_time: - self.fact.end_time += delta - # self.update_fields() here would enter an infinite loop def on_prev_day_clicked(self, button): self.increment_date(-1) @@ -161,7 +154,7 @@ def get_widget(self, name): def increment_date(self, days): delta = dt.timedelta(days=days) - self.date += delta + self.change_start_date(self.date + delta) self.update_fields() def show(self): @@ -240,18 +233,21 @@ def on_end_time_changed(self, widget): def on_start_date_changed(self, widget): if not self.master_is_cmdline: - if self.fact.start_time: - previous_date = self.fact.start_time.date() - new_date = self.start_date.date - delta = new_date - previous_date - self.fact.start_time += delta - if self.fact.end_time: - # preserve fact duration - self.fact.end_time += delta - self.end_date.date = self.fact.end_time - self.date = self.fact.date or dt.hday.today() - self.validate_fields() - self.update_cmdline() + new_date = self.start_date.date + self.change_start_date(new_date) + + def change_start_date(self, new_date): + if self.fact.start_time: + previous_date = self.fact.start_time.date() + delta = new_date - previous_date + self.fact.start_time += delta + if self.fact.end_time: + # preserve fact duration + self.fact.end_time += delta + self.end_date.date = self.fact.end_time + self.date = self.fact.date or dt.hday.today() + self.validate_fields() + self.update_cmdline() def on_start_date_expander_activated(self, widget): # state has not changed yet, toggle also end_date calendar visibility @@ -302,8 +298,8 @@ def update_fields(self): self.start_time.time = self.fact.start_time self.end_time.time = self.fact.end_time self.end_time.set_start_time(self.fact.start_time) - self.start_date.date = self.fact.start_time - self.end_date.date = self.fact.end_time + self.start_date.date = self.fact.date or self.date + self.end_date.date = self.fact.date or self.date self.activity_entry.set_text(self.fact.activity) self.category_entry.set_text(self.fact.category) self.description_buffer.set_text(self.fact.description) From 137075f0b86671b33d05e452cc70e29ffccf5024 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 20 Nov 2020 17:25:06 +0100 Subject: [PATCH 2/8] fixup! Update edit_activity.py to every component in form be aware of selected date --- src/hamster/edit_activity.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hamster/edit_activity.py b/src/hamster/edit_activity.py index dd098d837..5a2923caf 100644 --- a/src/hamster/edit_activity.py +++ b/src/hamster/edit_activity.py @@ -154,7 +154,7 @@ def get_widget(self, name): def increment_date(self, days): delta = dt.timedelta(days=days) - self.change_start_date(self.date + delta) + self.move_to_date(self.date + delta) self.update_fields() def show(self): @@ -234,9 +234,11 @@ def on_end_time_changed(self, widget): def on_start_date_changed(self, widget): if not self.master_is_cmdline: new_date = self.start_date.date - self.change_start_date(new_date) + self.move_to_date(new_date) + self.validate_fields() + self.update_cmdline() - def change_start_date(self, new_date): + def move_to_date(self, new_date): if self.fact.start_time: previous_date = self.fact.start_time.date() delta = new_date - previous_date @@ -246,8 +248,6 @@ def change_start_date(self, new_date): self.fact.end_time += delta self.end_date.date = self.fact.end_time self.date = self.fact.date or dt.hday.today() - self.validate_fields() - self.update_cmdline() def on_start_date_expander_activated(self, widget): # state has not changed yet, toggle also end_date calendar visibility From 2bb90fc64e6f393e3411a5072530cda0279be491 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 20 Nov 2020 17:25:35 +0100 Subject: [PATCH 3/8] fixup! Update edit_activity.py to every component in form be aware of selected date --- src/hamster/edit_activity.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/hamster/edit_activity.py b/src/hamster/edit_activity.py index 5a2923caf..a8ff4a961 100644 --- a/src/hamster/edit_activity.py +++ b/src/hamster/edit_activity.py @@ -138,6 +138,17 @@ def date(self, value): self._date = value self.cmdline.default_day = value + def move_to_date(self, new_date): + if self.fact.start_time: + previous_date = self.fact.start_time.date() + delta = new_date - previous_date + self.fact.start_time += delta + if self.fact.end_time: + # preserve fact duration + self.fact.end_time += delta + self.end_date.date = self.fact.end_time + self.date = self.fact.date or dt.hday.today() + def on_prev_day_clicked(self, button): self.increment_date(-1) @@ -238,17 +249,6 @@ def on_start_date_changed(self, widget): self.validate_fields() self.update_cmdline() - def move_to_date(self, new_date): - if self.fact.start_time: - previous_date = self.fact.start_time.date() - delta = new_date - previous_date - self.fact.start_time += delta - if self.fact.end_time: - # preserve fact duration - self.fact.end_time += delta - self.end_date.date = self.fact.end_time - self.date = self.fact.date or dt.hday.today() - def on_start_date_expander_activated(self, widget): # state has not changed yet, toggle also end_date calendar visibility previous_state = self.start_date.expander.get_expanded() From b120a886479098db51a889546e9f76ed8a648cc3 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 20 Nov 2020 18:41:54 +0100 Subject: [PATCH 4/8] fixup! Update edit_activity.py to every component in form be aware of selected date --- src/hamster/edit_activity.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hamster/edit_activity.py b/src/hamster/edit_activity.py index a8ff4a961..cea109633 100644 --- a/src/hamster/edit_activity.py +++ b/src/hamster/edit_activity.py @@ -298,8 +298,8 @@ def update_fields(self): self.start_time.time = self.fact.start_time self.end_time.time = self.fact.end_time self.end_time.set_start_time(self.fact.start_time) - self.start_date.date = self.fact.date or self.date - self.end_date.date = self.fact.date or self.date + self.start_date.date = self.fact.start_time + self.end_date.date = self.fact.end_time self.activity_entry.set_text(self.fact.activity) self.category_entry.set_text(self.fact.category) self.description_buffer.set_text(self.fact.description) From 295ed124d9e7744841ad724f11709fe8affc8060 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 20 Nov 2020 15:13:15 +0100 Subject: [PATCH 5/8] CmdLineEntry: Remove original_fact This was unused. --- src/hamster/edit_activity.py | 3 --- src/hamster/widgets/activityentry.py | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/hamster/edit_activity.py b/src/hamster/edit_activity.py index cea109633..5c94ef5f3 100644 --- a/src/hamster/edit_activity.py +++ b/src/hamster/edit_activity.py @@ -99,15 +99,12 @@ def __init__(self, action, fact_id=None): else: self.fact = Fact(start_time=dt.datetime.now()) - original_fact = self.fact # TODO: should use hday, not date. self.date = self.fact.date self.update_fields() self.update_cmdline(select=True) - self.cmdline.original_fact = original_fact - # This signal should be emitted only after a manual modification, # not at init time when cmdline might not always be fully parsable. self.cmdline.connect("changed", self.on_cmdline_changed) diff --git a/src/hamster/widgets/activityentry.py b/src/hamster/widgets/activityentry.py index 97a3ac02e..2821d02ca 100644 --- a/src/hamster/widgets/activityentry.py +++ b/src/hamster/widgets/activityentry.py @@ -209,9 +209,6 @@ def __init__(self, updating=True, **kwargs): # default day for times without date self.default_day = None - # to be set by the caller, if editing an existing fact - self.original_fact = None - self.popup = gtk.Window(type = gtk.WindowType.POPUP) self.popup.set_type_hint(gdk.WindowTypeHint.COMBO) # why not self.popup.set_attached_to(self) # attributes From 46f8cc79bfc8171102a1671df6ac347a85238648 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 20 Nov 2020 16:31:26 +0100 Subject: [PATCH 6/8] CmdLineEntry: Prevent duplicate fact parsing The `extract_search` helper function was passed the text and parsed a Fact from that. However, all places calling this function already parsed that same text, so easier to just pass the parsed Fact rather than the text. --- src/hamster/widgets/activityentry.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/hamster/widgets/activityentry.py b/src/hamster/widgets/activityentry.py index 2821d02ca..c3e769a79 100644 --- a/src/hamster/widgets/activityentry.py +++ b/src/hamster/widgets/activityentry.py @@ -44,8 +44,7 @@ # Code redundancy to be removed later. -def extract_search(text): - fact = Fact.parse(text) +def extract_search(fact): search = fact.activity if fact.category: search += "@%s" % fact.category @@ -323,7 +322,7 @@ def load_suggestions(self): def complete_first(self): text = self.get_text() fact = Fact.parse(text) - search = extract_search(text) + search = extract_search(fact) if not self.complete_tree.rows or not fact.activity: return text, None @@ -379,7 +378,7 @@ def update_suggestions(self, text=""): current_fragment = fragments[-1] if fragments else "" - search = extract_search(text) + search = extract_search(fact) matches = [] for match, score in self.suggestions: From 53c414b04636102356bdd5e989328ba48775c832 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Fri, 20 Nov 2020 16:36:40 +0100 Subject: [PATCH 7/8] CmdLineEntry: Use self.default_day when parsing Inside CmdLineEntry, the text was previously parsed without specifying a default_day, causing the (start) date of that parsed fact to be the current date. This was mostly harmless, since these parsed facts are only used to generate completions (the actual fact to be saved is parsed by CustomFactController, which does apply the right date). However, in some cases, this caused suggestions to look slightly weird (such as when editing a fact with a start time before today and without end time, the "stop now" entry would show an explicit date, because the serialization *did* use default_day). By using the default_day also for parsing, the CmdLineEntry always has the right idea about the fact that it is creating, which removes these small weirdnesses. --- src/hamster/widgets/activityentry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hamster/widgets/activityentry.py b/src/hamster/widgets/activityentry.py index c3e769a79..28e3a187a 100644 --- a/src/hamster/widgets/activityentry.py +++ b/src/hamster/widgets/activityentry.py @@ -321,7 +321,7 @@ def load_suggestions(self): def complete_first(self): text = self.get_text() - fact = Fact.parse(text) + fact = Fact.parse(text, default_day=self.default_day) search = extract_search(fact) if not self.complete_tree.rows or not fact.activity: return text, None @@ -357,7 +357,7 @@ def update_suggestions(self, text=""): res = [] - fact = Fact.parse(text) + fact = Fact.parse(text, default_day=self.default_day) now = dt.datetime.now() # figure out what we are looking for From cf3d13ae31070fbe28ecf0d23be2654fab00f951 Mon Sep 17 00:00:00 2001 From: Matthijs Kooijman Date: Sat, 21 Nov 2020 19:50:25 +0100 Subject: [PATCH 8/8] CustomFactController: Update current date on cmdline changes This ensures that `self.date` remains correct, which indirectly makes sure the "dayline" at the top of the window is updated, and ensures that the cmdline also uses the right date for subsequent serialization and completions. --- src/hamster/edit_activity.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hamster/edit_activity.py b/src/hamster/edit_activity.py index 5c94ef5f3..725c7faa0 100644 --- a/src/hamster/edit_activity.py +++ b/src/hamster/edit_activity.py @@ -197,6 +197,7 @@ def on_cmdline_changed(self, widget): # no change to description here, keep the main one fact.description = self.fact.description self.fact = fact + self.date = fact.date self.update_fields() def on_cmdline_focus_in_event(self, widget, event):