diff options
| author | isanae <14251494+isanae@users.noreply.github.com> | 2020-02-09 08:52:03 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-09 08:52:03 -0500 |
| commit | 1f1f99f253f981ae3d11e9df177a144d00dbce0e (patch) | |
| tree | 01d38125329508f5628f9221f797e303180c8fc3 /src/datatab.cpp | |
| parent | 718c2a56f91f824c5eab69d8cc16294f77243370 (diff) | |
| parent | 3a80685189967fbf4cfa002ac2b8a4fa421306ca (diff) | |
Merge pull request #994 from isanae/generic-file-list
New file tree
Diffstat (limited to 'src/datatab.cpp')
| -rw-r--r-- | src/datatab.cpp | 153 |
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(); +} |
