aboutsummaryrefslogtreecommitdiff
path: root/libs/preview_bsa/src/simplefiletreemodel.cpp
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-02-11 02:37:39 -0600
commit7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch)
tree27fb39be241fdb5ac2734c574de678977d1856d0 /libs/preview_bsa/src/simplefiletreemodel.cpp
Fluorine Manager: full Linux port of Mod Organizer 2
Complete native Linux port with FUSE-based virtual filesystem, Proton/umu-run integration, and Flatpak packaging. Key features: - FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak) - Proton/GE-Proton/umu-run launcher with env var forwarding - Flatpak support (sandbox-aware VFS, NXM handler, umu-run) - Wine prefix management UI - Case-insensitive path resolution for Linux filesystems - QSettings-safe INI handling (avoids Bethesda INI corruption) - Portable instance support with auto-generated launcher scripts Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'libs/preview_bsa/src/simplefiletreemodel.cpp')
-rw-r--r--libs/preview_bsa/src/simplefiletreemodel.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/libs/preview_bsa/src/simplefiletreemodel.cpp b/libs/preview_bsa/src/simplefiletreemodel.cpp
new file mode 100644
index 0000000..46dcaf7
--- /dev/null
+++ b/libs/preview_bsa/src/simplefiletreemodel.cpp
@@ -0,0 +1,150 @@
+
+/*
+ simplefiletreemodel.cpp
+
+ Provides a simple tree model for files and folders
+*/
+
+#include "simplefiletreemodel.h"
+#include "simplefiletreeitem.h"
+
+#include <QDir>
+#include <QFileIconProvider>
+#include <QStringList>
+
+SimpleFileTreeModel::SimpleFileTreeModel(const QStringList& data, QObject* parent)
+ : QAbstractItemModel(parent)
+{
+ QFileIconProvider* provider = new QFileIconProvider();
+ m_FolderIcon = provider->icon(QFileIconProvider::Folder);
+ m_FileIcon = provider->icon(QFileIconProvider::File);
+ delete provider;
+ m_RootItem = new SimpleFileTreeItem({tr("File Name")});
+ setupModelData(data, m_RootItem);
+}
+
+SimpleFileTreeModel::~SimpleFileTreeModel()
+{
+ delete m_RootItem;
+}
+
+int SimpleFileTreeModel::columnCount(const QModelIndex& parent) const
+{
+ if (parent.isValid())
+ return static_cast<SimpleFileTreeItem*>(parent.internalPointer())->columnCount();
+ return m_RootItem->columnCount();
+}
+
+QVariant SimpleFileTreeModel::data(const QModelIndex& index, int role) const
+{
+ if (!index.isValid())
+ return QVariant();
+
+ SimpleFileTreeItem* item = static_cast<SimpleFileTreeItem*>(index.internalPointer());
+
+ if (role == Qt::DecorationRole) {
+ if (item->childCount() > 0) {
+ return m_FolderIcon;
+ } else {
+ return m_FileIcon;
+ }
+ }
+
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ return item->data(index.column());
+}
+
+Qt::ItemFlags SimpleFileTreeModel::flags(const QModelIndex& index) const
+{
+ if (!index.isValid())
+ return Qt::NoItemFlags;
+
+ return QAbstractItemModel::flags(index);
+}
+
+QVariant SimpleFileTreeModel::headerData(int section, Qt::Orientation orientation,
+ int role) const
+{
+ if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
+ return m_RootItem->data(section);
+
+ return QVariant();
+}
+
+QModelIndex SimpleFileTreeModel::index(int row, int column,
+ const QModelIndex& parent) const
+{
+ if (!hasIndex(row, column, parent))
+ return QModelIndex();
+
+ SimpleFileTreeItem* parentItem;
+
+ if (!parent.isValid())
+ parentItem = m_RootItem;
+ else
+ parentItem = static_cast<SimpleFileTreeItem*>(parent.internalPointer());
+
+ SimpleFileTreeItem* childItem = parentItem->child(row);
+ if (childItem)
+ return createIndex(row, column, childItem);
+ return QModelIndex();
+}
+
+QModelIndex SimpleFileTreeModel::parent(const QModelIndex& index) const
+{
+ if (!index.isValid())
+ return QModelIndex();
+
+ SimpleFileTreeItem* childItem =
+ static_cast<SimpleFileTreeItem*>(index.internalPointer());
+ SimpleFileTreeItem* parentItem = childItem->parentItem();
+
+ if (parentItem == m_RootItem)
+ return QModelIndex();
+
+ return createIndex(parentItem->row(), 0, parentItem);
+}
+
+int SimpleFileTreeModel::rowCount(const QModelIndex& parent) const
+{
+ SimpleFileTreeItem* parentItem;
+ if (parent.column() > 0)
+ return 0;
+
+ if (!parent.isValid())
+ parentItem = m_RootItem;
+ else
+ parentItem = static_cast<SimpleFileTreeItem*>(parent.internalPointer());
+
+ return parentItem->childCount();
+}
+
+void SimpleFileTreeModel::setupModelData(const QStringList& lines, SimpleFileTreeItem*)
+{
+ for (QString line : lines) {
+ auto fullPath = QDir::cleanPath(line);
+ QStringList lineEntries = fullPath.split("/");
+ auto currentParent = m_RootItem;
+
+ for (int i = 0; i < lineEntries.count(); i++) {
+ QString currentEntryName = lineEntries[i];
+
+ // check if item was already added
+ SimpleFileTreeItem* currentEntry = currentParent->childByName(currentEntryName);
+
+ // add tree item if not found
+ if (currentEntry == nullptr) {
+ QVector<QVariant> columnData;
+ columnData.reserve(m_ColumnCount);
+ columnData << currentEntryName;
+ currentEntry = new SimpleFileTreeItem(columnData, currentParent);
+ currentParent->appendChild(currentEntryName, currentEntry);
+ }
+
+ // as we go deeper into the path
+ currentParent = currentEntry;
+ }
+ }
+}