diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
| commit | 7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch) | |
| tree | 27fb39be241fdb5ac2734c574de678977d1856d0 /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.cpp | 150 |
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; + } + } +} |
