/* * UltraStar Deluxe - Karaoke Game * * UltraStar Deluxe is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef DRAWABLE_CONTROL_HPP #define DRAWABLE_CONTROL_HPP #include #include #include #include #include "drawable.hpp" #include "control.hpp" #include "utils/point.hpp" #include "utils/dimension.hpp" #include "utils/rectangle.hpp" #include "background.hpp" #include "static.hpp" namespace usdx { class Container; class DrawableControl : public Drawable, public Control { private: static log4cpp::Category& log; /** * Coordinates of the top-left corner of the control. */ Point position; /** * Size of the control. */ Dimension size; /** * If true, clipping is set-up before the component is drawn, to cut off * all the drawing outside the specified size of the control. */ bool clipping_required; /** * Whether the control should be able to get the focus. */ bool focusable; /** * Background of the control. The background is drawn, before the real * content is drawn. */ Background* background; /** * Optional box around the control. Used for debugging. */ Static* debug_box; mutable boost::shared_mutex position_mutex; mutable boost::shared_mutex size_mutex; mutable boost::shared_mutex clipping_required_mutex; mutable boost::shared_mutex background_mutex; protected: Container* parent; class ContainerHelper { private: DrawableControl* self; public: ContainerHelper(DrawableControl*); virtual void add(Container*) const; }; DrawableControl(Container*, const ContainerHelper&); bool is_clipping_required(void) const; void set_clipping_required(const bool); bool is_focusable(void) const; void set_focusable(const bool); /** * Function get called, if the control should draw itself it the * current position on the OpenGL screen. If clipping is required, the * clipping gets set-up before this function gets called. */ virtual void draw(void); public: DrawableControl(Container*); virtual ~DrawableControl(); /** * Force the control to redraw it self. */ void repaint(void); virtual void set_position(const Point& position); virtual void set_position(int left, int top); const Point& get_position(void) const; int get_left(void) const; int get_top(void) const; virtual void set_size(const Dimension& size); virtual void set_size(int width, int height); const Dimension& get_size(void) const; int get_width(void) const; int get_height(void) const; Container* get_parent(void) const; void remove_parent(void); void set_background(Background*); const Background* get_background(void) const; const Rectangle get_absolut_rect(void) const; virtual DrawableControl* get_component_at(const Point& p); virtual void mouse_move(const Point& p); virtual void mouse_down(uint8_t button, const Point& p); virtual void mouse_up(uint8_t button, const Point& p); virtual void mouse_enter(void); virtual void mouse_leave(void); virtual void mouse_click(uint8_t button, const Point& p); virtual void mouse_dbl_click(uint8_t button, const Point& p); boost::signals2::signal&)> on_mouse_move; boost::signals2::signal&)> on_mouse_down; boost::signals2::signal&)> on_mouse_up; boost::signals2::signal on_mouse_enter; boost::signals2::signal on_mouse_leave; boost::signals2::signal&)> on_mouse_click; boost::signals2::signal&)> on_mouse_dbl_click; }; }; #endif