From aed4fb84202917723a35e791b2ea6b8d1984bfef Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 26 May 2025 18:09:35 -0600 Subject: [PATCH 01/10] util: utility function to set a button's bg color and fg color --- wpgtk/gui/util.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/wpgtk/gui/util.py b/wpgtk/gui/util.py index 5d60fa6..3a4ae6f 100644 --- a/wpgtk/gui/util.py +++ b/wpgtk/gui/util.py @@ -3,7 +3,8 @@ import pathlib require_version("GdkPixbuf", "2.0") -from gi.repository import GdkPixbuf # noqa: E402 +require_version("Gtk", "4.0") +from gi.repository import GdkPixbuf, Gtk # noqa: E402 def get_preview_pixbuf(image_name): @@ -61,3 +62,32 @@ def get_sample_pixbuf(sample_name): ) else: return None + + +def set_widget_colors(button, background="#000", foreground="#fff"): + """ + Set a style for background and foreground on a widget + + This function applies a css provider to the widget passed as parameter + the css provider includes a basic style string that utilizes the + background and foreground paramters to change those properties on + the widget + + Parameters: + - widget (Gtk.Widget): a GTK widget instance + - background (str): background color to apply in style + - foreground (str): foreground color to apply in style + + Returns: + """ + css_provider = Gtk.CssProvider() + css = f""" + button {{ + background-color: {background}; + color: {foreground}; + }} + """ + css_provider.load_from_data(css.encode()) + button.get_style_context().add_provider( + css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION + ) From 962c87861d255a7c1018e86a3e031670d81f6306 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 26 May 2025 18:36:33 -0600 Subject: [PATCH 02/10] implement function to set uniform margins --- wpgtk/gui/util.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/wpgtk/gui/util.py b/wpgtk/gui/util.py index 3a4ae6f..f7994b0 100644 --- a/wpgtk/gui/util.py +++ b/wpgtk/gui/util.py @@ -91,3 +91,19 @@ def set_widget_colors(button, background="#000", foreground="#fff"): button.get_style_context().add_provider( css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION ) + + +def set_uniform_margins(widget, margin): + """ + Set uniform margins on all sides of a widget + + Parameters: + - widget (Gtk.Widget): a GTK widget instance + - margin (integer): the margin amount to apply + + Returns: + """ + widget.set_margin_top(margin) + widget.set_margin_bottom(margin) + widget.set_margin_start(margin) + widget.set_margin_end(margin) From f5521b96040214a7a89604b27ee29520cd757973 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 26 May 2025 18:36:59 -0600 Subject: [PATCH 03/10] update launcher to use Gtk.Appliaction --- wpgtk/gui/theme_picker.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index b8e6656..5b24c10 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -203,7 +203,12 @@ def set_image_preview(self, filepath): def run(args): - win = mainWindow(args) - win.connect("delete-event", Gtk.main_quit) - win.show_all() - Gtk.main() + app = Gtk.Application(application_id="com.deviantfero.wpgtk") + + def on_activate(app): + win = mainWindow(args) + win.set_application(app) + win.present() + + app.connect("activate", on_activate) + return app.run(None) From 4132d346f120fbe0f4b0997024f8a33dd3072818 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Mon, 26 May 2025 18:42:53 -0600 Subject: [PATCH 04/10] replace widget initializer syntax, update color parsing --- wpgtk/gui/color_grid.py | 71 ++++++++--------- wpgtk/gui/color_picker.py | 45 +++++++---- wpgtk/gui/keyword_dialog.py | 20 +++-- wpgtk/gui/keyword_grid.py | 66 ++++++++-------- wpgtk/gui/option_grid.py | 150 +++++++++++++----------------------- wpgtk/gui/template_grid.py | 58 ++++++++------ wpgtk/gui/theme_picker.py | 17 ++-- 7 files changed, 209 insertions(+), 218 deletions(-) diff --git a/wpgtk/gui/color_grid.py b/wpgtk/gui/color_grid.py index 45b31c1..df3d775 100644 --- a/wpgtk/gui/color_grid.py +++ b/wpgtk/gui/color_grid.py @@ -13,7 +13,7 @@ from .color_picker import ColorDialog from gi import require_version -require_version("Gtk", "3.0") +require_version("Gtk", "4.0") from gi.repository import Gtk, Gdk, GdkPixbuf # noqa: E402 # TODO: remove current_walls call, use simple list @@ -27,36 +27,35 @@ class ColorGrid(Gtk.Grid): def __init__(self, parent): Gtk.Grid.__init__(self) self.parent = parent - self.set_border_width(PAD) self.set_column_homogeneous(1) + gui_util.set_uniform_margins(self, PAD) self.set_row_spacing(PAD) self.set_column_spacing(PAD) self.colorgrid = Gtk.Grid() - self.colorgrid.set_border_width(PAD) self.colorgrid.set_column_homogeneous(1) self.colorgrid.set_row_spacing(PAD) self.colorgrid.set_column_spacing(PAD) - self.sat_add = Gtk.Button("+") + self.sat_add = Gtk.Button.new_with_label("+") self.sat_add.set_sensitive(False) - self.sat_red = Gtk.Button("-") + self.sat_red = Gtk.Button.new_with_label("-") self.sat_red.set_sensitive(False) - self.sat_add.connect("pressed", self.hls_change, "sat", "add") - self.sat_red.connect("pressed", self.hls_change, "sat", "red") - self.sat_lbl = Gtk.Label("Saturation:") + self.sat_add.connect("clicked", self.hls_change, "sat", "add") + self.sat_red.connect("clicked", self.hls_change, "sat", "red") + self.sat_lbl = Gtk.Label(label="Saturation:") - self.light_add = Gtk.Button("+") + self.light_add = Gtk.Button(label="+") self.light_add.set_sensitive(False) - self.light_red = Gtk.Button("-") + self.light_red = Gtk.Button(label="-") self.light_red.set_sensitive(False) - self.light_add.connect("pressed", self.hls_change, "light", "add") - self.light_red.connect("pressed", self.hls_change, "light", "red") - self.light_lbl = Gtk.Label("Brightness:") + self.light_add.connect("clicked", self.hls_change, "light", "add") + self.light_red.connect("clicked", self.hls_change, "light", "red") + self.light_lbl = Gtk.Label(label="Brightness:") self.sat_light_grid = Gtk.Grid() self.sat_light_grid.set_column_homogeneous(1) @@ -74,16 +73,16 @@ def __init__(self, parent): self.combo_grid.set_row_spacing(PAD) self.color_list = ["000000"] * 16 - self.button_list = [Gtk.Button("000000") for x in range(16)] + self.button_list = [Gtk.Button(label="000000") for x in range(16)] self.selected_file = "" for button in self.button_list: - button.connect("pressed", self.on_color_click) + button.connect("clicked", self.on_color_click) button.set_sensitive(False) cont = 0 for y in range(0, 8, 2): for x in range(0, 4): - label = Gtk.Label(cont) + label = Gtk.Label(label=cont) self.colorgrid.attach(label, x, y, 1, 1) self.colorgrid.attach(self.button_list[cont], x, y + 1, 1, 1) cont += 1 @@ -95,27 +94,27 @@ def __init__(self, parent): if pixbuf_sample is not None: self.sample.set_from_pixbuf(self.pixbuf_sample) - self.shuffle_button = Gtk.Button("Shuffle colors") - self.shuffle_button.connect("pressed", self.on_shuffle_click) + self.shuffle_button = Gtk.Button(label="Shuffle colors") + self.shuffle_button.connect("clicked", self.on_shuffle_click) self.shuffle_button.set_sensitive(False) - self.import_button = Gtk.Button("import") + self.import_button = Gtk.Button(label="Import") self.import_button.set_sensitive(False) - self.import_button.connect("pressed", self.on_import_click) + self.import_button.connect("clicked", self.on_import_click) - self.ok_button = Gtk.Button("Save") - self.ok_button.connect("pressed", self.on_ok_click) + self.ok_button = Gtk.Button(label="Save") + self.ok_button.connect("clicked", self.on_ok_click) self.ok_button.set_sensitive(False) - self.auto_button = Gtk.Button("Auto-adjust") - self.auto_button.connect("pressed", self.on_auto_click) + self.auto_button = Gtk.Button(label="Auto-adjust") + self.auto_button.connect("clicked", self.on_auto_click) self.auto_button.set_sensitive(False) - self.reset_button = Gtk.Button("Reset") + self.reset_button = Gtk.Button(label="Reset") self.reset_button.set_sensitive(False) - self.reset_button.connect("pressed", self.on_reset_click) + self.reset_button.connect("clicked", self.on_reset_click) - self.done_lbl = Gtk.Label("") + self.done_lbl = Gtk.Label(label="") option_list = Gtk.ListStore(str) for elem in list(files.get_file_list()): @@ -153,15 +152,15 @@ def __init__(self, parent): def render_buttons(self): for x, button in enumerate(self.button_list): - gcolor = Gdk.color_parse(self.color_list[x]) if util.get_hls_val(self.color_list[x], "light") < 99: - fgcolor = Gdk.color_parse("#FFFFFF") + fgcolor = "#FFFFFF" else: - fgcolor = Gdk.color_parse("#000000") + fgcolor = "#000000" button.set_label(self.color_list[x]) button.set_sensitive(True) - button.modify_bg(Gtk.StateType.NORMAL, gcolor) - button.modify_fg(Gtk.StateType.NORMAL, fgcolor) + gui_util.set_widget_colors( + button, background=self.color_list[x], foreground=fgcolor + ) def render_theme(self): sample_path = files.get_sample_path(self.selected_file) @@ -271,15 +270,13 @@ def on_color_click(self, widget): hex_color = pywal.util.rgb_to_hex(rgb) widget.set_label(hex_color) - gcolor = Gdk.color_parse(hex_color) if util.get_hls_val(hex_color, "light") < 100: - fgcolor = Gdk.color_parse("#FFFFFF") + fgcolor = "#FFFFFF" else: - fgcolor = Gdk.color_parse("#000000") + fgcolor = "#000000" widget.set_sensitive(True) - widget.modify_bg(Gtk.StateType.NORMAL, gcolor) - widget.modify_fg(Gtk.StateType.NORMAL, fgcolor) + gui_util.set_widget_colors(widget, background=hex_color, foreground=fgcolor) for i, c in enumerate(self.button_list): if c.get_label() != self.color_list[i]: diff --git a/wpgtk/gui/color_picker.py b/wpgtk/gui/color_picker.py index f8a5f79..b8ca347 100644 --- a/wpgtk/gui/color_picker.py +++ b/wpgtk/gui/color_picker.py @@ -1,7 +1,8 @@ from ..data import util from gi import require_version -require_version("Gtk", "3.0") -require_version("Gdk", "3.0") + +require_version("Gtk", "4.0") +require_version("Gdk", "4.0") from gi.repository import Gtk # noqa: E402 from gi.repository import Gdk # noqa: E402 @@ -9,9 +10,18 @@ class ColorDialog(Gtk.Dialog): def __init__(self, parent, current_file, gcolor): - Gtk.Dialog.__init__(self, "Pick a Color", parent, 0, - (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, - Gtk.STOCK_OK, Gtk.ResponseType.OK)) + Gtk.Dialog.__init__( + self, + "Pick a Color", + parent, + 0, + ( + Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, + Gtk.STOCK_OK, + Gtk.ResponseType.OK, + ), + ) self.set_default_size(150, 100) box = self.get_content_area() @@ -25,25 +35,26 @@ def __init__(self, parent, current_file, gcolor): self.colorchooser.set_use_alpha(False) self.colorchooser.set_rgba(gcolor) - r, g, b, _ = list(map(lambda x: round(x*100*2.55), gcolor)) + r, g, b, _ = list(map(lambda x: round(x * 100 * 2.55), gcolor)) hue, light, sat = util.rgb_to_hls(r, g, b) - self.sat_lbl = Gtk.Label('Saturation') - self.light_lbl = Gtk.Label('Light ') + self.sat_lbl = Gtk.Label("Saturation") + self.light_lbl = Gtk.Label("Light ") sat_range = Gtk.Adjustment(0, 0, 1, 0.1, 0.1, 0) - self.sat_slider = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, - adjustment=sat_range) + self.sat_slider = Gtk.Scale( + orientation=Gtk.Orientation.HORIZONTAL, adjustment=sat_range + ) self.sat_slider.set_value(-sat) self.sat_slider.set_digits(2) - self.sat_slider.connect('value-changed', self.slider_changed, 'sat') + self.sat_slider.connect("value-changed", self.slider_changed, "sat") light_range = Gtk.Adjustment(5, 0, 255, 1, 10, 0) - self.light_slider = Gtk.Scale(orientation=Gtk.Orientation.HORIZONTAL, - adjustment=light_range) + self.light_slider = Gtk.Scale( + orientation=Gtk.Orientation.HORIZONTAL, adjustment=light_range + ) self.light_slider.set_value(light) - self.light_slider.connect('value-changed', - self.slider_changed, 'light') + self.light_slider.connect("value-changed", self.slider_changed, "light") box.add(self.colorchooser) @@ -59,10 +70,10 @@ def __init__(self, parent, current_file, gcolor): self.show_all() def slider_changed(self, slider, *arg): - newval = -slider.get_value() if arg[0] == 'sat' else slider.get_value() + newval = -slider.get_value() if arg[0] == "sat" else slider.get_value() red, green, blue, _ = self.colorchooser.get_rgba() - rgb = list(map(lambda x: round(x*100*2.55), [red, green, blue])) + rgb = list(map(lambda x: round(x * 100 * 2.55), [red, green, blue])) newhex = util.set_hls_val(util.rgb_to_hex(rgb), arg[0], newval) new_gcolor = Gdk.RGBA() diff --git a/wpgtk/gui/keyword_dialog.py b/wpgtk/gui/keyword_dialog.py index 684bfd6..30cc8f3 100644 --- a/wpgtk/gui/keyword_dialog.py +++ b/wpgtk/gui/keyword_dialog.py @@ -1,14 +1,24 @@ from gi import require_version -require_version("Gtk", "3.0") + +require_version("Gtk", "4.0") from gi.repository import Gtk # noqa: E402 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)) + 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() @@ -24,6 +34,6 @@ def __init__(self, parent): def get_section_name(self): if len(self.name_text_input.get_text()) <= 0: - raise Exception('Empty name not allowed') + 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 6e85ec4..b17c92f 100644 --- a/wpgtk/gui/keyword_grid.py +++ b/wpgtk/gui/keyword_grid.py @@ -1,8 +1,10 @@ import logging from ..data import keywords from ..data.config import user_keywords, settings, write_conf +from . import util from gi import require_version -require_version("Gtk", "3.0") + +require_version("Gtk", "4.0") from .keyword_dialog import KeywordDialog # noqa: E402 from gi.repository import Gtk # noqa: E402 @@ -16,27 +18,27 @@ def __init__(self, parent): Gtk.Grid.__init__(self) self.parent = parent - self.set_border_width(PAD) self.set_column_homogeneous(1) + util.set_uniform_margins(self, PAD) self.set_row_spacing(PAD) self.set_column_spacing(PAD) self.liststore = Gtk.ListStore(str, str) - self.remove_button = Gtk.Button('Remove Keyword') - self.remove_button.connect('clicked', self.remove_keyword) + self.remove_button = Gtk.Button(label="Remove Keyword") + self.remove_button.connect("clicked", self.remove_keyword) - self.add_button = Gtk.Button('Add Keyword') - self.add_button.connect('clicked', self.append_new_keyword) + self.add_button = Gtk.Button(label="Add Keyword") + self.add_button.connect("clicked", self.append_new_keyword) - self.choose_button = Gtk.Button('Choose Set') - self.choose_button.connect('clicked', self.choose_keywords_section) + self.choose_button = Gtk.Button(label="Choose Set") + self.choose_button.connect("clicked", self.choose_keywords_section) - self.create_button = Gtk.Button('Create Set') - self.create_button.connect('clicked', self.create_keywords_section) + self.create_button = Gtk.Button(label="Create Set") + self.create_button.connect("clicked", self.create_keywords_section) - self.delete_button = Gtk.Button('Delete Set') - self.delete_button.connect('clicked', self.delete_keywords_section) + self.delete_button = Gtk.Button(label="Delete Set") + self.delete_button.connect("clicked", self.delete_keywords_section) self.sections_combo = Gtk.ComboBoxText() self.sections_combo.connect("changed", self.on_section_change) @@ -45,19 +47,19 @@ def __init__(self, parent): 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.delete_button.set_sensitive(self.selected_file != "default") self.choose_button.set_sensitive(False) self.reload_keyword_list() - self.status_lbl = Gtk.Label('') + self.status_lbl = Gtk.Label(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(320) scroll.set_propagate_natural_height(True) - scroll.add(self.keyword_tree) + scroll.set_child(self.keyword_tree) self.attach(self.sections_combo, 0, 0, 2, 1) self.attach(self.choose_button, 2, 0, 1, 1) @@ -69,12 +71,12 @@ def __init__(self, parent): self.attach(self.status_lbl, 0, 4, 4, 1) key_renderer = Gtk.CellRendererText() - key_renderer.set_property('editable', True) - key_renderer.connect('edited', self.text_edited, 0) + key_renderer.set_property("editable", True) + key_renderer.connect("edited", self.text_edited, 0) value_renderer = Gtk.CellRendererText() - value_renderer.set_property('editable', True) - value_renderer.connect('edited', self.text_edited, 1) + value_renderer.set_property("editable", True) + value_renderer.connect("edited", self.text_edited, 1) keyword_text = Gtk.TreeViewColumn("Keyword", key_renderer, text=0) self.keyword_tree.append_column(keyword_text) @@ -83,7 +85,7 @@ def __init__(self, parent): self.keyword_tree.append_column(value_text) def remove_keyword(self, widget): - self.status_lbl.set_text('') + self.status_lbl.set_text("") (m, pathlist) = self.keyword_tree.get_selection().get_selected_rows() for path in pathlist: @@ -93,22 +95,20 @@ def remove_keyword(self, widget): self.reload_keyword_list() def text_edited(self, widget, path, text, col): - self.status_lbl.set_text('') - if (col == 0): + self.status_lbl.set_text("") + 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_section_list(self, active='default'): + def reload_section_list(self, active="default"): sections = list(user_keywords.sections()) self.sections_combo.remove_all() @@ -130,16 +130,16 @@ def on_section_change(self, widget): if self.selected_file is not None: self.reload_keyword_list() self.choose_button.set_sensitive( - settings.get('keywords', 'default') != self.selected_file + settings.get("keywords", "default") != self.selected_file ) - settings['keywords'] = self.selected_file - self.delete_button.set_sensitive(self.selected_file != 'default') + 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('') + self.status_lbl.set_text("") keywords.create_pair( - 'keyword' + str(len(self.liststore)), - 'value', + "keyword" + str(len(self.liststore)), + "value", self.selected_file, ) self.reload_keyword_list() diff --git a/wpgtk/gui/option_grid.py b/wpgtk/gui/option_grid.py index 809e807..8103a06 100644 --- a/wpgtk/gui/option_grid.py +++ b/wpgtk/gui/option_grid.py @@ -1,49 +1,49 @@ from gi import require_version +from . import util from ..data.config import settings, write_conf from pywal import colors -require_version("Gtk", "3.0") -from gi.repository import Gtk, Gdk # noqa: E402 + +require_version("Gtk", "4.0") +from gi.repository import Gtk # noqa: E402 PAD = 10 class OptionsGrid(Gtk.Grid): - def __init__(self, parent): + def __init__(self, parent): Gtk.Grid.__init__(self) self.parent = parent - self.set_border_width(PAD) self.set_column_homogeneous(1) self.set_row_spacing(PAD) self.set_column_spacing(PAD) # Switch Grid self.switch_grid = Gtk.Grid() - self.switch_grid.set_border_width(PAD) self.switch_grid.set_column_homogeneous(1) + util.set_uniform_margins(self, PAD) self.switch_grid.set_row_spacing(PAD) self.switch_grid.set_column_spacing(PAD) # Active Color Grid self.active_grid = Gtk.Grid() - self.active_grid.set_border_width(PAD) self.active_grid.set_column_homogeneous(1) self.active_grid.set_row_spacing(PAD) self.active_grid.set_column_spacing(PAD) # Setting up ComboBox - color_list = ['Random'] + [str(x) for x in range(1, 16)] + color_list = ["Random"] + [str(x) for x in range(1, 16)] self.color_combo = Gtk.ComboBoxText() for elem in list(color_list): self.color_combo.append_text(elem) - self.color_combo.connect("changed", self.combo_box_change, "active") + 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.color_button = Gtk.Button(label="Active/Inactive Color") + self.save_button = Gtk.Button(label="Save") + self.save_button.connect("clicked", self.on_save_button) # Backend Combo - self.backend_lbl = Gtk.Label("Select your backend:") + self.backend_lbl = Gtk.Label(label="Select your backend:") self.backend_combo = Gtk.ComboBoxText() self.backend_list = colors.list_backends() @@ -53,85 +53,59 @@ def __init__(self, parent): # Switches self.gtk_switch = Gtk.Switch() - self.gtk_switch.connect("notify::active", self.on_activate, "gtk") - self.lbl_gtk = Gtk.Label("Reload GTK+") + self.gtk_switch.connect("notify::active", self.on_activate, "gtk") + self.lbl_gtk = Gtk.Label(label="Reload GTK+") self.vte_switch = Gtk.Switch() - self.vte_switch.connect( - "notify::active", - self.on_activate, - "vte" - ) - self.lbl_vte = Gtk.Label("Use VTE Fix") + self.vte_switch.connect("notify::active", self.on_activate, "vte") + self.lbl_vte = Gtk.Label(label="Use VTE Fix") self.light_theme_switch = Gtk.Switch() self.light_theme_switch.connect( - "notify::active", - self.on_activate, - "light_theme" + "notify::active", self.on_activate, "light_theme" ) - self.lbl_light_theme = Gtk.Label("Use light themes") + self.lbl_light_theme = Gtk.Label(label="Use light themes") self.wallpaper_switch = Gtk.Switch() self.wallpaper_switch.connect( - "notify::active", - self.on_activate, - "set_wallpaper" + "notify::active", self.on_activate, "set_wallpaper" ) - self.lbl_wallpaper = Gtk.Label("Set wallpaper") + self.lbl_wallpaper = Gtk.Label(label="Set wallpaper") self.smart_sort_switch = Gtk.Switch() - self.smart_sort_switch.connect( - "notify::active", - self.on_activate, - "smart_sort" - ) - self.lbl_smart_sort = Gtk.Label("Use smart sort") + self.smart_sort_switch.connect("notify::active", self.on_activate, "smart_sort") + self.lbl_smart_sort = Gtk.Label(label="Use smart sort") self.auto_adjust_switch = Gtk.Switch() self.auto_adjust_switch.connect( - "notify::active", - self.on_activate, - "auto_adjust" + "notify::active", self.on_activate, "auto_adjust" ) - self.lbl_auto_adjust = Gtk.Label("Always auto adjust") + self.lbl_auto_adjust = Gtk.Label(label="Always auto adjust") self.reload_switch = Gtk.Switch() - self.reload_switch.connect( - "notify::active", - self.on_activate, - "reload" - ) - self.lbl_reload = Gtk.Label("Reload other software") + self.reload_switch.connect("notify::active", self.on_activate, "reload") + self.lbl_reload = Gtk.Label(label="Reload other software") self.terminal_switch = Gtk.Switch() - self.terminal_switch.connect( - "notify::active", - self.on_activate, - "terminal" - ) - self.lbl_terminal = Gtk.Label("Change terminal colors") + self.terminal_switch.connect("notify::active", self.on_activate, "terminal") + self.lbl_terminal = Gtk.Label(label="Change terminal colors") # edit cmd - self.editor_lbl = Gtk.Label("Open optional files with:") + self.editor_lbl = Gtk.Label(label="Open optional files with:") self.editor_txt = Gtk.Entry() self.editor_txt.connect("changed", self.on_txt_change, "editor") # cmd - self.command_lbl = Gtk.Label("Run command after") - self.command_exe_lbl = Gtk.Label("Command: ") + self.command_lbl = Gtk.Label(label="Run command after") + self.command_exe_lbl = Gtk.Label(label="Command: ") self.command_txt = Gtk.Entry() self.command_txt.connect("changed", self.on_txt_change, "command") self.command_switch = Gtk.Switch() - self.command_switch.connect( - "notify::active", - self.on_activate, - "execute_cmd" - ) + self.command_switch.connect("notify::active", self.on_activate, "execute_cmd") - self.alpha_lbl = Gtk.Label('Alpha:') + self.alpha_lbl = Gtk.Label(label="Alpha:") self.alpha_txt = Gtk.Entry() self.alpha_txt.connect("changed", self.on_txt_change, "alpha") self.load_opt_list() @@ -181,13 +155,13 @@ def __init__(self, parent): self.active_grid.attach(self.save_button, 1, 6, 2, 1) - self.attach(self.switch_grid, 1, 1, 1, 1) - self.attach(self.active_grid, 1, 2, 1, 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'): + 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.save_button.set_sensitive(True) @@ -197,35 +171,21 @@ def load_opt_list(self): idx = self.backend_list.index(current_backend) self.backend_combo.set_active(idx) - self.color_combo\ - .set_active(settings.getint("active", 0)) - self.gtk_switch\ - .set_active(settings.getboolean("gtk", True)) - self.command_switch\ - .set_active(settings.getboolean("execute_cmd", False)) - self.light_theme_switch\ - .set_active(settings.getboolean("light_theme", False)) - self.vte_switch\ - .set_active(settings.getboolean("vte", False)) - self.wallpaper_switch\ - .set_active(settings.getboolean("set_wallpaper", True)) - self.smart_sort_switch\ - .set_active(settings.getboolean("smart_sort", True)) - self.auto_adjust_switch\ - .set_active(settings.getboolean("auto_adjust", False)) - self.reload_switch\ - .set_active(settings.getboolean("reload", True)) - self.terminal_switch\ - .set_active(settings.getboolean("terminal", True)) - - self.editor_txt\ - .set_text(settings.get("editor", "urxvt -e vim")) - self.command_txt\ - .set_text(settings.get("command", "yes hi")) - self.command_txt\ - .set_editable(settings.getboolean("execute_cmd", False)) - self.alpha_txt\ - .set_text(settings.get("alpha", "100")) + self.color_combo.set_active(settings.getint("active", 0)) + self.gtk_switch.set_active(settings.getboolean("gtk", True)) + self.command_switch.set_active(settings.getboolean("execute_cmd", False)) + self.light_theme_switch.set_active(settings.getboolean("light_theme", False)) + self.vte_switch.set_active(settings.getboolean("vte", False)) + self.wallpaper_switch.set_active(settings.getboolean("set_wallpaper", True)) + self.smart_sort_switch.set_active(settings.getboolean("smart_sort", True)) + self.auto_adjust_switch.set_active(settings.getboolean("auto_adjust", False)) + self.reload_switch.set_active(settings.getboolean("reload", True)) + self.terminal_switch.set_active(settings.getboolean("terminal", True)) + + self.editor_txt.set_text(settings.get("editor", "urxvt -e vim")) + self.command_txt.set_text(settings.get("command", "yes hi")) + self.command_txt.set_editable(settings.getboolean("execute_cmd", False)) + self.alpha_txt.set_text(settings.get("alpha", "100")) def combo_box_change(self, combo, *gparam): x = combo.get_active() @@ -233,8 +193,8 @@ def combo_box_change(self, combo, *gparam): 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) + bgcolor = f"#{self.parent.cpage.color_list[x]}" + util.set_widget_colors(self.color_button, background=bgcolor) if gparam[0] == "backend": settings[gparam[0]] = item self.save_button.set_sensitive(True) @@ -243,6 +203,6 @@ def on_txt_change(self, gtk_entry, *gparam): settings[gparam[0]] = gtk_entry.get_text() self.save_button.set_sensitive(True) - def on_save_button(self, button): + def on_save_button(self, button): write_conf() self.save_button.set_sensitive(False) diff --git a/wpgtk/gui/template_grid.py b/wpgtk/gui/template_grid.py index c7b9c16..6a6a7b8 100644 --- a/wpgtk/gui/template_grid.py +++ b/wpgtk/gui/template_grid.py @@ -4,29 +4,30 @@ from subprocess import Popen from ..data.config import OPT_DIR, settings from ..data import files +from . import util from gi import require_version -require_version("Gtk", "3.0") + +require_version("Gtk", "4.0") from gi.repository import Gtk # noqa: E402 from gi.repository.GdkPixbuf import Pixbuf # noqa: E402 PAD = 10 -icon = 'document-open' +icon = "document-open" class TemplateGrid(Gtk.Grid): - """A helper for choosing config files that will be modified with wpgtk's help""" def __init__(self, parent): Gtk.Grid.__init__(self) self.current = None - self.sel_file = '' + self.sel_file = "" self.parent = parent - self.set_border_width(PAD) self.set_column_homogeneous(1) + util.set_uniform_margins(self, PAD) self.set_row_spacing(PAD) self.set_column_spacing(PAD) @@ -35,30 +36,38 @@ def __init__(self, parent): self.grid_edit.set_row_spacing(PAD) self.grid_edit.set_column_spacing(PAD) - self.button_add = Gtk.Button('Add') - 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_edit = Gtk.Button('Edit') - self.button_edit.connect('clicked', self.on_open_clicked) + self.button_add = Gtk.Button(label="Add") + self.button_add.connect("clicked", self.on_add_clicked) + self.button_rm = Gtk.Button(label="Remove") + self.button_rm.connect("clicked", self.on_rm_clicked) + self.button_edit = Gtk.Button(label="Edit") + self.button_edit.connect("clicked", self.on_open_clicked) - self.liststore = Gtk.ListStore(Pixbuf, str) + self.liststore = Gtk.ListStore(Gtk.IconPaintable, str) self.file_view = Gtk.IconView.new() self.file_view.set_model(self.liststore) self.file_view.set_activate_on_single_click(True) self.file_view.set_pixbuf_column(0) self.file_view.set_text_column(1) - self.file_view.connect('item-activated', self.on_file_click) + self.file_view.connect("item-activated", self.on_file_click) self.scroll = Gtk.ScrolledWindow() self.scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.scroll.set_min_content_height(400) - self.scroll.add(self.file_view) + self.scroll.set_child(self.file_view) self.item_names = files.get_file_list(OPT_DIR, r".*\.base$") + self.icon_theme = Gtk.IconTheme() for filen in self.item_names: - pixbuf = Gtk.IconTheme.get_default().load_icon(icon, 64, 0) + pixbuf = self.icon_theme.lookup_icon( + icon, + None, + 64, + 1, + Gtk.TextDirection.LTR, + Gtk.IconLookupFlags.FORCE_REGULAR, + ) self.liststore.append([pixbuf, filen]) self.grid_edit.attach(self.button_add, 0, 0, 2, 1) @@ -69,12 +78,17 @@ def __init__(self, parent): self.attach(self.grid_edit, 0, 0, 1, 1) def on_add_clicked(self, widget): - filechooser = Gtk.FileChooserDialog("Select an Image", self.parent, - Gtk.FileChooserAction.OPEN, - (Gtk.STOCK_CANCEL, - Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN, - Gtk.ResponseType.OK)) + filechooser = Gtk.FileChooserDialog( + "Select an Image", + self.parent, + Gtk.FileChooserAction.OPEN, + ( + Gtk.STOCK_CANCEL, + Gtk.ResponseType.CANCEL, + Gtk.STOCK_OPEN, + Gtk.ResponseType.OK, + ), + ) filefilter = Gtk.FileFilter() filechooser.set_select_multiple(True) filefilter.set_name("Text") @@ -97,7 +111,7 @@ def on_add_clicked(self, widget): def on_open_clicked(self, widget): if self.current is not None: item = self.item_names[self.current] - args_list = settings['editor'].split(' ') + args_list = settings["editor"].split(" ") args_list.append(os.path.join(OPT_DIR, item)) try: Popen(args_list) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index 5b24c10..467fe1f 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -12,7 +12,7 @@ from gi import require_version -require_version("Gtk", "3.0") +require_version("Gtk", "4.0") from gi.repository import Gtk # noqa: E402 PAD = 10 @@ -33,11 +33,11 @@ def __init__(self, args): logging.info("current wallpaper: " + file_name) sample_name = files.get_sample_path(file_name) self.notebook = Gtk.Notebook() - self.add(self.notebook) + self.set_child(self.notebook) self.wpage = Gtk.Grid() - self.wpage.set_border_width(PAD) self.wpage.set_column_homogeneous(1) + util.set_uniform_margins(self.wpage, PAD) self.wpage.set_row_spacing(PAD) self.wpage.set_column_spacing(PAD) @@ -46,11 +46,11 @@ def __init__(self, args): self.optpage = option_grid.OptionsGrid(self) self.keypage = keyword_grid.KeywordGrid(self) - self.notebook.append_page(self.wpage, Gtk.Label("Wallpapers")) - self.notebook.append_page(self.cpage, Gtk.Label("Colors")) - self.notebook.append_page(self.fpage, Gtk.Label("Templates")) - self.notebook.append_page(self.keypage, Gtk.Label("Keywords")) - self.notebook.append_page(self.optpage, Gtk.Label("Options")) + self.notebook.append_page(self.wpage, Gtk.Label(label="Wallpapers")) + self.notebook.append_page(self.cpage, Gtk.Label(label="Colors")) + self.notebook.append_page(self.fpage, Gtk.Label(label="Templates")) + self.notebook.append_page(self.keypage, Gtk.Label(label="Keywords")) + self.notebook.append_page(self.optpage, Gtk.Label(label="Options")) option_list = Gtk.ListStore(str) current_idx = None @@ -73,7 +73,6 @@ def __init__(self, args): self.colorscheme.add_attribute(self.renderer_text, "text", 0) self.colorscheme.set_entry_text_column(0) - self.set_border_width(10) self.preview = Gtk.Image() self.sample = Gtk.Image() From 6d4ed83ea003df94a1c091b71925e60b97a5ea0f Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sat, 16 Aug 2025 21:45:29 -0600 Subject: [PATCH 05/10] replace deprecated color chooser dialog with ColorDialog --- wpgtk/gui/color_grid.py | 27 ++++++++----- wpgtk/gui/color_picker.py | 81 --------------------------------------- 2 files changed, 18 insertions(+), 90 deletions(-) delete mode 100644 wpgtk/gui/color_picker.py diff --git a/wpgtk/gui/color_grid.py b/wpgtk/gui/color_grid.py index df3d775..75b7448 100644 --- a/wpgtk/gui/color_grid.py +++ b/wpgtk/gui/color_grid.py @@ -10,7 +10,6 @@ from ..data import themer from . import util as gui_util -from .color_picker import ColorDialog from gi import require_version require_version("Gtk", "4.0") @@ -259,30 +258,40 @@ def on_shuffle_click(self, widget): def on_color_click(self, widget): self.done_lbl.set_text("") + self.active_color_button = widget gcolor = Gdk.RGBA() gcolor.parse(widget.get_label()) - dialog = ColorDialog(self.parent, self.selected_file, gcolor) - response = dialog.run() + dialog = Gtk.ColorDialog() + dialog.set_with_alpha(False) + dialog.set_title("Choose a Color") + dialog.choose_rgba( + parent=self.parent, initial_color=gcolor, callback=self.on_color_selected + ) - if response == Gtk.ResponseType.OK: - r, g, b, _ = dialog.colorchooser.get_rgba() + def on_color_selected(self, dialog, result): + rgba = dialog.choose_rgba_finish(result) + + if rgba: + r, g, b, _ = rgba rgb = list(map(lambda x: round(x * 100 * 2.55), [r, g, b])) hex_color = pywal.util.rgb_to_hex(rgb) - widget.set_label(hex_color) + # widget.set_label(hex_color) if util.get_hls_val(hex_color, "light") < 100: fgcolor = "#FFFFFF" else: fgcolor = "#000000" - widget.set_sensitive(True) - gui_util.set_widget_colors(widget, background=hex_color, foreground=fgcolor) + self.active_color_button.set_sensitive(True) + self.active_color_button.set_label(hex_color) + gui_util.set_widget_colors( + self.active_color_button, background=hex_color, foreground=fgcolor + ) for i, c in enumerate(self.button_list): if c.get_label() != self.color_list[i]: self.color_list[i] = c.get_label() self.render_sample() - dialog.destroy() def combo_box_change(self, widget): self.done_lbl.set_text("") diff --git a/wpgtk/gui/color_picker.py b/wpgtk/gui/color_picker.py deleted file mode 100644 index b8ca347..0000000 --- a/wpgtk/gui/color_picker.py +++ /dev/null @@ -1,81 +0,0 @@ -from ..data import util -from gi import require_version - -require_version("Gtk", "4.0") -require_version("Gdk", "4.0") -from gi.repository import Gtk # noqa: E402 -from gi.repository import Gdk # noqa: E402 - - -class ColorDialog(Gtk.Dialog): - - def __init__(self, parent, current_file, gcolor): - Gtk.Dialog.__init__( - self, - "Pick a Color", - parent, - 0, - ( - Gtk.STOCK_CANCEL, - Gtk.ResponseType.CANCEL, - Gtk.STOCK_OK, - Gtk.ResponseType.OK, - ), - ) - - self.set_default_size(150, 100) - box = self.get_content_area() - box.set_border_width(10) - box.set_spacing(10) - - sat_box = Gtk.Box(spacing=10, orientation=Gtk.Orientation.HORIZONTAL) - light_box = Gtk.Box(spacing=10, orientation=Gtk.Orientation.HORIZONTAL) - - self.colorchooser = Gtk.ColorChooserWidget(show_editor=True) - self.colorchooser.set_use_alpha(False) - self.colorchooser.set_rgba(gcolor) - - r, g, b, _ = list(map(lambda x: round(x * 100 * 2.55), gcolor)) - hue, light, sat = util.rgb_to_hls(r, g, b) - - self.sat_lbl = Gtk.Label("Saturation") - self.light_lbl = Gtk.Label("Light ") - - sat_range = Gtk.Adjustment(0, 0, 1, 0.1, 0.1, 0) - self.sat_slider = Gtk.Scale( - orientation=Gtk.Orientation.HORIZONTAL, adjustment=sat_range - ) - self.sat_slider.set_value(-sat) - self.sat_slider.set_digits(2) - self.sat_slider.connect("value-changed", self.slider_changed, "sat") - - light_range = Gtk.Adjustment(5, 0, 255, 1, 10, 0) - self.light_slider = Gtk.Scale( - orientation=Gtk.Orientation.HORIZONTAL, adjustment=light_range - ) - self.light_slider.set_value(light) - self.light_slider.connect("value-changed", self.slider_changed, "light") - - box.add(self.colorchooser) - - sat_box.pack_start(self.sat_lbl, True, True, 0) - sat_box.pack_start(self.sat_slider, True, True, 0) - - light_box.pack_start(self.light_lbl, True, True, 0) - light_box.pack_start(self.light_slider, True, True, 0) - - box.add(light_box) - box.add(sat_box) - - self.show_all() - - def slider_changed(self, slider, *arg): - newval = -slider.get_value() if arg[0] == "sat" else slider.get_value() - - red, green, blue, _ = self.colorchooser.get_rgba() - rgb = list(map(lambda x: round(x * 100 * 2.55), [red, green, blue])) - newhex = util.set_hls_val(util.rgb_to_hex(rgb), arg[0], newval) - - new_gcolor = Gdk.RGBA() - new_gcolor.parse(newhex) - self.colorchooser.set_rgba(new_gcolor) From 461fa57417b42212452ea11985f0ece7d385f071 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Sat, 16 Aug 2025 21:45:41 -0600 Subject: [PATCH 06/10] replace deprecated FileChooserDialog with FileDialog --- wpgtk/gui/color_grid.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/wpgtk/gui/color_grid.py b/wpgtk/gui/color_grid.py index 75b7448..e49b256 100644 --- a/wpgtk/gui/color_grid.py +++ b/wpgtk/gui/color_grid.py @@ -227,29 +227,24 @@ def on_reset_click(self, widget): self.render_theme() def on_import_click(self, widget): - fcd = Gtk.FileChooserDialog( - "Select a colorscheme", - self.parent, - Gtk.FileChooserAction.OPEN, - ( - Gtk.STOCK_CANCEL, - Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN, - Gtk.ResponseType.OK, - ), - ) + fcd = Gtk.FileDialog() filter = Gtk.FileFilter() filter.set_name("JSON colorscheme") filter.add_mime_type("application/json") - fcd.add_filter(filter) - response = fcd.run() - if response == Gtk.ResponseType.OK: - self.color_list = color.get_color_list(fcd.get_filename(), True) + fcd.set_default_filter(filter) + fcd.set_title("Select a colorscheme") + + fcd.open(parent=self.parent, callback=self.on_import_finish) + + def on_import_finish(self, dialog, result): + filename = dialog.open_finish(result) + + if filename: + self.color_list = color.get_color_list(filename, True) self.render_buttons() self.render_sample() - fcd.destroy() def on_shuffle_click(self, widget): self.color_list = color.shuffle_colors(self.color_list) From d902c06d8c80406291f29f4397f395f8c91d64eb Mon Sep 17 00:00:00 2001 From: deviantfero Date: Tue, 9 Dec 2025 20:11:16 -0600 Subject: [PATCH 07/10] replace Gtk.Image() with new Gtk.Picture() --- wpgtk/gui/color_grid.py | 26 +++++++------------------- wpgtk/gui/theme_picker.py | 19 +++++-------------- 2 files changed, 12 insertions(+), 33 deletions(-) diff --git a/wpgtk/gui/color_grid.py b/wpgtk/gui/color_grid.py index e49b256..a833a53 100644 --- a/wpgtk/gui/color_grid.py +++ b/wpgtk/gui/color_grid.py @@ -13,7 +13,7 @@ from gi import require_version require_version("Gtk", "4.0") -from gi.repository import Gtk, Gdk, GdkPixbuf # noqa: E402 +from gi.repository import Gtk, Gdk # noqa: E402 # TODO: remove current_walls call, use simple list # TODO: use simple text combo @@ -87,11 +87,7 @@ def __init__(self, parent): cont += 1 sample_name = os.path.join(SAMPLE_DIR, ".no_sample.sample.png") - self.sample = Gtk.Image() - - pixbuf_sample = gui_util.get_sample_pixbuf(sample_name) - if pixbuf_sample is not None: - self.sample.set_from_pixbuf(self.pixbuf_sample) + self.sample = Gtk.Picture.new_for_filename(sample_name) self.shuffle_button = Gtk.Button(label="Shuffle colors") self.shuffle_button.connect("clicked", self.on_shuffle_click) @@ -170,13 +166,11 @@ def render_theme(self): self.color_list = themer.set_fallback_theme(self.selected_file) self.render_buttons() - pixbuf_sample = gui_util.get_sample_pixbuf(sample_path) - if pixbuf_sample is None: + if not os.path.isfile(sample_path): sample.create_sample(self.color_list, sample_path) - pixbuf_sample = gui_util.get_sample_pixbuf(sample_path) - self.sample.set_from_pixbuf(pixbuf_sample) - self.parent.sample.set_from_pixbuf(pixbuf_sample) + self.sample.set_filename(sample_path) + self.parent.sample.set_filename(sample_path) def hls_change(self, widget, *gparam): if gparam[0] == "sat": @@ -195,10 +189,7 @@ def hls_change(self, widget, *gparam): def render_sample(self): sample.create_sample(self.color_list) sample_path = os.path.join(SAMPLE_DIR, ".tmp.sample.png") - self.pixbuf_sample = GdkPixbuf.Pixbuf.new_from_file_at_size( - sample_path, width=500, height=300 - ) - self.sample.set_from_pixbuf(self.pixbuf_sample) + self.sample.set_filename(sample_path) def on_ok_click(self, widget): color.write_colors(self.selected_file, self.color_list) @@ -212,10 +203,7 @@ def on_ok_click(self, widget): self.done_lbl.set_text("Changes saved") sample_path = files.get_sample_path(self.selected_file) - self.parent.pixbuf_sample = GdkPixbuf.Pixbuf.new_from_file_at_size( - sample_path, width=500, height=300 - ) - self.parent.sample.set_from_pixbuf(self.pixbuf_sample) + self.parent.sample.set_filename(sample_path) def on_auto_click(self, widget): self.color_list = color.auto_adjust(self.color_list) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index 467fe1f..3410eca 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -73,8 +73,8 @@ def __init__(self, args): self.colorscheme.add_attribute(self.renderer_text, "text", 0) self.colorscheme.set_entry_text_column(0) - self.preview = Gtk.Image() - self.sample = Gtk.Image() + self.preview = Gtk.Picture() + self.sample = Gtk.Picture() self.get_image_preview(image_name, sample_name) @@ -184,21 +184,12 @@ def colorscheme_box_change(self, widget): # called on opening to looad the current image def get_image_preview(self, image_name, sample_name): - pixbuf_preview = util.get_preview_pixbuf(image_name) - pixbuf_sample = util.get_sample_pixbuf(sample_name) - - if pixbuf_preview is not None: - self.preview.set_from_pixbuf(pixbuf_preview) - - if pixbuf_sample is not None: - self.sample.set_from_pixbuf(pixbuf_sample) + self.preview.set_filename(image_name) + self.sample.set_filename(sample_name) # called when combo box changes the selected image def set_image_preview(self, filepath): - pixbuf_preview = util.get_preview_pixbuf(filepath) - - if pixbuf_preview is not None: - self.preview.set_from_pixbuf(pixbuf_preview) + self.preview.set_filename(filepath) def run(args): From bfe4ecbe1e277b5a23c9846706d8e7e83cedf6fe Mon Sep 17 00:00:00 2001 From: deviantfero Date: Tue, 9 Dec 2025 20:31:55 -0600 Subject: [PATCH 08/10] rename window class, make sample not expand --- wpgtk/gui/theme_picker.py | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index 3410eca..6c54018 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -18,7 +18,7 @@ PAD = 10 -class mainWindow(Gtk.Window): +class MainWindow(Gtk.Window): def __init__(self, args): Gtk.Window.__init__(self, title="wpgtk " + __version__) @@ -73,15 +73,24 @@ def __init__(self, args): self.colorscheme.add_attribute(self.renderer_text, "text", 0) self.colorscheme.set_entry_text_column(0) - self.preview = Gtk.Picture() - self.sample = Gtk.Picture() + self.preview = Gtk.Picture.new_for_filename(image_name) + self.preview.set_hexpand(False) + self.preview.set_vexpand(False) + self.preview.set_halign(Gtk.Align.CENTER) + self.preview.set_valign(Gtk.Align.CENTER) - self.get_image_preview(image_name, sample_name) + self.sample = Gtk.Picture.new_for_filename(sample_name) + self.sample.set_hexpand(False) + self.sample.set_vexpand(False) + + self.preview.set_content_fit( + Gtk.ContentFit.SCALE_DOWN + ) # or CONTAIN, COVER, FILL + self.sample.set_content_fit(Gtk.ContentFit.SCALE_DOWN) self.add_button = Gtk.Button(label="Add") self.set_button = Gtk.Button(label="Set") self.rm_button = Gtk.Button(label="Remove") - # adds to first cell in wpage self.wpage.attach(self.option_combo, 1, 1, 2, 1) self.wpage.attach(self.colorscheme, 1, 2, 2, 1) @@ -176,27 +185,18 @@ def combo_box_change(self, widget): selected_file = files.get_file_list()[x] filepath = os.path.join(WALL_DIR, selected_file) - self.set_image_preview(filepath) + self.preview.set_filename(filepath) def colorscheme_box_change(self, widget): x = self.colorscheme.get_active() self.cpage.option_combo.set_active(x) - # called on opening to looad the current image - def get_image_preview(self, image_name, sample_name): - self.preview.set_filename(image_name) - self.sample.set_filename(sample_name) - - # called when combo box changes the selected image - def set_image_preview(self, filepath): - self.preview.set_filename(filepath) - def run(args): app = Gtk.Application(application_id="com.deviantfero.wpgtk") def on_activate(app): - win = mainWindow(args) + win = MainWindow(args) win.set_application(app) win.present() From 35b335707afec71fd0d0383eea1b0412c9261f96 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Tue, 9 Dec 2025 20:55:48 -0600 Subject: [PATCH 09/10] work on image size --- wpgtk/gui/theme_picker.py | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/wpgtk/gui/theme_picker.py b/wpgtk/gui/theme_picker.py index 6c54018..7e6ea14 100755 --- a/wpgtk/gui/theme_picker.py +++ b/wpgtk/gui/theme_picker.py @@ -30,16 +30,22 @@ def __init__(self, args): # these variables are just to get the image # and preview of current wallpaper file_name = themer.get_current() - logging.info("current wallpaper: " + file_name) sample_name = files.get_sample_path(file_name) + logging.info("current wallpaper: " + file_name) + + self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + util.set_uniform_margins(self.box, PAD) + self.notebook = Gtk.Notebook() - self.set_child(self.notebook) + self.notebook.set_vexpand(True) + self.box.append(self.notebook) + self.set_child(self.box) self.wpage = Gtk.Grid() self.wpage.set_column_homogeneous(1) - util.set_uniform_margins(self.wpage, PAD) self.wpage.set_row_spacing(PAD) self.wpage.set_column_spacing(PAD) + util.set_uniform_margins(self.wpage, PAD) self.cpage = color_grid.ColorGrid(self) self.fpage = template_grid.TemplateGrid(self) @@ -74,19 +80,10 @@ def __init__(self, args): self.colorscheme.set_entry_text_column(0) self.preview = Gtk.Picture.new_for_filename(image_name) - self.preview.set_hexpand(False) - self.preview.set_vexpand(False) - self.preview.set_halign(Gtk.Align.CENTER) - self.preview.set_valign(Gtk.Align.CENTER) - self.sample = Gtk.Picture.new_for_filename(sample_name) - self.sample.set_hexpand(False) - self.sample.set_vexpand(False) - self.preview.set_content_fit( - Gtk.ContentFit.SCALE_DOWN - ) # or CONTAIN, COVER, FILL - self.sample.set_content_fit(Gtk.ContentFit.SCALE_DOWN) + self.preview.set_content_fit(Gtk.ContentFit.COVER) + self.sample.set_content_fit(Gtk.ContentFit.COVER) self.add_button = Gtk.Button(label="Add") self.set_button = Gtk.Button(label="Set") From 796236bd530063154c01be3a9a8eec501b3f2e10 Mon Sep 17 00:00:00 2001 From: deviantfero Date: Tue, 9 Dec 2025 20:59:35 -0600 Subject: [PATCH 10/10] correct typo --- wpgtk/gui/keyword_dialog.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wpgtk/gui/keyword_dialog.py b/wpgtk/gui/keyword_dialog.py index 30cc8f3..62de7b5 100644 --- a/wpgtk/gui/keyword_dialog.py +++ b/wpgtk/gui/keyword_dialog.py @@ -5,11 +5,10 @@ class KeywordDialog(Gtk.Dialog): - def __init__(self, parent): Gtk.Dialog.__init__( self, - "Name you keyword/value set", + "Name your keyword/value set", parent, 0, (