First version of the system select menu.

This commit is contained in:
Aloshi 2013-12-10 21:23:47 -06:00
parent abb568aa6e
commit 7152ca6246
10 changed files with 224 additions and 29 deletions

View file

@ -197,6 +197,8 @@ set(ES_HEADERS
${CMAKE_CURRENT_SOURCE_DIR}/src/views/DetailedGameListView.h ${CMAKE_CURRENT_SOURCE_DIR}/src/views/DetailedGameListView.h
${CMAKE_CURRENT_SOURCE_DIR}/src/views/GameListView.h ${CMAKE_CURRENT_SOURCE_DIR}/src/views/GameListView.h
${CMAKE_CURRENT_SOURCE_DIR}/src/views/GridGameListView.h ${CMAKE_CURRENT_SOURCE_DIR}/src/views/GridGameListView.h
${CMAKE_CURRENT_SOURCE_DIR}/src/views/SystemListView.h
${CMAKE_CURRENT_SOURCE_DIR}/src/views/SystemView.h
${CMAKE_CURRENT_SOURCE_DIR}/src/views/ViewController.h ${CMAKE_CURRENT_SOURCE_DIR}/src/views/ViewController.h
${CMAKE_CURRENT_SOURCE_DIR}/src/animations/Animation.h ${CMAKE_CURRENT_SOURCE_DIR}/src/animations/Animation.h
@ -272,6 +274,8 @@ set(ES_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/views/DetailedGameListView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/views/DetailedGameListView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/views/GameListView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/views/GameListView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/views/GridGameListView.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/views/GridGameListView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/views/SystemListView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/views/SystemView.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/views/ViewController.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/views/ViewController.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/animations/AnimationController.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/animations/AnimationController.cpp

View file

@ -122,6 +122,8 @@ Pretty much any image format is supported.
`<verticalDividerImage>` - No default. `<verticalDividerImage>` - No default.
`<systemImage>` - No default. Large image, shown in the system select menu.
`<fastSelectBackgroundImage>` - Nine patch. Default is the "button.png" resource. `<fastSelectBackgroundImage>` - Nine patch. Default is the "button.png" resource.
Sounds Sounds

View file

@ -28,7 +28,8 @@ std::map<std::string, ImageDef> ThemeData::sDefaultImages = boost::assign::map_l
("headerImage", ImageDef("", false)) ("headerImage", ImageDef("", false))
("infoBackgroundImage", ImageDef("", false)) ("infoBackgroundImage", ImageDef("", false))
("verticalDividerImage", ImageDef("", false)) ("verticalDividerImage", ImageDef("", false))
("fastSelectBackgroundImage", ImageDef(":/button.png", false)); ("fastSelectBackgroundImage", ImageDef(":/button.png", false))
("systemImage", ImageDef("", false));
std::map<std::string, SoundDef> ThemeData::sDefaultSounds = boost::assign::map_list_of std::map<std::string, SoundDef> ThemeData::sDefaultSounds = boost::assign::map_list_of
("scrollSound", SoundDef("")) ("scrollSound", SoundDef(""))

View file

@ -169,12 +169,12 @@ bool BasicGameListView::input(InputConfig* config, Input input)
}else if(config->isMappedTo("right", input)) }else if(config->isMappedTo("right", input))
{ {
mList.stopScrolling(); mList.stopScrolling();
mWindow->getViewController()->goToNextSystem(); mWindow->getViewController()->goToNextGameList();
return true; return true;
}else if(config->isMappedTo("left", input)) }else if(config->isMappedTo("left", input))
{ {
mList.stopScrolling(); mList.stopScrolling();
mWindow->getViewController()->goToPrevSystem(); mWindow->getViewController()->goToPrevGameList();
return true; return true;
} }
} }

View file

