fix: window freez when delete

This commit is contained in:
0xMRTT 2022-09-14 16:55:35 +02:00
parent 94e7111c4e
commit 06b848a1c3
No known key found for this signature in database
GPG key ID: AC9E06BF3DECB6FB
6 changed files with 151 additions and 121 deletions

View file

@ -8,7 +8,7 @@ template GradiencePluginRow : Adw.ActionRow {
tooltip-text: _("Enable plugin");
state-set => on_switch_toggled();
}
[suffix]
Button settings-button {
valign: center;
@ -26,4 +26,4 @@ template GradiencePluginRow : Adw.ActionRow {
}
}
}

View file

@ -1,41 +1,98 @@
using Gtk 4.0;
using Adw 1;
Popover pop_actions {
styles [
"menu",
]
Box {
orientation: vertical;
margin-top: 6;
margin-bottom: 6;
margin-start: 6;
margin-end: 6;
Button remove_button {
valign: center;
label: _("Remove preset");
tooltip-text: _("Remove preset");
clicked => on_remove_button_clicked();
}
Separator {
}
.GtkModelButton btn_report {
text: _("Report a Bug…");
}
}
}
template GradiencePresetRow : Adw.ActionRow {
[suffix]
Stack value_stack {
valign: center;
hhomogeneous: false;
interpolate-size: true;
transition-type: crossfade;
Box {
spacing: 6;
Button apply_button {
Label label_grade {
valign: center;
icon-name: "checkmark-small-symbolic";
tooltip-text: _("Apply preset");
clicked => on_apply_button_clicked();
label: _("Unknown");
styles [
"tag",
"caption",
]
}
Entry name_entry {
text: "Name";
changed => on_name_entry_changed();
Separator {
margin-top: 12;
margin-bottom: 12;
}
}
[suffix]
ToggleButton name_entry_toggle {
valign: center;
icon-name: "document-edit-symbolic";
tooltip-text: _("Edit preset name");
Stack value_stack {
valign: center;
hhomogeneous: false;
interpolate-size: true;
transition-type: crossfade;
Button apply_button {
valign: center;
icon-name: "checkmark-small-symbolic";
tooltip-text: _("Apply preset");
clicked => on_apply_button_clicked();
styles [
"flat",
]
}
Entry name_entry {
text: "Name";
changed => on_name_entry_changed();
}
}
ToggleButton name_entry_toggle {
valign: center;
icon-name: "document-edit-symbolic";
tooltip-text: _("Edit preset name");
toggled => on_name_entry_toggled();
styles [
"flat",
]
}
MenuButton {
valign: center;
popover: pop_actions;
icon-name: "view-more-symbolic";
styles [
"flat",
]
}
toggled => on_name_entry_toggled();
}
[suffix]
Button remove_button {
valign: center;
icon-name: "edit-delete-symbolic";
tooltip-text: _("Remove preset");
clicked => on_remove_button_clicked();
}
}

View file

@ -26,6 +26,11 @@ import aiohttp
import asyncio
PRESET_DIR = os.path.join(
os.environ.get("XDG_CONFIG_HOME", os.environ["HOME"] + "/.config"),
"presets",
)
async def main(repo):
async with aiohttp.ClientSession() as session:
@ -81,12 +86,16 @@ async def _download_preset(name, repo_name, url) -> None:
data = json.dumps(raw)
print(os.path.join(
PRESET_DIR,
repo_name,
to_slug_case(name) + ".json",
))
try:
with open(
os.path.join(
os.environ.get("XDG_CONFIG_HOME",
os.environ["HOME"] + "/.config"),
"presets",
PRESET_DIR,
repo_name,
to_slug_case(name) + ".json",
),
@ -94,7 +103,6 @@ async def _download_preset(name, repo_name, url) -> None:
encoding="utf-8",
) as f:
f.write(data)
f.close()
except OSError as error:
buglog(f"Failed to write data to a file. Exc: {error}")

View file

@ -18,6 +18,8 @@ class Preset:
"gtk3": "",
}
plugins = {}
repo = "user"
name = "new_preset"
def __init__(self, name=None, repo=None, preset_path=None, text=None, preset=None):
if text: # load from ressource
@ -26,13 +28,9 @@ class Preset:
self.load_preset(preset=preset)
else:
self.preset_name = name
if name is None:
self.name = "new_preset"
else:
if name is not None:
self.name = to_slug_case(name)
if repo is None:
self.repo = "user"
else:
if repo is not None:
self.repo = repo
if preset_path is None:
self.preset_path = os.path.join(PRESET_DIR, repo, self.name + ".json")
@ -70,6 +68,10 @@ class Preset:
buglog(error, " -> preset : ", self.preset_path)
def save_preset(self, name=None, plugins_list=None, to=None):
if to is None:
self.preset_path = os.path.join(PRESET_DIR, self.repo, self.name + ".json")
else:
self.preset_path = to
if not os.path.exists(
os.path.join(
PRESET_DIR,

View file

@ -21,9 +21,11 @@ import os
from gi.repository import Gtk, Adw
from gradience.modules.custom_presets import PRESET_DIR
from .constants import rootdir
from .modules.utils import to_slug_case, buglog
from .modules.preset import Preset
@Gtk.Template(resource_path=f"{rootdir}/ui/preset_row.ui")
class GradiencePresetRow(Adw.ActionRow):
@ -52,6 +54,8 @@ class GradiencePresetRow(Adw.ActionRow):
self.win = win
self.toast_overlay = self.win.toast_overlay
self.preset = Preset(name, repo_name)
apply_button = Gtk.Template.Child("apply_button")
rename_button = Gtk.Template.Child("rename_button")
@ -89,100 +93,53 @@ class GradiencePresetRow(Adw.ActionRow):
self.delete_toast = Adw.Toast(title=_("Preset removed"))
self.delete_toast.set_button_label(_("Undo"))
self.delete_toast.connect("dismissed", self.on_delete_toast_dismissed)
self.delete_toast.connect(
"button-clicked", self.on_undo_button_clicked)
self.toast_overlay.add_toast(self.delete_toast)
self.win.old_name = self.name
self.do_delete_preset()
self.win.reload_pref_group()
def update_value(self):
with open(
os.path.join(
os.environ.get("XDG_CONFIG_HOME",
os.environ["HOME"] + "/.config"),
"presets",
self.prefix,
to_slug_case(self.old_name) + ".json",
),
"r",
encoding="utf-8",
) as file:
preset_text = file.read()
preset = json.loads(preset_text)
preset_name = preset["name"]
variables = preset["variables"]
palette = preset["palette"]
if "custom_css" in preset:
custom_css = preset["custom_css"]
else:
custom_css = {
"gtk4": "",
"gtk3": "",
}
with open(
os.path.join(
os.environ.get("XDG_CONFIG_HOME",
os.environ["HOME"] + "/.config"),
"presets",
self.prefix,
to_slug_case(self.name) + ".json",
),
"w",
encoding="utf-8",
) as file:
object_to_write = {
"name": self.name,
"variables": variables,
"palette": palette,
"custom_css": custom_css,
}
file.write(json.dumps(object_to_write, indent=4))
os.remove(
try:
os.rename(
os.path.join(
os.environ.get("XDG_CONFIG_HOME",
os.environ["HOME"] + "/.config"),
os.environ.get(
"XDG_CONFIG_HOME", os.environ["HOME"] + "/.config"
),
"presets",
self.prefix,
to_slug_case(self.old_name) + ".json",
)
),
os.path.join(
os.environ.get(
"XDG_CONFIG_HOME", os.environ["HOME"] + "/.config"
),
"presets",
self.prefix,
to_slug_case(self.old_name) + ".json.to_delete",
),
)
self.old_name = self.name
def do_delete_preset(self):
if self.delete_preset:
try:
os.rename(
os.path.join(
os.environ.get(
"XDG_CONFIG_HOME", os.environ["HOME"] + "/.config"
),
"presets",
self.prefix,
to_slug_case(self.old_name) + ".json",
),
os.path.join(
os.environ.get(
"XDG_CONFIG_HOME", os.environ["HOME"] + "/.config"
),
"presets",
self.prefix,
to_slug_case(self.old_name) + ".json.to_delete",
),
)
except Exception as exception:
buglog(exception)
finally:
self.win.reload_pref_group()
print("rename")
self.set_name(self.name + "(" +_("Pending deletion") + ")")
print("renamed")
except Exception as exception:
buglog(exception)
self.delete_preset = True
#self.win.reload_pref_group()
def update_value(self):
self.preset.preset_name = self.name
self.preset.name = to_slug_case(self.name)
self.preset.save_preset()
os.remove(
os.path.join(
PRESET_DIR,
self.prefix,
to_slug_case(self.old_name) + ".json",
)
)
self.old_name = self.name
def on_delete_toast_dismissed(self, widget):
if self.delete_preset:
try:

View file

@ -279,6 +279,7 @@ class GradiencePresetWindow(Adw.Window):
self.reload_pref_group()
def reload_pref_group(self):
print("reload")
preset_directory = os.path.join(
os.environ.get("XDG_CONFIG_HOME", os.environ["HOME"] + "/.config"),
"presets",
@ -348,6 +349,8 @@ class GradiencePresetWindow(Adw.Window):
self.installed.remove(self.preset_list)
self.installed.remove(self.builtin_preset_list)
print("reload 2")
self.builtin_preset_list = Adw.PreferencesGroup()
self.builtin_preset_list.set_title(_("Builtin Presets"))
for preset, preset_name in self.builtin_presets.items():
@ -372,6 +375,8 @@ class GradiencePresetWindow(Adw.Window):
)
buglog(f"preset_check: {presets_check}")
print("reload 3")
if presets_check:
for repo, presets in self.custom_presets.items():
for preset, preset_name in presets.items():
@ -387,6 +392,7 @@ class GradiencePresetWindow(Adw.Window):
)
self.preset_list.add(self.preset_empty)
self.installed.add(self.preset_list)
print("reload end")
def reload_repos_group(self):
self.repos.remove(self.repos_list)