diff --git a/src/Makefile.am b/src/Makefile.am index 70a635d..c5ad333 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ bin_PROGRAMS = gmenu2x -gmenu2x_SOURCES = font.cpp button.cpp cpu.cpp dirdialog.cpp filedialog.cpp \ +gmenu2x_SOURCES = font.cpp cpu.cpp dirdialog.cpp filedialog.cpp \ filelister.cpp gmenu2x.cpp iconbutton.cpp imagedialog.cpp inputdialog.cpp \ inputmanager.cpp linkapp.cpp link.cpp \ menu.cpp menusettingbool.cpp menusetting.cpp menusettingdir.cpp \ @@ -15,7 +15,7 @@ gmenu2x_SOURCES = font.cpp button.cpp cpu.cpp dirdialog.cpp filedialog.cpp \ imageio.cpp powersaver.cpp monitor.cpp mediamonitor.cpp clock.cpp \ helppopup.cpp contextmenu.cpp background.cpp battery.cpp -noinst_HEADERS = font.h button.h cpu.h dirdialog.h \ +noinst_HEADERS = font.h cpu.h dirdialog.h \ filedialog.h filelister.h gmenu2x.h gp2x.h iconbutton.h imagedialog.h \ inputdialog.h inputmanager.h linkapp.h link.h \ menu.h menusettingbool.h menusettingdir.h \ diff --git a/src/button.cpp b/src/button.cpp deleted file mode 100644 index e4eb980..0000000 --- a/src/button.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "button.h" -#include "delegate.h" -#include "gmenu2x.h" - -using namespace std; - -Button::Button(Touchscreen &ts_, bool doubleClick_) - : action(BIND(&Button::voidAction)) - , rect((SDL_Rect) { 0, 0, 0, 0 }) - , ts(ts_) - , doubleClick(doubleClick_) - , lastTick(0) -{ -} - -bool Button::isPressed() { - return ts.pressed() && ts.inRect(rect); -} - -bool Button::isReleased() { - return ts.released() && ts.inRect(rect); -} - -bool Button::handleTS() { - if (isReleased()) { - if (doubleClick) { - int tickNow = SDL_GetTicks(); - if (tickNow - lastTick < 400) { - ts.setHandled(); - action(); - } - lastTick = tickNow; - } else { - ts.setHandled(); - action(); - } - return true; - } - return false; -} - -SDL_Rect Button::getRect() { - return rect; -} - -void Button::setSize(int w, int h) { - rect.w = w; - rect.h = h; -} - -void Button::setPosition(int x, int y) { - rect.x = x; - rect.y = y; -} diff --git a/src/button.h b/src/button.h deleted file mode 100644 index f3901b0..0000000 --- a/src/button.h +++ /dev/null @@ -1,56 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2006 by Massimiliano Torromeo * - * massimiliano.torromeo@gmail.com * - * * - * 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_H -#define BUTTON_H - -#include "delegate.h" - -#include - -class Touchscreen; - -class Button { -public: - SDL_Rect getRect(); - virtual void setPosition(int x, int y); - - bool isPressed(); - bool handleTS(); - -protected: - Button(Touchscreen &ts, bool doubleClick = false); - virtual ~Button() {}; - - void setSize(int w, int h); - - function_t action; - SDL_Rect rect; - -private: - bool isReleased(); - void voidAction() {}; - - Touchscreen &ts; - bool doubleClick; - int lastTick; -}; - -#endif // BUTTON_H diff --git a/src/iconbutton.cpp b/src/iconbutton.cpp index e779966..e6ceac4 100644 --- a/src/iconbutton.cpp +++ b/src/iconbutton.cpp @@ -6,48 +6,44 @@ using namespace std; + IconButton::IconButton( - GMenu2X *gmenu2x_, Touchscreen &ts_, + GMenu2X *gmenu2x, Touchscreen &ts, const string &icon, const string &label) - : Button(ts_) - , gmenu2x(gmenu2x_) + : gmenu2x(gmenu2x) + , ts(ts) + , icon(icon) + , label(label) + , action([] {}) + , rect({ 0, 0, 0, 0 }) { - this->icon = icon; - this->label = label; iconSurface = gmenu2x->sc[icon]; - recalcSize(); + recalcRects(); +} + +void IconButton::setAction(function_t action) { + this->action = action; } void IconButton::setPosition(int x, int y) { if (rect.x != x || rect.y != y) { - Button::setPosition(x,y); - recalcSize(); + rect.x = x; + rect.y = y; + recalcRects(); } } -void IconButton::paint() { - if (iconSurface) { - iconSurface->blit(gmenu2x->s, iconRect); - } - if (label != "") { - gmenu2x->s->write(gmenu2x->font, label, labelRect.x, labelRect.y, - Font::HAlignLeft, Font::VAlignMiddle); - } -} - -void IconButton::recalcSize() { +void IconButton::recalcRects() { Uint16 h = 0, w = 0; if (iconSurface) { w += iconSurface->width(); h += iconSurface->height(); - iconRect = (SDL_Rect) { rect.x, rect.y, w, h }; - } else { - iconRect = (SDL_Rect) { 0, 0, 0, 0 }; } + iconRect = { rect.x, rect.y, w, h }; - if (label != "") { - uint margin = iconSurface ? 2 : 0; - labelRect = (SDL_Rect) { + if (!label.empty()) { + Uint16 margin = iconSurface ? 2 : 0; + labelRect = { static_cast(iconRect.x + iconRect.w + margin), static_cast(rect.y + h / 2), static_cast(gmenu2x->font->getTextWidth(label)), @@ -56,9 +52,25 @@ void IconButton::recalcSize() { w += margin + labelRect.w; } - setSize(w, h); + rect.w = w; + rect.h = h; } -void IconButton::setAction(function_t action) { - this->action = action; +bool IconButton::handleTS() { + if (ts.released() && ts.inRect(rect)) { + ts.setHandled(); + action(); + return true; + } + return false; +} + +void IconButton::paint() { + if (iconSurface) { + iconSurface->blit(gmenu2x->s, iconRect); + } + if (!label.empty()) { + gmenu2x->s->write(gmenu2x->font, label, labelRect.x, labelRect.y, + Font::HAlignLeft, Font::VAlignMiddle); + } } diff --git a/src/iconbutton.h b/src/iconbutton.h index 86d1874..87a017b 100644 --- a/src/iconbutton.h +++ b/src/iconbutton.h @@ -1,36 +1,39 @@ #ifndef ICONBUTTON_H #define ICONBUTTON_H -#include "button.h" +#include "delegate.h" +#include #include class GMenu2X; class Surface; +class Touchscreen; -class IconButton : private Button { + +class IconButton { public: IconButton(GMenu2X *gmenu2x, Touchscreen &ts, const std::string &icon, const std::string &label = ""); - virtual ~IconButton() {}; - - virtual void paint(); - - virtual void setPosition(int x, int y); void setAction(function_t action); - // Expose some Button functionality: - SDL_Rect getRect() { return Button::getRect(); } - bool handleTS() { return Button::handleTS(); } + SDL_Rect getRect() { return rect; } + void setPosition(int x, int y); + + bool handleTS(); + + void paint(); private: - void recalcSize(); + void recalcRects(); GMenu2X *gmenu2x; + Touchscreen &ts; std::string icon, label; - SDL_Rect iconRect, labelRect; + function_t action; + SDL_Rect rect, iconRect, labelRect; Surface *iconSurface; }; diff --git a/src/link.cpp b/src/link.cpp index ebe24ca..b3af34f 100644 --- a/src/link.cpp +++ b/src/link.cpp @@ -31,10 +31,13 @@ using namespace std; -Link::Link(GMenu2X *gmenu2x_, Touchscreen &ts, function_t action_) - : Button(ts, true) - , action(action_) - , gmenu2x(gmenu2x_) + +Link::Link(GMenu2X *gmenu2x, Touchscreen &ts, function_t action) + : gmenu2x(gmenu2x) + , ts(ts) + , action(action) + , rect((SDL_Rect) { 0, 0, 0, 0 }) + , lastTick(0) { edited = false; iconPath = gmenu2x->sc.getSkinFilePath("icons/generic.png"); @@ -44,6 +47,23 @@ Link::Link(GMenu2X *gmenu2x_, Touchscreen &ts, function_t action_) updateSurfaces(); } +bool Link::isPressed() { + return ts.pressed() && ts.inRect(rect); +} + +bool Link::handleTS() { + if (ts.released() && ts.inRect(rect)) { + int tickNow = SDL_GetTicks(); + if (tickNow - lastTick < 400) { + ts.setHandled(); + action(); + } + lastTick = tickNow; + return true; + } + return false; +} + void Link::paint() { if (iconSurface) { iconSurface->blit(gmenu2x->s, iconX, rect.y+padding, 32,32); @@ -123,12 +143,14 @@ void Link::setIconPath(const string &icon) { } void Link::setSize(int w, int h) { - Button::setSize(w,h); + rect.w = w; + rect.h = h; recalcCoordinates(); } void Link::setPosition(int x, int y) { - Button::setPosition(x,y); + rect.x = x; + rect.y = y; recalcCoordinates(); } diff --git a/src/link.h b/src/link.h index 6010673..47ff8a5 100644 --- a/src/link.h +++ b/src/link.h @@ -21,13 +21,14 @@ #ifndef LINK_H #define LINK_H -#include "button.h" #include "delegate.h" +#include #include class GMenu2X; class Surface; +class Touchscreen; /** @@ -35,29 +36,14 @@ Base class that represents a link on screen. @author Massimiliano Torromeo */ -class Link : private Button { -private: - void recalcCoordinates(); - - function_t action; - uint iconX, padding; - -protected: - GMenu2X *gmenu2x; - bool edited; - std::string title, description, icon, iconPath; - - Surface *iconSurface; - Surface *icon_hover; - - virtual const std::string &searchIcon(); - void setIconPath(const std::string &icon); - void updateSurfaces(); - +class Link { public: Link(GMenu2X *gmenu2x, Touchscreen &ts, function_t action); virtual ~Link() {}; + bool isPressed(); + bool handleTS(); + virtual void paint(); void paintHover(); @@ -76,10 +62,27 @@ public: void run(); - // Expose some Button functionality: - //SDL_Rect getRect() { return Button::getRect(); } - bool isPressed() { return Button::isPressed(); } - bool handleTS() { return Button::handleTS(); } +protected: + GMenu2X *gmenu2x; + bool edited; + std::string title, description, icon, iconPath; + + Surface *iconSurface; + Surface *icon_hover; + + virtual const std::string &searchIcon(); + void setIconPath(const std::string &icon); + void updateSurfaces(); + +private: + void recalcCoordinates(); + + Touchscreen &ts; + function_t action; + + SDL_Rect rect; + uint iconX, padding; + int lastTick; }; #endif