Skip to content
This repository was archived by the owner on Jul 23, 2024. It is now read-only.

Commit 8d22463

Browse files
authored
Use preset_path instead of building path from preset's name and repo (#658)
The repo refactor unfortunately reintroduced the above bug, certain preset names (like "Classic" and "classic-light.json", or "Kate" and "kate-light.json") that did not match the actual file paths from the downloaded files would result in being unable to apply or delete them. To fix this, Presets should only load and remember the path they were loaded from, rather than building one each time with the preset and repo name. The preset and repo name can still be used when creating a new file from a resource or from scratch, but after that the path should be used to ensure we have the right file.
2 parents 2f719d0 + 0fad4da commit 8d22463

File tree

5 files changed

+61
-105
lines changed

5 files changed

+61
-105
lines changed

gradience/ui/preset_row.py

Lines changed: 10 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class GradiencePresetRow(Adw.ExpanderRow):
4141
badge_list = Gtk.Template.Child("badge_list")
4242
no_badges = Gtk.Template.Child("no_badges")
4343

44-
def __init__(self, name, win, repo_name, author="", **kwargs):
44+
def __init__(self, name, preset_path, win, repo_name, author="", **kwargs):
4545
super().__init__(**kwargs)
4646

4747
self.name = name
@@ -57,7 +57,7 @@ def __init__(self, name, win, repo_name, author="", **kwargs):
5757
self.win = win
5858
self.toast_overlay = self.win.toast_overlay
5959

60-
self.preset = Preset(name, repo_name)
60+
self.preset = Preset(preset_path)
6161

6262
if self.preset.badges:
6363
self.has_badges = True
@@ -107,13 +107,7 @@ def on_star_button_clicked(self, *_args):
107107
def on_apply_button_clicked(self, *_args):
108108
buglog("apply")
109109

110-
self.app.load_preset_from_file(
111-
os.path.join(
112-
presets_dir,
113-
self.prefix,
114-
to_slug_case(to_slug_case(self.name)) + ".json",
115-
)
116-
)
110+
self.app.load_preset_from_file(self.preset.preset_path)
117111

118112
def on_undo_button_clicked(self, *_args):
119113
buglog("undo")
@@ -131,7 +125,7 @@ def on_name_entry_toggled(self, *_args):
131125
if self.name_entry_toggle.get_active():
132126
self.value_stack.set_visible_child(self.name_entry)
133127
else:
134-
self.update_value()
128+
self.preset.rename_preset(self.name_entry.get_text())
135129
self.value_stack.set_visible_child(self.apply_button)
136130

137131
def on_report_btn_clicked(self, *_args):
@@ -163,16 +157,8 @@ def on_remove_button_clicked(self, *_args):
163157

164158
try:
165159
os.rename(
166-
os.path.join(
167-
presets_dir,
168-
self.prefix,
169-
to_slug_case(self.preset.filename) + ".json",
170-
),
171-
os.path.join(
172-
presets_dir,
173-
self.prefix,
174-
to_slug_case(self.preset.filename) + ".json.to_delete",
175-
),
160+
self.preset.preset_path,
161+
self.preset.preset_path + ".to_delete",
176162
)
177163

178164
self.set_name(self.name + "(" + _("Pending Deletion") + ")")
@@ -183,40 +169,13 @@ def on_remove_button_clicked(self, *_args):
183169
finally:
184170
self.delete_preset = True
185171

