diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp index 804acc2..aa4e680 100644 --- a/filesystemwidget.cpp +++ b/filesystemwidget.cpp @@ -1,6 +1,10 @@ #include "filesystemwidget.h" #include #include +#include +#include +#include +#include FilesystemWidget::FilesystemWidget(QAbstractItemModel *model, QWidget *parent) : QWidget(parent) , m_model(model) @@ -34,3 +38,62 @@ void FilesystemWidget::fileClicked(const QModelIndex &index) { emit fileSelected(index.row()); } + +Filetree::Filetree(QWidget *parent) : QTreeView(parent) +{ + QSettings settings; + m_rootDir = settings.value("filetree/rootDir", QDir::homePath()).toString(); + m_fileSystemModel = new QFileSystemModel(this); + m_fileSystemModel->setRootPath(m_rootDir); + m_fileSystemModel->setNameFilters({"*.fits", "*.fit", "*.xisf", "*.jpg", "*.jpeg", "*.png"}); + m_fileSystemModel->setNameFilterDisables(false); + setModel(m_fileSystemModel); + setRootIndex(m_fileSystemModel->index(m_rootDir)); + header()->restoreState(settings.value("filetree/header").toByteArray()); +} + +Filetree::~Filetree() +{ + QSettings settings; + settings.setValue("filetree/rootDir", m_rootDir); + settings.setValue("filetree/header", header()->saveState()); +} + +void Filetree::contextMenuEvent(QContextMenuEvent *event) +{ + QModelIndex index = indexAt(event->pos()); + QFileInfo info = m_fileSystemModel->fileInfo(index); + QMenu menu; + QAction *open = nullptr; + QAction *setRoot = nullptr; + + if(info.isFile()) + open = menu.addAction(tr("Open")); + + if(info.isDir()) + setRoot = menu.addAction("Set as root"); + + QAction *resetRoot = menu.addAction("Reset root"); + QAction *goUp = menu.addAction("Go up"); + + QAction *a = menu.exec(event->globalPos()); + if(a == open) + { + emit fileSelected(m_fileSystemModel->filePath(index)); + } + if(a == setRoot && index.isValid()) + { + setRootIndex(index); + m_rootDir = m_fileSystemModel->filePath(index); + } + else if(a == resetRoot) + { + setRootIndex(QModelIndex()); + m_rootDir = QDir::rootPath(); + } + else if(a == goUp) + { + setRootIndex(rootIndex().parent()); + m_rootDir = m_fileSystemModel->filePath(rootIndex().parent()); + } +} diff --git a/filesystemwidget.h b/filesystemwidget.h index ae455b7..0999133 100644 --- a/filesystemwidget.h +++ b/filesystemwidget.h @@ -4,6 +4,7 @@ #include #include #include +#include class FilesystemWidget : public QWidget { @@ -20,4 +21,17 @@ signals: void fileSelected(int row); }; +class Filetree : public QTreeView +{ + Q_OBJECT + QFileSystemModel *m_fileSystemModel; + QString m_rootDir; +public: + explicit Filetree(QWidget *parent = nullptr); + ~Filetree(); + void contextMenuEvent(QContextMenuEvent *event); +signals: + void fileSelected(const QString &path); +}; + #endif // FILESYSTEMWIDGET_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 8a2ce57..603fb57 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -55,6 +55,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) m_filesystem = new FilesystemWidget(m_ringList, this); connect(m_filesystem, SIGNAL(fileSelected(int)), this, SLOT(loadFile(int))); + m_filetree = new Filetree(this); + connect(m_filetree, &Filetree::fileSelected, this, static_cast(&MainWindow::loadFile)); + m_database = new Database(this); if(!m_database->init()) QMessageBox::critical(this, tr("Can't open DB"), tr("Can't open SQLITE database")); @@ -75,6 +78,12 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) databaseViewDock->hide(); addDockWidget(Qt::BottomDockWidgetArea, databaseViewDock); + QDockWidget *filetreeDock = new QDockWidget(tr("File tree"), this); + filetreeDock->setWidget(m_filetree); + filetreeDock->setObjectName("filetreeDock"); + databaseViewDock->hide(); + addDockWidget(Qt::LeftDockWidgetArea, filetreeDock); + setWindowTitle(tr("Tenmon")); connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), this, SLOT(pixmapLoaded(Image*))); @@ -156,6 +165,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) dockMenu->addAction(m_stretchPanel->toggleViewAction()); dockMenu->addAction(filesystemDock->toggleViewAction()); dockMenu->addAction(databaseViewDock->toggleViewAction()); + dockMenu->addAction(filetreeDock->toggleViewAction()); menuBar()->addMenu(dockMenu); QMenu *helpMenu = menuBar()->addMenu(tr("Help")); diff --git a/mainwindow.h b/mainwindow.h index 7de9ad6..74fe6d6 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -22,6 +22,7 @@ class MainWindow : public QMainWindow Database *m_database; ImageInfo *m_info; FilesystemWidget *m_filesystem; + Filetree *m_filetree; DataBaseView *m_databaseView; static int socketPair[2]; QSocketNotifier *socketNotifier;