From 30c177cb371e92fe5e4cfc600cf27586402cf0a8 Mon Sep 17 00:00:00 2001 From: Silarn Date: Mon, 16 Apr 2018 12:47:17 -0500 Subject: Support for multi-game downloads --- src/modinfodialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/modinfodialog.cpp') diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 6a53d915..31ffe82d 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -714,7 +714,7 @@ void ModInfoDialog::linkClicked(const QUrl &url) { //Ideally we'd ask the mod for the game and the web service then pass the game //and URL to the web service - if (NexusInterface::instance()->isURLGameRelated(url)) { + if (NexusInterface::instance(m_PluginContainer)->isURLGameRelated(url)) { this->close(); emit nexusLinkActivated(url.toString()); } else { @@ -860,7 +860,7 @@ void ModInfoDialog::activateNexusTab() QLineEdit *modIDEdit = findChild("modIDEdit"); int modID = modIDEdit->text().toInt(); if (modID != 0) { - QString nexusLink = NexusInterface::instance()->getModURL(modID); + QString nexusLink = NexusInterface::instance(m_PluginContainer)->getModURL(modID, m_ModInfo->getGameName()); QLabel *visitNexusLabel = findChild("visitNexusLabel"); visitNexusLabel->setText(tr("Visit on Nexus").arg(nexusLink)); visitNexusLabel->setToolTip(nexusLink); -- cgit v1.3.1 From 7688175c68c2f1ce85951173c0aa3e186587aa1f Mon Sep 17 00:00:00 2001 From: Silarn Date: Tue, 17 Apr 2018 02:47:07 -0500 Subject: Add source game setter in mod info dialog --- src/modinfo.h | 23 ++++++++++++++-------- src/modinfobackup.h | 1 + src/modinfodialog.cpp | 25 ++++++++++++++++++++++++ src/modinfodialog.h | 1 + src/modinfodialog.ui | 52 +++++++++++++++++++++++++++++++++++++++----------- src/modinfoforeign.h | 1 + src/modinfooverwrite.h | 1 + src/modinforegular.cpp | 6 ++++++ src/modinforegular.h | 7 +++++++ 9 files changed, 98 insertions(+), 19 deletions(-) (limited to 'src/modinfodialog.cpp') diff --git a/src/modinfo.h b/src/modinfo.h index f321f068..07dccafd 100644 --- a/src/modinfo.h +++ b/src/modinfo.h @@ -265,7 +265,14 @@ public: * @brief change the notes (manually set information) for this mod * @param notes new notes */ - virtual void setNotes(const QString ¬es) = 0; + virtual void setNotes(const QString ¬es) = 0; + + /** + * @brief set/change the source game of this mod + * + * @param gameName the source game shortName + */ + virtual void setGameName(QString gameName) = 0; /** * @brief set/change the nexus mod id of this mod @@ -411,13 +418,13 @@ public: * * @return the nexus mod id. may be 0 if the mod id isn't known or doesn't exist **/ - virtual int getNexusID() const = 0; - - /** - * @brief getter for the source game repository - * - * @return the source game repository. should default to the active game. - **/ + virtual int getNexusID() const = 0; + + /** + * @brief getter for the source game repository + * + * @return the source game repository. should default to the active game. + **/ virtual QString getGameName() const = 0; /** diff --git a/src/modinfobackup.h b/src/modinfobackup.h index aa59dda4..0a59691b 100644 --- a/src/modinfobackup.h +++ b/src/modinfobackup.h @@ -14,6 +14,7 @@ public: virtual bool updateIgnored() const { return false; } virtual bool downgradeAvailable() const { return false; } virtual bool updateNXMInfo() { return false; } + virtual void setGameName(QString) {} virtual void setNexusID(int) {} virtual void endorse(bool) {} virtual int getFixedPriority() const { return -1; } diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 31ffe82d..e2da6a2c 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -92,6 +92,21 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ui->modIDEdit->setValidator(new QIntValidator(modIDEdit)); ui->modIDEdit->setText(QString("%1").arg(modInfo->getNexusID())); + ui->sourceGameEdit->addItem(organizerCore->managedGame()->gameName(), organizerCore->managedGame()->gameShortName()); + if (organizerCore->managedGame()->validShortNames().size() == 0) { + ui->sourceGameEdit->setDisabled(true); + } else { + for (auto game : pluginContainer->plugins()) { + for (QString gameName : organizerCore->managedGame()->validShortNames()) { + if (game->gameShortName().compare(gameName, Qt::CaseInsensitive) == 0) { + ui->sourceGameEdit->addItem(game->gameName(), game->gameShortName()); + break; + } + } + } + } + ui->sourceGameEdit->setCurrentIndex(ui->sourceGameEdit->findData(m_ModInfo->getGameName())); + ui->notesEdit->setText(modInfo->notes()); ui->descriptionView->setPage(new DescriptionPage); @@ -901,6 +916,16 @@ void ModInfoDialog::on_modIDEdit_editingFinished() } } +void ModInfoDialog::on_sourceGameEdit_currentIndexChanged(int) +{ + for (auto game : m_PluginContainer->plugins()) { + if (game->gameName() == ui->sourceGameEdit->currentText()) { + m_ModInfo->setGameName(game->gameShortName()); + return; + } + } +} + void ModInfoDialog::on_versionEdit_editingFinished() { VersionInfo version(ui->versionEdit->text()); diff --git a/src/modinfodialog.h b/src/modinfodialog.h index 9eb17be5..52db5654 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -179,6 +179,7 @@ private slots: void on_saveTXTButton_clicked(); void on_visitNexusLabel_linkActivated(const QString &link); void on_modIDEdit_editingFinished(); + void on_sourceGameEdit_currentIndexChanged(int); void on_versionEdit_editingFinished(); void on_iniFileView_textChanged(); void on_textFileView_textChanged(); diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 05415445..9e9ba77b 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -110,19 +110,19 @@ - + false - + - Ini Tweaks *This feature is non-functional* + Ini Tweaks *This feature is non-functional* - + false - + 228 @@ -238,8 +238,8 @@ 0 0 - 98 - 28 + 676 + 126 @@ -490,7 +490,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e - Qt::CustomContextMenu + Qt::CustomContextMenu Qt::ElideLeft @@ -502,7 +502,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e true - 2 + 2 365 @@ -613,6 +613,36 @@ p, li { white-space: pre-wrap; } + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + Source Game + + + + + + + Mod ID for this mod on Nexus. + + + @@ -819,9 +849,9 @@ p, li { white-space: pre-wrap; } - QQuickWidget + QWebEngineView QWidget -
QtQuickWidgets/QQuickWidget
+
QtWebEngineWidgets/QWebEngineView
diff --git a/src/modinfoforeign.h b/src/modinfoforeign.h index 23500df8..0d7b3847 100644 --- a/src/modinfoforeign.h +++ b/src/modinfoforeign.h @@ -19,6 +19,7 @@ public: virtual void setCategory(int, bool) {} virtual bool setName(const QString&) { return false; } virtual void setNotes(const QString&) {} + virtual void setGameName(QString) {} virtual void setNexusID(int) {} virtual void setNewestVersion(const MOBase::VersionInfo&) {} virtual void ignoreUpdate(bool) {} diff --git a/src/modinfooverwrite.h b/src/modinfooverwrite.h index 360c7335..5681dc6f 100644 --- a/src/modinfooverwrite.h +++ b/src/modinfooverwrite.h @@ -21,6 +21,7 @@ public: virtual void setCategory(int, bool) {} virtual bool setName(const QString&) { return false; } virtual void setNotes(const QString&) {} + virtual void setGameName(QString) {} virtual void setNexusID(int) {} virtual void setNewestVersion(const MOBase::VersionInfo&) {} virtual void ignoreUpdate(bool) {} diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index 69718705..a514e1bf 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -319,6 +319,12 @@ void ModInfoRegular::setNotes(const QString ¬es) m_MetaInfoChanged = true; } +void ModInfoRegular::setGameName(QString gameName) +{ + m_GameName = gameName; + m_MetaInfoChanged = true; +} + void ModInfoRegular::setNexusID(int modID) { m_NexusID = modID; diff --git a/src/modinforegular.h b/src/modinforegular.h index 7a6f4827..cf13872c 100644 --- a/src/modinforegular.h +++ b/src/modinforegular.h @@ -93,6 +93,13 @@ public: */ void setNotes(const QString ¬es); + /** + * @brief set/change the source game of this mod + * + * @param gameName the source game shortName + */ + void setGameName(QString gameName); + /** * @brief set/change the nexus mod id of this mod * -- cgit v1.3.1 From a2d7ce67aa236fe52d6e860a27950dc7e3a34bd8 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Mon, 16 Apr 2018 20:40:14 +0200 Subject: Merged the new open in explorer button with Silarn's code. --- src/modinfodialog.cpp | 8 ++++++-- src/modinfodialog.h | 1 + src/modinfodialog.ui | 36 +++++++++++++++++++++++++++++++++--- 3 files changed, 40 insertions(+), 5 deletions(-) (limited to 'src/modinfodialog.cpp') diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index e2da6a2c..705f0019 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -721,7 +721,6 @@ void ModInfoDialog::on_deactivateESP_clicked() void ModInfoDialog::on_visitNexusLabel_linkActivated(const QString &link) { - this->close(); emit nexusLinkActivated(link); } @@ -730,7 +729,7 @@ void ModInfoDialog::linkClicked(const QUrl &url) //Ideally we'd ask the mod for the game and the web service then pass the game //and URL to the web service if (NexusInterface::instance(m_PluginContainer)->isURLGameRelated(url)) { - this->close(); + emit nexusLinkActivated(url.toString()); } else { ::ShellExecuteW(nullptr, L"open", ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); @@ -958,6 +957,11 @@ bool ModInfoDialog::recursiveDelete(const QModelIndex &index) } +void ModInfoDialog::on_openInExplorerButton_clicked() +{ + ::ShellExecuteW(nullptr, L"explore", ToWString(m_ModInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); +} + void ModInfoDialog::deleteFile(const QModelIndex &index) { diff --git a/src/modinfodialog.h b/src/modinfodialog.h index 52db5654..b5cc12a8 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -172,6 +172,7 @@ private slots: void hideTriggered(); void unhideTriggered(); + void on_openInExplorerButton_clicked(); void on_closeButton_clicked(); void on_saveButton_clicked(); void on_activateESP_clicked(); diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 20eb7c30..4352ba4e 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -20,7 +20,7 @@ QTabWidget::Rounded
- 0 + 8 true @@ -723,8 +723,8 @@ p, li { white-space: pre-wrap; }
- - + + about:blank @@ -779,6 +779,36 @@ p, li { white-space: pre-wrap; } Filetree + + + + + + + 0 + 0 + + + + Open Mod in Explorer + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + -- cgit v1.3.1 From f2762035171f60fdd0b16052c07f67a0f79d60a8 Mon Sep 17 00:00:00 2001 From: Al12rs Date: Tue, 17 Apr 2018 21:16:44 +0200 Subject: Changed mod Information dialog "Next" and "Previous" buttons to remember the currently viewed tab. --- src/mainwindow.cpp | 16 ++++++++-------- src/mainwindow.h | 4 ++-- src/modinfodialog.cpp | 14 ++++++++++---- src/modinfodialog.h | 4 ++-- 4 files changed, 22 insertions(+), 16 deletions(-) (limited to 'src/modinfodialog.cpp') diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 2d6ccc94..00c7895e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -2464,8 +2464,8 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, connect(&dialog, SIGNAL(nexusLinkActivated(QString)), this, SLOT(nexusLinkActivated(QString))); connect(&dialog, SIGNAL(downloadRequest(QString)), &m_OrganizerCore, SLOT(downloadRequestedNXM(QString))); connect(&dialog, SIGNAL(modOpen(QString, int)), this, SLOT(displayModInformation(QString, int)), Qt::QueuedConnection); - connect(&dialog, SIGNAL(modOpenNext()), this, SLOT(modOpenNext()), Qt::QueuedConnection); - connect(&dialog, SIGNAL(modOpenPrev()), this, SLOT(modOpenPrev()), Qt::QueuedConnection); + connect(&dialog, SIGNAL(modOpenNext(int)), this, SLOT(modOpenNext(int)), Qt::QueuedConnection); + connect(&dialog, SIGNAL(modOpenPrev(int)), this, SLOT(modOpenPrev(int)), Qt::QueuedConnection); connect(&dialog, SIGNAL(originModified(int)), this, SLOT(originModified(int))); connect(&dialog, SIGNAL(endorseMod(ModInfo::Ptr)), this, SLOT(endorseMod(ModInfo::Ptr))); @@ -2526,7 +2526,7 @@ void MainWindow::setWindowEnabled(bool enabled) } -void MainWindow::modOpenNext() +void MainWindow::modOpenNext(int tab) { QModelIndex index = m_ModListSortProxy->mapFromSource(m_OrganizerCore.modList()->index(m_ContextRow, 0)); index = m_ModListSortProxy->index((index.row() + 1) % m_ModListSortProxy->rowCount(), 0); @@ -2537,13 +2537,13 @@ void MainWindow::modOpenNext() if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end())) { // skip overwrite and backups - modOpenNext(); + modOpenNext(tab); } else { - displayModInformation(m_ContextRow); + displayModInformation(m_ContextRow,tab); } } -void MainWindow::modOpenPrev() +void MainWindow::modOpenPrev(int tab) { QModelIndex index = m_ModListSortProxy->mapFromSource(m_OrganizerCore.modList()->index(m_ContextRow, 0)); int row = index.row() - 1; @@ -2557,9 +2557,9 @@ void MainWindow::modOpenPrev() if ((std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end()) || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_BACKUP) != flags.end())) { // skip overwrite and backups - modOpenPrev(); + modOpenPrev(tab); } else { - displayModInformation(m_ContextRow); + displayModInformation(m_ContextRow,tab); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 3d093131..b06da353 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -474,8 +474,8 @@ private slots: void deselectFilters(); void displayModInformation(const QString &modName, int tab); - void modOpenNext(); - void modOpenPrev(); + void modOpenNext(int tab=-1); + void modOpenPrev(int tab=-1); void modRenamed(const QString &oldName, const QString &newName); void modRemoved(const QString &fileName); diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 705f0019..c25041f2 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -1448,14 +1448,20 @@ void ModInfoDialog::on_endorseBtn_clicked() void ModInfoDialog::on_nextButton_clicked() { - emit modOpenNext(); - this->accept(); + int currentTab = ui->tabWidget->currentIndex(); + int tab = m_RealTabPos[currentTab]; + + emit modOpenNext(tab); + this->accept(); } void ModInfoDialog::on_prevButton_clicked() { - emit modOpenPrev(); - this->accept(); + int currentTab = ui->tabWidget->currentIndex(); + int tab = m_RealTabPos[currentTab]; + + emit modOpenPrev(tab); + this->accept(); } diff --git a/src/modinfodialog.h b/src/modinfodialog.h index b5cc12a8..ddd72f4d 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -112,8 +112,8 @@ signals: void nexusLinkActivated(const QString &link); void downloadRequest(const QString &link); void modOpen(const QString &modName, int tab); - void modOpenNext(); - void modOpenPrev(); + void modOpenNext(int tab=-1); + void modOpenPrev(int tab=-1); void originModified(int originID); void endorseMod(ModInfo::Ptr nexusID); -- cgit v1.3.1 From 189445191d40d5b53e05d44cb128d476e817e34d Mon Sep 17 00:00:00 2001 From: Al12rs Date: Wed, 18 Apr 2018 00:08:05 +0200 Subject: Added Delete shourcut to both modinfodialog and Overwriteinfodilaog. Added confirm messages since delete can't be undone. --- src/modinfodialog.cpp | 33 +++++++++++++++++++++++++++++++++ src/modinfodialog.h | 2 ++ src/overwriteinfodialog.cpp | 34 ++++++++++++++++++++++++++++++++++ src/overwriteinfodialog.h | 2 ++ 4 files changed, 71 insertions(+) (limited to 'src/modinfodialog.cpp') diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index c25041f2..710b9696 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -46,6 +46,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include @@ -118,6 +119,8 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo //TODO: No easy way to delegate links //ui->descriptionView->page()->acceptNavigationRequest(QWebEnginePage::DelegateAllLinks); + new QShortcut(QKeySequence::Delete, this, SLOT(delete_activated())); + if (directory->originExists(ToWString(modInfo->name()))) { m_Origin = &directory->getOriginByName(ToWString(modInfo->name())); if (m_Origin->isDisabled()) { @@ -973,6 +976,36 @@ void ModInfoDialog::deleteFile(const QModelIndex &index) } } +void ModInfoDialog::delete_activated() +{ + if (ui->fileTree->hasFocus()) { + QItemSelectionModel *selection = ui->fileTree->selectionModel(); + + if (selection->hasSelection() && selection->selectedRows().count() >= 1) { + + if (selection->selectedRows().count() == 0) { + return; + } + else if (selection->selectedRows().count() == 1) { + QString fileName = m_FileSystemModel->fileName(selection->selectedRows().at(0)); + if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete \"%1\"?").arg(fileName), + QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { + return; + } + } + else { + if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete the selected files?"), + QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { + return; + } + } + + foreach(QModelIndex index, selection->selectedRows()) { + deleteFile(index); + } + } + } +} void ModInfoDialog::deleteTriggered() { diff --git a/src/modinfodialog.h b/src/modinfodialog.h index ddd72f4d..4709a1d2 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -165,6 +165,8 @@ private slots: void thumbnailClicked(const QString &fileName); void linkClicked(const QUrl &url); + void delete_activated(); + void deleteTriggered(); void renameTriggered(); void openTriggered(); diff --git a/src/overwriteinfodialog.cpp b/src/overwriteinfodialog.cpp index e956b025..3bb67354 100644 --- a/src/overwriteinfodialog.cpp +++ b/src/overwriteinfodialog.cpp @@ -23,6 +23,7 @@ along with Mod Organizer. If not, see . #include "utility.h" #include #include +#include #include @@ -89,6 +90,9 @@ OverwriteInfoDialog::OverwriteInfoDialog(ModInfo::Ptr modInfo, QWidget *parent) m_RenameAction = new QAction(tr("&Rename"), ui->filesView); m_OpenAction = new QAction(tr("&Open"), ui->filesView); m_NewFolderAction = new QAction(tr("&New Folder"), ui->filesView); + + new QShortcut(QKeySequence::Delete, this, SLOT(delete_activated())); + QObject::connect(m_DeleteAction, SIGNAL(triggered()), this, SLOT(deleteTriggered())); QObject::connect(m_RenameAction, SIGNAL(triggered()), this, SLOT(renameTriggered())); QObject::connect(m_OpenAction, SIGNAL(triggered()), this, SLOT(openTriggered())); @@ -145,6 +149,36 @@ void OverwriteInfoDialog::deleteFile(const QModelIndex &index) } } +void OverwriteInfoDialog::delete_activated() +{ + if (ui->filesView->hasFocus()) { + QItemSelectionModel *selection = ui->filesView->selectionModel(); + + if (selection->hasSelection() && selection->selectedRows().count() >= 1) { + + if (selection->selectedRows().count() == 0) { + return; + } + else if (selection->selectedRows().count() == 1) { + QString fileName = m_FileSystemModel->fileName(selection->selectedRows().at(0)); + if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete \"%1\"?").arg(fileName), + QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { + return; + } + } + else { + if (QMessageBox::question(this, tr("Confirm"), tr("Are sure you want to delete the selected files?"), + QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) { + return; + } + } + + foreach(QModelIndex index, selection->selectedRows()) { + deleteFile(index); + } + } + } +} void OverwriteInfoDialog::deleteTriggered() { diff --git a/src/overwriteinfodialog.h b/src/overwriteinfodialog.h index eb182292..7d44c9e8 100644 --- a/src/overwriteinfodialog.h +++ b/src/overwriteinfodialog.h @@ -49,6 +49,8 @@ private: private slots: + void delete_activated(); + void deleteTriggered(); void renameTriggered(); void openTriggered(); -- cgit v1.3.1 From 08b56ee783131537d3f87e60819e88316ea1e062 Mon Sep 17 00:00:00 2001 From: Silarn Date: Wed, 18 Apr 2018 03:41:53 -0500 Subject: Improve and fix handling of external links --- src/CMakeLists.txt | 2 ++ src/aboutdialog.cpp | 5 +++++ src/aboutdialog.h | 5 +++++ src/aboutdialog.ui | 2 +- src/mainwindow.cpp | 31 ++++++++++++++----------------- src/mainwindow.h | 1 - src/modidlineedit.cpp | 19 +++++++++++++++++++ src/modidlineedit.h | 22 ++++++++++++++++++++++ src/modinfodialog.cpp | 12 ++++++++++-- src/modinfodialog.h | 3 ++- src/modinfodialog.ui | 15 ++++++++++----- src/modinforegular.cpp | 2 +- 12 files changed, 91 insertions(+), 28 deletions(-) create mode 100644 src/modidlineedit.cpp create mode 100644 src/modidlineedit.h (limited to 'src/modinfodialog.cpp') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fef640b3..066d08d6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -30,6 +30,7 @@ SET(organizer_SRCS motddialog.cpp modlistsortproxy.cpp modlist.cpp + modidlineedit.cpp modinfodialog.cpp modinfo.cpp modinfobackup.cpp @@ -120,6 +121,7 @@ SET(organizer_HDRS motddialog.h modlistsortproxy.h modlist.h + modidlineedit.h modinfodialog.h modinfo.h modinfobackup.h diff --git a/src/aboutdialog.cpp b/src/aboutdialog.cpp index a350036f..9d68fe2b 100644 --- a/src/aboutdialog.cpp +++ b/src/aboutdialog.cpp @@ -114,3 +114,8 @@ void AboutDialog::on_creditsList_currentItemChanged(QListWidgetItem *current, QL ui->licenseText->setText(tr("No license")); } } + +void AboutDialog::on_copyrightText_linkActivated(const QString &link) +{ + emit linkClicked(link); +} \ No newline at end of file diff --git a/src/aboutdialog.h b/src/aboutdialog.h index 3ae3237b..285d0066 100644 --- a/src/aboutdialog.h +++ b/src/aboutdialog.h @@ -40,6 +40,10 @@ public: explicit AboutDialog(const QString &version, QWidget *parent = 0); ~AboutDialog(); +signals: + + void linkClicked(QString link); + private: enum Licenses { @@ -70,6 +74,7 @@ private: private slots: void on_creditsList_currentItemChanged(QListWidgetItem *current, QListWidgetItem *previous); + void on_copyrightText_linkActivated(const QString &link); private: diff --git a/src/aboutdialog.ui b/src/aboutdialog.ui index 69e52708..fc2f3290 100644 --- a/src/aboutdialog.ui +++ b/src/aboutdialog.ui @@ -125,7 +125,7 @@ - + <html><head/><body><p>This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</p><p>See the GNU General Public License for more details.</p><p>Source code can be found at <a href="https://github.com/Modorganizer2/modorganizer"><span style=" text-decoration: underline; color:#007af4;">GitHub</span></a>.</p></body></html> diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 00c7895e..6b176868 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -98,6 +98,7 @@ along with Mod Organizer. If not, see . #include #include #include +#include #include #include #include @@ -319,6 +320,11 @@ MainWindow::MainWindow(QSettings &initSettings ui->groupCombo->installEventFilter(noWheel); ui->profileBox->installEventFilter(noWheel); + if (organizerCore.managedGame()->sortMechanism() == MOBase::IPluginGame::SortMechanism::NONE) { + ui->bossButton->setDisabled(true); + ui->bossButton->setToolTip(tr("There is no supported sort mechanism for this game. You will probably have to use a third-party tool.")); + } + connect(ui->savegameList, SIGNAL(itemEntered(QListWidgetItem*)), this, SLOT(saveSelectionChanged(QListWidgetItem*))); connect(ui->modList, SIGNAL(dropModeUpdate(bool)), m_OrganizerCore.modList(), SLOT(dropModeUpdate(bool))); @@ -667,6 +673,7 @@ size_t MainWindow::checkForProblems() void MainWindow::about() { AboutDialog dialog(m_OrganizerCore.getVersion().displayString(), this); + connect(&dialog, SIGNAL(linkClicked(QString)), this, SLOT(linkClicked(QString))); dialog.exec(); } @@ -1008,8 +1015,7 @@ void MainWindow::modPagePluginInvoke() m_IntegratedBrowser.setWindowTitle(plugin->displayName()); m_IntegratedBrowser.openUrl(plugin->pageURL()); } else { - ::ShellExecuteW(nullptr, L"open", ToWString(plugin->pageURL().toString()).c_str(), - nullptr, nullptr, SW_SHOWNORMAL); + QDesktopServices::openUrl(QUrl(plugin->pageURL())); } } } @@ -1894,12 +1900,12 @@ void MainWindow::helpTriggered() void MainWindow::wikiTriggered() { - ::ShellExecuteW(nullptr, L"open", L"http://wiki.step-project.com/Guide:Mod_Organizer", nullptr, nullptr, SW_SHOWNORMAL); + QDesktopServices::openUrl(QUrl("http://wiki.step-project.com/Guide:Mod_Organizer")); } void MainWindow::issueTriggered() { - ::ShellExecuteW(nullptr, L"open", L"http://github.com/Modorganizer2/modorganizer/issues", nullptr, nullptr, SW_SHOWNORMAL); + QDesktopServices::openUrl(QUrl("http://github.com/Modorganizer2/modorganizer/issues")); } void MainWindow::tutorialTriggered() @@ -2461,7 +2467,7 @@ void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int index, } else { modInfo->saveMeta(); ModInfoDialog dialog(modInfo, m_OrganizerCore.directoryStructure(), modInfo->hasFlag(ModInfo::FLAG_FOREIGN), &m_OrganizerCore, &m_PluginContainer,this); - connect(&dialog, SIGNAL(nexusLinkActivated(QString)), this, SLOT(nexusLinkActivated(QString))); + connect(&dialog, SIGNAL(linkActivated(QString)), this, SLOT(linkClicked(QString))); connect(&dialog, SIGNAL(downloadRequest(QString)), &m_OrganizerCore, SLOT(downloadRequestedNXM(QString))); connect(&dialog, SIGNAL(modOpen(QString, int)), this, SLOT(displayModInformation(QString, int)), Qt::QueuedConnection); connect(&dialog, SIGNAL(modOpenNext(int)), this, SLOT(modOpenNext(int)), Qt::QueuedConnection); @@ -2599,7 +2605,7 @@ void MainWindow::visitOnNexus_clicked() int modID = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole).toInt(); QString gameName = m_OrganizerCore.modList()->data(m_OrganizerCore.modList()->index(m_ContextRow, 0), Qt::UserRole + 4).toString(); if (modID > 0) { - nexusLinkActivated(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); + linkClicked(NexusInterface::instance(&m_PluginContainer)->getModURL(modID, gameName)); } else { MessageDialog::showMessage(tr("Nexus ID for this Mod is unknown"), this); } @@ -3746,22 +3752,13 @@ void MainWindow::on_actionSettings_triggered() void MainWindow::on_actionNexus_triggered() { - ::ShellExecuteW(nullptr, L"open", - NexusInterface::instance(&m_PluginContainer)->getGameURL(m_OrganizerCore.managedGame()->gameShortName()).toStdWString().c_str(), - nullptr, nullptr, SW_SHOWNORMAL); -} - - -void MainWindow::nexusLinkActivated(const QString &link) -{ - ::ShellExecuteW(nullptr, L"open", ToWString(link).c_str(), nullptr, nullptr, SW_SHOWNORMAL); - ui->tabWidget->setCurrentIndex(4); + QDesktopServices::openUrl(QUrl(NexusInterface::instance(&m_PluginContainer)->getGameURL(m_OrganizerCore.managedGame()->gameShortName()))); } void MainWindow::linkClicked(const QString &url) { - ::ShellExecuteW(nullptr, L"open", ToWString(url).c_str(), nullptr, nullptr, SW_SHOWNORMAL); + QDesktopServices::openUrl(QUrl(url)); } diff --git a/src/mainwindow.h b/src/mainwindow.h index b06da353..7f38d766 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -443,7 +443,6 @@ private slots: // nexus related void checkModsForUpdates(); - void nexusLinkActivated(const QString &link); void loginFailed(const QString &message); diff --git a/src/modidlineedit.cpp b/src/modidlineedit.cpp new file mode 100644 index 00000000..7d1f0c38 --- /dev/null +++ b/src/modidlineedit.cpp @@ -0,0 +1,19 @@ +#include "modidlineedit.h" +#include + +#include +#include + +ModIDLineEdit::ModIDLineEdit(QWidget *parent) : QLineEdit(parent) {} +ModIDLineEdit::ModIDLineEdit(const QString &text, QWidget *parent) : QLineEdit(text, parent) {} + +bool ModIDLineEdit::event(QEvent *event) +{ + if (event->type() == QEvent::WhatsThisClicked) + { + QWhatsThisClickedEvent *wtcEvent = static_cast(event); + emit linkClicked(wtcEvent->href().trimmed()); + } + + return QLineEdit::event(event); +} \ No newline at end of file diff --git a/src/modidlineedit.h b/src/modidlineedit.h new file mode 100644 index 00000000..2a3db36c --- /dev/null +++ b/src/modidlineedit.h @@ -0,0 +1,22 @@ +#ifndef MODIDLINEEDIT_H +#define MODIDLINEEDIT_H + +#include + +class ModIDLineEdit : public QLineEdit +{ + Q_OBJECT + +public: + explicit ModIDLineEdit(QWidget *parent = 0); + explicit ModIDLineEdit(const QString &text, QWidget *parent = 0); + +public: + virtual bool event(QEvent* event) override; + +signals: + void linkClicked(QString); + +}; + +#endif //MODIDLINEEDIT_H \ No newline at end of file diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index 710b9696..a137873e 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -22,6 +22,7 @@ along with Mod Organizer. If not, see . #include "descriptionpage.h" #include "mainwindow.h" +#include "modidlineedit.h" #include "iplugingame.h" #include "nexusinterface.h" #include "report.h" @@ -93,6 +94,8 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo ui->modIDEdit->setValidator(new QIntValidator(modIDEdit)); ui->modIDEdit->setText(QString("%1").arg(modInfo->getNexusID())); + connect(ui->modIDEdit, SIGNAL(linkClicked(QString)), this, SLOT(linkClicked(QString))); + ui->sourceGameEdit->addItem(organizerCore->managedGame()->gameName(), organizerCore->managedGame()->gameShortName()); if (organizerCore->managedGame()->validShortNames().size() == 0) { ui->sourceGameEdit->setDisabled(true); @@ -724,7 +727,7 @@ void ModInfoDialog::on_deactivateESP_clicked() void ModInfoDialog::on_visitNexusLabel_linkActivated(const QString &link) { - emit nexusLinkActivated(link); + emit linkActivated(link); } void ModInfoDialog::linkClicked(const QUrl &url) @@ -733,12 +736,17 @@ void ModInfoDialog::linkClicked(const QUrl &url) //and URL to the web service if (NexusInterface::instance(m_PluginContainer)->isURLGameRelated(url)) { - emit nexusLinkActivated(url.toString()); + emit linkActivated(url.toString()); } else { ::ShellExecuteW(nullptr, L"open", ToWString(url.toString()).c_str(), nullptr, nullptr, SW_SHOWNORMAL); } } +void ModInfoDialog::linkClicked(QString url) +{ + emit linkActivated(url); +} + void ModInfoDialog::refreshNexusData(int modID) { diff --git a/src/modinfodialog.h b/src/modinfodialog.h index 4709a1d2..f3bc48b4 100644 --- a/src/modinfodialog.h +++ b/src/modinfodialog.h @@ -109,7 +109,7 @@ public: signals: void thumbnailClickedSignal(const QString &filename); - void nexusLinkActivated(const QString &link); + void linkActivated(const QString &link); void downloadRequest(const QString &link); void modOpen(const QString &modName, int tab); void modOpenNext(int tab=-1); @@ -164,6 +164,7 @@ private slots: void thumbnailClicked(const QString &fileName); void linkClicked(const QUrl &url); + void linkClicked(QString url); void delete_activated(); diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui index 4352ba4e..de9fe5ed 100644 --- a/src/modinfodialog.ui +++ b/src/modinfodialog.ui @@ -238,8 +238,8 @@ 0 0 - 746 - 126 + 98 + 28 @@ -600,7 +600,7 @@ Most mods do not have optional esps, so chances are good you are looking at an e - + Mod ID for this mod on Nexus. @@ -723,8 +723,8 @@ p, li { white-space: pre-wrap; } - - + + about:blank @@ -886,6 +886,11 @@ p, li { white-space: pre-wrap; } QWidget
QtWebEngineWidgets/QWebEngineView
+ + ModIDLineEdit + QLineEdit +
modidlineedit.h
+
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp index a514e1bf..045366ba 100644 --- a/src/modinforegular.cpp +++ b/src/modinforegular.cpp @@ -459,7 +459,7 @@ std::vector ModInfoRegular::getContents() const if (dir.exists(sePluginPath)) m_CachedContent.push_back(CONTENT_SKSE); } - if (dir.exists("textures")) + if (dir.exists("textures") || dir.exists("icons") || dir.exists("bookart")) m_CachedContent.push_back(CONTENT_TEXTURE); if (dir.exists("meshes")) m_CachedContent.push_back(CONTENT_MESH); -- cgit v1.3.1 From 41a479bddfbcd21640c0871423b819b154956cfa Mon Sep 17 00:00:00 2001 From: Silarn Date: Fri, 27 Apr 2018 20:00:51 -0500 Subject: Cache the current game as populating the dropdown triggers the save --- src/modinfodialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/modinfodialog.cpp') diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp index a137873e..12654755 100644 --- a/src/modinfodialog.cpp +++ b/src/modinfodialog.cpp @@ -96,6 +96,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo connect(ui->modIDEdit, SIGNAL(linkClicked(QString)), this, SLOT(linkClicked(QString))); + QString gameName = modInfo->getGameName(); ui->sourceGameEdit->addItem(organizerCore->managedGame()->gameName(), organizerCore->managedGame()->gameShortName()); if (organizerCore->managedGame()->validShortNames().size() == 0) { ui->sourceGameEdit->setDisabled(true); @@ -109,7 +110,7 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo } } } - ui->sourceGameEdit->setCurrentIndex(ui->sourceGameEdit->findData(m_ModInfo->getGameName())); + ui->sourceGameEdit->setCurrentIndex(ui->sourceGameEdit->findData(gameName)); ui->notesEdit->setText(modInfo->notes()); -- cgit v1.3.1