added detected bezel name to GameInfoDialog

This commit is contained in:
thrust26 2024-01-06 10:28:02 +01:00
parent 07f5957294
commit ecdacfb924
4 changed files with 74 additions and 6 deletions

View File

@ -22,6 +22,7 @@
#include "EventHandler.hxx"
#include "FBSurface.hxx"
#include "PNGLibrary.hxx"
#include "PropsSet.hxx"
#include "Bezel.hxx"
@ -33,13 +34,35 @@ Bezel::Bezel(OSystem& osystem)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string Bezel::getName(int& index) const
string Bezel::getName(const string& path, const Properties& props)
{
string imageName;
int index = 1; // skip property name
do
{
imageName = getName(props, index);
if(imageName != EmptyString)
{
// Note: JPG does not support transparency
const string imagePath = path + imageName + ".png";
const FSNode node(imagePath);
if(node.exists())
break;
}
} while(index != -1);
return imageName;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string Bezel::getName(const Properties& props, int& index)
{
if(++index == 1)
return myOSystem.console().properties().get(PropType::Bezel_Name);
return props.get(PropType::Bezel_Name);
// Try to generate bezel name from cart name
const string& cartName = myOSystem.console().properties().get(PropType::Cart_Name);
const string& cartName = props.get(PropType::Cart_Name);
size_t pos = cartName.find_first_of('(');
if(pos == std::string::npos)
pos = cartName.length() + 1;
@ -68,6 +91,12 @@ string Bezel::getName(int& index) const
return "";
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string Bezel::getName(int& index) const
{
return getName(myOSystem.console().properties(), index);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt32 Bezel::borderSize(uInt32 x, uInt32 y, uInt32 size, Int32 step) const
{
@ -141,7 +170,6 @@ bool Bezel::load()
if(settings.getBool("bezel.win.auto"))
{
// Determine transparent window inside bezel image
const uInt32 xCenter = w >> 1;
top = borderSize(xCenter, 0, h, w);
bottom = h - 1 - borderSize(xCenter, h - 1, h, -w);

View File

@ -21,6 +21,7 @@
class OSystem;
class FBSurface;
class FrameBuffer;
class Properties;
#include "Rect.hxx"
@ -109,7 +110,17 @@ class Bezel
*/
void render();
/*
Generate bezel file name.
*/
static string getName(const string& path, const Properties& props);
private:
/*
Generate bezel file name.
*/
static string getName(const Properties& props, int& index);
/*
Generate bezel file name.
*/

View File

@ -421,6 +421,7 @@ void GameInfoDialog::addControllersTab()
void GameInfoDialog::addCartridgeTab()
{
// 4) Cartridge properties
const GUI::Font& ifont = instance().frameBuffer().infoFont();
const int lineHeight = Dialog::lineHeight(),
fontHeight = Dialog::fontHeight(),
VBORDER = Dialog::vBorder(),
@ -495,6 +496,10 @@ void GameInfoDialog::addCartridgeTab()
bw, myBezelName->getHeight(), ELLIPSIS, kBezelFilePressed);
wid.push_back(myBezelButton);
ypos += lineHeight + VGAP;
myBezelDetected = new StaticTextWidget(myTab, ifont, xpos + lwidth, ypos,
"'1234567890123456789012345678901234567' selected");
// Add items for tab 3
addToFocusList(wid, myTab, tabID);
@ -883,7 +888,23 @@ void GameInfoDialog::loadCartridgeProperties(const Properties& props)
myRarity->setText(props.get(PropType::Cart_Rarity));
myNote->setText(props.get(PropType::Cart_Note));
myUrl->setText(props.get(PropType::Cart_Url));
myBezelName->setText(props.get(PropType::Bezel_Name));
bool autoSelected = false;
string bezelName = props.get(PropType::Bezel_Name);
if(bezelName.empty())
{
bezelName = Bezel::getName(instance().bezelDir().getPath(), props);
if(bezelName != "default")
autoSelected = true;
else
bezelName = "";
}
myBezelName->setText(bezelName);
if(autoSelected)
myBezelDetected->setLabel("auto-selected");
else
myBezelDetected->setLabel("");
updateLink();
}
@ -1000,7 +1021,11 @@ void GameInfoDialog::saveProperties()
myGameProperties.set(PropType::Cart_Rarity, myRarity->getText());
myGameProperties.set(PropType::Cart_Note, myNote->getText());
myGameProperties.set(PropType::Cart_Url, myUrl->getText());
myGameProperties.set(PropType::Bezel_Name, myBezelName->getText());
// avoid saving auto-selected bezel names:
if(myBezelName->getText() == Bezel::getName(instance().bezelDir().getPath(), myGameProperties))
myGameProperties.reset(PropType::Bezel_Name);
else
myGameProperties.set(PropType::Bezel_Name, myBezelName->getText());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -1591,7 +1616,10 @@ void GameInfoDialog::handleCommand(CommandSender* sender, int cmd,
BrowserDialog::Mode::FileLoadNoDirs,
[this](bool OK, const FSNode& node) {
if(OK)
{
myBezelName->setText(node.getNameWithExt(""));
myBezelDetected->setLabel("");
}
},
[](const FSNode& node) {
return BSPF::endsWithIgnoreCase(node.getName(), ".png");

View File

@ -141,6 +141,7 @@ class GameInfoDialog : public Dialog, public CommandSender
ButtonWidget* myUrlButton{nullptr};
EditTextWidget* myBezelName{nullptr};
ButtonWidget* myBezelButton{nullptr};
StaticTextWidget* myBezelDetected{nullptr};
// High Scores properties
CheckboxWidget* myHighScores{nullptr};