@ -0,0 +1,78 @@
#include "SystemListView.h"
#include "../Renderer.h"
#include "../SystemData.h"
#include "../animations/MoveCameraAnimation.h"
#include "../Window.h"
#include "ViewController.h"
SystemListView::SystemListView(Window* window) : GuiComponent(window), mCamera(Eigen::Affine3f::Identity()), mCurrentSystem(NULL)
{
setSize((float)Renderer::getScreenWidth(), (float)Renderer::getScreenHeight());
goToSystem(SystemData::sSystemVector.at(0));
}
void SystemListView::goToSystem(SystemData* system)
{
std::shared_ptr<SystemView> view = getSystemView(system);
mCurrentView = view;
mCurrentSystem = system;
setAnimation(new MoveCameraAnimation(mCamera, view->getPosition()));
}
std::shared_ptr<SystemView> SystemListView::getSystemView(SystemData* system)
{
auto exists = mSystemViews.find(system);
if(exists != mSystemViews.end())
return exists->second;
const std::vector<SystemData*>& sysVec = SystemData::sSystemVector;
int id = std::find(sysVec.begin(), sysVec.end(), system) - sysVec.begin();
std::shared_ptr<SystemView> view = std::shared_ptr<SystemView>(new SystemView(mWindow, system));
view->setPosition(id * (float)Renderer::getScreenWidth(), 0);
mSystemViews[system] = view;
return view;
}
bool SystemListView::input(InputConfig* config, Input input)
{
if(input.value != 0)
{
int id = std::find(SystemData::sSystemVector.begin(), SystemData::sSystemVector.end(), mCurrentSystem) - SystemData::sSystemVector.begin();
if(config->isMappedTo("left", input))
{
id--;
if(id < 0)
id += SystemData::sSystemVector.size();
goToSystem(SystemData::sSystemVector.at(id));
return true;
}
if(config->isMappedTo("right", input))
{
id = (id + 1) % SystemData::sSystemVector.size();
goToSystem(SystemData::sSystemVector.at(id));
return true;
}
if(config->isMappedTo("a", input))
{
mWindow->getViewController()->goToGameList(mCurrentSystem);
return true;
}
}
return GuiComponent::input(config, input);
}
void SystemListView::render(const Eigen::Affine3f& parentTrans)
{
Eigen::Affine3f trans = mCamera * getTransform() * parentTrans;
for(auto it = mSystemViews.begin(); it != mSystemViews.end(); it++)
{
it->second->render(trans);
}
}

View file

@ -0,0 +1,23 @@
#pragma once
#include "SystemView.h"
class SystemListView : public GuiComponent
{
public:
SystemListView(Window* window);
void goToSystem(SystemData* system);
bool input(InputConfig* config, Input input) override;
void render(const Eigen::Affine3f& parentTrans) override;
private:
Eigen::Affine3f mCamera;
std::shared_ptr<SystemView> mCurrentView;
SystemData* mCurrentSystem;
std::shared_ptr<SystemView> getSystemView(SystemData* system);
std::map< SystemData*, std::shared_ptr<SystemView> > mSystemViews;
};

47
src/views/SystemView.cpp Normal file
View file

@ -0,0 +1,47 @@
#include "SystemView.h"
#include "../SystemData.h"
#include "../Renderer.h"
#include "../Log.h"
SystemView::SystemView(Window* window, SystemData* system) : GuiComponent(window),
mSystem(system),
mHeaderImage(window),
mHeaderText(window),
mImage(window)
{
setSize((float)Renderer::getScreenWidth(), (float)Renderer::getScreenHeight());
mHeaderImage.setOrigin(0.5f, 0.0f);
mHeaderImage.setPosition(mSize.x() / 2, 0);
mHeaderImage.setResize(0, mSize.y() * 0.2f, true);
mHeaderText.setSize(mSize.x(), 0);
mHeaderText.setCentered(true);
mImage.setOrigin(0.5f, 0.5f);
mImage.setPosition(mSize.x() / 2, mSize.y() / 2);
addChild(&mImage);
addChild(&mHeaderText);
addChild(&mHeaderImage);
updateData();
}
void SystemView::updateData()
{
// header
if(mSystem->getTheme()->getImage("headerImage").path.empty())
{
// use text
mHeaderImage.setImage("");
mHeaderText.setText(mSystem->getFullName());
}else{
// use image
mHeaderText.setText("");
mHeaderImage.setImage(mSystem->getTheme()->getImage("headerImage").getTexture());
}
mImage.setImage(mSystem->getTheme()->getImage("systemImage").getTexture());
}

