StIcon: pass in the StThemeNode to get colorized symbolic icons
Use st_texture_cache_load_icon_name_for_theme() so that we get the right colors for symbolic icons. The code refactoring to achieve this also avoids constantly starting a new icon load each time we set a property on initialization ... the icon is loaded only after we have a #StThemeNode assigned. https://bugzilla.gnome.org/show_bug.cgi?id=633865
This commit is contained in:
parent
8d6ab6fe84
commit
af7ba00e97
@ -57,7 +57,7 @@ struct _StIconPrivate
|
|||||||
};
|
};
|
||||||
|
|
||||||
static void st_icon_update (StIcon *icon);
|
static void st_icon_update (StIcon *icon);
|
||||||
static void st_icon_update_icon_size (StIcon *icon);
|
static gboolean st_icon_update_icon_size (StIcon *icon);
|
||||||
|
|
||||||
#define DEFAULT_ICON_SIZE 48
|
#define DEFAULT_ICON_SIZE 48
|
||||||
#define DEFAULT_ICON_TYPE ST_ICON_SYMBOLIC
|
#define DEFAULT_ICON_TYPE ST_ICON_SYMBOLIC
|
||||||
@ -245,6 +245,7 @@ st_icon_style_changed (StWidget *widget)
|
|||||||
|
|
||||||
priv->theme_icon_size = st_theme_node_get_length (theme_node, "icon-size");
|
priv->theme_icon_size = st_theme_node_get_length (theme_node, "icon-size");
|
||||||
st_icon_update_icon_size (self);
|
st_icon_update_icon_size (self);
|
||||||
|
st_icon_update (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -318,9 +319,13 @@ st_icon_update (StIcon *icon)
|
|||||||
/* Try to lookup the new one */
|
/* Try to lookup the new one */
|
||||||
if (priv->icon_name)
|
if (priv->icon_name)
|
||||||
{
|
{
|
||||||
StTextureCache *cache = st_texture_cache_get_default ();
|
StThemeNode *theme_node = st_widget_peek_theme_node (ST_WIDGET (icon));
|
||||||
|
|
||||||
priv->icon_texture = st_texture_cache_load_icon_name (cache,
|
if (theme_node)
|
||||||
|
{
|
||||||
|
StTextureCache *cache = st_texture_cache_get_default ();
|
||||||
|
priv->icon_texture = st_texture_cache_load_icon_name_for_theme (cache,
|
||||||
|
theme_node,
|
||||||
priv->icon_name,
|
priv->icon_name,
|
||||||
priv->icon_type,
|
priv->icon_type,
|
||||||
priv->icon_size);
|
priv->icon_size);
|
||||||
@ -328,9 +333,10 @@ st_icon_update (StIcon *icon)
|
|||||||
if (priv->icon_texture)
|
if (priv->icon_texture)
|
||||||
clutter_actor_set_parent (priv->icon_texture, CLUTTER_ACTOR (icon));
|
clutter_actor_set_parent (priv->icon_texture, CLUTTER_ACTOR (icon));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
st_icon_update_icon_size (StIcon *icon)
|
st_icon_update_icon_size (StIcon *icon)
|
||||||
{
|
{
|
||||||
StIconPrivate *priv = icon->priv;
|
StIconPrivate *priv = icon->priv;
|
||||||
@ -347,8 +353,10 @@ st_icon_update_icon_size (StIcon *icon)
|
|||||||
{
|
{
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (icon));
|
clutter_actor_queue_relayout (CLUTTER_ACTOR (icon));
|
||||||
priv->icon_size = new_size;
|
priv->icon_size = new_size;
|
||||||
st_icon_update (icon);
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -477,8 +485,8 @@ st_icon_set_icon_size (StIcon *icon,
|
|||||||
if (priv->prop_icon_size != size)
|
if (priv->prop_icon_size != size)
|
||||||
{
|
{
|
||||||
priv->prop_icon_size = size;
|
priv->prop_icon_size = size;
|
||||||
st_icon_update_icon_size (icon);
|
if (st_icon_update_icon_size (icon))
|
||||||
|
st_icon_update (icon);
|
||||||
g_object_notify (G_OBJECT (icon), "icon-size");
|
g_object_notify (G_OBJECT (icon), "icon-size");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,9 @@ const UI = imports.testcommon.ui;
|
|||||||
UI.init();
|
UI.init();
|
||||||
let stage = Clutter.Stage.get_default();
|
let stage = Clutter.Stage.get_default();
|
||||||
|
|
||||||
|
stage.width = 400;
|
||||||
|
stage.height = 700;
|
||||||
|
|
||||||
let b = new St.BoxLayout({ vertical: true,
|
let b = new St.BoxLayout({ vertical: true,
|
||||||
width: stage.width,
|
width: stage.width,
|
||||||
height: stage.height });
|
height: stage.height });
|
||||||
@ -26,28 +29,59 @@ function addTest(label, icon_props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addTest("Symbolic",
|
addTest("Symbolic",
|
||||||
{ icon_name: 'zoom-in',
|
{ icon_name: 'battery-full',
|
||||||
icon_type: St.IconType.SYMBOLIC,
|
icon_type: St.IconType.SYMBOLIC,
|
||||||
icon_size: 48 });
|
icon_size: 48 });
|
||||||
addTest("Full color",
|
addTest("Full color",
|
||||||
{ icon_name: 'zoom-in',
|
{ icon_name: 'battery-full',
|
||||||
icon_type: St.IconType.FULLCOLOR,
|
icon_type: St.IconType.FULLCOLOR,
|
||||||
icon_size: 48 });
|
icon_size: 48 });
|
||||||
addTest("Default size",
|
addTest("Default size",
|
||||||
{ icon_name: 'zoom-in',
|
{ icon_name: 'battery-full',
|
||||||
icon_type: St.IconType.SYMBOLIC });
|
icon_type: St.IconType.SYMBOLIC });
|
||||||
addTest("Size set by property",
|
addTest("Size set by property",
|
||||||
{ icon_name: 'zoom-in',
|
{ icon_name: 'battery-full',
|
||||||
icon_type: St.IconType.SYMBOLIC,
|
icon_type: St.IconType.SYMBOLIC,
|
||||||
icon_size: 32 });
|
icon_size: 32 });
|
||||||
addTest("Size set by style",
|
addTest("Size set by style",
|
||||||
{ icon_name: 'zoom-in',
|
{ icon_name: 'battery-full',
|
||||||
icon_type: St.IconType.SYMBOLIC,
|
icon_type: St.IconType.SYMBOLIC,
|
||||||
style: 'icon-size: 1em;' });
|
style: 'icon-size: 1em;' });
|
||||||
addTest("16px icon in 48px icon widget",
|
addTest("16px icon in 48px icon widget",
|
||||||
{ icon_name: 'zoom-in',
|
{ icon_name: 'battery-full',
|
||||||
icon_type: St.IconType.SYMBOLIC,
|
icon_type: St.IconType.SYMBOLIC,
|
||||||
style: 'icon-size: 16px; width: 48px; height: 48px;' });
|
style: 'icon-size: 16px; width: 48px; height: 48px;' });
|
||||||
|
|
||||||
|
function iconRow(icons, box_style) {
|
||||||
|
let hb = new St.BoxLayout({ vertical: false, style: box_style });
|
||||||
|
|
||||||
|
for each (let iconName in icons) {
|
||||||
|
hb.add(new St.Icon({ icon_name: iconName,
|
||||||
|
icon_type: St.IconType.SYMBOLIC,
|
||||||
|
icon_size: 48 }));
|
||||||
|
}
|
||||||
|
|
||||||
|
b.add(hb);
|
||||||
|
}
|
||||||
|
|
||||||
|
let normalCss = 'background: white; color: black; padding: 10px 10px;';
|
||||||
|
let reversedCss = 'background: black; color: white; warning-color: #ffcc00; error-color: #ff0000; padding: 10px 10px;';
|
||||||
|
|
||||||
|
let batteryIcons = ['battery-full-charging',
|
||||||
|
'battery-full',
|
||||||
|
'battery-good',
|
||||||
|
'battery-low',
|
||||||
|
'battery-caution' ];
|
||||||
|
|
||||||
|
let volumeIcons = ['audio-volume-high',
|
||||||
|
'audio-volume-medium',
|
||||||
|
'audio-volume-low',
|
||||||
|
'audio-volume-muted' ];
|
||||||
|
|
||||||
|
iconRow(batteryIcons, normalCss);
|
||||||
|
iconRow(batteryIcons, reversedCss);
|
||||||
|
iconRow(volumeIcons, normalCss);
|
||||||
|
iconRow(volumeIcons, reversedCss);
|
||||||
|
|
||||||
stage.show();
|
stage.show();
|
||||||
Clutter.main();
|
Clutter.main();
|
||||||
|
Loading…
Reference in New Issue
Block a user