From 560e8bdd6a1cc519d29306cec65f58f70eff0375 Mon Sep 17 00:00:00 2001 From: fluxgen Date: Fri, 13 Dec 2002 20:24:33 +0000 Subject: button --- src/FbTk/Button.cc | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/FbTk/Button.hh | 98 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 213 insertions(+) create mode 100644 src/FbTk/Button.cc create mode 100644 src/FbTk/Button.hh diff --git a/src/FbTk/Button.cc b/src/FbTk/Button.cc new file mode 100644 index 0000000..9ea99ed --- /dev/null +++ b/src/FbTk/Button.cc @@ -0,0 +1,115 @@ +// Button.cc for FbTk - fluxbox toolkit +// Copyright (c) 2002 Henrik Kinnunen (fluxgen at users.sourceforge.net) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// $Id: Button.cc,v 1.1 2002/12/13 20:24:33 fluxgen Exp $ + +#include "Button.hh" + +#include "Command.hh" +#include "EventManager.hh" + +namespace FbTk { + +Button::Button(int screen_num, int x, int y, + unsigned int width, unsigned int height): + m_win(screen_num, x, y, width, height, + ExposureMask | ButtonPressMask | ButtonReleaseMask), + m_foreground_pm(0), + m_pressed_pm(0), + m_gc(0) { + // add this to eventmanager + FbTk::EventManager::instance()->add(*this, m_win); +} + +Button::Button(FbWindow &parent, int x, int y, + size_t width, size_t height): + m_win(parent, x, y, width, height, + ExposureMask | ButtonPressMask | ButtonReleaseMask), + m_foreground_pm(0), + m_pressed_pm(0), + m_gc(0) { + // add this to eventmanager + FbTk::EventManager::instance()->add(*this, m_win); +} + +Button::~Button() { + FbTk::EventManager::instance()->remove(m_win); +} + +void Button::move(int x, int y) { + m_win.move(x, y); +} + +void Button::resize(unsigned int w, unsigned int h) { + m_win.resize(w, h); +} + +void Button::moveResize(int x, int y, unsigned int width, unsigned int height) { + m_win.moveResize(x, y, width, height); +} + +void Button::setPixmap(Pixmap pm) { + m_foreground_pm = pm; +} + +void Button::setPressedPixmap(Pixmap pm) { + m_pressed_pm = pm; +} + +void Button::setBackgroundColor(const Color &color) { + m_win.setBackgroundColor(color); +} + +void Button::setBackgroundPixmap(Pixmap pm) { + m_win.setBackgroundPixmap(pm); + m_foreground_pm = pm; +} + +void Button::show() { + m_win.show(); +} + +void Button::hide() { + m_win.hide(); +} + +void Button::buttonPressEvent(XButtonEvent &event) { + m_win.setBackgroundPixmap(m_pressed_pm); + m_win.clear(); + m_pressed = true; +} + +void Button::buttonReleaseEvent(XButtonEvent &event) { + // set normal pixmap + m_win.setBackgroundPixmap(m_foreground_pm); + m_win.clear(); + + if (*m_onclick != 0) // check on click action + m_onclick->execute(); // do on click action + + m_pressed = false; +} + +void Button::exposeEvent(XExposeEvent &event) { + m_win.clear(); +} + +}; // end namespace FbTk diff --git a/src/FbTk/Button.hh b/src/FbTk/Button.hh new file mode 100644 index 0000000..5d0842d --- /dev/null +++ b/src/FbTk/Button.hh @@ -0,0 +1,98 @@ +// Button.hh for FbTk - Fluxbox Toolkit +// Copyright (c) 2002 Henrik Kinnunen (fluxgen at users.sourceforge.net) +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +// $Id: Button.hh,v 1.1 2002/12/13 20:24:33 fluxgen Exp $ + +#ifndef FBTK_BUTTON_HH +#define FBTK_BUTTON_HH + +#include "EventHandler.hh" +#include "NotCopyable.hh" +#include "RefCount.hh" +#include "FbWindow.hh" +#include "Command.hh" + +#include +#include + +namespace FbTk { + +class Color; + +class Button:public EventHandler, + private NotCopyable { +public: + Button(int screen_num, int x, int y, unsigned int width, unsigned int height); + Button(FbWindow &parent, int x, int y, unsigned int width, unsigned int height); + virtual ~Button(); + /// sets action when the button is clicked + void setOnClick(RefCount &com) { m_onclick = com; } + void move(int x, int y); + void resize(unsigned int width, unsigned int height); + void moveResize(int x, int y, unsigned int width, unsigned int height); + /// sets the pixmap to be viewd when the button is in normal state (ie not pressed) + void setPixmap(Pixmap pm); + /// sets the pixmap to be viewed when the button is pressed + void setPressedPixmap(Pixmap pm); + void setGC(GC gc) { m_gc = gc; } + /// sets background pixmap, this will override background color + void setBackgroundPixmap(Pixmap pm); + /// sets background color + void setBackgroundColor(const Color &color); + /// show button + void show(); + /// hide button + void hide(); + virtual void clear() { m_win.clear(); } + /** + @name eventhandlers + */ + //@{ + virtual void buttonPressEvent(XButtonEvent &event); + virtual void buttonReleaseEvent(XButtonEvent &event); + virtual void exposeEvent(XExposeEvent &event); + //@} + /// @return true if the button is pressed, else false + bool pressed() const { return m_pressed; } + /** + @name position and size of the button + */ + //@{ + int x() const { return m_win.x(); } + int y() const { return m_win.y(); } + unsigned int width() const { return m_win.width(); } + unsigned int height() const { return m_win.height(); } + //@} + FbWindow &window() { return m_win; } + const FbWindow &window() const { return m_win; } + GC gc() const { return m_gc; } +private: + FbTk::FbWindow m_win; ///< window for button + Pixmap m_foreground_pm; ///< foreground pixmap + Pixmap m_pressed_pm; ///< pressed pixmap + GC m_gc; ///< graphic context for button + bool m_pressed; ///< if the button is pressed + RefCount m_onclick; ///< what to do when this button is clicked +}; + +}; + +#endif // FBTK_BUTTON_HH -- cgit v0.11.2