summaryrefslogtreecommitdiff
path: root/src/datatab.cpp
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2020-02-09 08:52:03 -0500
committerGitHub <noreply@github.com>2020-02-09 08:52:03 -0500
commit1f1f99f253f981ae3d11e9df177a144d00dbce0e (patch)
tree01d38125329508f5628f9221f797e303180c8fc3 /src/datatab.cpp
parent718c2a56f91f824c5eab69d8cc16294f77243370 (diff)
parent3a80685189967fbf4cfa002ac2b8a4fa421306ca (diff)
Merge pull request #994 from isanae/generic-file-list
New file tree
Diffstat (limited to 'src/datatab.cpp')
-rw-r--r--src/datatab.cpp153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/datatab.cpp b/src/datatab.cpp
new file mode 100644
index 00000000..f263c2c6
--- /dev/null
+++ b/src/datatab.cpp
@@ -0,0 +1,153 @@
+#include "datatab.h"
+#include "ui_mainwindow.h"
+#include "settings.h"
+#include "organizercore.h"
+#include "directoryentry.h"
+#include "messagedialog.h"
+#include "filetree.h"
+#include "filetreemodel.h"
+#include <log.h>
+#include <report.h>
+
+using namespace MOShared;
+using namespace MOBase;
+
+// in mainwindow.cpp
+QString UnmanagedModName();
+
+
+DataTab::DataTab(
+ OrganizerCore& core, PluginContainer& pc,
+ QWidget* parent, Ui::MainWindow* mwui) :
+ m_core(core), m_pluginContainer(pc), m_parent(parent),
+ ui{
+ mwui->dataTabRefresh, mwui->dataTree,
+ mwui->dataTabShowOnlyConflicts, mwui->dataTabShowFromArchives},
+ m_firstActivation(true)
+{
+ m_filetree.reset(new FileTree(core, m_pluginContainer, ui.tree));
+ m_filter.setEdit(mwui->dataTabFilter);
+ m_filter.setList(mwui->dataTree);
+ m_filter.setUseSourceSort(true);
+ m_filter.setFilterColumn(FileTreeModel::FileName);
+
+ if (auto* m=m_filter.proxyModel()) {
+ m->setDynamicSortFilter(false);
+ }
+
+ connect(
+ &m_filter, &FilterWidget::aboutToChange,
+ [&]{ ensureFullyLoaded(); });
+
+ connect(
+ ui.refresh, &QPushButton::clicked,
+ [&]{ onRefresh(); });
+
+ connect(
+ ui.conflicts, &QCheckBox::toggled,
+ [&]{ onConflicts(); });
+
+ connect(
+ ui.archives, &QCheckBox::toggled,
+ [&]{ onArchives(); });
+
+ connect(
+ m_filetree.get(), &FileTree::executablesChanged,
+ this, &DataTab::executablesChanged);
+
+ connect(
+ m_filetree.get(), &FileTree::originModified,
+ this, &DataTab::originModified);
+
+ connect(
+ m_filetree.get(), &FileTree::displayModInformation,
+ this, &DataTab::displayModInformation);
+}
+
+void DataTab::saveState(Settings& s) const
+{
+ s.geometry().saveState(ui.tree->header());
+ s.widgets().saveChecked(ui.conflicts);
+ s.widgets().saveChecked(ui.archives);
+}
+
+void DataTab::restoreState(const Settings& s)
+{
+ s.geometry().restoreState(ui.tree->header());
+
+ // prior to 2.3, the list was not sortable, and this remembered in the
+ // widget state, for whatever reason
+ ui.tree->setSortingEnabled(true);
+
+ s.widgets().restoreChecked(ui.conflicts);
+ s.widgets().restoreChecked(ui.archives);
+}
+
+void DataTab::activated()
+{
+ if (m_firstActivation) {
+ m_firstActivation = false;
+ updateTree();
+ }
+}
+
+void DataTab::onRefresh()
+{
+ if (QGuiApplication::keyboardModifiers() & Qt::ShiftModifier) {
+ m_filetree->model()->setEnabled(false);
+ m_filetree->clear();
+ }
+
+ m_core.refreshDirectoryStructure();
+}
+
+void DataTab::updateTree()
+{
+ m_filetree->model()->setEnabled(true);
+ m_filetree->refresh();
+
+ if (!m_filter.empty()) {
+ ensureFullyLoaded();
+
+ if (auto* m=m_filter.proxyModel()) {
+ m->invalidate();
+ }
+ }
+}
+
+void DataTab::ensureFullyLoaded()
+{
+ if (!m_filetree->fullyLoaded()) {
+ m_filter.proxyModel()->setRecursiveFilteringEnabled(false);
+ m_filetree->ensureFullyLoaded();
+ m_filter.proxyModel()->setRecursiveFilteringEnabled(true);
+ }
+}
+
+void DataTab::onConflicts()
+{
+ updateOptions();
+}
+
+void DataTab::onArchives()
+{
+ updateOptions();
+}
+
+void DataTab::updateOptions()
+{
+ using M = FileTreeModel;
+
+ M::Flags flags = M::NoFlags;
+
+ if (ui.conflicts->isChecked()) {
+ flags |= M::ConflictsOnly | M::PruneDirectories;
+ }
+
+ if (ui.archives->isChecked()) {
+ flags |= M::Archives;
+ }
+
+ m_filetree->model()->setFlags(flags);
+ updateTree();
+}