Replace old gfx-data with graphics from the skin sheet.

+ Removed gfxdata.cpp file.
+ Removed get_gfx() from modules/gfx.h/cpp.
+ Added skin parts for each removed graphics of gfxdata.
+ Added IButtonIcon interface and an implementation for skin theme.
+ Removed "icon_buttons" from gui.cpp.
+ Now icons in button are set through set_gfxicon_to_button function.
+ Removed from Theme class check/radio_icon_size member variables
  (they are replaced with the new IButtonIcon interface).
+ Removed jdraw_inverted_sprite(), now each icon has it normal/selected
  version in the skin sheet.
This commit is contained in:
David Capello 2011-03-06 16:15:05 -03:00
parent de47c6ff59
commit 6d5531b998
28 changed files with 596 additions and 737 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<skin name="Default Skin" <skin name="Default Skin"
author="Ilija Melentijevic" author="Ilija Melentijevic &amp; David Capello"
url="http://ilkke.blogspot.com/"> url="http://ilkke.blogspot.com/">
<cursors> <cursors>
@ -91,10 +91,22 @@
<part id="mini_slider_thumb_focused" x="48" y="176" w="5" h="6" /> <part id="mini_slider_thumb_focused" x="48" y="176" w="5" h="6" />
<part id="separator_horz" x="32" y="80" w="9" h="5" /> <part id="separator_horz" x="32" y="80" w="9" h="5" />
<part id="separator_vert" x="32" y="96" w="5" h="9" /> <part id="separator_vert" x="32" y="96" w="5" h="9" />
<part id="combobox_arrow" x="96" y="32" w="16" h="16" /> <part id="combobox_arrow_down" x="100" y="148" w="9" h="9" />
<part id="combobox_arrow_down_selected" x="116" y="148" w="9" h="9" />
<part id="combobox_arrow_down_disabled" x="132" y="148" w="9" h="9" />
<part id="combobox_arrow_up" x="100" y="163" w="9" h="9" />
<part id="combobox_arrow_up_selected" x="116" y="163" w="9" h="9" />
<part id="combobox_arrow_up_disabled" x="132" y="163" w="9" h="9" />
<part id="combobox_arrow_left" x="99" y="180" w="9" h="9" />
<part id="combobox_arrow_left_selected" x="115" y="180" w="9" h="9" />
<part id="combobox_arrow_left_disabled" x="131" y="180" w="9" h="9" />
<part id="combobox_arrow_right" x="99" y="196" w="9" h="9" />
<part id="combobox_arrow_right_selected" x="115" y="196" w="9" h="9" />
<part id="combobox_arrow_right_disabled" x="131" y="196" w="9" h="9" />
<part id="toolbutton_normal" x="96" y="0" w1="3" w2="10" w3="3" h1="3" h2="9" h3="4" /> <part id="toolbutton_normal" x="96" y="0" w1="3" w2="10" w3="3" h1="3" h2="9" h3="4" />
<part id="toolbutton_hot" x="112" y="0" w1="3" w2="10" w3="3" h1="3" h2="9" h3="4" /> <part id="toolbutton_hot" x="112" y="0" w1="3" w2="10" w3="3" h1="3" h2="9" h3="4" />
<part id="toolbutton_last" x="96" y="16" w1="3" w2="10" w3="3" h1="3" h2="9" h3="4" /> <part id="toolbutton_last" x="96" y="16" w1="3" w2="10" w3="3" h1="3" h2="9" h3="4" />
<part id="toolbutton_pushed" x="112" y="16" w1="3" w2="10" w3="3" h1="3" h2="9" h3="4" />
<part id="tab_normal" x="2" y="112" w1="4" w2="5" w3="5" h1="4" h2="6" h3="2" /> <part id="tab_normal" x="2" y="112" w1="4" w2="5" w3="5" h1="4" h2="6" h3="2" />
<part id="tab_selected" x="16" y="112" w1="4" w2="7" w3="5" h1="4" h2="6" h3="2" /> <part id="tab_selected" x="16" y="112" w1="4" w2="7" w3="5" h1="4" h2="6" h3="2" />
<part id="tab_bottom_selected" x="16" y="124" w1="4" w2="7" w3="5" h1="2" h2="1" h3="2" /> <part id="tab_bottom_selected" x="16" y="124" w1="4" w2="7" w3="5" h1="2" h2="1" h3="2" />
@ -111,8 +123,51 @@
<part id="colorbar_border_hotfg" x="32" y="224" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="colorbar_border_hotfg" x="32" y="224" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="scrollbar_bg" x="64" y="144" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="scrollbar_bg" x="64" y="144" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="scrollbar_thumb" x="64" y="160" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" /> <part id="scrollbar_thumb" x="64" y="160" w1="5" w2="6" w3="5" h1="5" h2="6" h3="5" />
<part id="tooltip" x="112" y="224" w1="5" w2="6" w3="5" h1="5" h2="5" h3="6" /> <part id="tooltip" x="112" y="64" w1="5" w2="6" w3="5" h1="5" h2="5" h3="6" />
<part id="tooltip_arrow" x="128" y="224" w1="5" w2="6" w3="5" h1="5" h2="5" h3="6" /> <part id="tooltip_arrow" x="128" y="64" w1="5" w2="6" w3="5" h1="5" h2="5" h3="6" />
<part id="ani_first" x="144" y="192" w="8" h="8" />
<part id="ani_first_selected" x="144" y="200" w="8" h="8" />
<part id="ani_first_disabled" x="144" y="192" w="8" h="8" />
<part id="ani_previous" x="160" y="192" w="8" h="8" />
<part id="ani_previous_selected" x="160" y="200" w="8" h="8" />
<part id="ani_previous_disabled" x="168" y="192" w="8" h="8" />
<part id="ani_play" x="176" y="192" w="8" h="8" />
<part id="ani_play_selected" x="176" y="200" w="8" h="8" />
<part id="ani_play_disabled" x="184" y="192" w="8" h="8" />
<part id="ani_next" x="192" y="192" w="8" h="8" />
<part id="ani_next_selected" x="192" y="200" w="8" h="8" />
<part id="ani_next_disabled" x="200" y="192" w="8" h="8" />
<part id="ani_last" x="208" y="192" w="8" h="8" />
<part id="ani_last_selected" x="208" y="200" w="8" h="8" />
<part id="ani_last_disabled" x="216" y="192" w="8" h="8" />
<part id="target_one" x="144" y="224" w="32" h="16" />
<part id="target_one_selected" x="144" y="240" w="32" h="16" />
<part id="target_frames" x="176" y="224" w="32" h="16" />
<part id="target_frames_selected" x="176" y="240" w="32" h="16" />
<part id="target_layers" x="208" y="224" w="32" h="16" />
<part id="target_layers_selected" x="208" y="240" w="32" h="16" />
<part id="target_frames_layers" x="240" y="224" w="32" h="16" />
<part id="target_frames_layers_selected" x="240" y="240" w="32" h="16" />
<part id="brush_circle" x="144" y="144" w="7" h="7" />
<part id="brush_circle_selected" x="144" y="152" w="7" h="7" />
<part id="brush_square" x="160" y="144" w="7" h="7" />
<part id="brush_square_selected" x="160" y="152" w="7" h="7" />
<part id="brush_line" x="176" y="144" w="6" h="6" />
<part id="brush_line_selected" x="176" y="152" w="6" h="6" />
<part id="scale_arrow_1" x="96" y="224" w="11" h="11" />
<part id="scale_arrow_2" x="112" y="224" w="7" h="12" />
<part id="scale_arrow_3" x="128" y="224" w="12" h="7" />
<part id="rotate_arrow_1" x="96" y="240" w="11" h="11" />
<part id="rotate_arrow_2" x="112" y="240" w="15" h="10" />
<part id="rotate_arrow_3" x="128" y="240" w="10" h="15" />
<part id="layer_visible" x="144" y="160" w="8" h="8" />
<part id="layer_visible_selected" x="144" y="168" w="8" h="8" />
<part id="layer_hidden" x="160" y="160" w="8" h="8" />
<part id="layer_hidden_selected" x="160" y="168" w="8" h="8" />
<part id="layer_editable" x="144" y="176" w="8" h="8" />
<part id="layer_editable_selected" x="144" y="184" w="8" h="8" />
<part id="layer_locked" x="160" y="176" w="8" h="8" />
<part id="layer_locked_selected" x="160" y="184" w="8" h="8" />
</parts> </parts>
</skin> </skin>

View File

@ -213,6 +213,7 @@ add_library(aseprite-library
raster/stock.cpp raster/stock.cpp
raster/undo.cpp raster/undo.cpp
settings/ui_settings_impl.cpp settings/ui_settings_impl.cpp
skin/button_icon_impl.cpp
skin/skin_theme.cpp skin/skin_theme.cpp
skin/skin_property.cpp skin/skin_property.cpp
skin/skin_slider_property.cpp skin/skin_slider_property.cpp

View File

@ -36,6 +36,7 @@
#include "raster/pen.h" #include "raster/pen.h"
#include "raster/sprite.h" #include "raster/sprite.h"
#include "settings/settings.h" #include "settings/settings.h"
#include "skin/skin_parts.h"
#include "sprite_wrappers.h" #include "sprite_wrappers.h"
#include "tools/tool.h" #include "tools/tool.h"
#include "ui_context.h" #include "ui_context.h"
@ -276,9 +277,9 @@ void ConfigureTools::onExecute(Context* context)
PenType type = tool_settings->getPen()->getType(); PenType type = tool_settings->getPen()->getType();
brush_type = group_button_new(3, 1, type, brush_type = group_button_new(3, 1, type,
GFX_BRUSH_CIRCLE, PART_BRUSH_CIRCLE,
GFX_BRUSH_SQUARE, PART_BRUSH_SQUARE,
GFX_BRUSH_LINE); PART_BRUSH_LINE);
brush_type->setName("brush_type"); brush_type->setName("brush_type");
} }

View File

@ -21,7 +21,6 @@
#include "core/modules.h" #include "core/modules.h"
#include "effect/effect.h" #include "effect/effect.h"
#include "modules/editors.h" #include "modules/editors.h"
#include "modules/gfx.h"
#include "modules/gui.h" #include "modules/gui.h"
#include "modules/palettes.h" #include "modules/palettes.h"
#include "modules/rootmenu.h" #include "modules/rootmenu.h"
@ -45,7 +44,6 @@ static Module module[] =
DEF_MODULE(palette, 0), DEF_MODULE(palette, 0),
DEF_MODULE(effect, 0), DEF_MODULE(effect, 0),
DEF_MODULE(graphics, REQUIRE_INTERFACE),
DEF_MODULE(gui, REQUIRE_INTERFACE), DEF_MODULE(gui, REQUIRE_INTERFACE),
DEF_MODULE(rootmenu, REQUIRE_INTERFACE), DEF_MODULE(rootmenu, REQUIRE_INTERFACE),
DEF_MODULE(editors, REQUIRE_INTERFACE), DEF_MODULE(editors, REQUIRE_INTERFACE),

View File

