comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:4a0efb7baf70
1 /**
2 * Code to populate a global Gui object with an example of how to
3 * use actions in Guichan.
4 */
5
6 #include <guichan.hpp>
7 #include <iostream>
8 #include <sstream>
9
10 namespace action
11 {
12 gcn::Container* top;
13 gcn::ImageFont* font;
14 gcn::Button* button1;
15 gcn::Button* button2;
16 gcn::Label* label1;
17 gcn::Label* label2;
18
19 int clickCountButton1 = 0; // Holds clicks for button1
20 int clickCountButton2 = 0; // Holds clicks for button2
21
22 /*
23 * To be able to recieve actions we must have a class inheriting from
24 * ActionListener and implementing the action function.
25 * When an action is generated in a Widget (i.e when a button is clicked)
26 * that widget calls the action function for all its action listeners.
27 * Below we make a class to be able to recieve our buttons actions.
28 */
29 class ButtonActionListener : public gcn::ActionListener
30 {
31 public:
32 // Implement the action function in ActionListener to recieve actions
33 // The eventId tells us which widget called the action function.
34 void action(const gcn::ActionEvent& actionEvent)
35 {
36 std::string str;
37 std::ostringstream os(str);
38
39 // Here we use the widget pointer to check which widget the action
40 // originated from.
41 if (actionEvent.getSource() == button1)
42 {
43 clickCountButton1++;
44 os << "Button1 clicks " << clickCountButton1;
45 // Change the caption to show number of clicks
46 label1->setCaption(os.str());
47 // Adjust the label to fit the new caption
48 label1->adjustSize();
49 }
50 // Here we use the event id in order to check what action occured.
51 else if (actionEvent.getId() == "button2")
52 {
53 clickCountButton2++;
54 os << "Button2 clicks " << clickCountButton2;
55 // Change the caption to show number of clicks
56 label2->setCaption(os.str());
57 // Adjust the label to fit the new caption
58 label2->adjustSize();
59 }
60 }
61 };
62
63 ButtonActionListener* buttonActionListener; // A pointer to the above class
64
65 /**
66 * Initialises the widgets example by populating the global Gui
67 * object.
68 */
69 void init()
70 {
71 // We first create a container to be used as the top widget.
72 // The top widget in Guichan can be any kind of widget, but
73 // in order to make the Gui contain more than one widget we
74 // make the top widget a container.
75 top = new gcn::Container();
76 // We set the dimension of the top container to match the screen.
77 top->setDimension(gcn::Rectangle(0, 0, 640, 480));
78 // Finally we pass the top widget to the Gui object.
79 globals::gui->setTop(top);
80
81 // Now we load the font used in this example.
82 font = new gcn::ImageFont("fixedfont.bmp", " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
83 // Widgets may have a global font so we don't need to pass the
84 // font object to every created widget. The global font is static.
85 gcn::Widget::setGlobalFont(font);
86
87 // Now we create the buttons.
88 button1 = new gcn::Button("Button 1");
89 button2 = new gcn::Button("Button 2");
90 button1->setPosition(120, 230);
91 button2->setPosition(420, 230);
92 // We add the buttons to the top container.
93 top->add(button1);
94 top->add(button2);
95
96 // Now we create the labels.
97 label1 = new gcn::Label("Button1 clicks 0");
98 label2 = new gcn::Label("Button2 clicks 0");
99 label1->setPosition(100, 200);
100 label2->setPosition(400, 200);
101 // We add the labels to the top container.
102 top->add(label1);
103 top->add(label2);
104
105 // Now we set the button's action event ids.
106 button1->setActionEventId("button1");
107 button2->setActionEventId("button2");
108
109 // We make an instance of the ButtonActionListener.
110 buttonActionListener = new ButtonActionListener();
111
112 // And add the ButtonActionListener as an action listener of the buttons.
113 button1->addActionListener(buttonActionListener);
114 button2->addActionListener(buttonActionListener);
115 }
116
117 /**
118 * Halts the action example.
119 */
120 void halt()
121 {
122 delete buttonActionListener;
123 delete label1;
124 delete label2;
125 delete button1;
126 delete button2;
127 delete font;
128 delete top;
129 }
130 }