Fix MMC-15

``mod does not delete from jar''
This commit is contained in:
Petr Mrázek 2013-10-09 23:16:10 +02:00
parent 595943244c
commit eaf0cbeafc
4 changed files with 183 additions and 194 deletions

View File

@ -507,10 +507,11 @@ void MainWindow::onLoginComplete()
} }
else else
{ {
ProgressDialog *tDialog = new ProgressDialog(this); ProgressDialog tDialog(this);
connect(updateTask, SIGNAL(succeeded()), SLOT(onGameUpdateComplete())); connect(updateTask, SIGNAL(succeeded()), SLOT(onGameUpdateComplete()));
connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString))); connect(updateTask, SIGNAL(failed(QString)), SLOT(onGameUpdateError(QString)));
tDialog->exec(updateTask); tDialog.exec(updateTask);
delete updateTask;
} }
} }

View File

@ -14,8 +14,9 @@
#define LAUNCHER_FILE "MultiMCLauncher.jar" #define LAUNCHER_FILE "MultiMCLauncher.jar"
LegacyInstance::LegacyInstance(const QString& rootDir, SettingsObject* settings, QObject* parent) LegacyInstance::LegacyInstance(const QString &rootDir, SettingsObject *settings,
:BaseInstance( new LegacyInstancePrivate(),rootDir, settings, parent) QObject *parent)
: BaseInstance(new LegacyInstancePrivate(), rootDir, settings, parent)
{ {
settings->registerSetting(new Setting("NeedsRebuild", true)); settings->registerSetting(new Setting("NeedsRebuild", true));
settings->registerSetting(new Setting("ShouldUpdate", false)); settings->registerSetting(new Setting("ShouldUpdate", false));
@ -24,50 +25,51 @@ LegacyInstance::LegacyInstance(const QString& rootDir, SettingsObject* settings,
settings->registerSetting(new Setting("IntendedJarVersion", "")); settings->registerSetting(new Setting("IntendedJarVersion", ""));
} }
BaseUpdate* LegacyInstance::doUpdate() BaseUpdate *LegacyInstance::doUpdate()
{ {
auto list = jarModList();
return new LegacyUpdate(this, this); return new LegacyUpdate(this, this);
} }
MinecraftProcess* LegacyInstance::prepareForLaunch(LoginResponse response) MinecraftProcess *LegacyInstance::prepareForLaunch(LoginResponse response)
{ {
MinecraftProcess * proc = new MinecraftProcess(this); MinecraftProcess *proc = new MinecraftProcess(this);
QIcon icon = MMC->icons()->getIcon(iconKey()); QIcon icon = MMC->icons()->getIcon(iconKey());
auto pixmap = icon.pixmap(128,128); auto pixmap = icon.pixmap(128, 128);
pixmap.save(PathCombine(minecraftRoot(), "icon.png"),"PNG"); pixmap.save(PathCombine(minecraftRoot(), "icon.png"), "PNG");
// extract the legacy launcher // extract the legacy launcher
QFile(":/launcher/launcher.jar").copy(PathCombine(minecraftRoot(), LAUNCHER_FILE)); QFile(":/launcher/launcher.jar").copy(PathCombine(minecraftRoot(), LAUNCHER_FILE));
// set the process arguments // set the process arguments
{ {
QStringList args; QStringList args;
// window size // window size
QString windowSize; QString windowSize;
if (settings().get("LaunchMaximized").toBool()) if (settings().get("LaunchMaximized").toBool())
windowSize = "max"; windowSize = "max";
else else
windowSize = QString("%1x%2"). windowSize = QString("%1x%2").arg(settings().get("MinecraftWinWidth").toInt()).arg(
arg(settings().get("MinecraftWinWidth").toInt()). settings().get("MinecraftWinHeight").toInt());
arg(settings().get("MinecraftWinHeight").toInt());
// window title // window title
QString windowTitle; QString windowTitle;
windowTitle.append("MultiMC: ").append(name()); windowTitle.append("MultiMC: ").append(name());
// Java arguments // Java arguments
args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString())); args.append(Util::Commandline::splitArgs(settings().get("JvmArgs").toString()));
#ifdef OSX #ifdef OSX
// OSX dock icon and name // OSX dock icon and name
args << "-Xdock:icon=icon.png"; args << "-Xdock:icon=icon.png";
args << QString("-Xdock:name=\"%1\"").arg(windowTitle); args << QString("-Xdock:name=\"%1\"").arg(windowTitle);
#endif #endif
QString lwjgl = QDir(MMC->settings()->get("LWJGLDir").toString() + "/" + lwjglVersion()).absolutePath(); QString lwjgl = QDir(MMC->settings()->get("LWJGLDir").toString() + "/" + lwjglVersion())
.absolutePath();
// launcher arguments // launcher arguments
args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt()); args << QString("-Xms%1m").arg(settings().get("MinMemAlloc").toInt());
args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt()); args << QString("-Xmx%1m").arg(settings().get("MaxMemAlloc").toInt());
@ -80,41 +82,39 @@ MinecraftProcess* LegacyInstance::prepareForLaunch(LoginResponse response)
args << lwjgl; args << lwjgl;
proc->setMinecraftArguments(args); proc->setMinecraftArguments(args);
} }
// set the process work path // set the process work path
proc->setMinecraftWorkdir(minecraftRoot()); proc->setMinecraftWorkdir(minecraftRoot());
return proc; return proc;
} }
void LegacyInstance::cleanupAfterRun() void LegacyInstance::cleanupAfterRun()
{ {
//FIXME: delete the launcher and icons and whatnot. // FIXME: delete the launcher and icons and whatnot.
} }
std::shared_ptr< ModList > LegacyInstance::coreModList() std::shared_ptr<ModList> LegacyInstance::coreModList()
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
if(!d->core_mod_list) if (!d->core_mod_list)
{ {
d->core_mod_list.reset(new ModList(coreModsDir())); d->core_mod_list.reset(new ModList(coreModsDir()));
} }
else d->core_mod_list->update();
d->core_mod_list->update();
return d->core_mod_list; return d->core_mod_list;
} }
std::shared_ptr< ModList > LegacyInstance::jarModList() std::shared_ptr<ModList> LegacyInstance::jarModList()
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
if(!d->jar_mod_list) if (!d->jar_mod_list)
{ {
auto list = new ModList(jarModsDir(), modListFile()); auto list = new ModList(jarModsDir(), modListFile());
connect(list, SIGNAL(changed()), SLOT(jarModsChanged())); connect(list, SIGNAL(changed()), SLOT(jarModsChanged()));
d->jar_mod_list.reset(list); d->jar_mod_list.reset(list);
} }
else d->jar_mod_list->update();
d->jar_mod_list->update();
return d->jar_mod_list; return d->jar_mod_list;
} }
@ -123,38 +123,33 @@ void LegacyInstance::jarModsChanged()
setShouldRebuild(true); setShouldRebuild(true);
} }
std::shared_ptr<ModList> LegacyInstance::loaderModList()
std::shared_ptr< ModList > LegacyInstance::loaderModList()
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
if(!d->loader_mod_list) if (!d->loader_mod_list)
{ {
d->loader_mod_list.reset(new ModList(loaderModsDir())); d->loader_mod_list.reset(new ModList(loaderModsDir()));
} }
else d->loader_mod_list->update();
d->loader_mod_list->update();
return d->loader_mod_list; return d->loader_mod_list;
} }
std::shared_ptr< ModList > LegacyInstance::texturePackList() std::shared_ptr<ModList> LegacyInstance::texturePackList()
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
if(!d->texture_pack_list) if (!d->texture_pack_list)
{ {
d->texture_pack_list.reset(new ModList(texturePacksDir())); d->texture_pack_list.reset(new ModList(texturePacksDir()));
} }
else d->texture_pack_list->update();
d->texture_pack_list->update();
return d->texture_pack_list; return d->texture_pack_list;
} }
QDialog *LegacyInstance::createModEditDialog(QWidget *parent)
QDialog * LegacyInstance::createModEditDialog ( QWidget* parent )
{ {
return new LegacyModEditDialog(this, parent); return new LegacyModEditDialog(this, parent);
} }
QString LegacyInstance::jarModsDir() const QString LegacyInstance::jarModsDir() const
{ {
return PathCombine(instanceRoot(), "instMods"); return PathCombine(instanceRoot(), "instMods");
@ -204,7 +199,6 @@ QString LegacyInstance::instanceConfigFolder() const
return PathCombine(minecraftRoot(), "config"); return PathCombine(minecraftRoot(), "config");
} }
/* /*
bool LegacyInstance::shouldUpdateCurrentVersion() const bool LegacyInstance::shouldUpdateCurrentVersion() const
{ {
@ -215,21 +209,22 @@ bool LegacyInstance::shouldUpdateCurrentVersion() const
void LegacyInstance::updateCurrentVersion(bool keepCurrent) void LegacyInstance::updateCurrentVersion(bool keepCurrent)
{ {
QFileInfo jar(runnableJar()); QFileInfo jar(runnableJar());
if(!jar.exists()) if(!jar.exists())
{ {
setLastCurrentVersionUpdate(0); setLastCurrentVersionUpdate(0);
setCurrentVersionId("Unknown"); setCurrentVersionId("Unknown");
return; return;
} }
qint64 time = jar.lastModified().toUTC().toMSecsSinceEpoch(); qint64 time = jar.lastModified().toUTC().toMSecsSinceEpoch();
setLastCurrentVersionUpdate(time); setLastCurrentVersionUpdate(time);
if (!keepCurrent) if (!keepCurrent)
{ {
// TODO: Implement GetMinecraftJarVersion function. // TODO: Implement GetMinecraftJarVersion function.
QString newVersion = "Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath()); QString newVersion =
"Unknown";//javautils::GetMinecraftJarVersion(jar.absoluteFilePath());
setCurrentVersionId(newVersion); setCurrentVersionId(newVersion);
} }
} }
@ -247,41 +242,41 @@ void LegacyInstance::setLastCurrentVersionUpdate ( qint64 val )
bool LegacyInstance::shouldRebuild() const bool LegacyInstance::shouldRebuild() const
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
return d->m_settings->get ( "NeedsRebuild" ).toBool(); return d->m_settings->get("NeedsRebuild").toBool();
} }
void LegacyInstance::setShouldRebuild ( bool val ) void LegacyInstance::setShouldRebuild(bool val)
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
d->m_settings->set ( "NeedsRebuild", val ); d->m_settings->set("NeedsRebuild", val);
} }
QString LegacyInstance::currentVersionId() const QString LegacyInstance::currentVersionId() const
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
return d->m_settings->get ( "JarVersion" ).toString(); return d->m_settings->get("JarVersion").toString();
} }
void LegacyInstance::setCurrentVersionId ( QString val ) void LegacyInstance::setCurrentVersionId(QString val)
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
d->m_settings->set ( "JarVersion", val ); d->m_settings->set("JarVersion", val);
} }
QString LegacyInstance::lwjglVersion() const QString LegacyInstance::lwjglVersion() const
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
return d->m_settings->get ( "LwjglVersion" ).toString(); return d->m_settings->get("LwjglVersion").toString();
} }
void LegacyInstance::setLWJGLVersion ( QString val ) void LegacyInstance::setLWJGLVersion(QString val)
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
d->m_settings->set ( "LwjglVersion", val ); d->m_settings->set("LwjglVersion", val);
} }
QString LegacyInstance::intendedVersionId() const QString LegacyInstance::intendedVersionId() const
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
return d->m_settings->get ( "IntendedJarVersion" ).toString(); return d->m_settings->get("IntendedJarVersion").toString();
} }
bool LegacyInstance::setIntendedVersionId ( QString version ) bool LegacyInstance::setIntendedVersionId(QString version)
{ {
settings().set("IntendedJarVersion", version); settings().set("IntendedJarVersion", version);
setShouldUpdate(true); setShouldUpdate(true);
@ -290,16 +285,16 @@ bool LegacyInstance::setIntendedVersionId ( QString version )
bool LegacyInstance::shouldUpdate() const bool LegacyInstance::shouldUpdate() const
{ {
I_D(LegacyInstance); I_D(LegacyInstance);
QVariant var = settings().get ( "ShouldUpdate" ); QVariant var = settings().get("ShouldUpdate");
if ( !var.isValid() || var.toBool() == false ) if (!var.isValid() || var.toBool() == false)
{ {
return intendedVersionId() != currentVersionId(); return intendedVersionId() != currentVersionId();
} }
return true; return true;
} }
void LegacyInstance::setShouldUpdate ( bool val ) void LegacyInstance::setShouldUpdate(bool val)
{ {
settings().set ( "ShouldUpdate", val ); settings().set("ShouldUpdate", val);
} }
QString LegacyInstance::defaultBaseJar() const QString LegacyInstance::defaultBaseJar() const
@ -312,7 +307,7 @@ QString LegacyInstance::defaultCustomBaseJar() const
return PathCombine(binDir(), "mcbackup.jar"); return PathCombine(binDir(), "mcbackup.jar");
} }
bool LegacyInstance::menuActionEnabled ( QString action_name ) const bool LegacyInstance::menuActionEnabled(QString action_name) const
{ {
if (action_name == "actionChangeInstMCVersion") if (action_name == "actionChangeInstMCVersion")
return false; return false;
@ -321,7 +316,7 @@ bool LegacyInstance::menuActionEnabled ( QString action_name ) const
QString LegacyInstance::getStatusbarDescription() QString LegacyInstance::getStatusbarDescription()
{ {
if(shouldUpdate()) if (shouldUpdate())
return "Legacy : " + currentVersionId() + " -> " + intendedVersionId(); return "Legacy : " + currentVersionId() + " -> " + intendedVersionId();
else else
return "Legacy : " + currentVersionId(); return "Legacy : " + currentVersionId();

View File

@ -1,12 +1,12 @@
// //
// Copyright 2013 MultiMC Contributors // Copyright 2013 MultiMC Contributors
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
// You may obtain a copy of the License at // You may obtain a copy of the License at
// //
// http://www.apache.org/licenses/LICENSE-2.0 // http://www.apache.org/licenses/LICENSE-2.0
// //
// Unless required by applicable law or agreed to in writing, software // Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, // distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -23,22 +23,23 @@
#include <QFileSystemWatcher> #include <QFileSystemWatcher>
#include <logger/QsLog.h> #include <logger/QsLog.h>
ModList::ModList ( const QString& dir, const QString& list_file ) ModList::ModList(const QString &dir, const QString &list_file)
: QAbstractListModel(), m_dir(dir), m_list_file(list_file) : QAbstractListModel(), m_dir(dir), m_list_file(list_file)
{ {
m_dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs | QDir::NoSymLinks); m_dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs |
QDir::NoSymLinks);
m_dir.setSorting(QDir::Name); m_dir.setSorting(QDir::Name);
m_list_id = QUuid::createUuid().toString(); m_list_id = QUuid::createUuid().toString();
m_watcher = new QFileSystemWatcher(this); m_watcher = new QFileSystemWatcher(this);
is_watching = false; is_watching = false;
connect(m_watcher,SIGNAL(directoryChanged(QString)), this, SLOT(directoryChanged(QString))); connect(m_watcher, SIGNAL(directoryChanged(QString)), this,
update(); SLOT(directoryChanged(QString)));
} }
void ModList::startWatching() void ModList::startWatching()
{ {
is_watching = m_watcher->addPath(m_dir.absolutePath()); is_watching = m_watcher->addPath(m_dir.absolutePath());
if(is_watching) if (is_watching)
QLOG_INFO() << "Started watching " << m_dir.absolutePath(); QLOG_INFO() << "Started watching " << m_dir.absolutePath();
else else
QLOG_INFO() << "Failed to start watching " << m_dir.absolutePath(); QLOG_INFO() << "Failed to start watching " << m_dir.absolutePath();
@ -47,32 +48,31 @@ void ModList::startWatching()
void ModList::stopWatching() void ModList::stopWatching()
{ {
is_watching = !m_watcher->removePath(m_dir.absolutePath()); is_watching = !m_watcher->removePath(m_dir.absolutePath());
if(!is_watching) if (!is_watching)
QLOG_INFO() << "Stopped watching " << m_dir.absolutePath(); QLOG_INFO() << "Stopped watching " << m_dir.absolutePath();
else else
QLOG_INFO() << "Failed to stop watching " << m_dir.absolutePath(); QLOG_INFO() << "Failed to stop watching " << m_dir.absolutePath();
} }
bool ModList::update() bool ModList::update()
{ {
if (!isValid()) if (!isValid())
return false; return false;
QList<Mod> newMods; QList<Mod> newMods;
m_dir.refresh(); m_dir.refresh();
auto folderContents = m_dir.entryInfoList(); auto folderContents = m_dir.entryInfoList();
bool orderWasInvalid = false; bool orderWasInvalid = false;
// first, process the ordered items (if any) // first, process the ordered items (if any)
int currentOrderIndex = 0; int currentOrderIndex = 0;
QStringList listOrder = readListFile(); QStringList listOrder = readListFile();
for(auto item: listOrder) for (auto item : listOrder)
{ {
QFileInfo info (m_dir.filePath(item)); QFileInfo info(m_dir.filePath(item));
int idx = folderContents.indexOf(info); int idx = folderContents.indexOf(info);
// if the file from the index file exists // if the file from the index file exists
if(idx != -1) if (idx != -1)
{ {
// remove from the actual folder contents list // remove from the actual folder contents list
folderContents.takeAt(idx); folderContents.takeAt(idx);
@ -84,26 +84,27 @@ bool ModList::update()
orderWasInvalid = true; orderWasInvalid = true;
} }
} }
for(auto entry: folderContents) for (auto entry : folderContents)
{ {
newMods.append(Mod(entry)); newMods.append(Mod(entry));
} }
if(mods.size() != newMods.size()) if (mods.size() != newMods.size())
{ {
orderWasInvalid = true; orderWasInvalid = true;
} }
else for(int i = 0; i < mods.size(); i++) else
{ for (int i = 0; i < mods.size(); i++)
if(!mods[i].strongCompare(newMods[i]))
{ {
orderWasInvalid = true; if (!mods[i].strongCompare(newMods[i]))
break; {
orderWasInvalid = true;
break;
}
} }
}
beginResetModel(); beginResetModel();
mods.swap(newMods); mods.swap(newMods);
endResetModel(); endResetModel();
if(orderWasInvalid) if (orderWasInvalid)
{ {
saveListFile(); saveListFile();
emit changed(); emit changed();
@ -111,22 +112,21 @@ bool ModList::update()
return true; return true;
} }
void ModList::directoryChanged ( QString path ) void ModList::directoryChanged(QString path)
{ {
update(); update();
} }
QStringList ModList::readListFile() QStringList ModList::readListFile()
{ {
QStringList stringList; QStringList stringList;
if(m_list_file.isNull() || m_list_file.isEmpty()) if (m_list_file.isNull() || m_list_file.isEmpty())
return stringList; return stringList;
QFile textFile(m_list_file); QFile textFile(m_list_file);
if(!textFile.open(QIODevice::ReadOnly | QIODevice::Text)) if (!textFile.open(QIODevice::ReadOnly | QIODevice::Text))
return QStringList(); return QStringList();
QTextStream textStream(&textFile); QTextStream textStream(&textFile);
while (true) while (true)
{ {
@ -144,13 +144,13 @@ QStringList ModList::readListFile()
bool ModList::saveListFile() bool ModList::saveListFile()
{ {
if(m_list_file.isNull() || m_list_file.isEmpty()) if (m_list_file.isNull() || m_list_file.isEmpty())
return false; return false;
QFile textFile(m_list_file); QFile textFile(m_list_file);
if(!textFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)) if (!textFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
return false; return false;
QTextStream textStream(&textFile); QTextStream textStream(&textFile);
for(auto mod:mods) for (auto mod : mods)
{ {
auto pathname = mod.filename(); auto pathname = mod.filename();
QString filename = pathname.fileName(); QString filename = pathname.fileName();
@ -160,29 +160,28 @@ bool ModList::saveListFile()
return false; return false;
} }
bool ModList::isValid() bool ModList::isValid()
{ {
return m_dir.exists() && m_dir.isReadable(); return m_dir.exists() && m_dir.isReadable();
} }
bool ModList::installMod ( const QFileInfo& filename, int index ) bool ModList::installMod(const QFileInfo &filename, int index)
{ {
if(!filename.exists() || !filename.isReadable() || index < 0) if (!filename.exists() || !filename.isReadable() || index < 0)
{ {
return false; return false;
} }
Mod m(filename); Mod m(filename);
if(!m.valid()) if (!m.valid())
return false; return false;
// if it's already there, replace the original mod (in place) // if it's already there, replace the original mod (in place)
int idx = mods.indexOf(m); int idx = mods.indexOf(m);
if(idx != -1) if (idx != -1)
{ {
if(mods[idx].replace(m)) if (mods[idx].replace(m))
{ {
auto left = this->index(index); auto left = this->index(index);
auto right = this->index(index, columnCount(QModelIndex()) - 1); auto right = this->index(index, columnCount(QModelIndex()) - 1);
emit dataChanged(left, right); emit dataChanged(left, right);
@ -192,33 +191,33 @@ bool ModList::installMod ( const QFileInfo& filename, int index )
} }
return false; return false;
} }
auto type = m.type(); auto type = m.type();
if(type == Mod::MOD_UNKNOWN) if (type == Mod::MOD_UNKNOWN)
return false; return false;
if(type == Mod::MOD_SINGLEFILE || type == Mod::MOD_ZIPFILE) if (type == Mod::MOD_SINGLEFILE || type == Mod::MOD_ZIPFILE)
{ {
QString newpath = PathCombine(m_dir.path(), filename.fileName()); QString newpath = PathCombine(m_dir.path(), filename.fileName());
if(!QFile::copy(filename.filePath(), newpath)) if (!QFile::copy(filename.filePath(), newpath))
return false; return false;
m.repath(newpath); m.repath(newpath);
beginInsertRows(QModelIndex(), index, index); beginInsertRows(QModelIndex(), index, index);
mods.insert(index,m); mods.insert(index, m);
endInsertRows(); endInsertRows();
saveListFile(); saveListFile();
emit changed(); emit changed();
return true; return true;
} }
else if(type == Mod::MOD_FOLDER) else if (type == Mod::MOD_FOLDER)
{ {
QString from = filename.filePath(); QString from = filename.filePath();
QString to = PathCombine(m_dir.path(), filename.fileName()); QString to = PathCombine(m_dir.path(), filename.fileName());
if(!copyPath(from, to)) if (!copyPath(from, to))
return false; return false;
m.repath(to); m.repath(to);
beginInsertRows(QModelIndex(), index, index); beginInsertRows(QModelIndex(), index, index);
mods.insert(index,m); mods.insert(index, m);
endInsertRows(); endInsertRows();
saveListFile(); saveListFile();
emit changed(); emit changed();
@ -227,12 +226,12 @@ bool ModList::installMod ( const QFileInfo& filename, int index )
return false; return false;
} }
bool ModList::deleteMod ( int index ) bool ModList::deleteMod(int index)
{ {
if(index >= mods.size() || index < 0) if (index >= mods.size() || index < 0)
return false; return false;
Mod & m = mods[index]; Mod &m = mods[index];
if(m.destroy()) if (m.destroy())
{ {
beginRemoveRows(QModelIndex(), index, index); beginRemoveRows(QModelIndex(), index, index);
mods.removeAt(index); mods.removeAt(index);
@ -244,11 +243,11 @@ bool ModList::deleteMod ( int index )
return false; return false;
} }
bool ModList::deleteMods ( int first, int last ) bool ModList::deleteMods(int first, int last)
{ {
for(int i = first; i <= last; i++) for (int i = first; i <= last; i++)
{ {
Mod & m = mods[i]; Mod &m = mods[i];
m.destroy(); m.destroy();
} }
beginRemoveRows(QModelIndex(), first, last); beginRemoveRows(QModelIndex(), first, last);
@ -259,18 +258,17 @@ bool ModList::deleteMods ( int first, int last )
return true; return true;
} }
bool ModList::moveModTo(int from, int to)
bool ModList::moveModTo ( int from, int to )
{ {
if(from < 0 || from >= mods.size()) if (from < 0 || from >= mods.size())
return false; return false;
if (to >= rowCount()) if (to >= rowCount())
to = rowCount() - 1; to = rowCount() - 1;
if (to == -1) if (to == -1)
to = rowCount() - 1; to = rowCount() - 1;
if(from == to) if (from == to)
return false; return false;
int togap = to > from ? to + 1: to; int togap = to > from ? to + 1 : to;
beginMoveRows(QModelIndex(), from, from, QModelIndex(), togap); beginMoveRows(QModelIndex(), from, from, QModelIndex(), togap);
mods.move(from, to); mods.move(from, to);
endMoveRows(); endMoveRows();
@ -279,83 +277,81 @@ bool ModList::moveModTo ( int from, int to )
return true; return true;
} }
bool ModList::moveModUp ( int from ) bool ModList::moveModUp(int from)
{ {
if(from > 0) if (from > 0)
return moveModTo(from, from - 1); return moveModTo(from, from - 1);
return false; return false;
} }
bool ModList::moveModsUp ( int first, int last ) bool ModList::moveModsUp(int first, int last)
{ {
if(first == 0) if (first == 0)
return false; return false;
beginMoveRows(QModelIndex(), first, last, QModelIndex(), first - 1); beginMoveRows(QModelIndex(), first, last, QModelIndex(), first - 1);
mods.move(first-1, last); mods.move(first - 1, last);
endMoveRows(); endMoveRows();
saveListFile(); saveListFile();
emit changed(); emit changed();
return true; return true;
} }
bool ModList::moveModDown(int from)
bool ModList::moveModDown ( int from )
{ {
if(from < 0) if (from < 0)
return false; return false;
if(from < mods.size() - 1) if (from < mods.size() - 1)
return moveModTo(from, from + 1); return moveModTo(from, from + 1);
return false; return false;
} }
bool ModList::moveModsDown ( int first, int last ) bool ModList::moveModsDown(int first, int last)
{ {
if(last == mods.size() - 1) if (last == mods.size() - 1)
return false; return false;
beginMoveRows(QModelIndex(), first, last, QModelIndex(), last + 2); beginMoveRows(QModelIndex(), first, last, QModelIndex(), last + 2);
mods.move(last+1, first); mods.move(last + 1, first);
endMoveRows(); endMoveRows();
saveListFile(); saveListFile();
emit changed(); emit changed();
return true; return true;
} }
int ModList::columnCount(const QModelIndex &parent) const
int ModList::columnCount ( const QModelIndex& parent ) const
{ {
return 2; return 2;
} }
QVariant ModList::data ( const QModelIndex& index, int role ) const QVariant ModList::data(const QModelIndex &index, int role) const
{ {
if(!index.isValid()) if (!index.isValid())
return QVariant(); return QVariant();
int row = index.row(); int row = index.row();
int column = index.column(); int column = index.column();
if(row < 0 || row >= mods.size()) if (row < 0 || row >= mods.size())
return QVariant(); return QVariant();
if(role != Qt::DisplayRole) if (role != Qt::DisplayRole)
return QVariant(); return QVariant();
switch(column) switch (column)
{ {
case 0: case 0:
return mods[row].name(); return mods[row].name();
case 1: case 1:
return mods[row].version(); return mods[row].version();
case 2: case 2:
return mods[row].mcversion(); return mods[row].mcversion();
default: default:
return QVariant(); return QVariant();
} }
} }
QVariant ModList::headerData ( int section, Qt::Orientation orientation, int role ) const QVariant ModList::headerData(int section, Qt::Orientation orientation, int role) const
{ {
if (role != Qt::DisplayRole || orientation != Qt::Horizontal) if (role != Qt::DisplayRole || orientation != Qt::Horizontal)
return QVariant(); return QVariant();
@ -370,10 +366,9 @@ QVariant ModList::headerData ( int section, Qt::Orientation orientation, int rol
} }
} }
Qt::ItemFlags ModList::flags(const QModelIndex &index) const
Qt::ItemFlags ModList::flags ( const QModelIndex& index ) const
{ {
Qt::ItemFlags defaultFlags = QAbstractListModel::flags ( index ); Qt::ItemFlags defaultFlags = QAbstractListModel::flags(index);
if (index.isValid()) if (index.isValid())
return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags; return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
else else
@ -400,36 +395,37 @@ Qt::DropActions ModList::supportedDragActions() const
return Qt::MoveAction; return Qt::MoveAction;
} }
QMimeData* ModList::mimeData ( const QModelIndexList& indexes ) const QMimeData *ModList::mimeData(const QModelIndexList &indexes) const
{ {
QMimeData * data = new QMimeData(); QMimeData *data = new QMimeData();
if(indexes.size() == 0) if (indexes.size() == 0)
return data; return data;
auto idx = indexes[0]; auto idx = indexes[0];
int row = idx.row(); int row = idx.row();
if(row <0 || row >= mods.size()) if (row < 0 || row >= mods.size())
return data; return data;
QStringList params; QStringList params;
params << m_list_id << QString::number(row); params << m_list_id << QString::number(row);
data->setText(params.join('|')); data->setText(params.join('|'));
return data; return data;
} }
bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent ) bool ModList::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column,
const QModelIndex &parent)
{ {
if (action == Qt::IgnoreAction) if (action == Qt::IgnoreAction)
return true; return true;
// check if the action is supported // check if the action is supported
if (!data || !(action & supportedDropActions())) if (!data || !(action & supportedDropActions()))
return false; return false;
if(parent.isValid()) if (parent.isValid())
{ {
row = parent.row(); row = parent.row();
column = parent.column(); column = parent.column();
} }
if (row > rowCount()) if (row > rowCount())
row = rowCount(); row = rowCount();
if (row == -1) if (row == -1)
@ -437,41 +433,41 @@ bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int r
if (column == -1) if (column == -1)
column = 0; column = 0;
QLOG_INFO() << "Drop row: " << row << " column: " << column; QLOG_INFO() << "Drop row: " << row << " column: " << column;
// files dropped from outside? // files dropped from outside?
if(data->hasUrls()) if (data->hasUrls())
{ {
bool was_watching = is_watching; bool was_watching = is_watching;
if(was_watching) if (was_watching)
stopWatching(); stopWatching();
auto urls = data->urls(); auto urls = data->urls();
for(auto url: urls) for (auto url : urls)
{ {
// only local files may be dropped... // only local files may be dropped...
if(!url.isLocalFile()) if (!url.isLocalFile())
continue; continue;
QString filename = url.toLocalFile(); QString filename = url.toLocalFile();
installMod(filename, row); installMod(filename, row);
QLOG_INFO() << "installing: " << filename; QLOG_INFO() << "installing: " << filename;
} }
if(was_watching) if (was_watching)
startWatching(); startWatching();
return true; return true;
} }
else if(data->hasText()) else if (data->hasText())
{ {
QString sourcestr = data->text(); QString sourcestr = data->text();
auto list = sourcestr.split('|'); auto list = sourcestr.split('|');
if(list.size() != 2) if (list.size() != 2)
return false; return false;
QString remoteId = list[0]; QString remoteId = list[0];
int remoteIndex = list[1].toInt(); int remoteIndex = list[1].toInt();
QLOG_INFO() << "move: " << sourcestr; QLOG_INFO() << "move: " << sourcestr;
// no moving of things between two lists // no moving of things between two lists
if(remoteId != m_list_id) if (remoteId != m_list_id)
return false; return false;
// no point moving to the same place... // no point moving to the same place...
if(row == remoteIndex) if (row == remoteIndex)
return false; return false;
// otherwise, move the mod :D // otherwise, move the mod :D
moveModTo(remoteIndex, row); moveModTo(remoteIndex, row);
@ -479,4 +475,3 @@ bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int r
} }
return false; return false;
} }

View File

@ -168,8 +168,7 @@ std::shared_ptr<ModList> OneSixInstance::loaderModList()
{ {
d->loader_mod_list.reset(new ModList(loaderModsDir())); d->loader_mod_list.reset(new ModList(loaderModsDir()));
} }
else d->loader_mod_list->update();
d->loader_mod_list->update();
return d->loader_mod_list; return d->loader_mod_list;
} }
@ -180,8 +179,7 @@ std::shared_ptr<ModList> OneSixInstance::resourcePackList()
{ {
d->resource_pack_list.reset(new ModList(resourcePacksDir())); d->resource_pack_list.reset(new ModList(resourcePacksDir()));
} }
else d->resource_pack_list->update();
d->resource_pack_list->update();
return d->resource_pack_list; return d->resource_pack_list;
} }