23
src/views/SystemView.h Normal file
View file

@ -0,0 +1,23 @@
#pragma once
#include "../GuiComponent.h"
#include "../components/ImageComponent.h"
#include "../components/TextComponent.h"
#include "../components/ScrollableContainer.h"
class SystemData;
class SystemView : public GuiComponent
{
public:
SystemView(Window* window, SystemData* system);
void updateData();
private:
SystemData* mSystem;
TextComponent mHeaderText;
ImageComponent mHeaderImage;
ImageComponent mImage;
};

View file

@ -17,8 +17,9 @@ ViewController::ViewController(Window* window)
void ViewController::goToSystemSelect() void ViewController::goToSystemSelect()
{ {
mState.viewing = SYSTEM_SELECT; mState.viewing = SYSTEM_SELECT;
goToSystem(SystemData::sSystemVector.at(0)); mCurrentView = getSystemListView();
//playViewTransition(); playViewTransition();
LOG(LogInfo) << "going to system select";
} }
SystemData* getSystemCyclic(SystemData* from, bool reverse) SystemData* getSystemCyclic(SystemData* from, bool reverse)
@ -43,7 +44,7 @@ SystemData* getSystemCyclic(SystemData* from, bool reverse)
} }
} }
void ViewController::goToNextSystem() void ViewController::goToNextGameList()
{ {
assert(mState.viewing == SYSTEM); assert(mState.viewing == SYSTEM);
@ -51,10 +52,10 @@ void ViewController::goToNextSystem()
if(system == NULL) if(system == NULL)
return; return;
goToSystem(getSystemCyclic(system, false)); goToGameList(getSystemCyclic(system, false));
} }
void ViewController::goToPrevSystem() void ViewController::goToPrevGameList()
{ {
assert(mState.viewing == SYSTEM); assert(mState.viewing == SYSTEM);
@ -62,15 +63,15 @@ void ViewController::goToPrevSystem()
if(system == NULL) if(system == NULL)
return; return;
goToSystem(getSystemCyclic(system, true)); goToGameList(getSystemCyclic(system, true));
} }
void ViewController::goToSystem(SystemData* system) void ViewController::goToGameList(SystemData* system)
{ {
mState.viewing = SYSTEM; mState.viewing = GAME_LIST;
mState.data.system = system; mState.data.system = system;
mCurrentView = getSystemView(system); mCurrentView = getGameListView(system);
playViewTransition(); playViewTransition();
} }
@ -81,7 +82,7 @@ void ViewController::playViewTransition()
void ViewController::onFileChanged(FileData* file, FileChangeType change) void ViewController::onFileChanged(FileData* file, FileChangeType change)
{ {
for(auto it = mSystemViews.begin(); it != mSystemViews.end(); it++) for(auto it = mGameListViews.begin(); it != mGameListViews.end(); it++)
{ {
it->second->onFileChanged(file, change); it->second->onFileChanged(file, change);
} }
@ -108,11 +109,11 @@ void ViewController::launch(FileData* game, Eigen::Vector3f center)
}); });
} }
std::shared_ptr<GameListView> ViewController::getSystemView(SystemData* system) std::shared_ptr<GameListView> ViewController::getGameListView(SystemData* system)
{ {
//if we already made one, return that one //if we already made one, return that one
auto exists = mSystemViews.find(system); auto exists = mGameListViews.find(system);
if(exists != mSystemViews.end()) if(exists != mGameListViews.end())
return exists->second; return exists->second;
//if we didn't, make it, remember it, and return it //if we didn't, make it, remember it, and return it
@ -146,12 +147,22 @@ std::shared_ptr<GameListView> ViewController::getSystemView(SystemData* system)
std::vector<SystemData*>& sysVec = SystemData::sSystemVector; std::vector<SystemData*>& sysVec = SystemData::sSystemVector;
int id = std::find(sysVec.begin(), sysVec.end(), system) - sysVec.begin(); int id = std::find(sysVec.begin(), sysVec.end(), system) - sysVec.begin();
view->setPosition(id * (float)Renderer::getScreenWidth(), 0); view->setPosition(id * (float)Renderer::getScreenWidth(), (float)Renderer::getScreenHeight() * 2);
mSystemViews[system] = view; mGameListViews[system] = view;
return view; return view;
} }
std::shared_ptr<SystemListView> ViewController::getSystemListView()
{
if(!mSystemListView)
{
mSystemListView = std::shared_ptr<SystemListView>(new SystemListView(mWindow));
mSystemListView->setPosition(0, (float)Renderer::getScreenHeight());
}
return mSystemListView;
}
bool ViewController::input(InputConfig* config, Input input) bool ViewController::input(InputConfig* config, Input input)
@ -180,8 +191,11 @@ void ViewController::render(const Eigen::Affine3f& parentTrans)
Eigen::Vector3f viewStart = trans.inverse().translation(); Eigen::Vector3f viewStart = trans.inverse().translation();
Eigen::Vector3f viewEnd = trans.inverse() * Eigen::Vector3f((float)Renderer::getScreenWidth(), (float)Renderer::getScreenHeight(), 0); Eigen::Vector3f viewEnd = trans.inverse() * Eigen::Vector3f((float)Renderer::getScreenWidth(), (float)Renderer::getScreenHeight(), 0);
// draw systems // draw systemlist
for(auto it = mSystemViews.begin(); it != mSystemViews.end(); it++) mSystemListView->render(trans);
// draw gamelists
for(auto it = mGameListViews.begin(); it != mGameListViews.end(); it++)
{ {
// clipping // clipping
Eigen::Vector3f guiStart = it->second->getPosition(); Eigen::Vector3f guiStart = it->second->getPosition();

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "GameListView.h" #include "GameListView.h"
#include "SystemListView.h"
class SystemData; class SystemData;
@ -10,9 +11,9 @@ public:
ViewController(Window* window); ViewController(Window* window);
// Navigation. // Navigation.
void goToNextSystem(); void goToNextGameList();
void goToPrevSystem(); void goToPrevGameList();
void goToSystem(SystemData* system); void goToGameList(SystemData* system);
void goToSystemSelect(); void goToSystemSelect();
void onFileChanged(FileData* file, FileChangeType change); void onFileChanged(FileData* file, FileChangeType change);
@ -29,14 +30,14 @@ public:
{ {
START_SCREEN, START_SCREEN,
SYSTEM_SELECT, SYSTEM_SELECT,
SYSTEM GAME_LIST
}; };
struct State struct State
{ {
ViewMode viewing; ViewMode viewing;
inline SystemData* getSystem() const { assert(viewing == SYSTEM); return data.system; } inline SystemData* getSystem() const { assert(viewing == GAME_LIST); return data.system; }
private: private:
friend ViewController; friend ViewController;
@ -50,10 +51,12 @@ public:
private: private:
void playViewTransition(); void playViewTransition();
std::shared_ptr<GameListView> getSystemView(SystemData* system); std::shared_ptr<GameListView> getGameListView(SystemData* system);
std::shared_ptr<SystemListView> getSystemListView();
std::shared_ptr<GuiComponent> mCurrentView; std::shared_ptr<GuiComponent> mCurrentView;
std::map< SystemData*, std::shared_ptr<GameListView> > mSystemViews; std::map< SystemData*, std::shared_ptr<GameListView> > mGameListViews;
std::shared_ptr<SystemListView> mSystemListView;
Eigen::Affine3f mCamera; Eigen::Affine3f mCamera;
float mFadeOpacity; float mFadeOpacity;