From de27ab391f5c56db9532e7cbc32145d21e5df97c Mon Sep 17 00:00:00 2001 From: Tannin Date: Thu, 4 Apr 2013 21:49:44 +0200 Subject: - creating mods from overwrite - moving files from overwrite to mods - offline mode - several fixes to the grouping system - fix to "duplicate translation" errors --- src/mainwindow.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/mainwindow.h') diff --git a/src/mainwindow.h b/src/mainwindow.h index 91c2b17d..5880fcb8 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -137,6 +137,10 @@ signals: */ void styleChanged(const QString &styleFile); + + + void modListDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); + protected: virtual void showEvent(QShowEvent *event); @@ -310,6 +314,7 @@ private slots: void endorse_clicked(); void dontendorse_clicked(); void unendorse_clicked(); + void ignoreMissingData_clicked(); void visitOnNexus_clicked(); void openExplorer_clicked(); void information_clicked(); @@ -338,6 +343,8 @@ private slots: void syncOverwrite(); + void createModFromOverwrite(); + void removeOrigin(const QString &name); void procError(QProcess::ProcessError error); -- cgit v1.3.1 From 1c9018e9fdba7878b0ef605f81529c20ef3bbffe Mon Sep 17 00:00:00 2001 From: Tannin Date: Sat, 13 Apr 2013 19:23:18 +0200 Subject: - bugfix: wrong multibyte to widechar conversion in hookdll breaks internationalization - bugfix: mod names not checked for validity on rename - bugfix: mod list wasn't invalidated after rename (regression?) - problem reports moved to separate dialog - ncc plugin now does the check for dotNet - python plugin wrapper started (only supports tools currently) - new ini editor plugin in python (non-functional currently) --- src/installationmanager.cpp | 2 - src/main.cpp | 19 ++++++++ src/mainwindow.cpp | 75 +++++++++++++++++++++++++------- src/mainwindow.h | 3 +- src/modlist.cpp | 15 ++++--- src/organizer.pro | 9 ++-- src/problemsdialog.cpp | 58 ++++++++++++++++++++++++ src/problemsdialog.h | 35 +++++++++++++++ src/problemsdialog.ui | 104 ++++++++++++++++++++++++++++++++++++++++++++ src/resources.qrc | 3 -- 10 files changed, 293 insertions(+), 30 deletions(-) create mode 100644 src/problemsdialog.cpp create mode 100644 src/problemsdialog.h create mode 100644 src/problemsdialog.ui (limited to 'src/mainwindow.h') diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 1abb19da..63945150 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -18,9 +18,7 @@ along with Mod Organizer. If not, see . */ #include "installationmanager.h" - #include "utility.h" - #include "report.h" #include "categories.h" #include "questionboxmemory.h" diff --git a/src/main.cpp b/src/main.cpp index 268bb98f..ab740467 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -64,6 +64,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #pragma comment(linker, "/manifestDependency:\"name='dlls' processorArchitecture='x86' version='1.0.0.0' type='win32' \"") @@ -284,6 +285,24 @@ int main(int argc, char *argv[]) QSplashScreen splash(pixmap); splash.show(); + { // extend path to include dll directory so plugins don't need a manifest + static const int BUFSIZE = 4096; + + boost::scoped_array oldPath(new TCHAR[BUFSIZE]); + DWORD offset = ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), BUFSIZE); + if (offset > BUFSIZE) { + oldPath.reset(new TCHAR[offset]); + ::GetEnvironmentVariable(TEXT("PATH"), oldPath.get(), offset); + } + + std::tstring newPath(oldPath.get()); + newPath += TEXT(";"); + newPath += ToWString(QDir::toNativeSeparators(QCoreApplication::applicationDirPath())).c_str(); + newPath += TEXT("\\dlls"); + + ::SetEnvironmentVariable(TEXT("PATH"), newPath.c_str()); + } + registerMetaTypes(); QStringList arguments = application.arguments(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 6b546d4d..2fd47537 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -54,9 +54,11 @@ along with Mod Organizer. If not, see . #include "csvbuilder.h" #include "gameinfoimpl.h" #include "savetextasdialog.h" +#include "problemsdialog.h" #include #include #include +#include #include #include #include @@ -84,14 +86,13 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include #include #include #include #include - - #include @@ -394,8 +395,7 @@ void MainWindow::updateToolBar() void MainWindow::updateProblemsButton() { - QString problemDescription; - if (checkForProblems(problemDescription)) { + if (checkForProblems()) { ui->actionProblems->setEnabled(true); ui->actionProblems->setIconText(tr("Problems")); ui->actionProblems->setToolTip(tr("There are potential problems with your setup")); @@ -436,17 +436,19 @@ bool MainWindow::errorReported(QString &logFile) } -bool MainWindow::checkForProblems(QString &problemDescription) +bool MainWindow::checkForProblems() { - problemDescription = ""; +// problemDescription = ""; foreach (IPluginDiagnose *diagnose, m_DiagnosisPlugins) { std::vector activeProblems = diagnose->activeProblems(); - foreach (unsigned int key, activeProblems) { - problemDescription.append(tr("
  • %1
  • ").arg(diagnose->shortDescription(key))); + if (activeProblems.size() > 0) { + return true; } } + return false; +/* QString NCCBinary = QCoreApplication::applicationDirPath().mid(0).append("/NCC/NexusClientCLI.exe"); if (!QFile::exists(NCCBinary)) { problemDescription.append(tr("
  • NCC not installed. You won't be able to install some scripted mod-installers. Get NCC from the MO page on nexus
  • ")); @@ -479,7 +481,7 @@ bool MainWindow::checkForProblems(QString &problemDescription) } else { ui->actionProblems->setToolTip(tr("Everything seems to be in order")); } - return res; + return res;*/ } @@ -886,6 +888,8 @@ void MainWindow::toolPluginInvoke() plugin->display(); } catch (const std::exception &e) { reportError(tr("Plugin \"%1\" failed: %2").arg(plugin->name()).arg(e.what())); + } catch (...) { + reportError(tr("Plugin \"%1\" failed").arg(plugin->name())); } } @@ -912,13 +916,15 @@ bool MainWindow::registerPlugin(QObject *plugin) m_Settings.registerPlugin(pluginObj); } + bool addon = false; + { // diagnosis plugins IPluginDiagnose *diagnose = qobject_cast(plugin); if (diagnose != NULL) { m_DiagnosisPlugins.push_back(diagnose); + addon = true; } } - { // tool plugins IPluginTool *tool = qobject_cast(plugin); if (verifyPlugin(tool)) { @@ -934,7 +940,25 @@ bool MainWindow::registerPlugin(QObject *plugin) return true; } } - return false; + { // proxy plugins + IPluginProxy *proxy = qobject_cast(plugin); + if (verifyPlugin(proxy)) { + QStringList pluginNames = proxy->pluginList(QCoreApplication::applicationDirPath() + "/" + ToQString(AppConfig::pluginPath())); + foreach (const QString &pluginName, pluginNames) { + QObject *proxiedPlugin = proxy->instantiate(pluginName); + if (proxiedPlugin != NULL) { + if (registerPlugin(proxiedPlugin)) { + qDebug("loaded plugin \"%s\"", pluginName.toUtf8().constData()); + } else { + qWarning("plugin \"%s\" failed to load", pluginName.toUtf8().constData()); + } + } + } + return true; + } + } + + return addon; } @@ -978,12 +1002,20 @@ IGameInfo &MainWindow::gameInfo() const QString MainWindow::profileName() const { - return m_CurrentProfile->getName(); + if (m_CurrentProfile != NULL) { + return m_CurrentProfile->getName(); + } else { + return ""; + } } QString MainWindow::profilePath() const { - return m_CurrentProfile->getPath(); + if (m_CurrentProfile != NULL) { + return m_CurrentProfile->getPath(); + } else { + return ""; + } } QString MainWindow::downloadsPath() const @@ -1045,6 +1077,12 @@ QVariant MainWindow::pluginSetting(const QString &pluginName, const QString &key return m_Settings.pluginSetting(pluginName, key); } +QString MainWindow::pluginDataPath() const +{ + QString pluginPath = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getOrganizerDirectory())) + "/" + ToQString(AppConfig::pluginPath()); + return pluginPath + "/data"; +} + void MainWindow::startSteam() { @@ -4058,11 +4096,16 @@ void MainWindow::on_bsaList_itemChanged(QTreeWidgetItem*, int) m_CheckBSATimer.start(500); } + void MainWindow::on_actionProblems_triggered() { - QString problemDescription; - checkForProblems(problemDescription); - QMessageBox::information(this, tr("Problems"), problemDescription); +// QString problemDescription; +// checkForProblems(problemDescription); +// QMessageBox::information(this, tr("Problems"), problemDescription); + ProblemsDialog problems(m_DiagnosisPlugins, this); + if (problems.hasProblems()) { + problems.exec(); + } } void MainWindow::setCategoryListVisible(bool visible) diff --git a/src/mainwindow.h b/src/mainwindow.h index 5880fcb8..e50a8c23 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -103,6 +103,7 @@ public: virtual bool removeMod(MOBase::IModInterface *mod); virtual void modDataChanged(MOBase::IModInterface *mod); virtual QVariant pluginSetting(const QString &pluginName, const QString &key) const; + virtual QString pluginDataPath() const; void addPrimaryCategoryCandidates(QMenu *primaryCategoryMenu, ModInfo::Ptr info); @@ -205,7 +206,7 @@ private: bool extractProgress(QProgressDialog &extractProgress, int percentage, std::string fileName); - bool checkForProblems(QString &problemDescription); + bool checkForProblems(); int getBinaryExecuteInfo(const QFileInfo &targetInfo, QFileInfo &binaryInfo, QString &arguments); QTreeWidgetItem *addFilterItem(QTreeWidgetItem *root, const QString &name, int categoryID); diff --git a/src/modlist.cpp b/src/modlist.cpp index f186ce8e..2183ce09 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -20,12 +20,11 @@ along with Mod Organizer. If not, see . #include "modlist.h" #include "report.h" -#include "utility.h" #include "messagedialog.h" #include "installationtester.h" #include "qtgroupingproxy.h" #include - +#include #include #include #include @@ -301,19 +300,25 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const bool ModList::renameMod(int index, const QString &newName) { + QString nameFixed = newName; + if (!fixDirectoryName(nameFixed) || nameFixed.isEmpty()) { + MessageDialog::showMessage(tr("Invalid name"), NULL); + return false; + } + // before we rename, write back the current profile so we don't lose changes and to ensure // there is no scheduled asynchronous rewrite anytime soon m_Profile->writeModlistNow(); ModInfo::Ptr modInfo = ModInfo::getByIndex(index); QString oldName = modInfo->name(); - modInfo->setName(newName); + modInfo->setName(nameFixed); // this just broke all profiles! The recipient of modRenamed has to do some magic // to can't write the currently active profile back - emit modRenamed(oldName, newName); + emit modRenamed(oldName, nameFixed); // invalidate the currently displayed state of this list -// notifyChange(-1); + notifyChange(-1); return true; } diff --git a/src/organizer.pro b/src/organizer.pro index 582ba633..cfdf990b 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -78,7 +78,8 @@ SOURCES += \ csvbuilder.cpp \ savetextasdialog.cpp \ qtgroupingproxy.cpp \ - modlistview.cpp + modlistview.cpp \ + problemsdialog.cpp HEADERS += \ transfersavesdialog.h \ @@ -144,7 +145,8 @@ HEADERS += \ csvbuilder.h \ savetextasdialog.h \ qtgroupingproxy.h \ - modlistview.h + modlistview.h \ + problemsdialog.h FORMS += \ transfersavesdialog.ui \ @@ -174,7 +176,8 @@ FORMS += \ baincomplexinstallerdialog.ui \ activatemodsdialog.ui \ profileinputdialog.ui \ - savetextasdialog.ui + savetextasdialog.ui \ + problemsdialog.ui INCLUDEPATH += ../shared ../archive ../uibase ../bsatk "$(BOOSTPATH)" diff --git a/src/problemsdialog.cpp b/src/problemsdialog.cpp new file mode 100644 index 00000000..e0837f45 --- /dev/null +++ b/src/problemsdialog.cpp @@ -0,0 +1,58 @@ +#include "problemsdialog.h" +#include "ui_problemsdialog.h" +#include +#include +#include +#include + + +using namespace MOBase; + + +ProblemsDialog::ProblemsDialog(std::vector diagnosePlugins, QWidget *parent) + : QDialog(parent), ui(new Ui::ProblemsDialog) +{ + ui->setupUi(this); + + foreach (IPluginDiagnose *diagnose, diagnosePlugins) { + std::vector activeProblems = diagnose->activeProblems(); + foreach (unsigned int key, activeProblems) { + QTreeWidgetItem *newItem = new QTreeWidgetItem(); + newItem->setText(0, diagnose->shortDescription(key)); + newItem->setData(0, Qt::UserRole, diagnose->fullDescription(key)); + + if (diagnose->hasGuidedFix(key)) { + ui->problemsWidget->setItemWidget(newItem, 1, new QPushButton(tr("Fix"))); + } else { + newItem->setText(1, tr("No guided fix :(")); + } + ui->problemsWidget->addTopLevelItem(newItem); + } + } + connect(ui->problemsWidget, SIGNAL(itemSelectionChanged()), this, SLOT(selectionChanged())); + connect(ui->descriptionText, SIGNAL(anchorClicked(QUrl)), this, SLOT(urlClicked(QUrl))); +} + + +ProblemsDialog::~ProblemsDialog() +{ + delete ui; +} + + +bool ProblemsDialog::hasProblems() const +{ + return ui->problemsWidget->topLevelItemCount() != 0; +} + +void ProblemsDialog::selectionChanged() +{ + QString text = ui->problemsWidget->currentItem()->data(0, Qt::UserRole).toString(); + ui->descriptionText->setText(text); + ui->descriptionText->setLineWrapMode(text.contains('\n') ? QTextEdit::NoWrap : QTextEdit::WidgetWidth); +} + +void ProblemsDialog::urlClicked(const QUrl &url) +{ + ::ShellExecuteW(NULL, L"open", ToWString(url.toString()).c_str(), NULL, NULL, SW_SHOWNORMAL); +} diff --git a/src/problemsdialog.h b/src/problemsdialog.h new file mode 100644 index 00000000..299faf8d --- /dev/null +++ b/src/problemsdialog.h @@ -0,0 +1,35 @@ +#ifndef PROBLEMSDIALOG_H +#define PROBLEMSDIALOG_H + + +#include +#include +#include + + +namespace Ui { +class ProblemsDialog; +} + + +class ProblemsDialog : public QDialog +{ + Q_OBJECT + +public: + explicit ProblemsDialog(std::vector diagnosePlugins, QWidget *parent = 0); + ~ProblemsDialog(); + + bool hasProblems() const; + +private slots: + + void selectionChanged(); + void urlClicked(const QUrl &url); + +private: + + Ui::ProblemsDialog *ui; +}; + +#endif // PROBLEMSDIALOG_H diff --git a/src/problemsdialog.ui b/src/problemsdialog.ui new file mode 100644 index 00000000..b194bf31 --- /dev/null +++ b/src/problemsdialog.ui @@ -0,0 +1,104 @@ + + + ProblemsDialog + + + + 0 + 0 + 574 + 376 + + + + Problems + + + + + + 2 + + + false + + + 420 + + + + 1 + + + + + 2 + + + + + + + + QTextEdit::NoWrap + + + true + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'MS Shell Dlg 2'; font-size:7.8pt; font-weight:400; font-style:normal;"> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;"><br /></p></body></html> + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + ProblemsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + ProblemsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/resources.qrc b/src/resources.qrc index a743ba39..855a23fc 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -50,8 +50,5 @@ resources/conflict-overwritten.png resources/conflict-redundant.png resources/accessories-text-editor.png - resources/network-idle.png - resources/network-offline.png - resources/network-error.png -- cgit v1.3.1 From 9bc123e8e2dbd17508a68e4afc2eb881873601bd Mon Sep 17 00:00:00 2001 From: Tannin Date: Fri, 10 May 2013 10:57:35 +0200 Subject: - initial support for exposing the nexusbridge to python - started improving usability of nexus bridge - support for installers implemented in python --- src/downloadlist.h | 142 ++++++++++++++++++------------------ src/installationmanager.cpp | 16 ++-- src/mainwindow.cpp | 11 ++- src/mainwindow.h | 1 + src/modinfo.cpp | 62 +++------------- src/modinfo.h | 20 +++-- src/modinfodialog.cpp | 15 ++-- src/modlist.cpp | 13 +++- src/nexusdialog.cpp | 4 +- src/nexusinterface.cpp | 54 +++++++++----- src/nexusinterface.h | 43 +++++------ src/organizer.pro | 1 + src/resources.qrc | 1 + src/resources/x-office-calendar.png | Bin 0 -> 604 bytes src/version.rc | 4 +- 15 files changed, 192 insertions(+), 195 deletions(-) create mode 100644 src/resources/x-office-calendar.png (limited to 'src/mainwindow.h') diff --git a/src/downloadlist.h b/src/downloadlist.h index abd177b2..1ae97cd0 100644 --- a/src/downloadlist.h +++ b/src/downloadlist.h @@ -17,76 +17,72 @@ You should have received a copy of the GNU General Public License along with Mod Organizer. If not, see . */ -#ifndef DOWNLOADLIST_H -#define DOWNLOADLIST_H - -#include - - -class DownloadManager; - - -/** - * @brief model of the list of active and completed downloads - **/ -class DownloadList : public QAbstractTableModel -{ - - Q_OBJECT - -public: - - /** - * @brief constructor - * - * @param manager the download manager processing downloads - * @param parent parent object Defaults to 0. - **/ - explicit DownloadList(DownloadManager *manager, QObject *parent = 0); - - /** - * @brief retrieve the number of rows to display. Invoked by Qt - * - * @param parent not relevant for this implementation - * @return number of rows to display - **/ - virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; - - virtual int columnCount(const QModelIndex &parent) const; - - QModelIndex index(int row, int column, const QModelIndex &parent) const; - QModelIndex parent(const QModelIndex &child) const; - - virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; - - /** - * @brief retrieve the data to display in a specific row. Invoked by Qt - * - * @param index location to look up - * @param role ... Defaults to Qt::DisplayRole. - * @return this implementation only returns the row, the QItemDelegate implementation is expected to fetch its information from the DownloadManager - **/ - virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; - -signals: - -public slots: - - /** - * @brief used to inform the model that data has changed - * - * @param row the row that changed. This can be negative to update the whole view - **/ - void update(int row); - - void aboutToUpdate(); - -private: - -private: - - DownloadManager *m_Manager; - -}; - -#endif // DOWNLOADLIST_H +#ifndef DOWNLOADLIST_H +#define DOWNLOADLIST_H + +#include + + +class DownloadManager; + + +/** + * @brief model of the list of active and completed downloads + **/ +class DownloadList : public QAbstractTableModel +{ + + Q_OBJECT + +public: + + /** + * @brief constructor + * + * @param manager the download manager processing downloads + * @param parent parent object Defaults to 0. + **/ + explicit DownloadList(DownloadManager *manager, QObject *parent = 0); + + /** + * @brief retrieve the number of rows to display. Invoked by Qt + * + * @param parent not relevant for this implementation + * @return number of rows to display + **/ + virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; + + virtual int columnCount(const QModelIndex &parent) const; + + QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex parent(const QModelIndex &child) const; + + virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; + + /** + * @brief retrieve the data to display in a specific row. Invoked by Qt + * + * @param index location to look up + * @param role ... Defaults to Qt::DisplayRole. + * @return this implementation only returns the row, the QItemDelegate implementation is expected to fetch its information from the DownloadManager + **/ + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + +public slots: + + /** + * @brief used to inform the model that data has changed + * + * @param row the row that changed. This can be negative to update the whole view + **/ + void update(int row); + + void aboutToUpdate(); + +private: + + DownloadManager *m_Manager; + +}; + +#endif // DOWNLOADLIST_H diff --git a/src/installationmanager.cpp b/src/installationmanager.cpp index 16761f24..52ef01c1 100644 --- a/src/installationmanager.cpp +++ b/src/installationmanager.cpp @@ -693,7 +693,7 @@ bool InstallationManager::install(const QString &fileName, const QString &modsDi GuessedValue &modName, bool &hasIniTweaks) { QFileInfo fileInfo(fileName); - bool success = false; +// bool success = false; if (m_SupportedExtensions.find(fileInfo.suffix()) == m_SupportedExtensions.end()) { reportError(tr("File format \"%1\" not supported").arg(fileInfo.completeSuffix())); return false; @@ -706,7 +706,7 @@ bool InstallationManager::install(const QString &fileName, const QString &modsDi QString version = ""; QString newestVersion = ""; int categoryID = 0; - bool nameGuessed = false; +// bool nameGuessed = false; QString metaName = fileName.mid(0).append(".meta"); if (QFile(metaName).exists()) { @@ -804,10 +804,14 @@ bool InstallationManager::install(const QString &fileName, const QString &modsDi return false; } break; case IPluginInstaller::RESULT_SUCCESS: { - DirectoryTree::node_iterator iniTweakNode = filesTree->nodeFind(DirectoryTreeInformation("INI Tweaks")); - hasIniTweaks = (iniTweakNode != filesTree->nodesEnd()) && - ((*iniTweakNode)->numLeafs() != 0); - return true; + if (filesTree != NULL) { + DirectoryTree::node_iterator iniTweakNode = filesTree->nodeFind(DirectoryTreeInformation("INI Tweaks")); + hasIniTweaks = (iniTweakNode != filesTree->nodesEnd()) && + ((*iniTweakNode)->numLeafs() != 0); + return true; + } else { + return false; + } } break; } } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2fd47537..50c81ccc 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -900,7 +900,7 @@ void MainWindow::registerPluginTool(IPluginTool *tool) action->setToolTip(tool->tooltip()); tool->setParentWidget(this); action->setData(qVariantFromValue((void*)tool)); - connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke())); + connect(action, SIGNAL(triggered()), this, SLOT(toolPluginInvoke()), Qt::QueuedConnection); QToolButton *toolBtn = qobject_cast(ui->toolBar->widgetForAction(ui->actionTool)); toolBtn->menu()->addAction(action); } @@ -911,6 +911,7 @@ bool MainWindow::registerPlugin(QObject *plugin) { // generic treatment for all plugins IPlugin *pluginObj = qobject_cast(plugin); if (pluginObj == NULL) { + qDebug("not an IPlugin"); return false; } m_Settings.registerPlugin(pluginObj); @@ -958,6 +959,8 @@ bool MainWindow::registerPlugin(QObject *plugin) } } + qDebug("no matching plugin interface"); + return addon; } @@ -1000,6 +1003,12 @@ IGameInfo &MainWindow::gameInfo() const } +IModRepositoryBridge *MainWindow::createNexusBridge() const +{ + return new NexusBridge(); +} + + QString MainWindow::profileName() const { if (m_CurrentProfile != NULL) { diff --git a/src/mainwindow.h b/src/mainwindow.h index e50a8c23..e398a674 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -94,6 +94,7 @@ public: void loadPlugins(); virtual MOBase::IGameInfo &gameInfo() const; + virtual MOBase::IModRepositoryBridge *createNexusBridge() const; virtual QString profileName() const; virtual QString profilePath() const; virtual QString downloadsPath() const; diff --git a/src/modinfo.cpp b/src/modinfo.cpp index d84a6aa0..2ac7182b 100644 --- a/src/modinfo.cpp +++ b/src/modinfo.cpp @@ -56,35 +56,6 @@ static bool ByName(const ModInfo::Ptr &LHS, const ModInfo::Ptr &RHS) return QString::compare(LHS->name(), RHS->name(), Qt::CaseInsensitive) < 0; } -ModInfo::NexusFileInfo::NexusFileInfo(const QString &data) -{ - QVariantList result = QtJson::Json::parse(data).toList(); - - while (result.length() < 7) { - result.append(QVariant()); - } - id = result.at(0).toInt(); - name = result.at(1).toString(); - url = result.at(2).toString(); - version = result.at(3).toString(); - description = result.at(4).toString(); - category = result.at(5).toInt(); - size = result.at(6).toInt(); -} - - -QString ModInfo::NexusFileInfo::toString() const -{ - return QString("[ %1,\"%2\",\"%3\",\"%4\",\"%5\",%6,%7 ]") - .arg(id) - .arg(name) - .arg(url) - .arg(version) - .arg(description.mid(0).replace("\"", "'")) - .arg(category) - .arg(size); -} - ModInfo::Ptr ModInfo::createFrom(const QDir &dir, DirectoryEntry **directoryStructure) { @@ -356,7 +327,7 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc for (int i = 0; i < numNexusFiles; ++i) { metaFile.setArrayIndex(i); QString infoString = metaFile.value("info", "").toString(); - NexusFileInfo info(infoString); + ModRepositoryFileInfo *info = new ModRepositoryFileInfo(infoString, this); m_NexusFileInfos.push_back(info); } metaFile.endArray(); @@ -379,10 +350,10 @@ ModInfoRegular::ModInfoRegular(const QDir &path, DirectoryEntry **directoryStruc } } - connect(&m_NexusBridge, SIGNAL(nxmDescriptionAvailable(int,QVariant,QVariant)), this, SLOT(nxmDescriptionAvailable(int,QVariant,QVariant))); - connect(&m_NexusBridge, SIGNAL(nxmFilesAvailable(int,QVariant,QVariant)), this, SLOT(nxmFilesAvailable(int,QVariant,QVariant))); - connect(&m_NexusBridge, SIGNAL(nxmEndorsementToggled(int,QVariant,QVariant)), this, SLOT(nxmEndorsementToggled(int,QVariant,QVariant))); - connect(&m_NexusBridge, SIGNAL(nxmRequestFailed(int,QVariant,QString)), this, SLOT(nxmRequestFailed(int,QVariant,QString))); + connect(&m_NexusBridge, SIGNAL(descriptionAvailable(int,QVariant,QVariant)), this, SLOT(nxmDescriptionAvailable(int,QVariant,QVariant))); + connect(&m_NexusBridge, SIGNAL(filesAvailable(int,QVariant,const QList&)), this, SLOT(nxmFilesAvailable(int,QVariant,QList))); + connect(&m_NexusBridge, SIGNAL(endorsementToggled(int,QVariant,QVariant)), this, SLOT(nxmEndorsementToggled(int,QVariant,QVariant))); + connect(&m_NexusBridge, SIGNAL(requestFailed(int,QVariant,QString)), this, SLOT(nxmRequestFailed(int,QVariant,QString))); } @@ -422,7 +393,7 @@ void ModInfoRegular::saveMeta() metaFile.beginWriteArray("nexusFiles"); for (int i = 0; i < m_NexusFileInfos.size(); ++i) { metaFile.setArrayIndex(i); - metaFile.setValue("info", m_NexusFileInfos.at(i).toString()); + metaFile.setValue("info", m_NexusFileInfos.at(i)->toString()); } metaFile.endArray(); } else { @@ -454,24 +425,9 @@ void ModInfoRegular::nxmDescriptionAvailable(int, QVariant, QVariant resultData) } -void ModInfoRegular::nxmFilesAvailable(int, QVariant, QVariant resultData) +void ModInfoRegular::nxmFilesAvailable(int, QVariant, const QList &resultData) { - m_NexusFileInfos.clear(); - - QVariantList result = resultData.toList(); - - foreach(QVariant file, result) { - QVariantMap fileInfo = file.toMap(); - - m_NexusFileInfos.push_back(NexusFileInfo(fileInfo["id"].toInt(), - fileInfo["name"].toString(), - fileInfo["uri"].toString(), - fileInfo["version"].toString(), - fileInfo["description"].toString(), - fileInfo["category_id"].toInt(), - fileInfo["size"].toInt())); - } - + m_NexusFileInfos = resultData; m_LastNexusQuery = QDateTime::currentDateTime(); m_MetaInfoChanged = true; saveMeta(); @@ -697,7 +653,7 @@ QString ModInfoRegular::notes() const return m_Notes; } -void ModInfoRegular::getNexusFiles(QList::const_iterator &begin, QList::const_iterator &end) +void ModInfoRegular::getNexusFiles(QList::const_iterator &begin, QList::const_iterator &end) { begin = m_NexusFileInfos.begin(); end = m_NexusFileInfos.end(); diff --git a/src/modinfo.h b/src/modinfo.h index adf194dd..92752e4b 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -35,6 +35,7 @@ along with Mod Organizer. If not, see . #include #include +using MOBase::ModRepositoryFileInfo; /** * @brief Represents meta information about a single mod. @@ -79,7 +80,7 @@ public: ENDORSED_UNKNOWN, ENDORSED_NEVER }; - +/* struct NexusFileInfo { NexusFileInfo(const QString &data); NexusFileInfo(int id, const QString &name, const QString &url, const QString &version, @@ -95,7 +96,7 @@ public: int size; QString toString() const; - }; + };*/ public: @@ -373,7 +374,8 @@ public: * @param begin iterator to the first file * @param end iterator to one past the last file */ - virtual void getNexusFiles(QList::const_iterator &begin, QList::const_iterator &end) = 0; + virtual void getNexusFiles(QList::const_iterator &begin, + QList::const_iterator &end) = 0; /** * @return nexus description of the mod (html) @@ -684,7 +686,7 @@ public: * @param begin iterator to the first file * @param end iterator to one past the last file */ - virtual void getNexusFiles(QList::const_iterator &begin, QList::const_iterator &end); + virtual void getNexusFiles(QList::const_iterator &begin, QList::const_iterator &end); /** * @return nexus description of the mod (html) @@ -719,7 +721,7 @@ private: private slots: void nxmDescriptionAvailable(int modID, QVariant userData, QVariant resultData); - void nxmFilesAvailable(int, QVariant, QVariant resultData); + void nxmFilesAvailable(int, QVariant, const QList &resultData); void nxmEndorsementToggled(int, QVariant userData, QVariant resultData); void nxmRequestFailed(int modID, QVariant userData, const QString &errorMessage); @@ -746,7 +748,7 @@ private: QString m_InstallationFile; QString m_Notes; QString m_NexusDescription; - QList m_NexusFileInfos; + QList m_NexusFileInfos; QDateTime m_LastNexusQuery; @@ -782,7 +784,8 @@ public: virtual std::vector getFlags() const; virtual QString getDescription() const; virtual QDateTime getLastNexusQuery() const { return QDateTime(); } - virtual void getNexusFiles(QList::const_iterator&, QList::const_iterator&) {} + virtual void getNexusFiles(QList::const_iterator&, + QList::const_iterator&) {} virtual QString getNexusDescription() const { return QString(); } private: @@ -825,7 +828,8 @@ public: virtual int getHighlight() const; virtual QString getDescription() const; virtual QDateTime getLastNexusQuery() const { return QDateTime(); } - virtual void getNexusFiles(QList::const_iterator&, QList::const_iterator&) {} + virtual void getNexusFiles(QList::const_iterator&, + QList::const_iterator&) {} virtual QString getNexusDescription() const { return QString(); } private: diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 5d6f4a2b..d1c37263 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -781,20 +781,21 @@ void ModInfoDialog::modDetailsUpdated(bool success) // prevent sorting while we change the table filesWidget->setSortingEnabled(false); int row = 0; - QList::const_iterator current, end; + QList::const_iterator current, end; m_ModInfo->getNexusFiles(current, end); for (; current != end; ++current) { + ModRepositoryFileInfo *fileInfo = *current; filesWidget->insertRow(row); - int type = current->category; + int type = fileInfo->categoryID; filesWidget->setItem(row, 4, new QTableWidgetItem(QString("%1").arg(type))); filesWidget->setItem(row, 0, new QTableWidgetItem(getFileCategory(type))); - QTableWidgetItem *nameItem = new QTableWidgetItem(current->name); - nameItem->setToolTip(current->description); - nameItem->setData(Qt::UserRole, current->id); + QTableWidgetItem *nameItem = new QTableWidgetItem(fileInfo->name); + nameItem->setToolTip(fileInfo->description); + nameItem->setData(Qt::UserRole, fileInfo->fileID); filesWidget->setItem(row, 1, nameItem); - filesWidget->setItem(row, 2, new QTableWidgetItem(current->version)); + filesWidget->setItem(row, 2, new QTableWidgetItem(fileInfo->version.canonicalString())); QTableWidgetItem *sizeItem = new QTableWidgetItem(); - sizeItem->setData(Qt::DisplayRole, current->size); + sizeItem->setData(Qt::DisplayRole, fileInfo->fileSize); filesWidget->setItem(row, 3, sizeItem); ++row; } diff --git a/src/modlist.cpp b/src/modlist.cpp index 2183ce09..3fc8ae23 100644 --- a/src/modlist.cpp +++ b/src/modlist.cpp @@ -136,6 +136,8 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const QString version = modInfo->getVersion().canonicalString(); if (version.isEmpty() && modInfo->canBeUpdated()) { version = "?"; + } else if (version[0] == 'd') { + version.remove(0, 1); } return version; } else if (column == COL_PRIORITY) { @@ -228,10 +230,13 @@ QVariant ModList::data(const QModelIndex &modelIndex, int role) const } return result; } else if (role == Qt::DecorationRole) { - if ((column == COL_VERSION) && - modInfo->updateAvailable() && - modInfo->getNewestVersion().isValid()) { - return QIcon(":/MO/gui/update_available"); + if (column == COL_VERSION) { + if (modInfo->updateAvailable() && + modInfo->getNewestVersion().isValid()) { + return QIcon(":/MO/gui/update_available"); + } else if (modInfo->getVersion().isVersionDate()) { + return QIcon(":/MO/gui/version_date"); + } } return QVariant(); } else if (role == Qt::ForegroundRole) { diff --git a/src/nexusdialog.cpp b/src/nexusdialog.cpp index 6d8e850b..2569798e 100644 --- a/src/nexusdialog.cpp +++ b/src/nexusdialog.cpp @@ -168,7 +168,9 @@ void NexusDialog::loginFinished(bool necessary) void NexusDialog::loadNexus() { - m_View->load(QUrl(m_Url)); + if (m_View != NULL) { + m_View->load(QUrl(m_Url)); + } } diff --git a/src/nexusinterface.cpp b/src/nexusinterface.cpp index 49cf595e..56752ca5 100644 --- a/src/nexusinterface.cpp +++ b/src/nexusinterface.cpp @@ -32,34 +32,35 @@ using namespace MOShared; NexusBridge::NexusBridge() + : m_Interface(NexusInterface::instance()) + , m_Url(MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())) { - m_Interface = NexusInterface::instance(); } -void NexusBridge::requestDescription(int modID, QVariant userData, const QString &url) +void NexusBridge::requestDescription(int modID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestDescription(modID, this, userData, url)); + m_RequestIDs.insert(m_Interface->requestDescription(modID, this, userData, m_Url)); } -void NexusBridge::requestFiles(int modID, QVariant userData, const QString &url) +void NexusBridge::requestFiles(int modID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestFiles(modID, this, userData, url)); + m_RequestIDs.insert(m_Interface->requestFiles(modID, this, userData, m_Url)); } -void NexusBridge::requestFileInfo(int modID, int fileID, QVariant userData, const QString &url) +void NexusBridge::requestFileInfo(int modID, int fileID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestFileInfo(modID, fileID, this, userData, url)); + m_RequestIDs.insert(m_Interface->requestFileInfo(modID, fileID, this, userData, m_Url)); } -void NexusBridge::requestDownloadURL(int modID, int fileID, QVariant userData, const QString &url) +void NexusBridge::requestDownloadURL(int modID, int fileID, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestDownloadURL(modID, fileID, this, userData, url)); + m_RequestIDs.insert(m_Interface->requestDownloadURL(modID, fileID, this, userData, m_Url)); } -void NexusBridge::requestToggleEndorsement(int modID, bool endorse, QVariant userData, const QString &url) +void NexusBridge::requestToggleEndorsement(int modID, bool endorse, QVariant userData) { - m_RequestIDs.insert(m_Interface->requestToggleEndorsement(modID, endorse, this, userData, url)); + m_RequestIDs.insert(m_Interface->requestToggleEndorsement(modID, endorse, this, userData, m_Url)); } void NexusBridge::nxmDescriptionAvailable(int modID, QVariant userData, QVariant resultData, int requestID) @@ -67,7 +68,7 @@ void NexusBridge::nxmDescriptionAvailable(int modID, QVariant userData, QVariant std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); - emit nxmDescriptionAvailable(modID, userData, resultData); + emit descriptionAvailable(modID, userData, resultData); } } @@ -76,7 +77,26 @@ void NexusBridge::nxmFilesAvailable(int modID, QVariant userData, QVariant resul std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); - emit nxmFilesAvailable(modID, userData, resultData); + + QList fileInfoList; + + QVariantList resultList = resultData.toList(); + + foreach(QVariant file, resultList) { + ModRepositoryFileInfo *temp = new ModRepositoryFileInfo(NULL); + QVariantMap fileInfo = file.toMap(); + temp->uri = fileInfo["uri"].toString(); + temp->name = fileInfo["name"].toString(); + temp->description = fileInfo["description"].toString(); + temp->version = VersionInfo(fileInfo["version"].toString()); + temp->categoryID = fileInfo["category_id"].toInt(); + temp->fileID = fileInfo["id"].toInt(); + temp->fileSize = fileInfo["size"].toInt(); + fileInfoList.append(temp); + } + + emit bla(userData.toString()); + emit filesAvailable(modID, userData, fileInfoList); } } @@ -85,7 +105,7 @@ void NexusBridge::nxmFileInfoAvailable(int modID, int fileID, QVariant userData, std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); - emit nxmFileInfoAvailable(modID, fileID, userData, resultData); + emit fileInfoAvailable(modID, fileID, userData, resultData); } } @@ -94,7 +114,7 @@ void NexusBridge::nxmDownloadURLsAvailable(int modID, int fileID, QVariant userD std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); - emit nxmDownloadURLsAvailable(modID, fileID, userData, resultData); + //emit downloadURLsAvailable(modID, fileID, userData, resultData); } } @@ -103,7 +123,7 @@ void NexusBridge::nxmEndorsementToggled(int modID, QVariant userData, QVariant r std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); - emit nxmEndorsementToggled(modID, userData, resultData); + //emit endorsementToggled(modID, userData, resultData); } } @@ -112,7 +132,7 @@ void NexusBridge::nxmRequestFailed(int modID, QVariant userData, int requestID, std::set::iterator iter = m_RequestIDs.find(requestID); if (iter != m_RequestIDs.end()) { m_RequestIDs.erase(iter); - emit nxmRequestFailed(modID, userData, errorMessage); + //emit requestFailed(modID, userData, errorMessage); } } diff --git a/src/nexusinterface.h b/src/nexusinterface.h index cca84e06..cb455e93 100644 --- a/src/nexusinterface.h +++ b/src/nexusinterface.h @@ -26,6 +26,7 @@ along with Mod Organizer. If not, see . #include "utility.h" #include #include +#include #include #include #include @@ -46,7 +47,7 @@ class NexusInterface; * NexusBridge does this automatically. Users connect to the signals of NexusBridge they intend * to handle and only receive the signals the caused **/ -class NexusBridge : public QObject +class NexusBridge : public MOBase::IModRepositoryBridge { Q_OBJECT @@ -62,18 +63,15 @@ public: * @param userData user data to be returned with the result * @param url the url to request from **/ - void requestDescription(int modID, QVariant userData, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + virtual void requestDescription(int modID, QVariant userData); /** * @brief request a list of the files belonging to a mod * * @param modID id of the mod caller is interested in * @param userData user data to be returned with the result - * @param url the url to request from **/ - void requestFiles(int modID, QVariant userData, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + virtual void requestFiles(int modID, QVariant userData); /** * @brief request info about a single file of a mod @@ -81,10 +79,8 @@ public: * @param modID id of the mod caller is interested in * @param fileID id of the file the caller is interested in * @param userData user data to be returned with the result - * @param url the url to request from **/ - void requestFileInfo(int modID, int fileID, QVariant userData, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + virtual void requestFileInfo(int modID, int fileID, QVariant userData); /** * @brief request the download url of a file @@ -92,28 +88,28 @@ public: * @param modID id of the mod caller is interested in * @param fileID id of the file the caller is interested in * @param userData user data to be returned with the result - * @param url the url to request from **/ - void requestDownloadURL(int modID, int fileID, QVariant userData, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + virtual void requestDownloadURL(int modID, int fileID, QVariant userData); /** * @brief requestToggleEndorsement - * @param modID - * @param userData - * @param url + * @param modID id of the mod caller is interested in + * @param userData user data to be returned with the result */ - void requestToggleEndorsement(int modID, bool endorse, QVariant userData, - const QString &url = MOBase::ToQString(MOShared::GameInfo::instance().getNexusInfoUrl())); + virtual void requestToggleEndorsement(int modID, bool endorse, QVariant userData); +/* +signals: + + void descriptionAvailable(int modID, QVariant userData, QVariant resultData); + void filesAvailable(int modID, QVariant userData, const QList &resultData); + void fileInfoAvailable(int modID, int fileID, QVariant userData, QVariant resultData); + void downloadURLsAvailable(int modID, int fileID, QVariant userData, QVariant resultData); + void endorsementToggled(int modID, QVariant userData, QVariant resultData); + void requestFailed(int modID, QVariant userData, const QString &errorMessage);*/ signals: - void nxmDescriptionAvailable(int modID, QVariant userData, QVariant resultData); - void nxmFilesAvailable(int modID, QVariant userData, QVariant resultData); - void nxmFileInfoAvailable(int modID, int fileID, QVariant userData, QVariant resultData); - void nxmDownloadURLsAvailable(int modID, int fileID, QVariant userData, QVariant resultData); - void nxmEndorsementToggled(int modID, QVariant userData, QVariant resultData); - void nxmRequestFailed(int modID, QVariant userData, const QString &errorMessage); + void bla(QString userData); public slots: @@ -127,6 +123,7 @@ public slots: private: NexusInterface *m_Interface; + QString m_Url; std::set m_RequestIDs; }; diff --git a/src/organizer.pro b/src/organizer.pro index cfdf990b..c4a829cf 100644 --- a/src/organizer.pro +++ b/src/organizer.pro @@ -195,6 +195,7 @@ CONFIG(debug, debug|release) { LIBS += -L$$OUT_PWD/../shared/release -L$$OUT_PWD/../bsatk/release LIBS += -L$$OUT_PWD/../uibase/release QMAKE_CXXFLAGS += /Zi + QMAKE_CXXFLAGS -= -O2 QMAKE_LFLAGS += /DEBUG } diff --git a/src/resources.qrc b/src/resources.qrc index 855a23fc..df17ea79 100644 --- a/src/resources.qrc +++ b/src/resources.qrc @@ -50,5 +50,6 @@ resources/conflict-overwritten.png resources/conflict-redundant.png resources/accessories-text-editor.png + resources/x-office-calendar.png diff --git a/src/resources/x-office-calendar.png b/src/resources/x-office-calendar.png new file mode 100644 index 00000000..f6978d7d Binary files /dev/null and b/src/resources/x-office-calendar.png differ diff --git a/src/version.rc b/src/version.rc index 3b2c4804..9921149a 100644 --- a/src/version.rc +++ b/src/version.rc @@ -1,7 +1,7 @@ #include "Winver.h" -#define VER_FILEVERSION 0,13,0,0 -#define VER_FILEVERSION_STR 0,13,0,0 +#define VER_FILEVERSION 0,99,0,0 +#define VER_FILEVERSION_STR 0,99,0,0 VS_VERSION_INFO VERSIONINFO FILEVERSION VER_FILEVERSION -- cgit v1.3.1