Basic 1.6 mod management (no jar mods)

This commit is contained in:
Petr Mrázek
2013-08-28 04:38:29 +02:00
parent aa8766581e
commit 5ff6fbf464
22 changed files with 321 additions and 396 deletions

View File

@ -14,6 +14,7 @@
*/
#include "LegacyModEditDialog.h"
#include "ModEditDialogCommon.h"
#include "ui_LegacyModEditDialog.h"
#include <logic/ModList.h>
#include <pathutils.h>
@ -57,12 +58,13 @@ LegacyModEditDialog::LegacyModEditDialog( LegacyInstance* inst, QWidget* parent
{
ensureFolderPathExists(m_inst->loaderModsDir());
m_mods = m_inst->loaderModList();
ui->mlModTreeView->setModel(m_mods.data());
ui->mlModTreeView->installEventFilter( this );
ui->loaderModTreeView->setModel(m_mods.data());
ui->loaderModTreeView->installEventFilter( this );
m_mods->startWatching();
}
// texture packs
{
ensureFolderPathExists(m_inst->texturePacksDir());
m_texturepacks = m_inst->texturePackList();
ui->texPackTreeView->setModel(m_texturepacks.data());
ui->texPackTreeView->installEventFilter( this );
@ -142,7 +144,7 @@ bool LegacyModEditDialog::loaderListFilter ( QKeyEvent* keyEvent )
default:
break;
}
return QDialog::eventFilter( ui->mlModTreeView, keyEvent );
return QDialog::eventFilter( ui->loaderModTreeView, keyEvent );
}
bool LegacyModEditDialog::texturePackListFilter ( QKeyEvent* keyEvent )
@ -173,10 +175,10 @@ bool LegacyModEditDialog::eventFilter ( QObject* obj, QEvent* ev )
return jarListFilter(keyEvent);
if(obj == ui->coreModsTreeView)
return coreListFilter(keyEvent);
if(obj == ui->mlModTreeView)
if(obj == ui->loaderModTreeView)
return loaderListFilter(keyEvent);
if(obj == ui->texPackTreeView)
return loaderListFilter(keyEvent);
return texturePackListFilter(keyEvent);
return QDialog::eventFilter( obj, ev );
}
@ -226,22 +228,6 @@ void LegacyModEditDialog::on_addTexPackBtn_clicked()
}
}
bool lastfirst (QModelIndexList & list, int & first, int & last)
{
if(!list.size())
return false;
first = last = list[0].row();
for(auto item: list)
{
int row = item.row();
if(row < first)
first = row;
if(row > last)
last = row;
}
return true;
}
void LegacyModEditDialog::on_moveJarDownBtn_clicked()
{
int first, last;
@ -286,7 +272,7 @@ void LegacyModEditDialog::on_rmJarBtn_clicked()
void LegacyModEditDialog::on_rmModBtn_clicked()
{
int first, last;
auto list = ui->mlModTreeView->selectionModel()->selectedRows();
auto list = ui->loaderModTreeView->selectionModel()->selectedRows();
if(!lastfirst(list, first, last))
return;
@ -315,7 +301,7 @@ void LegacyModEditDialog::on_viewModBtn_clicked()
}
void LegacyModEditDialog::on_viewTexPackBtn_clicked()
{
openDirInDefaultProgram(m_inst->texturePackDir(), true);
openDirInDefaultProgram(m_inst->texturePacksDir(), true);
}

View File

@ -145,11 +145,11 @@
</widget>
<widget class="QWidget" name="modTab">
<attribute name="title">
<string>Mods</string>
<string>Loader Mods</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="ModListView" name="mlModTreeView">
<widget class="ModListView" name="loaderModTreeView">
<property name="acceptDrops">
<bool>true</bool>
</property>

View File

@ -0,0 +1,17 @@
#include "ModEditDialogCommon.h"
bool lastfirst (QModelIndexList & list, int & first, int & last)
{
if(!list.size())
return false;
first = last = list[0].row();
for(auto item: list)
{
int row = item.row();
if(row < first)
first = row;
if(row > last)
last = row;
}
return true;
}

View File

@ -0,0 +1,4 @@
#pragma once
#include <QAbstractItemModel>
bool lastfirst (QModelIndexList & list, int & first, int & last);

165
gui/OneSixModEditDialog.cpp Normal file
View File

@ -0,0 +1,165 @@
/* 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 "OneSixModEditDialog.h"
#include "ModEditDialogCommon.h"
#include "ui_OneSixModEditDialog.h"
#include <logic/ModList.h>
#include <pathutils.h>
#include <QFileDialog>
#include <QDebug>
#include <QEvent>
#include <QKeyEvent>
OneSixModEditDialog::OneSixModEditDialog(OneSixInstance * inst, QWidget *parent):
m_inst(inst),
QDialog(parent),
ui(new Ui::OneSixModEditDialog)
{
ui->setupUi(this);
//TODO: libraries!
{
// yeah... here be the real dragons.
}
// Loader mods
{
ensureFolderPathExists(m_inst->loaderModsDir());
m_mods = m_inst->loaderModList();
ui->loaderModTreeView->setModel(m_mods.data());
ui->loaderModTreeView->installEventFilter( this );
m_mods->startWatching();
}
// resource packs
{
ensureFolderPathExists(m_inst->resourcePacksDir());
m_resourcepacks = m_inst->resourcePackList();
ui->resPackTreeView->setModel(m_resourcepacks.data());
ui->resPackTreeView->installEventFilter( this );
m_resourcepacks->startWatching();
}
}
OneSixModEditDialog::~OneSixModEditDialog()
{
m_mods->stopWatching();
m_resourcepacks->stopWatching();
delete ui;
}
bool OneSixModEditDialog::loaderListFilter ( QKeyEvent* keyEvent )
{
switch(keyEvent->key())
{
case Qt::Key_Delete:
on_rmModBtn_clicked();
return true;
case Qt::Key_Plus:
on_addModBtn_clicked();
return true;
default:
break;
}
return QDialog::eventFilter( ui->loaderModTreeView, keyEvent );
}
bool OneSixModEditDialog::resourcePackListFilter ( QKeyEvent* keyEvent )
{
switch(keyEvent->key())
{
case Qt::Key_Delete:
on_rmResPackBtn_clicked();
return true;
case Qt::Key_Plus:
on_addResPackBtn_clicked();
return true;
default:
break;
}
return QDialog::eventFilter( ui->resPackTreeView, keyEvent );
}
bool OneSixModEditDialog::eventFilter ( QObject* obj, QEvent* ev )
{
if (ev->type() != QEvent::KeyPress)
{
return QDialog::eventFilter( obj, ev );
}
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(ev);
if(obj == ui->loaderModTreeView)
return loaderListFilter(keyEvent);
if(obj == ui->resPackTreeView)
return resourcePackListFilter(keyEvent);
return QDialog::eventFilter( obj, ev );
}
void OneSixModEditDialog::on_buttonBox_rejected()
{
close();
}
void OneSixModEditDialog::on_addModBtn_clicked()
{
QStringList fileNames = QFileDialog::getOpenFileNames(this, "Select Loader Mods");
for(auto filename:fileNames)
{
m_mods->stopWatching();
m_mods->installMod(QFileInfo(filename));
m_mods->startWatching();
}
}
void OneSixModEditDialog::on_rmModBtn_clicked()
{
int first, last;
auto list = ui->loaderModTreeView->selectionModel()->selectedRows();
if(!lastfirst(list, first, last))
return;
m_mods->stopWatching();
m_mods->deleteMods(first, last);
m_mods->startWatching();
}
void OneSixModEditDialog::on_viewModBtn_clicked()
{
openDirInDefaultProgram(m_inst->loaderModsDir(), true);
}
void OneSixModEditDialog::on_addResPackBtn_clicked()
{
QStringList fileNames = QFileDialog::getOpenFileNames(this, "Select Resource Packs");
for(auto filename:fileNames)
{
m_resourcepacks->stopWatching();
m_resourcepacks->installMod(QFileInfo(filename));
m_resourcepacks->startWatching();
}
}
void OneSixModEditDialog::on_rmResPackBtn_clicked()
{
int first, last;
auto list = ui->resPackTreeView->selectionModel()->selectedRows();
if(!lastfirst(list, first, last))
return;
m_resourcepacks->stopWatching();
m_resourcepacks->deleteMods(first, last);
m_resourcepacks->startWatching();
}
void OneSixModEditDialog::on_viewResPackBtn_clicked()
{
openDirInDefaultProgram(m_inst->resourcePacksDir(), true);
}

View File

@ -13,27 +13,24 @@
* limitations under the License.
*/
#ifndef MODEDITDIALOG_H
#define MODEDITDIALOG_H
#pragma once
#include <QDialog>
#include "logic/BaseInstance.h"
#include <logic/OneSixInstance.h>
namespace Ui {
class ModEditDialog;
class OneSixModEditDialog;
}
class ModEditDialog : public QDialog
class OneSixModEditDialog : public QDialog
{
Q_OBJECT
public:
explicit ModEditDialog(QWidget *parent = 0, BaseInstance* m_inst = 0);
~ModEditDialog();
explicit OneSixModEditDialog(OneSixInstance* inst, QWidget *parent = 0);
virtual ~OneSixModEditDialog();
private slots:
/* Mapped for implementation
void on_addModBtn_clicked();
void on_rmModBtn_clicked();
void on_viewModBtn_clicked();
@ -41,12 +38,15 @@ private slots:
void on_addResPackBtn_clicked();
void on_rmResPackBtn_clicked();
void on_viewResPackBtn_clicked();
*/
// Questionable: SettingsDialog doesn't need this for some reason?
void on_buttonBox_rejected();
protected:
bool eventFilter(QObject *obj, QEvent *ev);
bool loaderListFilter( QKeyEvent* ev );
bool resourcePackListFilter( QKeyEvent* ev );
private:
Ui::ModEditDialog *ui;
Ui::OneSixModEditDialog *ui;
QSharedPointer<ModList> m_mods;
QSharedPointer<ModList> m_resourcepacks;
OneSixInstance * m_inst;
};
#endif // MODEDITDIALOG_H

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ModEditDialog</class>
<widget class="QDialog" name="ModEditDialog">
<class>OneSixModEditDialog</class>
<widget class="QDialog" name="OneSixModEditDialog">
<property name="geometry">
<rect>
<x>0</x>
@ -40,20 +40,30 @@
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTreeView" name="treeView"/>
<widget class="ModListView" name="jarModsTreeView">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="modTab">
<attribute name="title">
<string>Mods</string>
<string>Loader Mods</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListView" name="listView">
<widget class="ModListView" name="loaderModTreeView">
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
</widget>
</item>
<item>
@ -98,14 +108,17 @@
</widget>
<widget class="QWidget" name="resPackTab">
<attribute name="title">
<string>Resource Pack</string>
<string>Resource Packs</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QListView" name="listView_2">
<widget class="ModListView" name="resPackTreeView">
<property name="acceptDrops">
<bool>true</bool>
</property>
<property name="dragDropMode">
<enum>QAbstractItemView::DropOnly</enum>
</property>
</widget>
</item>
<item>
@ -118,7 +131,7 @@
</widget>
</item>
<item>
<widget class="QPushButton" name="rmRedPackBtn">
<widget class="QPushButton" name="rmResPackBtn">
<property name="text">
<string>&amp;Remove</string>
</property>
@ -162,6 +175,13 @@
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>ModListView</class>
<extends>QTreeView</extends>
<header>gui/ModListView.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -1,35 +0,0 @@
/* 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 "modeditdialog.h"
#include "ui_modeditdialog.h"
#include "logic/BaseInstance.h"
ModEditDialog::ModEditDialog(QWidget *parent, BaseInstance* m_inst) :
QDialog(parent),
ui(new Ui::ModEditDialog)
{
ui->setupUi(this);
}
ModEditDialog::~ModEditDialog()
{
delete ui;
}
void ModEditDialog::on_buttonBox_rejected()
{
close();
}

View File

@ -1,37 +0,0 @@
/* 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 "modeditwindow.h"
#include "ui_modeditwindow.h"
#include "BaseInstance.h"
#include <QDebug>
ModEditWindow::ModEditWindow(QWidget *parent, BaseInstance* m_inst) :
QDialog(parent),
ui(new Ui::ModEditWindow)
{
ui->setupUi(this);
}
ModEditWindow::~ModEditWindow()
{
delete ui;
}
void ModEditWindow::on_buttonBox_rejected()
{
close();
}

View File

View File

@ -1,241 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ModEditWindow</class>
<widget class="QDialog" name="ModEditWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>540</width>
<height>420</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>3</number>
</property>
<widget class="QWidget" name="jarModsTab">
<attribute name="title">
<string>Jar Mods</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QListView" name="jarModsListView"/>
</item>
<item>
<layout class="QVBoxLayout" name="jarModsButtonBox">
<item>
<widget class="QPushButton" name="addJarModButton">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="delJarModButton">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="mcforgeButton">
<property name="text">
<string>MCForge</string>
</property>
</widget>
</item>
<item>
<spacer name="jarModsButtonSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="jarModMoveUpButton">
<property name="text">
<string>Move &amp;Up</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="jarModMoveDownButton">
<property name="text">
<string>Move &amp;Down</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="coreModsTab">
<attribute name="title">
<string>Core Mods</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QListView" name="coreModsListView"/>
</item>
<item>
<layout class="QVBoxLayout" name="coreModsButtonBox">
<item>
<widget class="QPushButton" name="addCoreModButton">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="delCoreModButton">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<spacer name="coreModsButtonSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="viewCoreModFolderButton">
<property name="text">
<string>&amp;View Folder</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="mlModsTab">
<attribute name="title">
<string>Mods</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QListView" name="mlModListView"/>
</item>
<item>
<layout class="QVBoxLayout" name="mlModsButtonBox">
<item>
<widget class="QPushButton" name="addMlModButton">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="delMlModButton">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<spacer name="mlModsButtonSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="viewMlModFolderButton">
<property name="text">
<string>&amp;View Folder</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="texturePacksTab">
<attribute name="title">
<string>Texture Packs</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QListView" name="texturePackListView"/>
</item>
<item>
<layout class="QVBoxLayout" name="texturePacksButtonBox">
<item>
<widget class="QPushButton" name="addTPackButton">
<property name="text">
<string>&amp;Add</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="delTPackButton">
<property name="text">
<string>&amp;Remove</string>
</property>
</widget>
</item>
<item>
<spacer name="texturePacksButtonSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="viewTPackFolderButton">
<property name="text">
<string>&amp;View Folder</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>