diff options
Diffstat (limited to 'gui')
-rw-r--r-- | gui/CopyInstanceDialog.cpp | 84 | ||||
-rw-r--r-- | gui/CopyInstanceDialog.h | 50 | ||||
-rw-r--r-- | gui/CopyInstanceDialog.ui | 134 | ||||
-rw-r--r-- | gui/mainwindow.cpp | 96 | ||||
-rw-r--r-- | gui/mainwindow.h | 10 | ||||
-rw-r--r-- | gui/mainwindow.ui | 20 | ||||
-rw-r--r-- | gui/newinstancedialog.h | 29 |
7 files changed, 387 insertions, 36 deletions
diff --git a/gui/CopyInstanceDialog.cpp b/gui/CopyInstanceDialog.cpp new file mode 100644 index 00000000..1e0b9e6c --- /dev/null +++ b/gui/CopyInstanceDialog.cpp @@ -0,0 +1,84 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <MultiMC.h> +#include "CopyInstanceDialog.h" +#include "ui_CopyInstanceDialog.h" + +#include "logic/InstanceFactory.h" +#include "logic/BaseVersion.h" +#include "logic/lists/IconList.h" +#include "logic/lists/MinecraftVersionList.h" +#include "logic/tasks/Task.h" +#include <logic/BaseInstance.h> + +#include "gui/platform.h" +#include "versionselectdialog.h" +#include "ProgressDialog.h" +#include "IconPickerDialog.h" + +#include <QLayout> +#include <QPushButton> + +CopyInstanceDialog::CopyInstanceDialog(BaseInstance *original, QWidget *parent) + : m_original(original), QDialog(parent), ui(new Ui::CopyInstanceDialog) +{ + MultiMCPlatform::fixWM_CLASS(this); + ui->setupUi(this); + resize(minimumSizeHint()); + layout()->setSizeConstraint(QLayout::SetFixedSize); + + InstIconKey = original->iconKey(); + ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); + ui->instNameTextBox->setText(original->name()); + ui->instNameTextBox->setFocus(); +} + +CopyInstanceDialog::~CopyInstanceDialog() +{ + delete ui; +} + +void CopyInstanceDialog::updateDialogState() +{ + ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!instName().isEmpty()); +} + +QString CopyInstanceDialog::instName() const +{ + return ui->instNameTextBox->text(); +} + +QString CopyInstanceDialog::iconKey() const +{ + return InstIconKey; +} + +void CopyInstanceDialog::on_iconButton_clicked() +{ + IconPickerDialog dlg(this); + dlg.exec(InstIconKey); + + if (dlg.result() == QDialog::Accepted) + { + InstIconKey = dlg.selectedIconKey; + ui->iconButton->setIcon(MMC->icons()->getIcon(InstIconKey)); + } +} + +void CopyInstanceDialog::on_instNameTextBox_textChanged(const QString &arg1) +{ + updateDialogState(); +} diff --git a/gui/CopyInstanceDialog.h b/gui/CopyInstanceDialog.h new file mode 100644 index 00000000..7ab366e2 --- /dev/null +++ b/gui/CopyInstanceDialog.h @@ -0,0 +1,50 @@ +/* Copyright 2013 MultiMC Contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <QDialog> +#include "logic/BaseVersion.h" + +class BaseInstance; + +namespace Ui +{ +class CopyInstanceDialog; +} + +class CopyInstanceDialog : public QDialog +{ + Q_OBJECT + +public: + explicit CopyInstanceDialog(BaseInstance *original, QWidget *parent = 0); + ~CopyInstanceDialog(); + + void updateDialogState(); + + QString instName() const; + QString iconKey() const; + +private +slots: + void on_iconButton_clicked(); + void on_instNameTextBox_textChanged(const QString &arg1); + +private: + Ui::CopyInstanceDialog *ui; + QString InstIconKey; + BaseInstance *m_original; +}; diff --git a/gui/CopyInstanceDialog.ui b/gui/CopyInstanceDialog.ui new file mode 100644 index 00000000..1327ce0b --- /dev/null +++ b/gui/CopyInstanceDialog.ui @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>CopyInstanceDialog</class> + <widget class="QDialog" name="CopyInstanceDialog"> + <property name="windowModality"> + <enum>Qt::ApplicationModal</enum> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>345</width> + <height>205</height> + </rect> + </property> + <property name="windowTitle"> + <string>Copy Instance</string> + </property> + <property name="windowIcon"> + <iconset resource="../multimc.qrc"> + <normaloff>:/icons/toolbar/copy</normaloff>:/icons/toolbar/copy</iconset> + </property> + <property name="modal"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <layout class="QHBoxLayout" name="iconBtnLayout"> + <item> + <spacer name="iconBtnLeftSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QToolButton" name="iconButton"> + <property name="icon"> + <iconset resource="../multimc.qrc"> + <normaloff>:/icons/instances/infinity</normaloff>:/icons/instances/infinity</iconset> + </property> + <property name="iconSize"> + <size> + <width>80</width> + <height>80</height> + </size> + </property> + </widget> + </item> + <item> + <spacer name="iconBtnRightSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QLineEdit" name="instNameTextBox"> + <property name="placeholderText"> + <string>Name</string> + </property> + </widget> + </item> + <item> + <widget class="Line" name="line"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources> + <include location="../multimc.qrc"/> + </resources> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>CopyInstanceDialog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>CopyInstanceDialog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui> diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 316117b7..fd086f11 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -74,6 +74,7 @@ #include "IconPickerDialog.h" #include "LabeledToolButton.h" #include "EditNotesDialog.h" +#include "CopyInstanceDialog.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { @@ -91,7 +92,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi // 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"); @@ -267,8 +270,9 @@ void MainWindow::on_actionAddInstance_triggered() BaseInstance *newInstance = NULL; - QString instDirName = DirNameFromString(newInstDlg.instName()); - QString instDir = PathCombine(MMC->settings()->get("InstanceDir").toString(), instDirName); + QString instancesDir = MMC->settings()->get("InstanceDir").toString(); + QString instDirName = DirNameFromString(newInstDlg.instName(), instancesDir); + QString instDir = PathCombine(instancesDir, instDirName); auto &loader = InstanceFactory::get(); @@ -305,6 +309,56 @@ void MainWindow::on_actionAddInstance_triggered() } } +void MainWindow::on_actionCopyInstance_triggered() +{ + if (!m_selectedInstance) + return; + + CopyInstanceDialog copyInstDlg(m_selectedInstance, this); + if (!copyInstDlg.exec()) + return; + + QString instancesDir = MMC->settings()->get("InstanceDir").toString(); + QString instDirName = DirNameFromString(copyInstDlg.instName(), instancesDir); + QString instDir = PathCombine(instancesDir, instDirName); + + auto &loader = InstanceFactory::get(); + + BaseInstance *newInstance = NULL; + auto error = loader.copyInstance(newInstance, m_selectedInstance, instDir); + + QString errorMsg = QString("Failed to create instance %1: ").arg(instDirName); + switch (error) + { + case InstanceFactory::NoCreateError: + newInstance->setName(copyInstDlg.instName()); + newInstance->setIconKey(copyInstDlg.iconKey()); + MMC->instances()->add(InstancePtr(newInstance)); + return; + + case InstanceFactory::InstExists: + { + errorMsg += "An instance with the given directory name already exists."; + CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show(); + break; + } + + case InstanceFactory::CantCreateDir: + { + errorMsg += "Failed to create the instance directory."; + CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show(); + break; + } + + default: + { + errorMsg += QString("Unknown instance loader error %1").arg(error); + CustomMessageBox::selectable(this, tr("Error"), errorMsg, QMessageBox::Warning)->show(); + break; + } + } +} + void MainWindow::on_actionChangeInstIcon_triggered() { if (!m_selectedInstance) @@ -395,10 +449,10 @@ void MainWindow::on_actionDeleteInstance_triggered() { if (m_selectedInstance) { - auto response = CustomMessageBox::selectable(this, tr("CAREFUL"), - tr("This is permanent! Are you sure?\nAbout to delete: ") - + m_selectedInstance->name(), - QMessageBox::Question, QMessageBox::Yes | QMessageBox::No)->exec(); + auto response = CustomMessageBox::selectable( + this, tr("CAREFUL"), tr("This is permanent! Are you sure?\nAbout to delete: ") + + m_selectedInstance->name(), + QMessageBox::Question, QMessageBox::Yes | QMessageBox::No)->exec(); if (response == QMessageBox::Yes) { m_selectedInstance->nuke(); @@ -640,7 +694,8 @@ void MainWindow::onGameUpdateComplete() void MainWindow::onGameUpdateError(QString error) { - CustomMessageBox::selectable(this, tr("Error updating instance"), error, QMessageBox::Warning)->show(); + CustomMessageBox::selectable(this, tr("Error updating instance"), error, + QMessageBox::Warning)->show(); } void MainWindow::launchInstance(BaseInstance *instance, LoginResponse response) @@ -709,9 +764,10 @@ void MainWindow::on_actionMakeDesktopShortcut_triggered() QStringList() << "-dl" << QDir::currentPath() << "test", name, "application-x-octet-stream"); - CustomMessageBox::selectable(this, tr("Not useful"), - tr("A Dummy Shortcut was created. it will not do anything productive"), - QMessageBox::Warning)->show(); + CustomMessageBox::selectable( + this, tr("Not useful"), + tr("A Dummy Shortcut was created. it will not do anything productive"), + QMessageBox::Warning)->show(); } // BrowserDialog @@ -732,10 +788,11 @@ void MainWindow::on_actionChangeInstMCVersion_triggered() { if (m_selectedInstance->versionIsCustom()) { - auto result = CustomMessageBox::selectable(this, tr("Are you sure?"), - tr("This will remove any library/version customization you did previously. " - "This includes things like Forge install and similar."), - QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Abort)->exec(); + auto result = CustomMessageBox::selectable( + this, tr("Are you sure?"), + tr("This will remove any library/version customization you did previously. " + "This includes things like Forge install and similar."), + QMessageBox::Warning, QMessageBox::Ok, QMessageBox::Abort)->exec(); if (result != QMessageBox::Ok) return; @@ -867,11 +924,12 @@ void MainWindow::checkSetDefaultJava() java = std::dynamic_pointer_cast<JavaVersion>(vselect.selectedVersion()); else { - CustomMessageBox::selectable(this, tr("Invalid version selected"), - tr("You didn't select a valid Java version, so MultiMC will " - "select the default. " - "You can change this in the settings dialog."), - QMessageBox::Warning)->show(); + CustomMessageBox::selectable( + this, tr("Invalid version selected"), + tr("You didn't select a valid Java version, so MultiMC will " + "select the default. " + "You can change this in the settings dialog."), + QMessageBox::Warning)->show(); JavaUtils ju; java = ju.GetDefaultJava(); diff --git a/gui/mainwindow.h b/gui/mainwindow.h index 6715acbb..36562563 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -22,6 +22,7 @@ #include "logic/net/LoginTask.h" #include "logic/BaseInstance.h" +class QToolButton; class LabeledToolButton; class QLabel; class InstanceProxyModel; @@ -51,13 +52,16 @@ public: void checkSetDefaultJava(); -private slots: +private +slots: void onCatToggled(bool); void on_actionAbout_triggered(); void on_actionAddInstance_triggered(); + void on_actionCopyInstance_triggered(); + void on_actionChangeInstGroup_triggered(); void on_actionChangeInstIcon_triggered(); @@ -122,7 +126,8 @@ private slots: void assetsFailed(); void assetsFinished(); -public slots: +public +slots: void instanceActivated(QModelIndex); void instanceChanged(const QModelIndex ¤t, const QModelIndex &previous); @@ -146,6 +151,7 @@ private: ConsoleWindow *console; OneSixAssets *assets_downloader; LabeledToolButton *renameButton; + QToolButton *changeIconButton; BaseInstance *m_selectedInstance; diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui index 0f883d13..6f70fc98 100644 --- a/gui/mainwindow.ui +++ b/gui/mainwindow.ui @@ -62,6 +62,8 @@ <bool>false</bool> </attribute> <addaction name="actionAddInstance"/> + <addaction name="actionCopyInstance"/> + <addaction name="separator"/> <addaction name="actionViewInstanceFolder"/> <addaction name="actionViewCentralModsFolder"/> <addaction name="actionRefresh"/> @@ -310,6 +312,9 @@ <property name="statusTip"> <string>Change the selected instance's icon.</string> </property> + <property name="iconVisibleInMenu"> + <bool>true</bool> + </property> </action> <action name="actionEditInstNotes"> <property name="text"> @@ -445,6 +450,21 @@ <string><html><head/><body><p align="center"><span style=" font-weight:600; color:#ff0004;">Catnarok!</span></p><p align="center">Or just a cat with a ball of yarn?</p><p align="center"><span style=" font-style:italic;">WHO KNOWS?!</span></p><p align="center"><img src=":/icons/instances/tnt"/></p></body></html></string> </property> </action> + <action name="actionCopyInstance"> + <property name="icon"> + <iconset resource="../multimc.qrc"> + <normaloff>:/icons/toolbar/copy</normaloff>:/icons/toolbar/copy</iconset> + </property> + <property name="text"> + <string>Copy Instance</string> + </property> + <property name="toolTip"> + <string>Copy the selected instance.</string> + </property> + <property name="statusTip"> + <string>Add a new instance.</string> + </property> + </action> </widget> <layoutdefault spacing="6" margin="11"/> <resources> diff --git a/gui/newinstancedialog.h b/gui/newinstancedialog.h index 408cf757..4357c28d 100644 --- a/gui/newinstancedialog.h +++ b/gui/newinstancedialog.h @@ -3,7 +3,7 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software @@ -13,44 +13,43 @@ * limitations under the License. */ -#ifndef NEWINSTANCEDIALOG_H -#define NEWINSTANCEDIALOG_H +#pragma once #include <QDialog> #include "logic/BaseVersion.h" -namespace Ui { +namespace Ui +{ class NewInstanceDialog; } class NewInstanceDialog : public QDialog { Q_OBJECT - + public: explicit NewInstanceDialog(QWidget *parent = 0); ~NewInstanceDialog(); - + void updateDialogState(); - + void setSelectedVersion(BaseVersionPtr version); - + void loadVersionList(); - + QString instName() const; QString iconKey() const; BaseVersionPtr selectedVersion() const; - -private slots: + +private +slots: void on_btnChangeVersion_clicked(); void on_iconButton_clicked(); void on_instNameTextBox_textChanged(const QString &arg1); - + private: Ui::NewInstanceDialog *ui; - + BaseVersionPtr m_selectedVersion; QString InstIconKey; }; - -#endif // NEWINSTANCEDIALOG_H |