diff --git a/src/common/Bezel.cxx b/src/common/Bezel.cxx index 37dbb8d60..5a057d780 100644 --- a/src/common/Bezel.cxx +++ b/src/common/Bezel.cxx @@ -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); diff --git a/src/common/Bezel.hxx b/src/common/Bezel.hxx index 435d28575..769b6b6d3 100644 --- a/src/common/Bezel.hxx +++ b/src/common/Bezel.hxx @@ -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. */ diff --git a/src/gui/GameInfoDialog.cxx b/src/gui/GameInfoDialog.cxx index 53464edf6..7f2637ff2 100644 --- a/src/gui/GameInfoDialog.cxx +++ b/src/gui/GameInfoDialog.cxx @@ -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"); diff --git a/src/gui/GameInfoDialog.hxx b/src/gui/GameInfoDialog.hxx index cf19b08fd..5a9b8d718 100644 --- a/src/gui/GameInfoDialog.hxx +++ b/src/gui/GameInfoDialog.hxx @@ -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};