summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp85
-rw-r--r--src/mainwindow.h11
-rw-r--r--src/modinfo.h14
-rw-r--r--src/modinfodialog.cpp22
-rw-r--r--src/modinfodialog.h5
-rw-r--r--src/modinfodialog.ui36
-rw-r--r--src/modlist.cpp1
-rw-r--r--src/settingsdialog.ui3
8 files changed, 145 insertions, 32 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 802adc24..00c7895e 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -150,6 +150,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <QWhatsThis>
#include <QWidgetAction>
#include <QWebEngineProfile>
+#include <QShortcut>
#include <QDebug>
#include <QtGlobal>
@@ -369,6 +370,12 @@ MainWindow::MainWindow(QSettings &initSettings
connect(ui->espList->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(esplistSelectionsChanged(QItemSelection)));
connect(ui->modList->selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(modlistSelectionsChanged(QItemSelection)));
+ new QShortcut(QKeySequence(Qt::Key_Enter), this, SLOT(openExplorer_activated()));
+ new QShortcut(QKeySequence(Qt::Key_Return), this, SLOT(openExplorer_activated()));
+
+ new QShortcut(QKeySequence::Refresh, this, SLOT(refreshProfile_activated()));
+
+
m_UpdateProblemsTimer.setSingleShot(true);
connect(&m_UpdateProblemsTimer, SIGNAL(timeout()), this, SLOT(updateProblemsButton()));
@@ -2457,13 +2464,28 @@ 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)));
+
+ //Open the tab first if we want to use the standard indexes of the tabs.
+ if (tab != -1) {
+ dialog.openTab(tab);
+ }
- dialog.openTab(tab);
dialog.restoreTabState(m_OrganizerCore.settings().directInterface().value("mod_info_tabs").toByteArray());
+
+ //If no tab was specified use the first tab from the left based on the user order.
+ if (tab == -1) {
+ for (int i = 0; i < dialog.findChild<QTabWidget*>("tabWidget")->count(); ++i) {
+ if (dialog.findChild<QTabWidget*>("tabWidget")->isTabEnabled(i)) {
+ dialog.findChild<QTabWidget*>("tabWidget")->setCurrentIndex(i);
+ break;
+ }
+ }
+ }
+
dialog.exec();
m_OrganizerCore.settings().directInterface().setValue("mod_info_tabs", dialog.saveTabState());
@@ -2504,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);
@@ -2515,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;
@@ -2535,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);
}
}
@@ -2600,6 +2622,49 @@ void MainWindow::openExplorer_clicked()
::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
}
+void MainWindow::openExplorer_activated()
+{
+ if (ui->modList->hasFocus()) {
+ QItemSelectionModel *selection = ui->modList->selectionModel();
+ if (selection->hasSelection() && selection->selectedRows().count() == 1 ) {
+
+ QModelIndex idx = selection->currentIndex();
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(idx.data(Qt::UserRole + 1).toInt());
+ std::vector<ModInfo::EFlag> flags = modInfo->getFlags();
+
+ if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) {
+ ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ }
+
+ }
+ }
+
+ if (ui->espList->hasFocus()) {
+ QItemSelectionModel *selection = ui->espList->selectionModel();
+
+ if (selection->hasSelection() && selection->selectedRows().count() == 1) {
+
+ QModelIndex idx = selection->currentIndex();
+ QString fileName = idx.data().toString();
+
+
+
+ ModInfo::Ptr modInfo = ModInfo::getByIndex(ModInfo::getIndex(m_OrganizerCore.pluginList()->origin(fileName)));
+ std::vector<ModInfo::EFlag> flags = modInfo->getFlags();
+
+ if (modInfo->isRegular() || (std::find(flags.begin(), flags.end(), ModInfo::FLAG_OVERWRITE) != flags.end())) {
+ ::ShellExecuteW(nullptr, L"explore", ToWString(modInfo->absolutePath()).c_str(), nullptr, nullptr, SW_SHOWNORMAL);
+ }
+
+ }
+ }
+}
+
+void MainWindow::refreshProfile_activated()
+{
+ m_OrganizerCore.profileRefresh();
+}
+
void MainWindow::information_clicked()
{
try {
@@ -4522,7 +4587,7 @@ void MainWindow::on_espList_customContextMenuRequested(const QPoint &pos)
menu.addAction(tr("Unlock load order"), this, SLOT(unlockESPIndex()));
}
if (hasUnlocked) {
- menu.addAction(tr("Lock load order"), this, SLOT(lockESPIndex()));
+ menu.addAction(tr("Lock load order"), this, SLOT(f()));
}
try {
diff --git a/src/mainwindow.h b/src/mainwindow.h
index d684dbc0..b06da353 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -217,7 +217,7 @@ private:
QList<MOBase::IOrganizer::FileInfo> findFileInfos(const QString &path, const std::function<bool (const MOBase::IOrganizer::FileInfo &)> &filter) const;
bool modifyExecutablesDialog();
- void displayModInformation(int row, int tab = 0);
+ void displayModInformation(int row, int tab = -1);
void testExtractBSA(int modIndex);
void writeDataToFile(QFile &file, const QString &directory, const MOShared::DirectoryEntry &directoryEntry);
@@ -386,6 +386,7 @@ private slots:
void showMessage(const QString &message);
void showError(const QString &message);
+
// main window actions
void helpTriggered();
void issueTriggered();
@@ -393,6 +394,10 @@ private slots:
void tutorialTriggered();
void extractBSATriggered();
+ //modlist shortcuts
+ void openExplorer_activated();
+ void refreshProfile_activated();
+
// modlist context menu
void installMod_clicked();
void createEmptyMod_clicked();
@@ -469,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/modinfo.h b/src/modinfo.h
index 07dccafd..9e9f8971 100644
--- a/src/modinfo.h
+++ b/src/modinfo.h
@@ -265,13 +265,13 @@ public:
* @brief change the notes (manually set information) for this mod
* @param notes new notes
*/
- virtual void setNotes(const QString &notes) = 0;
-
- /**
- * @brief set/change the source game of this mod
- *
- * @param gameName the source game shortName
- */
+ virtual void setNotes(const QString &notes) = 0;
+
+ /**
+ * @brief set/change the source game of this mod
+ *
+ * @param gameName the source game shortName
+ */
virtual void setGameName(QString gameName) = 0;
/**
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index e2da6a2c..c25041f2 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)
{
@@ -1444,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 52db5654..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);
@@ -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 @@
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
- <number>0</number>
+ <number>8</number>
</property>
<property name="movable">
<bool>true</bool>
@@ -723,8 +723,8 @@ p, li { white-space: pre-wrap; }
</layout>
</item>
<item>
- <widget class="QWebEngineView" name="descriptionView">
- <property name="url">
+ <widget class="QWebEngineView" name="descriptionView" native="true">
+ <property name="url" stdset="0">
<url>
<string>about:blank</string>
</url>
@@ -780,6 +780,36 @@ p, li { white-space: pre-wrap; }
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
+ <layout class="QHBoxLayout" name="horizontalLayout_13">
+ <item>
+ <widget class="QPushButton" name="openInExplorerButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Open Mod in Explorer</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
<widget class="QTreeView" name="fileTree">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
diff --git a/src/modlist.cpp b/src/modlist.cpp
index c8fd4b3e..3f9a732a 100644
--- a/src/modlist.cpp
+++ b/src/modlist.cpp
@@ -724,7 +724,6 @@ void ModList::highlightMods(const QItemSelection &selected, const MOShared::Dire
const MOShared::FileEntry::Ptr fileEntry = directoryEntry.findFile(modName.toStdWString());
if (fileEntry.get() != nullptr) {
- QString fileName;
bool archive = false;
std::vector<std::pair<int, std::wstring>> origins;
{
diff --git a/src/settingsdialog.ui b/src/settingsdialog.ui
index 3c47d226..85688cb8 100644
--- a/src/settingsdialog.ui
+++ b/src/settingsdialog.ui
@@ -890,6 +890,9 @@ tl;dr-version: If Nexus-features don't work, insert the current version number o
</item>
<item>
<widget class="QCheckBox" name="hideUncheckedBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
<property name="toolTip">
<string>Enforces that inactive ESPs and ESMs are never loaded.</string>
</property>