Implemented more convenient behaviour for certain up/down menus

git-svn-id: https://svn.code.sf.net/p/extremetuxracer/code/trunk@661 0420edf4-82e4-42fc-9478-35b55e6d67a3
master
pkeus 2016-05-18 09:38:22 +00:00
parent 443ff32862
commit 1e3334b5f7
3 changed files with 34 additions and 28 deletions

View File

@ -157,10 +157,10 @@ void CGameConfig::Enter() {
fullscreen->checked = param.fullscreen;
resolution = AddUpDown(rightpos, area.top+dd*1, 0, NUM_RESOLUTIONS-1, (int)param.res_type);
mus_vol = AddUpDown(rightpos, area.top+dd*2, 0, 100, param.music_volume);
sound_vol = AddUpDown(rightpos, area.top+dd*3, 0, 100, param.sound_volume);
mus_vol = AddUpDown(rightpos, area.top+dd*2, 0, 100, param.music_volume, 2, true);
sound_vol = AddUpDown(rightpos, area.top+dd*3, 0, 100, param.sound_volume, 2, true);
language = AddUpDown(rightpos, area.top+dd*4, 0, (int)Trans.languages.size() - 1, (int)param.language);
detail_level = AddUpDown(rightpos, area.top+dd*5, 1, 4, param.perf_level);
detail_level = AddUpDown(rightpos, area.top+dd*5, 1, 4, param.perf_level, 2, true);
textbuttons[0] = AddTextButton(Trans.Text(28), area.left+50, AutoYPosN(80), siz);
float len = FT.GetTextWidth(Trans.Text(8));

View File

@ -460,15 +460,18 @@ TArrow* AddArrow(int x, int y, bool down) {
}
TUpDown::TUpDown(int x, int y, int min_, int max_, int value_, int distance)
TUpDown::TUpDown(int x, int y, int min_, int max_, int value_, int distance, bool swapArrows_)
: TWidget(x, y, 32 * Winsys.scale / 0.8f, (32 + distance)*Winsys.scale / 0.8f)
, up(x, y + (16 + distance)*Winsys.scale / 0.8f, true)
, down(x, y, false)
, higher(swapArrows_ ? up : down)
, lower(swapArrows_ ? down : up)
, value(value_)
, minimum(min_)
, maximum(max_) {
up.SetActive(value < maximum);
down.SetActive(value > minimum);
, maximum(max_)
, swapArrows(swapArrows_) {
lower.SetActive(value < maximum);
higher.SetActive(value > minimum);
}
void TUpDown::Draw() const {
@ -477,15 +480,15 @@ void TUpDown::Draw() const {
}
bool TUpDown::Click(int x, int y) {
if (active && visible && up.Click(x, y)) {
if (active && visible && lower.Click(x, y)) {
value++;
down.SetActive(true);
higher.SetActive(true);
if (value == maximum)
up.SetActive(false);
lower.SetActive(false);
return true;
}
if (active && visible && down.Click(x, y)) {
up.SetActive(true);
if (active && visible && higher.Click(x, y)) {
lower.SetActive(true);
value--;
if (value == minimum)
down.SetActive(false);
@ -497,19 +500,19 @@ bool TUpDown::Click(int x, int y) {
void TUpDown::Key(sf::Keyboard::Key key, bool released) {
if (released) return;
if (key == sf::Keyboard::Up) { // Arrow up
if ((!swapArrows && key == sf::Keyboard::Up) || (swapArrows && key == sf::Keyboard::Down)) { // Arrow up
if (value > minimum) {
value--;
up.SetActive(true);
lower.SetActive(true);
if (value == minimum)
down.SetActive(false);
higher.SetActive(false);
}
} else if (key == sf::Keyboard::Down) { // Arrow down
} else if ((!swapArrows && key == sf::Keyboard::Down) || (swapArrows && key == sf::Keyboard::Up)) { // Arrow down
if (value < maximum) {
value++;
down.SetActive(true);
higher.SetActive(true);
if (value == maximum)
up.SetActive(false);
lower.SetActive(false);
}
}
}
@ -525,25 +528,25 @@ void TUpDown::MouseMove(int x, int y) {
void TUpDown::SetValue(int value_) {
value = clamp(minimum, value_, maximum);
up.SetActive(value < maximum);
down.SetActive(value > minimum);
lower.SetActive(value < maximum);
higher.SetActive(value > minimum);
}
void TUpDown::SetMinimum(int min_) {
minimum = min_;
value = clamp(minimum, value, maximum);
up.SetActive(value < maximum);
down.SetActive(value > minimum);
lower.SetActive(value < maximum);
higher.SetActive(value > minimum);
}
void TUpDown::SetMaximum(int max_) {
maximum = max_;
value = clamp(minimum, value, maximum);
up.SetActive(value < maximum);
down.SetActive(value > minimum);
lower.SetActive(value < maximum);
higher.SetActive(value > minimum);
}
TUpDown* AddUpDown(int x, int y, int minimum, int maximum, int value, int distance) {
TUpDown* AddUpDown(int x, int y, int minimum, int maximum, int value, int distance, bool swapArrows) {
locked_UD = true;
return static_cast<TUpDown*>(AddWidget(new TUpDown(x, y, minimum, maximum, value, distance)));
return static_cast<TUpDown*>(AddWidget(new TUpDown(x, y, minimum, maximum, value, distance, swapArrows)));
}
// ------------------ Elementary drawing ---------------------------------------------

View File

@ -171,11 +171,14 @@ TArrow* AddArrow(int x, int y, bool down);
class TUpDown : public TWidget {
TArrow up;
TArrow down;
TArrow& higher;
TArrow& lower;
int value;
int minimum;
int maximum;
bool swapArrows;
public:
TUpDown(int x, int y, int min_, int max_, int value_, int distance);
TUpDown(int x, int y, int min_, int max_, int value_, int distance, bool swapArrows_);
int GetValue() const { return value; }
void SetValue(int value_);
void SetMinimum(int min_);
@ -185,7 +188,7 @@ public:
void Key(sf::Keyboard::Key key, bool released);
void MouseMove(int x, int y);
};
TUpDown* AddUpDown(int x, int y, int minimum, int maximum, int value, int distance = 2);
TUpDown* AddUpDown(int x, int y, int minimum, int maximum, int value, int distance = 2, bool swapArrows = false);
// --------------------------------------------------------------------