diff --git a/engines/advancedDetector.cpp b/engines/advancedDetector.cpp index 0d01656cc8f..dbe2cdfd68d 100644 --- a/engines/advancedDetector.cpp +++ b/engines/advancedDetector.cpp @@ -357,6 +357,7 @@ void AdvancedMetaEngine::reportUnknown(const Common::FSNode &path, const ADFileP report += "\n\n"; reportTranslated += "\n\n"; + reportTranslated.wordWrap(65); Common::String reportLog = report; reportLog.wordWrap(80); diff --git a/engines/unknown-game-dialog.cpp b/engines/unknown-game-dialog.cpp index 9bcb68c53bf..c0673f4a031 100644 --- a/engines/unknown-game-dialog.cpp +++ b/engines/unknown-game-dialog.cpp @@ -58,14 +58,44 @@ UnknownGameDialog::UnknownGameDialog(const Common::String &reportData, const Com } #endif - // For now place the buttons with a default place and size. They will be resized and moved when rebuild() is called. - _closeButton = new GUI::ButtonWidget(this, 0, 0, 0, 0, _("Close"), 0, kClose); + const int screenW = g_system->getOverlayWidth(); + const int screenH = g_system->getOverlayHeight(); + + int buttonWidth = g_gui.xmlEval()->getVar("Globals.Button.Width", 0); + int buttonHeight = g_gui.xmlEval()->getVar("Globals.Button.Height", 0); + + //Calculate the size the dialog needs + // We use a ScrollContainer to display the text, with a 2 * 8 pixels margin to the dialog border, + // the scrollbar, and 2 * 10 margin for the text in the container. + // We also keep 2 * 10 pixels between the screen border and the dialog. + int scrollbarWidth = g_gui.xmlEval()->getVar("Globals.Scrollbar.Width", 0); + Common::Array lines; + int maxlineWidth = g_gui.getFont().wordWrapText(_reportTranslated, screenW - 2 * 20 - 16 - scrollbarWidth, lines); + + int lineCount = lines.size() + 1; + + _h = MIN(screenH - 20, lineCount * kLineHeight + kLineHeight + buttonHeight + 24); + + // Buttons + int closeButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_("Close")) + 10); + int copyToClipboardButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_("Copy to clipboard")) + 10); + int openBugtrackerURLButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_("Report game")) + 10); + int totalButtonWidth = closeButtonWidth; + if (g_system->hasFeature(OSystem::kFeatureClipboardSupport)) + totalButtonWidth += 10 + copyToClipboardButtonWidth; + if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) + totalButtonWidth += 10 + openBugtrackerURLButtonWidth; + + _w = MAX(MAX(maxlineWidth, 0) + 16 + scrollbarWidth, totalButtonWidth) + 20; + + int buttonPos = _w - closeButtonWidth - 10; + new GUI::ButtonWidget(this, buttonPos, _h - buttonHeight - 8, buttonWidth, buttonHeight, _("Close"), 0, kClose); //Check if we have clipboard functionality if (g_system->hasFeature(OSystem::kFeatureClipboardSupport)) { - _copyToClipboardButton = new GUI::ButtonWidget(this, 0, 0, 0, 0, _("Copy to clipboard"), 0, kCopyToClipboard); - } else - _copyToClipboardButton = nullptr; + buttonPos -= copyToClipboardButtonWidth + 5; + new GUI::ButtonWidget(this, buttonPos, _h - buttonHeight - 8, copyToClipboardButtonWidth, buttonHeight, _("Copy to clipboard"), 0, kCopyToClipboard); + } #if 0 // Do not create the button for reporting the game directly to the bugtracker @@ -78,96 +108,34 @@ UnknownGameDialog::UnknownGameDialog(const Common::String &reportData, const Com //Check if we have support for opening URLs if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) { buttonPos -= openBugtrackerURLButtonWidth + 5; - _openBugTrackerUrlButton = new GUI::ButtonWidget(this, 0, 0, 0, 0, _("Report game"), 0, kOpenBugtrackerURL); + new GUI::ButtonWidget(this, buttonPos, _h - buttonHeight - 8, openBugtrackerURLButtonWidth, buttonHeight, _("Report game"), 0, kOpenBugtrackerURL); //Formatting the reportData for bugtracker submission [replace line breaks]... _bugtrackerGameData = _reportData; while (_bugtrackerGameData.contains("\n")) { Common::replace(_bugtrackerGameData, "\n", "%0A"); } - } else + } #endif - _openBugTrackerUrlButton = nullptr; + // Each line is represented by one static text item. // Use a ScrollContainer for the report in case we have a lot of lines. - _textContainer = new GUI::ScrollContainerWidget(this, 0, 0, 0, 0, kScrollContainerReflow); - _textContainer->setTarget(this); - - rebuild(); -} - -void UnknownGameDialog::reflowLayout() { - rebuild(); - GUI::Dialog::reflowLayout(); -} - -void UnknownGameDialog::rebuild() { - // First remove the old text widgets - for (uint i = 0; i < _textWidgets.size() ; i++) { - _textContainer->removeWidget(_textWidgets[i]); - delete _textWidgets[i]; - } - _textWidgets.clear(); - - // Work out dialog size and position of the various elements in the dialog. - // Limit the width of the dialog to 600 - 2 * 10 pixels. - const int screenW = MIN((int)g_system->getOverlayWidth(), 600); - const int screenH = g_system->getOverlayHeight(); - - int buttonHeight = g_gui.xmlEval()->getVar("Globals.Button.Height", 0); - int buttonWidth = g_gui.xmlEval()->getVar("Globals.Button.Width", 0); - - // We use a ScrollContainer to display the text, with a 2 * 8 pixels margin to the dialog border, - // the scrollbar, and 2 * 10 margin for the text in the container. - // We also keep 2 * 10 pixels between the screen border and the dialog. - int scrollbarWidth = g_gui.xmlEval()->getVar("Globals.Scrollbar.Width", 0); - Common::Array lines; - int maxlineWidth = g_gui.getFont().wordWrapText(_reportTranslated, screenW - 2 * 20 - 16 - scrollbarWidth, lines); - - int lineCount = lines.size() + 1; - - _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; - if (_copyToClipboardButton) { - copyToClipboardButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_copyToClipboardButton->getLabel()) + 10); - totalButtonWidth += copyToClipboardButtonWidth + 10; - } - if (_openBugTrackerUrlButton) { - openBugtrackerURLButtonWidth = MAX(buttonWidth, g_gui.getFont().getStringWidth(_openBugTrackerUrlButton->getLabel()) + 10); - totalButtonWidth += openBugtrackerURLButtonWidth + 10; - } - - _w = MAX(MAX(maxlineWidth, 0) + 16 + scrollbarWidth, totalButtonWidth) + 20; - - // Center the dialog on the screen - _x = (g_system->getOverlayWidth() - _w) / 2; - _y = (g_system->getOverlayHeight() - _h) / 2; - - // Now move the buttons and text container to their proper place - int buttonPos = _w - closeButtonWidth - 10; - _closeButton->resize(buttonPos, _h - buttonHeight - 8, closeButtonWidth, buttonHeight); - if (_copyToClipboardButton) { - buttonPos -= copyToClipboardButtonWidth + 5; - _copyToClipboardButton->resize(buttonPos, _h - buttonHeight - 8, copyToClipboardButtonWidth, buttonHeight); - } - if (_openBugTrackerUrlButton) { - buttonPos -= openBugtrackerURLButtonWidth + 5; - _openBugTrackerUrlButton->resize(buttonPos, _h - buttonHeight - 8, openBugtrackerURLButtonWidth, buttonHeight); - } - - int containerHeight = _h - kLineHeight - buttonHeight - 16; - _textContainer->resize(8, 8, _w - 16, containerHeight); - - // And create text widgets + int containerHeight = _h - kLineHeight - buttonHeight - 8; + GUI::ScrollContainerWidget *container = new GUI::ScrollContainerWidget(this, 8, 8, _w - 16, containerHeight, kScrollContainerReflow); + container->setTarget(this); uint y = 8; for (uint i = 0; i < lines.size() ; i++) { - GUI::StaticTextWidget *widget = new GUI::StaticTextWidget(_textContainer, 10, y, _w - 36 - scrollbarWidth, kLineHeight, lines[i], Graphics::kTextAlignLeft); + GUI::StaticTextWidget *widget = new GUI::StaticTextWidget(container, 10, y, _w - 36 - scrollbarWidth, kLineHeight, lines[i], Graphics::kTextAlignLeft); _textWidgets.push_back(widget); y += kLineHeight; } } +void UnknownGameDialog::reflowLayout() { + _x = (g_system->getOverlayWidth() - _w) / 2; + _y = (g_system->getOverlayHeight() - _h) / 2; + GUI::Dialog::reflowLayout(); +} + Common::String UnknownGameDialog::generateBugtrackerURL() { return Common::String::format(( "https://bugs.scummvm.org/newticket?" diff --git a/engines/unknown-game-dialog.h b/engines/unknown-game-dialog.h index 4f0e9a495bc..a5273392117 100644 --- a/engines/unknown-game-dialog.h +++ b/engines/unknown-game-dialog.h @@ -25,8 +25,6 @@ namespace GUI { class StaticTextWidget; - class ScrollContainerWidget; - class ButtonWidget; } class UnknownGameDialog : public GUI::Dialog { @@ -36,18 +34,11 @@ public: virtual Common::String generateBugtrackerURL(); virtual void reflowLayout(); -protected: - void rebuild(); - private: Common::String _reportData; Common::String _reportTranslated; Common::String _bugtrackerGameData; Common::String _bugtrackerAffectedEngine; - GUI::ScrollContainerWidget *_textContainer; Common::Array _textWidgets; - GUI::ButtonWidget* _openBugTrackerUrlButton; - GUI::ButtonWidget* _copyToClipboardButton; - GUI::ButtonWidget* _closeButton; };