Add filesystem widget

This commit is contained in:
2021-04-20 12:00:30 +02:00
parent 47360b5227
commit 1ba6a0ff19
7 changed files with 203 additions and 31 deletions
+36
View File
@@ -0,0 +1,36 @@
#include "filesystemwidget.h"
#include <QSettings>
#include <QVBoxLayout>
FilesystemWidget::FilesystemWidget(QAbstractItemModel *model, QWidget *parent) : QWidget(parent)
, m_model(model)
{
m_listView = new QListView(this);
m_listView->setModel(model);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(m_listView);
setLayout(layout);
connect(m_listView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(fileClicked(QModelIndex)));
}
void FilesystemWidget::setDir(const QString &dir)
{
//m_model->setRootPath(dir);
//m_treeView->setRootIndex(m_model->index(m_model->rootPath()));
}
void FilesystemWidget::selectFile(int row)
{
QModelIndex index = m_model->index(row, 0);
m_listView->selectionModel()->clearSelection();
m_listView->selectionModel()->select(index, QItemSelectionModel::SelectCurrent);
m_listView->scrollTo(index);
}
void FilesystemWidget::fileClicked(const QModelIndex &index)
{
emit fileSelected(index.row());
}
+23
View File
@@ -0,0 +1,23 @@
#ifndef FILESYSTEMWIDGET_H
#define FILESYSTEMWIDGET_H
#include <QWidget>
#include <QFileSystemModel>
#include <QListView>
class FilesystemWidget : public QWidget
{
Q_OBJECT
QListView *m_listView;
QAbstractItemModel *m_model;
public:
explicit FilesystemWidget(QAbstractItemModel *model, QWidget *parent = nullptr);
void setDir(const QString &dir);
private slots:
void selectFile(int row);
void fileClicked(const QModelIndex &index);
signals:
void fileSelected(int row);
};
#endif // FILESYSTEMWIDGET_H
+89 -20
View File
@@ -78,7 +78,7 @@ void Image::imageLoaded(QImage img, void *rawImage, ImageInfoData info)
} }
} }
ImageRingList::ImageRingList(QObject *parent) : QObject(parent) ImageRingList::ImageRingList(QObject *parent) : QAbstractItemModel(parent)
, m_liveMode(false) , m_liveMode(false)
, m_analyzeLevel(None) , m_analyzeLevel(None)
{ {
@@ -118,7 +118,10 @@ bool ImageRingList::setDir(const QString path, const QString &currentFile)
void ImageRingList::setFile(const QString &file) void ImageRingList::setFile(const QString &file)
{ {
QFileInfo info(file); QFileInfo info(file);
setDir(info.absolutePath(), file); if(info.isDir())
setDir(file);
else
setDir(info.absolutePath(), file);
} }
ImagePtr ImageRingList::currentImage() ImagePtr ImageRingList::currentImage()
@@ -180,10 +183,90 @@ AnalyzeLevel ImageRingList::analyzeLevel() const
return m_analyzeLevel; return m_analyzeLevel;
} }
void ImageRingList::loadFile(int row)
{
if(row < m_images.size())
{
m_firstImage = m_currImage = m_lastImage = m_images.begin()+row;
if(m_images.empty())
return;
(*m_currImage)->load();
m_width = DEFAULT_WIDTH<m_images.size()/2 ? DEFAULT_WIDTH : m_images.size()/2;
if(m_liveMode)
m_width = 0;
for(int i=0; i<m_width; i++)
{
m_firstImage = decrement(m_firstImage);
(*m_firstImage)->load();
m_lastImage = increment(m_lastImage);
(*m_lastImage)->load();
}
if(m_lastImage != m_firstImage)
{
QList<ImagePtr>::iterator iter = increment(m_lastImage);
while(m_firstImage != iter)
{
(*iter)->release();
iter = increment(iter);
}
}
}
}
QModelIndex ImageRingList::index(int row, int column, const QModelIndex &parent) const
{
return createIndex(row, column, m_images.at(row).get());
}
QModelIndex ImageRingList::parent(const QModelIndex &child) const
{
return QModelIndex();
}
int ImageRingList::rowCount(const QModelIndex &parent) const
{
if(parent == QModelIndex())
return m_images.size();
else
return 0;
}
int ImageRingList::columnCount(const QModelIndex &parent) const
{
return 1;
}
QVariant ImageRingList::data(const QModelIndex &index, int role) const
{
switch(role)
{
case Qt::DisplayRole:
{
QFileInfo info(m_images.at(index.row())->name());
return info.fileName();
}
default:
return QVariant();
}
}
QVariant ImageRingList::headerData(int section, Qt::Orientation orientation, int role) const
{
if(section==0 && orientation==Qt::Horizontal && role==Qt::DisplayRole)
{
return tr("Name");
}
return QVariant();
}
void ImageRingList::setFiles(const QStringList files, const QString &currentFile) void ImageRingList::setFiles(const QStringList files, const QString &currentFile)
{ {
QThreadPool::globalInstance()->clear(); QThreadPool::globalInstance()->clear();
QThreadPool::globalInstance()->waitForDone(); QThreadPool::globalInstance()->waitForDone();
beginResetModel();
m_images.clear(); m_images.clear();
foreach(const QString &file, files) foreach(const QString &file, files)
{ {
@@ -196,23 +279,8 @@ void ImageRingList::setFiles(const QStringList files, const QString &currentFile
if(index < 0) if(index < 0)
index = 0; index = 0;
m_firstImage = m_currImage = m_lastImage = m_images.begin()+index; endResetModel();
if(m_images.empty()) loadFile(index);
return;
(*m_currImage)->load();
m_width = DEFAULT_WIDTH<m_images.size()/2 ? DEFAULT_WIDTH : m_images.size()/2;
if(m_liveMode)
m_width = 0;
for(int i=0; i<m_width; i++)
{
m_firstImage = decrement(m_firstImage);
(*m_firstImage)->load();
m_lastImage = increment(m_lastImage);
(*m_lastImage)->load();
}
} }
QList<ImagePtr>::iterator ImageRingList::increment(QList<ImagePtr>::iterator iter) QList<ImagePtr>::iterator ImageRingList::increment(QList<ImagePtr>::iterator iter)
@@ -237,6 +305,7 @@ void ImageRingList::imageLoaded(Image *image)
{ {
emit pixmapLoaded(image); emit pixmapLoaded(image);
emit infoLoaded(image->info()); emit infoLoaded(image->info());
emit currentImageChanged(m_currImage-m_images.begin());
} }
} }
@@ -248,5 +317,5 @@ void ImageRingList::dirChanged(QString dir)
currentFile = (*m_currImage)->name(); currentFile = (*m_currImage)->name();
setDir(dir, currentFile); setDir(dir, currentFile);
emit currentImageChanged(); emit currentImageChanged(m_currImage-m_images.begin());
} }
+10 -2
View File
@@ -39,7 +39,7 @@ protected slots:
typedef std::shared_ptr<Image> ImagePtr; typedef std::shared_ptr<Image> ImagePtr;
class ImageRingList : public QObject class ImageRingList : public QAbstractItemModel
{ {
Q_OBJECT Q_OBJECT
int m_width; int m_width;
@@ -63,6 +63,14 @@ public:
void setFindPeaks(bool findPeaks); void setFindPeaks(bool findPeaks);
void setFindStars(bool findStars); void setFindStars(bool findStars);
AnalyzeLevel analyzeLevel() const; AnalyzeLevel analyzeLevel() const;
void loadFile(int row);
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &child) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
protected: protected:
void setFiles(const QStringList files, const QString &currentFile = QString()); void setFiles(const QStringList files, const QString &currentFile = QString());
QList<ImagePtr>::iterator increment(QList<ImagePtr>::iterator iter); QList<ImagePtr>::iterator increment(QList<ImagePtr>::iterator iter);
@@ -70,7 +78,7 @@ protected:
signals: signals:
void pixmapLoaded(Image *image); void pixmapLoaded(Image *image);
void infoLoaded(ImageInfoData info); void infoLoaded(ImageInfoData info);
void currentImageChanged(); void currentImageChanged(int index);
protected slots: protected slots:
void imageLoaded(Image *image); void imageLoaded(Image *image);
void dirChanged(QString dir); void dirChanged(QString dir);
+38 -8
View File
@@ -48,20 +48,29 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
connect(stretchPanel, SIGNAL(stretchChanged(int)), m_imageGL->imageWidget(), SLOT(setStrech(int))); connect(stretchPanel, SIGNAL(stretchChanged(int)), m_imageGL->imageWidget(), SLOT(setStrech(int)));
connect(stretchPanel, SIGNAL(paramChanged(float)), m_imageGL->imageWidget(), SLOT(setStretchParam(float))); connect(stretchPanel, SIGNAL(paramChanged(float)), m_imageGL->imageWidget(), SLOT(setStretchParam(float)));
m_ringList = new ImageRingList(this);
m_filesystem = new FilesystemWidget(m_ringList, this);
connect(m_filesystem, SIGNAL(fileSelected(int)), this, SLOT(loadFile(int)));
QDockWidget *stretchDock = new QDockWidget(tr("Stretch"), this); QDockWidget *stretchDock = new QDockWidget(tr("Stretch"), this);
stretchDock->setWidget(stretchPanel); stretchDock->setWidget(stretchPanel);
stretchDock->setObjectName("strechDock"); stretchDock->setObjectName("strechDock");
addDockWidget(Qt::LeftDockWidgetArea, stretchDock); addDockWidget(Qt::TopDockWidgetArea, stretchDock);
QDockWidget *filesystemDock = new QDockWidget(tr("Filesystem"), this);
filesystemDock->setWidget(m_filesystem);
filesystemDock->setObjectName("filesystemDock");
addDockWidget(Qt::LeftDockWidgetArea, filesystemDock);
setWindowTitle(tr("Tenmon")); setWindowTitle(tr("Tenmon"));
m_ringList = new ImageRingList(this);
connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), this, SLOT(pixmapLoaded(Image*))); connect(m_ringList, SIGNAL(pixmapLoaded(Image*)), this, SLOT(pixmapLoaded(Image*)));
connect(m_ringList, SIGNAL(currentImageChanged()), this, SLOT(updateWindowTitle())); connect(m_ringList, SIGNAL(currentImageChanged(int)), this, SLOT(updateWindowTitle()));
connect(m_ringList, SIGNAL(infoLoaded(ImageInfoData)), m_info, SLOT(setInfo(ImageInfoData))); connect(m_ringList, SIGNAL(infoLoaded(ImageInfoData)), m_info, SLOT(setInfo(ImageInfoData)));
connect(m_ringList, SIGNAL(currentImageChanged(int)), m_filesystem, SLOT(selectFile(int)));
QMenu *fileMenu = new QMenu(tr("File"), this); QMenu *fileMenu = new QMenu(tr("File"), this);
fileMenu->addAction(tr("Open"), this, SLOT(openFile()), QKeySequence("Ctrl+O")); fileMenu->addAction(tr("Open"), this, SLOT(loadFile()), QKeySequence("Ctrl+O"));
fileMenu->addAction(tr("Copy marked files"), this, SLOT(copyMarked())); fileMenu->addAction(tr("Copy marked files"), this, SLOT(copyMarked()));
fileMenu->addAction(tr("Save as"), this, SLOT(saveAs()), QKeySequence("Ctrl+S")); fileMenu->addAction(tr("Save as"), this, SLOT(saveAs()), QKeySequence("Ctrl+S"));
QAction *liveModeAction = fileMenu->addAction(tr("Live mode"), this, SLOT(liveMode(bool))); QAction *liveModeAction = fileMenu->addAction(tr("Live mode"), this, SLOT(liveMode(bool)));
@@ -117,6 +126,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
QMenu *dockMenu = new QMenu(tr("Docks"), this); QMenu *dockMenu = new QMenu(tr("Docks"), this);
dockMenu->addAction(infoDock->toggleViewAction()); dockMenu->addAction(infoDock->toggleViewAction());
dockMenu->addAction(stretchDock->toggleViewAction()); dockMenu->addAction(stretchDock->toggleViewAction());
dockMenu->addAction(filesystemDock->toggleViewAction());
menuBar()->addMenu(dockMenu); menuBar()->addMenu(dockMenu);
setupSigterm(); setupSigterm();
@@ -128,6 +138,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
if(standardLocations.size()) if(standardLocations.size())
_lastDir = standardLocations.first(); _lastDir = standardLocations.first();
_lastDir = settings.value("mainwindow/lastdir", _lastDir).toString();
m_filesystem->setDir(_lastDir);
QStringList args = QCoreApplication::arguments(); QStringList args = QCoreApplication::arguments();
args.removeFirst(); args.removeFirst();
for(auto &arg : args) for(auto &arg : args)
@@ -138,6 +151,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
m_ringList->setFile(info.canonicalFilePath()); m_ringList->setFile(info.canonicalFilePath());
updateWindowTitle(); updateWindowTitle();
_lastDir = info.absoluteDir().absolutePath(); _lastDir = info.absoluteDir().absolutePath();
settings.setValue("mainwindow/lastdir", _lastDir);
break; break;
} }
} }
@@ -229,18 +243,34 @@ void MainWindow::pixmapLoaded(Image *image)
} }
} }
void MainWindow::openFile() void MainWindow::loadFile()
{ {
QString file = QFileDialog::getOpenFileName(this, tr("Open file"), _lastDir, tr("Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS)")); QString file = QFileDialog::getOpenFileName(this, tr("Open file"), _lastDir, tr("Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS)"));
if(!file.isEmpty()) loadFile(file);
}
void MainWindow::loadFile(const QString path)
{
if(!path.isEmpty())
{ {
QFileInfo info(file); QFileInfo info(path);
m_ringList->setFile(info.canonicalFilePath()); m_ringList->setFile(info.canonicalFilePath());
updateWindowTitle(); updateWindowTitle();
_lastDir = QFileInfo(file).absoluteDir().absolutePath(); if(info.isDir())
_lastDir = info.absolutePath();
else
_lastDir = info.canonicalPath();
QSettings settings;
settings.setValue("mainwindow/lastdir", _lastDir);
m_filesystem->setDir(_lastDir);
} }
} }
void MainWindow::loadFile(int row)
{
m_ringList->loadFile(row);
}
void MainWindow::saveAs() void MainWindow::saveAs()
{ {
QString file = QFileDialog::getSaveFileName(this, tr("Save as"), _lastDir, tr("Images (*.jpg *.png *.JPG *.PNG)")); QString file = QFileDialog::getSaveFileName(this, tr("Save as"), _lastDir, tr("Images (*.jpg *.png *.JPG *.PNG)"));
+5 -1
View File
@@ -8,6 +8,7 @@
#include "database.h" #include "database.h"
#include "imageinfo.h" #include "imageinfo.h"
#include "imagescrollareagl.h" #include "imagescrollareagl.h"
#include "filesystemwidget.h"
class MainWindow : public QMainWindow class MainWindow : public QMainWindow
{ {
@@ -17,6 +18,7 @@ class MainWindow : public QMainWindow
ImageRingList *m_ringList; ImageRingList *m_ringList;
Database *m_database; Database *m_database;
ImageInfo *m_info; ImageInfo *m_info;
FilesystemWidget *m_filesystem;
static int socketPair[2]; static int socketPair[2];
QSocketNotifier *socketNotifier; QSocketNotifier *socketNotifier;
QString _lastDir; QString _lastDir;
@@ -34,7 +36,9 @@ protected slots:
void socketNotify(); void socketNotify();
void updateWindowTitle(); void updateWindowTitle();
void pixmapLoaded(Image *image); void pixmapLoaded(Image *image);
void openFile(); void loadFile();
void loadFile(const QString path);
void loadFile(int row);
void saveAs(); void saveAs();
void markImage(); void markImage();
void unmarkImage(); void unmarkImage();
+2
View File
@@ -23,6 +23,7 @@ win32:LIBS += -LC:\msys64\mingw64\lib -LC:\msys64\mingw64\bin
win32:INCLUDEPATH += C:\msys64\mingw64\include\ C:\msys64\mingw64\include\cfitsio win32:INCLUDEPATH += C:\msys64\mingw64\include\ C:\msys64\mingw64\include\cfitsio
SOURCES += main.cpp\ SOURCES += main.cpp\
filesystemwidget.cpp \
mainwindow.cpp \ mainwindow.cpp \
imagescrollarea.cpp \ imagescrollarea.cpp \
imageringlist.cpp \ imageringlist.cpp \
@@ -35,6 +36,7 @@ SOURCES += main.cpp\
rawimage.cpp rawimage.cpp
HEADERS += mainwindow.h \ HEADERS += mainwindow.h \
filesystemwidget.h \
imagescrollarea.h \ imagescrollarea.h \
imageringlist.h \ imageringlist.h \
database.h \ database.h \