GUI: Improve layout update for UnknownGameDialog

Previously the dialog was not resized and was just recentered on
the screen when the overlay size changed. Now it is properly
resized as well.
This commit is contained in:
Thierry Crozat 2018-05-28 22:18:39 +01:00
parent 42cd3e9596
commit 201b347ebd
2 changed files with 92 additions and 46 deletions

View File

@ -44,6 +44,64 @@ enum {
UnknownGameDialog::UnknownGameDialog(const DetectionResults &detectionResults) :
Dialog(30, 20, 260, 124),
_detectionResults(detectionResults) {
// 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);
//Check if we have clipboard functionality
if (g_system->hasFeature(OSystem::kFeatureClipboardSupport)) {
_copyToClipboardButton = new ButtonWidget(this, 0, 0, 0, 0, _("Copy to clipboard"), 0, kCopyToClipboard);
} else
_copyToClipboardButton = nullptr;
#if 0
// Do not create the button for reporting the game directly to the bugtracker
// for now until we find a proper solution for the problem that a change
// to our bugtracker system might break the URL generation. A possible approach
// for solving this would be to have a ULR under the .scummvm.org (of the type
// https://www.scummvm.org/unknowngame?engine=Foo&description=Bar) that would
// redirect to whatever our bugtracker system is.
//Check if we have support for opening URLs
if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) {
buttonPos -= openBugtrackerURLButtonWidth + 5;
_openBugTrackerUrlButton = new ButtonWidget(this, 0, 0, 0, 0, _("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;
// Use a ScrollContainer for the report in case we have a lot of lines.
_textContainer = new ScrollContainerWidget(this, 0, 0, 0, 0, kScrollContainerReflow);
_textContainer->setTarget(this);
rebuild();
}
void UnknownGameDialog::reflowLayout() {
rebuild();
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);
Common::String reportTranslated = _detectionResults.generateUnknownGameReport(true);
// Check if we have clipboard functionality and expand the reportTranslated message if needed...
@ -60,13 +118,6 @@ UnknownGameDialog::UnknownGameDialog(const DetectionResults &detectionResults) :
}
#endif
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.
@ -78,60 +129,47 @@ UnknownGameDialog::UnknownGameDialog(const DetectionResults &detectionResults) :
_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;
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;
new ButtonWidget(this, buttonPos, _h - buttonHeight - 8, buttonWidth, buttonHeight, _("Close"), 0, kClose);
// Check if we have clipboard functionality
if (g_system->hasFeature(OSystem::kFeatureClipboardSupport)) {
_closeButton->resize(buttonPos, _h - buttonHeight - 8, closeButtonWidth, buttonHeight);
if (_copyToClipboardButton) {
buttonPos -= copyToClipboardButtonWidth + 5;
new ButtonWidget(this, buttonPos, _h - buttonHeight - 8, copyToClipboardButtonWidth, buttonHeight, _("Copy to clipboard"), 0, kCopyToClipboard);
_copyToClipboardButton->resize(buttonPos, _h - buttonHeight - 8, copyToClipboardButtonWidth, buttonHeight);
}
#if 0
// Do not create the button for reporting the game directly to the bugtracker
// for now until we find a proper solution for the problem that a change
// to our bugtracker system might break the URL generation. A possible approach
// for solving this would be to have a ULR under the .scummvm.org (of the type
// https://www.scummvm.org/unknowngame?engine=Foo&description=Bar) that would
// redirect to whatever our bugtracker system is.
// Check if we have support for opening URLs
if (g_system->hasFeature(OSystem::kFeatureOpenUrl)) {
if (_openBugTrackerUrlButton) {
buttonPos -= openBugtrackerURLButtonWidth + 5;
new ButtonWidget(this, buttonPos, _h - buttonHeight - 8, openBugtrackerURLButtonWidth, buttonHeight, _("Report game"), 0, kOpenBugtrackerURL);
_openBugTrackerUrlButton->resize(buttonPos, _h - buttonHeight - 8, openBugtrackerURLButtonWidth, buttonHeight);
}
#endif
// Each line is represented by one static text item.
// Use a ScrollContainer for the report in case we have a lot of lines.
int containerHeight = _h - kLineHeight - buttonHeight - 8;
ScrollContainerWidget *container = new ScrollContainerWidget(this, 8, 8, _w - 16, containerHeight, kScrollContainerReflow);
container->setTarget(this);
int containerHeight = _h - kLineHeight - buttonHeight - 16;
_textContainer->resize(8, 8, _w - 16, containerHeight);
// And create text widgets
uint y = 8;
for (uint i = 0; i < lines.size() ; i++) {
StaticTextWidget *widget = new StaticTextWidget(container, 10, y, _w - 36 - scrollbarWidth, kLineHeight, lines[i], Graphics::kTextAlignLeft);
StaticTextWidget *widget = new StaticTextWidget(_textContainer, 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;
Dialog::reflowLayout();
}
Common::String UnknownGameDialog::generateBugtrackerURL() {
// TODO: Remove the filesystem path from the bugtracker report

View File

@ -30,12 +30,16 @@
namespace GUI {
class StaticTextWidget;
class ScrollContainerWidget;
class ButtonWidget;
class UnknownGameDialog : public Dialog {
public:
UnknownGameDialog(const DetectionResults &detectionResults);
private:
void rebuild();
// Dialog API
void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) override;
void reflowLayout() override;
@ -43,7 +47,11 @@ private:
Common::String generateBugtrackerURL();
const DetectionResults &_detectionResults;
Common::Array<GUI::StaticTextWidget *> _textWidgets;
ScrollContainerWidget *_textContainer;
Common::Array<StaticTextWidget *> _textWidgets;
ButtonWidget* _openBugTrackerUrlButton;
ButtonWidget* _copyToClipboardButton;
ButtonWidget* _closeButton;
};
} // End of namespace GUI