diff options
Diffstat (limited to 'application/MainWindow.cpp')
-rw-r--r-- | application/MainWindow.cpp | 787 |
1 files changed, 509 insertions, 278 deletions
diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index 9eba9c44..1d36ef8c 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -1,4 +1,4 @@ -/* Copyright 2013-2017 MultiMC Contributors +/* Copyright 2013-2018 MultiMC Contributors * * Authors: Andrew Okin * Peterix @@ -54,7 +54,6 @@ #include <java/JavaUtils.h> #include <java/JavaInstallList.h> #include <launch/LaunchTask.h> -#include <minecraft/legacy/LwjglVersionList.h> #include <minecraft/auth/MojangAccountList.h> #include <SkinUtils.h> #include <net/URLConstants.h> @@ -91,58 +90,150 @@ #include <InstanceImportTask.h> #include "UpdateController.h" +// WHY: to hold the pre-translation strings together with the T pointer, so it can be retranslated without a lot of ugly code +template <typename T> +class Translated +{ +public: + Translated(){} + Translated(QWidget *parent) + { + m_contained = new T(parent); + } + void setTooltipId(const char * tooltip) + { + m_tooltip = tooltip; + } + void setTextId(const char * text) + { + m_text = text; + } + operator T*() + { + return m_contained; + } + T * operator->() + { + return m_contained; + } + void retranslate() + { + if(m_text) + { + m_contained->setText(QApplication::translate("MainWindow", m_text)); + } + if(m_tooltip) + { + m_contained->setToolTip(QApplication::translate("MainWindow", m_tooltip)); + } + } +private: + T * m_contained = nullptr; + const char * m_text = nullptr; + const char * m_tooltip = nullptr; +}; +using TranslatedAction = Translated<QAction>; +using TranslatedToolButton = Translated<QToolButton>; + +class TranslatedToolbar +{ +public: + TranslatedToolbar(){} + TranslatedToolbar(QWidget *parent) + { + m_contained = new QToolBar(parent); + } + void setWindowTitleId(const char * title) + { + m_title = title; + } + operator QToolBar*() + { + return m_contained; + } + QToolBar * operator->() + { + return m_contained; + } + void retranslate() + { + if(m_title) + { + m_contained->setWindowTitle(QApplication::translate("MainWindow", m_title)); + } + } +private: + QToolBar * m_contained = nullptr; + const char * m_title = nullptr; +}; + class MainWindow::Ui { public: - QAction *actionAddInstance; - QAction *actionViewInstanceFolder; - QAction *actionRefresh; - QAction *actionViewCentralModsFolder; - QAction *actionCheckUpdate; - QAction *actionSettings; - QAction *actionReportBug; - QAction *actionPatreon; - QAction *actionMoreNews; - QAction *actionAbout; - QAction *actionLaunchInstance; - QAction *actionRenameInstance; - QAction *actionChangeInstGroup; - QAction *actionChangeInstIcon; - QAction *actionEditInstNotes; - QAction *actionEditInstance; - QAction *actionWorlds; - QAction *actionViewSelectedInstFolder; - QAction *actionDeleteInstance; - QAction *actionConfig_Folder; - QAction *actionCAT; - QAction *actionREDDIT; - QAction *actionDISCORD; - QAction *actionCopyInstance; - QAction *actionManageAccounts; - QAction *actionLaunchInstanceOffline; - QAction *actionScreenshots; - QAction *actionInstanceSettings; - QAction *actionExportInstance; - QWidget *centralWidget; - QHBoxLayout *horizontalLayout; - QToolBar *mainToolBar; - QStatusBar *statusBar; - QToolBar *instanceToolBar; - QToolBar *newsToolBar; + TranslatedAction actionAddInstance; + //TranslatedAction actionRefresh; + TranslatedAction actionCheckUpdate; + TranslatedAction actionSettings; + TranslatedAction actionPatreon; + TranslatedAction actionMoreNews; + TranslatedAction actionManageAccounts; + TranslatedAction actionLaunchInstance; + TranslatedAction actionRenameInstance; + TranslatedAction actionChangeInstGroup; + TranslatedAction actionChangeInstIcon; + TranslatedAction actionEditInstNotes; + TranslatedAction actionEditInstance; + TranslatedAction actionWorlds; + TranslatedAction actionViewSelectedInstFolder; + TranslatedAction actionDeleteInstance; + TranslatedAction actionConfig_Folder; + TranslatedAction actionCAT; + TranslatedAction actionCopyInstance; + TranslatedAction actionLaunchInstanceOffline; + TranslatedAction actionScreenshots; + TranslatedAction actionExportInstance; + QVector<TranslatedAction *> all_actions; + + LabeledToolButton *renameButton = nullptr; + LabeledToolButton *changeIconButton = nullptr; + + QMenu * foldersMenu = nullptr; + TranslatedToolButton foldersMenuButton; + TranslatedAction actionViewInstanceFolder; + TranslatedAction actionViewCentralModsFolder; + + QMenu * helpMenu = nullptr; + TranslatedToolButton helpMenuButton; + TranslatedAction actionReportBug; + TranslatedAction actionDISCORD; + TranslatedAction actionREDDIT; + TranslatedAction actionAbout; + + QVector<TranslatedToolButton *> all_toolbuttons; + + QWidget *centralWidget = nullptr; + QHBoxLayout *horizontalLayout = nullptr; + QStatusBar *statusBar = nullptr; + + TranslatedToolbar mainToolBar; + TranslatedToolbar instanceToolBar; + TranslatedToolbar newsToolBar; + QVector<TranslatedToolbar *> all_toolbars; bool m_kill = false; void updateLaunchAction() { if(m_kill) { - actionLaunchInstance->setText(tr("Kill")); - actionLaunchInstance->setToolTip(tr("Kill the running instance")); + actionLaunchInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Kill")); + actionLaunchInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Kill the running instance")); } else { - actionLaunchInstance->setText(tr("Launch")); - actionLaunchInstance->setToolTip(tr("Launch the selected instance.")); + actionLaunchInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Launch")); + actionLaunchInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Launch the selected instance.")); } + actionLaunchInstance.retranslate(); } void setLaunchAction(bool kill) { @@ -150,168 +241,349 @@ public: updateLaunchAction(); } - void setupUi(QMainWindow *MainWindow) + void createMainToolbar(QMainWindow *MainWindow) { - if (MainWindow->objectName().isEmpty()) - { - MainWindow->setObjectName(QStringLiteral("MainWindow")); - } - MainWindow->resize(694, 563); - MainWindow->setWindowIcon(MMC->getThemedIcon("multimc")); - actionAddInstance = new QAction(MainWindow); + mainToolBar = TranslatedToolbar(MainWindow); + mainToolBar->setObjectName(QStringLiteral("mainToolBar")); + mainToolBar->setMovable(false); + mainToolBar->setAllowedAreas(Qt::TopToolBarArea); + mainToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + mainToolBar->setFloatable(false); + mainToolBar.setWindowTitleId(QT_TRANSLATE_NOOP("MainWindow", "Main Toolbar")); + + actionAddInstance = TranslatedAction(MainWindow); actionAddInstance->setObjectName(QStringLiteral("actionAddInstance")); actionAddInstance->setIcon(MMC->getThemedIcon("new")); - actionViewInstanceFolder = new QAction(MainWindow); + actionAddInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Add Instance")); + actionAddInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Add a new instance.")); + all_actions.append(&actionAddInstance); + mainToolBar->addAction(actionAddInstance); + + mainToolBar->addSeparator(); + + foldersMenu = new QMenu(MainWindow); + foldersMenu->setToolTipsVisible(true); + + actionViewInstanceFolder = TranslatedAction(MainWindow); actionViewInstanceFolder->setObjectName(QStringLiteral("actionViewInstanceFolder")); actionViewInstanceFolder->setIcon(MMC->getThemedIcon("viewfolder")); - actionRefresh = new QAction(MainWindow); - actionRefresh->setObjectName(QStringLiteral("actionRefresh")); - actionRefresh->setIcon(MMC->getThemedIcon("refresh")); - actionViewCentralModsFolder = new QAction(MainWindow); + actionViewInstanceFolder.setTextId(QT_TRANSLATE_NOOP("MainWindow", "View Instance Folder")); + actionViewInstanceFolder.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the instance folder in a file browser.")); + all_actions.append(&actionViewInstanceFolder); + foldersMenu->addAction(actionViewInstanceFolder); + + actionViewCentralModsFolder = TranslatedAction(MainWindow); actionViewCentralModsFolder->setObjectName(QStringLiteral("actionViewCentralModsFolder")); actionViewCentralModsFolder->setIcon(MMC->getThemedIcon("centralmods")); - if(BuildConfig.UPDATER_ENABLED) - { - actionCheckUpdate = new QAction(MainWindow); - actionCheckUpdate->setObjectName(QStringLiteral("actionCheckUpdate")); - actionCheckUpdate->setIcon(MMC->getThemedIcon("checkupdate")); - } - actionSettings = new QAction(MainWindow); + actionViewCentralModsFolder.setTextId(QT_TRANSLATE_NOOP("MainWindow", "View Central Mods Folder")); + actionViewCentralModsFolder.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the central mods folder in a file browser.")); + all_actions.append(&actionViewCentralModsFolder); + foldersMenu->addAction(actionViewCentralModsFolder); + + foldersMenuButton = TranslatedToolButton(MainWindow); + foldersMenuButton.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Folders")); + foldersMenuButton.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open one of the folders shared between instances.")); + foldersMenuButton->setMenu(foldersMenu); + foldersMenuButton->setPopupMode(QToolButton::InstantPopup); + foldersMenuButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + foldersMenuButton->setIcon(MMC->getThemedIcon("viewfolder")); + all_toolbuttons.append(&foldersMenuButton); + QWidgetAction* foldersButtonAction = new QWidgetAction(MainWindow); + foldersButtonAction->setDefaultWidget(foldersMenuButton); + mainToolBar->addAction(foldersButtonAction); + + actionSettings = TranslatedAction(MainWindow); actionSettings->setObjectName(QStringLiteral("actionSettings")); actionSettings->setIcon(MMC->getThemedIcon("settings")); actionSettings->setMenuRole(QAction::PreferencesRole); - actionReportBug = new QAction(MainWindow); + actionSettings.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Settings")); + actionSettings.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Change settings.")); + all_actions.append(&actionSettings); + mainToolBar->addAction(actionSettings); + + helpMenu = new QMenu(MainWindow); + helpMenu->setToolTipsVisible(true); + + actionReportBug = TranslatedAction(MainWindow); actionReportBug->setObjectName(QStringLiteral("actionReportBug")); actionReportBug->setIcon(MMC->getThemedIcon("bug")); - actionPatreon = new QAction(MainWindow); - actionPatreon->setObjectName(QStringLiteral("actionPatreon")); - actionPatreon->setIcon(MMC->getThemedIcon("patreon")); - actionMoreNews = new QAction(MainWindow); - actionMoreNews->setObjectName(QStringLiteral("actionMoreNews")); - actionMoreNews->setIcon(MMC->getThemedIcon("news")); - actionAbout = new QAction(MainWindow); + actionReportBug.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Report a Bug")); + actionReportBug.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the bug tracker to report a bug with MultiMC.")); + all_actions.append(&actionReportBug); + helpMenu->addAction(actionReportBug); + + actionDISCORD = TranslatedAction(MainWindow); + actionDISCORD->setObjectName(QStringLiteral("actionDISCORD")); + actionDISCORD->setIcon(MMC->getThemedIcon("discord")); + actionDISCORD.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Discord")); + actionDISCORD.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open MultiMC discord voice chat.")); + all_actions.append(&actionDISCORD); + helpMenu->addAction(actionDISCORD); + + actionREDDIT = TranslatedAction(MainWindow); + actionREDDIT->setObjectName(QStringLiteral("actionREDDIT")); + actionREDDIT->setIcon(MMC->getThemedIcon("reddit-alien")); + actionREDDIT.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Reddit")); + actionREDDIT.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open MultiMC subreddit.")); + all_actions.append(&actionREDDIT); + helpMenu->addAction(actionREDDIT); + + actionAbout = TranslatedAction(MainWindow); actionAbout->setObjectName(QStringLiteral("actionAbout")); actionAbout->setIcon(MMC->getThemedIcon("about")); actionAbout->setMenuRole(QAction::AboutRole); - actionLaunchInstance = new QAction(MainWindow); - actionLaunchInstance->setObjectName(QStringLiteral("actionLaunchInstance")); - actionRenameInstance = new QAction(MainWindow); - actionRenameInstance->setObjectName(QStringLiteral("actionRenameInstance")); - actionChangeInstGroup = new QAction(MainWindow); - actionChangeInstGroup->setObjectName(QStringLiteral("actionChangeInstGroup")); - actionChangeInstIcon = new QAction(MainWindow); - actionChangeInstIcon->setObjectName(QStringLiteral("actionChangeInstIcon")); - actionChangeInstIcon->setEnabled(true); - actionChangeInstIcon->setIcon(QIcon(":/icons/instances/infinity")); - actionChangeInstIcon->setIconVisibleInMenu(true); - actionEditInstNotes = new QAction(MainWindow); - actionEditInstNotes->setObjectName(QStringLiteral("actionEditInstNotes")); - actionEditInstance = new QAction(MainWindow); - actionEditInstance->setObjectName(QStringLiteral("actionEditInstance")); - actionWorlds = new QAction(MainWindow); - actionWorlds->setObjectName(QStringLiteral("actionWorlds")); - actionViewSelectedInstFolder = new QAction(MainWindow); - actionViewSelectedInstFolder->setObjectName(QStringLiteral("actionViewSelectedInstFolder")); - actionDeleteInstance = new QAction(MainWindow); - actionDeleteInstance->setObjectName(QStringLiteral("actionDeleteInstance")); - actionConfig_Folder = new QAction(MainWindow); - actionConfig_Folder->setObjectName(QStringLiteral("actionConfig_Folder")); - actionCAT = new QAction(MainWindow); + actionAbout.setTextId(QT_TRANSLATE_NOOP("MainWindow", "About MultiMC")); + actionAbout.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "View information about MultiMC.")); + all_actions.append(&actionAbout); + helpMenu->addAction(actionAbout); + + helpMenuButton = TranslatedToolButton(MainWindow); + helpMenuButton.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Help")); + helpMenuButton.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Get help with MultiMC or Minecraft.")); + helpMenuButton->setMenu(helpMenu); + helpMenuButton->setPopupMode(QToolButton::InstantPopup); + helpMenuButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + helpMenuButton->setIcon(MMC->getThemedIcon("help")); + all_toolbuttons.append(&helpMenuButton); + QWidgetAction* helpButtonAction = new QWidgetAction(MainWindow); + helpButtonAction->setDefaultWidget(helpMenuButton); + mainToolBar->addAction(helpButtonAction); + + if(BuildConfig.UPDATER_ENABLED) + { + actionCheckUpdate = TranslatedAction(MainWindow); + actionCheckUpdate->setObjectName(QStringLiteral("actionCheckUpdate")); + actionCheckUpdate->setIcon(MMC->getThemedIcon("checkupdate")); + actionCheckUpdate.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Update")); + actionCheckUpdate.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Check for new updates for MultiMC.")); + all_actions.append(&actionCheckUpdate); + mainToolBar->addAction(actionCheckUpdate); + } + + mainToolBar->addSeparator(); + + actionPatreon = TranslatedAction(MainWindow); + actionPatreon->setObjectName(QStringLiteral("actionPatreon")); + actionPatreon->setIcon(MMC->getThemedIcon("patreon")); + actionPatreon.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Support MultiMC")); + actionPatreon.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the MultiMC Patreon page.")); + all_actions.append(&actionPatreon); + mainToolBar->addAction(actionPatreon); + + actionCAT = TranslatedAction(MainWindow); actionCAT->setObjectName(QStringLiteral("actionCAT")); actionCAT->setCheckable(true); actionCAT->setIcon(MMC->getThemedIcon("cat")); - actionREDDIT = new QAction(MainWindow); - actionREDDIT->setObjectName(QStringLiteral("actionREDDIT")); - actionREDDIT->setIcon(MMC->getThemedIcon("reddit-alien")); - actionDISCORD = new QAction(MainWindow); - actionDISCORD->setObjectName(QStringLiteral("actionDISCORD")); - actionDISCORD->setIcon(MMC->getThemedIcon("discord")); - actionCopyInstance = new QAction(MainWindow); - actionCopyInstance->setObjectName(QStringLiteral("actionCopyInstance")); - actionCopyInstance->setIcon(MMC->getThemedIcon("copy")); - actionManageAccounts = new QAction(MainWindow); + actionCAT.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Meow")); + actionCAT.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "It's a fluffy kitty :3")); + actionCAT->setPriority(QAction::LowPriority); + all_actions.append(&actionCAT); + mainToolBar->addAction(actionCAT); + + // profile menu and its actions + actionManageAccounts = TranslatedAction(MainWindow); actionManageAccounts->setObjectName(QStringLiteral("actionManageAccounts")); - actionLaunchInstanceOffline = new QAction(MainWindow); - actionLaunchInstanceOffline->setObjectName(QStringLiteral("actionLaunchInstanceOffline")); - actionScreenshots = new QAction(MainWindow); - actionScreenshots->setObjectName(QStringLiteral("actionScreenshots")); - actionInstanceSettings = new QAction(MainWindow); - actionInstanceSettings->setObjectName(QStringLiteral("actionInstanceSettings")); - actionExportInstance = new QAction(MainWindow); - actionExportInstance->setObjectName(QStringLiteral("actionExportInstance")); - centralWidget = new QWidget(MainWindow); - centralWidget->setObjectName(QStringLiteral("centralWidget")); - horizontalLayout = new QHBoxLayout(centralWidget); - horizontalLayout->setSpacing(0); - horizontalLayout->setContentsMargins(11, 11, 11, 11); - horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); - horizontalLayout->setSizeConstraint(QLayout::SetDefaultConstraint); - horizontalLayout->setContentsMargins(0, 0, 0, 0); - MainWindow->setCentralWidget(centralWidget); - mainToolBar = new QToolBar(MainWindow); - mainToolBar->setObjectName(QStringLiteral("mainToolBar")); - mainToolBar->setMovable(false); - mainToolBar->setAllowedAreas(Qt::TopToolBarArea); - mainToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); - mainToolBar->setFloatable(false); + actionManageAccounts.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Manage Accounts")); + // FIXME: no tooltip! + actionManageAccounts->setCheckable(false); + actionManageAccounts->setIcon(MMC->getThemedIcon("accounts")); + all_actions.append(&actionManageAccounts); + + all_toolbars.append(&mainToolBar); MainWindow->addToolBar(Qt::TopToolBarArea, mainToolBar); + } + + void createStatusBar(QMainWindow *MainWindow) + { statusBar = new QStatusBar(MainWindow); statusBar->setObjectName(QStringLiteral("statusBar")); MainWindow->setStatusBar(statusBar); - instanceToolBar = new QToolBar(MainWindow); - instanceToolBar->setObjectName(QStringLiteral("instanceToolBar")); - instanceToolBar->setEnabled(true); - instanceToolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea); - instanceToolBar->setIconSize(QSize(80, 80)); - instanceToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); - instanceToolBar->setFloatable(false); - MainWindow->addToolBar(Qt::RightToolBarArea, instanceToolBar); - newsToolBar = new QToolBar(MainWindow); + } + + void createNewsToolbar(QMainWindow *MainWindow) + { + newsToolBar = TranslatedToolbar(MainWindow); newsToolBar->setObjectName(QStringLiteral("newsToolBar")); newsToolBar->setMovable(false); newsToolBar->setAllowedAreas(Qt::BottomToolBarArea); newsToolBar->setIconSize(QSize(16, 16)); newsToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); newsToolBar->setFloatable(false); + newsToolBar->setWindowTitle(QT_TRANSLATE_NOOP("MainWindow", "News Toolbar")); + + actionMoreNews = TranslatedAction(MainWindow); + actionMoreNews->setObjectName(QStringLiteral("actionMoreNews")); + actionMoreNews->setIcon(MMC->getThemedIcon("news")); + actionMoreNews.setTextId(QT_TRANSLATE_NOOP("MainWindow", "More news...")); + actionMoreNews.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the MultiMC development blog to read more news about MultiMC.")); + all_actions.append(&actionMoreNews); + newsToolBar->addAction(actionMoreNews); + + all_toolbars.append(&newsToolBar); MainWindow->addToolBar(Qt::BottomToolBarArea, newsToolBar); + } - mainToolBar->addAction(actionAddInstance); - mainToolBar->addAction(actionCopyInstance); - mainToolBar->addSeparator(); - mainToolBar->addAction(actionViewInstanceFolder); - mainToolBar->addAction(actionViewCentralModsFolder); - mainToolBar->addAction(actionRefresh); - mainToolBar->addSeparator(); - if(BuildConfig.UPDATER_ENABLED) - { - mainToolBar->addAction(actionCheckUpdate); - } - mainToolBar->addAction(actionSettings); - mainToolBar->addSeparator(); - mainToolBar->addAction(actionReportBug); - mainToolBar->addAction(actionAbout); - mainToolBar->addSeparator(); - mainToolBar->addAction(actionPatreon); - mainToolBar->addAction(actionREDDIT); - mainToolBar->addAction(actionDISCORD); - mainToolBar->addAction(actionCAT); - instanceToolBar->addAction(actionChangeInstIcon); + void createInstanceToolbar(QMainWindow *MainWindow) + { + instanceToolBar = TranslatedToolbar(MainWindow); + instanceToolBar->setObjectName(QStringLiteral("instanceToolBar")); + // disabled until we have an instance selected + instanceToolBar->setEnabled(false); + instanceToolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea); + instanceToolBar->setToolButtonStyle(Qt::ToolButtonTextOnly); + instanceToolBar->setFloatable(false); + instanceToolBar->setWindowTitle(QT_TRANSLATE_NOOP("MainWindow", "Instance Toolbar")); + + // NOTE: not added to toolbar, but used for instance context menu (right click) + actionChangeInstIcon = TranslatedAction(MainWindow); + actionChangeInstIcon->setObjectName(QStringLiteral("actionChangeInstIcon")); + actionChangeInstIcon->setIcon(QIcon(":/icons/instances/infinity")); + actionChangeInstIcon->setIconVisibleInMenu(true); + actionChangeInstIcon.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Change Icon")); + actionChangeInstIcon.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Change the selected instance's icon.")); + all_actions.append(&actionChangeInstIcon); + + changeIconButton = new LabeledToolButton(MainWindow); + changeIconButton->setObjectName(QStringLiteral("changeIconButton")); + changeIconButton->setIcon(MMC->getThemedIcon("news")); + changeIconButton->setToolTip(actionChangeInstIcon->toolTip()); + changeIconButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + instanceToolBar->addWidget(changeIconButton); + + // NOTE: not added to toolbar, but used for instance context menu (right click) + actionRenameInstance = TranslatedAction(MainWindow); + actionRenameInstance->setObjectName(QStringLiteral("actionRenameInstance")); + actionRenameInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Rename")); + actionRenameInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Rename the selected instance.")); + all_actions.append(&actionRenameInstance); + + // the rename label is inside the rename tool button + renameButton = new LabeledToolButton(MainWindow); + renameButton->setObjectName(QStringLiteral("renameButton")); + renameButton->setToolTip(actionRenameInstance->toolTip()); + renameButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + instanceToolBar->addWidget(renameButton); + + instanceToolBar->addSeparator(); + + actionLaunchInstance = TranslatedAction(MainWindow); + actionLaunchInstance->setObjectName(QStringLiteral("actionLaunchInstance")); + all_actions.append(&actionLaunchInstance); instanceToolBar->addAction(actionLaunchInstance); + + actionLaunchInstanceOffline = TranslatedAction(MainWindow); + actionLaunchInstanceOffline->setObjectName(QStringLiteral("actionLaunchInstanceOffline")); + actionLaunchInstanceOffline.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Launch Offline")); + actionLaunchInstanceOffline.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Launch the selected instance in offline mode.")); + all_actions.append(&actionLaunchInstanceOffline); instanceToolBar->addAction(actionLaunchInstanceOffline); + instanceToolBar->addSeparator(); + + actionEditInstance = TranslatedAction(MainWindow); + actionEditInstance->setObjectName(QStringLiteral("actionEditInstance")); + actionEditInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Edit Instance")); + actionEditInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Change the instance settings, mods and versions.")); + all_actions.append(&actionEditInstance); instanceToolBar->addAction(actionEditInstance); - instanceToolBar->addAction(actionInstanceSettings); + + actionEditInstNotes = TranslatedAction(MainWindow); + actionEditInstNotes->setObjectName(QStringLiteral("actionEditInstNotes")); + actionEditInstNotes.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Edit Notes")); + actionEditInstNotes.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Edit the notes for the selected instance.")); + all_actions.append(&actionEditInstNotes); instanceToolBar->addAction(actionEditInstNotes); + + actionWorlds = TranslatedAction(MainWindow); + actionWorlds->setObjectName(QStringLiteral("actionWorlds")); + actionWorlds.setTextId(QT_TRANSLATE_NOOP("MainWindow", "View Worlds")); + actionWorlds.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "View the worlds of this instance.")); + all_actions.append(&actionWorlds); instanceToolBar->addAction(actionWorlds); + + actionScreenshots = TranslatedAction(MainWindow); + actionScreenshots->setObjectName(QStringLiteral("actionScreenshots")); + actionScreenshots.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Manage Screenshots")); + actionScreenshots.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "View and upload screenshots for this instance.")); + all_actions.append(&actionScreenshots); instanceToolBar->addAction(actionScreenshots); + + actionChangeInstGroup = TranslatedAction(MainWindow); + actionChangeInstGroup->setObjectName(QStringLiteral("actionChangeInstGroup")); + actionChangeInstGroup.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Change Group")); + actionChangeInstGroup.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Change the selected instance's group.")); + all_actions.append(&actionChangeInstGroup); instanceToolBar->addAction(actionChangeInstGroup); + instanceToolBar->addSeparator(); + + actionViewSelectedInstFolder = TranslatedAction(MainWindow); + actionViewSelectedInstFolder->setObjectName(QStringLiteral("actionViewSelectedInstFolder")); + actionViewSelectedInstFolder.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Instance Folder")); + actionViewSelectedInstFolder.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the selected instance's root folder in a file browser.")); + all_actions.append(&actionViewSelectedInstFolder); instanceToolBar->addAction(actionViewSelectedInstFolder); + + actionConfig_Folder = TranslatedAction(MainWindow); + actionConfig_Folder->setObjectName(QStringLiteral("actionConfig_Folder")); + actionConfig_Folder.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Config Folder")); + actionConfig_Folder.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Open the instance's config folder.")); + all_actions.append(&actionConfig_Folder); instanceToolBar->addAction(actionConfig_Folder); + instanceToolBar->addSeparator(); + + actionExportInstance = TranslatedAction(MainWindow); + actionExportInstance->setObjectName(QStringLiteral("actionExportInstance")); + actionExportInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Export Instance")); + // FIXME: missing tooltip + all_actions.append(&actionExportInstance); instanceToolBar->addAction(actionExportInstance); + + actionDeleteInstance = TranslatedAction(MainWindow); + actionDeleteInstance->setObjectName(QStringLiteral("actionDeleteInstance")); + actionDeleteInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Delete")); + actionDeleteInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Delete the selected instance.")); + all_actions.append(&actionDeleteInstance); instanceToolBar->addAction(actionDeleteInstance); - newsToolBar->addAction(actionMoreNews); + + actionCopyInstance = TranslatedAction(MainWindow); + actionCopyInstance->setObjectName(QStringLiteral("actionCopyInstance")); + actionCopyInstance->setIcon(MMC->getThemedIcon("copy")); + actionCopyInstance.setTextId(QT_TRANSLATE_NOOP("MainWindow", "Copy Instance")); + actionCopyInstance.setTooltipId(QT_TRANSLATE_NOOP("MainWindow", "Copy the selected instance.")); + all_actions.append(&actionCopyInstance); + instanceToolBar->addAction(actionCopyInstance); + + all_toolbars.append(&instanceToolBar); + MainWindow->addToolBar(Qt::RightToolBarArea, instanceToolBar); + } + + void setupUi(QMainWindow *MainWindow) + { + if (MainWindow->objectName().isEmpty()) + { + MainWindow->setObjectName(QStringLiteral("MainWindow")); + } + MainWindow->resize(694, 563); + MainWindow->setWindowIcon(MMC->getThemedIcon("logo")); + MainWindow->setWindowTitle("MultiMC 5"); + + createMainToolbar(MainWindow); + + centralWidget = new QWidget(MainWindow); + centralWidget->setObjectName(QStringLiteral("centralWidget")); + horizontalLayout = new QHBoxLayout(centralWidget); + horizontalLayout->setSpacing(0); + horizontalLayout->setContentsMargins(11, 11, 11, 11); + horizontalLayout->setObjectName(QStringLiteral("horizontalLayout")); + horizontalLayout->setSizeConstraint(QLayout::SetDefaultConstraint); + horizontalLayout->setContentsMargins(0, 0, 0, 0); + MainWindow->setCentralWidget(centralWidget); + + createStatusBar(MainWindow); + createNewsToolbar(MainWindow); + createInstanceToolbar(MainWindow); retranslateUi(MainWindow); @@ -320,69 +592,28 @@ public: void retranslateUi(QMainWindow *MainWindow) { - MainWindow->setWindowTitle("MultiMC 5"); - actionAddInstance->setText(tr("Add Instance")); - actionAddInstance->setToolTip(tr("Add a new instance.")); - actionViewInstanceFolder->setText(tr("View Instance Folder")); - actionViewInstanceFolder->setToolTip(tr("Open the instance folder in a file browser.")); - actionRefresh->setText(tr("Refresh")); - actionRefresh->setToolTip(tr("Reload the instance list.")); - actionViewCentralModsFolder->setText(tr("View Central Mods Folder")); - actionViewCentralModsFolder->setToolTip(tr("Open the central mods folder in a file browser.")); - if(BuildConfig.UPDATER_ENABLED) + QString winTitle = tr("MultiMC 5 - Version %1").arg(BuildConfig.printableVersionString()); + if (!BuildConfig.BUILD_PLATFORM.isEmpty()) { - actionCheckUpdate->setText(tr("Check for Updates")); - actionCheckUpdate->setToolTip(tr("Check for new updates for MultiMC.")); + winTitle += tr(" on %1", "on platform, as in operating system").arg(BuildConfig.BUILD_PLATFORM); } - actionSettings->setText(tr("Settings")); - actionSettings->setToolTip(tr("Change settings.")); - actionReportBug->setText(tr("Report a Bug")); - actionReportBug->setToolTip(tr("Open the bug tracker to report a bug with MultiMC.")); - actionPatreon->setText(tr("Support us on Patreon!")); - actionPatreon->setToolTip(tr("Open the MultiMC Patreon page.")); - actionMoreNews->setText(tr("More news...")); - actionMoreNews->setToolTip(tr("Open the MultiMC development blog to read more news about MultiMC.")); - actionAbout->setText(tr("About MultiMC")); - actionAbout->setToolTip(tr("View information about MultiMC.")); - updateLaunchAction(); - actionRenameInstance->setText(tr("Instance Name")); - actionRenameInstance->setToolTip(tr("Rename the selected instance.")); - actionChangeInstGroup->setText(tr("Change Group")); - actionChangeInstGroup->setToolTip(tr("Change the selected instance's group.")); - actionChangeInstIcon->setText(tr("Change Icon")); - actionChangeInstIcon->setToolTip(tr("Change the selected instance's icon.")); - actionEditInstNotes->setText(tr("Edit Notes")); - actionEditInstNotes->setToolTip(tr("Edit the notes for the selected instance.")); - actionWorlds->setText(tr("View Worlds")); - actionWorlds->setToolTip(tr("View the worlds of this instance.")); - actionEditInstance->setText(tr("Edit Instance")); - actionEditInstance->setToolTip(tr("Change the instance settings, mods and versions.")); - actionViewSelectedInstFolder->setText(tr("Instance Folder")); - actionViewSelectedInstFolder->setToolTip(tr("Open the selected instance's root folder in a file browser.")); - actionDeleteInstance->setText(tr("Delete")); - actionDeleteInstance->setToolTip(tr("Delete the selected instance.")); - actionConfig_Folder->setText(tr("Config Folder")); - actionConfig_Folder->setToolTip(tr("Open the instance's config folder.")); - actionCAT->setText(tr("Meow")); - actionCAT->setToolTip(tr("It's a fluffy kitty :3")); - actionREDDIT->setText(tr("Reddit")); - actionREDDIT->setToolTip(tr("Open MultiMC subreddit.")); - actionDISCORD->setText(tr("Discord")); - actionDISCORD->setToolTip(tr("Open MultiMC discord voice chat.")); - actionCopyInstance->setText(tr("Copy Instance")); - actionCopyInstance->setToolTip(tr("Copy the selected instance.")); - actionManageAccounts->setText(tr("Manage Accounts")); - actionManageAccounts->setToolTip(tr("Manage your Mojang or Minecraft accounts.")); - actionLaunchInstanceOffline->setText(tr("Launch Offline")); - actionLaunchInstanceOffline->setToolTip(tr("Launch the selected instance in offline mode.")); - actionScreenshots->setText(tr("Manage Screenshots")); - actionScreenshots->setToolTip(tr("View and upload screenshots for this instance.")); - actionInstanceSettings->setText(tr("Instance Settings")); - actionInstanceSettings->setToolTip(tr("Change the settings specific to the instance.")); - actionExportInstance->setText(tr("Export Instance")); - mainToolBar->setWindowTitle(tr("Main Toolbar")); - instanceToolBar->setWindowTitle(tr("Instance Toolbar")); - newsToolBar->setWindowTitle(tr("News Toolbar")); + MainWindow->setWindowTitle(winTitle); + // all the actions + for(auto * item: all_actions) + { + item->retranslate(); + } + for(auto * item: all_toolbars) + { + item->retranslate(); + } + for(auto * item: all_toolbuttons) + { + item->retranslate(); + } + // submenu buttons + foldersMenuButton->setText(tr("Folders")); + helpMenuButton->setText(tr("Help")); } // retranslateUi }; @@ -390,13 +621,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow { ui->setupUi(this); - QString winTitle = tr("MultiMC 5 - Version %1").arg(BuildConfig.printableVersionString()); - if (!BuildConfig.BUILD_PLATFORM.isEmpty()) - { - winTitle += tr(" on %1", "on platform, as in operating system").arg(BuildConfig.BUILD_PLATFORM); - } - setWindowTitle(winTitle); - // OSX magic. setUnifiedTitleAndToolBarOnMac(true); @@ -407,21 +631,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow connect(q, SIGNAL(activated()), qApp, SLOT(quit())); } - // The instance action toolbar customizations - { - // disabled until we have an instance selected - ui->instanceToolBar->setEnabled(false); - - // the rename label is inside the rename tool button - renameButton = new LabeledToolButton(); - renameButton->setText("Instance Name"); - renameButton->setToolTip(ui->actionRenameInstance->toolTip()); - connect(renameButton, SIGNAL(clicked(bool)), SLOT(on_actionRenameInstance_triggered())); - ui->instanceToolBar->insertWidget(ui->actionLaunchInstance, renameButton); - ui->instanceToolBar->insertSeparator(ui->actionLaunchInstance); - renameButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - } - // Add the news label to the news toolbar. { m_newsChecker.reset(new NewsChecker(BuildConfig.NEWS_RSS_URL)); @@ -489,10 +698,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow ui->mainToolBar->addWidget(spacer); accountMenu = new QMenu(this); - manageAccountsAction = new QAction(tr("Manage Accounts"), this); - manageAccountsAction->setCheckable(false); - manageAccountsAction->setIcon(MMC->getThemedIcon("accounts")); - connect(manageAccountsAction, SIGNAL(triggered(bool)), this, SLOT(on_actionManageAccounts_triggered())); repopulateAccountsMenu(); @@ -566,6 +771,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow { bool updatesAllowed = MMC->updatesAreAllowed(); updatesAllowedChanged(updatesAllowed); + + connect(ui->actionCheckUpdate, &QAction::triggered, this, &MainWindow::checkForUpdates); + // set up the updater object. auto updater = MMC->updateChecker(); connect(updater.get(), &UpdateChecker::updateAvailable, this, &MainWindow::updateAvailable); @@ -616,22 +824,17 @@ void MainWindow::showInstanceContextMenu(const QPoint &pos) { actions = ui->instanceToolBar->actions(); - QAction *actionVoid = new QAction(m_selectedInstance->name(), this); - actionVoid->setEnabled(false); - - QAction *actionRename = new QAction(tr("Rename"), this); - actionRename->setToolTip(ui->actionRenameInstance->toolTip()); + // replace the change icon widget with an actual action + actions.replace(0, ui->actionChangeInstIcon); - QAction *actionCopyInstance = new QAction(tr("Copy instance"), this); - actionCopyInstance->setToolTip(ui->actionCopyInstance->toolTip()); + // replace the rename widget with an actual action + actions.replace(1, ui->actionRenameInstance); - connect(actionRename, SIGNAL(triggered(bool)), SLOT(on_actionRenameInstance_triggered())); - connect(actionCopyInstance, SIGNAL(triggered(bool)), SLOT(on_actionCopyInstance_triggered())); - - actions.replace(1, actionRename); + // add header actions.prepend(actionSep); + QAction *actionVoid = new QAction(m_selectedInstance->name(), this); + actionVoid->setEnabled(false); actions.prepend(actionVoid); - actions.append(actionCopyInstance); } else { @@ -660,14 +863,16 @@ void MainWindow::showInstanceContextMenu(const QPoint &pos) QVariantMap data; data["group"] = group; actionDeleteGroup->setData(data); - connect(actionDeleteGroup, SIGNAL(triggered(bool)), SLOT(on_actionDeleteGroup_triggered())); + connect(actionDeleteGroup, SIGNAL(triggered(bool)), SLOT(deleteGroup())); actions.append(actionDeleteGroup); } } QMenu myMenu; myMenu.addActions(actions); + /* if (onInstance) myMenu.setEnabled(m_selectedInstance->canLaunch()); + */ myMenu.exec(view->mapToGlobal(pos)); } @@ -795,7 +1000,7 @@ void MainWindow::repopulateAccountsMenu() connect(action, SIGNAL(triggered(bool)), SLOT(changeActiveAccount())); accountMenu->addSeparator(); - accountMenu->addAction(manageAccountsAction); + accountMenu->addAction(ui->actionManageAccounts); } void MainWindow::updatesAllowedChanged(bool allowed) @@ -870,7 +1075,7 @@ bool MainWindow::eventFilter(QObject *obj, QEvent *ev) on_actionDeleteInstance_triggered(); return true; case Qt::Key_F5: - on_actionRefresh_triggered(); + refreshInstances(); return true; case Qt::Key_F2: on_actionRenameInstance_triggered(); @@ -1034,7 +1239,15 @@ void MainWindow::runModalTask(Task *task) { connect(task, &Task::failed, [this](QString reason) { - CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Warning)->show(); + CustomMessageBox::selectable(this, tr("Error"), reason, QMessageBox::Critical)->show(); + }); + connect(task, &Task::succeeded, [this, task]() + { + QStringList warnings = task->warnings(); + if(warnings.count()) + { + CustomMessageBox::selectable(this, tr("Warnings"), warnings.join('\n'), QMessageBox::Warning)->show(); + } }); ProgressDialog loadDialog(this); loadDialog.setSkipButton(true, tr("Abort")); @@ -1059,6 +1272,14 @@ void MainWindow::instanceFromVersion(QString instName, QString instGroup, QStrin // finalizeInstance(newInstance); } +void MainWindow::instanceFromFtbPack(FtbPackDownloader *downloader, QString instName, QString instGroup, QString instIcon) { + std::unique_ptr<Task> task(MMC->folderProvider()->ftbCreationTask(downloader, instName, instGroup, instIcon)); + runModalTask(task.get()); + + // FIXME: handle instance selection after creation + // finalizeInstance(newInstance); +} + void MainWindow::on_actionCopyInstance_triggered() { if (!m_selectedInstance) @@ -1083,7 +1304,7 @@ void MainWindow::finalizeInstance(InstancePtr inst) if (MMC->accounts()->anyAccountIsValid()) { ProgressDialog loadDialog(this); - auto update = inst->createUpdateTask(); + auto update = inst->createUpdateTask(Net::Mode::Online); connect(update.get(), &Task::failed, [this](QString reason) { QString error = QString("Instance load failed: %1").arg(reason); @@ -1134,7 +1355,10 @@ void MainWindow::addInstance(QString url) const QUrl modpackUrl = newInstDlg.modpackUrl(); - if (modpackUrl.isValid()) + if(newInstDlg.isFtbModpackRequested()) { + instanceFromFtbPack(newInstDlg.getFtbPackDownloader(), newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey()); + } + else if (modpackUrl.isValid()) { instanceFromZipPack(newInstDlg.instName(), newInstDlg.instGroup(), newInstDlg.iconKey(), modpackUrl); } @@ -1186,8 +1410,9 @@ void MainWindow::on_actionChangeInstIcon_triggered() if (dlg.result() == QDialog::Accepted) { m_selectedInstance->setIconKey(dlg.selectedIconKey); - auto ico = MMC->icons()->getBigIcon(dlg.selectedIconKey); - ui->actionChangeInstIcon->setIcon(ico); + auto icon = MMC->icons()->getIcon(dlg.selectedIconKey); + ui->actionChangeInstIcon->setIcon(icon); + ui->changeIconButton->setIcon(icon); } } @@ -1195,14 +1420,18 @@ void MainWindow::iconUpdated(QString icon) { if (icon == m_currentInstIcon) { - ui->actionChangeInstIcon->setIcon(MMC->icons()->getBigIcon(m_currentInstIcon)); + auto icon = MMC->icons()->getIcon(m_currentInstIcon); + ui->actionChangeInstIcon->setIcon(icon); + ui->changeIconButton->setIcon(icon); } } void MainWindow::updateInstanceToolIcon(QString new_icon) { m_currentInstIcon = new_icon; - ui->actionChangeInstIcon->setIcon(MMC->icons()->getBigIcon(m_currentInstIcon)); + auto icon = MMC->icons()->getIcon(m_currentInstIcon); + ui->actionChangeInstIcon->setIcon(icon); + ui->changeIconButton->setIcon(icon); } void MainWindow::setSelectedInstanceById(const QString &id) @@ -1235,7 +1464,7 @@ void MainWindow::on_actionChangeInstGroup_triggered() m_selectedInstance->setGroupPost(name); } -void MainWindow::on_actionDeleteGroup_triggered() +void MainWindow::deleteGroup() { QObject* obj = sender(); if(!obj) @@ -1259,7 +1488,7 @@ void MainWindow::on_actionViewInstanceFolder_triggered() DesktopServices::openDirectory(str); } -void MainWindow::on_actionRefresh_triggered() +void MainWindow::refreshInstances() { MMC->instances()->loadList(true); } @@ -1278,7 +1507,7 @@ void MainWindow::on_actionConfig_Folder_triggered() } } -void MainWindow::on_actionCheckUpdate_triggered() +void MainWindow::checkForUpdates() { if(BuildConfig.UPDATER_ENABLED) { @@ -1379,11 +1608,13 @@ void MainWindow::on_actionDeleteInstance_triggered() { return; } - auto response = CustomMessageBox::selectable(this, tr("CAREFUL!"), tr("About to delete: %1\nThis is permanent and will completely erase " - "all data, even for tracked instances!\nAre you sure?") - .arg(m_selectedInstance->name()), - QMessageBox::Warning, QMessageBox::Yes | QMessageBox::No) - ->exec(); + auto response = CustomMessageBox::selectable( + this, + tr("CAREFUL!"), + tr("About to delete: %1\nThis is permanent and will completely delete the instance.\n\nAre you sure?").arg(m_selectedInstance->name()), + QMessageBox::Warning, + QMessageBox::Yes | QMessageBox::No + )->exec(); if (response == QMessageBox::Yes) { m_selectedInstance->nuke(); @@ -1413,7 +1644,7 @@ void MainWindow::on_actionRenameInstance_triggered() if (ok && name.length()) { m_selectedInstance->setName(name); - renameButton->setText(name); + ui->renameButton->setText(name); } } } @@ -1528,7 +1759,7 @@ void MainWindow::instanceChanged(const QModelIndex ¤t, const QModelIndex & } ui->actionLaunchInstanceOffline->setEnabled(m_selectedInstance->canLaunch()); ui->actionExportInstance->setEnabled(m_selectedInstance->canExport()); - renameButton->setText(m_selectedInstance->name()); + ui->renameButton->setText(m_selectedInstance->name()); m_statusLeft->setText(m_selectedInstance->getStatusbarDescription()); updateInstanceToolIcon(m_selectedInstance->iconKey()); @@ -1562,7 +1793,7 @@ void MainWindow::selectionBad() statusBar()->clearMessage(); ui->instanceToolBar->setEnabled(false); - renameButton->setText(tr("Rename Instance")); + ui->renameButton->setText(tr("Rename Instance")); updateInstanceToolIcon("infinity"); // ...and then see if we can enable the previously selected instance |