summaryrefslogtreecommitdiffstats
path: root/logic/ModList.cpp
diff options
context:
space:
mode:
authorPetr Mrázek <peterix@gmail.com>2013-08-25 01:32:42 +0200
committerPetr Mrázek <peterix@gmail.com>2013-08-25 01:32:42 +0200
commitd884f849d60db44f05a6a6b22f4ffcf520900389 (patch)
tree22387a110c1e7dfeb5f68983b1f0ef0a13ba0aaa /logic/ModList.cpp
parente3b55067eb51ee82e72b41a1919406d768e00b89 (diff)
downloadMultiMC-d884f849d60db44f05a6a6b22f4ffcf520900389.tar
MultiMC-d884f849d60db44f05a6a6b22f4ffcf520900389.tar.gz
MultiMC-d884f849d60db44f05a6a6b22f4ffcf520900389.tar.lz
MultiMC-d884f849d60db44f05a6a6b22f4ffcf520900389.tar.xz
MultiMC-d884f849d60db44f05a6a6b22f4ffcf520900389.zip
All kinds of incremental improvements
Redone the instance action toolbar: * Removed all the dead actions * Change icon and Rename are now morphed into a header * Added button for opening the config folder Implemented support for loose files and folders as legacy jar mods Added texture pack support
Diffstat (limited to 'logic/ModList.cpp')
-rw-r--r--logic/ModList.cpp342
1 files changed, 37 insertions, 305 deletions
diff --git a/logic/ModList.cpp b/logic/ModList.cpp
index c3f3ced3..84511e4c 100644
--- a/logic/ModList.cpp
+++ b/logic/ModList.cpp
@@ -21,6 +21,7 @@
#include <QUrl>
#include <QDebug>
#include <QUuid>
+#include <QFileSystemWatcher>
ModList::ModList ( const QString& dir, const QString& list_file )
: QAbstractListModel(), m_dir(dir), m_list_file(list_file)
@@ -28,9 +29,31 @@ ModList::ModList ( const QString& dir, const QString& list_file )
m_dir.setFilter(QDir::Readable | QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs | QDir::NoSymLinks);
m_dir.setSorting(QDir::Name);
m_list_id = QUuid::createUuid().toString();
+ m_watcher = new QFileSystemWatcher(this);
+ is_watching = false;
+ connect(m_watcher,SIGNAL(directoryChanged(QString)), this, SLOT(directoryChanged(QString)));
update();
}
+void ModList::startWatching()
+{
+ is_watching = m_watcher->addPath(m_dir.absolutePath());
+ if(is_watching)
+ qDebug() << "Started watching " << m_dir.absolutePath();
+ else
+ qDebug() << "Failed to start watching " << m_dir.absolutePath();
+}
+
+void ModList::stopWatching()
+{
+ is_watching = !m_watcher->removePath(m_dir.absolutePath());
+ if(!is_watching)
+ qDebug() << "Stopped watching " << m_dir.absolutePath();
+ else
+ qDebug() << "Failed to stop watching " << m_dir.absolutePath();
+}
+
+
bool ModList::update()
{
if (!isValid())
@@ -88,6 +111,12 @@ bool ModList::update()
return true;
}
+void ModList::directoryChanged ( QString path )
+{
+ update();
+}
+
+
QStringList ModList::readListFile()
{
QStringList stringList;
@@ -333,11 +362,11 @@ QVariant ModList::headerData ( int section, Qt::Orientation orientation, int rol
switch (section)
{
case 0:
- return QString("Mod Name");
+ return QString("Name");
case 1:
- return QString("Mod Version");
+ return QString("Version");
case 2:
- return QString("MC Version");
+ return QString("Minecraft");
}
}
@@ -412,6 +441,9 @@ bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int r
// files dropped from outside?
if(data->hasUrls())
{
+ bool was_watching = is_watching;
+ if(was_watching)
+ stopWatching();
auto urls = data->urls();
for(auto url: urls)
{
@@ -422,6 +454,8 @@ bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int r
installMod(filename, row);
qDebug() << "installing: " << filename;
}
+ if(was_watching)
+ startWatching();
return true;
}
else if(data->hasText())
@@ -446,305 +480,3 @@ bool ModList::dropMimeData ( const QMimeData* data, Qt::DropAction action, int r
return false;
}
-
-/*
-ModList::ModList(const QString &dir)
- : modsFolder(dir)
-{
-
-}
-
-bool ModList::update(bool quickLoad)
-{
- bool listChanged = false;
-
- // Check for mods in the list whose files do not exist and remove them from the list.
- // If doing a quickLoad, erase the whole list.
- for (size_t i = 0; i < size(); i++)
- {
- if (quickLoad || !at(i).GetFileName().FileExists())
- {
- erase(begin() + i);
- i--;
- listChanged = true;
- }
- }
-
- // Add any mods in the mods folder that aren't already in the list.
- if (LoadModListFromDir(QString(), quickLoad))
- listChanged = true;
-
- return listChanged;
-}
-
-bool ModList::LoadModListFromDir(const QString& loadFrom, bool quickLoad)
-{
- QString dir(loadFrom.isEmpty() ? modsFolder : loadFrom);
-
- QDir modDir(dir);
- if (!modDir.exists())
- return false;
-
- bool listChanged = false;
-
- auto list = modDir.entryInfoList(QDir::Readable|QDir::NoDotAndDotDot, QDir::Name);
- for(auto currentFile: list)
- {
- if (currentFile.isFile())
- {
- if (quickLoad || FindByFilename(currentFile.absoluteFilePath()) == nullptr)
- {
- Mod mod(currentFile.absoluteFilePath());
- push_back(mod);
- listChanged = true;
- }
- }
- else if (currentFile.isDir())
- {
- if (LoadModListFromDir(currentFile.absoluteFilePath()))
- listChanged = true;
- }
- }
-
- return listChanged;
-}
-
-Mod *ModList::FindByFilename(const QString& filename)
-{
- // Search the list for a mod with the given filename.
- for (auto iter = begin(); iter != end(); ++iter)
- {
- if (iter->GetFileName() == QFileInfo(filename))
- return &(*iter);
- }
-
- // If nothing is found, return nullptr.
- return nullptr;
-}
-
-int ModList::FindIndexByFilename(const QString& filename)
-{
- // Search the list for a mod with the given filename.
- int i = 0;
- for (auto iter = begin(); iter != end(); ++iter, i++)
- {
- if (iter->GetFileName() == QFileInfo(filename))
- return i;
- }
-
- // If nothing is found, return nullptr.
- return -1;
-}
-
-Mod* ModList::FindByID(const QString& modID, const QString& modVersion)
-{
- // Search the list for a mod that matches
- for (auto iter = begin(); iter != end(); ++iter)
- {
- QString ID = iter->GetModID();
- QString version = iter->GetModVersion();
- if ( ID == modID && version == modVersion)
- return &(*iter);
- }
-
- // If nothing is found, return nullptr.
- return nullptr;
-}
-
-void ModList::LoadFromFile(const QString& file)
-{
- if (!wxFileExists(file))
- return;
-
- wxFFileInputStream inputStream(file);
- wxArrayString modListFile = ReadAllLines(inputStream);
-
- for (wxArrayString::iterator iter = modListFile.begin(); iter != modListFile.end(); iter++)
- {
- // Normalize the path to the instMods dir.
- wxFileName modFile(*iter);
- modFile.Normalize(wxPATH_NORM_ALL, modsFolder);
- modFile.MakeRelativeTo();
- // if the file is gone, do not load it
- if(!modFile.Exists())
- {
- continue;
- }
-
- if (FindByFilename(modFile.GetFullPath()) == nullptr)
- {
- push_back(Mod(modFile));
- }
- }
-}
-
-void ModList::SaveToFile(const QString& file)
-{
- QString text;
- for (iterator iter = begin(); iter != end(); ++iter)
- {
- wxFileName modFile = iter->GetFileName();
- modFile.MakeRelativeTo(modsFolder);
- text.append(modFile.GetFullPath());
- text.append("\n");
- }
-
- wxTempFileOutputStream out(file);
- WriteAllText(out, text);
- out.Commit();
-}
-
-bool ModList::InsertMod(size_t index, const QString &filename, const QString& saveToFile)
-{
- QFileInfo source(filename);
- QFileInfo dest(PathCombine(modsFolder, source.fileName()));
-
- if (source != dest)
- {
- QFile::copy(source.absoluteFilePath(), dest.absoluteFilePath());
- }
-
- int oldIndex = FindIndexByFilename(dest.absoluteFilePath());
-
- if (oldIndex != -1)
- {
- erase(begin() + oldIndex);
- }
-
- if (index >= size())
- push_back(Mod(dest));
- else
- insert(begin() + index, Mod(dest));
-
- if (!saveToFile.isEmpty())
- SaveToFile(saveToFile);
-
- return true;
-}
-
-bool ModList::DeleteMod(size_t index, const QString& saveToFile)
-{
- Mod *mod = &at(index);
- if(mod->GetModType() == Mod::MOD_FOLDER)
- {
- QDir dir(mod->GetFileName().absoluteFilePath());
- if(dir.removeRecursively())
- {
- erase(begin() + index);
-
- if (!saveToFile.isEmpty())
- SaveToFile(saveToFile);
-
- return true;
- }
- else
- {
- // wxLogError(_("Failed to delete mod."));
- }
- }
- else if (QFile(mod->GetFileName().absoluteFilePath()).remove())
- {
- erase(begin() + index);
-
- if (!saveToFile.isEmpty())
- SaveToFile(saveToFile);
-
- return true;
- }
- else
- {
- // wxLogError(_("Failed to delete mod."));
- }
- return false;
-}
-
-bool JarModList::InsertMod(size_t index, const QString &filename, const QString& saveToFile)
-{
- QString saveFile = saveToFile;
- if (saveToFile.isEmpty())
- saveFile = m_inst->GetModListFile().GetFullPath();
-
- if (ModList::InsertMod(index, filename, saveFile))
- {
- m_inst->setLWJGLVersion(true);
- return true;
- }
- return false;
-}
-
-bool JarModList::DeleteMod(size_t index, const QString& saveToFile)
-{
- QString saveFile = saveToFile;
- if (saveToFile.IsEmpty())
- saveFile = m_inst->GetModListFile().GetFullPath();
-
- if (ModList::DeleteMod(index, saveFile))
- {
- m_inst->SetNeedsRebuild();
- return true;
- }
- return false;
-}
-
-bool JarModList::UpdateModList(bool quickLoad)
-{
- if (ModList::UpdateModList(quickLoad))
- {
- m_inst->SetNeedsRebuild();
- return true;
- }
- return false;
-}
-
-bool FolderModList::LoadModListFromDir(const QString& loadFrom, bool quickLoad)
-{
- QString dir(loadFrom.IsEmpty() ? modsFolder : loadFrom);
-
- if (!wxDirExists(dir))
- return false;
-
- bool listChanged = false;
- wxDir modDir(dir);
-
- if (!modDir.IsOpened())
- {
- wxLogError(_("Failed to open directory: ") + dir);
- return false;
- }
-
- QString currentFile;
- if (modDir.GetFirst(&currentFile))
- {
- do
- {
- wxFileName modFile(Path::Combine(dir, currentFile));
-
- if (wxFileExists(modFile.GetFullPath()) || wxDirExists(modFile.GetFullPath()))
- {
- if (quickLoad || FindByFilename(modFile.GetFullPath()) == nullptr)
- {
- Mod mod(modFile.GetFullPath());
- push_back(mod);
- listChanged = true;
- }
- }
- } while (modDir.GetNext(&currentFile));
- }
-
- return listChanged;
-}
-
-bool ModNameSort (const Mod & i,const Mod & j)
-{
- if(i.GetModType() == j.GetModType())
- return (i.GetName().toLower() < j.GetName().toLower());
- return (i.GetModType() < j.GetModType());
-}
-
-bool FolderModList::UpdateModList ( bool quickLoad )
-{
- bool changed = ModList::UpdateModList(quickLoad);
- std::sort(begin(),end(),ModNameSort);
- return changed;
-}
-*/