File: controloptions.cpp

package info (click to toggle)
qonk 0.3.1-1
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 2,076 kB
  • ctags: 2,026
  • sloc: cpp: 14,978; sh: 3,464; makefile: 200
file content (125 lines) | stat: -rw-r--r-- 2,286 bytes parent folder | download | duplicates (3)
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; 
}