From 1ff3f6e17b99da620f07d846ade8277ae9bcc399 Mon Sep 17 00:00:00 2001 From: Vladyslav Hroshev Date: Wed, 16 Apr 2025 13:29:57 +0300 Subject: [PATCH 1/3] Added group panel buttons tweak --- colors.json | 15 +++++++ tweaks/panel/grouped-buttons.css | 77 ++++++++++++++++++++++++++++++++ tweaks/panel/tweak.py | 5 +++ 3 files changed, 97 insertions(+) create mode 100644 tweaks/panel/grouped-buttons.css diff --git a/colors.json b/colors.json index 06bba6d..c6f3832 100644 --- a/colors.json +++ b/colors.json @@ -486,6 +486,21 @@ "a" : 0.07 } }, + "PANEL-BUTTON-BORDER": { + "_comment" : "Used as border in panel buttons", + + "light" : { + "s" : 0, + "l" : 0, + "a" : 0.07 + }, + + "dark" : { + "s" : 0, + "l" : 100, + "a" : 0.04 + } + }, "SEPARATOR-COLOR" : { "_comment" : "Color for separators", diff --git a/tweaks/panel/grouped-buttons.css b/tweaks/panel/grouped-buttons.css new file mode 100644 index 0000000..ce6c152 --- /dev/null +++ b/tweaks/panel/grouped-buttons.css @@ -0,0 +1,77 @@ +.panel-button { + border-radius: 0; + margin-left: 0; + margin-right: 0; + box-shadow: none; + border: 1px solid PANEL-BUTTON-BORDER !important; + border-left-width: 0 !important; +} + +#panelCenter .panel-button { + border-radius: 9px; + margin-left: 3px; + margin-right: 3px; + box-shadow: none; + border: 1px solid PANEL-BUTTON-BORDER !important; +} + +#panelLeft > StBin:first-child > .panel-button, +#panelRight > StBin:first-child > .panel-button { + border-radius: 9px 0 0 9px; + border: 1px solid PANEL-BUTTON-BORDER !important; + margin-left: 3px; +} + +#panelLeft > StBin:last-child > .panel-button, +#panelRight > StBin:last-child > .panel-button { + border-radius: 0 9px 9px 0; + margin-right: 3px; +} + +#panelLeft > StBin:first-child:last-child > .panel-button, +#panelRight > StBin:first-child:last-child > .panel-button { + border-radius: 9px; + border: 1px solid PANEL-BUTTON-BORDER !important; + margin-left: 3px; + margin-right: 3px; +} + +#panelCenter .clock-display { + border: none !important; +} + +/* in dash to panel leftPanel, centerPanel, rightPanel doesn't work as intended */ +.dashtopanelMainPanel StBin:last-child > .panel-button { + border-radius: 0 !important; + margin-right: 0 !important; +} + +.dashtopanelMainPanel StBin:first-child:last-child > .panel-button { + border-radius: 9px !important; + margin-left: 3px !important; + margin-right: 3px !important; +} + +.dashtopanelMainPanel Gjs_ui_panel_QuickSettings.panel-button { + margin-right: 4px; + border-radius: 0 9px 9px 0; +} + +/* use entire button area for clock */ +.dashtopanelMainPanel .clock-display { + background-color: ACCENT-DISABLED-COLOR !important; + margin-left: 0; + margin-right: 0; + border: 1px solid PANEL-BUTTON-BORDER !important; + border-left-width: 0 !important; +} + +.dashtopanelMainPanel .clock-display .clock { + background-color: transparent; + border: none !important; + box-shadow: none; +} + +.dashtopanelMainPanel .clock-display:hover { + background-color: ACCENT-DISABLED_HOVER !important; +} \ No newline at end of file diff --git a/tweaks/panel/tweak.py b/tweaks/panel/tweak.py index e58e89f..048399b 100755 --- a/tweaks/panel/tweak.py +++ b/tweaks/panel/tweak.py @@ -10,6 +10,7 @@ def define_arguments(parser): panel_args.add_argument('-Pnp', '--panel-no-pill', action='store_true', help='remove panel button background') panel_args.add_argument('-Ptc', '--panel-text-color', type=str, nargs='?', help='custom panel HEX(A) text color') panel_args.add_argument('--wider-panel', action='store_true', help='make the panel wider') + panel_args.add_argument('--panel-grouped-buttons', action='store_true', help='group panel buttons together') def apply_tweak(args, theme, colors): @@ -31,3 +32,7 @@ def apply_tweak(args, theme, colors): .clock-display StIcon {\ color: rgba(" + ', '.join(map(str, ColorConverterImpl.hex_to_rgba(args.panel_text_color))) + ");\ }" + + if args.panel_grouped_buttons: + with open(f"{panel_folder}/grouped-buttons.css", "r") as f: + theme += f.read() \ No newline at end of file From 408fe473ee533a073786a049722e8030c76e7bb7 Mon Sep 17 00:00:00 2001 From: Vladyslav Hroshev Date: Wed, 16 Apr 2025 15:53:36 +0300 Subject: [PATCH 2/3] 'border' as panel button border, add_from_file method - Use 'border' as panel button border, not 'box-shadow'; - Added add_from_file method to ThemePreparation. --- scripts/utils/theme/theme.py | 8 ++++++++ scripts/utils/theme/theme_preparation.py | 9 +++++++++ theme/gnome-shell/.css/panel.css | 7 ++++--- tweaks/overview/tweak.py | 8 ++++---- tweaks/panel/def-size.css | 9 ++++++--- tweaks/panel/grouped-buttons.css | 8 ++------ tweaks/panel/no-pill.css | 4 ++-- tweaks/panel/tweak.py | 19 ++++++++----------- 8 files changed, 43 insertions(+), 29 deletions(-) diff --git a/scripts/utils/theme/theme.py b/scripts/utils/theme/theme.py index 8cac48a..e0489f8 100644 --- a/scripts/utils/theme/theme.py +++ b/scripts/utils/theme/theme.py @@ -68,6 +68,14 @@ class Theme(ThemeBase): self._preparation.add_to_start(content) return self + def add_from_file(self, content) -> "Theme": + """ + Adds content from a file to the main styles file. + :param content: The path of the file to add. + """ + self._preparation.add_from_file(content) + return self + def prepare(self): """Extract theme from source folder and prepare it for installation.""" self._preparation.prepare() diff --git a/scripts/utils/theme/theme_preparation.py b/scripts/utils/theme/theme_preparation.py index c36a12a..1bb2b9f 100644 --- a/scripts/utils/theme/theme_preparation.py +++ b/scripts/utils/theme/theme_preparation.py @@ -40,6 +40,15 @@ class ThemePreparation: self.style_manager.prepend_content(content) return self + def add_from_file(self, content) -> "ThemePreparation": + """ + Adds content from a file to the main styles file. + :param content: The path of the file to add. + """ + with open(content, "r") as f: + self.style_manager.append_content(f.read()) + return self + def prepare(self): """ Extract theme from source folder and prepare it for installation. diff --git a/theme/gnome-shell/.css/panel.css b/theme/gnome-shell/.css/panel.css index 43b478b..d220176 100644 --- a/theme/gnome-shell/.css/panel.css +++ b/theme/gnome-shell/.css/panel.css @@ -31,9 +31,9 @@ .panel-button .clock { /* DND / new messages icon */ color: TEXT-PRIMARY-COLOR; border-radius: 9px; - border-width: 0 !important; + border: 1px solid PANEL-BUTTON-BORDER !important; background-color: ACCENT-DISABLED-COLOR; - box-shadow: inset 0 0 0 1px BORDER-SHADOW; + box-shadow: none; } .panel-button:hover, @@ -87,7 +87,8 @@ /* panel clock fix. remove additional background */ .clock-display { background-color: transparent !important; - box-shadow: none !important; + box-shadow: none; + border: none !important; } /* additional background for DND / new messages icon */ diff --git a/tweaks/overview/tweak.py b/tweaks/overview/tweak.py index ad4ba0d..22d85d7 100755 --- a/tweaks/overview/tweak.py +++ b/tweaks/overview/tweak.py @@ -1,4 +1,6 @@ from scripts import config +from scripts.utils.theme.theme import Theme + overview_folder = f"{config.tweaks_folder}/overview" @@ -7,9 +9,7 @@ def define_arguments(parser): overview_args.add_argument('--launchpad', action='store_true', help='change Show Apps icon to macOS Launchpad icon') -def apply_tweak(args, theme, colors): +def apply_tweak(args, theme: Theme, colors): if args.launchpad: - with open(f"{overview_folder}/launchpad/launchpad.css", "r") as f: - theme += f.read() - + theme.add_from_file(f"{overview_folder}/launchpad/launchpad.css") theme *= f"{overview_folder}/launchpad/launchpad.png" diff --git a/tweaks/panel/def-size.css b/tweaks/panel/def-size.css index 256785d..0526c0b 100644 --- a/tweaks/panel/def-size.css +++ b/tweaks/panel/def-size.css @@ -2,13 +2,16 @@ #panel { height: 2.2em; - font-size: 15px; + font-size: 1em; +} + +.panel-button { + margin: 3px 2px; } .panel-button, .panel-button .clock { - border-radius: 12px; - border: 3px solid transparent !important; + border-radius: 8px; } .panel-button { -natural-hpadding: 10px !important; } diff --git a/tweaks/panel/grouped-buttons.css b/tweaks/panel/grouped-buttons.css index ce6c152..d342a54 100644 --- a/tweaks/panel/grouped-buttons.css +++ b/tweaks/panel/grouped-buttons.css @@ -2,8 +2,6 @@ border-radius: 0; margin-left: 0; margin-right: 0; - box-shadow: none; - border: 1px solid PANEL-BUTTON-BORDER !important; border-left-width: 0 !important; } @@ -11,14 +9,12 @@ border-radius: 9px; margin-left: 3px; margin-right: 3px; - box-shadow: none; - border: 1px solid PANEL-BUTTON-BORDER !important; } #panelLeft > StBin:first-child > .panel-button, #panelRight > StBin:first-child > .panel-button { border-radius: 9px 0 0 9px; - border: 1px solid PANEL-BUTTON-BORDER !important; + border-left-width: 1px !important; margin-left: 3px; } @@ -31,7 +27,7 @@ #panelLeft > StBin:first-child:last-child > .panel-button, #panelRight > StBin:first-child:last-child > .panel-button { border-radius: 9px; - border: 1px solid PANEL-BUTTON-BORDER !important; + border-left-width: 1px !important; margin-left: 3px; margin-right: 3px; } diff --git a/tweaks/panel/no-pill.css b/tweaks/panel/no-pill.css index 81d5ceb..c8b6b0b 100644 --- a/tweaks/panel/no-pill.css +++ b/tweaks/panel/no-pill.css @@ -5,8 +5,8 @@ background-color: transparent; box-shadow: none; margin: 0; - border: 4px solid transparent !important; - border-radius: 12px; + border: 3px solid transparent !important; + border-radius: 10px; } .panel-button:hover, diff --git a/tweaks/panel/tweak.py b/tweaks/panel/tweak.py index 048399b..a32af4f 100755 --- a/tweaks/panel/tweak.py +++ b/tweaks/panel/tweak.py @@ -1,5 +1,6 @@ from scripts import config from scripts.utils.color_converter.color_converter_impl import ColorConverterImpl +from scripts.utils.theme.theme import Theme panel_folder = f"{config.tweaks_folder}/panel" @@ -13,18 +14,15 @@ def define_arguments(parser): panel_args.add_argument('--panel-grouped-buttons', action='store_true', help='group panel buttons together') -def apply_tweak(args, theme, colors): - if args.panel_no_pill: - with open(f"{panel_folder}/no-pill.css", "r") as f: - theme += f.read() - +def apply_tweak(args, theme: Theme, colors): if args.panel_default_size: - with open(f"{panel_folder}/def-size.css", "r") as f: - theme += f.read() + theme.add_from_file(f"{panel_folder}/def-size.css") + + if args.panel_no_pill: + theme.add_from_file(f"{panel_folder}/no-pill.css") if args.wider_panel: - with open(f"{panel_folder}/wider-panel.css", "r") as f: - theme += f.read() + theme.add_from_file(f"{panel_folder}/wider-panel.css") if args.panel_text_color: theme += ".panel-button,\ @@ -34,5 +32,4 @@ def apply_tweak(args, theme, colors): }" if args.panel_grouped_buttons: - with open(f"{panel_folder}/grouped-buttons.css", "r") as f: - theme += f.read() \ No newline at end of file + theme.add_from_file(f"{panel_folder}/grouped-buttons.css") \ No newline at end of file From ad9a2b403410e227108d3ac351c66a9249d256db Mon Sep 17 00:00:00 2001 From: Vladyslav Hroshev Date: Wed, 16 Apr 2025 16:20:14 +0300 Subject: [PATCH 3/3] Update README.md --- README.md | 7 +++++-- readme-images/tweaks/panel-grouped-buttons.png | Bin 0 -> 12970 bytes 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 readme-images/tweaks/panel-grouped-buttons.png diff --git a/README.md b/README.md index 3bc42c8..580b029 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ Icon theme: https://github.com/vinceliuice/Colloid-icon-theme > [!TIP] > If you want to install only one color, use the `--red`, `--yellow`, `--green`, `--blue`, `--purple`, `--gray` option. +Want to install a custom color, group buttons in the panel, use launchpad icon or some other tweaks? See the [installation tweaks](#-installation-tweaks) section for more information. If you want to remove the theme, see the [uninstallation](#%EF%B8%8F-uninstallation--reinstallation) section. @@ -172,19 +173,21 @@ If you want to remove the theme, see the [uninstallation](#%EF%B8%8F-uninstallat #### Panel tweaks **Panel default size** - ![Panel default size](./readme-images/tweaks/panel-default-size.png "Panel default size") **Panel without button background** - ![Panel without buttons background](./readme-images/tweaks/panel-no-pill.png "Panel without buttons background") +**Grouped buttons in the panel** +![Grouped buttons in the panel](./readme-images/tweaks/panel-grouped-buttons.png "Grouped buttons in the panel") + | Option | Secondary option | Description | |----------------------------|------------------|--------------------------------| | -Pds, --panel-default-size | | set default panel size | | -Pnp, --panel-no-pill | | remove panel button background | | -Ptc, --panel-text-color | #abcdef | custom panel HEX(A) text color | | --wider-panel | | make the panel a bit wider | +| --panel-grouped-buttons | | group buttons in the panel | #### Overview tweaks diff --git a/readme-images/tweaks/panel-grouped-buttons.png b/readme-images/tweaks/panel-grouped-buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d7d986c6fc9042c6b62b49cf5bd01740104b66 GIT binary patch literal 12970 zcmZX5WmFq&*L84rcPmyX?!{@47KcJ8P~6?!-GWP@I23oc;@;vEcXxMt=YGDQU)GvT zW{qU7xsL3!&z=ZnMHviKQdAHKgdr#UNfiV_@&|s?AtM6cE-^&NzzW_;QcfKi_;@25 zhXdOr&R~eMnw_b$n}MSV$jsKx#^i&Ok)w%;t&_Q(^BG*HC~y$le+Nl9nix1+*x6F6 zTiBR@G);`DIr*q1>>a7OIJkJJIe3IPxP>^lsFf9{!C*CYWwW6X5QrKi_enzC{pU%h z+s~Pq#X�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 literal 0 HcmV?d00001