aboutsummaryrefslogtreecommitdiff
path: root/gui/unknown-game-dialog.cpp
diff options
context:
space:
mode:
authorBastien Bouclet2019-05-03 20:48:06 +0200
committerFilippos Karapetis2019-05-12 11:44:51 +0300
commitc5b92bcb2eae79b13991b51954b46f06fa9e5bf2 (patch)
tree32bbffdad2533aa2e786d9367c63e3aad294d51b /gui/unknown-game-dialog.cpp
parente2f68e24035245ec0f453c49b28207d32def4789 (diff)
downloadscummvm-rg350-c5b92bcb2eae79b13991b51954b46f06fa9e5bf2.tar.gz
scummvm-rg350-c5b92bcb2eae79b13991b51954b46f06fa9e5bf2.tar.bz2
scummvm-rg350-c5b92bcb2eae79b13991b51954b46f06fa9e5bf2.zip
GUI: Better integration for the unknown game dialog when adding games
* The list of candidates now includes unknown variants. When an unknown variant is selected, the unknown game dialog is shown. * On the unknown game dialog, users are given the choice to add the game when that is possible, or to cancel. The goal of those changes is to make the unknown game dialog less confusing for users, especially when both known and unknown games variants are found.
Diffstat (limited to 'gui/unknown-game-dialog.cpp')
-rw-r--r--gui/unknown-game-dialog.cpp71
1 files changed, 35 insertions, 36 deletions
diff --git a/gui/unknown-game-dialog.cpp b/gui/unknown-game-dialog.cpp
index d96791742e..0aa8cc5750 100644
--- a/gui/unknown-game-dialog.cpp
+++ b/gui/unknown-game-dialog.cpp
@@ -38,14 +38,21 @@ enum {
kCopyToClipboard = 'cpcl',
kOpenBugtrackerURL = 'ourl',
kClose = 'clse',
+ kAddAnyway = 'adda',
kScrollContainerReflow = 'SCRf'
};
-UnknownGameDialog::UnknownGameDialog(const DetectionResults &detectionResults) :
+UnknownGameDialog::UnknownGameDialog(const DetectedGame &detectedGame) :
Dialog(30, 20, 260, 124),
- _detectionResults(detectionResults) {
+ _detectedGame(detectedGame) {
// For now place the buttons with a default place and size. They will be resized and moved when rebuild() is called.
- _closeButton = new ButtonWidget(this, 0, 0, 0, 0, _("Close"), 0, kClose);
+ _closeButton = new ButtonWidget(this, 0, 0, 0, 0, detectedGame.canBeAdded ? _("Cancel") : _("Close"), 0, kClose);
+
+ if (detectedGame.canBeAdded) {
+ _addAnywayButton = new ButtonWidget(this, 0, 0, 0, 0, _("Add anyway"), 0, kAddAnyway);
+ } else {
+ _addAnywayButton = nullptr;
+ }
//Check if we have clipboard functionality
if (g_system->hasFeature(OSystem::kFeatureClipboardSupport)) {
@@ -76,6 +83,8 @@ void UnknownGameDialog::reflowLayout() {
}
void UnknownGameDialog::rebuild() {
+ // TODO: Use a theme layout dialog definition
+
// First remove the old text widgets
for (uint i = 0; i < _textWidgets.size() ; i++) {
_textContainer->removeWidget(_textWidgets[i]);
@@ -91,7 +100,7 @@ void UnknownGameDialog::rebuild() {
int buttonHeight = g_gui.xmlEval()->getVar("Globals.Button.Height", 0);
int buttonWidth = g_gui.xmlEval()->getVar("Globals.Button.Width", 0);
- Common::String reportTranslated = _detectionResults.generateUnknownGameReport(true);
+ Common::String reportTranslated = generateUnknownGameReport(_detectedGame, true, true);
// Check if we have clipboard functionality and expand the reportTranslated message if needed...
if (g_system->hasFeature(OSystem::kFeatureClipboardSupport)) {
@@ -116,7 +125,9 @@ void UnknownGameDialog::rebuild() {
_h = MIN(screenH - 20, lineCount * kLineHeight + kLineHeight + buttonHeight + 24);
int closeButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_closeButton->getLabel()) + 10);
- int copyToClipboardButtonWidth = 0, openBugtrackerURLButtonWidth = 0, totalButtonWidth = closeButtonWidth;
+ int copyToClipboardButtonWidth = 0, openBugtrackerURLButtonWidth = 0, addAnywayButtonWidth = 0;
+ int totalButtonWidth = closeButtonWidth;
+
if (_copyToClipboardButton) {
copyToClipboardButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_copyToClipboardButton->getLabel()) + 10);
totalButtonWidth += copyToClipboardButtonWidth + 10;
@@ -125,6 +136,10 @@ void UnknownGameDialog::rebuild() {
openBugtrackerURLButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_openBugTrackerUrlButton->getLabel()) + 10);
totalButtonWidth += openBugtrackerURLButtonWidth + 10;
}
+ if (_addAnywayButton) {
+ addAnywayButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_addAnywayButton->getLabel()) + 10);
+ totalButtonWidth += addAnywayButtonWidth + 10;
+ }
_w = MAX(MAX(maxlineWidth, 0) + 16 + scrollbarWidth, totalButtonWidth) + 20;
@@ -133,7 +148,12 @@ void UnknownGameDialog::rebuild() {
_y = (g_system->getOverlayHeight() - _h) / 2;
// Now move the buttons and text container to their proper place
- int buttonPos = _w - closeButtonWidth - 10;
+ int buttonPos = _w - 10;
+ if (_addAnywayButton) {
+ buttonPos -= addAnywayButtonWidth + 5;
+ _addAnywayButton->resize(buttonPos, _h - buttonHeight - 8, addAnywayButtonWidth, buttonHeight);
+ }
+ buttonPos -= closeButtonWidth + 5;
_closeButton->resize(buttonPos, _h - buttonHeight - 8, closeButtonWidth, buttonHeight);
if (_copyToClipboardButton) {
buttonPos -= copyToClipboardButtonWidth + 5;
@@ -156,7 +176,7 @@ void UnknownGameDialog::rebuild() {
}
}
-Common::String UnknownGameDialog::encodeUrlString(const Common::String& string) {
+Common::String UnknownGameDialog::encodeUrlString(const Common::String &string) {
Common::String encoded;
for (uint i = 0 ; i < string.size() ; ++i) {
char c = string[i];
@@ -170,34 +190,10 @@ Common::String UnknownGameDialog::encodeUrlString(const Common::String& string)
}
Common::String UnknownGameDialog::generateBugtrackerURL() {
- Common::String report = _detectionResults.generateUnknownGameReport(false);
- // Remove the filesystem path from the bugtracker report.
- // The path is on the first line between single quotes. We strip everything except the last level.
- int path_start = -1, path_size = 0;
- for (uint i = 0 ; i < report.size() ; ++i) {
- char c = report[i];
- if (c == '\'') {
- if (path_start == -1)
- path_start = i + 1;
- else
- break;
- } else if (path_start != -1 && (c == '/' || c == '\\')) {
- path_size = 1 + i - path_start;
- } else if (c == '\n') {
- path_size = 0;
- break;
- }
- }
- if (path_size > 0)
- report.erase(path_start, path_size);
+ Common::String report = generateUnknownGameReport(_detectedGame, false, false);
report = encodeUrlString(report);
- // Pass engine name if there is only one.
- Common::String engineName = "unknown";
- Common::StringArray engines = _detectionResults.getUnknownGameEngines();
- if (engines.size() == 1)
- engineName = engines.front();
- engineName = encodeUrlString(engineName);
+ Common::String engineName = encodeUrlString(_detectedGame.engineName);
return Common::String::format(
"https://www.scummvm.org/unknowngame?"
@@ -210,8 +206,7 @@ Common::String UnknownGameDialog::generateBugtrackerURL() {
void UnknownGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
switch(cmd) {
case kCopyToClipboard: {
- // TODO: Remove the filesystem path from the report
- Common::String report = _detectionResults.generateUnknownGameReport(false);
+ Common::String report = generateUnknownGameReport(_detectedGame, false, false);
if (g_system->setTextInClipboard(report)) {
g_system->displayMessageOnOSD(
@@ -222,8 +217,12 @@ void UnknownGameDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32
break;
}
case kClose:
+ // The user cancelled adding the game
+ setResult(-1);
+ close();
+ break;
+ case kAddAnyway:
// When the detection entry comes from the fallback detector, the game can be added / launched anyways.
- // TODO: Add a button to cancel adding the game. And make it clear that launching the game may not work properly.
close();
break;
case kOpenBugtrackerURL: