view engine/core/gui/widgets/togglebutton.h @ 336:16112ef84609

PyChan fixes: * Previous commits removed the ability to map events to unnamed widgets. Fixed.
author phoku@33b003aa-7bff-0310-803a-e67f0ece8222
date Mon, 24 Aug 2009 15:34:23 +0000
parents 51cc05d862f2
children
line wrap: on
line source

/***************************************************************************
 *   Copyright (C) 2005-2008 by the FIFE team                              *
 *   http://www.fifengine.de                                               *
 *   This file is part of FIFE.                                            *
 *                                                                         *
 *   FIFE is free software; you can redistribute it and/or                 *
 *   modify it under the terms of the GNU Lesser General Public            *
 *   License as published by the Free Software Foundation; either          *
 *   version 2.1 of the License, or (at your option) any later version.    *
 *                                                                         *
 *   This library 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     *
 *   Lesser General Public License for more details.                       *
 *                                                                         *
 *   You should have received a copy of the GNU Lesser General Public      *
 *   License along with this library; if not, write to the                 *
 *   Free Software Foundation, Inc.,                                       *
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
 ***************************************************************************/

#ifndef FIFE_GUICHAN_ADDON_TOGGLEBUTTON_H
#define FIFE_GUICHAN_ADDON_TOGGLEBUTTON_H

// Standard C++ library includes
#include <string>
#include <map>

// 3rd party library includes
#include <guichan.hpp>
#include <guichan/actionlistener.hpp>

// FIFE includes
// These includes are split up in two parts, separated by one empty line
// First block: files included from the FIFE root src directory
// Second block: files included from the same folder

namespace gcn {
	/**
     * An implementation of a toggleable button.
	 *
	 * If the button is in a group, all other buttons in that group will be untoggled
	 * when a button gets toggled. If the button is already toggled, you can untoggle 
	 * it by clicking on it.
	 *
     */
	class ToggleButton : public Button, public ActionListener {
		public:
			/**
			 * Constructor
			 *
			 * @param up_image Image displayed when the button isn't toggled
			 * @param down_image Image displayed when the button is toggled
			 * @param hover_file Image displayed when the mouse cursor is over button
			 * @param caption Text to be displayed on button
			 * @param group The group the button belongs to
			 */
			ToggleButton(Image *up_image = 0, Image *down_image = 0, Image *hover_image = 0, const std::string& caption = "", const std::string& group = "");

			/**
			 * Destructor
			 */
			~ToggleButton();

			/**
			 * Draws the button
			 */
			void draw(Graphics *graphics);

			/**
			 * Adjust size to fit image and caption
			 */
			void adjustSize();

			/**
			 * Sets the image that will be displayed when the button isn't toggled
			 *
			 * @param image Image to be displayed
			 */
			void setUpImage(Image* image);

			/**
			 * Sets the image that will be displayed when the button is toggled or pressed
			 *
			 * @param image Image to be displayed
			 */
			void setDownImage(Image* image);

			/**
			 * Sets the image which will be displayed when the mouse cursor is over the button
			 *
			 * @param image Image to be displayed
			 */
			void setHoverImage(Image* image);
			
			/**
			 * Sets the number of pixels the image or text will be offset from
			 * the top left corner of button when the button is pressed or toggled.
			 *
			 * @param x Offset from left
			 * @param y Offset from top
			 * @see getDownXOffset
			 * @see getDownYOffset
			 */
			void setDownOffset(int x, int y);

			/**
			 * Gets the number of pixels the image or text will be offset
			 * from the left of button when the button is pressed or toggled.
			 *
			 * @return Offset from left when button is pressed
			 * @see setDownOffset
			 */
			int getDownXOffset() const;

			/**
			 * Gets the number of pixels the image or text will be offset
			 * from the top of button when the button is pressed or toggled.
			 *
			 * @return Offset from top when button is pressed
			 * @see setDownOffset
			 */
			int getDownYOffset() const;

			/**
			 * Checks if the radio button is selected.
			 *
			 * @return True if the radio button is selecte, false otherwise.
			 * @see setSelected
			 */
			bool isToggled() const;

			/**
			 * Sets the radio button to selected or not.
			 *
			 * @param selected True if the radio button should be selected,
			 *                 false otherwise.
			 * @see isSelected
			 */
			void setToggled(bool toggled);

			// From Guichan 0.8.1
			/**
			 * Sets the group the toggle button should belong to. Note that
			 * a toggle button group is unique per application, not per Gui object
			 * as the group is stored in a static map.
			 *
			 * @param group The name of the group.
			 * @see getGroup
			 */
			void setGroup(const std::string &group);

			/**
			 * Gets the group the toggle button belongs to.
			 *
			 * @return The group the toggle button belongs to.
			 * @see setGroup
			 */
			const std::string &getGroup() const;

		protected:
			// Inherited from gcn::Widget
			/**
			 * Toggle button when it is activated
			 *
			 * @param actionEvent ActionEvent object
			 */
			void action(const ActionEvent& actionEvent);

		private:
			// Image to be used when the button is not toggle
			Image *m_upImage;

			// Image to be used when the button is toggled or pressed
			Image *m_downImage;

			// Image to be used when the mouse cursor is over the image
			Image *m_hoverImage;

			// Number of pixels the image/text will be offset from the top left
			// corner, when the button is pressed or toggled
			int x_downoffset;
			int y_downoffset;

			/**
			 * Whether the button is toggled or not.
			 */
			bool m_toggled;			

			//-- From Guichan 0.8.1 --
			/**
			 * Holds the group of the toggle button.
			 */
			std::string m_group;

			/**
			 * Typedef.
			 */
			typedef std::multimap<std::string, ToggleButton *> GroupMap;

			/**
			 * Typedef.
			 */
			typedef GroupMap::iterator GroupIterator;

			/**
			 * Holds all available toggle button groups.
			 */
			static GroupMap m_groupMap;
	};

}

#endif
/* vim: set noexpandtab: set shiftwidth=2: set tabstop=2: */