Moved the fast select GUI to nine patches.

Luckily, no one ever used it anyway.
This commit is contained in:
Aloshi 2013-09-14 12:32:21 -05:00
parent b0d156d6bd
commit d7a6cae4ce
7 changed files with 43 additions and 57 deletions

View file

@ -63,11 +63,13 @@ If EmulationStation is running in "basic" mode, it will try to use `<themeBasic>
Components
==========
A theme is made up of components, which have various types. At the moment, the only type is `image`. Components are rendered in the order they are defined - that means you'll want to define the background first, a header image second, etc.
The "image" component
=====================
Used to display an image.
`<path>` - path to the image file. Most common file types are supported, and . and ~ are properly expanded.
@ -83,6 +85,7 @@ Used to display an image.
Display tags
============
Display tags define some "meta" display attributes about your theme. Display tags must be at the root of the `<theme>` tree - for example, they can't be inside a component tag. They are not required.
@ -124,23 +127,11 @@ Display tags define some "meta" display attributes about your theme. Display tag
**Fast Select box attributes:**
`<fastSelectColor>` - the hex color to use for the letter display on the Fast Select box.
`<fastSelectColor>` - the hex color to use for the letter display on the fast select box.
`<boxBackground>` - path to a background image file. ~ and . are expanded.
`<fastSelectFrame>` - the path to a "nine patch" image to use for the "background" of the fast select box. See the "Nine Patches" section for more info.
`<boxBackgroundTiled />` - if present, the background will be tiled instead of stretched.
`<boxHorizontal>` - path to the "left" border image file. It will be flipped for the right border. ~ and . are expanded.
`<boxHorizontalTiled />` - if present, the horizontal image will be tiled instead of stretched downwards.
`<boxVertical>` - path to the "top" border image file. It will be flipped for the bottom border. ~ and . are expanded.
`<boxVerticalTiled />` - if present, the vertical image will be tiled instead of stretched to the right.
`<boxCorner>` - path to the "top left corner" image file. It will be flipped for the top right, bottom right, and bottom left corners. ~ and . are expanded.
There is also a `<fastSelectFont>` font tag (see the Fonts section for more info).
`<fastSelectFont>` - font definition to use for the fast select letter. See the "Fonts" section for more info.
Fonts
@ -157,7 +148,7 @@ Fonts are defined like so:
You can leave off any tags you don't want to use, and they'll use the default. Size is defined as a percentage of the screen height. "." and "~" are expanded for paths.
NOTE: If your font size is too big, it'll overrun the maximum texture size.
NOTE: If your font size is too big, it'll overrun the maximum OpenGL texture size. ES will attempt to rasterize it in progressively smaller sizes until one fits, then upscale it.
**Font tags:**
@ -167,6 +158,7 @@ NOTE: If your font size is too big, it'll overrun the maximum texture size.
`<fastSelectFont>` - font to use for the fast select letter.
Audio
=====
@ -181,6 +173,12 @@ Themes can also define menu sounds. These tags go in the root of the `<theme>` t
`<menuOpenSound>` - path to the sound to play when the user opens a menu (either the "main menu" or the fast select menu).
Nine Patches
============
EmulationStation borrows the concept of "nine patches" from Android (or "9-Slices"). Currently the implementation is very simple and hard-coded to only use 48x48px images (16x16px for each "patch"). Check the `data/resources` directory for some examples (button.png, frame.png).
List of variables
=================

View file

@ -164,7 +164,7 @@ bool InputManager::parseEvent(const SDL_Event& ev)
return true;
}
if(ev.key.repeat && !SDL_IsTextInputActive())
if(ev.key.repeat)
return false;
if(ev.key.keysym.sym == SDLK_F4)

View file

@ -3,12 +3,14 @@
#include <iostream>
#include "GuiGameList.h"
#define DEFAULT_FS_IMAGE ":/frame.png"
const std::string GuiFastSelect::LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const int GuiFastSelect::SCROLLSPEED = 100;
const int GuiFastSelect::SCROLLDELAY = 507;
GuiFastSelect::GuiFastSelect(Window* window, GuiGameList* parent, TextListComponent<FileData*>* list, char startLetter, ThemeComponent * theme)
: GuiComponent(window), mParent(parent), mList(list), mTheme(theme)
: GuiComponent(window), mParent(parent), mList(list), mTheme(theme), mBox(mWindow, "")
{
mLetterID = LETTERS.find(toupper(startLetter));
if(mLetterID == std::string::npos)
@ -22,27 +24,34 @@ GuiFastSelect::GuiFastSelect(Window* window, GuiGameList* parent, TextListCompon
mScrollOffset = 0;
unsigned int sw = Renderer::getScreenWidth(), sh = Renderer::getScreenHeight();
mBox = new GuiBox(window, sw * 0.2f, sh * 0.2f, sw * 0.6f, sh * 0.6f);
mBox->setData(mTheme->getBoxData());
if(theme->getString("fastSelectFrame").empty())
{
mBox.setImagePath(DEFAULT_FS_IMAGE);
//mBox.setEdgeColor(0x0096ffFF);
mBox.setEdgeColor(0x005493FF);
mBox.setCenterColor(0x5e5e5eFF);
}else{
mBox.setImagePath(theme->getString("fastSelectFrame"));
}
mBox.setPosition(sw * 0.2f, sh * 0.2f);
mBox.setSize(sw * 0.6f, sh * 0.6f);
}
GuiFastSelect::~GuiFastSelect()
{
mParent->updateDetailData();
delete mBox;
}
void GuiFastSelect::render(const Eigen::Affine3f& parentTrans)
{
Eigen::Affine3f trans = parentTrans * getTransform();
Renderer::setMatrix(trans);
unsigned int sw = Renderer::getScreenWidth(), sh = Renderer::getScreenHeight();
if(!mBox->hasBackground())
Renderer::drawRect((int)(sw * 0.3f), (int)(sh * 0.3f), (int)(sw * 0.4f), (int)(sh * 0.4f), 0x000FF0AA);
mBox->render(trans);
mBox.render(trans);
Renderer::setMatrix(trans);
std::shared_ptr<Font> letterFont = mTheme->getFastSelectFont();

View file

@ -7,7 +7,7 @@
#include "../Sound.h"
#include "ThemeComponent.h"
#include "TextListComponent.h"
#include "GuiBox.h"
#include "NinePatchComponent.h"
class GuiGameList;
@ -30,19 +30,19 @@ private:
void scroll();
void setLetterID(int id);
GuiGameList* mParent;
TextListComponent<FileData*>* mList;
ThemeComponent * mTheme;
NinePatchComponent mBox;
size_t mLetterID;
GuiGameList* mParent;
GuiBox* mBox;
int mTextColor;
unsigned int mTextColor;
int mScrollTimer, mScrollOffset;
bool mScrolling;
std::shared_ptr<Sound> mScrollSound;
ThemeComponent * mTheme;
};
#endif

View file

@ -124,7 +124,7 @@ void NinePatchComponent::buildVertices()
void NinePatchComponent::render(const Eigen::Affine3f& parentTrans)
{
Eigen::Affine3f trans = parentTrans * getTransform();
if(mTexture)
if(mTexture && mVertices != NULL)
{
Renderer::setMatrix(trans);

View file

@ -33,8 +33,6 @@ std::string ThemeComponent::getString(std::string name)
return mStringMap[name];
}
GuiBoxData ThemeComponent::getBoxData() { return mBoxData; }
std::shared_ptr<Font> ThemeComponent::getListFont()
{
if(mListFont)
@ -108,14 +106,7 @@ void ThemeComponent::setDefaults()
mSoundMap["menuOpen"]->loadFile("");
mStringMap["imageNotFoundPath"] = "";
mBoxData.backgroundPath = "";
mBoxData.backgroundTiled = false;
mBoxData.horizontalPath = "";
mBoxData.horizontalTiled = false;
mBoxData.verticalPath = "";
mBoxData.verticalTiled = false;
mBoxData.cornerPath = "";
mStringMap["fastSelectFrame"] = "";
mListFont.reset();
mDescFont.reset();
@ -189,15 +180,6 @@ void ThemeComponent::readXML(std::string path, bool detailed)
mBoolMap["hideHeader"] = root.child("hideHeader") != 0;
mBoolMap["hideDividers"] = root.child("hideDividers") != 0;
//GuiBox theming data
mBoxData.backgroundPath = expandPath(root.child("boxBackground").text().get());
mBoxData.backgroundTiled = root.child("boxBackgroundTiled") != 0;
mBoxData.horizontalPath = expandPath(root.child("boxHorizontal").text().get());
mBoxData.horizontalTiled = root.child("boxHorizontalTiled") != 0;
mBoxData.verticalPath = expandPath(root.child("boxVertical").text().get());
mBoxData.verticalTiled = root.child("boxVerticalTiled") != 0;
mBoxData.cornerPath = expandPath(root.child("boxCorner").text().get());
//list stuff
mBoolMap["listCentered"] = !root.child("listLeftAlign");
mFloatMap["listOffsetX"] = strToFloat(root.child("listOffsetX").text().get(), mFloatMap["listOffsetX"]);
@ -221,6 +203,7 @@ void ThemeComponent::readXML(std::string path, bool detailed)
mFloatMap["gameImageOriginY"] = resolveExp(artOriginY, mFloatMap["gameImageOriginY"]);
mStringMap["imageNotFoundPath"] = expandPath(root.child("gameImageNotFound").text().get());
mStringMap["fastSelectFrame"] = expandPath(root.child("fastSelectFrame").text().get());
//sounds
mSoundMap["menuScroll"]->loadFile(expandPath(root.child("menuScrollSound").text().get()));

View file

@ -18,8 +18,6 @@ public:
void readXML(std::string path, bool detailed);
GuiBoxData getBoxData();
unsigned int getColor(std::string name);
bool getBool(std::string name);
float getFloat(std::string name);
@ -52,8 +50,6 @@ private:
std::map<std::string, std::shared_ptr<Sound>> mSoundMap;
std::map<std::string, std::string> mStringMap;
GuiBoxData mBoxData;
std::shared_ptr<Font> mListFont;
std::shared_ptr<Font> mDescFont;
std::shared_ptr<Font> mFastSelectFont;