![]() |
CUGL 3.0
Cornell University Game Library
|
#include <CUButtonGroup.h>
Public Types | |
typedef std::function< void(const std::string name, int curBtn, int nextBtn)> | Listener |
Public Member Functions | |
ButtonGroup () | |
~ButtonGroup () | |
virtual void | dispose () override |
virtual bool | init () override |
bool | init (const std::shared_ptr< Button > &button, int initialButton=-1) |
bool | init (const std::vector< std::shared_ptr< Button > > &buttons, int initialButton=-1) |
bool | initWithData (const AssetManager *manager, const std::shared_ptr< JsonValue > &data) override |
const int | getCurrent () const |
void | addButton (const std::shared_ptr< Button > &btn) |
void | removeButton (const std::shared_ptr< Button > &btn) |
int | screenToIndex (const Vec2 point) |
int | screenToIndex (float x, float y) |
void | setDown (int btn) |
virtual void | doLayout () override |
bool | hasListener () const |
const Listener | getListener (Uint32 key) const |
const std::vector< Listener > | getListeners () const |
Uint32 | addListener (Listener listener) |
bool | removeListener (Uint32 key) |
void | clearListeners () |
bool | activate () |
bool | deactivate () |
bool | isActive () const |
![]() | |
SceneNode () | |
~SceneNode () | |
virtual void | dispose () |
virtual bool | init () |
virtual bool | initWithPosition (const Vec2 pos) |
bool | initWithPosition (float x, float y) |
virtual bool | initWithBounds (const Size size) |
virtual bool | initWithBounds (float width, float height) |
virtual bool | initWithBounds (const Rect rect) |
virtual bool | initWithBounds (float x, float y, float width, float height) |
virtual bool | initWithData (const AssetManager *manager, const std::shared_ptr< JsonValue > &data) |
virtual std::shared_ptr< SceneNode > | copy (const std::shared_ptr< SceneNode > &dst) const |
unsigned int | getTag () const |
void | setTag (unsigned int tag) |
const std::string | getName () const |
void | setName (const std::string name) |
const std::string | getClassName () const |
virtual std::string | toString (bool verbose=false) const |
operator std::string () const | |
const std::shared_ptr< cugl::JsonValue > & | getJSON () const |
const Vec2 | getPosition () const |
void | setPosition (const Vec2 &position) |
void | setPosition (float x, float y) |
float | getPositionX (void) const |
void | setPositionX (float x) |
float | getPositionY (void) const |
void | setPositionY (float y) |
Vec2 | getWorldPosition () const |
const Size | getContentSize () const |
virtual void | setContentSize (const Size size) |
virtual void | setContentSize (float width, float height) |
float | getContentWidth () const |
void | setContentWidth (float width) |
float | getContentHeight () const |
void | setContentHeight (float height) |
virtual Rect | getLayoutBounds () const |
Size | getSize () const |
float | getWidth () const |
float | getHeight () const |
Rect | getBoundingBox () const |
virtual bool | inContentBounds (const Vec2 point) |
bool | inContentBounds (float x, float y) |
virtual void | setAnchor (const Vec2 anchor) |
virtual void | setAnchor (float x, float y) |
const Vec2 | getAnchor () const |
Vec2 | getAnchorInPixels () |
Color4 | getColor () const |
virtual void | setColor (Color4 color) |
Color4 | getAbsoluteColor () |
bool | isVisible () const |
void | setVisible (bool visible) |
bool | hasRelativeColor () const |
void | setRelativeColor (bool flag) |
std::shared_ptr< graphics::Scissor > | getScissor () const |
void | setScissor (const std::shared_ptr< graphics::Scissor > &scissor) |
void | setScissor () |
const Vec2 | getScale () const |
float | getScaleX () const |
float | getScaleY () const |
void | setScale (float scale) |
void | setScale (const Vec2 vec) |
void | setScale (float sx, float sy) |
float | getAngle () |
void | setAngle (float angle) |
const Affine2 & | getTransform () const |
const Affine2 & | getAlternateTransform () const |
void | setAlternateTransform (const Affine2 &transform) |
bool | withAlternateTransform () |
void | chooseAlternateTransform (bool active) |
const Affine2 & | getNodeToParentTransform () const |
Affine2 | getParentToNodeTransform () const |
virtual Affine2 | getNodeToWorldTransform () const |
Affine2 | getWorldToNodeTransform () const |
Vec2 | screenToNodeCoords (const Vec2 screenPoint) const |
Vec2 | worldToNodeCoords (const Vec2 worldPoint) const |
Vec2 | nodeToScreenCoords (const Vec2 nodePoint) const |
Vec2 | nodeToWorldCoords (const Vec2 nodePoint) const |
Vec2 | parentToNodeCoords (const Vec2 parentPoint) const |
Vec2 | nodeToParentCoords (const Vec2 nodePoint) const |
size_t | getChildCount () const |
std::shared_ptr< SceneNode > | getChild (unsigned int pos) |
const std::shared_ptr< SceneNode > & | getChild (unsigned int pos) const |
template<typename T > | |
std::shared_ptr< T > | getChild (unsigned int pos) const |
std::shared_ptr< SceneNode > | getChildByTag (unsigned int tag) const |
template<typename T > | |
std::shared_ptr< T > | getChildByTag (unsigned int tag) const |
std::shared_ptr< SceneNode > | getChildByName (const std::string name) const |
template<typename T > | |
std::shared_ptr< T > | getChildByName (const std::string name) const |
std::vector< std::shared_ptr< SceneNode > > | getChildren () |
const std::vector< std::shared_ptr< SceneNode > > & | getChildren () const |
void | addChild (const std::shared_ptr< SceneNode > &child) |
void | addChildWithTag (const std::shared_ptr< SceneNode > &child, unsigned int tag) |
void | addChildWithName (const std::shared_ptr< SceneNode > &child, const std::string name) |
void | swapChild (const std::shared_ptr< SceneNode > &child1, const std::shared_ptr< SceneNode > &child2, bool inherit=false) |
SceneNode * | getParent () |
const SceneNode * | getParent () const |
Scene2 * | getScene () |
const Scene2 * | getScene () const |
void | removeFromParent () |
virtual void | removeChild (unsigned int pos) |
void | removeChild (const std::shared_ptr< SceneNode > &child) |
void | removeChildByTag (unsigned int tag) |
void | removeChildByName (const std::string name) |
virtual void | removeAllChildren () |
void | setPriority (float priority) |
float | getPriority () |
virtual void | render (const std::shared_ptr< graphics::SpriteBatch > &batch, const Affine2 &transform, Color4 tint) |
virtual void | render (const std::shared_ptr< graphics::SpriteBatch > &batch) |
virtual void | draw (const std::shared_ptr< graphics::SpriteBatch > &batch, const Affine2 &transform, Color4 tint) |
const std::shared_ptr< Layout > & | getLayout () const |
void | setLayout (const std::shared_ptr< Layout > &layout) |
virtual void | doLayout () |
Static Public Member Functions | |
static std::shared_ptr< ButtonGroup > | alloc (const std::shared_ptr< Button > &button, int initialButton=-1) |
static std::shared_ptr< ButtonGroup > | alloc (const std::vector< std::shared_ptr< Button > > &buttons, int initialButton=-1) |
static std::shared_ptr< SceneNode > | allocWithData (const AssetManager *manager, const std::shared_ptr< JsonValue > &data) |
![]() | |
static std::shared_ptr< SceneNode > | alloc () |
static std::shared_ptr< SceneNode > | allocWithPosition (const Vec2 pos) |
static std::shared_ptr< SceneNode > | allocWithPosition (float x, float y) |
static std::shared_ptr< SceneNode > | allocWithBounds (const Size size) |
static std::shared_ptr< SceneNode > | allocWithBounds (float width, float height) |
static std::shared_ptr< SceneNode > | allocWithBounds (const Rect rect) |
static std::shared_ptr< SceneNode > | allocWithBounds (float x, float y, float width, float height) |
static std::shared_ptr< SceneNode > | allocWithData (const AssetManager *manager, const std::shared_ptr< JsonValue > &data) |
Protected Attributes | |
int | _curButton |
std::vector< std::shared_ptr< Button > > | _buttons |
std::vector< std::string > | _keyset |
bool | _active |
bool | _mouse |
Uint32 | _inputkey |
Uint32 | _nextKey |
std::unordered_map< Uint32, Listener > | _listeners |
![]() | |
Vec2 | _position |
Vec2 | _anchor |
Size | _contentSize |
Color4 | _tintColor |
bool | _hasParentColor |
bool | _isVisible |
std::shared_ptr< graphics::Scissor > | _scissor |
Vec2 | _scale |
float | _angle |
Affine2 | _transform |
bool | _useTransform |
Affine2 | _combined |
std::vector< std::shared_ptr< SceneNode > > | _children |
SceneNode * | _parent |
Scene2 * | _graph |
std::shared_ptr< Layout > | _layout |
int | _childOffset |
unsigned int | _tag |
std::string | _name |
size_t | _hashOfName |
std::string | _classname |
float | _priority |
std::shared_ptr< JsonValue > | _json |
This class represents a button group
A button group is a bunch of toggle buttons, of which at most one can be selected at a time. If a single button is clicked that button's listener will be called if it has one, as well as the button group's listener. The previously toggled button will be untoggled and its listener will also be called.
Button groups can be used to make a multiple choice quiz scenes and tabs
This type represents a listener for a ButtonGroup
state change.
In CUGL, listeners are implemented as a set of callback functions, not as objects. This allows each listener to implement as much or as little functionality as it wants. For simplicity, ButtonGroup nodes only support a single listener. If you wish for more than one listener, then your listener should handle its own dispatch.
The function type is equivalent to
std::function<void(const std::string name, bool down)>
name | The button name |
curBtn | The currently toggled button in the group |
nextBtn | The button to be toggled once the listeners have finished |
cugl::scene2::ButtonGroup::ButtonGroup | ( | ) |
Creates an uninitialized button with no size or texture information.
You must initialize this button before use.
NEVER USE A CONSTRUCTOR WITH NEW. If you want to allocate a Node on the heap, use one of the static constructors instead.
|
inline |
Deletes this button group, disposing all resources
bool cugl::scene2::ButtonGroup::activate | ( | ) |
Activates this button group to listen for mouse/touch events.
This method attaches a listener to either the Mouse
or Touchscreen
inputs to monitor when the button is pressed and/or released. The button group will favor the mouse, but will use the touch screen if no mouse input is active. If neither input is active, this method will fail.
When active, the button group will change the state of the appropriate button on its own, without requiring the user to use setDown(int)
. If there is a Listener
attached, it will call that function upon any state changes.
void cugl::scene2::ButtonGroup::addButton | ( | const std::shared_ptr< Button > & | btn | ) |
Add a button to the button group
btn | The button to add to the group |
Uint32 cugl::scene2::ButtonGroup::addListener | ( | Listener | listener | ) |
Returns a key for a listener after adding it to this button group.
This listener is invoked when the button group state changes (up or down).
C++ cannot hash functions types. Therefore, the listener will be identified by a unique key, returned by this function. You should remember this key to remove the listener if necessary.
This also means that adding a listener twice will add it for an additional key, causing the listener to be called multiple times on a state change.
listener | The listener to add |
|
inlinestatic |
Returns a newly allocated button group with the given button and index
The new button group will have a single button, the one given, and will initially be set down if initialButton is 0. If initialButton is -1, no button is set down.
button | The button in the button group |
initialButton | The index of the button to set down initially |
|
inlinestatic |
Returns a newly allocated button group with the given buttons and index
The new button group will have all of the buttons in the given list. If initialButton is a positive number the button at that index in the list will be set down initially. If initialButton is -1, no button is set down.
buttons | The buttons in the button group |
initialButton | The index of the button to set down initially |
|
inlinestatic |
Returns a newly allocated a node with the given JSON specificaton.
This initializer is designed to receive the "data" object from the JSON passed to Scene2Loader
. This JSON format supports all of the attribute values of its parent class. In addition, it supports the following additional attributes:
"buttons": A list of strings referencing the name of children nodes (must be buttons) "initial": A number representing the index of the button to initially be set down
The attribute 'buttons' is REQUIRED. All other attributes are optional.
manager | The asset manager handling this asset |
data | The JSON object specifying the node |
void cugl::scene2::ButtonGroup::clearListeners | ( | ) |
Clears all listeners for this button group.
These listeners are invoked when the button state changes (up or down). This method does not require you to remember the keys assigned to the individual listeners.
bool cugl::scene2::ButtonGroup::deactivate | ( | ) |
Deactivates this button group, ignoring future mouse/touch events.
This method removes its internal listener from either the Mouse
or Touchscreen
inputs to monitor when the button is pressed and/or released. The input affected is the one that received the listener upon activation.
When deactivated, the buttons will no longer change their state on their own. However, the user can still change the state manually with the setDown(int)
method. In addition, any Listener
attached will still respond to manual state changes.
|
overridevirtual |
Disposes all of the resources used by this node.
A disposed button can be safely reinitialized. Any children owned by this node will be released. They will be deleted if no other object owns them.
It is unsafe to call this on a button that is still currently inside of a scene graph.
Reimplemented from cugl::scene2::SceneNode.
|
overridevirtual |
Arranges the child of this node using the layout manager.
This process occurs recursively and top-down. A layout manager may end up resizing the children. That is why the parent must finish its layout before we can apply a layout manager to the children.
Reimplemented from cugl::scene2::SceneNode.
|
inline |
Returns the index of the currently toggled button.
This method returns -1 if no button is toggled.
const Listener cugl::scene2::ButtonGroup::getListener | ( | Uint32 | key | ) | const |
Returns the listener for the given key
This listener is invoked when the toggled button changes.
If there is no listener for the given key, it returns nullptr.
key | The identifier for the listener |
const std::vector< Listener > cugl::scene2::ButtonGroup::getListeners | ( | ) | const |
Returns all listeners for this button group
This listener is invoked when the toggled button changes.
|
inline |
Returns true if this button group has a listener
This listener is invoked when the toggled button changes.
|
inlineoverridevirtual |
Deactivates the default initializer.
This initializer may not be used for a button group. A button group must have a child node for the up state at the very minimum.
Reimplemented from cugl::scene2::SceneNode.
bool cugl::scene2::ButtonGroup::init | ( | const std::shared_ptr< Button > & | button, |
int | initialButton = -1 |
||
) |
Initializes a button group with the given button and initial index
The new button group will have a single button, the one given, and will initially be set down if initialButton is 0. If initialButton is -1, no button is set down.
button | The button in the button group |
initialButton | The index of the button to set down initially |
bool cugl::scene2::ButtonGroup::init | ( | const std::vector< std::shared_ptr< Button > > & | buttons, |
int | initialButton = -1 |
||
) |
Initializes a button group with the given buttons and initial index
The new button group will have all of the buttons in the given list. If initialButton is a positive number the button at that index in the list will be set down initially. If initialButton is -1, no button is set down.
buttons | The buttons in the button group |
initialButton | The index of the button to set down initially |
|
overridevirtual |
Initializes a node with the given JSON specificaton.
This initializer is designed to receive the "data" object from the JSON passed to Scene2Loader
. This JSON format supports all of the attribute values of its parent class. In addition, it supports the following additional attributes:
"buttons": A list of strings referencing the name of children nodes (must be buttons) "initial": A number representing the index of the button to initially be set down
The attribute 'buttons' is REQUIRED. All other attributes are optional.
manager | The asset manager handling this asset |
data | The JSON object specifying the node |
Reimplemented from cugl::scene2::SceneNode.
|
inline |
Returns true if this button group has been activated.
void cugl::scene2::ButtonGroup::removeButton | ( | const std::shared_ptr< Button > & | btn | ) |
Remove a button from the button group
btn | The button to remove from the group |
bool cugl::scene2::ButtonGroup::removeListener | ( | Uint32 | key | ) |
Removes a listener from this button group.
This listener is invoked when the button group state changes (up or down).
Listeners must be identified by the key returned by the addListener
method. If this button does not have a listener for the given key, this method will fail.
key | The key of the listener to remove |
int cugl::scene2::ButtonGroup::screenToIndex | ( | const Vec2 | point | ) |
Returns the index of the button that containing the point in screen space
This method is used to manually check for mouse presses/touches. It converts a point in screen coordinates to the node coordinates and checks if it is in the bounds of the button.
If the click is not within a button in the group this function will return -1.
point | The point in screen coordinates |
|
inline |
Returns the index of the button that containing the point in screen space
This method is used to manually check for mouse presses/touches. It converts a point in screen coordinates to the node coordinates and checks if it is in the bounds of the button.
If the click is not within a button in the group this function will return -1.
x | The x-value in screen coordinates |
y | The y-value in screen coordinates |
void cugl::scene2::ButtonGroup::setDown | ( | int | btn | ) |
Invokes setDown on the button at index btn
This method invokes setDown on the button at index btn with the appropriate parameter. If btn is -1, no button is down.
btn | The index of the button to be set down |
|
protected |
Whether the button is actively checking for state changes
|
protected |
The list of buttons representing the buttons states.
This cannot be null and must have length > 0.
|
protected |
The index of the current button in _buttons list.
This value tarts as -1 (none selected)
|
protected |
The listener key when the button is checking for state changes
|
protected |
Keyset to access the children (may be empty)
|
protected |
The listener callbacks for state changes
|
protected |
Whether we are using the mouse (as opposed to the touch screen)
|
protected |
The next available key for a listener