@ -150,7 +150,8 @@ static void anieditor_clean_clk(JWidget widget);
static void anieditor_set_scroll(JWidget widget, int x, int y, bool use_refresh_region); static void anieditor_set_scroll(JWidget widget, int x, int y, bool use_refresh_region);
static int anieditor_get_layer_index(JWidget widget, const Layer* layer); static int anieditor_get_layer_index(JWidget widget, const Layer* layer);
static void icon_rect(BITMAP* icon, int x1, int y1, int x2, int y2, bool is_selected, bool is_hot, bool is_clk); static void icon_rect(BITMAP* icon_normal, BITMAP* icon_selected, int x1, int y1, int x2, int y2,
bool is_selected, bool is_hot, bool is_clk);
bool animation_editor_is_movingcel() bool animation_editor_is_movingcel()
{ {
@ -461,10 +462,11 @@ static bool anieditor_msg_proc(JWidget widget, JMessage msg)
- HDRSIZE - HDRSIZE
+ anieditor->scroll_y) / LAYSIZE; + anieditor->scroll_y) / LAYSIZE;
/* is the mouse on a layer's label? */ // Is the mouse on a layer's label?
if (mx < anieditor->separator_x) { if (mx < anieditor->separator_x) {
BITMAP* icon1 = get_gfx(GFX_BOX_SHOW); SkinTheme* theme = static_cast<SkinTheme*>(widget->getTheme());
BITMAP* icon2 = get_gfx(GFX_BOX_UNLOCK); BITMAP* icon1 = theme->get_part(PART_LAYER_VISIBLE);
BITMAP* icon2 = theme->get_part(PART_LAYER_EDITABLE);
int x1, y1, x2, y2, y_mid; int x1, y1, x2, y2, y_mid;
x1 = 0; x1 = 0;
@ -1026,8 +1028,7 @@ static void anieditor_draw_layer(JWidget widget, JRect clip, int layer_index)
{ {
AniEditor* anieditor = anieditor_data(widget); AniEditor* anieditor = anieditor_data(widget);
Layer *layer = anieditor->layers[layer_index]; Layer *layer = anieditor->layers[layer_index];
BITMAP *icon1 = get_gfx(layer->is_readable() ? GFX_BOX_SHOW: GFX_BOX_HIDE); SkinTheme* theme = static_cast<SkinTheme*>(widget->getTheme());
BITMAP *icon2 = get_gfx(layer->is_writable() ? GFX_BOX_UNLOCK: GFX_BOX_LOCK);
bool selected_layer = (layer == anieditor->sprite->getCurrentLayer()); bool selected_layer = (layer == anieditor->sprite->getCurrentLayer());
bool is_hot = (anieditor->hot_part == A_PART_LAYER && anieditor->hot_layer == layer_index); bool is_hot = (anieditor->hot_part == A_PART_LAYER && anieditor->hot_layer == layer_index);
bool is_clk = (anieditor->clk_part == A_PART_LAYER && anieditor->clk_layer == layer_index); bool is_clk = (anieditor->clk_part == A_PART_LAYER && anieditor->clk_layer == layer_index);
@ -1036,6 +1037,10 @@ static void anieditor_draw_layer(JWidget widget, JRect clip, int layer_index)
(is_clk ? ji_color_selected(): (is_clk ? ji_color_selected():
ji_color_face())); ji_color_face()));
int fg = selected_layer ? ji_color_background(): ji_color_foreground(); int fg = selected_layer ? ji_color_background(): ji_color_foreground();
BITMAP* icon1 = theme->get_part(layer->is_readable() ? PART_LAYER_VISIBLE: PART_LAYER_HIDDEN);
BITMAP* icon2 = theme->get_part(layer->is_writable() ? PART_LAYER_EDITABLE: PART_LAYER_LOCKED);
BITMAP* icon1_selected = theme->get_part(layer->is_readable() ? PART_LAYER_VISIBLE_SELECTED: PART_LAYER_HIDDEN_SELECTED);
BITMAP* icon2_selected = theme->get_part(layer->is_writable() ? PART_LAYER_EDITABLE_SELECTED: PART_LAYER_LOCKED_SELECTED);
int x1, y1, x2, y2, y_mid; int x1, y1, x2, y2, y_mid;
int cx1, cy1, cx2, cy2; int cx1, cy1, cx2, cy2;
int u; int u;
@ -1075,7 +1080,7 @@ static void anieditor_draw_layer(JWidget widget, JRect clip, int layer_index)
u = x1+ICONSEP; u = x1+ICONSEP;
/* draw the eye (readable flag) */ /* draw the eye (readable flag) */
icon_rect(icon1, icon_rect(icon1, icon1_selected,
u, u,
y_mid-icon1->h/2-ICONBORDER, y_mid-icon1->h/2-ICONBORDER,
u+ICONBORDER+icon1->w+ICONBORDER-1, u+ICONBORDER+icon1->w+ICONBORDER-1,
@ -1089,7 +1094,7 @@ static void anieditor_draw_layer(JWidget widget, JRect clip, int layer_index)
u += u+ICONBORDER+icon1->w+ICONBORDER; u += u+ICONBORDER+icon1->w+ICONBORDER;
/* draw the padlock (writable flag) */ /* draw the padlock (writable flag) */
icon_rect(icon2, icon_rect(icon2, icon2_selected,
u, u,
y_mid-icon1->h/2-ICONBORDER, y_mid-icon1->h/2-ICONBORDER,
u+ICONBORDER+icon2->w+ICONBORDER-1, u+ICONBORDER+icon2->w+ICONBORDER-1,
@ -1102,12 +1107,12 @@ static void anieditor_draw_layer(JWidget widget, JRect clip, int layer_index)
u += ICONBORDER+icon2->w+ICONBORDER+ICONSEP; u += ICONBORDER+icon2->w+ICONBORDER+ICONSEP;
/* draw the layer's name */ // Draw the layer's name.
jdraw_text(ji_screen, widget->getFont(), layer->getName().c_str(), jdraw_text(ji_screen, widget->getFont(), layer->getName().c_str(),
u, y_mid - ji_font_get_size(widget->getFont())/2, u, y_mid - ji_font_get_size(widget->getFont())/2,
fg, bg, true, jguiscale()); fg, bg, true, jguiscale());
/* the background should be underlined */ // The background should be underlined.
if (layer->is_background()) { if (layer->is_background()) {
hline(ji_screen, hline(ji_screen,
u, u,
@ -1131,7 +1136,7 @@ static void anieditor_draw_layer_padding(JWidget widget)
x2 = x1 + anieditor->separator_x - 1; x2 = x1 + anieditor->separator_x - 1;
y2 = y1 + LAYSIZE - 1; y2 = y1 + LAYSIZE - 1;
/* padding in the bottom side */ // Padding in the bottom side.
if (y2+1 <= widget->rc->y2-1) { if (y2+1 <= widget->rc->y2-1) {
rectfill(ji_screen, x1, y2+1, x2, widget->rc->y2-1, rectfill(ji_screen, x1, y2+1, x2, widget->rc->y2-1,
theme->get_editor_face_color()); theme->get_editor_face_color());
@ -1499,12 +1504,12 @@ static int anieditor_get_layer_index(JWidget widget, const Layer* layer)
return -1; return -1;
} }
/* auxiliary routine to draw an icon in the layer-part */ // Auxiliary routine to draw an icon in the layer-part.
static void icon_rect(BITMAP *icon, int x1, int y1, int x2, int y2, static void icon_rect(BITMAP* icon_normal, BITMAP* icon_selected, int x1, int y1, int x2, int y2,
bool is_selected, bool is_hot, bool is_clk) bool is_selected, bool is_hot, bool is_clk)
{ {
int icon_x = x1+ICONBORDER; int icon_x = x1+ICONBORDER;
int icon_y = (y1+y2)/2-icon->h/2; int icon_y = (y1+y2)/2-icon_normal->h/2;
int facelight = is_hot && is_clk ? ji_color_faceshadow(): ji_color_facelight(); int facelight = is_hot && is_clk ? ji_color_faceshadow(): ji_color_facelight();
int faceshadow = is_hot && is_clk ? ji_color_facelight(): ji_color_faceshadow(); int faceshadow = is_hot && is_clk ? ji_color_facelight(): ji_color_faceshadow();
@ -1517,8 +1522,9 @@ static void icon_rect(BITMAP *icon, int x1, int y1, int x2, int y2,
ji_color_hotface()); ji_color_hotface());
} }
set_alpha_blender();
if (is_selected) if (is_selected)
jdraw_inverted_sprite(ji_screen, icon, icon_x, icon_y); draw_trans_sprite(ji_screen, icon_selected, icon_x, icon_y);
else else
draw_sprite(ji_screen, icon, icon_x, icon_y); draw_trans_sprite(ji_screen, icon_normal, icon_x, icon_y);
} }

View File

@ -39,6 +39,7 @@
#include "modules/gfx.h" #include "modules/gfx.h"
#include "modules/gui.h" #include "modules/gui.h"
#include "recent_files.h" #include "recent_files.h"
#include "skin/skin_parts.h"
#include "widgets/fileview.h" #include "widgets/fileview.h"
#if (DEVICE_SEPARATOR != 0) && (DEVICE_SEPARATOR != '\0') #if (DEVICE_SEPARATOR != 0) && (DEVICE_SEPARATOR != '\0')
@ -157,9 +158,21 @@ base::string ase_file_selector(const base::string& message,
jwidget_focusrest(goforward, false); jwidget_focusrest(goforward, false);
jwidget_focusrest(goup, false); jwidget_focusrest(goup, false);
add_gfxicon_to_button(goback, GFX_ARROW_LEFT, JI_CENTER | JI_MIDDLE); set_gfxicon_to_button(goback,
add_gfxicon_to_button(goforward, GFX_ARROW_RIGHT, JI_CENTER | JI_MIDDLE); PART_COMBOBOX_ARROW_LEFT,
add_gfxicon_to_button(goup, GFX_ARROW_UP, JI_CENTER | JI_MIDDLE); PART_COMBOBOX_ARROW_LEFT_SELECTED,
PART_COMBOBOX_ARROW_LEFT_DISABLED,
JI_CENTER | JI_MIDDLE);
set_gfxicon_to_button(goforward,
PART_COMBOBOX_ARROW_RIGHT,
PART_COMBOBOX_ARROW_RIGHT_SELECTED,
PART_COMBOBOX_ARROW_RIGHT_DISABLED,
JI_CENTER | JI_MIDDLE);
set_gfxicon_to_button(goup,
PART_COMBOBOX_ARROW_UP,
PART_COMBOBOX_ARROW_UP_SELECTED,
PART_COMBOBOX_ARROW_UP_DISABLED,
JI_CENTER | JI_MIDDLE);
setup_mini_look(goback); setup_mini_look(goback);
setup_mini_look(goforward); setup_mini_look(goforward);

View File

@ -24,46 +24,24 @@
ButtonBase::ButtonBase(const char* text, int type, int behaviorType, int drawType) ButtonBase::ButtonBase(const char* text, int type, int behaviorType, int drawType)
: Widget(type) : Widget(type)
, m_behaviorType(behaviorType)
, m_drawType(drawType)
, m_iconInterface(NULL)
{ {
m_behaviorType = behaviorType;
m_drawType = drawType;
m_icon = NULL;
m_iconAlign = JI_LEFT | JI_MIDDLE;
this->setAlign(JI_CENTER | JI_MIDDLE); this->setAlign(JI_CENTER | JI_MIDDLE);
this->setText(text); this->setText(text);
jwidget_focusrest(this, true); jwidget_focusrest(this, true);
// Initialize theme // Initialize theme
this->type = m_drawType; // TODO Remove this nasty trick this->type = m_drawType; // TODO Fix this nasty trick
initTheme(); initTheme();
this->type = type; this->type = type;
} }
ButtonBase::~ButtonBase() ButtonBase::~ButtonBase()
{ {
} if (m_iconInterface)
m_iconInterface->destroy();
void ButtonBase::setButtonIcon(BITMAP* icon)
{
m_icon = icon;
invalidate();
}
void ButtonBase::setButtonIconAlign(int iconAlign)
{
m_iconAlign = iconAlign;
invalidate();
}
BITMAP* ButtonBase::getButtonIcon()
{
return m_icon;
}
int ButtonBase::getButtonIconAlign()
{
return m_iconAlign;
} }
int ButtonBase::getBehaviorType() const int ButtonBase::getBehaviorType() const
@ -76,6 +54,16 @@ int ButtonBase::getDrawType() const
return m_drawType; return m_drawType;
} }
void ButtonBase::setIconInterface(IButtonIcon* iconInterface)
{
if (m_iconInterface)
m_iconInterface->destroy();
m_iconInterface = iconInterface;
invalidate();
}
void ButtonBase::onClick(Event& ev) void ButtonBase::onClick(Event& ev)
{ {
// Fire Click() signal // Fire Click() signal
@ -286,30 +274,11 @@ bool ButtonBase::onProcessMessage(JMessage msg)
void ButtonBase::onPreferredSize(PreferredSizeEvent& ev) void ButtonBase::onPreferredSize(PreferredSizeEvent& ev)
{ {
struct jrect box, text, icon; struct jrect box, text, icon;
int icon_w = 0;
int icon_h = 0;
if (m_icon) {
icon_w = m_icon->w;
icon_h = m_icon->h;
}
else {
switch (m_drawType) {
case JI_CHECK:
icon_w = getTheme()->check_icon_size;
icon_h = getTheme()->check_icon_size;
break;
case JI_RADIO:
icon_w = getTheme()->radio_icon_size;
icon_h = getTheme()->radio_icon_size;
break;
}
}
jwidget_get_texticon_info(this, &box, &text, &icon, jwidget_get_texticon_info(this, &box, &text, &icon,
m_iconAlign, icon_w, icon_h); m_iconInterface ? m_iconInterface->getIconAlign(): 0,
m_iconInterface ? m_iconInterface->getWidth(): 0,
m_iconInterface ? m_iconInterface->getHeight(): 0);
ev.setPreferredSize(this->border_width.l + jrect_w(&box) + this->border_width.r, ev.setPreferredSize(this->border_width.l + jrect_w(&box) + this->border_width.r,
this->border_width.t + jrect_h(&box) + this->border_width.b); this->border_width.t + jrect_h(&box) + this->border_width.b);

View File

@ -15,6 +15,19 @@ struct BITMAP;
class Event; class Event;
class IButtonIcon
{
public:
virtual ~IButtonIcon() { }
virtual void destroy() = 0;
virtual int getWidth() = 0;
virtual int getHeight() = 0;
virtual BITMAP* getNormalIcon() = 0;
virtual BITMAP* getSelectedIcon() = 0;
virtual BITMAP* getDisabledIcon() = 0;
virtual int getIconAlign() = 0;
};
// Generic button // Generic button
class ButtonBase : public Widget class ButtonBase : public Widget
{ {
@ -25,15 +38,16 @@ public:
int drawType); int drawType);
virtual ~ButtonBase(); virtual ~ButtonBase();
void setButtonIcon(BITMAP* icon);
void setButtonIconAlign(int iconAlign);
BITMAP* getButtonIcon();
int getButtonIconAlign();
int getBehaviorType() const; int getBehaviorType() const;
int getDrawType() const; int getDrawType() const;
// Sets the interface used to get icons for the button depending its
// state. This interface is deleted automatically in the ButtonBase dtor.
void setIconInterface(IButtonIcon* iconInterface);
// Used by the current theme to draw the button icon.
IButtonIcon* getIconInterface() const { return m_iconInterface; }
// Signals // Signals
Signal1<void, Event&> Click; Signal1<void, Event&> Click;
@ -52,8 +66,7 @@ private:
bool m_pressedStatus; bool m_pressedStatus;
int m_behaviorType; int m_behaviorType;
int m_drawType; int m_drawType;
BITMAP* m_icon; IButtonIcon* m_iconInterface;
int m_iconAlign;
}; };
// Pushable button to execute commands // Pushable button to execute commands

View File

@ -14,6 +14,17 @@
using namespace gfx; using namespace gfx;
class ComboBoxButton : public Button
{
public:
ComboBoxButton() : Button("") { }
void onPaint(PaintEvent& ev)
{
getTheme()->paintComboBoxButton(ev);
}
};
struct ComboBox::Item struct ComboBox::Item
{ {
std::string text; std::string text;
@ -26,14 +37,13 @@ struct ComboBox::Item
(index >= 0 && index < combobox->getItemCount()) (index >= 0 && index < combobox->getItemCount())
static bool combobox_entry_msg_proc(JWidget widget, JMessage msg); static bool combobox_entry_msg_proc(JWidget widget, JMessage msg);
static bool combobox_button_msg_proc(JWidget widget, JMessage msg);
static bool combobox_listbox_msg_proc(JWidget widget, JMessage msg); static bool combobox_listbox_msg_proc(JWidget widget, JMessage msg);
ComboBox::ComboBox() ComboBox::ComboBox()
: Widget(JI_COMBOBOX) : Widget(JI_COMBOBOX)
{ {
m_entry = new Entry(256, ""); m_entry = new Entry(256, "");
m_button = new Button(""); m_button = new ComboBoxButton();
m_window = NULL; m_window = NULL;
m_selected = 0; m_selected = 0;
m_editable = false; m_editable = false;
@ -48,7 +58,6 @@ ComboBox::ComboBox()
jwidget_focusrest(this, true); jwidget_focusrest(this, true);
jwidget_add_hook(m_entry, JI_WIDGET, combobox_entry_msg_proc, NULL); jwidget_add_hook(m_entry, JI_WIDGET, combobox_entry_msg_proc, NULL);
jwidget_add_hook(m_button, JI_WIDGET, combobox_button_msg_proc, NULL);
jwidget_expansive(m_entry, true); jwidget_expansive(m_entry, true);
@ -359,18 +368,6 @@ static bool combobox_entry_msg_proc(JWidget widget, JMessage msg)
return false; return false;
} }
static bool combobox_button_msg_proc(JWidget widget, JMessage msg)
{
switch (msg->type) {
case JM_DRAW:
widget->getTheme()->draw_combobox_button((ButtonBase*)widget, &msg->draw.rect);
return true;
}
return false;
}
static bool combobox_listbox_msg_proc(JWidget widget, JMessage msg) static bool combobox_listbox_msg_proc(JWidget widget, JMessage msg)
{ {
ComboBox* combobox = reinterpret_cast<ComboBox*>(widget->user_data[0]); ComboBox* combobox = reinterpret_cast<ComboBox*>(widget->user_data[0]);

View File

@ -197,19 +197,6 @@ void jdraw_text(BITMAP* bmp, FONT* font, const char *s, int x, int y,
} }
} }
void jdraw_inverted_sprite(BITMAP *bmp, BITMAP *sprite, int x, int y)
{
if (bitmap_color_depth(bmp) == 8) {
draw_character_ex(bmp, sprite, x, y, makecol(255, 255, 255), -1);
}
else {
drawing_mode(DRAW_MODE_TRANS, NULL, 0, 0);
set_invert_blender(0, 0, 0, 255);
draw_lit_sprite(bmp, sprite, x, y, 255);
drawing_mode(DRAW_MODE_SOLID, NULL, 0, 0);
}
}
void ji_move_region(JRegion region, int dx, int dy) void ji_move_region(JRegion region, int dx, int dy)
{ {
int c, nrects = JI_REGION_NUM_RECTS(region); int c, nrects = JI_REGION_NUM_RECTS(region);

View File

@ -32,8 +32,6 @@ Theme::Theme()
this->desktop_color = 0; this->desktop_color = 0;
this->textbox_fg_color = 0; this->textbox_fg_color = 0;
this->textbox_bg_color = 0; this->textbox_bg_color = 0;
this->check_icon_size = 0;
this->radio_icon_size = 0;
this->scrollbar_size = 0; this->scrollbar_size = 0;
this->guiscale = 1; this->guiscale = 1;
} }

View File

@ -24,8 +24,6 @@ public:
int desktop_color; int desktop_color;
int textbox_fg_color; int textbox_fg_color;
int textbox_bg_color; int textbox_bg_color;
int check_icon_size;
int radio_icon_size;
int scrollbar_size; int scrollbar_size;
int guiscale; int guiscale;
@ -62,7 +60,7 @@ public:
virtual void draw_separator(JWidget widget, JRect clip) = 0; virtual void draw_separator(JWidget widget, JRect clip) = 0;
virtual void paintSlider(PaintEvent& ev) = 0; virtual void paintSlider(PaintEvent& ev) = 0;
virtual void draw_combobox_entry(Entry* widget, JRect clip) = 0; virtual void draw_combobox_entry(Entry* widget, JRect clip) = 0;
virtual void draw_combobox_button(ButtonBase* widget, JRect clip) = 0; virtual void paintComboBoxButton(PaintEvent& ev) = 0;
virtual void draw_textbox(JWidget widget, JRect clip) = 0; virtual void draw_textbox(JWidget widget, JRect clip) = 0;
virtual void draw_view(JWidget widget, JRect clip) = 0; virtual void draw_view(JWidget widget, JRect clip) = 0;
virtual void draw_view_scrollbar(JWidget widget, JRect clip) = 0; virtual void draw_view_scrollbar(JWidget widget, JRect clip) = 0;

View File

@ -41,75 +41,8 @@
#include "skin/skin_theme.h" #include "skin/skin_theme.h"
#include "widgets/editor.h" #include "widgets/editor.h"
static BITMAP* gfx_bmps[GFX_BITMAP_COUNT];
#include "modules/gfxdata.cpp"
using namespace gfx; using namespace gfx;
static void convert_data_to_bitmap(DATA *data, BITMAP** bmp)
{
int scale = jguiscale();
const char *p;
int x, y;
int black = makecol(0, 0, 0);
int gray = makecol(128, 128, 128);
int white = makecol(255, 255, 255);
int mask;
*bmp = create_bitmap(data->w * scale,
data->h * scale);
mask = bitmap_mask_color(*bmp);
p = data->line;
for (y=0; y<(*bmp)->h; y+=scale) {
for (x=0; x<(*bmp)->w; x+=scale) {
rectfill(*bmp, x, y, x+scale-1, y+scale-1,
(*p == '#') ? black:
(*p == '%') ? gray:
(*p == '.') ? white: mask);
p++;
}
}
}
// Slot for App::PaletteChange signal
static void on_palette_change_signal()
{
for (int c=0; c<GFX_BITMAP_COUNT; c++) {
if (gfx_bmps[c])
destroy_bitmap(gfx_bmps[c]);
gfx_bmps[c] = NULL;
}
}
int init_module_graphics()
{
for (int c=0; c<GFX_BITMAP_COUNT; c++)
gfx_bmps[c] = NULL;
App::instance()->PaletteChange.connect(&on_palette_change_signal);
return 0;
}
void exit_module_graphics()
{
for (int c=0; c<GFX_BITMAP_COUNT; c++)
if (gfx_bmps[c]) {
destroy_bitmap(gfx_bmps[c]);
gfx_bmps[c] = NULL;
}
}
BITMAP* get_gfx(int id)
{
if (!gfx_bmps[id])
convert_data_to_bitmap(&gfx_data[id], &gfx_bmps[id]);
return gfx_bmps[id];
}
void dotted_mode(int offset) void dotted_mode(int offset)
{ {
/* these pattern were taken from The GIMP: /* these pattern were taken from The GIMP:

View File

@ -37,51 +37,8 @@ struct BITMAP;
getg(color1)+(getg(color2)-getg(color1))*step/max, \ getg(color1)+(getg(color2)-getg(color1))*step/max, \
getb(color1)+(getb(color2)-getb(color1))*step/max) getb(color1)+(getb(color2)-getb(color1))*step/max)
/* graphics ids */
enum {
GFX_ANI_FIRST,
GFX_ANI_PREV,
GFX_ANI_PLAY,
GFX_ANI_NEXT,
GFX_ANI_LAST,
GFX_TARGET_ONE,
GFX_TARGET_FRAMES,
GFX_TARGET_LAYERS,
GFX_TARGET_FRAMES_LAYERS,
GFX_BRUSH_CIRCLE,
GFX_BRUSH_SQUARE,
GFX_BRUSH_LINE,
GFX_SCALE_1,
GFX_SCALE_2,
GFX_SCALE_3,
GFX_ROTATE_1,
GFX_ROTATE_2,
GFX_ROTATE_3,
GFX_ARROW_LEFT,
GFX_ARROW_RIGHT,
GFX_ARROW_UP,
GFX_ARROW_DOWN,
GFX_BOX_SHOW,
GFX_BOX_HIDE,
GFX_BOX_LOCK,
GFX_BOX_UNLOCK,
GFX_BITMAP_COUNT,
};
typedef struct RectTracker RectTracker; typedef struct RectTracker RectTracker;
int init_module_graphics();
void exit_module_graphics();
BITMAP* get_gfx(int id);
void dotted_mode(int offset); void dotted_mode(int offset);
void simple_dotted_mode(BITMAP* bmp, int fg, int bg); void simple_dotted_mode(BITMAP* bmp, int fg, int bg);

View File

@ -1,333 +0,0 @@
/* ASE - Allegro Sprite Editor
* Copyright (C) 2001-2011 David Capello
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
typedef struct DATA
{
char w, h; /* width and height of the bitmap */
const char* line; /* scanline data */
} DATA;
static DATA gfx_data[GFX_BITMAP_COUNT] =
{
/* GFX_ANI_FIRST */
{ 8, 8,
" ## # "
" ## ## "
" ## ### "
" ###### "
" ## ### "
" ## ## "
" ## # "
" " },
/* GFX_ANI_PREV */
{ 8, 8,
" # ## "
" ## ## "
" ### ## "
"#### ## "
" ### ## "
" ## ## "
" # ## "
" " },
/* GFX_ANI_PLAY */
{ 8, 8,
" # "
" ## "
" ### "
" #### "
" ### "
" ## "
" # "
" " },
/* GFX_ANI_NEXT */
{ 8, 8,
" ## # "
" ## ## "
" ## ### "
" ## ####"
" ## ### "
" ## ## "
" ## # "
" " },
/* GFX_ANI_LAST */
{ 8, 8,
" # ##"
" ## ##"
" ### ##"
" #### ##"
" ### ##"
" ## ##"
" # ##"
" " },
/* GFX_TARGET_ONE */
{ 32, 16,
" "
" "
" "
" "
" ################### "
" # # "
" # # "
" # # "
" # # "
" # # "
" ################### "
" "
" "
" "
" "
" " },
/* GFX_TARGET_FRAMES */
{ 32, 16,
" "
" "
" "
" "
" ################### "
" # # # # "
" # ##### # # "
" # ###### # # "
" # ##### # # "
" # # # # "
" ################### "
" "
" "
" "
" "
" " },
/* GFX_TARGET_LAYERS */
{ 32, 16,
" "
" ################### "
" # # "
" # # "
" # #### "
" # # # "
" # # #### "
" ################### # # "
" # # # "
" # # # "
" ################### # "
" # # "
" # # "
" ################### "
" "
" " },
/* GFX_TARGET_FRAMES_LAYERS */
{ 32, 16,
" "
" ################### "
" # # # # "
" # ##### # # "
" # ###### # #### "
" # ##### # # # "
" # # # # #### "
" ################### # # "
" # # # "
" # # # "
" ################### # "
" # # "
" # # "
" ################### "
" "
" " },
/* GFX_BRUSH_CIRCLE */
{ 7, 7,
" ### "
" ##### "
"#######"
"#######"
"#######"
" ##### "
" ### " },
/* GFX_BRUSH_SQUARE */
{ 7, 7,
"#######"
"#######"
"#######"
"#######"
"#######"
"#######"
"#######" },
/* GFX_BRUSH_LINE */
{ 6, 6,
"# "
" # "
" # "
" # "
" # "
" #" },
/* GFX_SCALE_1 */
{ 11, 11,
"## "
"#.## "
" #..## "
" #....# "
" #..## "
" #.#.# "
" ###.# "
" #.# "
" #.# "
" #.#"
" ##" },
/* GFX_SCALE_2 */
{ 7, 12,
" # "
" #.# "
" #.# "
" #...# "
" #...# "
"#.....#"
"###.###"
" #.# "
" #.# "
" #.# "
" #.# "
" # " },
/* GFX_SCALE_3 */
{ 12, 7,
" ## "
" ##.# "
" ##...##### "
"#..........#"
" ##...##### "
" ##.# "
" ## " },
/* GFX_ROTATE_1 */
{ 11, 11,
" ## "
" ####.## "
" #.......#"
" #..###.## "
" #.# ## "
" #.# "
"##.## "
"#...# "
" #.# "
" #.# "
" # " },
/* GFX_ROTATE_2 */
{ 15, 10,
" ### "
" #...# "
" # #.###.# # "
" ##.# #.## "
" #..# #..# "
" #..## ##..# "
"#.## ##.#"
"## ##"
" "
" " },
/* GFX_ROTATE_3 */
{ 10, 15,
" ## "
" ##.# "
" ##..# "
" #..# "
" #.## "
" #.# # "
"#.# "
"#.# "
"#.# "
" #.# # "
" #.## "
" #..# "
" ##..# "
" ##.# "
" ## " },
/* GFX_ARROW_LEFT */
{ 8, 8,
" # "
" ## "
" ### "
" #### "
" ### "
" ## "
" # "
" " },
/* GFX_ARROW_RIGHT */
{ 8, 8,
" # "
" ## "
" ### "
" #### "
" ### "
" ## "
" # "
" " },
/* GFX_ARROW_UP */
{ 8, 8,
" "
" "
" # "
" ### "
" ##### "
"####### "
" "
" " },
/* GFX_ARROW_DOWN */
{ 8, 8,
" "
" "
"####### "
" ##### "
" ### "
" # "
" "
" " },
/* GFX_BOX_SHOW */
{ 8, 8,
" #### "
" # # "
"# #### #"
"#### ###"
"# #### #"
"# ## #"
" # # "
" #### " },
/* GFX_BOX_HIDE */
{ 8, 8,
"## # "
" ## # "
" #### "
" ## "
" #### "
" # ## "
" # # "
"# "},
/* GFX_BOX_LOCK */
{ 8, 8,
" "
" ### "
" # # "
"####### "
"### ### "
"### ### "
"### ### "
" ##### " },
/* GFX_BOX_UNLOCK */
{ 8, 8,
" ### "
" # # "
" # "
"####### "
"### ### "
"### ### "
"### ### "
" ##### " },
};

View File

@ -46,6 +46,7 @@
#include "modules/rootmenu.h" #include "modules/rootmenu.h"
#include "raster/sprite.h" #include "raster/sprite.h"
#include "resource_finder.h" #include "resource_finder.h"
#include "skin/button_icon_impl.h"
#include "skin/skin_property.h" #include "skin/skin_property.h"
#include "skin/skin_theme.h" #include "skin/skin_theme.h"
#include "sprite_wrappers.h" #include "sprite_wrappers.h"
@ -149,8 +150,6 @@ static volatile int next_idle_flags = 0;
static volatile int restored_width = 0; static volatile int restored_width = 0;
static volatile int restored_height = 0; static volatile int restored_height = 0;
static JList icon_buttons;
/* default GUI screen configuration */ /* default GUI screen configuration */
static bool double_buffering; static bool double_buffering;
static int screen_scaling; static int screen_scaling;
@ -324,9 +323,6 @@ gfx_done:;
// Hook for palette change to regenerate the theme // Hook for palette change to regenerate the theme
App::instance()->PaletteChange.connect(&on_palette_change_signal); App::instance()->PaletteChange.connect(&on_palette_change_signal);
/* icon buttons */
icon_buttons = jlist_new();
return 0; return 0;
} }
@ -361,9 +357,6 @@ void exit_module_gui()
ji_screen_created = false; ji_screen_created = false;
} }
jlist_free(icon_buttons);
icon_buttons = NULL;
jmanager_free(manager); jmanager_free(manager);
// Destroy the default font of the current theme // Destroy the default font of the current theme
@ -839,41 +832,21 @@ void setup_bevels(Widget* widget, int b1, int b2, int b3, int b4)
widget->setProperty(skinProp); widget->setProperty(skinProp);
} }
/**********************************************************************/ // Sets the IconInterface pointer interface of the button to show the
/* Icon in buttons */ // specified set of icons. Each icon is a part of the SkinTheme.
void set_gfxicon_to_button(ButtonBase* button,
/* adds a button in the list of "icon_buttons" to restore the icon int normal_part_id,
when the palette changes, the "user_data[3]" is used to save the int selected_part_id,
"gfx_id" (the same ID that is used in "get_gfx()" from int disabled_part_id, int icon_align)
"modules/gfx.c"), also this routine adds a hook to
JI_SIGNAL_DESTROY to remove the button from the "icon_buttons"
list when the widget is free */
void add_gfxicon_to_button(ButtonBase* button, int gfx_id, int icon_align)
{ {
button->user_data[3] = (void*)gfx_id; ButtonIconImpl* buttonIcon =
new ButtonIconImpl(static_cast<SkinTheme*>(button->getTheme()),
normal_part_id,
selected_part_id,
disabled_part_id,
icon_align);
jwidget_add_hook(button, JI_WIDGET, button_with_icon_msg_proc, NULL); button->setIconInterface(buttonIcon);
button->setButtonIcon(get_gfx(gfx_id));
button->setButtonIconAlign(icon_align);
jlist_append(icon_buttons, button);
}
void set_gfxicon_in_button(ButtonBase* button, int gfx_id)
{
button->user_data[3] = (void*)gfx_id;
button->setButtonIcon(get_gfx(gfx_id));
button->invalidate();
}
static bool button_with_icon_msg_proc(JWidget widget, JMessage msg)
{
if (msg->type == JM_DESTROY)
jlist_remove(icon_buttons, widget);
return false;
} }
/**********************************************************************/ /**********************************************************************/
@ -1295,11 +1268,4 @@ static void on_palette_change_signal()
{ {
// Regenerate the theme // Regenerate the theme
CurrentTheme::get()->regenerate(); CurrentTheme::get()->regenerate();
// Fixup the icons
JLink link;
JI_LIST_FOR_EACH(icon_buttons, link) {
ButtonBase* button = reinterpret_cast<ButtonBase*>(link->data);
button->setButtonIcon(get_gfx((size_t)button->user_data[3]));
}
} }

View File

@ -94,8 +94,10 @@ void get_widgets(Widget* window, ...);
void setup_mini_look(Widget* widget); void setup_mini_look(Widget* widget);
void setup_bevels(Widget* widget, int b1, int b2, int b3, int b4); void setup_bevels(Widget* widget, int b1, int b2, int b3, int b4);
void add_gfxicon_to_button(ButtonBase* button, int gfx_id, int icon_align); void set_gfxicon_to_button(ButtonBase* button,
void set_gfxicon_in_button(ButtonBase* button, int gfx_id); int normal_part_id,
int selected_part_id,
int disabled_part_id, int icon_align);
RadioButton* radio_button_new(int radio_group, int b1, int b2, int b3, int b4); RadioButton* radio_button_new(int radio_group, int b1, int b2, int b3, int b4);
CheckBox* check_button_new(const char* text, int b1, int b2, int b3, int b4); CheckBox* check_button_new(const char* text, int b1, int b2, int b3, int b4);

View File

@ -0,0 +1,73 @@
/* ASE - Allegro Sprite Editor
* Copyright (C) 2001-2011 David Capello
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "config.h"
#include <allegro.h>
#include "skin/button_icon_impl.h"
#include "skin/skin_theme.h"
ButtonIconImpl::ButtonIconImpl(SkinTheme* theme,
int normalIcon,
int selectedIcon,
int disabledIcon,
int iconAlign)
: m_theme(theme)
, m_normalIcon(normalIcon)
, m_selectedIcon(selectedIcon)
, m_disabledIcon(disabledIcon)
, m_iconAlign(iconAlign)
{
ASSERT(theme != NULL);
}
void ButtonIconImpl::destroy()
{
delete this;
}
int ButtonIconImpl::getWidth()
{
return m_theme->get_part(m_normalIcon)->w;
}
int ButtonIconImpl::getHeight()
{
return m_theme->get_part(m_normalIcon)->h;
}
BITMAP* ButtonIconImpl::getNormalIcon()
{
return m_theme->get_part(m_normalIcon);
}
BITMAP* ButtonIconImpl::getSelectedIcon()
{
return m_theme->get_part(m_selectedIcon);
}
BITMAP* ButtonIconImpl::getDisabledIcon()
{
return m_theme->get_part(m_disabledIcon);
}
int ButtonIconImpl::getIconAlign()
{
return m_iconAlign;
}

View File

@ -0,0 +1,52 @@
/* ASE - Allegro Sprite Editor
* Copyright (C) 2001-2011 David Capello
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef BUTTON_ICON_IMPL_H_INCLUDED
#define BUTTON_ICON_IMPL_H_INCLUDED
#include "gui/button.h"
class SkinTheme;
class ButtonIconImpl : public IButtonIcon
{
public:
ButtonIconImpl(SkinTheme* theme,
int normalIcon,
int selectedIcon,
int disabledIcon,
int iconAlign);
// IButtonIcon implementation
void destroy();
int getWidth();
int getHeight();
BITMAP* getNormalIcon();
BITMAP* getSelectedIcon();
BITMAP* getDisabledIcon();
int getIconAlign();
public:
SkinTheme* m_theme;
int m_normalIcon;
int m_selectedIcon;
int m_disabledIcon;
int m_iconAlign;
};
#endif

View File

@ -220,7 +220,18 @@ enum {
PART_SEPARATOR_HORZ, PART_SEPARATOR_HORZ,
PART_SEPARATOR_VERT, PART_SEPARATOR_VERT,
PART_COMBOBOX_ARROW, PART_COMBOBOX_ARROW_DOWN,
PART_COMBOBOX_ARROW_DOWN_SELECTED,
PART_COMBOBOX_ARROW_DOWN_DISABLED,
PART_COMBOBOX_ARROW_UP,
PART_COMBOBOX_ARROW_UP_SELECTED,
PART_COMBOBOX_ARROW_UP_DISABLED,
PART_COMBOBOX_ARROW_LEFT,
PART_COMBOBOX_ARROW_LEFT_SELECTED,
PART_COMBOBOX_ARROW_LEFT_DISABLED,
PART_COMBOBOX_ARROW_RIGHT,
PART_COMBOBOX_ARROW_RIGHT_SELECTED,
PART_COMBOBOX_ARROW_RIGHT_DISABLED,
PART_TOOLBUTTON_NORMAL_NW, PART_TOOLBUTTON_NORMAL_NW,
PART_TOOLBUTTON_NORMAL_N, PART_TOOLBUTTON_NORMAL_N,
@ -249,6 +260,15 @@ enum {
PART_TOOLBUTTON_LAST_SW, PART_TOOLBUTTON_LAST_SW,
PART_TOOLBUTTON_LAST_W, PART_TOOLBUTTON_LAST_W,
PART_TOOLBUTTON_PUSHED_NW,
PART_TOOLBUTTON_PUSHED_N,
PART_TOOLBUTTON_PUSHED_NE,
PART_TOOLBUTTON_PUSHED_E,
PART_TOOLBUTTON_PUSHED_SE,
PART_TOOLBUTTON_PUSHED_S,
PART_TOOLBUTTON_PUSHED_SW,
PART_TOOLBUTTON_PUSHED_W,
PART_TAB_NORMAL_NW, PART_TAB_NORMAL_NW,
PART_TAB_NORMAL_N, PART_TAB_NORMAL_N,
PART_TAB_NORMAL_NE, PART_TAB_NORMAL_NE,
@ -397,6 +417,54 @@ enum {
PART_TOOLTIP_ARROW_SW, PART_TOOLTIP_ARROW_SW,
PART_TOOLTIP_ARROW_W, PART_TOOLTIP_ARROW_W,
PART_ANI_FIRST,
PART_ANI_FIRST_SELECTED,
PART_ANI_FIRST_DISABLED,
PART_ANI_PREVIOUS,
PART_ANI_PREVIOUS_SELECTED,
PART_ANI_PREVIOUS_DISABLED,
PART_ANI_PLAY,
PART_ANI_PLAY_SELECTED,
PART_ANI_PLAY_DISABLED,
PART_ANI_NEXT,
PART_ANI_NEXT_SELECTED,
PART_ANI_NEXT_DISABLED,
PART_ANI_LAST,
PART_ANI_LAST_SELECTED,
PART_ANI_LAST_DISABLED,
PART_TARGET_ONE,
PART_TARGET_ONE_SELECTED,
PART_TARGET_FRAMES,
PART_TARGET_FRAMES_SELECTED,
PART_TARGET_LAYERS,
PART_TARGET_LAYERS_SELECTED,
PART_TARGET_FRAMES_LAYERS,
PART_TARGET_FRAMES_LAYERS_SELECTED,
PART_BRUSH_CIRCLE,
PART_BRUSH_CIRCLE_SELECTED,
PART_BRUSH_SQUARE,
PART_BRUSH_SQUARE_SELECTED,
PART_BRUSH_LINE,
PART_BRUSH_LINE_SELECTED,
PART_SCALE_ARROW_1,
PART_SCALE_ARROW_2,
PART_SCALE_ARROW_3,
PART_ROTATE_ARROW_1,
PART_ROTATE_ARROW_2,
PART_ROTATE_ARROW_3,
PART_LAYER_VISIBLE,
PART_LAYER_VISIBLE_SELECTED,
PART_LAYER_HIDDEN,
PART_LAYER_HIDDEN_SELECTED,
PART_LAYER_EDITABLE,
PART_LAYER_EDITABLE_SELECTED,
PART_LAYER_LOCKED,
PART_LAYER_LOCKED_SELECTED,
PARTS PARTS
}; };

View File

@ -32,6 +32,7 @@
#include "loadpng.h" #include "loadpng.h"
#include "modules/gui.h" #include "modules/gui.h"
#include "resource_finder.h" #include "resource_finder.h"
#include "skin/button_icon_impl.h"
#include "skin/skin_property.h" #include "skin/skin_property.h"
#include "skin/skin_slider_property.h" #include "skin/skin_slider_property.h"
#include "skin/skin_theme.h" #include "skin/skin_theme.h"
@ -120,10 +121,22 @@ SkinTheme::SkinTheme()
sheet_mapping["mini_slider_thumb_focused"] = PART_MINI_SLIDER_THUMB_FOCUSED; sheet_mapping["mini_slider_thumb_focused"] = PART_MINI_SLIDER_THUMB_FOCUSED;
sheet_mapping["separator_horz"] = PART_SEPARATOR_HORZ; sheet_mapping["separator_horz"] = PART_SEPARATOR_HORZ;
sheet_mapping["separator_vert"] = PART_SEPARATOR_VERT; sheet_mapping["separator_vert"] = PART_SEPARATOR_VERT;
sheet_mapping["combobox_arrow"] = PART_COMBOBOX_ARROW; sheet_mapping["combobox_arrow_down"] = PART_COMBOBOX_ARROW_DOWN;
sheet_mapping["combobox_arrow_down_selected"] = PART_COMBOBOX_ARROW_DOWN_SELECTED;
sheet_mapping["combobox_arrow_down_disabled"] = PART_COMBOBOX_ARROW_DOWN_DISABLED;
sheet_mapping["combobox_arrow_up"] = PART_COMBOBOX_ARROW_UP;
sheet_mapping["combobox_arrow_up_selected"] = PART_COMBOBOX_ARROW_UP_SELECTED;
sheet_mapping["combobox_arrow_up_disabled"] = PART_COMBOBOX_ARROW_UP_DISABLED;
sheet_mapping["combobox_arrow_left"] = PART_COMBOBOX_ARROW_LEFT;
sheet_mapping["combobox_arrow_left_selected"] = PART_COMBOBOX_ARROW_LEFT_SELECTED;
sheet_mapping["combobox_arrow_left_disabled"] = PART_COMBOBOX_ARROW_LEFT_DISABLED;
sheet_mapping["combobox_arrow_right"] = PART_COMBOBOX_ARROW_RIGHT;
sheet_mapping["combobox_arrow_right_selected"] = PART_COMBOBOX_ARROW_RIGHT_SELECTED;
sheet_mapping["combobox_arrow_right_disabled"] = PART_COMBOBOX_ARROW_RIGHT_DISABLED;
sheet_mapping["toolbutton_normal"] = PART_TOOLBUTTON_NORMAL_NW; sheet_mapping["toolbutton_normal"] = PART_TOOLBUTTON_NORMAL_NW;
sheet_mapping["toolbutton_hot"] = PART_TOOLBUTTON_HOT_NW; sheet_mapping["toolbutton_hot"] = PART_TOOLBUTTON_HOT_NW;
sheet_mapping["toolbutton_last"] = PART_TOOLBUTTON_LAST_NW; sheet_mapping["toolbutton_last"] = PART_TOOLBUTTON_LAST_NW;
sheet_mapping["toolbutton_pushed"] = PART_TOOLBUTTON_PUSHED_NW;
sheet_mapping["tab_normal"] = PART_TAB_NORMAL_NW; sheet_mapping["tab_normal"] = PART_TAB_NORMAL_NW;
sheet_mapping["tab_selected"] = PART_TAB_SELECTED_NW; sheet_mapping["tab_selected"] = PART_TAB_SELECTED_NW;
sheet_mapping["tab_bottom_selected"] = PART_TAB_BOTTOM_SELECTED_NW; sheet_mapping["tab_bottom_selected"] = PART_TAB_BOTTOM_SELECTED_NW;
@ -142,6 +155,49 @@ SkinTheme::SkinTheme()
sheet_mapping["scrollbar_thumb"] = PART_SCROLLBAR_THUMB_NW; sheet_mapping["scrollbar_thumb"] = PART_SCROLLBAR_THUMB_NW;
sheet_mapping["tooltip"] = PART_TOOLTIP_NW; sheet_mapping["tooltip"] = PART_TOOLTIP_NW;
sheet_mapping["tooltip_arrow"] = PART_TOOLTIP_ARROW_NW; sheet_mapping["tooltip_arrow"] = PART_TOOLTIP_ARROW_NW;
sheet_mapping["ani_first"] = PART_ANI_FIRST;
sheet_mapping["ani_first_selected"] = PART_ANI_FIRST_SELECTED;
sheet_mapping["ani_first_disabled"] = PART_ANI_FIRST_DISABLED;
sheet_mapping["ani_previous"] = PART_ANI_PREVIOUS;
sheet_mapping["ani_previous_selected"] = PART_ANI_PREVIOUS_SELECTED;
sheet_mapping["ani_previous_disabled"] = PART_ANI_PREVIOUS_DISABLED;
sheet_mapping["ani_play"] = PART_ANI_PLAY;
sheet_mapping["ani_play_selected"] = PART_ANI_PLAY_SELECTED;
sheet_mapping["ani_play_disabled"] = PART_ANI_PLAY_DISABLED;
sheet_mapping["ani_next"] = PART_ANI_NEXT;
sheet_mapping["ani_next_selected"] = PART_ANI_NEXT_SELECTED;
sheet_mapping["ani_next_disabled"] = PART_ANI_NEXT_DISABLED;
sheet_mapping["ani_last"] = PART_ANI_LAST;
sheet_mapping["ani_last_selected"] = PART_ANI_LAST_SELECTED;
sheet_mapping["ani_last_disabled"] = PART_ANI_LAST_DISABLED;
sheet_mapping["target_one"] = PART_TARGET_ONE;
sheet_mapping["target_one_selected"] = PART_TARGET_ONE_SELECTED;
sheet_mapping["target_frames"] = PART_TARGET_FRAMES;
sheet_mapping["target_frames_selected"] = PART_TARGET_FRAMES_SELECTED;
sheet_mapping["target_layers"] = PART_TARGET_LAYERS;
sheet_mapping["target_layers_selected"] = PART_TARGET_LAYERS_SELECTED;
sheet_mapping["target_frames_layers"] = PART_TARGET_FRAMES_LAYERS;
sheet_mapping["target_frames_layers_selected"] = PART_TARGET_FRAMES_LAYERS_SELECTED;
sheet_mapping["brush_circle"] = PART_BRUSH_CIRCLE;
sheet_mapping["brush_circle_selected"] = PART_BRUSH_CIRCLE_SELECTED;
sheet_mapping["brush_square"] = PART_BRUSH_SQUARE;
sheet_mapping["brush_square_selected"] = PART_BRUSH_SQUARE_SELECTED;
sheet_mapping["brush_line"] = PART_BRUSH_LINE;
sheet_mapping["brush_line_selected"] = PART_BRUSH_LINE_SELECTED;
sheet_mapping["scale_arrow_1"] = PART_SCALE_ARROW_1;
sheet_mapping["scale_arrow_2"] = PART_SCALE_ARROW_2;
sheet_mapping["scale_arrow_3"] = PART_SCALE_ARROW_3;
sheet_mapping["rotate_arrow_1"] = PART_ROTATE_ARROW_1;
sheet_mapping["rotate_arrow_2"] = PART_ROTATE_ARROW_2;
sheet_mapping["rotate_arrow_3"] = PART_ROTATE_ARROW_3;
sheet_mapping["layer_visible"] = PART_LAYER_VISIBLE;
sheet_mapping["layer_visible_selected"] = PART_LAYER_VISIBLE_SELECTED;
sheet_mapping["layer_hidden"] = PART_LAYER_HIDDEN;
sheet_mapping["layer_hidden_selected"] = PART_LAYER_HIDDEN_SELECTED;
sheet_mapping["layer_editable"] = PART_LAYER_EDITABLE;
sheet_mapping["layer_editable_selected"] = PART_LAYER_EDITABLE_SELECTED;
sheet_mapping["layer_locked"] = PART_LAYER_LOCKED;
sheet_mapping["layer_locked_selected"] = PART_LAYER_LOCKED_SELECTED;
reload_skin(); reload_skin();
} }
@ -202,8 +258,6 @@ std::string SkinTheme::get_font_filename() const
void SkinTheme::onRegenerate() void SkinTheme::onRegenerate()
{ {
check_icon_size = 8 * jguiscale();
radio_icon_size = 8 * jguiscale();
scrollbar_size = 12 * jguiscale(); scrollbar_size = 12 * jguiscale();
desktop_color = COLOR_DISABLED; desktop_color = COLOR_DISABLED;
@ -295,7 +349,13 @@ void SkinTheme::onRegenerate()
int y = strtol(xmlPart->Attribute("y"), NULL, 10); int y = strtol(xmlPart->Attribute("y"), NULL, 10);
int w = xmlPart->Attribute("w") ? strtol(xmlPart->Attribute("w"), NULL, 10): 0; int w = xmlPart->Attribute("w") ? strtol(xmlPart->Attribute("w"), NULL, 10): 0;
int h = xmlPart->Attribute("h") ? strtol(xmlPart->Attribute("h"), NULL, 10): 0; int h = xmlPart->Attribute("h") ? strtol(xmlPart->Attribute("h"), NULL, 10): 0;
int c = sheet_mapping[part_id]; std::map<std::string, int>::iterator it = sheet_mapping.find(part_id);
if (it == sheet_mapping.end()) {
throw base::Exception("Unknown part specified in '%s':\n"
"<part id='%s' ... />\n", xml_filename.c_str(), part_id);
}
int c = it->second;
if (w > 0 && h > 0) { if (w > 0 && h > 0) {
// Crop the part from the sheet // Crop the part from the sheet
@ -406,6 +466,13 @@ void SkinTheme::init_widget(JWidget widget)
case JI_CHECK: case JI_CHECK:
BORDER(2 * scale); BORDER(2 * scale);
widget->child_spacing = 4 * scale; widget->child_spacing = 4 * scale;
static_cast<ButtonBase*>(widget)->setIconInterface
(new ButtonIconImpl(static_cast<SkinTheme*>(widget->getTheme()),
PART_CHECK_NORMAL,
PART_CHECK_SELECTED,
PART_CHECK_DISABLED,
JI_LEFT | JI_MIDDLE));
break; break;
case JI_ENTRY: case JI_ENTRY:
@ -447,6 +514,13 @@ void SkinTheme::init_widget(JWidget widget)
button->child_spacing = 0; button->child_spacing = 0;
button->min_w = 15 * jguiscale(); button->min_w = 15 * jguiscale();
button->min_h = 16 * jguiscale(); button->min_h = 16 * jguiscale();
static_cast<ButtonBase*>(button)->setIconInterface
(new ButtonIconImpl(static_cast<SkinTheme*>(button->getTheme()),
PART_COMBOBOX_ARROW_DOWN,
PART_COMBOBOX_ARROW_DOWN_SELECTED,
PART_COMBOBOX_ARROW_DOWN_DISABLED,
JI_CENTER | JI_MIDDLE));
} }
break; break;
@ -470,6 +544,13 @@ void SkinTheme::init_widget(JWidget widget)
case JI_RADIO: case JI_RADIO:
BORDER(2 * scale); BORDER(2 * scale);
widget->child_spacing = 4 * scale; widget->child_spacing = 4 * scale;
static_cast<ButtonBase*>(widget)->setIconInterface
(new ButtonIconImpl(static_cast<SkinTheme*>(widget->getTheme()),
PART_RADIO_NORMAL,
PART_RADIO_SELECTED,
PART_RADIO_DISABLED,
JI_LEFT | JI_MIDDLE));
break; break;
case JI_SEPARATOR: case JI_SEPARATOR:
@ -626,17 +707,16 @@ void SkinTheme::paintBox(PaintEvent& ev)
void SkinTheme::paintButton(PaintEvent& ev) void SkinTheme::paintButton(PaintEvent& ev)
{ {
ButtonBase* widget = static_cast<ButtonBase*>(ev.getSource()); ButtonBase* widget = static_cast<ButtonBase*>(ev.getSource());
BITMAP* icon_bmp = widget->getButtonIcon(); IButtonIcon* iconInterface = widget->getIconInterface();
int icon_align = widget->getButtonIconAlign();
struct jrect box, text, icon; struct jrect box, text, icon;
int x1, y1, x2, y2; int x1, y1, x2, y2;
int fg, bg, part_nw; int fg, bg, part_nw;
JRect crect; JRect crect;
jwidget_get_texticon_info(widget, &box, &text, &icon, jwidget_get_texticon_info(widget, &box, &text, &icon,
icon_align, iconInterface ? iconInterface->getIconAlign(): 0,
icon_bmp ? icon_bmp->w : 0, iconInterface ? iconInterface->getWidth() : 0,
icon_bmp ? icon_bmp->h : 0); iconInterface ? iconInterface->getHeight() : 0);
// Tool buttons are smaller // Tool buttons are smaller
bool isMiniLook = false; bool isMiniLook = false;
@ -688,44 +768,28 @@ void SkinTheme::paintButton(PaintEvent& ev)
draw_textstring(NULL, fg, bg, false, widget, crect, get_button_selected_offset()); draw_textstring(NULL, fg, bg, false, widget, crect, get_button_selected_offset());
jrect_free(crect); jrect_free(crect);
// icon // Paint the icon
if (icon_bmp) { if (iconInterface) {
if (widget->isSelected()) if (widget->isSelected())
jrect_displace(&icon, jrect_displace(&icon,
get_button_selected_offset(), get_button_selected_offset(),
get_button_selected_offset()); get_button_selected_offset());
// enabled paintIcon(widget, ev.getGraphics(), iconInterface, icon.x1-widget->rc->x1, icon.y1-widget->rc->y1);
if (widget->isEnabled()) {
// selected
if (widget->isSelected()) {
jdraw_inverted_sprite(ji_screen, icon_bmp, icon.x1, icon.y1);
}
// non-selected
else {
draw_sprite(ji_screen, icon_bmp, icon.x1, icon.y1);
}
}
// disabled
else {
_ji_theme_draw_sprite_color(ji_screen, icon_bmp, icon.x1+jguiscale(), icon.y1+jguiscale(),
COLOR_BACKGROUND);
_ji_theme_draw_sprite_color(ji_screen, icon_bmp, icon.x1, icon.y1,
COLOR_DISABLED);
}
} }
} }
void SkinTheme::paintCheckBox(PaintEvent& ev) void SkinTheme::paintCheckBox(PaintEvent& ev)
{ {
ButtonBase* widget = static_cast<ButtonBase*>(ev.getSource()); ButtonBase* widget = static_cast<ButtonBase*>(ev.getSource());
IButtonIcon* iconInterface = widget->getIconInterface();
struct jrect box, text, icon; struct jrect box, text, icon;
int bg; int bg;
jwidget_get_texticon_info(widget, &box, &text, &icon, jwidget_get_texticon_info(widget, &box, &text, &icon,
widget->getButtonIconAlign(), iconInterface ? iconInterface->getIconAlign(): 0,
this->check_icon_size, iconInterface ? iconInterface->getWidth() : 0,
this->check_icon_size); iconInterface ? iconInterface->getHeight() : 0);
// background // background
jdraw_rectfill(widget->rc, bg = BGCOLOR); jdraw_rectfill(widget->rc, bg = BGCOLOR);
@ -741,12 +805,9 @@ void SkinTheme::paintCheckBox(PaintEvent& ev)
/* text */ /* text */
draw_textstring(NULL, -1, bg, false, widget, &text, 0); draw_textstring(NULL, -1, bg, false, widget, &text, 0);
/* icon */ // Paint the icon
set_alpha_blender(); if (iconInterface)
draw_trans_sprite(ji_screen, paintIcon(widget, ev.getGraphics(), iconInterface, icon.x1-widget->rc->x1, icon.y1-widget->rc->y1);
widget->isSelected() ? m_part[PART_CHECK_SELECTED]:
m_part[PART_CHECK_NORMAL],
icon.x1, icon.y1);
// draw focus // draw focus
if (widget->hasFocus()) { if (widget->hasFocus()) {
@ -1045,13 +1106,14 @@ void SkinTheme::draw_panel(JWidget widget, JRect clip)
void SkinTheme::paintRadioButton(PaintEvent& ev) void SkinTheme::paintRadioButton(PaintEvent& ev)
{ {
ButtonBase* widget = static_cast<ButtonBase*>(ev.getSource()); ButtonBase* widget = static_cast<ButtonBase*>(ev.getSource());
IButtonIcon* iconInterface = widget->getIconInterface();
struct jrect box, text, icon; struct jrect box, text, icon;
int bg = BGCOLOR; int bg = BGCOLOR;
jwidget_get_texticon_info(widget, &box, &text, &icon, jwidget_get_texticon_info(widget, &box, &text, &icon,
widget->getButtonIconAlign(), iconInterface ? iconInterface->getIconAlign(): 0,
this->radio_icon_size, iconInterface ? iconInterface->getWidth() : 0,
this->radio_icon_size); iconInterface ? iconInterface->getHeight() : 0);
/* background */ /* background */
jdraw_rectfill(widget->rc, bg); jdraw_rectfill(widget->rc, bg);
@ -1067,12 +1129,9 @@ void SkinTheme::paintRadioButton(PaintEvent& ev)
/* text */ /* text */
draw_textstring(NULL, -1, bg, false, widget, &text, 0); draw_textstring(NULL, -1, bg, false, widget, &text, 0);
/* icon */ // Paint the icon
set_alpha_blender(); if (iconInterface)
draw_trans_sprite(ji_screen, paintIcon(widget, ev.getGraphics(), iconInterface, icon.x1-widget->rc->x1, icon.y1-widget->rc->y1);
widget->isSelected() ? m_part[PART_RADIO_SELECTED]:
m_part[PART_RADIO_NORMAL],
icon.x1, icon.y1);
// draw focus // draw focus
if (widget->hasFocus()) { if (widget->hasFocus()) {
@ -1316,52 +1375,44 @@ void SkinTheme::draw_combobox_entry(Entry* widget, JRect clip)
draw_entry_caret(widget, x, y); draw_entry_caret(widget, x, y);
} }
void SkinTheme::draw_combobox_button(ButtonBase* widget, JRect clip) void SkinTheme::paintComboBoxButton(PaintEvent& ev)
{ {
BITMAP* icon_bmp = m_part[PART_COMBOBOX_ARROW]; Button* widget = static_cast<Button*>(ev.getSource());
struct jrect icon; Graphics* g = ev.getGraphics();
int x1, y1, x2, y2; IButtonIcon* iconInterface = widget->getIconInterface();
int fg, bg, part_nw; int bg, part_nw;
/* with mouse */ if (widget->isSelected()) {
if (widget->isSelected() || bg = get_button_selected_face_color();
(widget->isEnabled() && widget->hasMouseOver())) { part_nw = PART_TOOLBUTTON_PUSHED_NW;
fg = get_button_hot_text_color(); }
// With mouse
else if (widget->isEnabled() && widget->hasMouseOver()) {
bg = get_button_hot_face_color(); bg = get_button_hot_face_color();
part_nw = PART_TOOLBUTTON_HOT_NW; part_nw = PART_TOOLBUTTON_HOT_NW;
} }
/* without mouse */ // Without mouse
else { else {
fg = get_button_normal_text_color();
bg = get_button_normal_face_color(); bg = get_button_normal_face_color();
part_nw = PART_TOOLBUTTON_LAST_NW; part_nw = PART_TOOLBUTTON_LAST_NW;
} }
/* widget position */ gfx::Rect rc = widget->getClientBounds();
x1 = widget->rc->x1;
y1 = widget->rc->y1;
x2 = widget->rc->x2-1;
y2 = widget->rc->y2-1;
// external background // external background
rectfill(ji_screen, x1, y1, x2, y2, BGCOLOR); g->fillRect(BGCOLOR, rc);
// draw borders // draw borders
draw_bounds_nw(ji_screen, x1, y1, x2, y2, part_nw, bg); draw_bounds_nw(g, rc, part_nw, bg);
// icon // Paint the icon
icon.x1 = (x1+x2)/2 - icon_bmp->w/2; if (iconInterface) {
icon.y1 = (y1+y2)/2 - icon_bmp->h/2; // Icon
icon.x2 = icon.x1 + icon_bmp->w; int x = rc.x + rc.w/2 - iconInterface->getWidth()/2;
icon.y2 = icon.y1 + icon_bmp->h; int y = rc.y + rc.h/2 - iconInterface->getHeight()/2;
if (widget->isSelected()) paintIcon(widget, ev.getGraphics(), iconInterface, x, y);
jrect_displace(&icon, }
get_button_selected_offset(),
get_button_selected_offset());
set_alpha_blender();
draw_trans_sprite(ji_screen, icon_bmp, icon.x1, icon.y1);
} }
void SkinTheme::draw_textbox(JWidget widget, JRect clip) void SkinTheme::draw_textbox(JWidget widget, JRect clip)
@ -1954,6 +2005,26 @@ void SkinTheme::less_bevel(int *bevel)
if (bevel[3] > 0) --bevel[3]; if (bevel[3] > 0) --bevel[3];
} }
void SkinTheme::paintIcon(Widget* widget, Graphics* g, IButtonIcon* iconInterface, int x, int y)
{
BITMAP* icon_bmp = NULL;
// enabled
if (widget->isEnabled()) {
if (widget->isSelected()) // selected
icon_bmp = iconInterface->getSelectedIcon();
else
icon_bmp = iconInterface->getNormalIcon();
}
// disabled
else {
icon_bmp = iconInterface->getDisabledIcon();
}
if (icon_bmp)
g->drawAlphaBitmap(icon_bmp, x, y);
}
/* controls the "X" button in a window to close it */ /* controls the "X" button in a window to close it */
bool SkinTheme::theme_frame_button_msg_proc(JWidget widget, JMessage msg) bool SkinTheme::theme_frame_button_msg_proc(JWidget widget, JMessage msg)
{ {

View File

@ -28,10 +28,11 @@
#include "gui/theme.h" #include "gui/theme.h"
#include "gui/system.h" #include "gui/system.h"
class Graphics;
#include "skin_parts.h" #include "skin_parts.h"
class Graphics;
class IButtonIcon;
// This is the GUI theme used by ASE (which use images from data/skins // This is the GUI theme used by ASE (which use images from data/skins
// directory). // directory).
class SkinTheme : public Theme class SkinTheme : public Theme
@ -78,7 +79,7 @@ public:
void draw_separator(JWidget widget, JRect clip); void draw_separator(JWidget widget, JRect clip);
void paintSlider(PaintEvent& ev); void paintSlider(PaintEvent& ev);
void draw_combobox_entry(Entry* widget, JRect clip); void draw_combobox_entry(Entry* widget, JRect clip);
void draw_combobox_button(ButtonBase* widget, JRect clip); void paintComboBoxButton(PaintEvent& ev);
void draw_textbox(JWidget widget, JRect clip); void draw_textbox(JWidget widget, JRect clip);
void draw_view(JWidget widget, JRect clip); void draw_view(JWidget widget, JRect clip);
void draw_view_scrollbar(JWidget widget, JRect clip); void draw_view_scrollbar(JWidget widget, JRect clip);
@ -174,6 +175,8 @@ private:
void draw_bevel_box(int x1, int y1, int x2, int y2, int c1, int c2, int *bevel); void draw_bevel_box(int x1, int y1, int x2, int y2, int c1, int c2, int *bevel);
void less_bevel(int *bevel); void less_bevel(int *bevel);
void paintIcon(Widget* widget, Graphics* g, IButtonIcon* iconInterface, int x, int y);
static bool theme_frame_button_msg_proc(JWidget widget, JMessage msg); static bool theme_frame_button_msg_proc(JWidget widget, JMessage msg);
static bool theme_combobox_button_msg_proc(JWidget widget, JMessage msg); static bool theme_combobox_button_msg_proc(JWidget widget, JMessage msg);

View File

@ -39,6 +39,8 @@
#include "raster/stock.h" #include "raster/stock.h"
#include "raster/undo.h" #include "raster/undo.h"
#include "settings/settings.h" #include "settings/settings.h"
#include "skin/skin_parts.h"
#include "skin/skin_theme.h"
#include "sprite_wrappers.h" #include "sprite_wrappers.h"
#include "ui_context.h" #include "ui_context.h"
#include "undoable.h" #include "undoable.h"
@ -780,49 +782,50 @@ static void draw_box(BITMAP *bmp,
static void draw_icon(BITMAP *bmp, int x, int y, int mode, fixed angle) static void draw_icon(BITMAP *bmp, int x, int y, int mode, fixed angle)
{ {
BITMAP *gfx; SkinTheme* theme = static_cast<SkinTheme*>(CurrentTheme::get());
BITMAP* gfx;
angle &= (255<<16); angle &= (255<<16);
/* 0 degree */ // 0 degree
if ((angle > ((256-16)<<16)) || (angle <= ((0+16)<<16))) { if ((angle > ((256-16)<<16)) || (angle <= ((0+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_3: GFX_ROTATE_3); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_3: PART_ROTATE_ARROW_3);
draw_sprite_h_flip (bmp, gfx, x, y-gfx->h/2); draw_sprite_ex(bmp, gfx, x, y-gfx->h/2, DRAW_SPRITE_TRANS, DRAW_SPRITE_H_FLIP);
} }
/* 45 degree */ // 45 degree
else if ((angle >= ((32-16)<<16)) && (angle <= ((32+16)<<16))) { else if ((angle >= ((32-16)<<16)) && (angle <= ((32+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_1: GFX_ROTATE_1); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_1: PART_ROTATE_ARROW_1);
draw_sprite_h_flip (bmp, gfx, x, y-gfx->h); draw_sprite_ex(bmp, gfx, x, y-gfx->h, DRAW_SPRITE_TRANS, DRAW_SPRITE_H_FLIP);
} }
/* 90 degree */ // 90 degree
else if ((angle >= ((64-16)<<16)) && (angle <= ((64+16)<<16))) { else if ((angle >= ((64-16)<<16)) && (angle <= ((64+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_2: GFX_ROTATE_2); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_2: PART_ROTATE_ARROW_2);
draw_sprite (bmp, gfx, x-gfx->w/2, y-gfx->h); draw_sprite_ex(bmp, gfx, x-gfx->w/2, y-gfx->h, DRAW_SPRITE_TRANS, DRAW_SPRITE_NO_FLIP);
} }
/* 135 degree */ // 135 degree
else if ((angle >= ((96-16)<<16)) && (angle <= ((96+16)<<16))) { else if ((angle >= ((96-16)<<16)) && (angle <= ((96+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_1: GFX_ROTATE_1); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_1: PART_ROTATE_ARROW_1);
draw_sprite (bmp, gfx, x-gfx->w, y-gfx->h); draw_sprite_ex(bmp, gfx, x-gfx->w, y-gfx->h, DRAW_SPRITE_TRANS, DRAW_SPRITE_NO_FLIP);
} }
/* 180 degree */ // 180 degree
else if ((angle >= ((128-16)<<16)) && (angle <= ((128+16)<<16))) { else if ((angle >= ((128-16)<<16)) && (angle <= ((128+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_3: GFX_ROTATE_3); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_3: PART_ROTATE_ARROW_3);
draw_sprite (bmp, gfx, x-gfx->w, y-gfx->h/2); draw_sprite_ex(bmp, gfx, x-gfx->w, y-gfx->h/2, DRAW_SPRITE_TRANS, DRAW_SPRITE_NO_FLIP);
} }
/* 225 degree */ // 225 degree
else if ((angle >= ((160-16)<<16)) && (angle <= ((160+16)<<16))) { else if ((angle >= ((160-16)<<16)) && (angle <= ((160+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_1: GFX_ROTATE_1); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_1: PART_ROTATE_ARROW_1);
draw_sprite_v_flip (bmp, gfx, x-gfx->w, y); draw_sprite_ex(bmp, gfx, x-gfx->w, y, DRAW_SPRITE_TRANS, DRAW_SPRITE_V_FLIP);
} }
/* 270 degree */ // 270 degree
else if ((angle >= ((192-16)<<16)) && (angle <= ((192+16)<<16))) { else if ((angle >= ((192-16)<<16)) && (angle <= ((192+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_2: GFX_ROTATE_2); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_2: PART_ROTATE_ARROW_2);
draw_sprite_v_flip (bmp, gfx, x-gfx->w/2, y); draw_sprite_ex(bmp, gfx, x-gfx->w/2, y, DRAW_SPRITE_TRANS, DRAW_SPRITE_V_FLIP);
} }
/* 315 degree */ // 315 degree
else if ((angle >= ((224-16)<<16)) && (angle <= ((224+16)<<16))) { else if ((angle >= ((224-16)<<16)) && (angle <= ((224+16)<<16))) {
gfx = get_gfx (mode == SCALE_MODE ? GFX_SCALE_1: GFX_ROTATE_1); gfx = theme->get_part(mode == SCALE_MODE ? PART_SCALE_ARROW_1: PART_ROTATE_ARROW_1);
draw_sprite_vh_flip (bmp, gfx, x, y); draw_sprite_ex(bmp, gfx, x, y, DRAW_SPRITE_TRANS, DRAW_SPRITE_VH_FLIP);
} }
} }

View File

@ -72,7 +72,7 @@ JWidget group_button_new(int w, int h, int first_selected, ...)
radio->setName(buf); radio->setName(buf);
if (icon >= 0) if (icon >= 0)
add_gfxicon_to_button(radio, icon, JI_CENTER | JI_MIDDLE); set_gfxicon_to_button(radio, icon, icon+1, icon, JI_CENTER | JI_MIDDLE);
radio->Click.connect(Bind<bool>(&radio_change_hook, vbox)); radio->Click.connect(Bind<bool>(&radio_change_hook, vbox));

View File

@ -86,7 +86,7 @@ StatusBar::StatusBar()
#define ICON_NEW(name, icon, action) \ #define ICON_NEW(name, icon, action) \
{ \ { \
BUTTON_NEW((name), NULL, (action)); \ BUTTON_NEW((name), NULL, (action)); \
add_gfxicon_to_button((name), (icon), JI_CENTER | JI_MIDDLE); \ set_gfxicon_to_button((name), icon, icon##_SELECTED, icon##_DISABLED, JI_CENTER | JI_MIDDLE); \
} }
jwidget_focusrest(this, true); jwidget_focusrest(this, true);
@ -110,11 +110,11 @@ StatusBar::StatusBar()
setup_mini_look(m_slider); setup_mini_look(m_slider);
ICON_NEW(m_b_first, GFX_ANI_FIRST, ACTION_FIRST); ICON_NEW(m_b_first, PART_ANI_FIRST, ACTION_FIRST);
ICON_NEW(m_b_prev, GFX_ANI_PREV, ACTION_PREV); ICON_NEW(m_b_prev, PART_ANI_PREVIOUS, ACTION_PREV);
ICON_NEW(m_b_play, GFX_ANI_PLAY, ACTION_PLAY); ICON_NEW(m_b_play, PART_ANI_PLAY, ACTION_PLAY);
ICON_NEW(m_b_next, GFX_ANI_NEXT, ACTION_NEXT); ICON_NEW(m_b_next, PART_ANI_NEXT, ACTION_NEXT);
ICON_NEW(m_b_last, GFX_ANI_LAST, ACTION_LAST); ICON_NEW(m_b_last, PART_ANI_LAST, ACTION_LAST);
m_slider->Change.connect(Bind<void>(&slider_change_hook, m_slider)); m_slider->Change.connect(Bind<void>(&slider_change_hook, m_slider));
jwidget_set_min_size(m_slider, JI_SCREEN_W/5, 0); jwidget_set_min_size(m_slider, JI_SCREEN_W/5, 0);

View File

@ -69,8 +69,15 @@ Tabs::Tabs(ITabsHandler* handler)
jwidget_focusrest(m_button_left, false); jwidget_focusrest(m_button_left, false);
jwidget_focusrest(m_button_right, false); jwidget_focusrest(m_button_right, false);
add_gfxicon_to_button(m_button_left, GFX_ARROW_LEFT, JI_CENTER | JI_MIDDLE); set_gfxicon_to_button(m_button_left,
add_gfxicon_to_button(m_button_right, GFX_ARROW_RIGHT, JI_CENTER | JI_MIDDLE); PART_COMBOBOX_ARROW_LEFT,
PART_COMBOBOX_ARROW_LEFT_SELECTED,
PART_COMBOBOX_ARROW_LEFT_DISABLED, JI_CENTER | JI_MIDDLE);
set_gfxicon_to_button(m_button_right,
PART_COMBOBOX_ARROW_RIGHT,
PART_COMBOBOX_ARROW_RIGHT_SELECTED,
PART_COMBOBOX_ARROW_RIGHT_DISABLED, JI_CENTER | JI_MIDDLE);
jwidget_add_hook(m_button_left, tabs_type(), tabs_button_msg_proc, (void *)-1); jwidget_add_hook(m_button_left, tabs_type(), tabs_button_msg_proc, (void *)-1);
jwidget_add_hook(m_button_right, tabs_type(), tabs_button_msg_proc, (void *)+1); jwidget_add_hook(m_button_right, tabs_type(), tabs_button_msg_proc, (void *)+1);

View File

@ -32,11 +32,13 @@
#include "modules/gfx.h" #include "modules/gfx.h"
#include "modules/gui.h" #include "modules/gui.h"
#include "raster/image.h" #include "raster/image.h"
#include "skin/skin_parts.h"
#include "widgets/target.h" #include "widgets/target.h"
static bool channel_change_hook(ButtonBase* widget, Widget* data); static bool channel_change_hook(ButtonBase* widget, Widget* data);
static bool images_change_hook(ButtonBase* widget, Widget* data); static bool images_change_hook(ButtonBase* widget, Widget* data);
static int get_target_image_gfx(int target); static int get_target_normal_icon(int target);
static int get_target_selected_icon(int target);
/** /**
* Creates a new button to handle "targets" to apply some effect in * Creates a new button to handle "targets" to apply some effect in
@ -108,7 +110,9 @@ JWidget target_button_new(int imgtype, bool with_channels)
with_channels ? 0: 2, with_channels ? 0: 2,
with_channels ? 0: 2, 2, 2); with_channels ? 0: 2, 2, 2);
setup_mini_look(images); setup_mini_look(images);
add_gfxicon_to_button(images, get_target_image_gfx(default_targets), set_gfxicon_to_button(images,
get_target_normal_icon(default_targets),
get_target_selected_icon(default_targets), -1,
JI_CENTER | JI_MIDDLE); JI_CENTER | JI_MIDDLE);
/* make hierarchy */ /* make hierarchy */
@ -199,23 +203,40 @@ static bool images_change_hook(ButtonBase* widget, Widget* target_button)
target |= TARGET_ALL_FRAMES; target |= TARGET_ALL_FRAMES;
} }
set_gfxicon_in_button(widget, get_target_image_gfx(target)); set_gfxicon_to_button(widget,
get_target_normal_icon(target),
get_target_selected_icon(target), -1,
JI_CENTER | JI_MIDDLE);
target_button->user_data[0] = (void *)target; target_button->user_data[0] = (void *)target;
jwidget_emit_signal(target_button, SIGNAL_TARGET_BUTTON_CHANGE); jwidget_emit_signal(target_button, SIGNAL_TARGET_BUTTON_CHANGE);
return true; return true;
} }
static int get_target_image_gfx(int target) static int get_target_normal_icon(int target)
{ {
if (target & TARGET_ALL_FRAMES) { if (target & TARGET_ALL_FRAMES) {
return target & TARGET_ALL_LAYERS ? return (target & TARGET_ALL_LAYERS) ?
GFX_TARGET_FRAMES_LAYERS: PART_TARGET_FRAMES_LAYERS:
GFX_TARGET_FRAMES; PART_TARGET_FRAMES;
} }
else { else {
return target & TARGET_ALL_LAYERS ? return (target & TARGET_ALL_LAYERS) ?
GFX_TARGET_LAYERS: PART_TARGET_LAYERS:
GFX_TARGET_ONE; PART_TARGET_ONE;
}
}
static int get_target_selected_icon(int target)
{
if (target & TARGET_ALL_FRAMES) {
return (target & TARGET_ALL_LAYERS) ?
PART_TARGET_FRAMES_LAYERS_SELECTED:
PART_TARGET_FRAMES_SELECTED;
}
else {
return (target & TARGET_ALL_LAYERS) ?
PART_TARGET_LAYERS_SELECTED:
PART_TARGET_ONE_SELECTED;
} }
} }