186-
def update_value(self):
187-
print(self.name_entry.get_text())
188-
old = self.preset.filename
189-
self.preset.save_preset(self.name_entry.get_text())
190-
print(os.path.join(
191-
presets_dir,
192-
self.prefix,
193-
to_slug_case(old) + ".json",
194-
))
195-
os.remove(
196-
os.path.join(
197-
presets_dir,
198-
self.prefix,
199-
to_slug_case(old) + ".json",
200-
)
201-
)
202-
203172
def on_delete_toast_dismissed(self, widget):
204173
buglog("dismissed")
205174
if self.delete_preset:
206175
buglog("delete")
207176
try:
208-
buglog(os.path.join(
209-
presets_dir,
210-
self.prefix,
211-
to_slug_case(self.preset.filename) + ".json.to_delete",
212-
))
213-
os.remove(
214-
os.path.join(
215-
presets_dir,
216-
self.prefix,
217-
to_slug_case(self.preset.filename) + ".json.to_delete",
218-
)
219-
)
177+
buglog(self.preset.preset_path + ".to_delete")
178+
os.remove(self.preset.preset_path + ".to_delete")
220179
except Exception as exception:
221180
buglog(exception)
222181
self.toast_overlay.add_toast(
@@ -228,16 +187,8 @@ def on_delete_toast_dismissed(self, widget):
228187
buglog("undo")
229188
try:
230189
os.rename(
231-
os.path.join(
232-
presets_dir,
233-
self.prefix,
234-
to_slug_case(self.preset.filename) + ".json.to_delete",
235-
),
236-
os.path.join(
237-
presets_dir,
238-
self.prefix,
239-
to_slug_case(self.preset.filename) + ".json",
240-
),
190+
self.preset.preset_path + ".to_delete",
191+
self.preset.preset_path
241192
)
242193
except Exception as exception:
243194
buglog(exception)

gradience/ui/presets_manager_window.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def on_file_chooser_response(self, widget, response):
276276
if response == Gtk.ResponseType.ACCEPT:
277277
if preset_file.endswith(".json"):
278278

279-
if preset_file.strip(".json") in self.custom_presets:
279+
if preset_file in self.custom_presets:
280280
self.toast_overlay.add_toast(
281281
Adw.Toast(title=_("Preset already exists"))
282282
)
@@ -285,6 +285,7 @@ def on_file_chooser_response(self, widget, response):
285285
self.preset_path.get_path(),
286286
os.path.join(
287287
presets_dir,
288+
"user",
288289
preset_file,
289290
),
290291
)
@@ -311,6 +312,7 @@ def reload_pref_group(self):
311312
}
312313

313314
for repo in Path(presets_dir).iterdir():
315+
buglog(f"presets_dir.iterdir: {repo}")
314316
if repo.is_dir(): # repo
315317
presets_list = {}
316318
for file_name in repo.iterdir():
@@ -328,10 +330,11 @@ def reload_pref_group(self):
328330
raise KeyError("variables")
329331
if preset.get("palette") is None:
330332
raise KeyError("palette")
331-
presets_list[file_name.replace(".json", "")] = preset[
333+
presets_list[file_name] = preset[
332334
"name"
333335
]
334-
except Exception:
336+
except Exception as e:
337+
buglog(f"reload_pref_group exception: {e}")
335338
self.toast_overlay.add_toast(
336339
Adw.Toast(title=_("Failed to load preset"))
337340
)
@@ -358,10 +361,11 @@ def reload_pref_group(self):
358361
raise KeyError("variables")
359362
if preset.get("palette") is None:
360363
raise KeyError("palette")
361-
presets_list["user"][file_name.replace(".json", "")] = preset[
364+
presets_list["user"][file_name] = preset[
362365
"name"
363366
]
364-
except Exception:
367+
except Exception as e:
368+
buglog(f"reload_pref_group exception: {e}")
365369
self.toast_overlay.add_toast(
366370
Adw.Toast(title=_("Failed to load preset"))
367371
)
@@ -399,7 +403,7 @@ def reload_pref_group(self):
399403
for repo, presets in self.custom_presets.items():
400404
for preset_file, preset_name in presets.items():
401405
row = GradiencePresetRow(
402-
preset_name, self, repo)
406+
preset_name, preset_file, self, repo)
403407
self.preset_list.add(row)
404408

405409
else:

gradience/utils/preset.py

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -37,40 +37,36 @@ class Preset:
3737
"gtk3": "",
3838
}
3939
plugins = {}
40-
repo = "user"
4140
display_name = "New Preset"
42-
filename = "new_preset"
41+
preset_path = "new_preset"
4342
badges = {}
4443

45-
def __init__(self, name=None, repo=None, preset_path=None, text=None, preset=None):
46-
if text: # load from resource
44+
def __init__(self, preset_path=None, text=None, preset=None):
45+
if preset_path:
46+
self.load_preset(preset_path=preset_path)
47+
elif text: # load from resource
4748
self.load_preset(text=text)
4849
elif preset: # css or dict
4950
self.load_preset(preset=preset)
5051
else:
51-
if name is not None:
52-
self.filename = to_slug_case(name)
53-
if repo is not None:
54-
self.repo = repo
55-
if preset_path is None:
56-
self.preset_path = os.path.join(
57-
presets_dir, repo, self.filename + ".json")
58-
else:
59-
self.preset_path = preset_path
60-
self.load_preset()
52+
raise Exception("Failed to create a new Preset object: Preset created without content")
6153

