Mercurial > fife-parpg
diff ext/guichan-0.8.1/examples/action.hpp @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/guichan-0.8.1/examples/action.hpp Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,130 @@ +/** + * Code to populate a global Gui object with an example of how to + * use actions in Guichan. + */ + +#include <guichan.hpp> +#include <iostream> +#include <sstream> + +namespace action +{ + gcn::Container* top; + gcn::ImageFont* font; + gcn::Button* button1; + gcn::Button* button2; + gcn::Label* label1; + gcn::Label* label2; + + int clickCountButton1 = 0; // Holds clicks for button1 + int clickCountButton2 = 0; // Holds clicks for button2 + + /* + * To be able to recieve actions we must have a class inheriting from + * ActionListener and implementing the action function. + * When an action is generated in a Widget (i.e when a button is clicked) + * that widget calls the action function for all its action listeners. + * Below we make a class to be able to recieve our buttons actions. + */ + class ButtonActionListener : public gcn::ActionListener + { + public: + // Implement the action function in ActionListener to recieve actions + // The eventId tells us which widget called the action function. + void action(const gcn::ActionEvent& actionEvent) + { + std::string str; + std::ostringstream os(str); + + // Here we use the widget pointer to check which widget the action + // originated from. + if (actionEvent.getSource() == button1) + { + clickCountButton1++; + os << "Button1 clicks " << clickCountButton1; + // Change the caption to show number of clicks + label1->setCaption(os.str()); + // Adjust the label to fit the new caption + label1->adjustSize(); + } + // Here we use the event id in order to check what action occured. + else if (actionEvent.getId() == "button2") + { + clickCountButton2++; + os << "Button2 clicks " << clickCountButton2; + // Change the caption to show number of clicks + label2->setCaption(os.str()); + // Adjust the label to fit the new caption + label2->adjustSize(); + } + } + }; + + ButtonActionListener* buttonActionListener; // A pointer to the above class + + /** + * Initialises the widgets example by populating the global Gui + * object. + */ + void init() + { + // We first create a container to be used as the top widget. + // The top widget in Guichan can be any kind of widget, but + // in order to make the Gui contain more than one widget we + // make the top widget a container. + top = new gcn::Container(); + // We set the dimension of the top container to match the screen. + top->setDimension(gcn::Rectangle(0, 0, 640, 480)); + // Finally we pass the top widget to the Gui object. + globals::gui->setTop(top); + + // Now we load the font used in this example. + font = new gcn::ImageFont("fixedfont.bmp", " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"); + // Widgets may have a global font so we don't need to pass the + // font object to every created widget. The global font is static. + gcn::Widget::setGlobalFont(font); + + // Now we create the buttons. + button1 = new gcn::Button("Button 1"); + button2 = new gcn::Button("Button 2"); + button1->setPosition(120, 230); + button2->setPosition(420, 230); + // We add the buttons to the top container. + top->add(button1); + top->add(button2); + + // Now we create the labels. + label1 = new gcn::Label("Button1 clicks 0"); + label2 = new gcn::Label("Button2 clicks 0"); + label1->setPosition(100, 200); + label2->setPosition(400, 200); + // We add the labels to the top container. + top->add(label1); + top->add(label2); + + // Now we set the button's action event ids. + button1->setActionEventId("button1"); + button2->setActionEventId("button2"); + + // We make an instance of the ButtonActionListener. + buttonActionListener = new ButtonActionListener(); + + // And add the ButtonActionListener as an action listener of the buttons. + button1->addActionListener(buttonActionListener); + button2->addActionListener(buttonActionListener); + } + + /** + * Halts the action example. + */ + void halt() + { + delete buttonActionListener; + delete label1; + delete label2; + delete button1; + delete button2; + delete font; + delete top; + } +}