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