summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-06-23 02:24:34 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-07-02 10:10:18 -0400
commit8d1c121f648f2f6a8e0a5e2ad76cd245e318290d (patch)
tree44aa8aee2685174615f33f999ca102179939d3e4
parenta72573b385a941adf7d662b8df5c8e35309fdd45 (diff)
split nexus tab
added OrganizerCore::loggedInAction() to execute a function only when logged in, replaces a bunch of copy/pasted stuff in mainwindow moved common variables in ModInfoDialogTab moved DescriptionPage to modinfodialognexus.h, renamed to NexusTabWebpage, deleted now empty descriptionpage.h
-rw-r--r--src/CMakeLists.txt5
-rw-r--r--src/descriptionpage.h28
-rw-r--r--src/mainwindow.cpp167
-rw-r--r--src/modinfodialog.cpp233
-rw-r--r--src/modinfodialog.h29
-rw-r--r--src/modinfodialog.ui222
-rw-r--r--src/modinfodialogcategories.cpp43
-rw-r--r--src/modinfodialogcategories.h8
-rw-r--r--src/modinfodialogconflicts.cpp91
-rw-r--r--src/modinfodialogconflicts.h17
-rw-r--r--src/modinfodialogesps.cpp8
-rw-r--r--src/modinfodialogesps.h7
-rw-r--r--src/modinfodialogimages.cpp6
-rw-r--r--src/modinfodialogimages.h5
-rw-r--r--src/modinfodialognexus.cpp273
-rw-r--r--src/modinfodialognexus.h67
-rw-r--r--src/modinfodialogtab.cpp39
-rw-r--r--src/modinfodialogtab.h25
-rw-r--r--src/modinfodialogtextfiles.cpp26
-rw-r--r--src/modinfodialogtextfiles.h12
-rw-r--r--src/modinforegular.cpp20
-rw-r--r--src/modinforegular.h1
-rw-r--r--src/organizercore.cpp15
-rw-r--r--src/organizercore.h1
24 files changed, 690 insertions, 658 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 6ebfaddd..7dc39fd9 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -58,6 +58,7 @@ SET(organizer_SRCS
modinfodialogconflicts.cpp
modinfodialogesps.cpp
modinfodialogimages.cpp
+ modinfodialognexus.cpp
modinfodialogtab.cpp
modinfodialogtextfiles.cpp
modinfo.cpp
@@ -164,6 +165,7 @@ SET(organizer_HDRS
modinfodialogconflicts.h
modinfodialogesps.h
modinfodialogimages.h
+ modinfodialognexus.h
modinfodialogtab.h
modinfodialogtextfiles.h
modinfo.h
@@ -223,7 +225,6 @@ SET(organizer_HDRS
instancemanager.h
usvfsconnector.h
eventfilter.h
- descriptionpage.h
moshortcut.h
listdialog.h
lcdnumber.h
@@ -368,6 +369,7 @@ set(modinfo
modinfodialogconflicts
modinfodialogesps
modinfodialogimages
+ modinfodialognexus
modinfodialogtab
modinfodialogtextfiles
modinfoforeign
@@ -424,7 +426,6 @@ set(utilities
)
set(widgets
- descriptionpage
expanderwidget
genericicondelegate
filerenamer
diff --git a/src/descriptionpage.h b/src/descriptionpage.h
deleted file mode 100644
index f6158ee0..00000000
--- a/src/descriptionpage.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#include <QWebEnginePage>
-
-#ifndef DESCRIPTIONPAGE_H
-#define DESCRIPTIONPAGE_H
-
-class DescriptionPage : public QWebEnginePage
-{
- Q_OBJECT
-
-public:
- DescriptionPage(QObject* parent = 0) : QWebEnginePage(parent){}
-
- bool acceptNavigationRequest(const QUrl & url, QWebEnginePage::NavigationType type, bool isMainFrame)
- {
- if (type == QWebEnginePage::NavigationTypeLinkClicked)
- {
- emit linkClicked(url);
- return false;
- }
- return true;
- }
-
-signals:
- void linkClicked(const QUrl&);
-
-};
-
-#endif //DESCRIPTIONPAGE_H
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index da7c721d..8eb0838e 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -3073,66 +3073,34 @@ void MainWindow::backupMod_clicked()
void MainWindow::resumeDownload(int downloadIndex)
{
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
+ m_OrganizerCore.loggedInAction(this, [this, downloadIndex] {
m_OrganizerCore.downloadManager()->resumeDownload(downloadIndex);
- } else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- m_OrganizerCore.doAfterLogin([this, downloadIndex] () {
- this->resumeDownload(downloadIndex);
- });
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to resume a download"), this);
- }
- }
+ });
}
void MainWindow::endorseMod(ModInfo::Ptr mod)
{
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
+ m_OrganizerCore.loggedInAction(this, [this, mod] {
mod->endorse(true);
- } else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- m_OrganizerCore.doAfterLogin([&]() { this->endorseMod(mod); });
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
- }
- }
+ });
}
void MainWindow::endorse_clicked()
{
QItemSelectionModel *selection = ui->modList->selectionModel();
- if (selection->hasSelection() && selection->selectedRows().count() > 1) {
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
+
+ m_OrganizerCore.loggedInAction(this, [this] {
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ if (selection->hasSelection() && selection->selectedRows().count() > 1) {
MessageDialog::showMessage(tr("Endorsing multiple mods will take a while. Please wait..."), this);
- for (QModelIndex idx : selection->selectedRows()) {
- ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(true);
- }
}
- else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- MessageDialog::showMessage(tr("Endorsing multiple mods will take a while. Please wait..."), this);
- for (QModelIndex idx : selection->selectedRows()) {
- ModInfo::Ptr modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
- m_OrganizerCore.doAfterLogin([&]() { this->endorseMod(modInfo); });
- }
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
- return;
- }
+
+ for (QModelIndex idx : selection->selectedRows()) {
+ ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(true);
}
- }
- else {
- endorseMod(ModInfo::getByIndex(m_ContextRow));
- }
+ });
}
void MainWindow::dontendorse_clicked()
@@ -3151,114 +3119,53 @@ void MainWindow::dontendorse_clicked()
void MainWindow::unendorseMod(ModInfo::Ptr mod)
{
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
- ModInfo::getByIndex(m_ContextRow)->endorse(false);
- } else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- m_OrganizerCore.doAfterLogin([&]() { this->unendorseMod(mod); });
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
- }
- }
+ m_OrganizerCore.loggedInAction(this, [mod] {
+ mod->endorse(false);
+ });
}
void MainWindow::unendorse_clicked()
{
- QItemSelectionModel *selection = ui->modList->selectionModel();
- if (selection->hasSelection() && selection->selectedRows().count() > 1) {
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
+ m_OrganizerCore.loggedInAction(this, [this] {
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ if (selection->hasSelection() && selection->selectedRows().count() > 1) {
MessageDialog::showMessage(tr("Unendorsing multiple mods will take a while. Please wait..."), this);
- for (QModelIndex idx : selection->selectedRows()) {
- ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(false);
- }
- } else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- MessageDialog::showMessage(tr("Unendorsing multiple mods will take a while. Please wait..."), this);
- for (QModelIndex idx : selection->selectedRows()) {
- ModInfo::Ptr modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
- m_OrganizerCore.doAfterLogin([&]() { this->unendorseMod(modInfo); });
- }
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to endorse"), this);
- return;
- }
}
- }
- else {
- unendorseMod(ModInfo::getByIndex(m_ContextRow));
- }
+
+ for (QModelIndex idx : selection->selectedRows()) {
+ ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->endorse(false);
+ }
+ });
}
void MainWindow::trackMod(ModInfo::Ptr mod, bool doTrack)
{
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
- ModInfo::getByIndex(m_ContextRow)->track(doTrack);
- } else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- m_OrganizerCore.doAfterLogin([&]() { this->trackMod(mod, doTrack); });
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to track"), this);
- }
- }
+ m_OrganizerCore.loggedInAction(this, [mod, doTrack] {
+ mod->track(doTrack);
+ });
}
void MainWindow::track_clicked()
{
- QItemSelectionModel *selection = ui->modList->selectionModel();
- if (selection->hasSelection() && selection->selectedRows().count() > 1) {
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
- for (auto idx : selection->selectedRows()) {
- ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->track(true);
- }
- } else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- for (auto idx : selection->selectedRows()) {
- auto modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
- m_OrganizerCore.doAfterLogin([&]() { this->trackMod(modInfo, true); });
- }
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to track"), this);
- }
+ m_OrganizerCore.loggedInAction(this, [this] {
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ for (auto idx : selection->selectedRows()) {
+ ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->track(true);
}
- } else {
- trackMod(ModInfo::getByIndex(m_ContextRow), true);
- }
+ });
}
void MainWindow::untrack_clicked()
{
- QItemSelectionModel *selection = ui->modList->selectionModel();
- if (selection->hasSelection() && selection->selectedRows().count() > 1) {
- if (NexusInterface::instance(&m_PluginContainer)->getAccessManager()->validated()) {
- for (auto idx : selection->selectedRows()) {
- ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->track(false);
- }
- } else {
- QString apiKey;
- if (m_OrganizerCore.settings().getNexusApiKey(apiKey)) {
- for (auto idx : selection->selectedRows()) {
- auto modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
- m_OrganizerCore.doAfterLogin([&]() { this->trackMod(modInfo, false); });
- }
- NexusInterface::instance(&m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
- } else {
- MessageDialog::showMessage(tr("You need to be logged in with Nexus to track"), this);
- }
+ m_OrganizerCore.loggedInAction(this, [this] {
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ for (auto idx : selection->selectedRows()) {
+ ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt())->track(false);
}
- } else {
- trackMod(ModInfo::getByIndex(m_ContextRow), false);
- }
+ });
}
void MainWindow::validationFailed(const QString &error)
@@ -3316,13 +3223,11 @@ 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(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);
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)));
//Open the tab first if we want to use the standard indexes of the tabs.
if (tab != -1) {
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index 3263a511..30110d14 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -43,6 +43,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "modinfodialogesps.h"
#include "modinfodialogconflicts.h"
#include "modinfodialogcategories.h"
+#include "modinfodialognexus.h"
#include <QDir>
#include <QDirIterator>
@@ -145,7 +146,6 @@ FileRenamer::RenameResults unhideFile(FileRenamer& renamer, const QString &oldNa
ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directory, bool unmanaged, OrganizerCore *organizerCore, PluginContainer *pluginContainer, QWidget *parent)
: TutorableDialog("ModInfoDialog", parent), ui(new Ui::ModInfoDialog), m_ModInfo(modInfo),
- m_RequestStarted(false),
m_NewFolderAction(nullptr), m_OpenAction(nullptr), m_PreviewAction(nullptr),
m_RenameAction(nullptr), m_DeleteAction(nullptr), m_HideAction(nullptr),
m_UnhideAction(nullptr), m_Directory(directory), m_Origin(nullptr),
@@ -173,38 +173,9 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
m_RootPath = modInfo->absolutePath();
- QString metaFileName = m_RootPath.mid(0).append("/meta.ini");
- m_Settings = new QSettings(metaFileName, QSettings::IniFormat);
-
- QLineEdit *modIDEdit = findChild<QLineEdit*>("modIDEdit");
- ui->modIDEdit->setValidator(new QIntValidator(modIDEdit));
- ui->modIDEdit->setText(QString("%1").arg(modInfo->getNexusID()));
-
- 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);
- } else {
- for (auto game : pluginContainer->plugins<IPluginGame>()) {
- 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(gameName));
-
ui->commentsEdit->setText(modInfo->comments());
ui->notesEdit->setText(modInfo->notes());
- ui->descriptionView->setPage(new DescriptionPage());
-
- connect(m_ModInfo.data(), SIGNAL(modDetailsUpdated(bool)), this, SLOT(modDetailsUpdated(bool)));
- connect(ui->descriptionView->page(), SIGNAL(linkClicked(QUrl)), this, SLOT(linkClicked(QUrl)));
//TODO: No easy way to delegate links
//ui->descriptionView->page()->acceptNavigationRequest(QWebEnginePage::DelegateAllLinks);
@@ -246,14 +217,12 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
ui->tabWidget->setTabEnabled(TAB_IMAGES, true);
ui->tabWidget->setTabEnabled(TAB_ESPS, true);
ui->tabWidget->setTabEnabled(TAB_CONFLICTS, true);
+ ui->tabWidget->setTabEnabled(TAB_CATEGORIES, true);
+ ui->tabWidget->setTabEnabled(TAB_NEXUS, true);
initFiletree(modInfo);
}
- ui->endorseBtn->setVisible(Settings::instance().endorsementIntegration());
- ui->endorseBtn->setEnabled((m_ModInfo->endorsedState() == ModInfo::ENDORSED_FALSE) ||
- (m_ModInfo->endorsedState() == ModInfo::ENDORSED_NEVER));
-
// activate first enabled tab
for (int i = 0; i < ui->tabWidget->count(); ++i) {
if (ui->tabWidget->isTabEnabled(i)) {
@@ -262,10 +231,6 @@ ModInfoDialog::ModInfoDialog(ModInfo::Ptr modInfo, const DirectoryEntry *directo
}
}
- if (ui->tabWidget->currentIndex() == TAB_NEXUS) {
- activateNexusTab();
- }
-
for (auto& tab : m_tabs) {
tab->setMod(m_ModInfo, m_Origin);
}
@@ -281,27 +246,28 @@ ModInfoDialog::~ModInfoDialog()
else
m_ModInfo->setNotes(ui->notesEdit->toHtml());
- delete ui->descriptionView->page();
- delete ui->descriptionView;
delete ui;
- delete m_Settings;
}
-std::vector<std::unique_ptr<ModInfoDialogTab>> ModInfoDialog::createTabs()
+template <class... Ts>
+std::vector<std::unique_ptr<ModInfoDialogTab>> createTabsImpl(
+ OrganizerCore& oc, PluginContainer& plugin,
+ ModInfoDialog* self, Ui::ModInfoDialog* ui)
{
std::vector<std::unique_ptr<ModInfoDialogTab>> v;
-
- v.push_back(std::make_unique<TextFilesTab>(this, ui));
- v.push_back(std::make_unique<IniFilesTab>(this, ui));
- v.push_back(std::make_unique<ImagesTab>(this, ui));
- v.push_back(std::make_unique<ESPsTab>(this, ui));
- v.push_back(std::make_unique<ConflictsTab>(
- this, ui, *m_OrganizerCore, *m_PluginContainer));
- v.push_back(std::make_unique<CategoriesTab>(this, ui));
+ (v.push_back(std::make_unique<Ts>(oc, plugin, self, ui)), ...);
return v;
}
+std::vector<std::unique_ptr<ModInfoDialogTab>> ModInfoDialog::createTabs()
+{
+ return createTabsImpl<
+ TextFilesTab, IniFilesTab, ImagesTab, ESPsTab,
+ ConflictsTab, CategoriesTab, NexusTab>(
+ *m_OrganizerCore, *m_PluginContainer, this, ui);
+}
+
int ModInfoDialog::exec()
{
refreshLists();
@@ -434,7 +400,6 @@ void ModInfoDialog::refreshFiles()
}
}
-
void ModInfoDialog::on_closeButton_clicked()
{
for (auto& tab : m_tabs) {
@@ -446,19 +411,6 @@ void ModInfoDialog::on_closeButton_clicked()
close();
}
-
-
-QString ModInfoDialog::getModVersion() const
-{
- return m_Settings->value("version", "").toString();
-}
-
-
-const int ModInfoDialog::getModID() const
-{
- return m_Settings->value("modid", 0).toInt();
-}
-
void ModInfoDialog::openTab(int tab)
{
QTabWidget *tabWidget = findChild<QTabWidget*>("tabWidget");
@@ -467,40 +419,6 @@ void ModInfoDialog::openTab(int tab)
}
}
-void ModInfoDialog::on_visitNexusLabel_linkActivated(const QString &link)
-{
- emit linkActivated(link);
-}
-
-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)) {
- emit linkActivated(url.toString());
- } else {
- shell::OpenLink(url);
- }
-}
-
-void ModInfoDialog::linkClicked(QString url)
-{
- emit linkActivated(url);
-}
-
-
-void ModInfoDialog::refreshNexusData(int modID)
-{
- if ((!m_RequestStarted) && (modID > 0)) {
- m_RequestStarted = true;
-
- m_ModInfo->updateNXMInfo();
-
- MessageDialog::showMessage(tr("Info requested, please wait"), this);
- }
-}
-
-
QString ModInfoDialog::getFileCategory(int categoryID)
{
switch (categoryID) {
@@ -514,111 +432,8 @@ QString ModInfoDialog::getFileCategory(int categoryID)
}
}
-
-void ModInfoDialog::updateVersionColor()
-{
-// QPalette versionColor;
- if (m_ModInfo->getVersion() != m_ModInfo->getNewestVersion()) {
- ui->versionEdit->setStyleSheet("color: red");
-// versionColor.setColor(QPalette::Text, Qt::red);
- ui->versionEdit->setToolTip(tr("Current Version: %1").arg(m_ModInfo->getNewestVersion().canonicalString()));
- } else {
- ui->versionEdit->setStyleSheet("color: green");
-// versionColor.setColor(QPalette::Text, Qt::green);
- ui->versionEdit->setToolTip(tr("No update available"));
- }
-// ui->versionEdit->setPalette(versionColor);
-}
-
-
-void ModInfoDialog::modDetailsUpdated(bool success)
-{
- QString nexusDescription = m_ModInfo->getNexusDescription();
- QString descriptionAsHTML = "<html>"
- "<head><style class=\"nexus-description\">body {font-style: sans-serif; background: #707070; } a { color: #5EA2E5; }</style></head>"
- "<body>%1</body>"
- "</html>";
-
- if (!nexusDescription.isEmpty()) {
- descriptionAsHTML = descriptionAsHTML.arg(BBCode::convertToHTML(nexusDescription));
- } else {
- descriptionAsHTML = descriptionAsHTML.arg(tr("<div style=\"text-align: center;\"><h1>Uh oh!</h1><p>Sorry, there is no description available for this mod. :(</p></div>"));
- }
-
- ui->descriptionView->page()->setHtml(descriptionAsHTML);
-
- updateVersionColor();
-}
-
-
-void ModInfoDialog::activateNexusTab()
-{
- QLineEdit *modIDEdit = findChild<QLineEdit*>("modIDEdit");
- int modID = modIDEdit->text().toInt();
- if (modID > 0) {
- QString nexusLink = NexusInterface::instance(m_PluginContainer)->getModURL(modID, m_ModInfo->getGameName());
- QLabel *visitNexusLabel = findChild<QLabel*>("visitNexusLabel");
- visitNexusLabel->setText(tr("<a href=\"%1\">Visit on Nexus</a>").arg(nexusLink));
- visitNexusLabel->setToolTip(nexusLink);
- m_ModInfo->setURL(nexusLink);
-
- if (m_ModInfo->getNexusDescription().isEmpty() || QDateTime::currentDateTimeUtc() >= m_ModInfo->getLastNexusQuery().addDays(1)) {
- refreshNexusData(modID);
- } else {
- modDetailsUpdated(true);
- }
- } else
- modDetailsUpdated(true);
- QLineEdit *versionEdit = findChild<QLineEdit*>("versionEdit");
- QString currentVersion = m_Settings->value("version", "???").toString();
- versionEdit->setText(currentVersion);
- ui->customUrlLineEdit->setText(m_ModInfo->getURL());
-}
-
-
void ModInfoDialog::on_tabWidget_currentChanged(int index)
{
- if (index == TAB_NEXUS || m_RealTabPos[index] == TAB_NEXUS) {
- activateNexusTab();
- }
-}
-
-
-void ModInfoDialog::on_modIDEdit_editingFinished()
-{
- int oldID = m_Settings->value("modid", 0).toInt();
- int modID = ui->modIDEdit->text().toInt();
- if (oldID != modID){
- m_ModInfo->setNexusID(modID);
-
- ui->descriptionView->page()->setHtml("");
- if (modID != 0) {
- m_RequestStarted = false;
- refreshNexusData(modID);
- }
- }
-}
-
-void ModInfoDialog::on_sourceGameEdit_currentIndexChanged(int)
-{
- for (auto game : m_PluginContainer->plugins<IPluginGame>()) {
- if (game->gameName() == ui->sourceGameEdit->currentText()) {
- m_ModInfo->setGameName(game->gameShortName());
- return;
- }
- }
-}
-
-void ModInfoDialog::on_versionEdit_editingFinished()
-{
- VersionInfo version(ui->versionEdit->text());
- m_ModInfo->setVersion(version);
- updateVersionColor();
-}
-
-void ModInfoDialog::on_customUrlLineEdit_editingFinished()
-{
- m_ModInfo->setURL(ui->customUrlLineEdit->text());
}
bool ModInfoDialog::recursiveDelete(const QModelIndex &index)
@@ -975,22 +790,6 @@ void ModInfoDialog::on_fileTree_customContextMenuRequested(const QPoint &pos)
menu.exec(ui->fileTree->viewport()->mapToGlobal(pos));
}
-
-void ModInfoDialog::on_refreshButton_clicked()
-{
- if (m_ModInfo->getNexusID() > 0) {
- QLineEdit *modIDEdit = findChild<QLineEdit*>("modIDEdit");
- int modID = modIDEdit->text().toInt();
- refreshNexusData(modID);
- } else
- qInfo("Mod has no valid Nexus ID, info can't be updated.");
-}
-
-void ModInfoDialog::on_endorseBtn_clicked()
-{
- emit endorseMod(m_ModInfo);
-}
-
void ModInfoDialog::on_nextButton_clicked()
{
int currentTab = ui->tabWidget->currentIndex();
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 384aafce..7b96d21a 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -138,18 +138,11 @@ public:
void restoreState(const Settings& s);
signals:
-
- void linkActivated(const QString &link);
void downloadRequest(const QString &link);
void modOpen(const QString &modName, int tab);
void modOpenNext(int tab=-1);
void modOpenPrev(int tab=-1);
void originModified(int originID);
- void endorseMod(ModInfo::Ptr nexusID);
-
-public slots:
-
- void modDetailsUpdated(bool success);
private:
@@ -157,10 +150,6 @@ private:
void refreshLists();
- void updateVersionColor();
-
- void refreshNexusData(int modID);
- void activateNexusTab();
QString getFileCategory(int categoryID);
bool recursiveDelete(const QModelIndex &index);
void deleteFile(const QModelIndex &index);
@@ -168,9 +157,6 @@ private:
int tabIndex(const QString &tabId);
private slots:
- void linkClicked(const QUrl &url);
- void linkClicked(QString url);
-
void delete_activated();
void createDirectoryTriggered();
@@ -183,20 +169,10 @@ private slots:
void on_openInExplorerButton_clicked();
void on_closeButton_clicked();
- void on_visitNexusLabel_linkActivated(const QString &link);
- void on_modIDEdit_editingFinished();
- void on_sourceGameEdit_currentIndexChanged(int);
- void on_versionEdit_editingFinished();
- void on_customUrlLineEdit_editingFinished();
void on_tabWidget_currentChanged(int index);
void on_fileTree_customContextMenuRequested(const QPoint &pos);
- void on_refreshButton_clicked();
-
- void on_endorseBtn_clicked();
-
void on_nextButton_clicked();
-
void on_prevButton_clicked();
private:
@@ -217,11 +193,6 @@ private:
QTreeView *m_FileTree;
QModelIndexList m_FileSelection;
- QSettings *m_Settings;
-
- std::set<int> m_RequestIDs;
- bool m_RequestStarted;
-
QAction *m_NewFolderAction;
QAction *m_OpenAction;
QAction *m_PreviewAction;
diff --git a/src/modinfodialog.ui b/src/modinfodialog.ui
index c8ffd470..29a7400f 100644
--- a/src/modinfodialog.ui
+++ b/src/modinfodialog.ui
@@ -829,7 +829,7 @@ text-align: left;</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
- <widget class="QTreeWidget" name="categoriesTree">
+ <widget class="QTreeWidget" name="categories">
<property name="animated">
<bool>true</bool>
</property>
@@ -853,13 +853,13 @@ text-align: left;</string>
</widget>
</item>
<item>
- <widget class="QComboBox" name="primaryCategoryBox"/>
+ <widget class="QComboBox" name="primaryCategories"/>
</item>
</layout>
</item>
</layout>
</widget>
- <widget class="QWidget" name="tabNexus">
+ <widget class="QWidget" name="tabNexus1">
<attribute name="icon">
<iconset resource="resources.qrc">
<normaloff>:/MO/gui/resources/internet-web-browser.png</normaloff>:/MO/gui/resources/internet-web-browser.png</iconset>
@@ -871,6 +871,60 @@ text-align: left;</string>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
+ <widget class="QToolButton" name="refresh">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="toolTip">
+ <string>Refresh</string>
+ </property>
+ <property name="whatsThis">
+ <string>Refresh all information from Nexus.</string>
+ </property>
+ <property name="text">
+ <string>Refresh</string>
+ </property>
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/MO/gui/refresh</normaloff>:/MO/gui/refresh</iconset>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="openInBrowser">
+ <property name="text">
+ <string>Open in Browser</string>
+ </property>
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/MO/gui/resources/internet-web-browser.png</normaloff>:/MO/gui/resources/internet-web-browser.png</iconset>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="endorse">
+ <property name="text">
+ <string>Endorse</string>
+ </property>
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/MO/gui/icon_favorite</normaloff>:/MO/gui/icon_favorite</iconset>
+ </property>
+ <property name="toolButtonStyle">
+ <enum>Qt::ToolButtonTextBesideIcon</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Mod ID</string>
@@ -878,7 +932,7 @@ text-align: left;</string>
</widget>
</item>
<item>
- <widget class="ModIDLineEdit" name="modIDEdit">
+ <widget class="ModIDLineEdit" name="modID">
<property name="toolTip">
<string>Mod ID for this mod on Nexus.</string>
</property>
@@ -892,22 +946,6 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>10</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
<widget class="QLabel" name="label_10">
<property name="text">
<string>Source Game</string>
@@ -915,7 +953,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
- <widget class="QComboBox" name="sourceGameEdit">
+ <widget class="QComboBox" name="sourceGame">
<property name="toolTip">
<string>Source game for this mod.</string>
</property>
@@ -925,20 +963,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="versionLabel">
+ <widget class="QLabel" name="versionLabel1">
<property name="whatsThis">
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
@@ -952,7 +977,7 @@ p, li { white-space: pre-wrap; }
</widget>
</item>
<item>
- <widget class="QLineEdit" name="versionEdit">
+ <widget class="QLineEdit" name="version">
<property name="maximumSize">
<size>
<width>150</width>
@@ -967,102 +992,61 @@ p, li { white-space: pre-wrap; }
</layout>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_11" stretch="0,1">
- <item>
- <widget class="QPushButton" name="refreshButton">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="toolTip">
- <string>Refresh</string>
- </property>
- <property name="whatsThis">
- <string>Refresh all information from Nexus.</string>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/MO/gui/refresh</normaloff>:/MO/gui/refresh</iconset>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Description</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QWebEngineView" name="descriptionView">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize">
- <size>
- <width>0</width>
- <height>200</height>
- </size>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
</property>
- <property name="url">
- <url>
- <string>about:blank</string>
- </url>
+ <property name="frameShadow">
+ <enum>QFrame::Sunken</enum>
</property>
+ <layout class="QVBoxLayout" name="verticalLayout_24">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWebEngineView" name="browser">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>200</height>
+ </size>
+ </property>
+ <property name="url">
+ <url>
+ <string>about:blank</string>
+ </url>
+ </property>
+ </widget>
+ </item>
+ </layout>
</widget>
</item>
<item>
- <layout class="QHBoxLayout" name="horizontalLayout_7">
- <item>
- <widget class="QLabel" name="visitNexusLabel">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string/>
- </property>
- <property name="openExternalLinks">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="endorseBtn">
- <property name="text">
- <string>Endorse</string>
- </property>
- <property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/MO/gui/icon_favorite</normaloff>:/MO/gui/icon_favorite</iconset>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
<layout class="QHBoxLayout" name="horizontalLayout_14">
<item>
<widget class="QLabel" name="label_11">
<property name="text">
- <string>Web page URL (only used if invalid Nexus ID) :</string>
+ <string>URL</string>
</property>
</widget>
</item>
<item>
- <widget class="QLineEdit" name="customUrlLineEdit"/>
+ <widget class="QLineEdit" name="url"/>
</item>
</layout>
</item>
diff --git a/src/modinfodialogcategories.cpp b/src/modinfodialogcategories.cpp
index 7df13aea..69c7c6b5 100644
--- a/src/modinfodialogcategories.cpp
+++ b/src/modinfodialogcategories.cpp
@@ -3,28 +3,25 @@
#include "categories.h"
#include "modinfo.h"
-CategoriesTab::CategoriesTab(QWidget*, Ui::ModInfoDialog* ui)
- : ui(ui)
+CategoriesTab::CategoriesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui)
+ : ModInfoDialogTab(oc, plugin, parent, ui)
{
connect(
- ui->categoriesTree, &QTreeWidget::itemChanged,
+ ui->categories, &QTreeWidget::itemChanged,
[&](auto* item, int col){ onCategoryChanged(item, col); });
connect(
- ui->primaryCategoryBox,
+ ui->primaryCategories,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
[&](int index){ onPrimaryChanged(index); });
}
-void CategoriesTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin)
-{
- m_mod = mod;
-}
-
void CategoriesTab::clear()
{
- ui->categoriesTree->clear();
- ui->primaryCategoryBox->clear();
+ ui->categories->clear();
+ ui->primaryCategories->clear();
}
void CategoriesTab::update()
@@ -32,8 +29,8 @@ void CategoriesTab::update()
clear();
add(
- CategoryFactory::instance(), m_mod->getCategories(),
- ui->categoriesTree->invisibleRootItem(), 0);
+ CategoryFactory::instance(), mod()->getCategories(),
+ ui->categories->invisibleRootItem(), 0);
updatePrimary();
}
@@ -71,15 +68,15 @@ void CategoriesTab::add(
void CategoriesTab::updatePrimary()
{
- ui->primaryCategoryBox->clear();
+ ui->primaryCategories->clear();
- int primaryCategory = m_mod->getPrimaryCategory();
+ int primaryCategory = mod()->getPrimaryCategory();
- addChecked(ui->categoriesTree->invisibleRootItem());
+ addChecked(ui->categories->invisibleRootItem());
- for (int i = 0; i < ui->primaryCategoryBox->count(); ++i) {
- if (ui->primaryCategoryBox->itemData(i).toInt() == primaryCategory) {
- ui->primaryCategoryBox->setCurrentIndex(i);
+ for (int i = 0; i < ui->primaryCategories->count(); ++i) {
+ if (ui->primaryCategories->itemData(i).toInt() == primaryCategory) {
+ ui->primaryCategories->setCurrentIndex(i);
break;
}
}
@@ -90,7 +87,7 @@ void CategoriesTab::addChecked(QTreeWidgetItem* tree)
for (int i = 0; i < tree->childCount(); ++i) {
QTreeWidgetItem *child = tree->child(i);
if (child->checkState(0) == Qt::Checked) {
- ui->primaryCategoryBox->addItem(child->text(0), child->data(0, Qt::UserRole));
+ ui->primaryCategories->addItem(child->text(0), child->data(0, Qt::UserRole));
addChecked(child);
}
}
@@ -101,7 +98,7 @@ void CategoriesTab::save(QTreeWidgetItem* currentNode)
for (int i = 0; i < currentNode->childCount(); ++i) {
QTreeWidgetItem *childNode = currentNode->child(i);
- m_mod->setCategory(
+ mod()->setCategory(
childNode->data(0, Qt::UserRole).toInt(), childNode->checkState(0));
save(childNode);
@@ -118,12 +115,12 @@ void CategoriesTab::onCategoryChanged(QTreeWidgetItem* item, int)
}
updatePrimary();
- save(ui->categoriesTree->invisibleRootItem());
+ save(ui->categories->invisibleRootItem());
}
void CategoriesTab::onPrimaryChanged(int index)
{
if (index != -1) {
- m_mod->setPrimaryCategory(ui->primaryCategoryBox->itemData(index).toInt());
+ mod()->setPrimaryCategory(ui->primaryCategories->itemData(index).toInt());
}
}
diff --git a/src/modinfodialogcategories.h b/src/modinfodialogcategories.h
index c0644c7f..76426a5d 100644
--- a/src/modinfodialogcategories.h
+++ b/src/modinfodialogcategories.h
@@ -5,16 +5,14 @@ class CategoryFactory;
class CategoriesTab : public ModInfoDialogTab
{
public:
- CategoriesTab(QWidget* parent, Ui::ModInfoDialog* ui);
+ CategoriesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
void clear() override;
- void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin) override;
void update() override;
private:
- Ui::ModInfoDialog* ui;
- ModInfo::Ptr m_mod;
-
void add(
const CategoryFactory& factory, const std::set<int>& enabledCategories,
QTreeWidgetItem* root, int rootLevel);
diff --git a/src/modinfodialogconflicts.cpp b/src/modinfodialogconflicts.cpp
index d2dca492..4176ac3e 100644
--- a/src/modinfodialogconflicts.cpp
+++ b/src/modinfodialogconflicts.cpp
@@ -116,10 +116,10 @@ public:
ConflictsTab::ConflictsTab(
- QWidget* parent, Ui::ModInfoDialog* ui,
- OrganizerCore& oc, PluginContainer& plugin) :
- m_parent(parent), ui(ui), m_core(oc), m_plugin(plugin),
- m_origin(nullptr), m_general(this, ui, oc), m_advanced(this, ui, oc)
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui) :
+ ModInfoDialogTab(oc, plugin, parent, ui),
+ m_general(this, ui, oc), m_advanced(this, ui, oc)
{
connect(
&m_general, &GeneralConflictsTab::modOpen,
@@ -130,15 +130,6 @@ ConflictsTab::ConflictsTab(
[&](const QString& name){ emitModOpen(name); });
}
-void ConflictsTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin)
-{
- m_mod = mod;
- m_origin = origin;
-
- m_general.setMod(mod, origin);
- m_advanced.setMod(mod, origin);
-}
-
void ConflictsTab::update()
{
m_general.update();
@@ -186,7 +177,7 @@ void ConflictsTab::changeItemsVisibility(
flags |= FileRenamer::MULTIPLE;
}
- FileRenamer renamer(m_parent, flags);
+ FileRenamer renamer(parentWidget(), flags);
for (const auto* item : items) {
if (stop) {
@@ -242,8 +233,8 @@ void ConflictsTab::changeItemsVisibility(
if (changed) {
qDebug().nospace() << "triggering refresh";
- if (m_origin) {
- emit originModified(m_origin->getID());
+ if (origin()) {
+ emit originModified(origin()->getID());
}
update();
@@ -256,7 +247,7 @@ void ConflictsTab::openItems(const QList<QTreeWidgetItem*>& items)
// in case this changes
for (auto* item : items) {
if (auto* ci=dynamic_cast<ConflictItem*>(item)) {
- m_core.executeFileVirtualized(m_parent, ci->fileName());
+ core().executeFileVirtualized(parentWidget(), ci->fileName());
}
}
}
@@ -267,7 +258,7 @@ void ConflictsTab::previewItems(const QList<QTreeWidgetItem*>& items)
// in case this changes
for (auto* item : items) {
if (auto* ci=dynamic_cast<ConflictItem*>(item)) {
- m_core.previewFileWithAlternatives(m_parent, ci->fileName());
+ core().previewFileWithAlternatives(parentWidget(), ci->fileName());
}
}
}
@@ -355,7 +346,7 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(
enableHide = ci->canHide();
enableUnhide = ci->canUnhide();
enableOpen = ci->canOpen();
- enablePreview = ci->canPreview(m_plugin);
+ enablePreview = ci->canPreview(plugin());
enableGoto = ci->hasAlts();
}
else {
@@ -394,21 +385,21 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(
Actions actions;
- actions.hide = new QAction(tr("Hide"), m_parent);
+ actions.hide = new QAction(tr("Hide"), parentWidget());
actions.hide->setEnabled(enableHide);
// note that it is possible for hidden files to appear if they override other
// hidden files from another mod
- actions.unhide = new QAction(tr("Unhide"), m_parent);
+ actions.unhide = new QAction(tr("Unhide"), parentWidget());
actions.unhide->setEnabled(enableUnhide);
- actions.open = new QAction(tr("Open/Execute"), m_parent);
+ actions.open = new QAction(tr("Open/Execute"), parentWidget());
actions.open->setEnabled(enableOpen);
- actions.preview = new QAction(tr("Preview"), m_parent);
+ actions.preview = new QAction(tr("Preview"), parentWidget());
actions.preview->setEnabled(enablePreview);
- actions.gotoMenu = new QMenu(tr("Go to..."), m_parent);
+ actions.gotoMenu = new QMenu(tr("Go to..."), parentWidget());
actions.gotoMenu->setEnabled(enableGoto);
if (enableGoto) {
@@ -421,7 +412,7 @@ ConflictsTab::Actions ConflictsTab::createMenuActions(
std::vector<QAction*> ConflictsTab::createGotoActions(
const QList<QTreeWidgetItem*>& selection)
{
- if (!m_origin || selection.size() != 1) {
+ if (!origin() || selection.size() != 1) {
return {};
}
@@ -430,26 +421,26 @@ std::vector<QAction*> ConflictsTab::createGotoActions(
return {};
}
- auto file = m_origin->findFile(item->fileIndex());
+ auto file = origin()->findFile(item->fileIndex());
if (!file) {
return {};
}
std::vector<QString> mods;
- const auto& ds = *m_core.directoryStructure();
+ const auto& ds = *core().directoryStructure();
// add all alternatives
for (const auto& alt : file->getAlternatives()) {
const auto& o = ds.getOriginByID(alt.first);
- if (o.getID() != m_origin->getID()) {
+ if (o.getID() != origin()->getID()) {
mods.push_back(ToQString(o.getName()));
}
}
// add the real origin if different from this mod
const FilesOrigin& realOrigin = ds.getOriginByID(file->getOrigin());
- if (realOrigin.getID() != m_origin->getID()) {
+ if (realOrigin.getID() != origin()->getID()) {
mods.push_back(ToQString(realOrigin.getName()));
}
@@ -460,7 +451,7 @@ std::vector<QAction*> ConflictsTab::createGotoActions(
std::vector<QAction*> actions;
for (const auto& name : mods) {
- actions.push_back(new QAction(name, m_parent));
+ actions.push_back(new QAction(name, parentWidget()));
}
return actions;
@@ -469,7 +460,7 @@ std::vector<QAction*> ConflictsTab::createGotoActions(
GeneralConflictsTab::GeneralConflictsTab(
ConflictsTab* tab, Ui::ModInfoDialog* ui, OrganizerCore& oc)
- : m_tab(tab), ui(ui), m_core(oc), m_origin(nullptr)
+ : m_tab(tab), ui(ui), m_core(oc)
{
m_expanders.overwrite.set(ui->overwriteExpander, ui->overwriteTree, true);
m_expanders.overwritten.set(ui->overwrittenExpander, ui->overwrittenTree, true);
@@ -560,12 +551,6 @@ void GeneralConflictsTab::restoreState(const Settings& s)
.value("mod_info_conflicts_general_overwritten").toByteArray());
}
-void GeneralConflictsTab::setMod(ModInfo::Ptr mod, FilesOrigin* origin)
-{
- m_mod = mod;
- m_origin = origin;
-}
-
void GeneralConflictsTab::update()
{
clear();
@@ -574,10 +559,10 @@ void GeneralConflictsTab::update()
int numOverwrite = 0;
int numOverwritten = 0;
- if (m_origin != nullptr) {
- const auto rootPath = m_mod->absolutePath();
+ if (m_tab->origin() != nullptr) {
+ const auto rootPath = m_tab->mod()->absolutePath();
- for (const auto& file : m_origin->getFiles()) {
+ for (const auto& file : m_tab->origin()->getFiles()) {
const QString relativeName = QDir::fromNativeSeparators(ToQString(file->getRelativePath()));
const QString fileName = relativeName.mid(0).prepend(rootPath);
@@ -585,7 +570,7 @@ void GeneralConflictsTab::update()
const int fileOrigin = file->getOrigin(archive);
const auto& alternatives = file->getAlternatives();
- if (fileOrigin == m_origin->getID()) {
+ if (fileOrigin == m_tab->origin()->getID()) {
if (!alternatives.empty()) {
ui->overwriteTree->addTopLevelItem(createOverwriteItem(
file->getIndex(), archive, fileName, relativeName, alternatives));
@@ -684,7 +669,7 @@ void GeneralConflictsTab::onOverwrittenActivated(QTreeWidgetItem *item, int)
AdvancedConflictsTab::AdvancedConflictsTab(
ConflictsTab* tab, Ui::ModInfoDialog* ui, OrganizerCore& oc)
- : m_tab(tab), ui(ui), m_core(oc), m_origin(nullptr)
+ : m_tab(tab), ui(ui), m_core(oc)
{
// left-elide the overwrites column so that the nearest are visible
ui->conflictsAdvancedList->setItemDelegateForColumn(
@@ -760,20 +745,14 @@ void AdvancedConflictsTab::restoreState(const Settings& s)
}
}
-void AdvancedConflictsTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin)
-{
- m_mod = mod;
- m_origin = origin;
-}
-
void AdvancedConflictsTab::update()
{
clear();
- if (m_origin != nullptr) {
- const auto rootPath = m_mod->absolutePath();
+ if (m_tab->origin() != nullptr) {
+ const auto rootPath = m_tab->mod()->absolutePath();
- for (const auto& file : m_origin->getFiles()) {
+ for (const auto& file : m_tab->origin()->getFiles()) {
const QString relativeName = QDir::fromNativeSeparators(ToQString(file->getRelativePath()));
const QString fileName = relativeName.mid(0).prepend(rootPath);
@@ -813,14 +792,14 @@ QTreeWidgetItem* AdvancedConflictsTab::createItem(
// fills 'before' and 'after' with all the alternatives that come
// before and after this mod in terms of priority
- if (altOrigin.getPriority() < m_origin->getPriority()) {
+ if (altOrigin.getPriority() < m_tab->origin()->getPriority()) {
// add all the mods having a lower priority than this one
if (!before.isEmpty()) {
before += ", ";
}
before += ToQString(altOrigin.getName());
- } else if (altOrigin.getPriority() > m_origin->getPriority()) {
+ } else if (altOrigin.getPriority() > m_tab->origin()->getPriority()) {
// add all the mods having a higher priority than this one
if (!after.isEmpty()) {
after += ", ";
@@ -832,7 +811,7 @@ QTreeWidgetItem* AdvancedConflictsTab::createItem(
// keep track of the nearest mods that come before and after this one
// in terms of priority
- if (altOrigin.getPriority() < m_origin->getPriority()) {
+ if (altOrigin.getPriority() < m_tab->origin()->getPriority()) {
// the alternative has a lower priority than this mod
if (altOrigin.getPriority() > beforePrio) {
@@ -843,7 +822,7 @@ QTreeWidgetItem* AdvancedConflictsTab::createItem(
}
}
- if (altOrigin.getPriority() > m_origin->getPriority()) {
+ if (altOrigin.getPriority() > m_tab->origin()->getPriority()) {
// the alternative has a higher priority than this mod
if (altOrigin.getPriority() < afterPrio) {
@@ -869,7 +848,7 @@ QTreeWidgetItem* AdvancedConflictsTab::createItem(
// if no mods overwrite this file, the primary origin is the same as this
// mod, so ignore that
- if (realOrigin.getID() != m_origin->getID()) {
+ if (realOrigin.getID() != m_tab->origin()->getID()) {
if (!after.isEmpty()) {
after += ", ";
}
diff --git a/src/modinfodialogconflicts.h b/src/modinfodialogconflicts.h
index 212a196d..20362575 100644
--- a/src/modinfodialogconflicts.h
+++ b/src/modinfodialogconflicts.h
@@ -21,7 +21,6 @@ public:
void saveState(Settings& s);
void restoreState(const Settings& s);
- void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin);
void update();
signals:
@@ -36,8 +35,6 @@ private:
ConflictsTab* m_tab;
Ui::ModInfoDialog* ui;
OrganizerCore& m_core;
- ModInfo::Ptr m_mod;
- MOShared::FilesOrigin* m_origin;
Expanders m_expanders;
QTreeWidgetItem* createOverwriteItem(
@@ -74,7 +71,6 @@ public:
void saveState(Settings& s);
void restoreState(const Settings& s);
- void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin);
void update();
signals:
@@ -84,8 +80,6 @@ private:
ConflictsTab* m_tab;
Ui::ModInfoDialog* ui;
OrganizerCore& m_core;
- ModInfo::Ptr m_mod;
- MOShared::FilesOrigin* m_origin;
FilterWidget m_filter;
QTreeWidgetItem* createItem(
@@ -101,10 +95,9 @@ class ConflictsTab : public ModInfoDialogTab
public:
ConflictsTab(
- QWidget* parent, Ui::ModInfoDialog* ui,
- OrganizerCore& oc, PluginContainer& plugin);
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
- void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin) override;
void update() override;
void clear() override;
@@ -136,12 +129,6 @@ private:
}
};
- QWidget* m_parent;
- Ui::ModInfoDialog* ui;
- OrganizerCore& m_core;
- PluginContainer& m_plugin;
- ModInfo::Ptr m_mod;
- MOShared::FilesOrigin* m_origin;
GeneralConflictsTab m_general;
AdvancedConflictsTab m_advanced;
diff --git a/src/modinfodialogesps.cpp b/src/modinfodialogesps.cpp
index cb3dcc84..ea7eb3b0 100644
--- a/src/modinfodialogesps.cpp
+++ b/src/modinfodialogesps.cpp
@@ -122,8 +122,10 @@ private:
};
-ESPsTab::ESPsTab(QWidget* parent, Ui::ModInfoDialog* ui)
- : m_parent(parent), ui(ui)
+ESPsTab::ESPsTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui)
+ : ModInfoDialogTab(oc, plugin, parent, ui)
{
QObject::connect(
ui->activateESP, &QToolButton::clicked, [&]{ onActivate(); });
@@ -187,7 +189,7 @@ void ESPsTab::onActivate()
bool okClicked = false;
newName = QInputDialog::getText(
- m_parent,
+ parentWidget(),
QObject::tr("File Exists"),
QObject::tr("A file with that name exists, please enter a new one"),
QLineEdit::Normal, file.fileName(), &okClicked);
diff --git a/src/modinfodialogesps.h b/src/modinfodialogesps.h
index d71ad3ff..e1a7a4f7 100644
--- a/src/modinfodialogesps.h
+++ b/src/modinfodialogesps.h
@@ -10,15 +10,14 @@ class ESPsTab : public ModInfoDialogTab
Q_OBJECT;
public:
- ESPsTab(QWidget* parent, Ui::ModInfoDialog* ui);
+ ESPsTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
void clear() override;
bool feedFile(const QString& rootPath, const QString& fullPath) override;
private:
- QWidget* m_parent;
- Ui::ModInfoDialog* ui;
-
void onActivate();
void onDeactivate();
diff --git a/src/modinfodialogimages.cpp b/src/modinfodialogimages.cpp
index 752c8d0c..1c7dcc1f 100644
--- a/src/modinfodialogimages.cpp
+++ b/src/modinfodialogimages.cpp
@@ -80,8 +80,10 @@ void ScalableImage::mousePressEvent(QMouseEvent* e)
}
-ImagesTab::ImagesTab(QWidget*, Ui::ModInfoDialog* ui)
- : ui(ui), m_image(new ScalableImage)
+ImagesTab::ImagesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui)
+ : ModInfoDialogTab(oc, plugin, parent, ui), m_image(new ScalableImage)
{
ui->imagesImage->layout()->addWidget(m_image);
ui->imagesThumbnails->setLayout(new QVBoxLayout);
diff --git a/src/modinfodialogimages.h b/src/modinfodialogimages.h
index 708045c8..7853935a 100644
--- a/src/modinfodialogimages.h
+++ b/src/modinfodialogimages.h
@@ -34,13 +34,14 @@ class ImagesTab : public ModInfoDialogTab
Q_OBJECT;
public:
- ImagesTab(QWidget* parent, Ui::ModInfoDialog* ui);
+ ImagesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
void clear() override;
bool feedFile(const QString& rootPath, const QString& fullPath) override;
private:
- Ui::ModInfoDialog* ui;
ScalableImage* m_image;
void add(const QString& fullPath);
diff --git a/src/modinfodialognexus.cpp b/src/modinfodialognexus.cpp
new file mode 100644
index 00000000..753d43de
--- /dev/null
+++ b/src/modinfodialognexus.cpp
@@ -0,0 +1,273 @@
+#include "modinfodialognexus.h"
+#include "ui_modinfodialog.h"
+#include "settings.h"
+#include "organizercore.h"
+#include "iplugingame.h"
+#include "bbcode.h"
+#include <versioninfo.h>
+#include <utility.h>
+
+NexusTab::NexusTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui)
+ : ModInfoDialogTab(oc, plugin, parent, ui), m_requestStarted(false)
+{
+ ui->modID->setValidator(new QIntValidator(ui->modID));
+ ui->endorse->setVisible(core().settings().endorsementIntegration());
+
+ connect(ui->modID, &QLineEdit::editingFinished, [&]{ onModIDChanged(); });
+ connect(ui->version, &QLineEdit::editingFinished, [&]{ onVersionChanged(); });
+ connect(ui->openInBrowser, &QToolButton::clicked, [&]{ onOpenLink(); });
+ connect(ui->url, &QLineEdit::editingFinished, [&]{ onUrlChanged(); });
+ connect(ui->endorse, &QToolButton::clicked, [&]{ onEndorse(); });
+ connect(ui->refresh, &QToolButton::clicked, [&]{ updateWebpage(); });
+
+ connect(
+ ui->sourceGame,
+ static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
+ [&]{ onSourceGameChanged(); });
+}
+
+NexusTab::~NexusTab()
+{
+ cleanup();
+}
+
+void NexusTab::cleanup()
+{
+ if (m_modConnection) {
+ disconnect(m_modConnection);
+ m_modConnection = {};
+ }
+}
+
+void NexusTab::clear()
+{
+ ui->modID->clear();
+ ui->sourceGame->clear();
+ ui->version->clear();
+ ui->browser->setPage(new NexusTabWebpage(ui->browser));
+ ui->url->clear();
+}
+
+void NexusTab::update()
+{
+ clear();
+
+ ui->modID->setText(QString("%1").arg(mod()->getNexusID()));
+
+ QString gameName = mod()->getGameName();
+ ui->sourceGame->addItem(
+ core().managedGame()->gameName(),
+ core().managedGame()->gameShortName());
+
+ if (core().managedGame()->validShortNames().size() == 0) {
+ ui->sourceGame->setDisabled(true);
+ } else {
+ for (auto game : plugin().plugins<MOBase::IPluginGame>()) {
+ for (QString gameName : core().managedGame()->validShortNames()) {
+ if (game->gameShortName().compare(gameName, Qt::CaseInsensitive) == 0) {
+ ui->sourceGame->addItem(game->gameName(), game->gameShortName());
+ break;
+ }
+ }
+ }
+ }
+
+ ui->sourceGame->setCurrentIndex(ui->sourceGame->findData(gameName));
+
+ auto* page = new NexusTabWebpage(ui->browser);
+ ui->browser->setPage(page);
+
+ connect(
+ page, &NexusTabWebpage::linkClicked,
+ [&](const QUrl& url){ MOBase::shell::OpenLink(url); });
+
+ ui->endorse->setEnabled(
+ (mod()->endorsedState() == ModInfo::ENDORSED_FALSE) ||
+ (mod()->endorsedState() == ModInfo::ENDORSED_NEVER));
+
+ updateWebpage();
+}
+
+void NexusTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin)
+{
+ cleanup();
+
+ ModInfoDialogTab::setMod(mod, origin);
+
+ m_modConnection = connect(
+ mod.data(), &ModInfo::modDetailsUpdated, [&]{ onModChanged(); });
+}
+
+void NexusTab::updateVersionColor()
+{
+ if (mod()->getVersion() != mod()->getNewestVersion()) {
+ ui->version->setStyleSheet("color: red");
+ ui->version->setToolTip(tr("Current Version: %1").arg(
+ mod()->getNewestVersion().canonicalString()));
+ } else {
+ ui->version->setStyleSheet("color: green");
+ ui->version->setToolTip(tr("No update available"));
+ }
+}
+
+void NexusTab::updateWebpage()
+{
+ const int modID = mod()->getNexusID();
+
+ if (modID > 0) {
+ const QString nexusLink = NexusInterface::instance(&plugin())
+ ->getModURL(modID, mod()->getGameName());
+
+ ui->openInBrowser->setToolTip(nexusLink);
+ mod()->setURL(nexusLink);
+ refreshData(modID);
+ } else {
+ onModChanged();
+ }
+
+ ui->version->setText(mod()->getVersion().displayString());
+ ui->url->setText(mod()->getURL());
+}
+
+void NexusTab::onModChanged()
+{
+ m_requestStarted = false;
+
+ const QString nexusDescription = mod()->getNexusDescription();
+
+ QString descriptionAsHTML = R"(
+<html>
+ <head>
+ <style class=\"nexus-description\">
+ body
+ {
+ font-style: sans-serif;
+ background: #707070;
+ }
+
+ a
+ {
+ color: #5EA2E5;
+ }
+ </style>
+ </head>
+ <body>%1</body>
+</html>)";
+
+ if (nexusDescription.isEmpty()) {
+ descriptionAsHTML = descriptionAsHTML.arg(tr(
+ "<div style=\"text-align: center;\">"
+ "<h1>Uh oh!</h1>"
+ "<p>Sorry, there is no description available for this mod. :(</p>"
+ "</div>"));
+
+ } else {
+ descriptionAsHTML = descriptionAsHTML.arg(
+ BBCode::convertToHTML(nexusDescription));
+ }
+
+ ui->browser->page()->setHtml(descriptionAsHTML);
+ updateVersionColor();
+}
+
+void NexusTab::onModIDChanged()
+{
+ const int oldID = mod()->getNexusID();
+ const int newID = ui->modID->text().toInt();
+
+ if (oldID != newID){
+ mod()->setNexusID(newID);
+ mod()->setLastNexusQuery(QDateTime::fromSecsSinceEpoch(0));
+
+ ui->browser->page()->setHtml("");
+
+ if (newID != 0) {
+ refreshData(newID);
+ }
+ }
+}
+
+void NexusTab::onSourceGameChanged()
+{
+ for (auto game : plugin().plugins<MOBase::IPluginGame>()) {
+ if (game->gameName() == ui->sourceGame->currentText()) {
+ mod()->setGameName(game->gameShortName());
+ mod()->setLastNexusQuery(QDateTime::fromSecsSinceEpoch(0));
+ refreshData(mod()->getNexusID());
+ return;
+ }
+ }
+}
+
+void NexusTab::onVersionChanged()
+{
+ MOBase::VersionInfo version(ui->version->text());
+ mod()->setVersion(version);
+ updateVersionColor();
+}
+
+void NexusTab::onUrlChanged()
+{
+ mod()->setURL(ui->url->text());
+ mod()->setLastNexusQuery(QDateTime::fromSecsSinceEpoch(0));
+}
+
+void NexusTab::onOpenLink()
+{
+ const int modID = mod()->getNexusID();
+
+ if (modID > 0) {
+ const QString nexusLink = NexusInterface::instance(&plugin())
+ ->getModURL(modID, mod()->getGameName());
+
+ MOBase::shell::OpenLink(QUrl(nexusLink));
+ }
+}
+
+void NexusTab::onRefreshBrowser()
+{
+ const auto modID = mod()->getNexusID();
+
+ if (modID > 0) {
+ refreshData(modID);
+ } else
+ qInfo("Mod has no valid Nexus ID, info can't be updated.");
+}
+
+void NexusTab::onEndorse()
+{
+ core().loggedInAction(parentWidget(), [m=mod()]{ m->endorse(true); });
+}
+
+void NexusTab::refreshData(int modID)
+{
+ if (tryRefreshData(modID)) {
+ m_requestStarted = true;
+ } else {
+ onModChanged();
+ }
+
+ //MessageDialog::showMessage(tr("Info requested, please wait"), this);
+}
+
+bool NexusTab::tryRefreshData(int modID)
+{
+ if (modID <= 0) {
+ qDebug() << "NexusTab: can't refresh, no mod id";
+ return false;
+ }
+
+ if (m_requestStarted) {
+ qDebug() << "NexusTab: a refresh request is already running";
+ return false;
+ }
+
+ if (!mod()->updateNXMInfo()) {
+ qDebug() << "NexusTab: nexus description does not need an update";
+ return false;
+ }
+
+ return true;
+}
diff --git a/src/modinfodialognexus.h b/src/modinfodialognexus.h
new file mode 100644
index 00000000..2e328c6d
--- /dev/null
+++ b/src/modinfodialognexus.h
@@ -0,0 +1,67 @@
+#ifndef MODINFODIALOGNEXUS_H
+#define MODINFODIALOGNEXUS_H
+
+#include "modinfodialogtab.h"
+
+class NexusTabWebpage : public QWebEnginePage
+{
+ Q_OBJECT
+
+public:
+ NexusTabWebpage(QObject* parent = 0)
+ : QWebEnginePage(parent)
+ {
+ }
+
+ bool acceptNavigationRequest(
+ const QUrl & url, QWebEnginePage::NavigationType type, bool) override
+ {
+ if (type == QWebEnginePage::NavigationTypeLinkClicked)
+ {
+ emit linkClicked(url);
+ return false;
+ }
+
+ return true;
+ }
+
+signals:
+ void linkClicked(const QUrl&);
+};
+
+
+class NexusTab : public ModInfoDialogTab
+{
+public:
+ NexusTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
+
+ ~NexusTab();
+
+ void clear() override;
+ void update() override;
+ void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin) override;
+
+private:
+ QMetaObject::Connection m_modConnection;
+ bool m_requestStarted;
+
+ void cleanup();
+ void updateVersionColor();
+ void updateWebpage();
+
+ void refreshData(int modID);
+ bool tryRefreshData(int modID);
+
+ void onModChanged();
+ void onOpenLink();
+ void onModIDChanged();
+ void onSourceGameChanged();
+ void onVersionChanged();
+ void onRefreshBrowser();
+ void onEndorse();
+ void onUrlChanged();
+};
+
+#endif // MODINFODIALOGNEXUS_H
diff --git a/src/modinfodialogtab.cpp b/src/modinfodialogtab.cpp
index 6dcff0ac..ae0de5e8 100644
--- a/src/modinfodialogtab.cpp
+++ b/src/modinfodialogtab.cpp
@@ -1,5 +1,12 @@
#include "modinfodialogtab.h"
+ModInfoDialogTab::ModInfoDialogTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui)
+ : ui(ui), m_core(oc), m_plugin(plugin), m_parent(parent), m_origin(nullptr)
+{
+}
+
bool ModInfoDialogTab::feedFile(const QString&, const QString&)
{
// no-op
@@ -21,14 +28,40 @@ void ModInfoDialogTab::restoreState(const Settings& s)
// no-op
}
-void ModInfoDialogTab::setMod(ModInfo::Ptr, MOShared::FilesOrigin*)
+void ModInfoDialogTab::update()
{
// no-op
}
-void ModInfoDialogTab::update()
+void ModInfoDialogTab::setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin)
{
- // no-op
+ m_mod = mod;
+ m_origin = origin;
+}
+
+ModInfo::Ptr ModInfoDialogTab::mod() const
+{
+ return m_mod;
+}
+
+MOShared::FilesOrigin* ModInfoDialogTab::origin() const
+{
+ return m_origin;
+}
+
+OrganizerCore& ModInfoDialogTab::core()
+{
+ return m_core;
+}
+
+PluginContainer& ModInfoDialogTab::plugin()
+{
+ return m_plugin;
+}
+
+QWidget* ModInfoDialogTab::parentWidget()
+{
+ return m_parent;
}
void ModInfoDialogTab::emitOriginModified(int originID)
diff --git a/src/modinfodialogtab.h b/src/modinfodialogtab.h
index ead29d10..dd851b31 100644
--- a/src/modinfodialogtab.h
+++ b/src/modinfodialogtab.h
@@ -8,13 +8,13 @@ namespace MOShared { class FilesOrigin; }
namespace Ui { class ModInfoDialog; }
class Settings;
+class OrganizerCore;
class ModInfoDialogTab : public QObject
{
Q_OBJECT;
public:
- ModInfoDialogTab() = default;
ModInfoDialogTab(const ModInfoDialogTab&) = delete;
ModInfoDialogTab& operator=(const ModInfoDialogTab&) = delete;
ModInfoDialogTab(ModInfoDialogTab&&) = default;
@@ -22,21 +22,42 @@ public:
virtual ~ModInfoDialogTab() = default;
virtual void clear() = 0;
+ virtual void update();
virtual bool feedFile(const QString& rootPath, const QString& filename);
virtual bool canClose();
virtual void saveState(Settings& s);
virtual void restoreState(const Settings& s);
virtual void setMod(ModInfo::Ptr mod, MOShared::FilesOrigin* origin);
- virtual void update();
+
+ ModInfo::Ptr mod() const;
+ MOShared::FilesOrigin* origin() const;
signals:
void originModified(int originID);
void modOpen(QString name);
protected:
+ Ui::ModInfoDialog* ui;
+
+ ModInfoDialogTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
+
+ OrganizerCore& core();
+ PluginContainer& plugin();
+
+ QWidget* parentWidget();
+
void emitOriginModified(int originID);
void emitModOpen(QString name);
+
+private:
+ OrganizerCore& m_core;
+ PluginContainer& m_plugin;
+ QWidget* m_parent;
+ ModInfo::Ptr m_mod;
+ MOShared::FilesOrigin* m_origin;
};
#endif // MODINFODIALOGTAB_H
diff --git a/src/modinfodialogtextfiles.cpp b/src/modinfodialogtextfiles.cpp
index 0dd6f06e..f48557b0 100644
--- a/src/modinfodialogtextfiles.cpp
+++ b/src/modinfodialogtextfiles.cpp
@@ -22,8 +22,10 @@ private:
GenericFilesTab::GenericFilesTab(
- QWidget* parent, QListWidget* list, QSplitter* sp, TextEditor* e)
- : m_parent(parent), m_list(list), m_editor(e)
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui,
+ QListWidget* list, QSplitter* sp, TextEditor* e)
+ : ModInfoDialogTab(oc, plugin, parent, ui), m_list(list), m_editor(e)
{
m_editor->setupToolbar();
@@ -49,7 +51,7 @@ bool GenericFilesTab::canClose()
}
const int res = QMessageBox::question(
- m_parent,
+ parentWidget(),
QObject::tr("Save changes?"),
QObject::tr("Save changes to \"%1\"?").arg(m_editor->filename()),
QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
@@ -109,9 +111,12 @@ void GenericFilesTab::select(FileListItem* item)
}
-TextFilesTab::TextFilesTab(QWidget* parent, Ui::ModInfoDialog* ui)
- : GenericFilesTab(
- parent, ui->textFileList, ui->tabTextSplitter, ui->textFileEditor)
+TextFilesTab::TextFilesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui)
+ : GenericFilesTab(
+ oc, plugin, parent, ui,
+ ui->textFileList, ui->tabTextSplitter, ui->textFileEditor)
{
}
@@ -130,9 +135,12 @@ bool TextFilesTab::wantsFile(const QString& rootPath, const QString& fullPath) c
return false;
}
-IniFilesTab::IniFilesTab(QWidget* parent, Ui::ModInfoDialog* ui)
- : GenericFilesTab(
- parent, ui->iniFileList, ui->tabIniSplitter, ui->iniFileEditor)
+IniFilesTab::IniFilesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui)
+ : GenericFilesTab(
+ oc, plugin, parent, ui,
+ ui->iniFileList, ui->tabIniSplitter, ui->iniFileEditor)
{
}
diff --git a/src/modinfodialogtextfiles.h b/src/modinfodialogtextfiles.h
index 11691d64..0dc5ec89 100644
--- a/src/modinfodialogtextfiles.h
+++ b/src/modinfodialogtextfiles.h
@@ -18,12 +18,12 @@ public:
bool feedFile(const QString& rootPath, const QString& fullPath) override;
protected:
- QWidget* m_parent;
QListWidget* m_list;
TextEditor* m_editor;
GenericFilesTab(
- QWidget* parent,
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui,
QListWidget* list, QSplitter* splitter, TextEditor* editor);
virtual bool wantsFile(const QString& rootPath, const QString& fullPath) const = 0;
@@ -37,7 +37,9 @@ private:
class TextFilesTab : public GenericFilesTab
{
public:
- TextFilesTab(QWidget* parent, Ui::ModInfoDialog* ui);
+ TextFilesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
protected:
bool wantsFile(const QString& rootPath, const QString& fullPath) const override;
@@ -47,7 +49,9 @@ protected:
class IniFilesTab : public GenericFilesTab
{
public:
- IniFilesTab(QWidget* parent, Ui::ModInfoDialog* ui);
+ IniFilesTab(
+ OrganizerCore& oc, PluginContainer& plugin,
+ QWidget* parent, Ui::ModInfoDialog* ui);
protected:
bool wantsFile(const QString& rootPath, const QString& fullPath) const override;
diff --git a/src/modinforegular.cpp b/src/modinforegular.cpp
index a271c4e8..babbd665 100644
--- a/src/modinforegular.cpp
+++ b/src/modinforegular.cpp
@@ -118,7 +118,7 @@ void ModInfoRegular::readMeta()
m_EndorsedState = metaFile.value("endorsed", false).toBool() ? ENDORSED_TRUE : ENDORSED_FALSE;
}
}
-
+
QString categoriesString = metaFile.value("category", "").toString();
QStringList categories = categoriesString.split(',', QString::SkipEmptyParts);
@@ -291,15 +291,27 @@ void ModInfoRegular::nxmRequestFailed(QString, int, int, QVariant userData, QNet
bool ModInfoRegular::updateNXMInfo()
{
- QDateTime time = QDateTime::currentDateTimeUtc();
- QDateTime target = m_LastNexusQuery.addDays(1);
- if (m_NexusID > 0 && time >= target) {
+ if (needsDescriptionUpdate()) {
m_NexusBridge.requestDescription(m_GameName, m_NexusID, QVariant());
return true;
}
+
return false;
}
+bool ModInfoRegular::needsDescriptionUpdate() const
+{
+ if (m_NexusID > 0) {
+ QDateTime time = QDateTime::currentDateTimeUtc();
+ QDateTime target = m_LastNexusQuery.addDays(1);
+
+ if (time >= target) {
+ return true;
+ }
+ }
+
+ return false;
+}
void ModInfoRegular::setCategory(int categoryID, bool active)
{
diff --git a/src/modinforegular.h b/src/modinforegular.h
index f70487a2..cfe713ca 100644
--- a/src/modinforegular.h
+++ b/src/modinforegular.h
@@ -464,6 +464,7 @@ private:
mutable std::vector<ModInfo::EContent> m_CachedContent;
mutable QTime m_LastContentCheck;
+ bool needsDescriptionUpdate() const;
};
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 2cad9ce8..e073924b 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -2204,6 +2204,21 @@ void OrganizerCore::updateModsInDirectoryStructure(QMap<unsigned int, ModInfo::P
}
}
+void OrganizerCore::loggedInAction(QWidget* parent, std::function<void ()> f)
+{
+ if (NexusInterface::instance(m_PluginContainer)->getAccessManager()->validated()) {
+ f();
+ } else {
+ QString apiKey;
+ if (settings().getNexusApiKey(apiKey)) {
+ doAfterLogin([f]{ f(); });
+ NexusInterface::instance(m_PluginContainer)->getAccessManager()->apiCheck(apiKey);
+ } else {
+ MessageDialog::showMessage(tr("You need to be logged in with Nexus"), parent);
+ }
+ }
+}
+
void OrganizerCore::requestDownload(const QUrl &url, QNetworkReply *reply)
{
if (m_PluginContainer != nullptr) {
diff --git a/src/organizercore.h b/src/organizercore.h
index a4a57496..4dd11831 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -146,6 +146,7 @@ public:
void updateModsInDirectoryStructure(QMap<unsigned int, ModInfo::Ptr> modInfos);
void doAfterLogin(const std::function<void()> &function) { m_PostLoginTasks.append(function); }
+ void loggedInAction(QWidget* parent, std::function<void ()> f);
static QString findJavaInstallation(const QString& jarFile={});