1 #include <iostream>
2 #include <map>
3
4 #include "guichan/guichan.hpp"
5
6 #include "ui/menuaction.h"
7
8 #include "controloptions.h"
9 #include "main.h"
10 #include "settings.h"
11
12 #include "input.h"
13
14 using namespace std;
15 using namespace gcn;
16
ControlOptions(Main & m)17 ControlOptions::ControlOptions(Main &m)
18 : main(m)
19 {
20 }
21
22 void
startSensing()23 ControlOptions::startSensing()
24 {
25 main.startSensing();
26 }
27
28 void
finishSensing(GameAction ga,bool b)29 ControlOptions::finishSensing(GameAction ga, bool b)
30 {
31 main.finishSensing(ga, b);
32
33 map <GameAction, MenuAction * >::iterator iter;
34 for( iter = controlActions.begin(); iter != controlActions.end(); iter++ ) {
35 iter->second->update();
36 }
37 }
38
39 void
reset(GameAction ga)40 ControlOptions::reset(GameAction ga)
41 {
42 main.resetGameAction(ga);
43 }
44
45 class ControlAction : public MenuAction
46 {
47 ControlOptions &controlOptions;
48 GameAction gameAction;
49 bool sensing;
50
51 Label *label;
52 string base;
53
54 public:
ControlAction(ControlOptions & co,GameAction ga)55 ControlAction(ControlOptions &co, GameAction ga)
56 : controlOptions(co), gameAction(ga), sensing(false), label(0)
57 {
58 }
59
getWidget(string s)60 gcn::Widget *getWidget(string s)
61 {
62 base = s + ": ";
63 return label = new Label(base + Settings::getAsString(gameAction));
64 }
65
invoke()66 void invoke()
67 {
68 if (sensing)
69 {
70 controlOptions.finishSensing(gameAction, true);
71 sensing = false;
72 }
73 else
74 {
75 sensing = true;
76 label->setCaption(base + "press something");
77 label->adjustSize();
78 controlOptions.startSensing();
79 }
80 }
81
cancel()82 bool cancel()
83 {
84 if (sensing)
85 {
86 controlOptions.finishSensing(gameAction, false);
87 sensing = false;
88
89 // Report that an operation was interrupted (prevents
90 // menu being left or menu system made invisible).
91 return true;
92 }
93
94 return false;
95 }
96
reset()97 void reset()
98 {
99 controlOptions.reset(gameAction);
100 label->setCaption(base + Settings::getAsString(gameAction));
101 label->adjustSize();
102 }
103
update()104 void update()
105 {
106 label->setCaption(base + Settings::getAsString(gameAction));
107 label->adjustSize();
108 }
109
110 };
111
112 MenuAction *
getControlAction(GameAction ga)113 ControlOptions::getControlAction(GameAction ga)
114 {
115 MenuAction *ma = controlActions[ga];
116
117 if (!ma)
118 {
119 ma = new ControlAction(*this, ga);
120 controlActions[ga] = ma;
121 }
122
123 return ma;
124 }
125
126