Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f9f005e7ea | |||
| 5ba6b4863c | |||
| 6c7e078340 |
+1
-2
@@ -34,7 +34,6 @@ set(TENMON_SRC
|
|||||||
src/database.cpp src/database.h
|
src/database.cpp src/database.h
|
||||||
src/databaseview.cpp src/databaseview.h
|
src/databaseview.cpp src/databaseview.h
|
||||||
src/delete.cpp
|
src/delete.cpp
|
||||||
src/filemanager.h src/filemanager.cpp src/filemanager.ui
|
|
||||||
src/filesystemwidget.cpp src/filesystemwidget.h
|
src/filesystemwidget.cpp src/filesystemwidget.h
|
||||||
src/histogram.cpp src/histogram.h
|
src/histogram.cpp src/histogram.h
|
||||||
src/httpdownloader.h src/httpdownloader.cpp
|
src/httpdownloader.h src/httpdownloader.cpp
|
||||||
@@ -78,7 +77,7 @@ endif()
|
|||||||
qt_add_executable(tenmon WIN32 MACOSX_BUNDLE ${tenmon_ICON} ${TENMON_SRC})
|
qt_add_executable(tenmon WIN32 MACOSX_BUNDLE ${tenmon_ICON} ${TENMON_SRC})
|
||||||
|
|
||||||
find_path(FITS_INCLUDE fitsio2.h PATH_SUFFIXES cfitsio REQUIRED)
|
find_path(FITS_INCLUDE fitsio2.h PATH_SUFFIXES cfitsio REQUIRED)
|
||||||
target_include_directories(tenmon PRIVATE ${FITS_INCLUDE} ${CMAKE_BINARY_DIR} ${libXISF_SOURCE_DIR} "src")
|
target_include_directories(tenmon PRIVATE ${FITS_INCLUDE} ${CMAKE_BINARY_DIR} ${libXISF_SOURCE_DIR})
|
||||||
|
|
||||||
option(COLOR_MANAGMENT "Enable sRGB framebuffer support for gamma correct images and color profiles support" ON)
|
option(COLOR_MANAGMENT "Enable sRGB framebuffer support for gamma correct images and color profiles support" ON)
|
||||||
if(COLOR_MANAGMENT)
|
if(COLOR_MANAGMENT)
|
||||||
|
|||||||
+1
-1
Submodule libXISF updated: fa39440b9e...9a32138f6a
@@ -118,7 +118,7 @@
|
|||||||
</release>
|
</release>
|
||||||
<release version="20240816" date="2024-08-16">
|
<release version="20240816" date="2024-08-16">
|
||||||
<description>
|
<description>
|
||||||
Fix saving image
|
<p>Fix saving image</p>
|
||||||
</description>
|
</description>
|
||||||
</release>
|
</release>
|
||||||
<release version="20240616" date="2024-06-16">
|
<release version="20240616" date="2024-06-16">
|
||||||
|
|||||||
+4
-5
@@ -181,7 +181,7 @@ int Database::checkVersion(QSqlDatabase &db)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QStringList nameFilters = {"*.fit", "*.fits", "*.fz", "*.fts", "*.xisf"};
|
static QStringList nameFilters = {"*.fit", "*.fits", "*.fz", "*.xisf"};
|
||||||
|
|
||||||
static int countFiles(const QDir &dir, QStringList &scannedDirs)
|
static int countFiles(const QDir &dir, QStringList &scannedDirs)
|
||||||
{
|
{
|
||||||
@@ -332,10 +332,10 @@ bool Database::indexFile(const QFileInfo &file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ok = false;
|
bool ok;
|
||||||
if(isXISF(file.suffix()))
|
if(filePath.endsWith(".xisf", Qt::CaseInsensitive))
|
||||||
ok = readXISFHeader(filePath, info);
|
ok = readXISFHeader(filePath, info);
|
||||||
else if(isFITS(file.suffix()))
|
else
|
||||||
ok = readFITSHeader(filePath, info);
|
ok = readFITSHeader(filePath, info);
|
||||||
|
|
||||||
qlonglong last_id = -1;
|
qlonglong last_id = -1;
|
||||||
@@ -376,7 +376,6 @@ bool Database::indexFile(const QFileInfo &file)
|
|||||||
QVariantList file_id, keys, values, comments;
|
QVariantList file_id, keys, values, comments;
|
||||||
for(const auto &record : info.fitsHeader)
|
for(const auto &record : info.fitsHeader)
|
||||||
{
|
{
|
||||||
if(record.xisf && record.key.startsWith("PCL:"))continue;
|
|
||||||
file_id << last_id;
|
file_id << last_id;
|
||||||
keys << QString(record.key);
|
keys << QString(record.key);
|
||||||
values << record.value.toString();
|
values << record.value.toString();
|
||||||
|
|||||||
@@ -1,215 +0,0 @@
|
|||||||
#include "filemanager.h"
|
|
||||||
#include "ui_filemanager.h"
|
|
||||||
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QStandardPaths>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include "loadimage.h"
|
|
||||||
|
|
||||||
FileManager::FileManager(const QSet<QString> &openFilter, QWidget *parent) : QMainWindow(parent)
|
|
||||||
,ui(new Ui::FileManager)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
|
|
||||||
ui->leftTab->setOpenFilter(openFilter);
|
|
||||||
ui->rightTab->setOpenFilter(openFilter);
|
|
||||||
|
|
||||||
connect(ui->leftTab, &DirView::dirChanged, ui->leftPath, &QLineEdit::setText);
|
|
||||||
connect(ui->rightTab, &DirView::dirChanged, ui->rightPath, &QLineEdit::setText);
|
|
||||||
connect(ui->leftTab, &DirView::openFile, this, &FileManager::openFile);
|
|
||||||
connect(ui->rightTab, &DirView::openFile, this, &FileManager::openFile);
|
|
||||||
|
|
||||||
QStringList standardLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
|
|
||||||
QString picturesPath;
|
|
||||||
if(standardLocations.size())
|
|
||||||
picturesPath = standardLocations.first();
|
|
||||||
|
|
||||||
QSettings settings;
|
|
||||||
ui->leftTab->setDir(settings.value("filemanager/leftTabPath", picturesPath).toString());
|
|
||||||
ui->leftTab->header()->restoreState(settings.value("filemanager/leftTabHeader").toByteArray());
|
|
||||||
ui->rightTab->setDir(settings.value("filemanager/rightTabPath", picturesPath).toString());
|
|
||||||
ui->rightTab->header()->restoreState(settings.value("filemanager/rightTabHeader").toByteArray());
|
|
||||||
restoreGeometry(settings.value("filemanager/geometry").toByteArray());
|
|
||||||
|
|
||||||
setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
}
|
|
||||||
|
|
||||||
FileManager::~FileManager()
|
|
||||||
{
|
|
||||||
QSettings settings;
|
|
||||||
settings.setValue("filemanager/leftTabPath", ui->leftTab->dir());
|
|
||||||
settings.setValue("filemanager/leftTabHeader", ui->leftTab->header()->saveState());
|
|
||||||
settings.setValue("filemanager/rightTabPath", ui->rightTab->dir());
|
|
||||||
settings.setValue("filemanager/rightTabHeader", ui->rightTab->header()->saveState());
|
|
||||||
settings.setValue("filemanager/geometry", saveGeometry());
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
QCache<QString, ImageInfoData>* DirFileSystemModel::getCacheInstance()
|
|
||||||
{
|
|
||||||
static bool init = true;
|
|
||||||
static QCache<QString, ImageInfoData> cache;
|
|
||||||
if(!init)
|
|
||||||
{
|
|
||||||
cache.setMaxCost(10000);
|
|
||||||
init = false;
|
|
||||||
}
|
|
||||||
return &cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
DirFileSystemModel::DirFileSystemModel(QObject *parent) : QFileSystemModel(parent)
|
|
||||||
{
|
|
||||||
_cache = getCacheInstance();
|
|
||||||
setFilter(QDir::AllEntries | QDir::NoDot);
|
|
||||||
_fitsKeywords = {"OBJECT", "RA", "DEC"};
|
|
||||||
}
|
|
||||||
|
|
||||||
void DirFileSystemModel::setDir(const QString &path)
|
|
||||||
{
|
|
||||||
_dir = index(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString DirFileSystemModel::dir() const
|
|
||||||
{
|
|
||||||
return fileInfo(_dir).canonicalFilePath();
|
|
||||||
}
|
|
||||||
|
|
||||||
Qt::ItemFlags DirFileSystemModel::flags(const QModelIndex &index) const
|
|
||||||
{
|
|
||||||
return QFileSystemModel::flags(index) & ~Qt::ItemIsEditable;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DirFileSystemModel::columnCount(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
return QFileSystemModel::columnCount(parent) + _fitsKeywords.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant DirFileSystemModel::data(const QModelIndex &index, int role) const
|
|
||||||
{
|
|
||||||
if(index.column() >= QFileSystemModel::columnCount() && role == Qt::DisplayRole)
|
|
||||||
{
|
|
||||||
QFileInfo info = fileInfo(index);
|
|
||||||
QString path = info.canonicalFilePath();
|
|
||||||
QString suffix = info.suffix();
|
|
||||||
ImageInfoData *infoData;
|
|
||||||
if(_cache->contains(path))
|
|
||||||
{
|
|
||||||
infoData = _cache->object(path);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
infoData = new ImageInfoData;
|
|
||||||
if(_loadFitsKeywords)
|
|
||||||
{
|
|
||||||
if(isFITS(suffix))
|
|
||||||
readFITSHeader(path, *infoData);
|
|
||||||
else if(isXISF(suffix))
|
|
||||||
readXISFHeader(path, *infoData);
|
|
||||||
}
|
|
||||||
_cache->insert(path, infoData);
|
|
||||||
}
|
|
||||||
int column = index.column() - QFileSystemModel::columnCount();
|
|
||||||
if(column < _fitsKeywords.size())
|
|
||||||
{
|
|
||||||
const QString &key = _fitsKeywords.at(column);
|
|
||||||
for(auto &record : infoData->fitsHeader)
|
|
||||||
if(record.key == key)
|
|
||||||
return record.value;
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
return QFileSystemModel::data(index, role);
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant DirFileSystemModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
||||||
{
|
|
||||||
if(orientation == Qt::Horizontal && role == Qt::DisplayRole && section >= QFileSystemModel::columnCount())
|
|
||||||
return _fitsKeywords.at(section - QFileSystemModel::columnCount());
|
|
||||||
|
|
||||||
return QFileSystemModel::headerData(section, orientation, role);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DirFileSystemModel::hasChildren(const QModelIndex &parent) const
|
|
||||||
{
|
|
||||||
if(parent.parent() == _dir)return false;
|
|
||||||
|
|
||||||
return QFileSystemModel::hasChildren(parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DirFileSystemModel::loadFitsKeywords(bool enable)
|
|
||||||
{
|
|
||||||
_loadFitsKeywords = enable;
|
|
||||||
}
|
|
||||||
|
|
||||||
DirView::DirView(QWidget *parent) : QTreeView(parent)
|
|
||||||
{
|
|
||||||
_dirFileSystemModel = new DirFileSystemModel(this);
|
|
||||||
#ifdef Q_OS_WIN64
|
|
||||||
_dirFileSystemModel->setRootPath("C:/");
|
|
||||||
#else
|
|
||||||
_dirFileSystemModel->setRootPath("/");
|
|
||||||
#endif
|
|
||||||
_dirFileSystemModel->setReadOnly(false);
|
|
||||||
setDragEnabled(true);
|
|
||||||
setAcceptDrops(true);
|
|
||||||
|
|
||||||
setModel(_dirFileSystemModel);
|
|
||||||
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
|
||||||
|
|
||||||
connect(this, &QTreeView::doubleClicked, [this](const QModelIndex &index){
|
|
||||||
QFileInfo info = _dirFileSystemModel->fileInfo(index);
|
|
||||||
if(_dirFileSystemModel->isDir(index))
|
|
||||||
{
|
|
||||||
setDir(info.canonicalFilePath());
|
|
||||||
}
|
|
||||||
else if(info.isFile())
|
|
||||||
{
|
|
||||||
if(_openFilter.contains(info.suffix()))
|
|
||||||
emit openFile(info.absoluteFilePath());
|
|
||||||
else
|
|
||||||
QDesktopServices::openUrl(QUrl::fromLocalFile(info.absoluteFilePath()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
header()->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
||||||
connect(header(), &QHeaderView::customContextMenuRequested, this, &DirView::headerContextMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DirView::setDir(const QString &path)
|
|
||||||
{
|
|
||||||
_dirFileSystemModel->setDir(path);
|
|
||||||
setRootIndex(_dirFileSystemModel->index(path, 0));
|
|
||||||
clearSelection();
|
|
||||||
emit dirChanged(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
QString DirView::dir() const
|
|
||||||
{
|
|
||||||
return _dirFileSystemModel->dir();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DirView::setOpenFilter(const QSet<QString> &openFilter)
|
|
||||||
{
|
|
||||||
_openFilter = openFilter;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DirView::headerContextMenu(const QPoint &pos)
|
|
||||||
{
|
|
||||||
QHeaderView *head = header();
|
|
||||||
QMenu menu;
|
|
||||||
int count = head->count();
|
|
||||||
for(int i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
QAction *a = menu.addAction(head->model()->headerData(i, Qt::Horizontal).toString());
|
|
||||||
a->setCheckable(true);
|
|
||||||
a->setChecked(!head->isSectionHidden(i));
|
|
||||||
a->setData(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
QAction *a = menu.exec(mapToGlobal(pos));
|
|
||||||
if(a)
|
|
||||||
{
|
|
||||||
if(a->isChecked())head->showSection(a->data().toInt());
|
|
||||||
else head->hideSection(a->data().toInt());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
#ifndef FILEMANAGER_H
|
|
||||||
#define FILEMANAGER_H
|
|
||||||
|
|
||||||
#include <QMainWindow>
|
|
||||||
#include <QCache>
|
|
||||||
#include <QFileSystemModel>
|
|
||||||
#include <QTreeView>
|
|
||||||
#include "imageinfodata.h"
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class FileManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
class FileManager : public QMainWindow
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit FileManager(const QSet<QString> &openFilter, QWidget *parent = nullptr);
|
|
||||||
~FileManager();
|
|
||||||
signals:
|
|
||||||
void openFile(const QString &path);
|
|
||||||
private:
|
|
||||||
Ui::FileManager *ui;
|
|
||||||
};
|
|
||||||
|
|
||||||
class DirFileSystemModel : public QFileSystemModel
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
mutable QCache<QString, ImageInfoData> *_cache = nullptr;
|
|
||||||
static QCache<QString, ImageInfoData>* getCacheInstance();
|
|
||||||
QModelIndex _dir;
|
|
||||||
QStringList _fitsKeywords;
|
|
||||||
bool _loadFitsKeywords = true;
|
|
||||||
public:
|
|
||||||
explicit DirFileSystemModel(QObject *parent = nullptr);
|
|
||||||
void setDir(const QString &path);
|
|
||||||
QString dir() const;
|
|
||||||
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
|
||||||
int columnCount(const QModelIndex &parent) const override;
|
|
||||||
QVariant data(const QModelIndex &index, int role) const override;
|
|
||||||
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
|
||||||
bool hasChildren(const QModelIndex &parent) const override;
|
|
||||||
public slots:
|
|
||||||
void loadFitsKeywords(bool enable);
|
|
||||||
};
|
|
||||||
|
|
||||||
class DirView : public QTreeView
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
DirFileSystemModel *_dirFileSystemModel = nullptr;
|
|
||||||
QSet<QString> _openFilter;
|
|
||||||
public:
|
|
||||||
explicit DirView(QWidget *parent = nullptr);
|
|
||||||
void setDir(const QString &path);
|
|
||||||
QString dir() const;
|
|
||||||
void setOpenFilter(const QSet<QString> &openFilter);
|
|
||||||
public slots:
|
|
||||||
void headerContextMenu(const QPoint &pos);
|
|
||||||
signals:
|
|
||||||
void dirChanged(const QString &path);
|
|
||||||
void openFile(const QString &path);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // FILEMANAGER_H
|
|
||||||
@@ -1,116 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>FileManager</class>
|
|
||||||
<widget class="QMainWindow" name="FileManager">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>1282</width>
|
|
||||||
<height>858</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<property name="windowTitle">
|
|
||||||
<string>File Manager</string>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="centralwidget">
|
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="leftPath">
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="DirView" name="leftTab"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QLineEdit" name="rightPath">
|
|
||||||
<property name="readOnly">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="DirView" name="rightTab"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QMenuBar" name="menubar">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>1282</width>
|
|
||||||
<height>23</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<widget class="QMenu" name="menuLeft_Tab">
|
|
||||||
<property name="title">
|
|
||||||
<string>Left Tab</string>
|
|
||||||
</property>
|
|
||||||
<addaction name="actionLoad_FITS_keywordsLeft"/>
|
|
||||||
<addaction name="actionSelect_columnsLeft"/>
|
|
||||||
</widget>
|
|
||||||
<widget class="QMenu" name="menuRight_Tab">
|
|
||||||
<property name="title">
|
|
||||||
<string>Right Tab</string>
|
|
||||||
</property>
|
|
||||||
<addaction name="actionLoad_FITS_keywordsRight"/>
|
|
||||||
<addaction name="actionSelect_columnsRight"/>
|
|
||||||
</widget>
|
|
||||||
<addaction name="menuLeft_Tab"/>
|
|
||||||
<addaction name="menuRight_Tab"/>
|
|
||||||
</widget>
|
|
||||||
<action name="actionLoad_FITS_keywordsLeft">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Load FITS keywords</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionLoad_FITS_keywordsRight">
|
|
||||||
<property name="checkable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="checked">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Load FITS keywords</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionSelect_columnsLeft">
|
|
||||||
<property name="text">
|
|
||||||
<string>Select columns</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
<action name="actionSelect_columnsRight">
|
|
||||||
<property name="text">
|
|
||||||
<string>Select columns</string>
|
|
||||||
</property>
|
|
||||||
</action>
|
|
||||||
</widget>
|
|
||||||
<customwidgets>
|
|
||||||
<customwidget>
|
|
||||||
<class>DirView</class>
|
|
||||||
<extends>QTreeView</extends>
|
|
||||||
<header>filemanager.h</header>
|
|
||||||
</customwidget>
|
|
||||||
</customwidgets>
|
|
||||||
<resources/>
|
|
||||||
<connections/>
|
|
||||||
</ui>
|
|
||||||
@@ -5,7 +5,6 @@
|
|||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QHeaderView>
|
#include <QHeaderView>
|
||||||
#include <QMimeDatabase>
|
|
||||||
|
|
||||||
FilesystemWidget::FilesystemWidget(QAbstractItemModel *model, QWidget *parent) : QWidget(parent)
|
FilesystemWidget::FilesystemWidget(QAbstractItemModel *model, QWidget *parent) : QWidget(parent)
|
||||||
, m_model(model)
|
, m_model(model)
|
||||||
@@ -118,7 +117,6 @@ void Filetree::contextMenuEvent(QContextMenuEvent *event)
|
|||||||
{
|
{
|
||||||
setRootIndex(index);
|
setRootIndex(index);
|
||||||
m_rootDir = m_fileSystemModel->filePath(index);
|
m_rootDir = m_fileSystemModel->filePath(index);
|
||||||
m_fileSystemModel->setRootPath(m_rootDir);
|
|
||||||
}
|
}
|
||||||
else if(a == resetRoot)
|
else if(a == resetRoot)
|
||||||
{
|
{
|
||||||
@@ -129,7 +127,6 @@ void Filetree::contextMenuEvent(QContextMenuEvent *event)
|
|||||||
{
|
{
|
||||||
setRootIndex(rootIndex().parent());
|
setRootIndex(rootIndex().parent());
|
||||||
m_rootDir = m_fileSystemModel->filePath(rootIndex().parent());
|
m_rootDir = m_fileSystemModel->filePath(rootIndex().parent());
|
||||||
m_fileSystemModel->setRootPath(m_rootDir);
|
|
||||||
}
|
}
|
||||||
else if(a == copy)
|
else if(a == copy)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QFileSystemModel>
|
#include <QFileSystemModel>
|
||||||
#include <QIdentityProxyModel>
|
|
||||||
#include <QListView>
|
#include <QListView>
|
||||||
#include <QTreeView>
|
#include <QTreeView>
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,6 @@ WCSDataT::WCSDataT(int width, int height, const QVector<FITSRecord> &header) :
|
|||||||
for(const FITSRecord &record : header)
|
for(const FITSRecord &record : header)
|
||||||
{
|
{
|
||||||
if(record.key.startsWith("PV"))continue;
|
if(record.key.startsWith("PV"))continue;
|
||||||
if(record.xisf)continue;
|
|
||||||
|
|
||||||
QByteArray rec;
|
QByteArray rec;
|
||||||
rec.append(record.key.leftJustified(8, ' '));
|
rec.append(record.key.leftJustified(8, ' '));
|
||||||
|
|||||||
+4
-56
@@ -241,59 +241,18 @@ bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage
|
|||||||
{
|
{
|
||||||
info.fitsHeader.append(fits);
|
info.fitsHeader.append(fits);
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<FITSRecord> xisfWCS;
|
|
||||||
auto imageproperties = xisfImage.imageProperties();
|
auto imageproperties = xisfImage.imageProperties();
|
||||||
for(auto prop : imageproperties)
|
for(auto prop : imageproperties)
|
||||||
{
|
{
|
||||||
info.fitsHeader.append(prop);
|
info.fitsHeader.append(prop);
|
||||||
if(prop.id == "PCL:AstrometricSolution:ReferenceCelestialCoordinates" && prop.value.type() == LibXISF::Variant::Type::F64Vector)
|
|
||||||
{
|
|
||||||
auto val = prop.value.value<LibXISF::F64Vector>();
|
|
||||||
if(val.size() >= 2)
|
|
||||||
{
|
|
||||||
xisfWCS.append({"CRVAL1", val[0], "value from PCL:AstrometricSolution"});
|
|
||||||
xisfWCS.append({"CRVAL2", val[1], "value from PCL:AstrometricSolution"});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(prop.id == "PCL:AstrometricSolution:ReferenceImageCoordinates" && prop.value.type() == LibXISF::Variant::Type::F64Vector)
|
|
||||||
{
|
|
||||||
auto val = prop.value.value<LibXISF::F64Vector>();
|
|
||||||
if(val.size() >= 2)
|
|
||||||
{
|
|
||||||
xisfWCS.append({"CRPIX1", val[0], "value from PCL:AstrometricSolution"});
|
|
||||||
xisfWCS.append({"CRPIX2", val[1], "value from PCL:AstrometricSolution"});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(prop.id == "PCL:AstrometricSolution:LinearTransformationMatrix" && prop.value.type() == LibXISF::Variant::Type::F64Matrix)
|
|
||||||
{
|
|
||||||
auto val = prop.value.value<LibXISF::F64Matrix>();
|
|
||||||
if(val.cols() >= 2 && val.rows() >= 2)
|
|
||||||
{
|
|
||||||
xisfWCS.append({"CD1_1", val(0, 0), "value from PCL:AstrometricSolution"});
|
|
||||||
xisfWCS.append({"CD1_2", val(0, 1), "value from PCL:AstrometricSolution"});
|
|
||||||
xisfWCS.append({"CD2_1", val(1, 0), "value from PCL:AstrometricSolution"});
|
|
||||||
xisfWCS.append({"CD2_2", val(1, 1), "value from PCL:AstrometricSolution"});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if(prop.id == "PCL:AstrometricSolution:ProjectionSystem")
|
|
||||||
{
|
|
||||||
if(prop.value.toString() == "Gnomonic")
|
|
||||||
{
|
|
||||||
xisfWCS.append({"CTYPE1", "RA---TAN", "value from PCL:AstrometricSolution"});
|
|
||||||
xisfWCS.append({"CTYPE", "DEC--TAN", "value from PCL:AstrometricSolution"});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
info.num = xisf.imagesCount();
|
info.num = xisf.imagesCount();
|
||||||
info.index = index;
|
info.index = index;
|
||||||
|
info.wcs = std::make_shared<WCSDataT>(xisfImage.width(), xisfImage.height(), info.fitsHeader);
|
||||||
info.info.append({QObject::tr("Width"), QString::number(xisfImage.width())});
|
info.info.append({QObject::tr("Width"), QString::number(xisfImage.width())});
|
||||||
info.info.append({QObject::tr("Height"), QString::number(xisfImage.height())});
|
info.info.append({QObject::tr("Height"), QString::number(xisfImage.height())});
|
||||||
|
if(!info.wcs->valid())info.wcs.reset();
|
||||||
auto wcs = std::make_shared<WCSDataT>(xisfImage.width(), xisfImage.height(), info.fitsHeader);
|
|
||||||
if(!wcs->valid() && xisfWCS.size())wcs = std::make_shared<WCSDataT>(xisfImage.width(), xisfImage.height(), xisfWCS);
|
|
||||||
if(wcs->valid())info.wcs = wcs;
|
|
||||||
|
|
||||||
RawImage::DataType type;
|
RawImage::DataType type;
|
||||||
switch(xisfImage.sampleFormat())
|
switch(xisfImage.sampleFormat())
|
||||||
@@ -450,19 +409,18 @@ bool loadImage(const QString &path, ImageInfoData &info, std::shared_ptr<RawImag
|
|||||||
{
|
{
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
QElapsedTimer timer;
|
QElapsedTimer timer;
|
||||||
QFileInfo fileInfo(path);
|
|
||||||
timer.start();
|
timer.start();
|
||||||
if(path.endsWith(".CR2", Qt::CaseInsensitive) || path.endsWith(".CR3", Qt::CaseInsensitive) || path.endsWith(".NEF", Qt::CaseInsensitive) || path.endsWith(".DNG", Qt::CaseInsensitive))
|
if(path.endsWith(".CR2", Qt::CaseInsensitive) || path.endsWith(".CR3", Qt::CaseInsensitive) || path.endsWith(".NEF", Qt::CaseInsensitive) || path.endsWith(".DNG", Qt::CaseInsensitive))
|
||||||
{
|
{
|
||||||
ret = loadRAW(path, info, rawImage);
|
ret = loadRAW(path, info, rawImage);
|
||||||
qDebug() << "LoadRAW" << timer.elapsed();
|
qDebug() << "LoadRAW" << timer.elapsed();
|
||||||
}
|
}
|
||||||
else if(isFITS(fileInfo.suffix()))
|
else if(path.endsWith(".FIT", Qt::CaseInsensitive) || path.endsWith(".FITS", Qt::CaseInsensitive) || path.endsWith(".FZ", Qt::CaseInsensitive) || path.endsWith(".FTS", Qt::CaseInsensitive))
|
||||||
{
|
{
|
||||||
ret = loadFITS(path, info, rawImage, planar, index);
|
ret = loadFITS(path, info, rawImage, planar, index);
|
||||||
qDebug() << "LoadFITS" << timer.elapsed();
|
qDebug() << "LoadFITS" << timer.elapsed();
|
||||||
}
|
}
|
||||||
else if(isXISF(fileInfo.suffix()))
|
else if(path.endsWith(".XISF", Qt::CaseInsensitive))
|
||||||
{
|
{
|
||||||
ret = loadXISF(path, info, rawImage, planar, index);
|
ret = loadXISF(path, info, rawImage, planar, index);
|
||||||
qDebug() << "LoadXISF" << timer.elapsed();
|
qDebug() << "LoadXISF" << timer.elapsed();
|
||||||
@@ -486,13 +444,3 @@ bool loadImage(const QString &path, ImageInfoData &info, std::shared_ptr<RawImag
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isFITS(const QString &suffix)
|
|
||||||
{
|
|
||||||
return suffix.compare("fits", Qt::CaseInsensitive) == 0 || suffix.compare("fit", Qt::CaseInsensitive) == 0 || suffix.compare("fts", Qt::CaseInsensitive) == 0 || suffix.compare("fz", Qt::CaseInsensitive) == 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isXISF(const QString &suffix)
|
|
||||||
{
|
|
||||||
return suffix.compare("xisf", Qt::CaseInsensitive) == 0;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -10,7 +10,5 @@ QString makeUNCPath(const QString &path);
|
|||||||
bool readFITSHeader(const QString &path, ImageInfoData &info);
|
bool readFITSHeader(const QString &path, ImageInfoData &info);
|
||||||
bool readXISFHeader(const QString &path, ImageInfoData &info);
|
bool readXISFHeader(const QString &path, ImageInfoData &info);
|
||||||
bool loadImage(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage> &rawImage, int index, bool planar = false);
|
bool loadImage(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage> &rawImage, int index, bool planar = false);
|
||||||
bool isFITS(const QString &suffix);
|
|
||||||
bool isXISF(const QString &suffix);
|
|
||||||
|
|
||||||
#endif // LOADIMAGE_H
|
#endif // LOADIMAGE_H
|
||||||
|
|||||||
@@ -5,9 +5,26 @@
|
|||||||
#include <QCommandLineParser>
|
#include <QCommandLineParser>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "../thumbnailer/genthumbnail.h"
|
#include "../thumbnailer/genthumbnail.h"
|
||||||
|
#include <QTreeView>
|
||||||
|
#include <QFileSystemModel>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
|
||||||
|
QApplication app(argc, argv);
|
||||||
|
QFileSystemModel model;
|
||||||
|
QTreeView treeView;
|
||||||
|
|
||||||
|
|
||||||
|
QTimer::singleShot(5000, [&model,&treeView](){
|
||||||
|
treeView.setModel(&model);
|
||||||
|
model.setRootPath("/home");
|
||||||
|
});
|
||||||
|
treeView.resize(800, 600);
|
||||||
|
treeView.show();
|
||||||
|
return app.exec();
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
setenv("LC_NUMERIC", "C", 1);
|
setenv("LC_NUMERIC", "C", 1);
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -29,7 +29,6 @@
|
|||||||
#include "settingsdialog.h"
|
#include "settingsdialog.h"
|
||||||
#include "histogram.h"
|
#include "histogram.h"
|
||||||
#include "batchprocessing.h"
|
#include "batchprocessing.h"
|
||||||
#include "filemanager.h"
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
@@ -67,7 +66,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
|
|||||||
_openFilter.append(tr(";;All files (*)"));
|
_openFilter.append(tr(";;All files (*)"));
|
||||||
nameFilter.append({"fit", "fits", "fts", "fz", "xisf", "cr2", "cr3", "nef", "dng"});
|
nameFilter.append({"fit", "fits", "fts", "fz", "xisf", "cr2", "cr3", "nef", "dng"});
|
||||||
QImageReader::setAllocationLimit(0);
|
QImageReader::setAllocationLimit(0);
|
||||||
_openSuffix = {nameFilter.constBegin(), nameFilter.constEnd()};
|
|
||||||
|
|
||||||
m_info = new ImageInfo(this);
|
m_info = new ImageInfo(this);
|
||||||
QDockWidget *infoDock = new QDockWidget(tr("Image info"), this);
|
QDockWidget *infoDock = new QDockWidget(tr("Image info"), this);
|
||||||
@@ -178,7 +176,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
|
|||||||
fileMenu->addAction(tr("Open directory recursively"), this, &MainWindow::loadDir);
|
fileMenu->addAction(tr("Open directory recursively"), this, &MainWindow::loadDir);
|
||||||
QAction *saveAs = fileMenu->addAction(tr("Save as"), QKeySequence::Save, this, &MainWindow::saveAs);
|
QAction *saveAs = fileMenu->addAction(tr("Save as"), QKeySequence::Save, this, &MainWindow::saveAs);
|
||||||
fileMenu->addSeparator();
|
fileMenu->addSeparator();
|
||||||
fileMenu->addAction(tr("File manager"), this, &MainWindow::openFileManager);
|
|
||||||
fileMenu->addAction(tr("Copy marked files"), Qt::Key_F5, this, &MainWindow::copyMarked);
|
fileMenu->addAction(tr("Copy marked files"), Qt::Key_F5, this, &MainWindow::copyMarked);
|
||||||
fileMenu->addAction(tr("Move marked files"), Qt::Key_F6, this, &MainWindow::moveMarked);
|
fileMenu->addAction(tr("Move marked files"), Qt::Key_F6, this, &MainWindow::moveMarked);
|
||||||
fileMenu->addAction(tr("Move marked files to trash"), QKeySequence::Delete, this, &MainWindow::deleteMarked);
|
fileMenu->addAction(tr("Move marked files to trash"), QKeySequence::Delete, this, &MainWindow::deleteMarked);
|
||||||
@@ -811,13 +808,6 @@ void MainWindow::checkNewVersion()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::openFileManager()
|
|
||||||
{
|
|
||||||
FileManager *filemanager = new FileManager(_openSuffix);
|
|
||||||
connect(filemanager, &FileManager::openFile, this, static_cast<void (MainWindow::*)(const QString&)>(&MainWindow::loadFile));
|
|
||||||
filemanager->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::updateWindowTitle()
|
void MainWindow::updateWindowTitle()
|
||||||
{
|
{
|
||||||
ImagePtr ptr = m_ringList->currentImage();
|
ImagePtr ptr = m_ringList->currentImage();
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ class MainWindow : public QMainWindow
|
|||||||
bool _maximized;
|
bool _maximized;
|
||||||
QString _openFilter;
|
QString _openFilter;
|
||||||
QString _saveFilter;
|
QString _saveFilter;
|
||||||
QSet<QString> _openSuffix;
|
|
||||||
public:
|
public:
|
||||||
MainWindow(QWidget *parent = 0);
|
MainWindow(QWidget *parent = 0);
|
||||||
~MainWindow() override;
|
~MainWindow() override;
|
||||||
@@ -68,7 +67,6 @@ public slots:
|
|||||||
void showSettingsDialog();
|
void showSettingsDialog();
|
||||||
void exportCSV();
|
void exportCSV();
|
||||||
void checkNewVersion();
|
void checkNewVersion();
|
||||||
void openFileManager();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
|||||||
+2
-2
@@ -403,9 +403,9 @@ uint32_t RawImage::norm() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t RawImage::widthBytes() const
|
uint32_t RawImage::widthBytes() const
|
||||||
{
|
{
|
||||||
return (uint64_t)m_ch * m_width * typeSize(m_type);
|
return m_ch * m_width * typeSize(m_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t RawImage::widthSamples() const
|
uint32_t RawImage::widthSamples() const
|
||||||
|
|||||||
+1
-1
@@ -97,7 +97,7 @@ public:
|
|||||||
uint64_t size() const;
|
uint64_t size() const;
|
||||||
DataType type() const;
|
DataType type() const;
|
||||||
uint32_t norm() const;
|
uint32_t norm() const;
|
||||||
uint64_t widthBytes() const;
|
uint32_t widthBytes() const;
|
||||||
uint32_t widthSamples() const;
|
uint32_t widthSamples() const;
|
||||||
void* data();
|
void* data();
|
||||||
const void* data() const;
|
const void* data() const;
|
||||||
|
|||||||
@@ -455,11 +455,11 @@ void File::loadFitsKeywords()
|
|||||||
{
|
{
|
||||||
_fitsKeywordsLoaded = true;
|
_fitsKeywordsLoaded = true;
|
||||||
ImageInfoData info;
|
ImageInfoData info;
|
||||||
if(isXISF(suffix()))
|
if(suffix().toLower() == "xisf")
|
||||||
{
|
{
|
||||||
readXISFHeader(_path, info);
|
readXISFHeader(_path, info);
|
||||||
}
|
}
|
||||||
else if(isFITS(suffix()))
|
else if(suffix().toLower() == "fits" || suffix().toLower() == "fit" || suffix().toLower() == "fz")
|
||||||
{
|
{
|
||||||
readFITSHeader(_path, info);
|
readFITSHeader(_path, info);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user