From 3df126853aa661f760792d478f80c2e2427b298c Mon Sep 17 00:00:00 2001 From: Alexander Tkachev Date: Fri, 19 Jul 2019 17:04:44 +0700 Subject: GUI: Separate Cloud tab in two All local webserver-related settings are now shown in a separate, "Wi-Fi Sharing" tab (shown if built with USE_SDL_NET). Cloud tab is only shown if actual cloud storages are built (USE_LIBCURL). --- gui/options.cpp | 516 ++++++++------------- gui/options.h | 34 +- gui/themes/scummclassic.zip | Bin 135889 -> 136187 bytes gui/themes/scummclassic/classic_layout.stx | 5 +- gui/themes/scummclassic/classic_layout_lowres.stx | 5 +- gui/themes/scummmodern.zip | Bin 264656 -> 264954 bytes gui/themes/scummmodern/scummmodern_layout.stx | 5 +- .../scummmodern/scummmodern_layout_lowres.stx | 5 +- gui/themes/scummremastered.zip | Bin 264593 -> 264892 bytes gui/themes/scummremastered/remastered_layout.stx | 5 +- .../scummremastered/remastered_layout_lowres.stx | 7 +- 11 files changed, 252 insertions(+), 330 deletions(-) (limited to 'gui') diff --git a/gui/options.cpp b/gui/options.cpp index 38bfc3bc72..d69cd29a22 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -1479,9 +1479,6 @@ GlobalOptionsDialog::GlobalOptionsDialog(LauncherDialog *launcher) #ifdef USE_CLOUD #ifdef USE_LIBCURL _selectedStorageIndex = CloudMan.getStorageIndex(); -#else - _selectedStorageIndex = 0; -#endif _storagePopUpDesc = 0; _storagePopUp = 0; _storageUsernameDesc = 0; @@ -1506,7 +1503,9 @@ GlobalOptionsDialog::GlobalOptionsDialog(LauncherDialog *launcher) _storageWizardPasteButton = 0; _storageWizardConnectButton = 0; _storageWizardConnectionStatusHint = 0; - + _redrawCloudTab = false; +#endif +#ifdef USE_SDL_NET _runServerButton = 0; _serverInfoLabel = 0; _rootPathButton = 0; @@ -1515,8 +1514,6 @@ GlobalOptionsDialog::GlobalOptionsDialog(LauncherDialog *launcher) _serverPortDesc = 0; _serverPort = 0; _serverPortClearButton = 0; - _redrawCloudTab = false; -#ifdef USE_SDL_NET _serverWasRunning = false; #endif #endif @@ -1748,76 +1745,26 @@ void GlobalOptionsDialog::build() { #endif #ifdef USE_CLOUD + const char *context = (g_system->getOverlayWidth() > 320 ? nullptr : "lowres"); +#ifdef USE_LIBCURL // - // 7) The cloud tab + // 7) The Cloud tab (remote storages) // - if (g_system->getOverlayWidth() > 320) - tab->addTab(_("Cloud")); - else - tab->addTab(_c("Cloud", "lowres")); + tab->addTab(_c("Cloud", context)); ScrollContainerWidget *container = new ScrollContainerWidget(tab, "GlobalOptions_Cloud.Container", kCloudTabContainerReflowCmd); container->setTarget(this); container->setBackgroundType(ThemeEngine::kDialogBackgroundNone); - _storagePopUpDesc = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StoragePopupDesc", _("Active storage:"), _("Active cloud storage")); - _storagePopUp = new PopUpWidget(container, "GlobalOptions_Cloud_Container.StoragePopup"); -#ifdef USE_LIBCURL - Common::StringArray list = CloudMan.listStorages(); - for (uint32 i = 0; i < list.size(); ++i) - _storagePopUp->appendEntry(list[i], i); -#else - _storagePopUp->appendEntry(_(""), 0); -#endif - _storagePopUp->setSelected(_selectedStorageIndex); - - const char* context = (g_system->getOverlayWidth() > 320 ? nullptr : "lowres"); - - _storageUsernameDesc = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageUsernameDesc", _("Username:"), _("Username used by this storage")); - _storageUsername = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageUsernameLabel", "", "", ThemeEngine::kFontStyleNormal); - - _storageUsedSpaceDesc = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageUsedSpaceDesc", _("Used space:"), _("Space used by ScummVM's saved games on this storage")); - _storageUsedSpace = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageUsedSpaceLabel", "0 bytes", "", ThemeEngine::kFontStyleNormal); - - _storageLastSyncDesc = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageLastSyncDesc", _("Last sync:"), _("When was the last time saved games were synced with this storage")); - _storageLastSync = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageLastSyncLabel", "", "", ThemeEngine::kFontStyleNormal); - _storageSyncHint = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageSyncHint", _c("Saves sync automatically on launch, after saving and on loading.", context), "", ThemeEngine::kFontStyleNormal); - _storageSyncSavesButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.SyncSavesButton", _("Sync now"), _("Start saves sync"), kSyncSavesStorageCmd); - - _storageDownloadHint = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageDownloadHint", _c("You can download game files from your cloud ScummVM folder:", context)); - _storageDownloadButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.DownloadButton", _("Download game files"), _("Open downloads manager dialog"), kDownloadStorageCmd); - - _storageDisconnectHint = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageDisconnectHint", _c("To change account for this storage, disconnect and connect again:", context)); - _storageDisconnectButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.DisconnectButton", _("Disconnect"), _("Stop using this storage on this device"), kDisconnectStorageCmd); - - _storageWizardNotConnectedHint = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageWizardNotConnectedHint", _c("This storage is not connected yet! To connect,", context)); - _storageWizardOpenLinkHint = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageWizardOpenLinkHint", "1. Open this link:"); - _storageWizardLink = new ButtonWidget(container, "GlobalOptions_Cloud_Container.StorageWizardLink", "https://cloud.scummvm.org/", _("Open URL"), kOpenUrlStorageCmd); - _storageWizardCodeHint = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageWizardCodeHint", _c("2. Get the code and enter it here:", context)); - _storageWizardCodeBox = new EditTextWidget(container, "GlobalOptions_Cloud_Container.StorageWizardCodeBox", "", 0, 0, 0, ThemeEngine::kFontStyleConsole); - _storageWizardPasteButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.StorageWizardPasteButton", _("Paste"), _("Paste code from clipboard"), kPasteCodeStorageCmd); - _storageWizardConnectButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.StorageWizardConnectButton", _("3. Connect"), _("Connect your cloud storage account"), kConnectStorageCmd); - _storageWizardConnectionStatusHint = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.StorageWizardConnectionStatusHint", "..."); - - _runServerButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.RunServerButton", _("Run server"), _("Run local webserver"), kRunServerCmd); - _serverInfoLabel = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.ServerInfoLabel", _("Not running")); - - // Root path - _rootPathButton = new ButtonWidget(container, "GlobalOptions_Cloud_Container.RootPathButton", _c("/root/ Path:", context), _("Specifies which directory the Files Manager can access"), kChooseRootDirCmd); - _rootPath = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.RootPath", "/foo/bar", _("Specifies which directory the Files Manager can access")); - - _rootPathClearButton = addClearButton(container, "GlobalOptions_Cloud_Container.RootPathClearButton", kRootPathClearCmd); - + addCloudControls(container, "GlobalOptions_Cloud_Container.", context); +#endif USE_LIBCURL #ifdef USE_SDL_NET - uint32 port = Networking::LocalWebserver::getPort(); -#else - uint32 port = 0; // the following widgets are hidden anyway -#endif - _serverPortDesc = new StaticTextWidget(container, "GlobalOptions_Cloud_Container.ServerPortDesc", _("Server's port:"), _("Which port is used by the server\nAuth with server is not available with non-default port")); - _serverPort = new EditTextWidget(container, "GlobalOptions_Cloud_Container.ServerPortEditText", Common::String::format("%u", port), 0); - _serverPortClearButton = addClearButton(container, "GlobalOptions_Cloud_Container.ServerPortClearButton", kServerPortClearCmd); - - setupCloudTab(); + // + // 8) The Wi-Fi Sharing tab (local "cloud" webserver) + // + tab->addTab(_c("Wi-Fi Sharing", context)); + addWiFiSharingControls(tab, "GlobalOptions_WiFiSharing.", context); +#endif // USE_SDL_NET #endif // USE_CLOUD // Activate the first tab @@ -1887,6 +1834,7 @@ void GlobalOptionsDialog::build() { _rendererPopUp->setSelectedTag(mode); #ifdef USE_CLOUD +#ifdef USE_SDL_NET Common::String rootPath(ConfMan.get("rootpath", "cloud")); if (rootPath.empty() || !ConfMan.hasKey("rootpath", "cloud")) { _rootPath->setLabel(_c("None", "path")); @@ -1894,6 +1842,7 @@ void GlobalOptionsDialog::build() { _rootPath->setLabel(rootPath); } #endif +#endif } void GlobalOptionsDialog::clean() { @@ -1910,16 +1859,67 @@ void GlobalOptionsDialog::clean() { OptionsDialog::clean(); } -void GlobalOptionsDialog::shiftWidget(Widget *widget, const char *widgetName, int32 xOffset, int32 yOffset) { - if (!widget) return; +#ifdef USE_CLOUD +#ifdef USE_LIBCURL +void GlobalOptionsDialog::addCloudControls(GuiObject *boss, const Common::String &prefix, const char *context) { + _storagePopUpDesc = new StaticTextWidget(boss, prefix + "StoragePopupDesc", _("Active storage:"), _("Active cloud storage")); + _storagePopUp = new PopUpWidget(boss, prefix + "StoragePopup"); + Common::StringArray list = CloudMan.listStorages(); + for (uint32 i = 0; i < list.size(); ++i) + _storagePopUp->appendEntry(list[i], i); + _storagePopUp->setSelected(_selectedStorageIndex); - int16 x, y; - uint16 w, h; - if (!g_gui.xmlEval()->getWidgetData(widgetName, x, y, w, h)) - warning("%s's position is undefined", widgetName); + _storageUsernameDesc = new StaticTextWidget(boss, prefix + "StorageUsernameDesc", _("Username:"), _("Username used by this storage")); + _storageUsername = new StaticTextWidget(boss, prefix + "StorageUsernameLabel", "", "", ThemeEngine::kFontStyleNormal); + + _storageUsedSpaceDesc = new StaticTextWidget(boss, prefix + "StorageUsedSpaceDesc", _("Used space:"), _("Space used by ScummVM's saved games on this storage")); + _storageUsedSpace = new StaticTextWidget(boss, prefix + "StorageUsedSpaceLabel", "0 bytes", "", ThemeEngine::kFontStyleNormal); + + _storageLastSyncDesc = new StaticTextWidget(boss, prefix + "StorageLastSyncDesc", _("Last sync:"), _("When was the last time saved games were synced with this storage")); + _storageLastSync = new StaticTextWidget(boss, prefix + "StorageLastSyncLabel", "", "", ThemeEngine::kFontStyleNormal); + _storageSyncHint = new StaticTextWidget(boss, prefix + "StorageSyncHint", _c("Saves sync automatically on launch, after saving and on loading.", context), "", ThemeEngine::kFontStyleNormal); + _storageSyncSavesButton = new ButtonWidget(boss, prefix + "SyncSavesButton", _("Sync now"), _("Start saves sync"), kSyncSavesStorageCmd); + + _storageDownloadHint = new StaticTextWidget(boss, prefix + "StorageDownloadHint", _c("You can download game files from your cloud ScummVM folder:", context)); + _storageDownloadButton = new ButtonWidget(boss, prefix + "DownloadButton", _("Download game files"), _("Open downloads manager dialog"), kDownloadStorageCmd); + + _storageDisconnectHint = new StaticTextWidget(boss, prefix + "StorageDisconnectHint", _c("To change account for this storage, disconnect and connect again:", context)); + _storageDisconnectButton = new ButtonWidget(boss, prefix + "DisconnectButton", _("Disconnect"), _("Stop using this storage on this device"), kDisconnectStorageCmd); + + _storageWizardNotConnectedHint = new StaticTextWidget(boss, prefix + "StorageWizardNotConnectedHint", _c("This storage is not connected yet! To connect,", context)); + _storageWizardOpenLinkHint = new StaticTextWidget(boss, prefix + "StorageWizardOpenLinkHint", "1. Open this link:"); + _storageWizardLink = new ButtonWidget(boss, prefix + "StorageWizardLink", "https://cloud.scummvm.org/", _("Open URL"), kOpenUrlStorageCmd); + _storageWizardCodeHint = new StaticTextWidget(boss, prefix + "StorageWizardCodeHint", _c("2. Get the code and enter it here:", context)); + _storageWizardCodeBox = new EditTextWidget(boss, prefix + "StorageWizardCodeBox", "", 0, 0, 0, ThemeEngine::kFontStyleConsole); + _storageWizardPasteButton = new ButtonWidget(boss, prefix + "StorageWizardPasteButton", _("Paste"), _("Paste code from clipboard"), kPasteCodeStorageCmd); + _storageWizardConnectButton = new ButtonWidget(boss, prefix + "StorageWizardConnectButton", _("3. Connect"), _("Connect your cloud storage account"), kConnectStorageCmd); + _storageWizardConnectionStatusHint = new StaticTextWidget(boss, prefix + "StorageWizardConnectionStatusHint", "..."); + + setupCloudTab(); +} +#endif // USE_LIBCURL + +#ifdef USE_SDL_NET +void GlobalOptionsDialog::addWiFiSharingControls(GuiObject *boss, const Common::String &prefix, const char *context) { + _runServerButton = new ButtonWidget(boss, prefix + "RunServerButton", _("Run server"), _("Run local webserver"), kRunServerCmd); + _serverInfoLabel = new StaticTextWidget(boss, prefix + "ServerInfoLabel", _("Not running")); + + // Root path + _rootPathButton = new ButtonWidget(boss, prefix + "RootPathButton", _c("/root/ Path:", context), _("Select which directory will be shown as /root/ in the Files Manager"), kChooseRootDirCmd); + _rootPath = new StaticTextWidget(boss, prefix + "RootPath", "/foo/bar", _("Select which directory will be shown as /root/ in the Files Manager")); + _rootPathClearButton = addClearButton(boss, prefix + "RootPathClearButton", kRootPathClearCmd); + + uint32 port = Networking::LocalWebserver::getPort(); + + _serverPortDesc = new StaticTextWidget(boss, prefix + "ServerPortDesc", _("Server's port:"), _("Port for server to use")); + _serverPort = new EditTextWidget(boss, prefix + "ServerPortEditText", Common::String::format("%u", port), 0); + _serverPortClearButton = addClearButton(boss, prefix + "ServerPortClearButton", kServerPortClearCmd); - widget->setPos(x + xOffset, y + yOffset); + reflowWiFiSharingTabLayout(); + } +#endif // USE_SDL_NET +#endif // USE_CLOUD void GlobalOptionsDialog::apply() { OptionsDialog::apply(); @@ -1953,11 +1953,13 @@ void GlobalOptionsDialog::apply() { #endif #ifdef USE_CLOUD +#ifdef USE_SDL_NET Common::String rootPath(_rootPath->getLabel()); if (!rootPath.empty() && (rootPath != _c("None", "path"))) ConfMan.set("rootpath", rootPath, "cloud"); else ConfMan.removeKey("rootpath", "cloud"); +#endif #endif ConfMan.setInt("autosave_period", _autosavePeriodPopUp->getSelectedTag(), _domain); @@ -2141,6 +2143,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 } #endif #ifdef USE_CLOUD +#ifdef USE_SDL_NET case kChooseRootDirCmd: { BrowserDialog browser(_("Select directory for Files Manager /root/"), true); if (browser.runModal() > 0) { @@ -2154,6 +2157,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 } break; } +#endif #endif case kThemePathClearCmd: _themePath->setLabel(_c("None", "path")); @@ -2165,9 +2169,11 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 _savePath->setLabel(_("Default")); break; #ifdef USE_CLOUD +#ifdef USE_SDL_NET case kRootPathClearCmd: _rootPath->setLabel(_c("None", "path")); break; +#endif #endif case kChooseSoundFontCmd: { BrowserDialog browser(_("Select SoundFont"), false); @@ -2196,12 +2202,12 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 break; } #ifdef USE_CLOUD - case kCloudTabContainerReflowCmd: +#ifdef USE_LIBCURL + case kCloudTabContainerReflowCmd: { setupCloudTab(); break; -#ifdef USE_LIBCURL - case kPopUpItemSelectedCmd: - { + } + case kPopUpItemSelectedCmd: { // update container's scrollbar reflowLayout(); break; @@ -2322,28 +2328,26 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 } #endif // USE_LIBCURL #ifdef USE_SDL_NET - case kRunServerCmd: - { + case kRunServerCmd: { #ifdef NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE - // save server's port - uint32 port = Networking::LocalWebserver::getPort(); - if (_serverPort) { - uint64 contents = _serverPort->getEditString().asUint64(); - if (contents != 0) - port = contents; - } - ConfMan.setInt("local_server_port", port); - ConfMan.flushToDisk(); + // save server's port + uint32 port = Networking::LocalWebserver::getPort(); + if (_serverPort) { + uint64 contents = _serverPort->getEditString().asUint64(); + if (contents != 0) + port = contents; + } + ConfMan.setInt("local_server_port", port); + ConfMan.flushToDisk(); #endif // NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE - if (LocalServer.isRunning()) - LocalServer.stopOnIdle(); - else - LocalServer.start(); - - break; - } + if (LocalServer.isRunning()) + LocalServer.stopOnIdle(); + else + LocalServer.start(); + break; + } case kServerPortClearCmd: { if (_serverPort) { _serverPort->setEditString(Common::String::format("%u", Networking::LocalWebserver::DEFAULT_SERVER_PORT)); @@ -2377,18 +2381,20 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 void GlobalOptionsDialog::handleTickle() { OptionsDialog::handleTickle(); #ifdef USE_CLOUD -#ifdef USE_SDL_NET - if (LocalServer.isRunning() != _serverWasRunning) { - _serverWasRunning = !_serverWasRunning; - _redrawCloudTab = true; - } -#endif +#ifdef USE_LIBCURL if (_redrawCloudTab) { setupCloudTab(); g_gui.scheduleTopDialogRedraw(); _redrawCloudTab = false; } -#endif +#endif // USE_LIBCURL +#ifdef USE_SDL_NET + if (LocalServer.isRunning() != _serverWasRunning) { + _serverWasRunning = !_serverWasRunning; + reflowWiFiSharingTabLayout(); + } +#endif // USE_SDL_NET +#endif // USE_CLOUD } void GlobalOptionsDialog::reflowLayout() { @@ -2428,15 +2434,19 @@ void GlobalOptionsDialog::reflowLayout() { OptionsDialog::reflowLayout(); #ifdef USE_CLOUD +#ifdef USE_LIBCURL setupCloudTab(); -#endif +#endif // USE_LIBCURL +#ifdef USE_SDL_NET + reflowWiFiSharingTabLayout(); +#endif // USE_SDL_NET +#endif // USE_CLOUD } #ifdef USE_CLOUD -void GlobalOptionsDialog::setupCloudTab() { - int serverLabelPosition = -1; //no override #ifdef USE_LIBCURL - _selectedStorageIndex = (_storagePopUp ? _storagePopUp->getSelectedTag() : (uint32) Cloud::kStorageNoneId); +void GlobalOptionsDialog::setupCloudTab() { + _selectedStorageIndex = (_storagePopUp ? _storagePopUp->getSelectedTag() : (uint32)Cloud::kStorageNoneId); if (_storagePopUpDesc) _storagePopUpDesc->setVisible(true); if (_storagePopUp) _storagePopUp->setVisible(true); @@ -2445,7 +2455,9 @@ void GlobalOptionsDialog::setupCloudTab() { bool storageConnected = (username != ""); bool shown = (_selectedStorageIndex != Cloud::kStorageNoneId); bool shownConnectedInfo = (shown && storageConnected); - + + // there goes layout for connected Storage + if (_storageUsernameDesc) _storageUsernameDesc->setVisible(shownConnectedInfo); if (_storageUsername) { _storageUsername->setLabel(username); @@ -2478,199 +2490,124 @@ void GlobalOptionsDialog::setupCloudTab() { if (_storageSyncSavesButton) _storageSyncSavesButton->setVisible(shownConnectedInfo && _selectedStorageIndex == CloudMan.getStorageIndex()); - { - int16 x, y; - uint16 w, h; - int16 downloadHintY, downloadButtonY, disconnectHintY; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageDownloadHint", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.StorageDownloadHint's position is undefined"); - downloadHintY = y; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.DownloadButton", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.DownloadButton's position is undefined"); - downloadButtonY = y; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageDisconnectHint", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.StorageDisconnectHint's position is undefined"); - disconnectHintY = y; - - bool showDownloadButton = (shownConnectedInfo && _selectedStorageIndex == CloudMan.getStorageIndex() && _selectedStorageIndex != Cloud::kStorageGoogleDriveId); // cannot download via Google Drive - if (_storageDownloadHint) _storageDownloadHint->setVisible(showDownloadButton); - if (_storageDownloadButton) _storageDownloadButton->setVisible(showDownloadButton); - if (_storageDisconnectHint) _storageDisconnectHint->setVisible(shownConnectedInfo); - if (_storageDisconnectButton) _storageDisconnectButton->setVisible(shownConnectedInfo); - - if (showDownloadButton) { - if (_storageDownloadHint) _storageDownloadHint->setPos(_storageDownloadHint->getRelX(), downloadHintY); - if (_storageDownloadButton) _storageDownloadButton->setPos(_storageDownloadButton->getRelX(), downloadButtonY); - if (_storageDisconnectHint) _storageDisconnectHint->setPos(_storageDisconnectHint->getRelX(), disconnectHintY); - if (_storageDisconnectButton)_storageDisconnectButton->setPos(_storageDisconnectButton->getRelX(), disconnectHintY + downloadButtonY - downloadHintY); - } else { - if (_storageDisconnectHint) _storageDisconnectHint->setPos(_storageDisconnectHint->getRelX(), downloadHintY); - if (_storageDisconnectButton)_storageDisconnectButton->setPos(_storageDisconnectButton->getRelX(), downloadButtonY); - } + int16 x, y; + uint16 w, h; + int16 downloadHintY, downloadButtonY, disconnectHintY; + if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageDownloadHint", x, y, w, h)) + warning("GlobalOptions_Cloud_Container.StorageDownloadHint's position is undefined"); + downloadHintY = y; + if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.DownloadButton", x, y, w, h)) + warning("GlobalOptions_Cloud_Container.DownloadButton's position is undefined"); + downloadButtonY = y; + if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageDisconnectHint", x, y, w, h)) + warning("GlobalOptions_Cloud_Container.StorageDisconnectHint's position is undefined"); + disconnectHintY = y; + + bool showDownloadButton = (shownConnectedInfo && _selectedStorageIndex == CloudMan.getStorageIndex() && _selectedStorageIndex != Cloud::kStorageGoogleDriveId); // cannot download via Google Drive + if (_storageDownloadHint) _storageDownloadHint->setVisible(showDownloadButton); + if (_storageDownloadButton) _storageDownloadButton->setVisible(showDownloadButton); + if (_storageDisconnectHint) _storageDisconnectHint->setVisible(shownConnectedInfo); + if (_storageDisconnectButton) _storageDisconnectButton->setVisible(shownConnectedInfo); + + if (showDownloadButton) { + if (_storageDownloadHint) _storageDownloadHint->setPos(_storageDownloadHint->getRelX(), downloadHintY); + if (_storageDownloadButton) _storageDownloadButton->setPos(_storageDownloadButton->getRelX(), downloadButtonY); + if (_storageDisconnectHint) _storageDisconnectHint->setPos(_storageDisconnectHint->getRelX(), disconnectHintY); + if (_storageDisconnectButton)_storageDisconnectButton->setPos(_storageDisconnectButton->getRelX(), disconnectHintY + downloadButtonY - downloadHintY); + } else { + if (_storageDisconnectHint) _storageDisconnectHint->setPos(_storageDisconnectHint->getRelX(), downloadHintY); + if (_storageDisconnectButton)_storageDisconnectButton->setPos(_storageDisconnectButton->getRelX(), downloadButtonY); + } - if (!shownConnectedInfo) { - bool connecting = _connectingStorage; - if (_storageWizardNotConnectedHint) _storageWizardNotConnectedHint->setVisible(shown); - if (_storageWizardOpenLinkHint) _storageWizardOpenLinkHint->setVisible(shown); - if (_storageWizardLink) { - _storageWizardLink->setVisible(shown); - _storageWizardLink->setEnabled(g_system->hasFeature(OSystem::kFeatureOpenUrl) && !connecting); - } - if (_storageWizardCodeHint) _storageWizardCodeHint->setVisible(shown); - if (_storageWizardCodeBox) { - _storageWizardCodeBox->setVisible(shown); - _storageWizardCodeBox->setEnabled(!connecting); - } - if (_storageWizardPasteButton) { - _storageWizardPasteButton->setVisible(shown && g_system->hasFeature(OSystem::kFeatureClipboardSupport)); - _storageWizardPasteButton->setEnabled(!connecting); - } - if (_storageWizardConnectButton) { - _storageWizardConnectButton->setVisible(shown); - _storageWizardConnectButton->setEnabled(!connecting); - } - if (_storageWizardConnectionStatusHint) { - _storageWizardConnectionStatusHint->setVisible(shown && _storageWizardConnectionStatusHint->getLabel() != "..."); - _storageWizardConnectionStatusHint->setEnabled(!connecting); - } + // there goes layout for non-connected Storage (connection wizard) - int16 x2, y2; - uint16 w2, h2; - int16 shiftUp; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageUsernameDesc", x2, y2, w2, h2)) - warning("GlobalOptions_Cloud_Container.StorageUsernameDesc's position is undefined"); - shiftUp = y2; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageWizardNotConnectedHint", x2, y2, w2, h2)) - warning("GlobalOptions_Cloud_Container.StorageWizardNotConnectedHint's position is undefined"); - shiftUp = y2 - shiftUp; - - shiftWidget(_storageWizardNotConnectedHint, "GlobalOptions_Cloud_Container.StorageWizardNotConnectedHint", 0, -shiftUp); - shiftWidget(_storageWizardOpenLinkHint, "GlobalOptions_Cloud_Container.StorageWizardOpenLinkHint", 0, -shiftUp); - shiftWidget(_storageWizardLink, "GlobalOptions_Cloud_Container.StorageWizardLink", 0, -shiftUp); - shiftWidget(_storageWizardCodeHint, "GlobalOptions_Cloud_Container.StorageWizardCodeHint", 0, -shiftUp); - shiftWidget(_storageWizardCodeBox, "GlobalOptions_Cloud_Container.StorageWizardCodeBox", 0, -shiftUp); - shiftWidget(_storageWizardPasteButton, "GlobalOptions_Cloud_Container.StorageWizardPasteButton", 0, -shiftUp); - shiftWidget(_storageWizardConnectButton, "GlobalOptions_Cloud_Container.StorageWizardConnectButton", 0, -shiftUp); - shiftWidget(_storageWizardConnectionStatusHint, "GlobalOptions_Cloud_Container.StorageWizardConnectionStatusHint", 0, -shiftUp); + if (!shownConnectedInfo) { + bool connecting = _connectingStorage; + if (_storageWizardNotConnectedHint) _storageWizardNotConnectedHint->setVisible(shown); + if (_storageWizardOpenLinkHint) _storageWizardOpenLinkHint->setVisible(shown); + if (_storageWizardLink) { + _storageWizardLink->setVisible(shown); + _storageWizardLink->setEnabled(g_system->hasFeature(OSystem::kFeatureOpenUrl) && !connecting); } - - if (!shown) - serverLabelPosition = (_storageUsernameDesc ? _storageUsernameDesc->getRelY() : 0); - else { - if (shownConnectedInfo) - serverLabelPosition = (_storageDisconnectButton ? _storageDisconnectButton->getRelY() + _storageDisconnectButton->getHeight() + 16 : 0); - else - serverLabelPosition = (_storageWizardConnectButton ? _storageWizardConnectButton->getRelY() + _storageWizardConnectButton->getHeight() + 16 : 0); + if (_storageWizardCodeHint) _storageWizardCodeHint->setVisible(shown); + if (_storageWizardCodeBox) { + _storageWizardCodeBox->setVisible(shown); + _storageWizardCodeBox->setEnabled(!connecting); + } + if (_storageWizardPasteButton) { + _storageWizardPasteButton->setVisible(shown && g_system->hasFeature(OSystem::kFeatureClipboardSupport)); + _storageWizardPasteButton->setEnabled(!connecting); + } + if (_storageWizardConnectButton) { + _storageWizardConnectButton->setVisible(shown); + _storageWizardConnectButton->setEnabled(!connecting); + } + if (_storageWizardConnectionStatusHint) { + _storageWizardConnectionStatusHint->setVisible(shown && _storageWizardConnectionStatusHint->getLabel() != "..."); + _storageWizardConnectionStatusHint->setEnabled(!connecting); } + + int16 shiftUp; + if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageUsernameDesc", x, y, w, h)) + warning("GlobalOptions_Cloud_Container.StorageUsernameDesc's position is undefined"); + shiftUp = y; + if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.StorageWizardNotConnectedHint", x, y, w, h)) + warning("GlobalOptions_Cloud_Container.StorageWizardNotConnectedHint's position is undefined"); + shiftUp = y - shiftUp; + + shiftWidget(_storageWizardNotConnectedHint, "GlobalOptions_Cloud_Container.StorageWizardNotConnectedHint", 0, -shiftUp); + shiftWidget(_storageWizardOpenLinkHint, "GlobalOptions_Cloud_Container.StorageWizardOpenLinkHint", 0, -shiftUp); + shiftWidget(_storageWizardLink, "GlobalOptions_Cloud_Container.StorageWizardLink", 0, -shiftUp); + shiftWidget(_storageWizardCodeHint, "GlobalOptions_Cloud_Container.StorageWizardCodeHint", 0, -shiftUp); + shiftWidget(_storageWizardCodeBox, "GlobalOptions_Cloud_Container.StorageWizardCodeBox", 0, -shiftUp); + shiftWidget(_storageWizardPasteButton, "GlobalOptions_Cloud_Container.StorageWizardPasteButton", 0, -shiftUp); + shiftWidget(_storageWizardConnectButton, "GlobalOptions_Cloud_Container.StorageWizardConnectButton", 0, -shiftUp); + shiftWidget(_storageWizardConnectionStatusHint, "GlobalOptions_Cloud_Container.StorageWizardConnectionStatusHint", 0, -shiftUp); } -#else // USE_LIBCURL - _selectedStorageIndex = 0; - - if (_storagePopUpDesc) - _storagePopUpDesc->setVisible(false); - if (_storagePopUp) - _storagePopUp->setVisible(false); - if (_storageUsernameDesc) - _storageUsernameDesc->setVisible(false); - if (_storageUsernameDesc) - _storageUsernameDesc->setVisible(false); - if (_storageUsername) - _storageUsername->setVisible(false); - if (_storageUsedSpaceDesc) - _storageUsedSpaceDesc->setVisible(false); - if (_storageUsedSpace) - _storageUsedSpace->setVisible(false); - if (_storageLastSyncDesc) - _storageLastSyncDesc->setVisible(false); - if (_storageLastSync) - _storageLastSync->setVisible(false); - if (_storageDisconnectButton) - _storageDisconnectButton->setVisible(false); - if (_storageSyncSavesButton) - _storageSyncSavesButton->setVisible(false); - if (_storageDownloadButton) - _storageDownloadButton->setVisible(false); +} + +void GlobalOptionsDialog::shiftWidget(Widget *widget, const char *widgetName, int32 xOffset, int32 yOffset) { + if (!widget) return; - serverLabelPosition = (_storagePopUpDesc ? _storagePopUpDesc->getRelY() : 0); -#endif // USE_LIBCURL -#ifdef USE_SDL_NET - //determine original widget's positions int16 x, y; uint16 w, h; - int serverButtonY, serverInfoY; - int serverRootButtonY, serverRootY, serverRootClearButtonY; - int serverPortDescY, serverPortY, serverPortClearButtonY; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.RunServerButton", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.RunServerButton's position is undefined"); - serverButtonY = y; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.ServerInfoLabel", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.ServerInfoLabel's position is undefined"); - serverInfoY = y; - - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.RootPathButton", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.RootPathButton's position is undefined"); - serverRootButtonY = y; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.RootPath", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.RootPath's position is undefined"); - serverRootY = y; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.RootPathClearButton", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.RootPathClearButton's position is undefined"); - serverRootClearButtonY = y; - - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.ServerPortDesc", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.ServerPortDesc's position is undefined"); - serverPortDescY = y; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.ServerPortEditText", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.ServerPortEditText's position is undefined"); - serverPortY = y; - if (!g_gui.xmlEval()->getWidgetData("GlobalOptions_Cloud_Container.ServerPortClearButton", x, y, w, h)) - warning("GlobalOptions_Cloud_Container.ServerPortClearButton's position is undefined"); - serverPortClearButtonY = y; + if (!g_gui.xmlEval()->getWidgetData(widgetName, x, y, w, h)) + warning("%s's position is undefined", widgetName); + widget->setPos(x + xOffset, y + yOffset); +} +#endif // USE_LIBCURL + +#ifdef USE_SDL_NET +void GlobalOptionsDialog::reflowWiFiSharingTabLayout() { bool serverIsRunning = LocalServer.isRunning(); - if (serverLabelPosition < 0) - serverLabelPosition = serverInfoY; if (_runServerButton) { _runServerButton->setVisible(true); - _runServerButton->setPos(_runServerButton->getRelX(), serverLabelPosition + serverButtonY - serverInfoY); _runServerButton->setLabel(_(serverIsRunning ? "Stop server" : "Run server")); _runServerButton->setTooltip(_(serverIsRunning ? "Stop local webserver" : "Run local webserver")); } if (_serverInfoLabel) { _serverInfoLabel->setVisible(true); - _serverInfoLabel->setPos(_serverInfoLabel->getRelX(), serverLabelPosition); if (serverIsRunning) _serverInfoLabel->setLabel(LocalServer.getAddress()); else _serverInfoLabel->setLabel(_("Not running")); } - if (_rootPathButton) { - _rootPathButton->setVisible(true); - _rootPathButton->setPos(_rootPathButton->getRelX(), serverLabelPosition + serverRootButtonY - serverInfoY); - } - if (_rootPath) { - _rootPath->setVisible(true); - _rootPath->setPos(_rootPath->getRelX(), serverLabelPosition + serverRootY - serverInfoY); - } - if (_rootPathClearButton) { - _rootPathClearButton->setVisible(true); - _rootPathClearButton->setPos(_rootPathClearButton->getRelX(), serverLabelPosition + serverRootClearButtonY - serverInfoY); - } + if (_rootPathButton) _rootPathButton->setVisible(true); + if (_rootPath) _rootPath->setVisible(true); + if (_rootPathClearButton) _rootPathClearButton->setVisible(true); #ifdef NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE if (_serverPortDesc) { _serverPortDesc->setVisible(true); - _serverPortDesc->setPos(_serverPortDesc->getRelX(), serverLabelPosition + serverPortDescY - serverInfoY); _serverPortDesc->setEnabled(!serverIsRunning); } if (_serverPort) { _serverPort->setVisible(true); - _serverPort->setPos(_serverPort->getRelX(), serverLabelPosition + serverPortY - serverInfoY); _serverPort->setEnabled(!serverIsRunning); } if (_serverPortClearButton) { _serverPortClearButton->setVisible(true); - _serverPortClearButton->setPos(_serverPortClearButton->getRelX(), serverLabelPosition + serverPortClearButtonY - serverInfoY); _serverPortClearButton->setEnabled(!serverIsRunning); } #else // NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE @@ -2681,49 +2618,8 @@ void GlobalOptionsDialog::setupCloudTab() { if (_serverPortClearButton) _serverPortClearButton->setVisible(false); #endif // NETWORKING_LOCALWEBSERVER_ENABLE_PORT_OVERRIDE -#else // USE_SDL_NET - if (_runServerButton) - _runServerButton->setVisible(false); - if (_serverInfoLabel) { - _serverInfoLabel->setPos(_serverInfoLabel->getRelX(), serverLabelPosition); // Prevent compiler warning from serverLabelPosition being unused. - _serverInfoLabel->setVisible(false); - } - if (_rootPathButton) - _rootPathButton->setVisible(false); - if (_rootPath) - _rootPath->setVisible(false); - if (_rootPathClearButton) - _rootPathClearButton->setVisible(false); - if (_serverPortDesc) - _serverPortDesc->setVisible(false); - if (_serverPort) - _serverPort->setVisible(false); - if (_serverPortClearButton) - _serverPortClearButton->setVisible(false); -#endif // USE_SDL_NET - - // temporary hide all local server-related info to see how Cloud looks without it - /* - if (_runServerButton) - _runServerButton->setVisible(false); - if (_serverInfoLabel) { - _serverInfoLabel->setPos(_serverInfoLabel->getRelX(), serverLabelPosition); - _serverInfoLabel->setVisible(false); - } - if (_rootPathButton) - _rootPathButton->setVisible(false); - if (_rootPath) - _rootPath->setVisible(false); - if (_rootPathClearButton) - _rootPathClearButton->setVisible(false); - if (_serverPortDesc) - _serverPortDesc->setVisible(false); - if (_serverPort) - _serverPort->setVisible(false); - if (_serverPortClearButton) - _serverPortClearButton->setVisible(false); - */ } +#endif // USE_SDL_NET #ifdef USE_LIBCURL void GlobalOptionsDialog::storageConnectionCallback(Networking::ErrorResponse response) { diff --git a/gui/options.h b/gui/options.h index 13983c1657..c10dcca77c 100644 --- a/gui/options.h +++ b/gui/options.h @@ -291,12 +291,13 @@ protected: #endif #ifdef USE_CLOUD +#ifdef USE_LIBCURL // // Cloud controls // uint32 _selectedStorageIndex; StaticTextWidget *_storagePopUpDesc; - PopUpWidget *_storagePopUp; + PopUpWidget *_storagePopUp; StaticTextWidget *_storageUsernameDesc; StaticTextWidget *_storageUsername; StaticTextWidget *_storageUsedSpaceDesc; @@ -315,32 +316,39 @@ protected: StaticTextWidget *_storageWizardOpenLinkHint; StaticTextWidget *_storageWizardLink; StaticTextWidget *_storageWizardCodeHint; - EditTextWidget *_storageWizardCodeBox; + EditTextWidget *_storageWizardCodeBox; ButtonWidget *_storageWizardPasteButton; ButtonWidget *_storageWizardConnectButton; StaticTextWidget *_storageWizardConnectionStatusHint; + bool _redrawCloudTab; + + void addCloudControls(GuiObject *boss, const Common::String &prefix, const char *context = nullptr); + void setupCloudTab(); + void shiftWidget(Widget *widget, const char *widgetName, int32 xOffset, int32 yOffset); + void storageConnectionCallback(Networking::ErrorResponse response); + void storageSavesSyncedCallback(Cloud::Storage::BoolResponse response); + void storageErrorCallback(Networking::ErrorResponse response); +#endif // USE_LIBCURL + +#ifdef USE_SDL_NET + // + // Wi-Fi Sharing controls + // ButtonWidget *_runServerButton; StaticTextWidget *_serverInfoLabel; ButtonWidget *_rootPathButton; StaticTextWidget *_rootPath; ButtonWidget *_rootPathClearButton; StaticTextWidget *_serverPortDesc; - EditTextWidget *_serverPort; + EditTextWidget *_serverPort; ButtonWidget *_serverPortClearButton; - bool _redrawCloudTab; -#ifdef USE_SDL_NET bool _serverWasRunning; -#endif - void shiftWidget(Widget *widget, const char *widgetName, int32 xOffset, int32 yOffset); - void setupCloudTab(); + void addWiFiSharingControls(GuiObject *boss, const Common::String &prefix, const char *context = nullptr); + void reflowWiFiSharingTabLayout(); +#endif // USE_SDL_NET -#ifdef USE_LIBCURL - void storageConnectionCallback(Networking::ErrorResponse response); - void storageSavesSyncedCallback(Cloud::Storage::BoolResponse response); - void storageErrorCallback(Networking::ErrorResponse response); -#endif #endif // USE_CLOUD }; diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index 78229c36c1..1e8f3ad802 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index 3929af9e81..f5fb08e833 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -729,8 +729,11 @@ height = 'Globals.Line.Height' /> + + - + + + + - + + + + - + + + + - + + + + - + + - + @@ -732,8 +732,11 @@ height = 'Globals.Line.Height' /> + + - + +