|
From: Tapio V. <aa...@us...> - 2010-08-21 18:02:53
|
Module: performous
Branch: master
Commit: 47e8b7b1325537952e7ddbd64d6708173d72c46b
Author: Tapio Vierros <tap...@gm...>
Date: Wed Jul 7 18:02:16 2010 +0300
Implement exit from menu root, enables joining game.
---
game/dancegraph.cc | 7 ++++---
game/guitargraph.cc | 9 +++++----
game/instrumentgraph.cc | 14 ++++++++------
game/instrumentgraph.hh | 6 +++---
game/menu.cc | 10 +++++++++-
game/menu.hh | 14 ++++++++++++--
game/screen_sing.cc | 4 ++--
7 files changed, 43 insertions(+), 21 deletions(-)
diff --git a/game/dancegraph.cc b/game/dancegraph.cc
index cbf296b..9da8c40 100644
--- a/game/dancegraph.cc
+++ b/game/dancegraph.cc
@@ -188,6 +188,7 @@ void DanceGraph::difficulty(DanceDifficulty level) {
void DanceGraph::engine() {
double time = m_audio.getPosition();
time -= config["audio/controller_delay"].f();
+ doUpdates();
for (Song::Stops::const_iterator it = m_song.stops.begin(), end = m_song.stops.end(); it != end; ++it) {
if (it->first >= time) break;
if (time < it->first + it->second) { time = it->first; break; } // Inside stop
@@ -203,8 +204,8 @@ void DanceGraph::engine() {
break;
}
// Menu keys
- if (m_menuOpen && ev.type == input::Event::PRESS) {
- if (ev.nav == input::CANCEL) toggleMenu();
+ if (menuOpen() && ev.type == input::Event::PRESS) {
+ if (ev.nav == input::CANCEL) m_menu.close();
else if (ev.nav == input::RIGHT || ev.nav == input::START) m_menu.action(1);
else if (ev.nav == input::LEFT) m_menu.action(-1);
else if (ev.nav == input::UP) m_menu.move(-1);
@@ -477,7 +478,7 @@ void DanceGraph::drawNote(DanceNote& note, double time) {
/// Draw popups and other info texts
void DanceGraph::drawInfo(double time, double offsetX, Dimensions dimensions) {
- if (m_menuOpen) {
+ if (menuOpen()) {
// Draw join menu
drawMenu(offsetX);
} else {
diff --git a/game/guitargraph.cc b/game/guitargraph.cc
index 8edb882..dc38224 100644
--- a/game/guitargraph.cc
+++ b/game/guitargraph.cc
@@ -206,6 +206,7 @@ bool GuitarGraph::difficulty(Difficulty level) {
void GuitarGraph::engine() {
double time = m_audio.getPosition();
time -= config["audio/controller_delay"].f();
+ doUpdates();
// Handle key markers
if (!m_drums) {
for (int i = 0; i < m_pads; ++i) {
@@ -229,8 +230,8 @@ void GuitarGraph::engine() {
break;
}
// Handle Start/Select keypresses
- if (ev.nav == input::CANCEL) toggleMenu();
- if (ev.nav == input::START && !m_menuOpen) ev.button = input::STARPOWER_BUTTON;
+ if (ev.nav == input::CANCEL) m_menu.toggle();
+ if (ev.nav == input::START && !menuOpen()) ev.button = input::STARPOWER_BUTTON;
//if (ev.type == input::Event::PRESS && ev.button > input::STARPOWER_BUTTON) {
//if (ev.button == 9) ev.button = input::STARPOWER_BUTTON; // Start works for GodMode
//else continue;
@@ -251,7 +252,7 @@ void GuitarGraph::engine() {
if (ev.type == input::Event::PRESS) m_pressed_anim[!m_drums + ev.button].setValue(1.0);
else if (ev.type == input::Event::PICK) m_pressed_anim[0].setValue(1.0);
// Menu keys
- if (m_menuOpen) {
+ if (menuOpen()) {
// Check first regular keys
if (ev.type == input::Event::PRESS && ev.button == 0 + m_drums) m_menu.action(1);
else if (ev.type == input::Event::PRESS && ev.button == 1 + m_drums) m_menu.action(-1);
@@ -1011,7 +1012,7 @@ void GuitarGraph::drawDrumfill(float tBeg, float tEnd) {
/// Draw popups and other info texts
void GuitarGraph::drawInfo(double time, double offsetX, Dimensions dimensions) {
// Draw info
- if (m_menuOpen) {
+ if (menuOpen()) {
drawMenu(offsetX);
} else {
float xcor = 0.35 * dimensions.w();
diff --git a/game/instrumentgraph.cc b/game/instrumentgraph.cc
index c999c24..ee789b6 100644
--- a/game/instrumentgraph.cc
+++ b/game/instrumentgraph.cc
@@ -9,7 +9,6 @@ InstrumentGraph::InstrumentGraph(Audio& audio, Song const& song, input::DevType
m_stream(),
m_cx(0.0, 0.2), m_width(0.5, 0.4),
m_menu(),
- m_menuOpen(true),
m_text(getThemePath("sing_timetxt.svg"), config["graphic/text_lod"].f()),
m_pads(),
m_correctness(0.0, 5.0),
@@ -27,7 +26,6 @@ InstrumentGraph::InstrumentGraph(Audio& audio, Song const& song, input::DevType
m_menuTheme.reset(new ThemeInstrumentMenu());
// Populate joining menu
- // TODO: Replace with option that actually does something
m_menu.add(MenuOption(_("Ready!"), _("Start performing!")));
// Guitar- / dancegraph specific options can be added in their constructors
}
@@ -43,13 +41,17 @@ void InstrumentGraph::setupPauseMenu() {
}
-void InstrumentGraph::toggleMenu(int dontforce) {
- if (dontforce == 0) { m_menuOpen = true; return; }
- if (m_menuOpen && !m_ready) {
+void InstrumentGraph::doUpdates() {
+ if (!menuOpen() && !m_ready) {
m_ready = true;
setupPauseMenu();
}
- m_menuOpen = !m_menuOpen;
+}
+
+
+void InstrumentGraph::toggleMenu(bool forceopen) {
+ if (forceopen) { m_menu.open(); return; }
+ m_menu.toggle();
}
diff --git a/game/instrumentgraph.hh b/game/instrumentgraph.hh
index 931ae07..31b5fe0 100644
--- a/game/instrumentgraph.hh
+++ b/game/instrumentgraph.hh
@@ -74,7 +74,8 @@ class InstrumentGraph {
virtual void changeTrack(int dir = 1) = 0;
virtual void changeDifficulty(int dir = 1) = 0;
- void toggleMenu(int dontforce = 1);
+ void doUpdates();
+ void toggleMenu(bool forceopen = false);
void togglePause(int) { m_audio.togglePause(); }
void restart(int) { /* TODO: Implement */ }
void quit(int) { ScreenManager::getSingletonPtr()->activateScreen("Songs"); }
@@ -82,7 +83,7 @@ class InstrumentGraph {
// General getters
bool ready() const { return m_ready; };
- bool menuOpen() const { return m_menuOpen; }
+ bool menuOpen() const { return m_menu.isOpen(); }
void position(double cx, double width) { m_cx.setTarget(cx); m_width.setTarget(width); }
unsigned stream() const { return m_stream; }
double correctness() const { return m_correctness.get(); }
@@ -110,7 +111,6 @@ class InstrumentGraph {
typedef std::vector<Popup> Popups;
Popups m_popups;
Menu m_menu;
- bool m_menuOpen;
// Shared functions for derived classes
void setupPauseMenu();
diff --git a/game/menu.cc b/game/menu.cc
index 13f0f7c..dde8d3e 100755
--- a/game/menu.cc
+++ b/game/menu.cc
@@ -62,6 +62,7 @@ void Menu::action(int dir) {
case MenuOption::OPEN_SUBMENU:
options = current->options;
current = options.begin();
+ m_level++;
break;
case MenuOption::CHANGE_VALUE:
if (current->value) {
@@ -74,9 +75,16 @@ void Menu::action(int dir) {
// Fall-through to closing
case MenuOption::CLOSE_SUBMENU:
// TODO: Handle more than one level of submenus
- // TODO: Closing root menu should signal that the menu is closing
+ if (m_level == 0) close();
+ else m_level--;
options = root_options;
current = options.begin();
break;
}
}
+
+void Menu::clear() {
+ options.clear();
+ root_options.clear();
+ current = options.end();
+}
diff --git a/game/menu.hh b/game/menu.hh
index ec0160c..ef89280 100755
--- a/game/menu.hh
+++ b/game/menu.hh
@@ -54,7 +54,7 @@ struct MainMenuOption {
/// Menu for selecting difficulty etc.
struct Menu {
/// constructor
- Menu(): current(options.end()) { }
+ Menu(): current(options.end()), m_open(true), m_level(0) { }
/// add a menu option
void add(MenuOption opt);
/// move the selection
@@ -62,9 +62,19 @@ struct Menu {
/// adjust the selected value
void action(int dir = 1);
/// clear items
- void clear() { options.clear(); }
+ void clear();
+
+ bool isOpen() const { return m_open; }
+ void open() { m_open = true; }
+ void close() { m_open = false; }
+ void toggle() { m_open = !m_open; }
MenuOptions options;
MenuOptions root_options;
MenuOptions::iterator current;
+
+ private:
+ bool m_open;
+ int m_level;
+
};
diff --git a/game/screen_sing.cc b/game/screen_sing.cc
index 63d94f2..75a0e14 100644
--- a/game/screen_sing.cc
+++ b/game/screen_sing.cc
@@ -248,8 +248,8 @@ void ScreenSing::manageEvent(SDL_Event event) {
}
// Esc-key needs special handling, it is global pause
if (event.type == SDL_KEYDOWN && key == SDLK_ESCAPE && !m_audio.isPaused()) {
- for (Instruments::iterator it = m_instruments.begin(); it != m_instruments.end(); ++it) it->toggleMenu(1);
- for (Dancers::iterator it = m_dancers.begin(); it != m_dancers.end(); ++it) it->toggleMenu(1);
+ for (Instruments::iterator it = m_instruments.begin(); it != m_instruments.end(); ++it) it->toggleMenu(true);
+ for (Dancers::iterator it = m_dancers.begin(); it != m_dancers.end(); ++it) it->toggleMenu(true);
}
// Start button has special functions for skipping things (only in singing for now)
if (nav == input::START && m_only_singers_alive && !m_song->vocals.notes.empty() && !m_audio.isPaused()) {
|