Получить имя значка для идентификатора запаса?
Вопрос
Я пытаюсь получить имя (строки) значка (строки), соответствующее заданному (строковому) значению запаса Gtk.
Пример
Идентификатор "gtk-go-forward" в каталоге Gtk имеет два соответствующих имени значков: "gtk-go-forward-ltr" и "gtk-go-forward-rtl". Я хотел бы получить либо:
- оба значка имен "gtk-go-forward-ltr" и "gtk-go-forward-rtl" заданы идентификатором "gtk-go-forward" ; ИЛИ
- просто имя значка "gtk-go-forward-ltr" ( "соответствующий" для моего текстового направления).
Потенциальные ограничения
Я использую API-интерфейс интроспекции gobject, а не базу C.
Обоснование (необязательно для чтения)
Я пытаюсь сделать St.Icon
для значка, указанного идентификатором запаса, но при довольно большом размере (96 пикселей).
Я могу использовать gtk_icon_set_render_icon
с прямым идентификатором "gtk-go-forward" (он выбирает версию LTR) (синтаксис - это java-код GNOME, но это не имеет отношения к quesiton, я использую API-интерфейс для интроспекции GObject):
let style = Gtk.Widget.get_default_style();
let iconset = style.lookup_icon_set('gtk-go-forward');
let icon = new St.Icon({
gicon: iconset.render_icon(gtkStyle, Gtk.TextDirection.LTR,
Gtk.StateType.NORMAL, Gtk.IconSize.DIALOG,
null, null),
icon_type: St.IconType.FULLCOLOR,
icon_size: 96
});
Это даст мне значок для идентификатора запаса "gtk-go-forward" (он выбирает "gtk-go-forward-ltr" ), , но значок очень нечеткий.
Альтернативно, если я напрямую пишу имя значка "gtk-go-forward-ltr" , значок не является нечетким:
let icon = new St.Icon({
gicon: Gio.ThemedIcon.new_with_default_fallbacks('gtk-go-forward-ltr'),
icon_type: St.IconType.FULLCOLOR,
icon_size: 96
});
Таким образом, я считаю, что мой лучший выбор при получении большого, не-нечеткого значка - найти имя значка для идентификатора запаса, а не использовать идентификатор запаса (подача gtk-go-forward
во второй метод выше дает значок "отсутствует значок", поскольку он не является допустимым именем значка).
![Icon using stock ID (top); using icon name (bottom)]()
На рисунке выше верхний значок использует первый метод (идентификатор запаса с render_icon), а нижний значок использует второй метод (используйте имя значка напрямую). Большая разница в ясности.
Ответы
Ответ 1
Имена общих значков Stock
Этот вопрос немного устарел, но для дальнейшего использования: лучше использовать "go-next"
, а не "gtk-go-forward"
- это правильное имя в соответствии с Icon Naming Spec, и рекомендуется с тех пор, как разработчики GTK планируют отказаться от значков запасов в ближайшее время.
Чтобы напрямую ответить на вопрос, как указано в названии: вот удобная электронная таблица Google Docs, дающая эквивалентные имена спецификаций значков для значков акций GTK.
Нечеткие, большие версии значков GTK
Что касается получения не-нечетких версий значков по умолчанию, лучшим способом, который я нашел для отображения значка в 96px в GTK, является загрузка его в GdkPixbuf
, а затем используйте его, а не GtkIcon
( который ограничен 48px, что является самым большим GtkIconSize
, как указано в j__m). Пример того, как это сделать в Vala (легко преобразовать в JS или Python и т.д.):
var icon_theme = Gtk.IconTheme.get_default();
try {
var pixbuf = icon_theme.load_icon("go-next", 96, Gtk.IconLookupFlags.USE_BUILTIN);
// Do something with the pixbuf, for example use it with a CellRendererPixbuf,
// or a GtkButton or whatever
catch (GLib.Error e) {
GLib.critical("Could not load icon: %s", e.message);
}
Вы также можете поэкспериментировать с Gtk.IconLookupFlags.FORCE_SIZE
и/или FORCE_SVG
, особенно если хотите действительно огромные значки.
Я боюсь, что я никогда не использовал Shell Toolkit, поэтому я не знаю, нужен ли вам особенно тег St.Icon
, но в простом GTK вы можете использовать GdkPixbuf
почти везде, где можете использовать запас значок так что это обходной путь, который я нашел очень полезным.
Ответ 2
GTK_ICON_SIZE_DIALOG
(Gtk.IconSize.DIALOG
в Javascript) меньше 96 пикселей. Вы отдаете маленькую иконку, а затем взорвали ее; естественно, будет плохо выглядеть.
Как я помню, значение -1
возвращает значок в любом исходном размере. Затем вы можете использовать St.Icon, чтобы указать размер, на который вы хотите нарисовать его, так как это похоже на то, как вы все равно хотите его использовать.