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