summaryrefslogtreecommitdiffstats
path: root/application
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2015-05-17 23:38:28 +0200
committerPetr Mrázek <peterix@gmail.com>2015-05-17 23:38:28 +0200
commit743af4769ee59b5830d79139852dda0679b28a03 (patch)
tree939e150c6127c9bc64926da052fe56e2b483990d /application
parent6ab6a450f6831c99ba507436ab15047cfa4d4528 (diff)
downloadMultiMC-743af4769ee59b5830d79139852dda0679b28a03.tar
MultiMC-743af4769ee59b5830d79139852dda0679b28a03.tar.gz
MultiMC-743af4769ee59b5830d79139852dda0679b28a03.tar.lz
MultiMC-743af4769ee59b5830d79139852dda0679b28a03.tar.xz
MultiMC-743af4769ee59b5830d79139852dda0679b28a03.zip
GH-952 Hardcore version page tweakery
Version patches get a lot of new flags that determine which actions are allowed Version page respects the flags Customize, revert and edit for version patches Builting patches can be customized
Diffstat (limited to 'application')
-rw-r--r--application/pages/VersionPage.cpp172
-rw-r--r--application/pages/VersionPage.h29
-rw-r--r--application/pages/VersionPage.ui98
3 files changed, 234 insertions, 65 deletions
diff --git a/application/pages/VersionPage.cpp b/application/pages/VersionPage.cpp
index ab4aecf6..bb310eea 100644
--- a/application/pages/VersionPage.cpp
+++ b/application/pages/VersionPage.cpp
@@ -67,16 +67,14 @@ VersionPage::VersionPage(OneSixInstance *inst, QWidget *parent)
m_version = m_inst->getMinecraftProfile();
if (m_version)
{
- ui->libraryTreeView->setModel(m_version.get());
- ui->libraryTreeView->installEventFilter(this);
- ui->libraryTreeView->setSelectionMode(QAbstractItemView::SingleSelection);
- connect(ui->libraryTreeView->selectionModel(), &QItemSelectionModel::currentChanged,
+ ui->packageView->setModel(m_version.get());
+ ui->packageView->installEventFilter(this);
+ ui->packageView->setSelectionMode(QAbstractItemView::SingleSelection);
+ connect(ui->packageView->selectionModel(), &QItemSelectionModel::currentChanged,
this, &VersionPage::versionCurrent);
updateVersionControls();
// select first item.
- auto index = ui->libraryTreeView->model()->index(0,0);
- if(index.isValid())
- ui->libraryTreeView->setCurrentIndex(index);
+ preselect(0);
}
else
{
@@ -95,14 +93,15 @@ void VersionPage::updateVersionControls()
{
ui->forgeBtn->setEnabled(true);
ui->liteloaderBtn->setEnabled(true);
+ updateButtons();
}
void VersionPage::disableVersionControls()
{
ui->forgeBtn->setEnabled(false);
ui->liteloaderBtn->setEnabled(false);
- ui->reloadLibrariesBtn->setEnabled(false);
- ui->removeLibraryBtn->setEnabled(false);
+ ui->reloadBtn->setEnabled(false);
+ updateButtons();
}
bool VersionPage::reloadMinecraftProfile()
@@ -126,21 +125,22 @@ bool VersionPage::reloadMinecraftProfile()
}
}
-void VersionPage::on_reloadLibrariesBtn_clicked()
+void VersionPage::on_reloadBtn_clicked()
{
reloadMinecraftProfile();
}
-void VersionPage::on_removeLibraryBtn_clicked()
+void VersionPage::on_removeBtn_clicked()
{
- if (ui->libraryTreeView->currentIndex().isValid())
+ if (ui->packageView->currentIndex().isValid())
{
// FIXME: use actual model, not reloading.
- if (!m_version->remove(ui->libraryTreeView->currentIndex().row()))
+ if (!m_version->remove(ui->packageView->currentIndex().row()))
{
QMessageBox::critical(this, tr("Error"), tr("Couldn't remove file"));
}
}
+ updateButtons();
}
void VersionPage::on_jarmodBtn_clicked()
@@ -150,9 +150,10 @@ void VersionPage::on_jarmodBtn_clicked()
{
m_version->installJarMods(list);
}
+ updateButtons();
}
-void VersionPage::on_resetLibraryOrderBtn_clicked()
+void VersionPage::on_resetOrderBtn_clicked()
{
try
{
@@ -162,43 +163,36 @@ void VersionPage::on_resetLibraryOrderBtn_clicked()
{
QMessageBox::critical(this, tr("Error"), e.cause());
}
+ updateButtons();
}
-void VersionPage::on_moveLibraryUpBtn_clicked()
+void VersionPage::on_moveUpBtn_clicked()
{
- if (ui->libraryTreeView->selectionModel()->selectedRows().isEmpty())
- {
- return;
- }
try
{
- const int row = ui->libraryTreeView->selectionModel()->selectedRows().first().row();
- m_version->move(row, MinecraftProfile::MoveUp);
+ m_version->move(currentRow(), MinecraftProfile::MoveUp);
}
catch (MMCError &e)
{
QMessageBox::critical(this, tr("Error"), e.cause());
}
+ updateButtons();
}
-void VersionPage::on_moveLibraryDownBtn_clicked()
+void VersionPage::on_moveDownBtn_clicked()
{
- if (ui->libraryTreeView->selectionModel()->selectedRows().isEmpty())
- {
- return;
- }
try
{
- const int row = ui->libraryTreeView->selectionModel()->selectedRows().first().row();
- m_version->move(row, MinecraftProfile::MoveDown);
+ m_version->move(currentRow(), MinecraftProfile::MoveDown);
}
catch (MMCError &e)
{
QMessageBox::critical(this, tr("Error"), e.cause());
}
+ updateButtons();
}
-void VersionPage::on_changeMCVersionBtn_clicked()
+void VersionPage::on_changeVersionBtn_clicked()
{
VersionSelectDialog vselect(m_inst->versionList().get(), tr("Change Minecraft version"),
this);
@@ -239,6 +233,7 @@ void VersionPage::on_changeMCVersionBtn_clicked()
ProgressDialog tDialog(this);
connect(updateTask.get(), SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
tDialog.exec(updateTask.get());
+ updateButtons();
}
void VersionPage::on_forgeBtn_clicked()
@@ -253,6 +248,7 @@ void VersionPage::on_forgeBtn_clicked()
ProgressDialog dialog(this);
dialog.exec(
ForgeInstaller().createInstallTask(m_inst, vselect.selectedVersion(), this));
+ preselect(m_version->rowCount(QModelIndex())-1);
}
}
@@ -269,32 +265,59 @@ void VersionPage::on_liteloaderBtn_clicked()
ProgressDialog dialog(this);
dialog.exec(
LiteLoaderInstaller().createInstallTask(m_inst, vselect.selectedVersion(), this));
+ preselect(m_version->rowCount(QModelIndex())-1);
}
}
void VersionPage::versionCurrent(const QModelIndex &current, const QModelIndex &previous)
{
- if (!current.isValid())
+ currentIdx = current.row();
+ updateButtons(currentIdx);
+}
+
+void VersionPage::preselect(int row)
+{
+ if(row < 0)
{
- ui->removeLibraryBtn->setDisabled(true);
- ui->moveLibraryDownBtn->setDisabled(true);
- ui->moveLibraryUpBtn->setDisabled(true);
+ row = 0;
}
- else
+ if(row >= m_version->rowCount(QModelIndex()))
{
- bool enabled = m_version->canRemove(current.row());
- ui->removeLibraryBtn->setEnabled(enabled);
- ui->moveLibraryDownBtn->setEnabled(enabled);
- ui->moveLibraryUpBtn->setEnabled(enabled);
+ row = m_version->rowCount(QModelIndex()) - 1;
+ }
+ if(row < 0)
+ {
+ return;
}
- QString selectedId = m_version->versionFileId(current.row());
- if (selectedId == "net.minecraft")
+ auto model_index = m_version->index(row);
+ ui->packageView->selectionModel()->select(model_index, QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows);
+ updateButtons(row);
+}
+
+void VersionPage::updateButtons(int row)
+{
+ if(row == -1)
+ row = currentRow();
+ auto patch = m_version->versionPatch(row);
+ if (!patch)
{
- ui->changeMCVersionBtn->setEnabled(true);
+ ui->removeBtn->setDisabled(true);
+ ui->moveDownBtn->setDisabled(true);
+ ui->moveUpBtn->setDisabled(true);
+ ui->changeVersionBtn->setDisabled(true);
+ ui->editBtn->setDisabled(true);
+ ui->customizeBtn->setDisabled(true);
+ ui->revertBtn->setDisabled(true);
}
else
{
- ui->changeMCVersionBtn->setEnabled(false);
+ ui->removeBtn->setEnabled(patch->isRemovable());
+ ui->moveDownBtn->setEnabled(patch->isMoveable());
+ ui->moveUpBtn->setEnabled(patch->isMoveable());
+ ui->changeVersionBtn->setEnabled(patch->isVersionChangeable());
+ ui->editBtn->setEnabled(patch->isEditable());
+ ui->customizeBtn->setEnabled(patch->isCustomizable());
+ ui->revertBtn->setEnabled(patch->isRevertible());
}
}
@@ -303,3 +326,68 @@ void VersionPage::onGameUpdateError(QString error)
CustomMessageBox::selectable(this, tr("Error updating instance"), error,
QMessageBox::Warning)->show();
}
+
+ProfilePatchPtr VersionPage::current()
+{
+ auto row = currentRow();
+ if(row < 0)
+ {
+ return nullptr;
+ }
+ return m_version->versionPatch(row);
+}
+
+int VersionPage::currentRow()
+{
+ if (ui->packageView->selectionModel()->selectedRows().isEmpty())
+ {
+ return -1;
+ }
+ return ui->packageView->selectionModel()->selectedRows().first().row();
+}
+
+void VersionPage::on_customizeBtn_clicked()
+{
+ auto version = currentRow();
+ if(version == -1)
+ {
+ return;
+ }
+ if(!m_version->customize(version))
+ {
+ // TODO: some error box here
+ }
+ updateButtons();
+ preselect(currentIdx);
+}
+
+void VersionPage::on_editBtn_clicked()
+{
+ auto version = current();
+ if(!version)
+ {
+ return;
+ }
+ auto filename = version->getPatchFilename();
+ if(!QFileInfo::exists(filename))
+ {
+ qWarning() << "file" << filename << "can't be opened for editing, doesn't exist!";
+ return;
+ }
+ MMC->openJsonEditor(filename);
+}
+
+void VersionPage::on_revertBtn_clicked()
+{
+ auto version = currentRow();
+ if(version == -1)
+ {
+ return;
+ }
+ if(!m_version->revert(version))
+ {
+ // TODO: some error box here
+ }
+ updateButtons();
+ preselect(currentIdx);
+}
diff --git a/application/pages/VersionPage.h b/application/pages/VersionPage.h
index 0965edeb..45732b25 100644
--- a/application/pages/VersionPage.h
+++ b/application/pages/VersionPage.h
@@ -46,22 +46,29 @@ public:
return "Instance-version";
}
virtual bool shouldDisplay() const;
-private
-slots:
- // version tab
+private slots:
void on_forgeBtn_clicked();
void on_liteloaderBtn_clicked();
- void on_reloadLibrariesBtn_clicked();
- void on_removeLibraryBtn_clicked();
- void on_resetLibraryOrderBtn_clicked();
- void on_moveLibraryUpBtn_clicked();
- void on_moveLibraryDownBtn_clicked();
+ void on_reloadBtn_clicked();
+ void on_removeBtn_clicked();
+ void on_resetOrderBtn_clicked();
+ void on_moveUpBtn_clicked();
+ void on_moveDownBtn_clicked();
void on_jarmodBtn_clicked();
+ void on_revertBtn_clicked();
+ void on_editBtn_clicked();
+ void on_customizeBtn_clicked();
void updateVersionControls();
void disableVersionControls();
- void on_changeMCVersionBtn_clicked();
+ void on_changeVersionBtn_clicked();
+
+private:
+ ProfilePatchPtr current();
+ int currentRow();
+ void updateButtons(int row = -1);
+ void preselect(int row = 0);
protected:
/// FIXME: this shouldn't be necessary!
@@ -71,9 +78,9 @@ private:
Ui::VersionPage *ui;
std::shared_ptr<MinecraftProfile> m_version;
OneSixInstance *m_inst;
+ int currentIdx = 0;
-public
-slots:
+public slots:
void versionCurrent(const QModelIndex &current, const QModelIndex &previous);
private slots:
diff --git a/application/pages/VersionPage.ui b/application/pages/VersionPage.ui
index 67a556c8..1216229f 100644
--- a/application/pages/VersionPage.ui
+++ b/application/pages/VersionPage.ui
@@ -11,7 +11,7 @@
</rect>
</property>
<property name="windowTitle">
- <string>Version</string>
+ <string>Package Versions</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
@@ -37,7 +37,7 @@
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
- <widget class="ModListView" name="libraryTreeView">
+ <widget class="ModListView" name="packageView">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
@@ -65,16 +65,19 @@
</widget>
</item>
<item>
- <widget class="QPushButton" name="changeMCVersionBtn">
+ <widget class="QPushButton" name="changeVersionBtn">
+ <property name="toolTip">
+ <string>Change version of the selected package.</string>
+ </property>
<property name="text">
<string>Change version</string>
</property>
</widget>
</item>
<item>
- <widget class="QPushButton" name="moveLibraryUpBtn">
+ <widget class="QPushButton" name="moveUpBtn">
<property name="toolTip">
- <string>This isn't implemented yet.</string>
+ <string>Make the selected package apply sooner.</string>
</property>
<property name="text">
<string>Move up</string>
@@ -82,9 +85,9 @@
</widget>
</item>
<item>
- <widget class="QPushButton" name="moveLibraryDownBtn">
+ <widget class="QPushButton" name="moveDownBtn">
<property name="toolTip">
- <string>This isn't implemented yet.</string>
+ <string>Make the selected package apply later.</string>
</property>
<property name="text">
<string>Move down</string>
@@ -92,13 +95,59 @@
</widget>
</item>
<item>
- <widget class="QPushButton" name="removeLibraryBtn">
+ <widget class="QPushButton" name="removeBtn">
+ <property name="toolTip">
+ <string>Remove selected package from the instance.</string>
+ </property>
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item>
+ <widget class="LineSeparator" name="separator_4" native="true"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Edit</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="customizeBtn">
+ <property name="toolTip">
+ <string>Customize selected package.</string>
+ </property>
+ <property name="text">
+ <string>Customize</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="editBtn">
+ <property name="toolTip">
+ <string>Edit selected package.</string>
+ </property>
+ <property name="text">
+ <string>Edit</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="revertBtn">
+ <property name="toolTip">
+ <string>Revert the selected package to default.</string>
+ </property>
+ <property name="text">
+ <string>Revert</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="LineSeparator" name="separator" native="true"/>
</item>
<item>
@@ -114,7 +163,7 @@
<item>
<widget class="QPushButton" name="forgeBtn">
<property name="toolTip">
- <string>Replace any current custom version with Minecraft Forge</string>
+ <string>Install the Minecraft Forge package.</string>
</property>
<property name="text">
<string>Install Forge</string>
@@ -123,6 +172,9 @@
</item>
<item>
<widget class="QPushButton" name="liteloaderBtn">
+ <property name="toolTip">
+ <string>Install the LiteLoader package.</string>
+ </property>
<property name="text">
<string>Install LiteLoader</string>
</property>
@@ -130,6 +182,9 @@
</item>
<item>
<widget class="QPushButton" name="jarmodBtn">
+ <property name="toolTip">
+ <string>Add a mod into the Minecraft jar file.</string>
+ </property>
<property name="text">
<string>Add jar mod</string>
</property>
@@ -149,9 +204,9 @@
</widget>
</item>
<item>
- <widget class="QPushButton" name="resetLibraryOrderBtn">
+ <widget class="QPushButton" name="resetOrderBtn">
<property name="toolTip">
- <string>This isn't implemented yet.</string>
+ <string>Reset apply order of packages.</string>
</property>
<property name="text">
<string>Reset order</string>
@@ -159,7 +214,10 @@
</widget>
</item>
<item>
- <widget class="QPushButton" name="reloadLibrariesBtn">
+ <widget class="QPushButton" name="reloadBtn">
+ <property name="toolTip">
+ <string>Reload all packages.</string>
+ </property>
<property name="text">
<string>Reload</string>
</property>
@@ -199,6 +257,22 @@
<container>1</container>
</customwidget>
</customwidgets>
+ <tabstops>
+ <tabstop>tabWidget</tabstop>
+ <tabstop>packageView</tabstop>
+ <tabstop>changeVersionBtn</tabstop>
+ <tabstop>moveUpBtn</tabstop>
+ <tabstop>moveDownBtn</tabstop>
+ <tabstop>removeBtn</tabstop>
+ <tabstop>customizeBtn</tabstop>
+ <tabstop>editBtn</tabstop>
+ <tabstop>revertBtn</tabstop>
+ <tabstop>forgeBtn</tabstop>
+ <tabstop>liteloaderBtn</tabstop>
+ <tabstop>jarmodBtn</tabstop>
+ <tabstop>resetOrderBtn</tabstop>
+ <tabstop>reloadBtn</tabstop>
+ </tabstops>
<resources/>
<connections/>
</ui>