Added developer, publisher, genre, and number of players metadata.

Updated TheGamesDB scraper to retrieve said metadata, still need to do the
archive.vg scraper.
TextComponent now abbreviates text if the component's size is single-line and the text is too long.
DateTimeComponent now correctly updates its size.
This commit is contained in:
Aloshi 2014-01-19 17:22:26 -06:00
parent 640493e0a6
commit 43972c5be9
6 changed files with 90 additions and 20 deletions

View file

@ -8,14 +8,18 @@
MetaDataDecl gameDecls[] = { MetaDataDecl gameDecls[] = {
{"name", MD_STRING, "", false}, {"name", MD_STRING, "", false},
{"desc", MD_MULTILINE_STRING, "", false}, {"desc", MD_MULTILINE_STRING, "", false},
{"image", MD_IMAGE_PATH, "", false}, {"image", MD_IMAGE_PATH, "", false},
{"thumbnail", MD_IMAGE_PATH, "", false}, {"thumbnail", MD_IMAGE_PATH, "", false},
{"rating", MD_RATING, "0", false}, {"rating", MD_RATING, "0", false},
{"releasedate", MD_DATE, "0", false}, {"releasedate", MD_DATE, "0", false},
{"playcount", MD_INT, "0", true}, {"developer", MD_STRING, "unknown", false},
{"lastplayed", MD_TIME, "0", true} {"publisher", MD_STRING, "unknown", false},
{"genre", MD_STRING, "unknown", false},
{"players", MD_INT, "1", false},
{"playcount", MD_INT, "0", true},
{"lastplayed", MD_TIME, "0", true}
}; };
const std::vector<MetaDataDecl> gameMDD(gameDecls, gameDecls + sizeof(gameDecls) / sizeof(gameDecls[0])); const std::vector<MetaDataDecl> gameMDD(gameDecls, gameDecls + sizeof(gameDecls) / sizeof(gameDecls[0]));

View file

@ -245,6 +245,7 @@ void DateTimeComponent::updateTextCache()
const std::string dispString = getDisplayString(mode); const std::string dispString = getDisplayString(mode);
std::shared_ptr<Font> font = getFont(); std::shared_ptr<Font> font = getFont();
mTextCache = std::unique_ptr<TextCache>(font->buildTextCache(dispString, 0, 0, mColor)); mTextCache = std::unique_ptr<TextCache>(font->buildTextCache(dispString, 0, 0, mColor));
setSize(mTextCache->metrics.size);
//set up cursor positions //set up cursor positions
mCursorBoxes.clear(); mCursorBoxes.clear();

View file

@ -80,8 +80,6 @@ void TextComponent::render(const Eigen::Affine3f& parentTrans)
if(font && !mText.empty()) if(font && !mText.empty())
{ {
Renderer::setMatrix(trans);
if(mCentered) if(mCentered)
{ {
const Eigen::Vector2f& textSize = mTextCache->metrics.size; const Eigen::Vector2f& textSize = mTextCache->metrics.size;
@ -90,6 +88,8 @@ void TextComponent::render(const Eigen::Affine3f& parentTrans)
Eigen::Affine3f centeredTrans = trans; Eigen::Affine3f centeredTrans = trans;
centeredTrans = centeredTrans.translate(Eigen::Vector3f(pos.x(), pos.y(), 0)); centeredTrans = centeredTrans.translate(Eigen::Vector3f(pos.x(), pos.y(), 0));
Renderer::setMatrix(centeredTrans); Renderer::setMatrix(centeredTrans);
}else{
Renderer::setMatrix(trans);
} }
font->renderTextCache(mTextCache.get()); font->renderTextCache(mTextCache.get());
@ -118,7 +118,27 @@ void TextComponent::onTextChanged()
calculateExtent(); calculateExtent();
std::shared_ptr<Font> f = getFont(); std::shared_ptr<Font> f = getFont();
mTextCache = std::shared_ptr<TextCache>(f->buildTextCache(f->wrapText(mText, mSize.x()), 0, 0, (mColor >> 8 << 8) | mOpacity)); const bool wrap = (mSize.y() == 0 || (int)mSize.y() > f->getHeight());
Eigen::Vector2f size = f->sizeText(mText);
if(!wrap && mSize.x() && mText.size() && size.x() > mSize.x())
{
// abbreviate text
const std::string abbrev = "..";
Eigen::Vector2f abbrevSize = f->sizeText(abbrev);
std::string text = mText;
while(text.size() && size.x() + abbrevSize.x() > mSize.x())
{
text.erase(text.size() - 1, 1);
size = f->sizeText(text);
}
text.append(abbrev);
mTextCache = std::shared_ptr<TextCache>(f->buildTextCache(text, 0, 0, (mColor >> 8 << 8) | mOpacity));
}else{
mTextCache = std::shared_ptr<TextCache>(f->buildTextCache(f->wrapText(mText, mSize.x()), 0, 0, (mColor >> 8 << 8) | mOpacity));
}
} }
void TextComponent::onColorChanged() void TextComponent::onColorChanged()

