mirror of
https://github.com/libretro/scummvm.git
synced 2025-05-13 09:36:21 +00:00
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:
parent
42cd3e9596
commit
201b347ebd
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user