62-
def load_preset(self, text=None, preset=None):
54+
def load_preset(self, preset_path=None, text=None, preset=None):
6355
try:
6456
if not preset:
6557
if text:
6658
preset_text = text
67-
else:
59+
elif preset_path:
60+
self.preset_path = preset_path
6861
with open(self.preset_path, "r", encoding="utf-8") as file:
6962
preset_text = file.read()
63+
file.close()
64+
else:
65+
raise Exception("load_preset must be called with a path, text, or preset")
66+
7067
preset = json.loads(preset_text)
7168

7269
self.display_name = preset["name"]
73-
self.filename = to_slug_case(self.display_name)
7470
self.variables = preset["variables"]
7571
self.palette = preset["palette"]
7672

@@ -84,18 +80,34 @@ def load_preset(self, text=None, preset=None):
8480
else:
8581
for app_type in settings_schema["custom_css_app_types"]:
8682
self.custom_css[app_type] = ""
87-
except Exception as error:
88-
buglog(error, " -> preset : ", self.preset_path)
83+
except Exception as e:
84+
if self.preset_path:
85+
buglog(f"Failed to load preset {self.preset_path}. Exc: {e}")
86+
else:
87+
buglog(f"Failed to load preset with unknown path. Exc: {e}")
88+
89+
# Rename an existing preset
90+
def rename_preset(self, name):
91+
self.display_name = name
92+
old_path = self.preset_path
93+
self.preset_path = os.path.join(
94+
os.path.dirname(self.preset_path),
95+
to_slug_case(name) + ".json")
8996

97+
self.save_preset(to=self.preset_path)
98+
os.remove(old_path)
99+
100+
# Save a new user preset (or overwrite one)
90101
def save_preset(self, name=None, plugins_list=None, to=None):
91102
self.display_name = name if name else self.display_name
92-
self.filename = to_slug_case(name) if name else self.filename
93103

94104
if to is None:
105+
filename = to_slug_case(name) if name else "new_preset"
95106
self.preset_path = os.path.join(
96-
presets_dir, self.repo, self.filename + ".json")
107+
presets_dir, "user", filename + ".json")
97108
else:
98109
self.preset_path = to
110+
99111
if not os.path.exists(
100112
os.path.join(
101113
presets_dir,
@@ -114,13 +126,7 @@ def save_preset(self, name=None, plugins_list=None, to=None):
114126
else:
115127
plugins_list = plugins_list.save()
116128

117-
print(self.preset_path)
118-
119-
with open(
120-
self.preset_path,
121-
"w",
122-
encoding="utf-8",
123-
) as file:
129+
with open(self.preset_path, "w", encoding="utf-8") as file:
124130
object_to_write = {
125131
"name": self.display_name,
126132
"variables": self.variables,
@@ -129,12 +135,7 @@ def save_preset(self, name=None, plugins_list=None, to=None):
129135
"plugins": plugins_list,
130136
}
131137
file.write(json.dumps(object_to_write, indent=4))
138+
file.close()
132139

133140
def validate(self):
134141
return True
135-
136-
137-
if __name__ == "__main__":
138-
p = Preset("test", "user")
139-
buglog(p.variables)
140-
buglog(p.palette)

gradience/utils/repo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,5 @@ def get_presets(self):
3333
presets = {}
3434
for preset in os.listdir(self.path):
3535
if preset.endswith(".json"):
36-
presets[preset[:-5]] = Preset(preset[:-5], self.name)
36+
presets[preset[:-5]] = Preset(os.path.join(self.path, preset))
3737
return presets

po/Gradience.pot

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ msgid ""
88
msgstr ""
99
"Project-Id-Version: PACKAGE VERSION\n"
1010
"Report-Msgid-Bugs-To: \n"
11-
"POT-Creation-Date: 2022-11-20 12:14+0000\n"
11+
"POT-Creation-Date: 2022-11-20 12:26+0000\n"
1212
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -585,19 +585,19 @@ msgstr ""
585585
msgid "Add to Favorites"
586586
msgstr ""
587587

588-
#: gradience/ui/preset_row.py:156
588+
#: gradience/ui/preset_row.py:150
589589
msgid "Preset removed"
590590
msgstr ""
591591

592-
#: gradience/ui/preset_row.py:157
592+
#: gradience/ui/preset_row.py:151
593593
msgid "Undo"
594594
msgstr ""
595595

596-
#: gradience/ui/preset_row.py:178
596+
#: gradience/ui/preset_row.py:164
597597
msgid "Pending Deletion"
598598
msgstr ""
599599

600-
#: gradience/ui/preset_row.py:223
600+
#: gradience/ui/preset_row.py:182
601601
msgid "Unable to delete preset"
602602
msgstr ""
603603

0 commit comments

Comments
 (0)