From 544a63cc28de7102cdb6ddd26e3066d613add178 Mon Sep 17 00:00:00 2001 From: David Capello Date: Sun, 20 Jan 2013 21:58:16 -0300 Subject: [PATCH] Add "play" button in MiniEditorWindow (UI only) At this moment the button isn't functional because the current frame position is stored in the sprite (instead of the Editor). In this case, when the "play" button is pressed, the mini-editor should show other frames instead of the current one (should play the whole animation). --- data/skins/default/sheet.png | Bin 9980 -> 10154 bytes data/skins/default/skin.xml | 12 +++-- src/skin/skin_button.h | 74 ++++++++++++++++++++++++++ src/skin/skin_parts.h | 10 +++- src/skin/skin_theme.cpp | 18 +++++-- src/skin/skin_theme.h | 5 +- src/ui/theme.h | 2 +- src/ui/widget.cpp | 12 +++++ src/ui/widget.h | 3 ++ src/ui/window.cpp | 4 +- src/widgets/mini_editor.cpp | 98 +++++++++++++++++++++++++++++++++++ src/widgets/mini_editor.h | 8 +++ 12 files changed, 234 insertions(+), 12 deletions(-) create mode 100644 src/skin/skin_button.h diff --git a/data/skins/default/sheet.png b/data/skins/default/sheet.png index f56045fe016e52590651265943fc5d717d811658..46c72d3fec5b3058aa4c3597da633aa150cd2ca3 100644 GIT binary patch delta 9545 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 delta 9325 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 R - - - + + + @@ -151,6 +151,12 @@ + + + + + + diff --git a/src/skin/skin_button.h b/src/skin/skin_button.h new file mode 100644 index 000000000..fc48a340c --- /dev/null +++ b/src/skin/skin_button.h @@ -0,0 +1,74 @@ +/* ASEPRITE + * Copyright (C) 2001-2012 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 SKIN_BUTTON_H_INCLUDED +#define SKIN_BUTTON_H_INCLUDED + +#include "skin/skin_parts.h" +#include "skin/skin_theme.h" +#include "ui/button.h" +#include "ui/graphics.h" +#include "ui/paint_event.h" + +template +class SkinButton : public Base +{ +public: + SkinButton(SkinPart partNormal, + SkinPart partHot, + SkinPart partSelected) + : Base("") + , m_partNormal(partNormal) + , m_partHot(partHot) + , m_partSelected(partSelected) + { + } + + void setParts(SkinPart partNormal, + SkinPart partHot, + SkinPart partSelected) { + m_partNormal = partNormal; + m_partHot = partHot; + m_partSelected = partSelected; + invalidate(); + } + +protected: + void onPaint(ui::PaintEvent& ev) OVERRIDE { + gfx::Rect bounds(getClientBounds()); + Graphics* g = ev.getGraphics(); + SkinTheme* theme = static_cast(getTheme()); + SkinPart part; + + if (isSelected()) + part = m_partSelected; + else if (hasMouseOver()) + part = m_partHot; + else + part = m_partNormal; + + g->drawAlphaBitmap(theme->get_part(part), bounds.x, bounds.y); + } + +private: + SkinPart m_partNormal; + SkinPart m_partHot; + SkinPart m_partSelected; +}; + +#endif diff --git a/src/skin/skin_parts.h b/src/skin/skin_parts.h index 605d8bb1b..a1687123b 100644 --- a/src/skin/skin_parts.h +++ b/src/skin/skin_parts.h @@ -20,7 +20,7 @@ #define SKIN_PARTS_H_INCLUDED // Available parts in the skin sheet -enum { +enum SkinPart { PART_RADIO_NORMAL, PART_RADIO_SELECTED, @@ -160,6 +160,14 @@ enum { PART_WINDOW_CLOSE_BUTTON_HOT, PART_WINDOW_CLOSE_BUTTON_SELECTED, + PART_WINDOW_PLAY_BUTTON_NORMAL, + PART_WINDOW_PLAY_BUTTON_HOT, + PART_WINDOW_PLAY_BUTTON_SELECTED, + + PART_WINDOW_STOP_BUTTON_NORMAL, + PART_WINDOW_STOP_BUTTON_HOT, + PART_WINDOW_STOP_BUTTON_SELECTED, + PART_SLIDER_FULL_NW, PART_SLIDER_FULL_N, PART_SLIDER_FULL_NE, diff --git a/src/skin/skin_theme.cpp b/src/skin/skin_theme.cpp index b91d0032c..7342af1d9 100644 --- a/src/skin/skin_theme.cpp +++ b/src/skin/skin_theme.cpp @@ -165,6 +165,12 @@ SkinTheme::SkinTheme() sheet_mapping["window_close_button_normal"] = PART_WINDOW_CLOSE_BUTTON_NORMAL; sheet_mapping["window_close_button_hot"] = PART_WINDOW_CLOSE_BUTTON_HOT; sheet_mapping["window_close_button_selected"] = PART_WINDOW_CLOSE_BUTTON_SELECTED; + sheet_mapping["window_play_button_normal"] = PART_WINDOW_PLAY_BUTTON_NORMAL; + sheet_mapping["window_play_button_hot"] = PART_WINDOW_PLAY_BUTTON_HOT; + sheet_mapping["window_play_button_selected"] = PART_WINDOW_PLAY_BUTTON_SELECTED; + sheet_mapping["window_stop_button_normal"] = PART_WINDOW_STOP_BUTTON_NORMAL; + sheet_mapping["window_stop_button_hot"] = PART_WINDOW_STOP_BUTTON_HOT; + sheet_mapping["window_stop_button_selected"] = PART_WINDOW_STOP_BUTTON_SELECTED; sheet_mapping["slider_full"] = PART_SLIDER_FULL_NW; sheet_mapping["slider_empty"] = PART_SLIDER_EMPTY_NW; sheet_mapping["slider_full_focused"] = PART_SLIDER_FULL_FOCUSED_NW; @@ -394,6 +400,12 @@ void SkinTheme::reload_fonts() m_minifont = loadFont("UserMiniFont", "skins/" + m_selected_skin + "/minifont.png"); } +gfx::Size SkinTheme::get_part_size(int part_i) const +{ + BITMAP* bmp = get_part(part_i); + return gfx::Size(bmp->w, bmp->h); +} + void SkinTheme::onRegenerate() { scrollbar_size = 12 * jguiscale(); @@ -787,7 +799,7 @@ void SkinTheme::getWindowMask(Widget* widget, Region& region) region = widget->getBounds(); } -void SkinTheme::mapDecorativeWidget(Widget* widget) +void SkinTheme::setDecorativeWidgetBounds(Widget* widget) { if (widget->getId() == kThemeCloseButtonId) { Widget* window = widget->getParent(); @@ -797,8 +809,8 @@ void SkinTheme::mapDecorativeWidget(Widget* widget) rect->y2 = m_part[PART_WINDOW_CLOSE_BUTTON_NORMAL]->h; jrect_displace(rect, - window->rc->x2 - 3 - jrect_w(rect), - window->rc->y1 + 3); + window->rc->x2 - 3*jguiscale() - jrect_w(rect), + window->rc->y1 + 3*jguiscale()); jwidget_set_rect(widget, rect); jrect_free(rect); diff --git a/src/skin/skin_theme.h b/src/skin/skin_theme.h index 7e0af12a4..0343e2435 100644 --- a/src/skin/skin_theme.h +++ b/src/skin/skin_theme.h @@ -19,7 +19,7 @@ #ifndef SKIN_THEME_H_INCLUDED #define SKIN_THEME_H_INCLUDED -#include "gfx/rect.h" +#include "gfx/fwd.h" #include "skin/skin_parts.h" #include "ui/color.h" #include "ui/rect.h" @@ -122,7 +122,7 @@ public: ui::Cursor* getCursor(ui::CursorType type); void initWidget(ui::Widget* widget); void getWindowMask(ui::Widget* widget, gfx::Region& region); - void mapDecorativeWidget(ui::Widget* widget); + void setDecorativeWidgetBounds(ui::Widget* widget); void paintDesktop(ui::PaintEvent& ev); void paintBox(ui::PaintEvent& ev); @@ -155,6 +155,7 @@ public: BITMAP* get_part(int part_i) const { return m_part[part_i]; } BITMAP* get_toolicon(const char* tool_id) const; + gfx::Size get_part_size(int part_i) const; // helper functions to draw bounds/hlines with sheet parts void draw_bounds_array(BITMAP* bmp, int x1, int y1, int x2, int y2, int parts[8]); diff --git a/src/ui/theme.h b/src/ui/theme.h index 42fe682e0..56a49eaee 100644 --- a/src/ui/theme.h +++ b/src/ui/theme.h @@ -43,7 +43,7 @@ namespace ui { virtual Cursor* getCursor(CursorType type) = 0; virtual void initWidget(Widget* widget) = 0; virtual void getWindowMask(ui::Widget* widget, gfx::Region& region) = 0; - virtual void mapDecorativeWidget(ui::Widget* widget) = 0; + virtual void setDecorativeWidgetBounds(ui::Widget* widget) = 0; virtual void paintDesktop(PaintEvent& ev) = 0; virtual void paintBox(PaintEvent& ev) = 0; diff --git a/src/ui/widget.cpp b/src/ui/widget.cpp index 4d35aa794..789e8e663 100644 --- a/src/ui/widget.cpp +++ b/src/ui/widget.cpp @@ -557,6 +557,11 @@ void Widget::saveLayout() (*it)->saveLayout(); } +void Widget::setDecorativeWidgetBounds() +{ + onSetDecorativeWidgetBounds(); +} + /**********************************************************************/ /* position and geometry */ @@ -1364,6 +1369,13 @@ void Widget::onInitTheme(InitThemeEvent& ev) } } +void Widget::onSetDecorativeWidgetBounds() +{ + if (m_theme) { + m_theme->setDecorativeWidgetBounds(this); + } +} + void Widget::onEnable() { // Do nothing diff --git a/src/ui/widget.h b/src/ui/widget.h index 66108bc77..b3558a443 100644 --- a/src/ui/widget.h +++ b/src/ui/widget.h @@ -235,6 +235,8 @@ namespace ui { void loadLayout(); void saveLayout(); + void setDecorativeWidgetBounds(); + // =============================================================== // POSITION & GEOMETRY // =============================================================== @@ -327,6 +329,7 @@ namespace ui { virtual void onPaint(PaintEvent& ev); virtual void onBroadcastMouseMessage(WidgetsList& targets); virtual void onInitTheme(InitThemeEvent& ev); + virtual void onSetDecorativeWidgetBounds(); virtual void onEnable(); virtual void onDisable(); virtual void onSelect(); diff --git a/src/ui/window.cpp b/src/ui/window.cpp index 74671935d..09484ed23 100644 --- a/src/ui/window.cpp +++ b/src/ui/window.cpp @@ -517,12 +517,12 @@ void Window::windowSetPosition(JRect rect) jrect_copy(this->rc, rect); Rect cpos = getChildrenBounds(); - /* set all the children to the same "child_pos" */ + // Set all the children to the same "cpos" UI_FOREACH_WIDGET(getChildren(), it) { Widget* child = *it; if (child->isDecorative()) - child->getTheme()->mapDecorativeWidget(child); + child->setDecorativeWidgetBounds(); else child->setBounds(cpos); } diff --git a/src/widgets/mini_editor.cpp b/src/widgets/mini_editor.cpp index 477e79185..26a5f5f1b 100644 --- a/src/widgets/mini_editor.cpp +++ b/src/widgets/mini_editor.cpp @@ -20,14 +20,17 @@ #include "widgets/mini_editor.h" +#include "base/bind.h" #include "gfx/rect.h" #include "ini_file.h" #include "modules/editors.h" #include "modules/gui.h" +#include "skin/skin_button.h" #include "skin/skin_theme.h" #include "ui/base.h" #include "ui/button.h" #include "ui/close_event.h" +#include "ui/message.h" #include "ui/rect.h" #include "ui/system.h" #include "widgets/editor/editor.h" @@ -38,9 +41,78 @@ using namespace ui; namespace widgets { +class MiniPlayButton : public SkinButton