1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
#!/usr/bin/env python3
"""
This file contains helper methods for icon theme related stuff.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
"""
import os
from gi.repository import GObject
from gi.repository import Gtk
def find_valid_icon_themes(search_paths):
valid_icon_themes = [
# path, name
]
for base_dir in [e for e in search_paths if os.path.exists(e)]:
for theme_name in sorted(os.listdir(base_dir)):
theme_dir = os.path.join(base_dir, theme_name)
if os.path.exists(os.path.join(theme_dir, "index.theme")):
# theme_dir acts here as unique key for the model and is not used as a dir later
valid_icon_themes.append((theme_dir, theme_name))
return valid_icon_themes
def find_handler_id_by_signal(obj, signal_name):
signal_id, detail = GObject.signal_parse_name(signal_name, obj, True)
return GObject.signal_handler_find(obj, GObject.SignalMatchType.ID, signal_id, detail, None, None, None)
def load_symbolic_from_icon_theme(icon_theme, icon_name, size, style=None):
"""Load a symbolic icon from the current icon theme.
If style is given, the symolic icon will be recolored based on colors derive from the stylecontext:
foreground color from Gtk.StateFlags.NORMAL, success_color, warning_color and error_color by calling
the corresponding lookup_color method.
If style is None, the icon is loaded via the Gtk.IconInfo.load_icon method without recoloring.
:param icon_name: The icon name
:type icon_name: str
:param size: Icon size to load
:type size: int
:param style: The style context to derive the colors from
:type style: Gtk.StyleContext
:return: GdkPixbuf.Pixbuf
:raises: ValueError: if icon lookup fails (usually if the theme does not contain a icon with this name)
"""
lookup_flags = Gtk.IconLookupFlags.USE_BUILTIN | Gtk.IconLookupFlags.FORCE_SYMBOLIC | Gtk.IconLookupFlags.FORCE_SIZE
icon_info = icon_theme.lookup_icon(icon_name, size, lookup_flags)
if icon_info is None:
raise ValueError(f"Lookup icon '{icon_name}' failed")
pixbuf = None
if style is not None:
fg = style.get_color(Gtk.StateFlags.NORMAL)
__, success_color = style.lookup_color("success_color")
__, warning_color = style.lookup_color("warning_color")
__, error_color = style.lookup_color("error_color")
pixbuf, _ = icon_info.load_symbolic(fg, success_color, warning_color, error_color)
else:
pixbuf = icon_info.load_icon()
return pixbuf
|