From 2a1fb3d4a2bcb2169554cde139397125e276d5ff Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 27 Dec 2020 20:58:41 -0600 Subject: [PATCH 01/24] Remove unnecessary separate import --- wpgtk/data/themer.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/wpgtk/data/themer.py b/wpgtk/data/themer.py index 6ebc35a4..43d8d73a 100644 --- a/wpgtk/data/themer.py +++ b/wpgtk/data/themer.py @@ -1,7 +1,6 @@ import pywal import shutil import logging -from os.path import realpath, basename from os import remove, path, symlink from subprocess import Popen @@ -14,8 +13,8 @@ def create_theme(filepath): """create a colors-scheme from a filepath""" - filepath = realpath(filepath) - filename = basename(filepath).replace(" ", "_") + filepath = path.realpath(filepath) + filename = path.basename(filepath).replace(" ", "_") tmplink = path.join(WALL_DIR, ".tmp.link") symlink(filepath, tmplink) @@ -48,8 +47,8 @@ def set_theme(wallpaper, colorscheme, restore=False): if set_wall: filepath = path.join(WALL_DIR, wallpaper) - set_wall = filepath if path.isfile(filepath) else colors["wallpaper"] - pywal.wallpaper.change(set_wall) + imagepath = filepath if path.isfile(filepath) else colors["wallpaper"] + pywal.wallpaper.change(imagepath) files.write_script(wallpaper, colorscheme) files.change_current(wallpaper) @@ -66,7 +65,7 @@ def delete_theme(filename): def get_current(): - image = basename(realpath(path.join(WPG_DIR, '.current'))) + image = path.basename(path.realpath(path.join(WPG_DIR, '.current'))) return image @@ -84,8 +83,8 @@ def reset_theme(theme_name): def import_theme(wallpaper, json_file, theme=False): """import a colorscheme from a JSON file either in terminal.sexy or pywal format""" - json_file = realpath(json_file) - filename = basename(json_file) + json_file = path.realpath(json_file) + filename = path.basename(json_file) if theme: theme = pywal.theme.file(filename) From 57cddc57f0ede37bf42ba1dcf777d36ed69bd631 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 27 Dec 2020 20:59:00 -0600 Subject: [PATCH 02/24] Remove unused methods --- wpgtk/gui/color_grid.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/wpgtk/gui/color_grid.py b/wpgtk/gui/color_grid.py index bc9d2744..2c61e095 100644 --- a/wpgtk/gui/color_grid.py +++ b/wpgtk/gui/color_grid.py @@ -202,13 +202,6 @@ def render_sample(self): height=300) self.sample.set_from_pixbuf(self.pixbuf_sample) - def update_combo(self, option_list): - self.option_combo.set_model(option_list) - self.option_combo.set_entry_text_column(0) - - def set_edit_combo(self, x): - self.option_combo.set_active(x) - def on_ok_click(self, widget): current_walls = files.get_file_list() if len(current_walls) > 0: From 394fc2bc344cb41c4c252ab6b4e3335cad47106d Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 27 Dec 2020 21:00:13 -0600 Subject: [PATCH 03/24] Update button labels --- wpgtk/gui/template_grid.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wpgtk/gui/template_grid.py b/wpgtk/gui/template_grid.py index 5cea2642..b70409ee 100644 --- a/wpgtk/gui/template_grid.py +++ b/wpgtk/gui/template_grid.py @@ -39,8 +39,8 @@ def __init__(self, parent): self.button_add.connect('clicked', self.on_add_clicked) self.button_rm = Gtk.Button('Remove') self.button_rm.connect('clicked', self.on_rm_clicked) - self.button_open = Gtk.Button('Edit') - self.button_open.connect('clicked', self.on_open_clicked) + self.button_edit = Gtk.Button('Edit') + self.button_edit.connect('clicked', self.on_open_clicked) self.liststore = Gtk.ListStore(Pixbuf, str) self.file_view = Gtk.IconView.new() @@ -64,8 +64,8 @@ def __init__(self, parent): self.liststore.append([pixbuf, filen]) self.grid_edit.attach(self.button_add, 0, 0, 2, 1) - self.grid_edit.attach(self.button_rm, 0, 1, 1, 1) - self.grid_edit.attach(self.button_open, 1, 1, 1, 1) + self.grid_edit.attach(self.button_edit, 0, 1, 1, 1) + self.grid_edit.attach(self.button_rm, 1, 1, 1, 1) self.grid_edit.attach(self.scroll, 0, 2, 2, 1) self.attach(self.grid_edit, 0, 0, 1, 1) From 32b4c750023d344ffdfac8e8a9b85aade12d9e30 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 27 Dec 2020 21:01:03 -0600 Subject: [PATCH 04/24] Small formatting fix in dictionary --- wpgtk/data/color.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wpgtk/data/color.py b/wpgtk/data/color.py index 93ea70a0..ccf880a4 100755 --- a/wpgtk/data/color.py +++ b/wpgtk/data/color.py @@ -248,8 +248,10 @@ def get_color_dict(cdic): } try: - user_words = {k: v.format(**all_colors) - for k, v in user_keywords.items()} + user_words = { + k: v.format(**all_colors) + for k, v in user_keywords.items() + } all_colors = {**all_colors, **user_words} except KeyError as e: From 299c6a140a8e4d04fec6ea7c9c385c2164e4abc8 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 27 Dec 2020 21:02:35 -0600 Subject: [PATCH 05/24] Remove unused condition and function call --- wpgtk/gui/theme_picker.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index c760e75d..1c4d2d26 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -194,7 +194,3 @@ def run(args): win.connect('delete-event', Gtk.main_quit) win.show_all() Gtk.main() - - -if __name__ == '__main__': - run() From 8c077cb8ddabe65f5ba568f3460c9323863819c9 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 27 Dec 2020 21:16:52 -0600 Subject: [PATCH 06/24] Change file permission in script creation function, formatting --- wpgtk/data/files.py | 17 +++++++++++++---- wpgtk/data/themer.py | 4 +--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/wpgtk/data/files.py b/wpgtk/data/files.py index dbf2a348..98a2c92a 100644 --- a/wpgtk/data/files.py +++ b/wpgtk/data/files.py @@ -2,18 +2,27 @@ import shutil import re import logging +from subprocess import Popen from pywal.colors import cache_fname, list_backends -from .config import settings, WALL_DIR, WPG_DIR, OPT_DIR, SAMPLE_DIR from os.path import join, basename +from .config import ( + settings, + WALL_DIR, + WPG_DIR, + OPT_DIR, + SAMPLE_DIR, + KEYWORD_DIR +) def get_file_list(path=WALL_DIR, images=True): """gets filenames in a given directory, optional parameters for image filter.""" - valid = re.compile(r"^[^\.](.*\.png$|.*\.jpg$|.*\.jpeg$|.*\.jpe$|.*\.gif$)") files = [] + valid = re.compile( + r"^[^\.](.*\.png$|.*\.jpg$|.*\.jpeg$|.*\.jpe$|.*\.gif$)") for _, _, filenames in os.walk(path): files.extend(filenames) @@ -39,6 +48,7 @@ def write_script(wallpaper, colorscheme): with open(join(WPG_DIR, "wp_init.sh"), "w") as script: command = "wpg %s '%s' '%s'" % (flags, wallpaper, colorscheme) script.writelines(["#!/usr/bin/env bash\n", command]) + Popen(['chmod', '+x', join(WPG_DIR, "wp_init.sh")]) def get_cache_path(wallpaper, backend=None): @@ -79,8 +89,7 @@ def add_template(cfile, bfile=None): src_file = bfile if bfile else cfile shutil.copy2(src_file, join(OPT_DIR, template_name)) - os.symlink(cfile, join(OPT_DIR, - template_name.replace(".base", ""))) + os.symlink(cfile, join(OPT_DIR, template_name.replace(".base", ""))) logging.info("created backup %s.bak" % cfile) logging.info("added %s @ %s" % (template_name, cfile)) diff --git a/wpgtk/data/themer.py b/wpgtk/data/themer.py index 43d8d73a..d43c27fa 100644 --- a/wpgtk/data/themer.py +++ b/wpgtk/data/themer.py @@ -53,10 +53,8 @@ def set_theme(wallpaper, colorscheme, restore=False): files.write_script(wallpaper, colorscheme) files.change_current(wallpaper) - Popen(['chmod', '+x', path.join(WPG_DIR, "wp_init.sh")]) - if settings.getboolean('execute_cmd', False) and not restore: - Popen(['bash', '-c', settings['command']]) + Popen(settings['command'].split()) def delete_theme(filename): From 5e1e907d7fa0631252337a6abd317e1138100cee Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 10 Jan 2021 18:05:17 -0600 Subject: [PATCH 07/24] Update documentation on methods --- wpgtk/data/color.py | 7 ++++--- wpgtk/data/sample.py | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/wpgtk/data/color.py b/wpgtk/data/color.py index ccf880a4..f9582f6d 100755 --- a/wpgtk/data/color.py +++ b/wpgtk/data/color.py @@ -261,9 +261,10 @@ def get_color_dict(cdic): return {k: pywal.util.Color(v) for k, v in all_colors.items()} -def apply_colorscheme(colors): - color_dict = get_color_dict(colors) - +def apply_colorscheme(color_dict): + """Receives a colorscheme dict ensambled by + color.get_color_dict as argument and applies it + system-wide.""" if os.path.isfile(FILE_DIC["icon-step2"]): change_colors(color_dict, "icon-step1") Popen(FILE_DIC["icon-step2"]) diff --git a/wpgtk/data/sample.py b/wpgtk/data/sample.py index 3fe62964..25ee6a33 100755 --- a/wpgtk/data/sample.py +++ b/wpgtk/data/sample.py @@ -10,6 +10,7 @@ def create_sample(colors, f=os.path.join(WALL_DIR, ".tmp.sample.png")): + """Creates sample image from a pywal color dictionary""" im = Image.new("RGB", (480, 50), "white") pix = im.load() width_sample = im.size[0]//(len(colors)//2) From 5501a984bbd3b9c8b1ad8ab7b19706fb2e3716c6 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 10 Jan 2021 18:12:30 -0600 Subject: [PATCH 08/24] Remove deprecated update_template functionality --- wpgtk/__main__.py | 11 ----------- wpgtk/data/files.py | 26 -------------------------- 2 files changed, 37 deletions(-) diff --git a/wpgtk/__main__.py b/wpgtk/__main__.py index 68cceeca..28163fce 100755 --- a/wpgtk/__main__.py +++ b/wpgtk/__main__.py @@ -122,11 +122,6 @@ def read_args(args): help="preview your current colorscheme", action="store_true") - parser.add_argument("--update", - help="update template(s) of your choice " - "to the new format", - nargs="+") - parser.add_argument("--noreload", help="Skip reloading other software after" "applying colorscheme", @@ -295,12 +290,6 @@ def process_args(args): print("\n".join(pywal.colors.list_backends())) exit(0) - if args.update: - for arg in args.update: - if arg.endswith(".base"): - files.update_template(arg) - exit(0) - if args.noreload: settings["reload"] = "false" diff --git a/wpgtk/data/files.py b/wpgtk/data/files.py index 98a2c92a..5f350b2b 100644 --- a/wpgtk/data/files.py +++ b/wpgtk/data/files.py @@ -121,32 +121,6 @@ def delete_colorschemes(wallpaper): pass -def update_color(matchobj): - if matchobj.group(1): - return "{%s}" % matchobj.group(1).lower() - - -def update_template(template_path): - tmp_data = "" - - with open(template_path, "r") as f: - tmp_data = f.read() - - logging.info("escaping legitimate curly braces {} -> {{}}") - tmp_data = tmp_data.replace("{", "{{") - tmp_data = tmp_data.replace("}", "}}") - - logging.info("replacing # with braces {colorxx}") - tmp_data = re.sub(r"#<(COLOR[0-9]{1,2})>", update_color, tmp_data) - tmp_data = tmp_data.replace("#", "{active}") - tmp_data = tmp_data.replace("#", "{inactive}") - - with open(template_path, "w") as f: - logging.info("writting %s" % template_path) - f.write(tmp_data) - logging.info("%s update complete" % template_path) - - def change_current(filename): """update symlink to point to the current wallpaper""" os.symlink(join(WALL_DIR, filename), join(WPG_DIR, ".currentTmp")) From c42f672825ec0c589fdfb12fd44ebbd70ed67ae5 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 10 Jan 2021 18:36:10 -0600 Subject: [PATCH 09/24] Add logic for per "colorscheme" user-defined keyword set --- wpgtk/data/color.py | 24 ++++++------ wpgtk/data/config.py | 2 + wpgtk/data/files.py | 19 ++++++++-- wpgtk/data/keywords.py | 83 +++++++++++++++++++++++++++++++++--------- wpgtk/data/themer.py | 2 +- 5 files changed, 97 insertions(+), 33 deletions(-) diff --git a/wpgtk/data/color.py b/wpgtk/data/color.py index f9582f6d..68628016 100755 --- a/wpgtk/data/color.py +++ b/wpgtk/data/color.py @@ -8,8 +8,9 @@ from subprocess import Popen from random import shuffle, randint -from .config import settings, user_keywords +from .config import settings from .config import WALL_DIR, WPG_DIR, FILE_DIC, OPT_DIR +from . import keywords from . import files from . import util from . import sample @@ -230,27 +231,28 @@ def keyword_colors(hexc, is_dark_theme=True): } -def get_color_dict(cdic): - """ensamble wpgtk color dictionary""" +def get_color_dict(pywal_colors, colorscheme): + """ensamble wpgtk color dictionary from pywal color dictionary""" index = settings.getint("active") index = index if index > 0 else randint(9, 14) - base_color = cdic["colors"]["color%s" % index] - color_list = list(cdic["colors"].values()) + base_color = pywal_colors["colors"]["color%s" % index] + color_list = list(pywal_colors["colors"].values()) + key_parser = keywords.get_keywords_parser(colorscheme) all_colors = { - "wallpaper": cdic["wallpaper"], - "alpha": cdic["alpha"], - **cdic["special"], - **cdic["colors"], - **add_icon_colors(cdic), + "wallpaper": pywal_colors["wallpaper"], + "alpha": pywal_colors["alpha"], + **pywal_colors["special"], + **pywal_colors["colors"], + **add_icon_colors(pywal_colors), **keyword_colors(base_color, is_dark_theme(color_list)) } try: user_words = { k: v.format(**all_colors) - for k, v in user_keywords.items() + for k, v in key_parser['keywords'].items() } all_colors = {**all_colors, **user_words} diff --git a/wpgtk/data/config.py b/wpgtk/data/config.py index 386c2dc4..82cbc3ea 100644 --- a/wpgtk/data/config.py +++ b/wpgtk/data/config.py @@ -19,6 +19,7 @@ WALL_DIR = os.path.join(WPG_DIR, "wallpapers") SAMPLE_DIR = os.path.join(WPG_DIR, "samples") SCHEME_DIR = os.path.join(WPG_DIR, "schemes") +KEYWORD_DIR = os.path.join(WPG_DIR, "keywords") FORMAT_DIR = os.path.join(CACHE, "wal") OPT_DIR = os.path.join(WPG_DIR, "templates") FILE_DIC = { @@ -52,6 +53,7 @@ def load_settings(): os.makedirs(SAMPLE_DIR, exist_ok=True) os.makedirs(SCHEME_DIR, exist_ok=True) os.makedirs(FORMAT_DIR, exist_ok=True) + os.makedirs(KEYWORD_DIR, exist_ok=True) os.makedirs(OPT_DIR, exist_ok=True) try: diff --git a/wpgtk/data/files.py b/wpgtk/data/files.py index 5f350b2b..5367d448 100644 --- a/wpgtk/data/files.py +++ b/wpgtk/data/files.py @@ -72,6 +72,16 @@ def get_sample_path(wallpaper, backend=None): return join(SAMPLE_DIR, sample_filename) +def get_keywords_path(wallpaper, backend=None): + """gets the path of the keywords file of a theme""" + if not backend: + backend = settings.get("backend", "wal") + + keywords_filename = "%s_%s_keywords.conf" % (wallpaper, backend) + + return join(KEYWORD_DIR, keywords_filename) + + def add_template(cfile, bfile=None): """adds a new base file from a config file to wpgtk or re-establishes link with config file for a @@ -111,12 +121,13 @@ def delete_template(basefile): logging.error(str(e.strerror)) -def delete_colorschemes(wallpaper): - """delete all colorschemes related to the given wallpaper""" +def delete_colorschemes(colorscheme): + """delete all files related to the given colorscheme""" for backend in list_backends(): try: - os.remove(get_cache_path(wallpaper, backend)) - os.remove(get_sample_path(wallpaper, backend)) + os.remove(get_cache_path(colorscheme, backend)) + os.remove(get_sample_path(colorscheme, backend)) + os.remove(get_keywords_path(colorscheme, backend)) except OSError: pass diff --git a/wpgtk/data/keywords.py b/wpgtk/data/keywords.py index 98e912c8..360f07cf 100644 --- a/wpgtk/data/keywords.py +++ b/wpgtk/data/keywords.py @@ -1,41 +1,90 @@ -from .config import user_keywords, write_conf +import configparser +from os import path + +from .config import user_keywords +from .files import get_keywords_path KEY_LENGTH = 5 VAL_LENGTH = 2 -def update_key(old_keyword, new_keyword, save=False): - """validates and updates a keyword""" +def create_keywords_file(colorscheme): + """creates a new keywords file and sets defaults if they exist""" + parser = configparser.ConfigParser() + parser.add_section('keywords') + + for k, v in dict(user_keywords): + parser['keywords'][k] = v + + with open(get_keywords_path(colorscheme), "w") as keyword_file: + parser.write(keyword_file) + + return parser + + +def get_keywords_parser(colorscheme): + """get keyword file configparser for current wallpaper + or create one if it does not exist""" + + if path.isfile(get_keywords_path(colorscheme)): + parser = configparser.ConfigParser() + parser.read(get_keywords_path(colorscheme)) + + return parser + + else: + return create_keywords_file(colorscheme) + + +def update_key(colorscheme, old_keyword, new_keyword): + """validates and updates a keyword for a wallpaper""" if not new_keyword: raise Exception('Keyword must be longer than 5 characters') - user_keywords[new_keyword] = user_keywords[old_keyword] + parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords + keywords = parser['keywords'] + keywords[new_keyword] = keywords[old_keyword] - if(old_keyword != new_keyword): - user_keywords.pop(old_keyword, None) + if (old_keyword != new_keyword): + keywords.pop(old_keyword, None) - if save: - write_conf() + with open(get_keywords_path(colorscheme), "w") as keyword_file: + parser.write(keyword_file) -def update_value(keyword, value, save=False): +def update_value(colorscheme, keyword, value): + """update the value to replace the user defined keyword with""" if not value: raise Exception('Value must exist') - user_keywords[keyword] = value + parser = get_keywords_parser(colorscheme) + keywords = parser['keywords'] + keywords[keyword] = value - if save: - write_conf() + with open(get_keywords_path(colorscheme), "w") as keyword_file: + parser.write(keyword_file) -def create_pair(keyword, value, save=False): +def create_pair(colorscheme, keyword, value): + """create a key value pair for a wallpaper""" if not value: raise Exception('There must be a value') if not keyword: - raise Exception('There must be a value') + raise Exception('There must be a keyword') + + parser = get_keywords_parser(colorscheme) + parser['keywords'][keyword] = value + + with open(get_keywords_path(colorscheme), "w") as keyword_file: + parser.write(keyword_file) + + +def remove_pair(colorscheme, keyword): + """removes a pair of keyword value for a wallpaper""" - user_keywords[keyword] = value + parser = get_keywords_parser(colorscheme) + parser['keywords'].pop(keyword, None) - if save: - write_conf() + with open(get_keywords_path(colorscheme), "w") as keyword_file: + parser.write(keyword_file) diff --git a/wpgtk/data/themer.py b/wpgtk/data/themer.py index d43c27fa..67c9f841 100644 --- a/wpgtk/data/themer.py +++ b/wpgtk/data/themer.py @@ -39,7 +39,7 @@ def set_theme(wallpaper, colorscheme, restore=False): if not restore: pywal.export.every(colors, FORMAT_DIR) - color.apply_colorscheme(colors) + color.apply_colorscheme(color.get_color_dict(colors, colorscheme)) if reload_all: reload.all() else: From c01562772f05dd15c0211e2ffb715e0ae1e6edcc Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 10 Jan 2021 18:48:15 -0600 Subject: [PATCH 10/24] Update UI to use a wallpaper list on keyword screen --- wpgtk/gui/keyword_grid.py | 67 +++++++++++++++++++++++++++------------ wpgtk/gui/theme_picker.py | 20 ++++++++---- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/wpgtk/gui/keyword_grid.py b/wpgtk/gui/keyword_grid.py index d1071ba0..a3b0e571 100644 --- a/wpgtk/gui/keyword_grid.py +++ b/wpgtk/gui/keyword_grid.py @@ -1,5 +1,5 @@ -from ..data.config import user_keywords, write_conf from ..data import keywords +from ..data import files from gi import require_version from gi.repository import Gtk require_version("Gtk", "3.0") @@ -17,20 +17,28 @@ def __init__(self, parent): self.set_row_spacing(PAD) self.set_column_spacing(PAD) - self.liststore = Gtk.ListStore(str, str) - self.reload_keyword_list() + self.delete_button = Gtk.Button('Remove') + self.delete_button.connect('clicked', self.remove_keyword) - self.save_btn = Gtk.Button('Save') - self.save_btn.connect('clicked', self.save_keywords) + self.add_button = Gtk.Button('Add') + self.add_button.connect('clicked', self.append_new_keyword) - self.del_btn = Gtk.Button('Remove') - self.del_btn.connect('clicked', self.remove_keyword) + self.selected_file = "" + wallpaper_list = Gtk.ListStore(str) + for elem in list(files.get_file_list()): + wallpaper_list.append([elem]) - self.add_btn = Gtk.Button('Add') - self.add_btn.connect('clicked', self.append_new_keyword) + self.liststore = Gtk.ListStore(str, str) + self.reload_keyword_list() - self.status_lbl = Gtk.Label('') + self.wallpaper_combo = Gtk.ComboBox.new_with_model(wallpaper_list) + self.renderer_text = Gtk.CellRendererText() + self.wallpaper_combo.pack_start(self.renderer_text, True) + self.wallpaper_combo.add_attribute(self.renderer_text, "text", 0) + self.wallpaper_combo.set_entry_text_column(0) + self.wallpaper_combo.connect("changed", self.on_wallpaper_change) + self.status_lbl = Gtk.Label('') self.keyword_tree = Gtk.TreeView(model=self.liststore) scroll = Gtk.ScrolledWindow() @@ -38,9 +46,9 @@ def __init__(self, parent): scroll.set_min_content_height(400) scroll.add(self.keyword_tree) - self.attach(self.add_btn, 0, 0, 2, 1) - self.attach(self.save_btn, 0, 1, 1, 1) - self.attach(self.del_btn, 1, 1, 1, 1) + self.attach(self.wallpaper_combo, 0, 0, 2, 1) + self.attach(self.add_button, 0, 1, 1, 1) + self.attach(self.delete_button, 1, 1, 1, 1) self.attach(scroll, 0, 2, 2, 1) self.attach(self.status_lbl, 0, 3, 2, 1) @@ -61,36 +69,53 @@ def __init__(self, parent): def remove_keyword(self, widget): self.status_lbl.set_text('') (m, pathlist) = self.keyword_tree.get_selection().get_selected_rows() + for path in pathlist: tree_iter = m.get_iter(path) value = m.get_value(tree_iter, 0) - user_keywords.pop(value, None) + keywords.remove_pair(self.selected_file, value) self.reload_keyword_list() def text_edited(self, widget, path, text, col): self.status_lbl.set_text('') if(col == 0): try: - keywords.update_key(self.liststore[path][col], text) + keywords.update_key( + self.selected_file, + self.liststore[path][col], + text + ) except Exception as e: self.status_lbl.set_text(str(e)) else: try: - keywords.update_value(self.liststore[path][0], text) + keywords.update_value( + self.selected_file, + self.liststore[path][0], + text + ) except Exception as e: self.status_lbl.set_text(str(e)) self.reload_keyword_list() def reload_keyword_list(self): self.liststore.clear() - for k, v in user_keywords.items(): + parser = keywords.get_keywords_parser(self.selected_file) + for k, v in parser['keywords'].items(): self.liststore.append([k, v]) - def save_keywords(self, widget): - write_conf() - self.status_lbl.set_text('Saved') + def on_wallpaper_change(self, widget): + x = widget.get_active() + + current_walls = files.get_file_list() + self.selected_file = current_walls[x] + self.reload_keyword_list() def append_new_keyword(self, widget): self.status_lbl.set_text('') - keywords.create_pair('keyword' + str(len(self.liststore)), 'value') + keywords.create_pair( + self.selected_file, + 'keyword' + str(len(self.liststore)), + 'value' + ) self.reload_keyword_list() diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index 1c4d2d26..3997b6aa 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -113,6 +113,7 @@ def __init__(self, args): self.option_combo.set_active(current_idx) self.colorscheme.set_active(current_idx) self.cpage.option_combo.set_active(current_idx) + self.keypage.wallpaper_combo.set_active(current_idx) self.set_button.set_sensitive(True) def on_add_clicked(self, widget): @@ -132,16 +133,22 @@ def on_add_clicked(self, widget): response = filechooser.run() if response == Gtk.ResponseType.OK: + option_list = Gtk.ListStore(str) + for f in filechooser.get_filenames(): themer.create_theme(f) - option_list = Gtk.ListStore(str) + for elem in list(files.get_file_list()): option_list.append([elem]) + self.option_combo.set_model(option_list) self.option_combo.set_entry_text_column(0) self.colorscheme.set_model(option_list) self.colorscheme.set_entry_text_column(0) - self.cpage.update_combo(option_list) + + self.cpage.option_combo.set_model(option_list) + self.keypage.wallpaper_combo.set_model(option_list) + filechooser.destroy() def on_set_clicked(self, widget): @@ -165,8 +172,9 @@ def on_rm_clicked(self, widget): self.option_combo.set_model(option_list) self.option_combo.set_entry_text_column(0) self.colorscheme.set_model(option_list) - self.colorscheme.set_entry_text_column(0) - self.cpage.update_combo(option_list) + + self.cpage.option_combo.set_model(option_list) + self.keypage.wallpaper_combo.set_model(option_list) def combo_box_change(self, widget): self.set_button.set_sensitive(True) @@ -185,8 +193,8 @@ def combo_box_change(self, widget): def colorscheme_box_change(self, widget): x = self.colorscheme.get_active() - # set the ComboBox in color_grid - self.cpage.set_edit_combo(x) + self.cpage.option_combo.set_active(x) + self.keypage.wallpaper_combo.set_active(x) def run(args): From 31016ff91367d8af8d6bfe7f8f9b8bb12e1d88fa Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 31 Jan 2021 12:53:10 -0600 Subject: [PATCH 11/24] Use user_keywords if a colorscheme is not provided --- wpgtk/data/keywords.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/wpgtk/data/keywords.py b/wpgtk/data/keywords.py index 360f07cf..0b6c574d 100644 --- a/wpgtk/data/keywords.py +++ b/wpgtk/data/keywords.py @@ -26,6 +26,10 @@ def get_keywords_parser(colorscheme): """get keyword file configparser for current wallpaper or create one if it does not exist""" + if colorscheme == None: + parser = user_keywords + return parser + if path.isfile(get_keywords_path(colorscheme)): parser = configparser.ConfigParser() parser.read(get_keywords_path(colorscheme)) @@ -57,7 +61,7 @@ def update_value(colorscheme, keyword, value): if not value: raise Exception('Value must exist') - parser = get_keywords_parser(colorscheme) + parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords keywords = parser['keywords'] keywords[keyword] = value @@ -73,7 +77,7 @@ def create_pair(colorscheme, keyword, value): if not keyword: raise Exception('There must be a keyword') - parser = get_keywords_parser(colorscheme) + parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords parser['keywords'][keyword] = value with open(get_keywords_path(colorscheme), "w") as keyword_file: @@ -83,7 +87,7 @@ def create_pair(colorscheme, keyword, value): def remove_pair(colorscheme, keyword): """removes a pair of keyword value for a wallpaper""" - parser = get_keywords_parser(colorscheme) + parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords parser['keywords'].pop(keyword, None) with open(get_keywords_path(colorscheme), "w") as keyword_file: From b96d4a85291def4be479af87a3101fb514539808 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 3 May 2021 20:51:58 -0600 Subject: [PATCH 12/24] Streamline keyword saving between colorscheme keyword file or default --- wpgtk/data/keywords.py | 69 ++++++++++++++++++++++-------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/wpgtk/data/keywords.py b/wpgtk/data/keywords.py index 0b6c574d..75b1eda9 100644 --- a/wpgtk/data/keywords.py +++ b/wpgtk/data/keywords.py @@ -1,7 +1,7 @@ import configparser from os import path -from .config import user_keywords +from .config import user_keywords, write_conf from .files import get_keywords_path KEY_LENGTH = 5 @@ -19,76 +19,81 @@ def create_keywords_file(colorscheme): with open(get_keywords_path(colorscheme), "w") as keyword_file: parser.write(keyword_file) - return parser + return get_keywords_path(colorscheme) -def get_keywords_parser(colorscheme): +def get_keywords_section(colorscheme): """get keyword file configparser for current wallpaper or create one if it does not exist""" - if colorscheme == None: - parser = user_keywords - return parser + if colorscheme is None: + return user_keywords - if path.isfile(get_keywords_path(colorscheme)): - parser = configparser.ConfigParser() - parser.read(get_keywords_path(colorscheme)) + parser = configparser.ConfigParser() - return parser + if not path.isfile(get_keywords_path(colorscheme)): + create_keywords_file(colorscheme) - else: - return create_keywords_file(colorscheme) + parser.read(get_keywords_path(colorscheme)) + return parser['keywords'] -def update_key(colorscheme, old_keyword, new_keyword): +def update_key(old_keyword, new_keyword, colorscheme=None): """validates and updates a keyword for a wallpaper""" if not new_keyword: raise Exception('Keyword must be longer than 5 characters') - parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords - keywords = parser['keywords'] + keywords = get_keywords_section(colorscheme) keywords[new_keyword] = keywords[old_keyword] if (old_keyword != new_keyword): keywords.pop(old_keyword, None) - with open(get_keywords_path(colorscheme), "w") as keyword_file: - parser.write(keyword_file) + write_keyword_file(keywords, colorscheme) -def update_value(colorscheme, keyword, value): +def update_value(keyword, value, colorscheme=None): """update the value to replace the user defined keyword with""" if not value: raise Exception('Value must exist') - parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords - keywords = parser['keywords'] + keywords = get_keywords_section(colorscheme) keywords[keyword] = value - with open(get_keywords_path(colorscheme), "w") as keyword_file: - parser.write(keyword_file) + write_keyword_file(keywords, colorscheme) -def create_pair(colorscheme, keyword, value): +def create_pair(keyword, value, colorscheme=None): """create a key value pair for a wallpaper""" + print('hi', keyword, value, colorscheme) if not value: raise Exception('There must be a value') if not keyword: raise Exception('There must be a keyword') - parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords - parser['keywords'][keyword] = value + keywords = get_keywords_section(colorscheme) + keywords[keyword] = value - with open(get_keywords_path(colorscheme), "w") as keyword_file: - parser.write(keyword_file) + write_keyword_file(keywords, colorscheme) -def remove_pair(colorscheme, keyword): +def remove_pair(keyword, colorscheme=None): """removes a pair of keyword value for a wallpaper""" - parser = get_keywords_parser(colorscheme) if colorscheme else user_keywords - parser['keywords'].pop(keyword, None) + keywords = get_keywords_section(colorscheme) + keywords.pop(keyword, None) - with open(get_keywords_path(colorscheme), "w") as keyword_file: - parser.write(keyword_file) + write_keyword_file(keywords, colorscheme) + + +def write_keyword_file(keywords, colorscheme=None): + if colorscheme: + keywords_path = get_keywords_path(colorscheme) + parser = configparser.ConfigParser() + parser['keywords'] = keywords + + with open(keywords_path, "w") as keyword_file: + parser.write(keyword_file) + else: + write_conf() From d9dcc9936ef238b6a9f79611151504c21b3ab8ec Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 3 May 2021 20:53:00 -0600 Subject: [PATCH 13/24] Refactor order of arguments, use ComboBoxText instead of ComboBox --- wpgtk/gui/keyword_grid.py | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/wpgtk/gui/keyword_grid.py b/wpgtk/gui/keyword_grid.py index a3b0e571..a1b2f895 100644 --- a/wpgtk/gui/keyword_grid.py +++ b/wpgtk/gui/keyword_grid.py @@ -24,17 +24,14 @@ def __init__(self, parent): self.add_button.connect('clicked', self.append_new_keyword) self.selected_file = "" - wallpaper_list = Gtk.ListStore(str) + self.wallpaper_combo = Gtk.ComboBoxText() + self.wallpaper_combo.set_entry_text_column(0) for elem in list(files.get_file_list()): - wallpaper_list.append([elem]) + self.wallpaper_combo.append_text(elem) self.liststore = Gtk.ListStore(str, str) self.reload_keyword_list() - self.wallpaper_combo = Gtk.ComboBox.new_with_model(wallpaper_list) - self.renderer_text = Gtk.CellRendererText() - self.wallpaper_combo.pack_start(self.renderer_text, True) - self.wallpaper_combo.add_attribute(self.renderer_text, "text", 0) self.wallpaper_combo.set_entry_text_column(0) self.wallpaper_combo.connect("changed", self.on_wallpaper_change) @@ -73,7 +70,7 @@ def remove_keyword(self, widget): for path in pathlist: tree_iter = m.get_iter(path) value = m.get_value(tree_iter, 0) - keywords.remove_pair(self.selected_file, value) + keywords.remove_pair(value, self.selected_file) self.reload_keyword_list() def text_edited(self, widget, path, text, col): @@ -81,41 +78,38 @@ def text_edited(self, widget, path, text, col): if(col == 0): try: keywords.update_key( - self.selected_file, self.liststore[path][col], - text + text, + self.selected_file ) except Exception as e: self.status_lbl.set_text(str(e)) else: try: keywords.update_value( - self.selected_file, self.liststore[path][0], - text + text, + self.selected_file ) except Exception as e: self.status_lbl.set_text(str(e)) self.reload_keyword_list() def reload_keyword_list(self): + keyword_section = keywords.get_keywords_section(self.selected_file) self.liststore.clear() - parser = keywords.get_keywords_parser(self.selected_file) - for k, v in parser['keywords'].items(): + for k, v in keyword_section.items(): self.liststore.append([k, v]) def on_wallpaper_change(self, widget): - x = widget.get_active() - - current_walls = files.get_file_list() - self.selected_file = current_walls[x] + self.selected_file = widget.get_active_text() self.reload_keyword_list() def append_new_keyword(self, widget): self.status_lbl.set_text('') keywords.create_pair( - self.selected_file, 'keyword' + str(len(self.liststore)), - 'value' + 'value', + self.selected_file, ) self.reload_keyword_list() From dc0cd91af980a00dfb6cf3e80dc0ff2f94680fce Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 3 May 2021 20:54:57 -0600 Subject: [PATCH 14/24] Add validation to -r flag being present without -s flag --- wpgtk/__main__.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wpgtk/__main__.py b/wpgtk/__main__.py index 28163fce..0a47ee58 100755 --- a/wpgtk/__main__.py +++ b/wpgtk/__main__.py @@ -131,6 +131,10 @@ def read_args(args): def process_arg_errors(args): + if args.r and not args.s: + logging.error("invalid combination of flags, use with -s") + exit(1) + if args.m and (args.s or args.R): logging.error("invalid combination of flags") exit(1) From 27ac04eb2f75a6675a0f086b40642faec5789135 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 3 May 2021 20:58:32 -0600 Subject: [PATCH 15/24] Remove print statement use keyword_dict instead of parser --- wpgtk/data/color.py | 4 ++-- wpgtk/data/keywords.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/wpgtk/data/color.py b/wpgtk/data/color.py index 68628016..d984fe39 100755 --- a/wpgtk/data/color.py +++ b/wpgtk/data/color.py @@ -238,7 +238,7 @@ def get_color_dict(pywal_colors, colorscheme): base_color = pywal_colors["colors"]["color%s" % index] color_list = list(pywal_colors["colors"].values()) - key_parser = keywords.get_keywords_parser(colorscheme) + keyword_dict = keywords.get_keywords_section(colorscheme) all_colors = { "wallpaper": pywal_colors["wallpaper"], @@ -252,7 +252,7 @@ def get_color_dict(pywal_colors, colorscheme): try: user_words = { k: v.format(**all_colors) - for k, v in key_parser['keywords'].items() + for k, v in keyword_dict.items() } all_colors = {**all_colors, **user_words} diff --git a/wpgtk/data/keywords.py b/wpgtk/data/keywords.py index 75b1eda9..d9552a7c 100644 --- a/wpgtk/data/keywords.py +++ b/wpgtk/data/keywords.py @@ -65,7 +65,6 @@ def update_value(keyword, value, colorscheme=None): def create_pair(keyword, value, colorscheme=None): """create a key value pair for a wallpaper""" - print('hi', keyword, value, colorscheme) if not value: raise Exception('There must be a value') From 642badc8ceed74c948b513f0801d233c9200b7c1 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 20 Jun 2021 20:54:21 -0600 Subject: [PATCH 16/24] Separate keyword files from colorschemes --- wpgtk/data/files.py | 9 ++--- wpgtk/data/keywords.py | 48 +++++++++++++------------- wpgtk/gui/keyword_grid.py | 72 ++++++++++++++++++++++++++------------- wpgtk/gui/theme_picker.py | 5 --- 4 files changed, 74 insertions(+), 60 deletions(-) diff --git a/wpgtk/data/files.py b/wpgtk/data/files.py index 5367d448..9c8bb7c1 100644 --- a/wpgtk/data/files.py +++ b/wpgtk/data/files.py @@ -72,14 +72,10 @@ def get_sample_path(wallpaper, backend=None): return join(SAMPLE_DIR, sample_filename) -def get_keywords_path(wallpaper, backend=None): +def get_keywords_path(filename): """gets the path of the keywords file of a theme""" - if not backend: - backend = settings.get("backend", "wal") - - keywords_filename = "%s_%s_keywords.conf" % (wallpaper, backend) - return join(KEYWORD_DIR, keywords_filename) + return join(KEYWORD_DIR, filename) def add_template(cfile, bfile=None): @@ -127,7 +123,6 @@ def delete_colorschemes(colorscheme): try: os.remove(get_cache_path(colorscheme, backend)) os.remove(get_sample_path(colorscheme, backend)) - os.remove(get_keywords_path(colorscheme, backend)) except OSError: pass diff --git a/wpgtk/data/keywords.py b/wpgtk/data/keywords.py index d9552a7c..aaff6553 100644 --- a/wpgtk/data/keywords.py +++ b/wpgtk/data/keywords.py @@ -8,7 +8,7 @@ VAL_LENGTH = 2 -def create_keywords_file(colorscheme): +def create_keywords_file(filename): """creates a new keywords file and sets defaults if they exist""" parser = configparser.ConfigParser() parser.add_section('keywords') @@ -16,54 +16,54 @@ def create_keywords_file(colorscheme): for k, v in dict(user_keywords): parser['keywords'][k] = v - with open(get_keywords_path(colorscheme), "w") as keyword_file: + with open(get_keywords_path(filename), "w") as keyword_file: parser.write(keyword_file) - return get_keywords_path(colorscheme) + return get_keywords_path(filename) -def get_keywords_section(colorscheme): +def get_keywords_section(filename = None): """get keyword file configparser for current wallpaper or create one if it does not exist""" - - if colorscheme is None: + if filename is None: return user_keywords parser = configparser.ConfigParser() - if not path.isfile(get_keywords_path(colorscheme)): - create_keywords_file(colorscheme) + if not path.isfile(get_keywords_path(filename)): + create_keywords_file(filename) + + parser.read(get_keywords_path(filename)) - parser.read(get_keywords_path(colorscheme)) return parser['keywords'] -def update_key(old_keyword, new_keyword, colorscheme=None): +def update_key(old_keyword, new_keyword, filename=None): """validates and updates a keyword for a wallpaper""" if not new_keyword: raise Exception('Keyword must be longer than 5 characters') - keywords = get_keywords_section(colorscheme) + keywords = get_keywords_section(filename) keywords[new_keyword] = keywords[old_keyword] if (old_keyword != new_keyword): keywords.pop(old_keyword, None) - write_keyword_file(keywords, colorscheme) + write_keyword_file(keywords, filename) -def update_value(keyword, value, colorscheme=None): +def update_value(keyword, value, filename=None): """update the value to replace the user defined keyword with""" if not value: raise Exception('Value must exist') - keywords = get_keywords_section(colorscheme) + keywords = get_keywords_section(filename) keywords[keyword] = value - write_keyword_file(keywords, colorscheme) + write_keyword_file(keywords, filename) -def create_pair(keyword, value, colorscheme=None): +def create_pair(keyword, value, filename=None): """create a key value pair for a wallpaper""" if not value: raise Exception('There must be a value') @@ -71,24 +71,24 @@ def create_pair(keyword, value, colorscheme=None): if not keyword: raise Exception('There must be a keyword') - keywords = get_keywords_section(colorscheme) + keywords = get_keywords_section(filename) keywords[keyword] = value - write_keyword_file(keywords, colorscheme) + write_keyword_file(keywords, filename) -def remove_pair(keyword, colorscheme=None): +def remove_pair(keyword, filename=None): """removes a pair of keyword value for a wallpaper""" - keywords = get_keywords_section(colorscheme) + keywords = get_keywords_section(filename) keywords.pop(keyword, None) - write_keyword_file(keywords, colorscheme) + write_keyword_file(keywords, filename) -def write_keyword_file(keywords, colorscheme=None): - if colorscheme: - keywords_path = get_keywords_path(colorscheme) +def write_keyword_file(keywords, filename=None): + if filename: + keywords_path = get_keywords_path(filename) parser = configparser.ConfigParser() parser['keywords'] = keywords diff --git a/wpgtk/gui/keyword_grid.py b/wpgtk/gui/keyword_grid.py index a1b2f895..00c0d256 100644 --- a/wpgtk/gui/keyword_grid.py +++ b/wpgtk/gui/keyword_grid.py @@ -1,12 +1,12 @@ from ..data import keywords from ..data import files +from ..data.config import KEYWORD_DIR from gi import require_version from gi.repository import Gtk require_version("Gtk", "3.0") PAD = 10 - class KeywordGrid(Gtk.Grid): def __init__(self, parent): Gtk.Grid.__init__(self) @@ -23,17 +23,26 @@ def __init__(self, parent): self.add_button = Gtk.Button('Add') self.add_button.connect('clicked', self.append_new_keyword) - self.selected_file = "" - self.wallpaper_combo = Gtk.ComboBoxText() - self.wallpaper_combo.set_entry_text_column(0) - for elem in list(files.get_file_list()): - self.wallpaper_combo.append_text(elem) + self.reset_button = Gtk.Button('Reset') + # self.reset_button.connect('clicked', self.reset_keyword_file) + + self.create_button = Gtk.Button('Create') + self.create_button.connect('clicked', self.on_create_click) + + self.selected_file = None + self.keyword_file_combo = Gtk.ComboBoxText() + self.keyword_file_combo.set_entry_text_column(0) + self.keyword_file_combo.append_text('Default') + for elem in list(files.get_file_list(KEYWORD_DIR, False)): + self.keyword_file_combo.append_text(elem) + + self.keyword_file_combo.set_active(0) self.liststore = Gtk.ListStore(str, str) self.reload_keyword_list() - self.wallpaper_combo.set_entry_text_column(0) - self.wallpaper_combo.connect("changed", self.on_wallpaper_change) + self.keyword_file_combo.set_entry_text_column(0) + self.keyword_file_combo.connect("changed", self.on_keyword_file_change) self.status_lbl = Gtk.Label('') self.keyword_tree = Gtk.TreeView(model=self.liststore) @@ -43,11 +52,13 @@ def __init__(self, parent): scroll.set_min_content_height(400) scroll.add(self.keyword_tree) - self.attach(self.wallpaper_combo, 0, 0, 2, 1) + self.attach(self.keyword_file_combo, 0, 0, 2, 1) + self.attach(self.create_button, 2, 0, 1, 1) self.attach(self.add_button, 0, 1, 1, 1) self.attach(self.delete_button, 1, 1, 1, 1) - self.attach(scroll, 0, 2, 2, 1) - self.attach(self.status_lbl, 0, 3, 2, 1) + self.attach(self.reset_button, 2, 1, 1, 1) + self.attach(scroll, 0, 2, 3, 1) + self.attach(self.status_lbl, 0, 3, 3, 1) key_renderer = Gtk.CellRendererText() key_renderer.set_property('editable', True) @@ -63,6 +74,23 @@ def __init__(self, parent): value_text = Gtk.TreeViewColumn("Value", value_renderer, text=1) self.keyword_tree.append_column(value_text) + def on_create_click(self, widget): + filechooser = Gtk.FileChooserDialog( + 'Create Config File', self.parent, + Gtk.FileChooserAction.SAVE, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) + file_filter = Gtk.FileFilter() + file_filter.set_name("Conf") + file_filter.add_mime_type("text/plain") + file_filter.add_pattern("*.conf") + filechooser.add_filter(file_filter) + filechooser.set_current_folder(KEYWORD_DIR) + response = filechooser.run() + print(filechooser.get_filename()) + print(response) + filechooser.destroy() + def remove_keyword(self, widget): self.status_lbl.set_text('') (m, pathlist) = self.keyword_tree.get_selection().get_selected_rows() @@ -75,34 +103,30 @@ def remove_keyword(self, widget): def text_edited(self, widget, path, text, col): self.status_lbl.set_text('') - if(col == 0): + if (col == 0): try: - keywords.update_key( - self.liststore[path][col], - text, - self.selected_file - ) + keywords.update_key(self.liststore[path][col], text, + self.selected_file) except Exception as e: self.status_lbl.set_text(str(e)) else: try: - keywords.update_value( - self.liststore[path][0], - text, - self.selected_file - ) + keywords.update_value(self.liststore[path][0], text, + self.selected_file) except Exception as e: self.status_lbl.set_text(str(e)) self.reload_keyword_list() def reload_keyword_list(self): keyword_section = keywords.get_keywords_section(self.selected_file) + self.liststore.clear() for k, v in keyword_section.items(): self.liststore.append([k, v]) - def on_wallpaper_change(self, widget): - self.selected_file = widget.get_active_text() + def on_keyword_file_change(self, widget): + selected_entry = widget.get_active_text() + self.selected_file = None if selected_entry == 'Default' else selected_entry self.reload_keyword_list() def append_new_keyword(self, widget): diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index 3997b6aa..bc5062a8 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -113,7 +113,6 @@ def __init__(self, args): self.option_combo.set_active(current_idx) self.colorscheme.set_active(current_idx) self.cpage.option_combo.set_active(current_idx) - self.keypage.wallpaper_combo.set_active(current_idx) self.set_button.set_sensitive(True) def on_add_clicked(self, widget): @@ -147,7 +146,6 @@ def on_add_clicked(self, widget): self.colorscheme.set_entry_text_column(0) self.cpage.option_combo.set_model(option_list) - self.keypage.wallpaper_combo.set_model(option_list) filechooser.destroy() @@ -174,7 +172,6 @@ def on_rm_clicked(self, widget): self.colorscheme.set_model(option_list) self.cpage.option_combo.set_model(option_list) - self.keypage.wallpaper_combo.set_model(option_list) def combo_box_change(self, widget): self.set_button.set_sensitive(True) @@ -192,9 +189,7 @@ def combo_box_change(self, widget): def colorscheme_box_change(self, widget): x = self.colorscheme.get_active() - self.cpage.option_combo.set_active(x) - self.keypage.wallpaper_combo.set_active(x) def run(args): From 454b07c0e4755e67b6d20c92ab8a18595dcdc936 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 11 Jul 2021 12:43:21 -0600 Subject: [PATCH 17/24] Use keywords per theme in a dedicated conf file --- wpgtk/data/config.py | 34 ++++++++++++++++-- wpgtk/data/files.py | 8 +---- wpgtk/data/keywords.py | 74 +++++++++++++-------------------------- wpgtk/data/themer.py | 3 +- wpgtk/gui/keyword_grid.py | 50 +++++++++----------------- 5 files changed, 76 insertions(+), 93 deletions(-) diff --git a/wpgtk/data/config.py b/wpgtk/data/config.py index 82cbc3ea..443c3962 100644 --- a/wpgtk/data/config.py +++ b/wpgtk/data/config.py @@ -14,12 +14,12 @@ WPG_DIR = os.path.join(CONFIG, "wpg") CONF_FILE = os.path.join(WPG_DIR, "wpg.conf") +KEYWORD_FILE = os.path.join(WPG_DIR, "keywords.conf") MODULE_DIR = os.path.abspath(os.path.join(__file__, "../../")) CONF_BACKUP = os.path.join(MODULE_DIR, "misc/wpg.conf") WALL_DIR = os.path.join(WPG_DIR, "wallpapers") SAMPLE_DIR = os.path.join(WPG_DIR, "samples") SCHEME_DIR = os.path.join(WPG_DIR, "schemes") -KEYWORD_DIR = os.path.join(WPG_DIR, "keywords") FORMAT_DIR = os.path.join(CACHE, "wal") OPT_DIR = os.path.join(WPG_DIR, "templates") FILE_DIC = { @@ -36,16 +36,45 @@ def write_conf(config_path=CONF_FILE): with open(config_path, 'w') as config_file: parser.write(config_file) +def write_keywords(keywords_path=KEYWORD_FILE): + global keywords_parser + + with open(keywords_path, 'w') as keywords_file: + keywords_parser.write(keywords_file) + def load_sections(): """reads the sections of the config file""" global parser + global keywords_parser + + parser = load_config() + keywords_parser = load_keywords() + return [parser['settings'], keywords_parser] + +def load_config(): parser = configparser.ConfigParser() parser.optionxform = str parser.read(CONF_FILE) - return [parser['settings'], parser['keywords']] + return parser + +def load_keywords(): + if not os.path.exists(KEYWORD_FILE): + open(KEYWORD_FILE, 'a').close() + + keywords_parser = configparser.ConfigParser() + keywords_parser.optionxform = str + keywords_parser.read(KEYWORD_FILE) + + if not keywords_parser.has_section('default'): + keywords_parser.add_section('default') + + with open(KEYWORD_FILE, 'w') as f: + keywords_parser.write(f) + + return keywords_parser def load_settings(): @@ -53,7 +82,6 @@ def load_settings(): os.makedirs(SAMPLE_DIR, exist_ok=True) os.makedirs(SCHEME_DIR, exist_ok=True) os.makedirs(FORMAT_DIR, exist_ok=True) - os.makedirs(KEYWORD_DIR, exist_ok=True) os.makedirs(OPT_DIR, exist_ok=True) try: diff --git a/wpgtk/data/files.py b/wpgtk/data/files.py index 9c8bb7c1..0596944e 100644 --- a/wpgtk/data/files.py +++ b/wpgtk/data/files.py @@ -12,7 +12,7 @@ WPG_DIR, OPT_DIR, SAMPLE_DIR, - KEYWORD_DIR + KEYWORD_FILE ) @@ -72,12 +72,6 @@ def get_sample_path(wallpaper, backend=None): return join(SAMPLE_DIR, sample_filename) -def get_keywords_path(filename): - """gets the path of the keywords file of a theme""" - - return join(KEYWORD_DIR, filename) - - def add_template(cfile, bfile=None): """adds a new base file from a config file to wpgtk or re-establishes link with config file for a diff --git a/wpgtk/data/keywords.py b/wpgtk/data/keywords.py index aaff6553..07665a61 100644 --- a/wpgtk/data/keywords.py +++ b/wpgtk/data/keywords.py @@ -1,69 +1,57 @@ import configparser from os import path -from .config import user_keywords, write_conf -from .files import get_keywords_path +from .config import user_keywords, write_keywords KEY_LENGTH = 5 VAL_LENGTH = 2 -def create_keywords_file(filename): - """creates a new keywords file and sets defaults if they exist""" - parser = configparser.ConfigParser() - parser.add_section('keywords') - - for k, v in dict(user_keywords): - parser['keywords'][k] = v - - with open(get_keywords_path(filename), "w") as keyword_file: - parser.write(keyword_file) - - return get_keywords_path(filename) - - -def get_keywords_section(filename = None): +def get_keywords_section(theme = None): """get keyword file configparser for current wallpaper or create one if it does not exist""" - if filename is None: - return user_keywords + if theme is None: + return user_keywords['default'] - parser = configparser.ConfigParser() + if not user_keywords.has_section(theme): + user_keywords.add_section(theme) + user_keywords[theme] = user_keywords['default'] - if not path.isfile(get_keywords_path(filename)): - create_keywords_file(filename) + return user_keywords[theme] - parser.read(get_keywords_path(filename)) +def reset_keywords_section(theme): + """set the theme's keyword to the default key value pairs""" - return parser['keywords'] + if user_keywords.has_section(theme): + user_keywords[theme] = user_keywords['default'] + write_keywords() - -def update_key(old_keyword, new_keyword, filename=None): +def update_key(old_keyword, new_keyword, theme=None): """validates and updates a keyword for a wallpaper""" if not new_keyword: raise Exception('Keyword must be longer than 5 characters') - keywords = get_keywords_section(filename) + keywords = get_keywords_section(theme) keywords[new_keyword] = keywords[old_keyword] if (old_keyword != new_keyword): keywords.pop(old_keyword, None) - write_keyword_file(keywords, filename) + write_keywords() -def update_value(keyword, value, filename=None): +def update_value(keyword, value, theme=None): """update the value to replace the user defined keyword with""" if not value: raise Exception('Value must exist') - keywords = get_keywords_section(filename) + keywords = get_keywords_section(theme) keywords[keyword] = value - write_keyword_file(keywords, filename) + write_keywords() -def create_pair(keyword, value, filename=None): +def create_pair(keyword, value, theme=None): """create a key value pair for a wallpaper""" if not value: raise Exception('There must be a value') @@ -71,28 +59,16 @@ def create_pair(keyword, value, filename=None): if not keyword: raise Exception('There must be a keyword') - keywords = get_keywords_section(filename) + keywords = get_keywords_section(theme) keywords[keyword] = value - write_keyword_file(keywords, filename) + write_keywords() -def remove_pair(keyword, filename=None): +def remove_pair(keyword, theme=None): """removes a pair of keyword value for a wallpaper""" - keywords = get_keywords_section(filename) + keywords = get_keywords_section(theme) keywords.pop(keyword, None) - write_keyword_file(keywords, filename) - - -def write_keyword_file(keywords, filename=None): - if filename: - keywords_path = get_keywords_path(filename) - parser = configparser.ConfigParser() - parser['keywords'] = keywords - - with open(keywords_path, "w") as keyword_file: - parser.write(keyword_file) - else: - write_conf() + write_keywords() diff --git a/wpgtk/data/themer.py b/wpgtk/data/themer.py index 67c9f841..6d8faa23 100644 --- a/wpgtk/data/themer.py +++ b/wpgtk/data/themer.py @@ -4,7 +4,7 @@ from os import remove, path, symlink from subprocess import Popen -from .config import WPG_DIR, WALL_DIR, FORMAT_DIR, settings +from .config import WPG_DIR, WALL_DIR, FORMAT_DIR, settings, user_keywords from . import color from . import files from . import sample @@ -60,6 +60,7 @@ def set_theme(wallpaper, colorscheme, restore=False): def delete_theme(filename): remove(path.join(WALL_DIR, filename)) files.delete_colorschemes(filename) + user_keywords.remove_section(filename) def get_current(): diff --git a/wpgtk/gui/keyword_grid.py b/wpgtk/gui/keyword_grid.py index 00c0d256..e9fc8b7c 100644 --- a/wpgtk/gui/keyword_grid.py +++ b/wpgtk/gui/keyword_grid.py @@ -1,6 +1,5 @@ from ..data import keywords from ..data import files -from ..data.config import KEYWORD_DIR from gi import require_version from gi.repository import Gtk require_version("Gtk", "3.0") @@ -24,25 +23,22 @@ def __init__(self, parent): self.add_button.connect('clicked', self.append_new_keyword) self.reset_button = Gtk.Button('Reset') - # self.reset_button.connect('clicked', self.reset_keyword_file) - - self.create_button = Gtk.Button('Create') - self.create_button.connect('clicked', self.on_create_click) + self.reset_button.connect('clicked', self.reset_keywords_section) self.selected_file = None - self.keyword_file_combo = Gtk.ComboBoxText() - self.keyword_file_combo.set_entry_text_column(0) - self.keyword_file_combo.append_text('Default') - for elem in list(files.get_file_list(KEYWORD_DIR, False)): - self.keyword_file_combo.append_text(elem) + self.theme_combo = Gtk.ComboBoxText() + self.theme_combo.set_entry_text_column(0) + self.theme_combo.append_text('Default') + for elem in list(files.get_file_list()): + self.theme_combo.append_text(elem) - self.keyword_file_combo.set_active(0) + self.theme_combo.set_active(0) self.liststore = Gtk.ListStore(str, str) self.reload_keyword_list() - self.keyword_file_combo.set_entry_text_column(0) - self.keyword_file_combo.connect("changed", self.on_keyword_file_change) + self.theme_combo.set_entry_text_column(0) + self.theme_combo.connect("changed", self.on_theme_change) self.status_lbl = Gtk.Label('') self.keyword_tree = Gtk.TreeView(model=self.liststore) @@ -52,8 +48,7 @@ def __init__(self, parent): scroll.set_min_content_height(400) scroll.add(self.keyword_tree) - self.attach(self.keyword_file_combo, 0, 0, 2, 1) - self.attach(self.create_button, 2, 0, 1, 1) + self.attach(self.theme_combo, 0, 0, 3, 1) self.attach(self.add_button, 0, 1, 1, 1) self.attach(self.delete_button, 1, 1, 1, 1) self.attach(self.reset_button, 2, 1, 1, 1) @@ -74,23 +69,6 @@ def __init__(self, parent): value_text = Gtk.TreeViewColumn("Value", value_renderer, text=1) self.keyword_tree.append_column(value_text) - def on_create_click(self, widget): - filechooser = Gtk.FileChooserDialog( - 'Create Config File', self.parent, - Gtk.FileChooserAction.SAVE, - (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) - file_filter = Gtk.FileFilter() - file_filter.set_name("Conf") - file_filter.add_mime_type("text/plain") - file_filter.add_pattern("*.conf") - filechooser.add_filter(file_filter) - filechooser.set_current_folder(KEYWORD_DIR) - response = filechooser.run() - print(filechooser.get_filename()) - print(response) - filechooser.destroy() - def remove_keyword(self, widget): self.status_lbl.set_text('') (m, pathlist) = self.keyword_tree.get_selection().get_selected_rows() @@ -124,9 +102,10 @@ def reload_keyword_list(self): for k, v in keyword_section.items(): self.liststore.append([k, v]) - def on_keyword_file_change(self, widget): + def on_theme_change(self, widget): selected_entry = widget.get_active_text() self.selected_file = None if selected_entry == 'Default' else selected_entry + self.reset_button.set_sensitive(self.selected_file is not None) self.reload_keyword_list() def append_new_keyword(self, widget): @@ -137,3 +116,8 @@ def append_new_keyword(self, widget): self.selected_file, ) self.reload_keyword_list() + + def reset_keywords_section(self, widget): + if self.selected_file: + keywords.reset_keywords_section(self.selected_file) + self.reload_keyword_list() From 09a2c69e008b086023d16b9c6657c7317d5946c8 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 11 Jul 2021 12:43:41 -0600 Subject: [PATCH 18/24] Update keyword combo along with theme combo --- wpgtk/gui/theme_picker.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index bc5062a8..c51d3aab 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -113,6 +113,7 @@ def __init__(self, args): self.option_combo.set_active(current_idx) self.colorscheme.set_active(current_idx) self.cpage.option_combo.set_active(current_idx) + self.keypage.theme_combo.set_active(current_idx + 1) self.set_button.set_sensitive(True) def on_add_clicked(self, widget): @@ -190,6 +191,7 @@ def combo_box_change(self, widget): def colorscheme_box_change(self, widget): x = self.colorscheme.get_active() self.cpage.option_combo.set_active(x) + self.keypage.theme_combo.set_active(x + 1) def run(args): From 68aa03a9b334b0f667c401384c1e547df8dd799b Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 11 Jul 2021 12:43:56 -0600 Subject: [PATCH 19/24] Simplify GTK reload code --- wpgtk/data/reload.py | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/wpgtk/data/reload.py b/wpgtk/data/reload.py index bc084bd8..b69e46dc 100644 --- a/wpgtk/data/reload.py +++ b/wpgtk/data/reload.py @@ -82,26 +82,29 @@ def gtk3(): # So GTK is getting theme info from gtkrc file # using xsettingd to set the same theme (parsing it from gtkrc) elif shutil.which("xsettingsd") and os.path.isfile(settings_ini): - gtkrc = configparser.ConfigParser() - gtkrc.read(settings_ini) + theme = "FlatColor" - if gtkrc["Settings"]: - theme = gtkrc["Settings"].get("gtk-theme-name", "FlatColor") - fd, path = tempfile.mkstemp() + if os.path.isfile(settings_ini): + gtkrc = configparser.ConfigParser() + gtkrc.read(settings_ini) + + if gtkrc["Settings"]: + theme = gtkrc["Settings"].get("gtk-theme-name", "FlatColor") - try: - with os.fdopen(fd, "w+") as tmp: - tmp.write('Net/ThemeName "' + theme + '"\n') - tmp.close() - util.silent_call([ - "timeout", "0.2s", "xsettingsd", "-c", path - ]) - logging.info( - "reloaded %s from settings.ini using xsettingsd" - % theme - ) - finally: - os.remove(path) + try: + fd, path = tempfile.mkstemp() + with os.fdopen(fd, "w+") as tmp: + tmp.write('Net/ThemeName "' + theme + '"\n') + tmp.close() + util.silent_Popen([ + "xsettingsd", "-c", path + ]) + logging.info( + "reloaded %s from settings.ini using xsettingsd" + % theme + ) + finally: + os.remove(path) # The system has no known settings daemon installed, # but dconf gtk-theme exists, just refreshing its theme From fb4e98d311a7313d85dfff5e29f7c9b88725bc30 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 1 Aug 2021 23:26:11 -0600 Subject: [PATCH 20/24] Use comboBoxText instead of just ComboBox --- wpgtk/gui/option_grid.py | 45 +++++++++++++++------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/wpgtk/gui/option_grid.py b/wpgtk/gui/option_grid.py index eebedbe6..08f7faaa 100644 --- a/wpgtk/gui/option_grid.py +++ b/wpgtk/gui/option_grid.py @@ -33,36 +33,23 @@ def __init__(self, parent): # Setting up ComboBox color_list = ['Random'] + [str(x) for x in range(1, 16)] - option_list = Gtk.ListStore(str) + self.color_combo = Gtk.ComboBoxText() for elem in list(color_list): - option_list.append([elem]) - - # ComboBox - self.color_combo = Gtk.ComboBox.new_with_model(option_list) - self.renderer_text = Gtk.CellRendererText() - self.color_combo.pack_start(self.renderer_text, True) - self.color_combo.add_attribute(self.renderer_text, 'text', 0) - self.color_combo.set_entry_text_column(0) + self.color_combo.append_text(elem) self.color_combo.connect("changed", self.combo_box_change, "active") # Button self.color_button = Gtk.Button("Active/Inactive Color") self.save_button = Gtk.Button("Save") self.save_button.connect("pressed", self.on_save_button) - self.lbl_save = Gtk.Label("") # Backend Combo - self.backend_list = colors.list_backends() self.backend_lbl = Gtk.Label("Select your backend:") + self.backend_combo = Gtk.ComboBoxText() + self.backend_list = colors.list_backends() - be_store = Gtk.ListStore(str) for elem in self.backend_list: - be_store.append([elem]) - - self.backend_combo = Gtk.ComboBox.new_with_model(be_store) - self.backend_combo.pack_start(self.renderer_text, True) - self.backend_combo.add_attribute(self.renderer_text, 'text', 0) - self.backend_combo.set_entry_text_column(0) + self.backend_combo.append_text(elem) self.backend_combo.connect("changed", self.combo_box_change, "backend") # Switches @@ -183,21 +170,22 @@ def __init__(self, parent): self.active_grid.attach(self.alpha_txt, 2, 5, 1, 1) self.active_grid.attach(self.save_button, 1, 6, 2, 1) - self.active_grid.attach(self.lbl_save, 1, 7, 2, 1) self.attach(self.switch_grid, 1, 1, 1, 1) self.attach(self.active_grid, 1, 2, 1, 1) + self.save_button.set_sensitive(False) + def on_activate(self, switch, *gparam): if(gparam[1] == 'execute_cmd'): self.command_txt.set_editable(switch.get_active()) settings[gparam[1]] = str(switch.get_active()).lower() - self.lbl_save.set_text('') + self.save_button.set_sensitive(True) def load_opt_list(self): current_backend = settings.get("backend", "wal") - i = self.backend_list.index(current_backend) - self.backend_combo.set_active(i) + idx = self.backend_list.index(current_backend) + self.backend_combo.set_active(idx) self.color_combo\ .set_active(settings.getint("active", 0)) @@ -227,18 +215,19 @@ def load_opt_list(self): def combo_box_change(self, combo, *gparam): x = combo.get_active() - if(gparam[0] == "active"): + item = combo.get_active_text() + + if gparam[0] == "active": settings[gparam[0]] = str(x) color = Gdk.color_parse(self.parent.cpage.color_list[x]) self.color_button.modify_bg(Gtk.StateType.NORMAL, color) - else: - settings[gparam[0]] = self.backend_list[x] - self.lbl_save.set_text("") + if gparam[0] == "backend": + settings[gparam[0]] = item + self.save_button.set_sensitive(True) def on_txt_change(self, gtk_entry, *gparam): settings[gparam[0]] = gtk_entry.get_text() - self.lbl_save.set_text("") def on_save_button(self, button): write_conf() - self.lbl_save.set_text("Saved") + self.save_button.set_sensitive(False) From ac5a5610ed67835be169edd0d550442c56d477a0 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 1 Aug 2021 23:26:34 -0600 Subject: [PATCH 21/24] Don't change keypage value on wallpaper change --- wpgtk/gui/theme_picker.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index c51d3aab..bc5062a8 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -113,7 +113,6 @@ def __init__(self, args): self.option_combo.set_active(current_idx) self.colorscheme.set_active(current_idx) self.cpage.option_combo.set_active(current_idx) - self.keypage.theme_combo.set_active(current_idx + 1) self.set_button.set_sensitive(True) def on_add_clicked(self, widget): @@ -191,7 +190,6 @@ def combo_box_change(self, widget): def colorscheme_box_change(self, widget): x = self.colorscheme.get_active() self.cpage.option_combo.set_active(x) - self.keypage.theme_combo.set_active(x + 1) def run(args): From 45e73f3f57b4a94e8a0bd9a288f2f32649f4f26c Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 15 Aug 2021 14:43:11 -0600 Subject: [PATCH 22/24] Use a dedicated keyword.conf file and use sections --- wpgtk/data/color.py | 13 +++-- wpgtk/data/config.py | 60 +++++++++----------- wpgtk/data/files.py | 1 - wpgtk/data/keywords.py | 35 ++++++------ wpgtk/gui/keyword_dialog.py | 29 ++++++++++ wpgtk/gui/keyword_grid.py | 109 +++++++++++++++++++++++++----------- 6 files changed, 158 insertions(+), 89 deletions(-) create mode 100644 wpgtk/gui/keyword_dialog.py diff --git a/wpgtk/data/color.py b/wpgtk/data/color.py index d984fe39..9c753397 100755 --- a/wpgtk/data/color.py +++ b/wpgtk/data/color.py @@ -233,12 +233,13 @@ def keyword_colors(hexc, is_dark_theme=True): def get_color_dict(pywal_colors, colorscheme): """ensamble wpgtk color dictionary from pywal color dictionary""" + keyword_set = settings.get('keywords', 'default') index = settings.getint("active") index = index if index > 0 else randint(9, 14) base_color = pywal_colors["colors"]["color%s" % index] color_list = list(pywal_colors["colors"].values()) - keyword_dict = keywords.get_keywords_section(colorscheme) + keyword_dict = keywords.get_keywords_section(keyword_set) all_colors = { "wallpaper": pywal_colors["wallpaper"], @@ -249,18 +250,20 @@ def get_color_dict(pywal_colors, colorscheme): **keyword_colors(base_color, is_dark_theme(color_list)) } + all_colors = { + k: pywal.util.Color(v) for k, v in all_colors.items() + } + try: user_words = { - k: v.format(**all_colors) + k: pywal.util.Color(v.format_map(all_colors)) for k, v in keyword_dict.items() } - all_colors = {**all_colors, **user_words} - except KeyError as e: logging.error("%s - invalid, use double {{}} " "to escape curly braces" % e) - return {k: pywal.util.Color(v) for k, v in all_colors.items()} + return {**all_colors, **user_words} def apply_colorscheme(color_dict): diff --git a/wpgtk/data/config.py b/wpgtk/data/config.py index 443c3962..61e8c518 100644 --- a/wpgtk/data/config.py +++ b/wpgtk/data/config.py @@ -5,7 +5,7 @@ __version__ = '6.2.3' -parser = None +settings = None HOME = os.getenv("HOME", os.path.expanduser("~")) CACHE = os.getenv("XDG_CACHE_HOME", os.path.join(HOME, ".cache")) @@ -31,53 +31,47 @@ def write_conf(config_path=CONF_FILE): - global parser + global config_parser with open(config_path, 'w') as config_file: - parser.write(config_file) + config_parser.write(config_file) + def write_keywords(keywords_path=KEYWORD_FILE): - global keywords_parser + global user_keywords with open(keywords_path, 'w') as keywords_file: - keywords_parser.write(keywords_file) + user_keywords.write(keywords_file) -def load_sections(): +def load_settings(): """reads the sections of the config file""" - global parser - global keywords_parser - - parser = load_config() - keywords_parser = load_keywords() - - return [parser['settings'], keywords_parser] + global settings + global user_keywords + global config_parser -def load_config(): - parser = configparser.ConfigParser() - parser.optionxform = str - parser.read(CONF_FILE) + config_parser = configparser.ConfigParser() + config_parser.optionxform = str + config_parser.read(CONF_FILE) + settings = config_parser['settings'] - return parser def load_keywords(): + global user_keywords + if not os.path.exists(KEYWORD_FILE): open(KEYWORD_FILE, 'a').close() - keywords_parser = configparser.ConfigParser() - keywords_parser.optionxform = str - keywords_parser.read(KEYWORD_FILE) - - if not keywords_parser.has_section('default'): - keywords_parser.add_section('default') + user_keywords = configparser.ConfigParser() + user_keywords.optionxform = str + user_keywords.read(KEYWORD_FILE) - with open(KEYWORD_FILE, 'w') as f: - keywords_parser.write(f) + if not user_keywords.has_section('default'): + user_keywords.add_section('default') + write_keywords() - return keywords_parser - -def load_settings(): +def init_config(): os.makedirs(WALL_DIR, exist_ok=True) os.makedirs(SAMPLE_DIR, exist_ok=True) os.makedirs(SCHEME_DIR, exist_ok=True) @@ -85,13 +79,15 @@ def load_settings(): os.makedirs(OPT_DIR, exist_ok=True) try: - return load_sections() + load_settings() + load_keywords() except Exception: logging.error("not a valid config file") logging.info("copying default config file") shutil.copy(CONF_BACKUP, CONF_FILE) - return load_sections() + load_settings() + load_keywords() -settings, user_keywords = load_settings() +init_config() diff --git a/wpgtk/data/files.py b/wpgtk/data/files.py index 0596944e..8c6e0973 100644 --- a/wpgtk/data/files.py +++ b/wpgtk/data/files.py @@ -12,7 +12,6 @@ WPG_DIR, OPT_DIR, SAMPLE_DIR, - KEYWORD_FILE ) diff --git a/wpgtk/data/keywords.py b/wpgtk/data/keywords.py index 07665a61..df41f172 100644 --- a/wpgtk/data/keywords.py +++ b/wpgtk/data/keywords.py @@ -1,30 +1,28 @@ -import configparser -from os import path - from .config import user_keywords, write_keywords KEY_LENGTH = 5 VAL_LENGTH = 2 -def get_keywords_section(theme = None): +def delete_keywords_section(name): + if name != 'default': + user_keywords.remove_section(name) + write_keywords() + + +def create_keywords_section(name): + user_keywords.add_section(name) + write_keywords() + + +def get_keywords_section(theme): """get keyword file configparser for current wallpaper or create one if it does not exist""" - if theme is None: - return user_keywords['default'] - if not user_keywords.has_section(theme): - user_keywords.add_section(theme) - user_keywords[theme] = user_keywords['default'] + create_keywords_section(theme) return user_keywords[theme] -def reset_keywords_section(theme): - """set the theme's keyword to the default key value pairs""" - - if user_keywords.has_section(theme): - user_keywords[theme] = user_keywords['default'] - write_keywords() def update_key(old_keyword, new_keyword, theme=None): """validates and updates a keyword for a wallpaper""" @@ -40,7 +38,7 @@ def update_key(old_keyword, new_keyword, theme=None): write_keywords() -def update_value(keyword, value, theme=None): +def update_value(keyword, value, theme): """update the value to replace the user defined keyword with""" if not value: raise Exception('Value must exist') @@ -51,7 +49,7 @@ def update_value(keyword, value, theme=None): write_keywords() -def create_pair(keyword, value, theme=None): +def create_pair(keyword, value, theme): """create a key value pair for a wallpaper""" if not value: raise Exception('There must be a value') @@ -65,9 +63,8 @@ def create_pair(keyword, value, theme=None): write_keywords() -def remove_pair(keyword, theme=None): +def remove_pair(keyword, theme): """removes a pair of keyword value for a wallpaper""" - keywords = get_keywords_section(theme) keywords.pop(keyword, None) diff --git a/wpgtk/gui/keyword_dialog.py b/wpgtk/gui/keyword_dialog.py new file mode 100644 index 00000000..35b6af0a --- /dev/null +++ b/wpgtk/gui/keyword_dialog.py @@ -0,0 +1,29 @@ +from gi import require_version +from gi.repository import Gtk +require_version("Gtk", "3.0") + + +class KeywordDialog(Gtk.Dialog): + + def __init__(self, parent): + Gtk.Dialog.__init__(self, "Name you keyword/value set", parent, 0, + (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, + Gtk.STOCK_OK, Gtk.ResponseType.OK)) + + self.set_default_size(150, 100) + self.name_text_input = Gtk.Entry() + self.error_lbl = Gtk.Label() + + box = self.get_content_area() + box.set_border_width(10) + box.set_spacing(10) + box.add(self.name_text_input) + box.add(self.error_lbl) + + self.show_all() + + def get_section_name(self): + if len(self.name_text_input.get_text()) <= 0: + raise Exception('Empty name not allowed') + + return self.name_text_input.get_text() diff --git a/wpgtk/gui/keyword_grid.py b/wpgtk/gui/keyword_grid.py index e9fc8b7c..05ab3482 100644 --- a/wpgtk/gui/keyword_grid.py +++ b/wpgtk/gui/keyword_grid.py @@ -1,11 +1,15 @@ +import logging from ..data import keywords -from ..data import files +from ..data.config import user_keywords, settings, write_conf from gi import require_version from gi.repository import Gtk +from .keyword_dialog import KeywordDialog require_version("Gtk", "3.0") PAD = 10 +# TODO: if create section, select the new valid section + class KeywordGrid(Gtk.Grid): def __init__(self, parent): Gtk.Grid.__init__(self) @@ -16,44 +20,52 @@ def __init__(self, parent): self.set_row_spacing(PAD) self.set_column_spacing(PAD) - self.delete_button = Gtk.Button('Remove') - self.delete_button.connect('clicked', self.remove_keyword) + self.liststore = Gtk.ListStore(str, str) + + self.remove_button = Gtk.Button('Remove Keyword') + self.remove_button.connect('clicked', self.remove_keyword) - self.add_button = Gtk.Button('Add') + self.add_button = Gtk.Button('Add Keyword') self.add_button.connect('clicked', self.append_new_keyword) - self.reset_button = Gtk.Button('Reset') - self.reset_button.connect('clicked', self.reset_keywords_section) + self.choose_button = Gtk.Button('Choose Set') + self.choose_button.connect('clicked', self.choose_keywords_section) - self.selected_file = None - self.theme_combo = Gtk.ComboBoxText() - self.theme_combo.set_entry_text_column(0) - self.theme_combo.append_text('Default') - for elem in list(files.get_file_list()): - self.theme_combo.append_text(elem) + self.create_button = Gtk.Button('Create Set') + self.create_button.connect('clicked', self.create_keywords_section) - self.theme_combo.set_active(0) + self.delete_button = Gtk.Button('Delete Set') + self.delete_button.connect('clicked', self.delete_keywords_section) - self.liststore = Gtk.ListStore(str, str) - self.reload_keyword_list() + self.sections_combo = Gtk.ComboBoxText() + self.sections_combo.connect("changed", self.on_section_change) + self.reload_section_list() - self.theme_combo.set_entry_text_column(0) - self.theme_combo.connect("changed", self.on_theme_change) + self.selected_file = settings.get("keywords", "default") + idx = list(user_keywords.sections()).index(self.selected_file) + self.sections_combo.set_active(idx) + self.delete_button.set_sensitive(self.selected_file != 'default') + self.choose_button.set_sensitive(False) + + self.reload_keyword_list() self.status_lbl = Gtk.Label('') self.keyword_tree = Gtk.TreeView(model=self.liststore) scroll = Gtk.ScrolledWindow() scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) - scroll.set_min_content_height(400) + scroll.set_min_content_height(320) + scroll.set_propagate_natural_height(True) scroll.add(self.keyword_tree) - self.attach(self.theme_combo, 0, 0, 3, 1) - self.attach(self.add_button, 0, 1, 1, 1) - self.attach(self.delete_button, 1, 1, 1, 1) - self.attach(self.reset_button, 2, 1, 1, 1) - self.attach(scroll, 0, 2, 3, 1) - self.attach(self.status_lbl, 0, 3, 3, 1) + self.attach(self.sections_combo, 0, 0, 2, 1) + self.attach(self.choose_button, 2, 0, 1, 1) + self.attach(self.delete_button, 3, 0, 1, 1) + self.attach(self.create_button, 0, 1, 4, 1) + self.attach(scroll, 0, 2, 4, 1) + self.attach(self.add_button, 0, 3, 2, 1) + self.attach(self.remove_button, 2, 3, 2, 1) + self.attach(self.status_lbl, 0, 4, 4, 1) key_renderer = Gtk.CellRendererText() key_renderer.set_property('editable', True) @@ -95,6 +107,15 @@ def text_edited(self, widget, path, text, col): self.status_lbl.set_text(str(e)) self.reload_keyword_list() + def reload_section_list(self, active='default'): + sections = list(user_keywords.sections()) + self.sections_combo.remove_all() + + for item in sections: + self.sections_combo.append_text(item) + + self.sections_combo.set_active(sections.index(active)) + def reload_keyword_list(self): keyword_section = keywords.get_keywords_section(self.selected_file) @@ -102,11 +123,16 @@ def reload_keyword_list(self): for k, v in keyword_section.items(): self.liststore.append([k, v]) - def on_theme_change(self, widget): - selected_entry = widget.get_active_text() - self.selected_file = None if selected_entry == 'Default' else selected_entry - self.reset_button.set_sensitive(self.selected_file is not None) - self.reload_keyword_list() + def on_section_change(self, widget): + self.selected_file = widget.get_active_text() + + if self.selected_file is not None: + self.reload_keyword_list() + self.choose_button.set_sensitive( + settings.get('keywords', 'default') != self.selected_file + ) + settings['keywords'] = self.selected_file + self.delete_button.set_sensitive(self.selected_file != 'default') def append_new_keyword(self, widget): self.status_lbl.set_text('') @@ -117,7 +143,26 @@ def append_new_keyword(self, widget): ) self.reload_keyword_list() - def reset_keywords_section(self, widget): + def delete_keywords_section(self, widget): if self.selected_file: - keywords.reset_keywords_section(self.selected_file) - self.reload_keyword_list() + keywords.delete_keywords_section(self.selected_file) + self.reload_section_list() + + def choose_keywords_section(self, widget): + write_conf() + self.choose_button.set_sensitive(False) + + def create_keywords_section(self, widget): + dialog = KeywordDialog(self.parent) + response = dialog.run() + + if response == Gtk.ResponseType.OK: + try: + section = dialog.get_section_name() + keywords.create_keywords_section(section) + self.reload_section_list(section) + except Exception as e: + logging.error(str(e)) + dialog.destroy() + if response == Gtk.ResponseType.CANCEL: + dialog.destroy() From b9b15dfb4de898ae3497aa05c911efe7e52172d1 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 15 Aug 2021 15:05:59 -0600 Subject: [PATCH 23/24] Refactor get_file_list to also filter by regex with optional param --- wpgtk/__main__.py | 4 ++-- wpgtk/data/color.py | 3 +-- wpgtk/data/files.py | 11 +++++------ wpgtk/gui/template_grid.py | 8 ++------ 4 files changed, 10 insertions(+), 16 deletions(-) diff --git a/wpgtk/__main__.py b/wpgtk/__main__.py index 0a47ee58..cb089166 100755 --- a/wpgtk/__main__.py +++ b/wpgtk/__main__.py @@ -193,8 +193,8 @@ def process_args(args): if args.l: if args.t: - templates = files.get_file_list(OPT_DIR, False) - any(print(t) for t in templates if ".base" in t) + templates = files.get_file_list(OPT_DIR, r".*\.base$") + any(print(t) for t in templates) else: print("\n".join(files.get_file_list())) exit(0) diff --git a/wpgtk/data/color.py b/wpgtk/data/color.py index 9c753397..0428bec8 100755 --- a/wpgtk/data/color.py +++ b/wpgtk/data/color.py @@ -170,8 +170,7 @@ def auto_adjust(colors): def change_templates(colors): """call change_colors on each custom template installed or defined by the user""" - templates = files.get_file_list(OPT_DIR, images=False) - templates = [x for x in templates if ".base" in x] + templates = files.get_file_list(OPT_DIR, r".*\.base$") try: for template in templates: diff --git a/wpgtk/data/files.py b/wpgtk/data/files.py index 8c6e0973..87e62b79 100644 --- a/wpgtk/data/files.py +++ b/wpgtk/data/files.py @@ -15,13 +15,11 @@ ) -def get_file_list(path=WALL_DIR, images=True): - """gets filenames in a given directory, optional - parameters for image filter.""" +def get_file_list(path=WALL_DIR, regex=None): + """gets file names in a given directory, optional regex + parameter to filter the list of files by.""" files = [] - valid = re.compile( - r"^[^\.](.*\.png$|.*\.jpg$|.*\.jpeg$|.*\.jpe$|.*\.gif$)") for _, _, filenames in os.walk(path): files.extend(filenames) @@ -29,7 +27,8 @@ def get_file_list(path=WALL_DIR, images=True): files.sort() - if images: + if regex is not None: + valid = re.compile(regex) return [elem for elem in files if valid.fullmatch(elem)] else: return files diff --git a/wpgtk/gui/template_grid.py b/wpgtk/gui/template_grid.py index b70409ee..8b2f72a6 100644 --- a/wpgtk/gui/template_grid.py +++ b/wpgtk/gui/template_grid.py @@ -55,9 +55,7 @@ def __init__(self, parent): self.scroll.set_min_content_height(400) self.scroll.add(self.file_view) - self.item_names = [filen for filen in - files.get_file_list(OPT_DIR, False) - if '.base' in filen] + self.item_names = files.get_file_list(OPT_DIR, r".*\.base$") for filen in self.item_names: pixbuf = Gtk.IconTheme.get_default().load_icon(icon, 64, 0) @@ -87,9 +85,7 @@ def on_add_clicked(self, widget): if response == Gtk.ResponseType.OK: for f in filechooser.get_filenames(): files.add_template(f) - self.item_names = [f for f in - files.get_file_list(OPT_DIR, False) - if '.base' in f] + self.item_names = files.get_file_list(OPT_DIR, r".*\.base$") self.liststore = Gtk.ListStore(Pixbuf, str) for filen in self.item_names: pixbuf = Gtk.IconTheme.get_default().load_icon(icon, 64, 0) From dd5d54814aea2c23395a67e0c0f3d1555af7cc5f Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sun, 15 Aug 2021 15:11:11 -0600 Subject: [PATCH 24/24] Version bump to 6.5.0 --- wpgtk/data/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wpgtk/data/config.py b/wpgtk/data/config.py index 61e8c518..afbda36d 100644 --- a/wpgtk/data/config.py +++ b/wpgtk/data/config.py @@ -3,7 +3,7 @@ import os import logging -__version__ = '6.2.3' +__version__ = '6.5.0' settings = None