View file

@ -106,6 +106,11 @@ std::vector<MetaDataList> GamesDBScraper::parseReq(ScraperSearchParams params, s
boost::posix_time::ptime rd = string_to_ptime(game.child("ReleaseDate").text().get(), "%m/%d/%Y"); boost::posix_time::ptime rd = string_to_ptime(game.child("ReleaseDate").text().get(), "%m/%d/%Y");
mdl.back().setTime("releasedate", rd); mdl.back().setTime("releasedate", rd);
mdl.back().set("developer", game.child("Developer").text().get());
mdl.back().set("publisher", game.child("Publisher").text().get());
mdl.back().set("genre", game.child("Genres").first_child().text().get());
mdl.back().set("players", game.child("Players").text().get());
if(Settings::getInstance()->getBool("ScrapeRatings") && game.child("Rating")) if(Settings::getInstance()->getBool("ScrapeRatings") && game.child("Rating"))
{ {
float ratingVal = (game.child("Rating").text().as_int() / 10.0f); float ratingVal = (game.child("Rating").text().as_int() / 10.0f);

View file

@ -7,8 +7,11 @@ DetailedGameListView::DetailedGameListView(Window* window, FileData* root) :
mDescContainer(window), mDescription(window), mDescContainer(window), mDescription(window),
mImage(window), mImage(window),
mLblRating(window), mLblReleaseDate(window), mLblLastPlayed(window), mLblPlayCount(window), mLblRating(window), mLblReleaseDate(window), mLblDeveloper(window), mLblPublisher(window),
mRating(window), mReleaseDate(window), mLastPlayed(window), mPlayCount(window) mLblGenre(window), mLblPlayers(window), mLblLastPlayed(window), mLblPlayCount(window),
mRating(window), mReleaseDate(window), mDeveloper(window), mPublisher(window),
mGenre(window), mPlayers(window), mLastPlayed(window), mPlayCount(window)
{ {
//mHeaderImage.setPosition(mSize.x() * 0.25f, 0); //mHeaderImage.setPosition(mSize.x() * 0.25f, 0);
@ -32,6 +35,18 @@ DetailedGameListView::DetailedGameListView(Window* window, FileData* root) :
mLblReleaseDate.setText("Released: "); mLblReleaseDate.setText("Released: ");
addChild(&mLblReleaseDate); addChild(&mLblReleaseDate);
addChild(&mReleaseDate); addChild(&mReleaseDate);
mLblDeveloper.setText("Developer: ");
addChild(&mLblDeveloper);
addChild(&mDeveloper);
mLblPublisher.setText("Publisher: ");
addChild(&mLblPublisher);
addChild(&mPublisher);
mLblGenre.setText("Genre: ");
addChild(&mLblGenre);
addChild(&mGenre);
mLblPlayers.setText("Players: ");
addChild(&mLblPlayers);
addChild(&mPlayers);
mLblLastPlayed.setText("Last played: "); mLblLastPlayed.setText("Last played: ");
addChild(&mLblLastPlayed); addChild(&mLblLastPlayed);
mLastPlayed.setDisplayMode(DateTimeComponent::DISP_RELATIVE_TO_NOW); mLastPlayed.setDisplayMode(DateTimeComponent::DISP_RELATIVE_TO_NOW);
@ -64,9 +79,10 @@ void DetailedGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& them
initMDLabels(); initMDLabels();
std::vector<TextComponent*> labels = getMDLabels(); std::vector<TextComponent*> labels = getMDLabels();
assert(labels.size() == 4); assert(labels.size() == 8);
const char* lblElements[4] = { const char* lblElements[8] = {
"md_lbl_rating", "md_lbl_releasedate", "md_lbl_lastplayed", "md_lbl_playcount" "md_lbl_rating", "md_lbl_releasedate", "md_lbl_developer", "md_lbl_publisher",
"md_lbl_genre", "md_lbl_players", "md_lbl_lastplayed", "md_lbl_playcount"
}; };
for(unsigned int i = 0; i < labels.size(); i++) for(unsigned int i = 0; i < labels.size(); i++)
@ -77,9 +93,10 @@ void DetailedGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& them
initMDValues(); initMDValues();
std::vector<GuiComponent*> values = getMDValues(); std::vector<GuiComponent*> values = getMDValues();
assert(values.size() == 4); assert(values.size() == 8);
const char* valElements[4] = { const char* valElements[8] = {
"md_rating", "md_releasedate", "md_lastplayed", "md_playcount" "md_rating", "md_releasedate", "md_developer", "md_publisher",
"md_genre", "md_players", "md_lastplayed", "md_playcount"
}; };
for(unsigned int i = 0; i < values.size(); i++) for(unsigned int i = 0; i < values.size(); i++)
@ -134,14 +151,21 @@ void DetailedGameListView::initMDValues()
std::shared_ptr<Font> defaultFont = Font::get(FONT_SIZE_SMALL); std::shared_ptr<Font> defaultFont = Font::get(FONT_SIZE_SMALL);
mRating.setSize(defaultFont->getHeight() * 5.0f, (float)defaultFont->getHeight()); mRating.setSize(defaultFont->getHeight() * 5.0f, (float)defaultFont->getHeight());
mReleaseDate.setFont(defaultFont); mReleaseDate.setFont(defaultFont);
mDeveloper.setFont(defaultFont);
mPublisher.setFont(defaultFont);
mGenre.setFont(defaultFont);
mPlayers.setFont(defaultFont);
mLastPlayed.setFont(defaultFont); mLastPlayed.setFont(defaultFont);
mPlayCount.setFont(defaultFont); mPlayCount.setFont(defaultFont);
float bottom = 0.0f; float bottom = 0.0f;
const float colSize = (mSize.x() * 0.48f) / 2;
for(unsigned int i = 0; i < labels.size(); i++) for(unsigned int i = 0; i < labels.size(); i++)
{ {
const float heightDiff = (labels[i]->getSize().y() - values[i]->getSize().y()) / 2; const float heightDiff = (labels[i]->getSize().y() - values[i]->getSize().y()) / 2;
values[i]->setPosition(labels[i]->getPosition() + Vector3f(labels[i]->getSize().x(), heightDiff, 0)); values[i]->setPosition(labels[i]->getPosition() + Vector3f(labels[i]->getSize().x(), heightDiff, 0));
values[i]->setSize(colSize - labels[i]->getSize().x(), values[i]->getSize().y());
float testBot = values[i]->getPosition().y() + values[i]->getSize().y(); float testBot = values[i]->getPosition().y() + values[i]->getSize().y();
if(testBot > bottom) if(testBot > bottom)
@ -164,6 +188,10 @@ void DetailedGameListView::updateInfoPanel()
mImage.setImage(file->metadata.get("image")); mImage.setImage(file->metadata.get("image"));
mRating.setValue(file->metadata.get("rating")); mRating.setValue(file->metadata.get("rating"));
mReleaseDate.setValue(file->metadata.get("releasedate")); mReleaseDate.setValue(file->metadata.get("releasedate"));
mDeveloper.setValue(file->metadata.get("developer"));
mPublisher.setValue(file->metadata.get("publisher"));
mGenre.setValue(file->metadata.get("genre"));
mPlayers.setValue(file->metadata.get("players"));
mLastPlayed.setValue(file->metadata.get("lastplayed")); mLastPlayed.setValue(file->metadata.get("lastplayed"));
mPlayCount.setValue(file->metadata.get("playcount")); mPlayCount.setValue(file->metadata.get("playcount"));
@ -187,6 +215,10 @@ std::vector<TextComponent*> DetailedGameListView::getMDLabels()
std::vector<TextComponent*> ret; std::vector<TextComponent*> ret;
ret.push_back(&mLblRating); ret.push_back(&mLblRating);
ret.push_back(&mLblReleaseDate); ret.push_back(&mLblReleaseDate);
ret.push_back(&mLblDeveloper);
ret.push_back(&mLblPublisher);
ret.push_back(&mLblGenre);
ret.push_back(&mLblPlayers);
ret.push_back(&mLblLastPlayed); ret.push_back(&mLblLastPlayed);
ret.push_back(&mLblPlayCount); ret.push_back(&mLblPlayCount);
return ret; return ret;
@ -197,6 +229,10 @@ std::vector<GuiComponent*> DetailedGameListView::getMDValues()
std::vector<GuiComponent*> ret; std::vector<GuiComponent*> ret;
ret.push_back(&mRating); ret.push_back(&mRating);
ret.push_back(&mReleaseDate); ret.push_back(&mReleaseDate);
ret.push_back(&mDeveloper);
ret.push_back(&mPublisher);
ret.push_back(&mGenre);
ret.push_back(&mPlayers);
ret.push_back(&mLastPlayed); ret.push_back(&mLastPlayed);
ret.push_back(&mPlayCount); ret.push_back(&mPlayCount);
return ret; return ret;

View file

@ -25,10 +25,14 @@ private:
ImageComponent mImage; ImageComponent mImage;
TextComponent mLblRating, mLblReleaseDate, mLblLastPlayed, mLblPlayCount; TextComponent mLblRating, mLblReleaseDate, mLblDeveloper, mLblPublisher, mLblGenre, mLblPlayers, mLblLastPlayed, mLblPlayCount;
RatingComponent mRating; RatingComponent mRating;
DateTimeComponent mReleaseDate; DateTimeComponent mReleaseDate;
TextComponent mDeveloper;
TextComponent mPublisher;
TextComponent mGenre;
TextComponent mPlayers;
DateTimeComponent mLastPlayed; DateTimeComponent mLastPlayed;
TextComponent mPlayCount; TextComponent mPlayCount;