summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp29
-rw-r--r--src/mainwindow.h4
-rw-r--r--src/modinfodialog.cpp48
-rw-r--r--src/modinfodialog.h16
-rw-r--r--src/modlistview.cpp20
-rw-r--r--src/modlistview.h8
-rw-r--r--src/modlistviewactions.cpp7
-rw-r--r--src/organizercore.cpp1
8 files changed, 66 insertions, 67 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 2ca15b00..3d509379 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -48,7 +48,6 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "categories.h"
#include "categoriesdialog.h"
#include "genericicondelegate.h"
-#include "modinfodialog.h"
#include "overwriteinfodialog.h"
#include "downloadlist.h"
#include "downloadlistwidget.h"
@@ -2377,16 +2376,6 @@ void MainWindow::windowTutorialFinished(const QString &windowName)
m_OrganizerCore.settings().interface().setTutorialCompleted(windowName);
}
-void MainWindow::overwriteClosed(int)
-{
- OverwriteInfoDialog *dialog = this->findChild<OverwriteInfoDialog*>("__overwriteDialog");
- if (dialog != nullptr) {
- m_OrganizerCore.modList()->modInfoChanged(dialog->modInfo());
- dialog->deleteLater();
- }
- m_OrganizerCore.refreshDirectoryStructure();
-}
-
void MainWindow::displayModInformation(ModInfo::Ptr modInfo, unsigned int modIndex, ModInfoTabIDs tabID)
{
ui->modList->actions().displayModInformation(modInfo, modIndex, tabID);
@@ -2402,24 +2391,6 @@ void MainWindow::setWindowEnabled(bool enabled)
setEnabled(enabled);
}
-ModInfo::Ptr MainWindow::nextModInList(int modIndex)
-{
- modIndex = ui->modList->nextMod(modIndex);
- if (modIndex == -1) {
- return {};
- }
- return ModInfo::getByIndex(modIndex);
-}
-
-ModInfo::Ptr MainWindow::previousModInList(int modIndex)
-{
- modIndex = ui->modList->prevMod(modIndex);
- if (modIndex == -1) {
- return {};
- }
- return ModInfo::getByIndex(modIndex);
-}
-
void MainWindow::openPluginOriginExplorer_clicked()
{
QItemSelectionModel *selection = ui->espList->selectionModel();
diff --git a/src/mainwindow.h b/src/mainwindow.h
index 1beed2f2..d80f4f63 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -142,9 +142,6 @@ public:
virtual MOBase::DelayedFileWriterBase &archivesWriter() override { return m_ArchiveListWriter; }
- ModInfo::Ptr nextModInList(int modIndex);
- ModInfo::Ptr previousModInList(int modIndex);
-
public slots:
void esplist_changed();
void refresherProgress(const DirectoryRefreshProgress* p);
@@ -428,7 +425,6 @@ private slots:
void toolBar_customContextMenuRequested(const QPoint &point);
void removeFromToolbar(QAction* action);
- void overwriteClosed(int);
void about();
diff --git a/src/modinfodialog.cpp b/src/modinfodialog.cpp
index cb282195..54c97406 100644
--- a/src/modinfodialog.cpp
+++ b/src/modinfodialog.cpp
@@ -21,7 +21,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include "ui_modinfodialog.h"
#include "plugincontainer.h"
#include "organizercore.h"
-#include "mainwindow.h"
+#include "modlistview.h"
#include "modinfodialogtextfiles.h"
#include "modinfodialogimages.h"
#include "modinfodialogesps.h"
@@ -176,11 +176,14 @@ bool ModInfoDialog::TabInfo::isVisible() const
ModInfoDialog::ModInfoDialog(
- MainWindow* mw, OrganizerCore* core, PluginContainer* plugin,
- ModInfo::Ptr mod) :
- TutorableDialog("ModInfoDialog", mw),
- ui(new Ui::ModInfoDialog), m_mainWindow(mw),
- m_core(core), m_plugin(plugin), m_initialTab(ModInfoTabIDs::None),
+ OrganizerCore& core, PluginContainer& plugin,
+ ModInfo::Ptr mod, ModListView* modListView) :
+ TutorableDialog("ModInfoDialog", modListView),
+ ui(new Ui::ModInfoDialog),
+ m_core(core),
+ m_plugin(plugin),
+ m_modListView(modListView),
+ m_initialTab(ModInfoTabIDs::None),
m_arrangingTabs(false)
{
ui->setupUi(this);
@@ -204,7 +207,7 @@ template <class T>
std::unique_ptr<ModInfoDialogTab> createTab(ModInfoDialog& d, ModInfoTabIDs id)
{
return std::make_unique<T>(ModInfoDialogTabContext(
- *d.m_core, *d.m_plugin, &d, d.ui.get(), id, d.m_mod, d.getOrigin()));
+ d.m_core, d.m_plugin, &d, d.ui.get(), id, d.m_mod, d.getOrigin()));
}
void ModInfoDialog::createTabs()
@@ -269,7 +272,7 @@ int ModInfoDialog::exec()
update(true);
if (noCustomTabRequested) {
- m_core->settings().widgets().restoreIndex(ui->tabWidget);
+ m_core.settings().widgets().restoreIndex(ui->tabWidget);
}
const int r = TutorableDialog::exec();
@@ -430,7 +433,7 @@ void ModInfoDialog::reAddTabs(
Q_ASSERT(visibility.size() == m_tabs.size());
// ordered tab names from settings
- const auto orderedNames = m_core->settings().geometry().modInfoTabOrder();
+ const auto orderedNames = m_core.settings().geometry().modInfoTabOrder();
// whether the tabs can be sorted
//
@@ -586,7 +589,7 @@ void ModInfoDialog::feedFiles(std::vector<TabInfo*>& interestedTabs)
void ModInfoDialog::setTabsColors()
{
- const auto p = m_mainWindow->palette();
+ const auto p = m_modListView->parentWidget()->palette();
for (const auto& tabInfo : m_tabs) {
if (!tabInfo.isVisible()) {
@@ -619,7 +622,7 @@ void ModInfoDialog::switchToTab(ModInfoTabIDs id)
MOShared::FilesOrigin* ModInfoDialog::getOrigin()
{
- auto* ds = m_core->directoryStructure();
+ auto* ds = m_core.directoryStructure();
if (!ds->originExists(m_mod->name().toStdWString())) {
return nullptr;
@@ -639,7 +642,7 @@ void ModInfoDialog::saveState() const
// save state for each tab
for (const auto& tabInfo : m_tabs) {
- tabInfo.tab->saveState(m_core->settings());
+ tabInfo.tab->saveState(m_core.settings());
}
}
@@ -650,7 +653,7 @@ void ModInfoDialog::restoreState()
// restore state for each tab
for (const auto& tabInfo : m_tabs) {
- tabInfo.tab->restoreState(m_core->settings());
+ tabInfo.tab->restoreState(m_core.settings());
}
}
@@ -678,9 +681,9 @@ void ModInfoDialog::saveTabOrder() const
names += ui->tabWidget->widget(i)->objectName();
}
- m_core->settings().geometry().setModInfoTabOrder(names);
+ m_core.settings().geometry().setModInfoTabOrder(names);
// save last opened index
- m_core->settings().widgets().saveIndex(ui->tabWidget);
+ m_core.settings().widgets().saveIndex(ui->tabWidget);
}
void ModInfoDialog::onOriginModified(int originID)
@@ -776,22 +779,31 @@ void ModInfoDialog::onTabMoved()
void ModInfoDialog::onNextMod()
{
- auto mod = m_mainWindow->nextModInList(ModInfo::getIndex(m_mod->name()));
+ auto index = m_modListView->nextMod(ModInfo::getIndex(m_mod->name()));
+ if (!index) {
+ return;
+ }
+ auto mod = ModInfo::getByIndex(*index);
if (!mod || mod == m_mod) {
return;
}
setMod(mod);
update();
+
+ emit modChanged(*index);
}
void ModInfoDialog::onPreviousMod()
{
- auto mod = m_mainWindow->previousModInList(ModInfo::getIndex(m_mod->name()));
- if (!mod || mod == m_mod) {
+ auto index = m_modListView->prevMod(ModInfo::getIndex(m_mod->name()));
+ if (!index) {
return;
}
+ auto mod = ModInfo::getByIndex(*index);
setMod(mod);
update();
+
+ emit modChanged(*index);
}
diff --git a/src/modinfodialog.h b/src/modinfodialog.h
index 48680ca4..a3b6ffdb 100644
--- a/src/modinfodialog.h
+++ b/src/modinfodialog.h
@@ -33,7 +33,7 @@ class PluginContainer;
class OrganizerCore;
class Settings;
class ModInfoDialogTab;
-class MainWindow;
+class ModListView;
/**
* this is a larger dialog used to visualise information about the mod.
@@ -52,8 +52,8 @@ class ModInfoDialog : public MOBase::TutorableDialog
public:
ModInfoDialog(
- MainWindow* mw, OrganizerCore* core, PluginContainer* plugin,
- ModInfo::Ptr mod);
+ OrganizerCore& core, PluginContainer& plugin,
+ ModInfo::Ptr mod, ModListView* view);
~ModInfoDialog();
@@ -71,6 +71,10 @@ signals:
//
void originModified(int originID);
+ // emitted when the mod of the dialog is changed
+ //
+ void modChanged(unsigned int modIndex);
+
protected:
// forwards to tryClose()
//
@@ -115,10 +119,10 @@ private:
};
std::unique_ptr<Ui::ModInfoDialog> ui;
- MainWindow* m_mainWindow;
+ OrganizerCore& m_core;
+ PluginContainer& m_plugin;
+ ModListView* m_modListView;
ModInfo::Ptr m_mod;
- OrganizerCore* m_core;
- PluginContainer* m_plugin;
std::vector<TabInfo> m_tabs;
// initial tab requested by the main window when the dialog is opened; whether
diff --git a/src/modlistview.cpp b/src/modlistview.cpp
index 40959e6d..f2b83beb 100644
--- a/src/modlistview.cpp
+++ b/src/modlistview.cpp
@@ -128,7 +128,7 @@ ModListViewActions& ModListView::actions() const
return *m_actions;
}
-int ModListView::nextMod(int modIndex) const
+std::optional<unsigned int> ModListView::nextMod(unsigned int modIndex) const
{
const QModelIndex start = indexModelToView(m_core->modList()->index(modIndex, 0));
@@ -156,10 +156,10 @@ int ModListView::nextMod(int modIndex) const
return modIndex;
}
- return -1;
+ return {};
}
-int ModListView::prevMod(int modIndex) const
+std::optional<unsigned int> ModListView::prevMod(unsigned int modIndex) const
{
const QModelIndex start = indexModelToView(m_core->modList()->index(modIndex, 0));
@@ -187,7 +187,7 @@ int ModListView::prevMod(int modIndex) const
return modIndex;
}
- return -1;
+ return {};
}
void ModListView::enableAllVisible()
@@ -730,6 +730,7 @@ void ModListView::setup(OrganizerCore& core, CategoryFactory& factory, FilterLis
m_byPriorityProxy->refreshExpandedItems();
}
});
+ connect(selectionModel(), &QItemSelectionModel::selectionChanged, this, &ModListView::onSelectionChanged);
}
void ModListView::setModel(QAbstractItemModel* model)
@@ -848,6 +849,17 @@ void ModListView::onDoubleClicked(const QModelIndex& index)
}
}
+void ModListView::onSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected)
+{
+ if (hasCollapsibleSeparators()) {
+ for (auto& idx : selected.indexes()) {
+ if (idx.parent().isValid() && !isExpanded(idx.parent())) {
+ setExpanded(idx.parent(), true);
+ }
+ }
+ }
+}
+
void ModListView::dragEnterEvent(QDragEnterEvent* event)
{
emit dragEntered(event->mimeData());
diff --git a/src/modlistview.h b/src/modlistview.h
index 1678d01e..c7f4e5f0 100644
--- a/src/modlistview.h
+++ b/src/modlistview.h
@@ -58,11 +58,10 @@ public:
ModListViewActions& actions() const;
// retrieve the next/previous mod in the current view, the given index
- // should be a mod index (not a model row), and the return value will be
- // a mod index or -1 if no mod was found
+ // should be a mod index (not a model row)
//
- int nextMod(int index) const;
- int prevMod(int index) const;
+ std::optional<unsigned int> nextMod(unsigned int index) const;
+ std::optional<unsigned int> prevMod(unsigned int index) const;
// check if the given mod is visible
//
@@ -142,6 +141,7 @@ protected slots:
void onCustomContextMenuRequested(const QPoint& pos);
void onDoubleClicked(const QModelIndex& index);
+ void onSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected);
private:
diff --git a/src/modlistviewactions.cpp b/src/modlistviewactions.cpp
index 2b5bf026..3cc2a841 100644
--- a/src/modlistviewactions.cpp
+++ b/src/modlistviewactions.cpp
@@ -433,8 +433,13 @@ void ModListViewActions::displayModInformation(ModInfo::Ptr modInfo, unsigned in
else {
modInfo->saveMeta();
- ModInfoDialog dialog(m_main, &m_core, &m_core.pluginContainer(), modInfo);
+ ModInfoDialog dialog(m_core, m_core.pluginContainer(), modInfo, m_view);
connect(&dialog, &ModInfoDialog::originModified, this, &ModListViewActions::originModified);
+ connect(&dialog, &ModInfoDialog::modChanged, [=](unsigned int index) {
+ auto idx = m_view->indexModelToView(m_core.modList()->index(index, 0));
+ m_view->selectionModel()->select(idx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+ m_view->scrollTo(idx);
+ });
//Open the tab first if we want to use the standard indexes of the tabs.
if (tab != ModInfoTabIDs::None) {
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 507932e2..17cd80c2 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -15,7 +15,6 @@
#include "profile.h"
#include "credentialsdialog.h"
#include "filedialogmemory.h"
-#include "modinfodialog.h"
#include "spawn.h"
#include "syncoverwritedialog.h"
#include "nxmaccessmanager.h"