Compare commits
5 Commits
20260412
...
53167e7bb5
| Author | SHA1 | Date | |
|---|---|---|---|
| 53167e7bb5 | |||
| 1e940de31b | |||
| f1b5ec81c0 | |||
| 8b8759facb | |||
| 468862ad35 |
@@ -39,6 +39,7 @@ set(TENMON_SRC
|
|||||||
src/filemanager.h src/filemanager.cpp src/filemanager.ui
|
src/filemanager.h src/filemanager.cpp src/filemanager.ui
|
||||||
src/filesystemwidget.cpp src/filesystemwidget.h
|
src/filesystemwidget.cpp src/filesystemwidget.h
|
||||||
src/fitskeyword.ui
|
src/fitskeyword.ui
|
||||||
|
src/fitswrapper.h src/fitswrapper.cpp
|
||||||
src/histogram.cpp src/histogram.h
|
src/histogram.cpp src/histogram.h
|
||||||
src/httpdownloader.h src/httpdownloader.cpp
|
src/httpdownloader.h src/httpdownloader.cpp
|
||||||
src/imageinfo.cpp src/imageinfo.h
|
src/imageinfo.cpp src/imageinfo.h
|
||||||
|
|||||||
+1
-1
Submodule libXISF updated: 7b70b6a081...de757840b3
@@ -337,7 +337,7 @@ void BatchProcessing::newMessageCli(const QString &message, bool error)
|
|||||||
if(error)
|
if(error)
|
||||||
qWarning() << message;
|
qWarning() << message;
|
||||||
else
|
else
|
||||||
qDebug() << message;
|
qInfo() << message;
|
||||||
}
|
}
|
||||||
|
|
||||||
QJSValue BatchProcessing::getString(const QString &label, const QString &text)
|
QJSValue BatchProcessing::getString(const QString &label, const QString &text)
|
||||||
|
|||||||
@@ -447,7 +447,7 @@ DatabaseTreeView::DatabaseTreeView(Database *database, QWidget *parent) : QWidge
|
|||||||
,_database(database)
|
,_database(database)
|
||||||
{
|
{
|
||||||
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
||||||
QHBoxLayout *hlayout = new QHBoxLayout(this);
|
QHBoxLayout *hlayout = new QHBoxLayout;
|
||||||
|
|
||||||
_model = new DatabaseTree(database, this);
|
_model = new DatabaseTree(database, this);
|
||||||
_treeView = new QTreeView(this);
|
_treeView = new QTreeView(this);
|
||||||
@@ -473,7 +473,7 @@ DatabaseTreeView::DatabaseTreeView(Database *database, QWidget *parent) : QWidge
|
|||||||
connect(_filters, &QComboBox::currentIndexChanged, this, &DatabaseTreeView::filterChanged);
|
connect(_filters, &QComboBox::currentIndexChanged, this, &DatabaseTreeView::filterChanged);
|
||||||
filterChanged(_filters->currentIndex());
|
filterChanged(_filters->currentIndex());
|
||||||
|
|
||||||
QStackedWidget *stackedWidget = new QStackedWidget;
|
QStackedWidget *stackedWidget = new QStackedWidget(this);
|
||||||
stackedWidget->addWidget(_treeView);
|
stackedWidget->addWidget(_treeView);
|
||||||
stackedWidget->addWidget(_tableView);
|
stackedWidget->addWidget(_tableView);
|
||||||
|
|
||||||
|
|||||||
+22
-18
@@ -1,19 +1,20 @@
|
|||||||
#include "databaseview.h"
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QDialogButtonBox>
|
|
||||||
#include <QHeaderView>
|
|
||||||
#include <QSqlError>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QContextMenuEvent>
|
|
||||||
#include <QRegularExpression>
|
|
||||||
#include <QGuiApplication>
|
|
||||||
#include <QClipboard>
|
|
||||||
#include <QMimeData>
|
|
||||||
#include <iostream>
|
|
||||||
#include "batchprocessing.h"
|
#include "batchprocessing.h"
|
||||||
|
#include "databaseview.h"
|
||||||
|
#include <QClipboard>
|
||||||
|
#include <QContextMenuEvent>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QMimeData>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QRegularExpression>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QSqlError>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
const QStringList DEFAULT_COLUMNS = {"EXPTIME", "OBJECT", "RA", "DEC"};
|
const QStringList DEFAULT_COLUMNS = {"EXPTIME", "OBJECT", "RA", "DEC"};
|
||||||
|
|
||||||
@@ -248,7 +249,7 @@ void FITSFileModel::prepareQuery()
|
|||||||
{
|
{
|
||||||
setHeaderData(i++, Qt::Horizontal, column);
|
setHeaderData(i++, Qt::Horizontal, column);
|
||||||
}
|
}
|
||||||
std::cout << sql.toStdString() << std::endl;
|
qDebug() << "DB SQL" << sql;
|
||||||
if(lastError().type() != QSqlError::NoError)
|
if(lastError().type() != QSqlError::NoError)
|
||||||
qDebug() << "Database error" << lastError();
|
qDebug() << "Database error" << lastError();
|
||||||
|
|
||||||
@@ -318,9 +319,12 @@ DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent
|
|||||||
m_model = new FITSFileModel(m_database, this);
|
m_model = new FITSFileModel(m_database, this);
|
||||||
|
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
m_tableView->setModel(m_model);
|
|
||||||
m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
|
m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
|
||||||
m_tableView->horizontalHeader()->restoreState(settings.value("databaseview/header").toByteArray());
|
m_tableView->setModel(m_model);
|
||||||
|
QTimer::singleShot(200, [this](){
|
||||||
|
QSettings settings;
|
||||||
|
m_tableView->horizontalHeader()->restoreState(settings.value("databaseview/header").toByteArray());
|
||||||
|
});
|
||||||
|
|
||||||
QHBoxLayout *hlayout = new QHBoxLayout();
|
QHBoxLayout *hlayout = new QHBoxLayout();
|
||||||
layout->addLayout(hlayout);
|
layout->addLayout(hlayout);
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
#include "fitswrapper.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
|
FITSWrapper::FITSWrapper(const QString &path, int mode, bool open)
|
||||||
|
{
|
||||||
|
_path = path;
|
||||||
|
_mode = mode;
|
||||||
|
|
||||||
|
if(open)
|
||||||
|
fits_open_diskfile(&_file, path.toLocal8Bit().data(), mode, &_status);
|
||||||
|
else
|
||||||
|
fits_create_diskfile(&_file, path.toLocal8Bit().data(), &_status);
|
||||||
|
|
||||||
|
if(_status == FILE_NOT_OPENED || _status == FILE_NOT_CREATED)
|
||||||
|
{
|
||||||
|
qWarning() << "Could not open file directly trying memfile workaround" << path;
|
||||||
|
if(open)
|
||||||
|
{
|
||||||
|
QFile fr(path);
|
||||||
|
if(fr.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
_bufferSize = fr.size();
|
||||||
|
_bufferPtr = malloc(_bufferSize);
|
||||||
|
fr.read((char*)_bufferPtr, _bufferSize);
|
||||||
|
_status = 0;
|
||||||
|
fits_open_memfile(&_file, "memfile", mode, &_bufferPtr, &_bufferSize, 0, realloc, &_status);
|
||||||
|
if(_status)
|
||||||
|
{
|
||||||
|
free(_bufferPtr);
|
||||||
|
_bufferPtr = nullptr;
|
||||||
|
_bufferSize = 0;
|
||||||
|
qWarning() << "fits_open_memfile failed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qWarning() << "QFile failed to open file" << path;
|
||||||
|
_status = FILE_NOT_OPENED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_bufferSize = 2880;
|
||||||
|
_bufferPtr = malloc(_bufferSize);
|
||||||
|
fits_create_memfile(&_file, &_bufferPtr, &_bufferSize, 0, realloc, &_status);
|
||||||
|
if(_status)
|
||||||
|
{
|
||||||
|
free(_bufferPtr);
|
||||||
|
_bufferPtr = nullptr;
|
||||||
|
_bufferSize = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FITSWrapper::~FITSWrapper()
|
||||||
|
{
|
||||||
|
if(_file)
|
||||||
|
{
|
||||||
|
_status = 0;
|
||||||
|
fits_close_file(_file, &_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_mode == READWRITE && _bufferPtr)
|
||||||
|
{
|
||||||
|
qDebug() << "Writing FITS memfile" << _bufferSize;
|
||||||
|
QFile fw(_path);
|
||||||
|
if(fw.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
||||||
|
{
|
||||||
|
if(fw.write((char*)_bufferPtr, _bufferSize) != (qint64)_bufferSize)
|
||||||
|
qWarning() << "Failed to write to file";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
qWarning() << "Failed to open fits file for writing";
|
||||||
|
}
|
||||||
|
|
||||||
|
free(_bufferPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int FITSWrapper::status() const
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
|
FITSWrapper::operator fitsfile *()
|
||||||
|
{
|
||||||
|
return _file;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef FITSWRAPPER_H
|
||||||
|
#define FITSWRAPPER_H
|
||||||
|
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QString>
|
||||||
|
#include <fitsio.h>
|
||||||
|
|
||||||
|
class FITSWrapper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit FITSWrapper(const QString &path, int mode, bool open);
|
||||||
|
~FITSWrapper();
|
||||||
|
FITSWrapper(FITSWrapper &other) = delete;
|
||||||
|
int status() const;
|
||||||
|
operator fitsfile*();
|
||||||
|
private:
|
||||||
|
QString _path;
|
||||||
|
int _status = 0;
|
||||||
|
int _mode = 0;
|
||||||
|
fitsfile *_file;
|
||||||
|
size_t _bufferSize = 0;
|
||||||
|
void *_bufferPtr = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FITSWRAPPER_H
|
||||||
+19
-18
@@ -1,13 +1,13 @@
|
|||||||
#include "loadimage.h"
|
#include "loadimage.h"
|
||||||
#include <QElapsedTimer>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QDir>
|
|
||||||
#include <libraw/libraw.h>
|
|
||||||
#include <fitsio2.h>
|
|
||||||
#include "libxisf.h"
|
#include "libxisf.h"
|
||||||
#include <libexif/exif-data.h>
|
|
||||||
#include "rawimage.h"
|
#include "rawimage.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QElapsedTimer>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <libexif/exif-data.h>
|
||||||
|
#include <libraw/libraw.h>
|
||||||
|
#include "fitswrapper.h"
|
||||||
|
|
||||||
QString makeUNCPath(const QString &path)
|
QString makeUNCPath(const QString &path)
|
||||||
{
|
{
|
||||||
@@ -85,7 +85,6 @@ int loadFITSHeader(fitsfile *file, ImageInfoData &info)
|
|||||||
|
|
||||||
bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage> &image, bool planar, uint32_t index)
|
bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage> &image, bool planar, uint32_t index)
|
||||||
{
|
{
|
||||||
fitsfile *file;
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
int num = 0;
|
int num = 0;
|
||||||
long naxes[3] = {0};
|
long naxes[3] = {0};
|
||||||
@@ -99,7 +98,9 @@ bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage>
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
fits_open_diskfile(&file, path.toLocal8Bit().data(), READONLY, &status);
|
FITSWrapper file(path, READONLY, true);
|
||||||
|
status = file.status();
|
||||||
|
|
||||||
if(status)return checkError();
|
if(status)return checkError();
|
||||||
fits_get_num_hdus(file, &num, &status);
|
fits_get_num_hdus(file, &num, &status);
|
||||||
if(status)return checkError();
|
if(status)return checkError();
|
||||||
@@ -222,7 +223,6 @@ noload:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fits_close_file(file, &status);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,7 +231,8 @@ bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
LibXISF::XISFReader xisf;
|
LibXISF::XISFReader xisf;
|
||||||
xisf.open(path.toLocal8Bit().data());
|
QFileInfo fileInfo(path);
|
||||||
|
xisf.open(fileInfo.filesystemFilePath());
|
||||||
|
|
||||||
if(index >= (uint32_t)xisf.imagesCount())return false;
|
if(index >= (uint32_t)xisf.imagesCount())return false;
|
||||||
const LibXISF::Image &xisfImage = xisf.getImage(index);
|
const LibXISF::Image &xisfImage = xisf.getImage(index);
|
||||||
@@ -344,15 +345,14 @@ bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage
|
|||||||
|
|
||||||
bool readFITSHeader(const QString &path, ImageInfoData &info)
|
bool readFITSHeader(const QString &path, ImageInfoData &info)
|
||||||
{
|
{
|
||||||
fitsfile *fr;
|
|
||||||
int status = 0;
|
|
||||||
QString path2 = makeUNCPath(path);
|
QString path2 = makeUNCPath(path);
|
||||||
fits_open_diskfile(&fr, path2.toLocal8Bit().data(), READONLY, &status);
|
|
||||||
|
|
||||||
if(fr && status == 0)
|
FITSWrapper file(path, READONLY, true);
|
||||||
|
int status = file.status();
|
||||||
|
|
||||||
|
if(file && status == 0)
|
||||||
{
|
{
|
||||||
status = loadFITSHeader(fr, info);
|
status = loadFITSHeader(file, info);
|
||||||
fits_close_file(fr, &status);
|
|
||||||
}
|
}
|
||||||
return status == 0;
|
return status == 0;
|
||||||
}
|
}
|
||||||
@@ -363,7 +363,8 @@ bool readXISFHeader(const QString &path, ImageInfoData &info)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
LibXISF::XISFReader xisf;
|
LibXISF::XISFReader xisf;
|
||||||
xisf.open(path2.toLocal8Bit().data());
|
QFileInfo fileInfo(path2);
|
||||||
|
xisf.open(fileInfo.filesystemFilePath());
|
||||||
const LibXISF::Image &image = xisf.getImage(0, false);
|
const LibXISF::Image &image = xisf.getImage(0, false);
|
||||||
|
|
||||||
auto fitskeywords = image.fitsKeywords();
|
auto fitskeywords = image.fitsKeywords();
|
||||||
|
|||||||
+10
-8
@@ -1,13 +1,14 @@
|
|||||||
#include "loadrunable.h"
|
#include "loadrunable.h"
|
||||||
|
#include "fitswrapper.h"
|
||||||
#include "imageringlist.h"
|
#include "imageringlist.h"
|
||||||
|
#include "loadimage.h"
|
||||||
|
#include "rawimage.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QElapsedTimer>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QElapsedTimer>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <fitsio2.h>
|
#include <fitsio2.h>
|
||||||
#include "rawimage.h"
|
|
||||||
#include "loadimage.h"
|
|
||||||
#include <lcms2.h>
|
#include <lcms2.h>
|
||||||
|
|
||||||
LoadRunable::LoadRunable(const QString &file, Image *receiver, AnalyzeLevel level, int index, bool thumbnail) :
|
LoadRunable::LoadRunable(const QString &file, Image *receiver, AnalyzeLevel level, int index, bool thumbnail) :
|
||||||
@@ -269,7 +270,8 @@ void ConvertRunable::run()
|
|||||||
image.setByteshuffling(true);
|
image.setByteshuffling(true);
|
||||||
|
|
||||||
xisf.writeImage(image);
|
xisf.writeImage(image);
|
||||||
xisf.save(m_outfile.toLocal8Bit().data());
|
QFileInfo fileInfo(makeUNCPath(m_outfile));
|
||||||
|
xisf.save(fileInfo.filesystemFilePath());
|
||||||
}
|
}
|
||||||
catch(LibXISF::Error &err)
|
catch(LibXISF::Error &err)
|
||||||
{
|
{
|
||||||
@@ -281,9 +283,10 @@ void ConvertRunable::run()
|
|||||||
if(m_format == "fits")
|
if(m_format == "fits")
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
fitsfile *fw;
|
|
||||||
if(QFileInfo(m_outfile).exists())QFile::remove(m_outfile);
|
if(QFileInfo(m_outfile).exists())QFile::remove(m_outfile);
|
||||||
fits_create_diskfile(&fw, m_outfile.toLocal8Bit().data(), &status);
|
FITSWrapper fw(m_outfile, READWRITE, false);
|
||||||
|
if(fw.status())return;
|
||||||
|
|
||||||
if(!m_params.compressionType.isEmpty())
|
if(!m_params.compressionType.isEmpty())
|
||||||
{
|
{
|
||||||
if(m_params.compressionType == "gzip")
|
if(m_params.compressionType == "gzip")
|
||||||
@@ -292,7 +295,6 @@ void ConvertRunable::run()
|
|||||||
fits_set_compression_type(fw, RICE_1, &status);
|
fits_set_compression_type(fw, RICE_1, &status);
|
||||||
}
|
}
|
||||||
writeFITSImage(fw, rawimage, imageinfo);
|
writeFITSImage(fw, rawimage, imageinfo);
|
||||||
fits_close_file(fw, &status);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+20
-2
@@ -1,15 +1,28 @@
|
|||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QSurfaceFormat>
|
|
||||||
#include <QTranslator>
|
|
||||||
#include <QCommandLineParser>
|
#include <QCommandLineParser>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
#include <QSurfaceFormat>
|
||||||
|
#include <QTranslator>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "../thumbnailer/genthumbnail.h"
|
#include "../thumbnailer/genthumbnail.h"
|
||||||
#ifdef Q_OS_WIN64
|
#ifdef Q_OS_WIN64
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool DEBUG_LOG = false;
|
||||||
|
|
||||||
|
QtMessageHandler defaultHandler = nullptr;
|
||||||
|
|
||||||
|
void messageHandler(QtMsgType type, const QMessageLogContext &ctx, const QString &message)
|
||||||
|
{
|
||||||
|
if(defaultHandler)
|
||||||
|
{
|
||||||
|
if(DEBUG_LOG || type != QtMsgType::QtDebugMsg)
|
||||||
|
defaultHandler(type, ctx, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
@@ -29,6 +42,7 @@ int main(int argc, char *argv[])
|
|||||||
freopen("CONOUT$", "w", stderr);
|
freopen("CONOUT$", "w", stderr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
defaultHandler = qInstallMessageHandler(messageHandler);
|
||||||
|
|
||||||
QCommandLineParser cmd;
|
QCommandLineParser cmd;
|
||||||
cmd.addOption({"gl", "Use desktop OpenGL. This is default on x86 and MacOS platform."});
|
cmd.addOption({"gl", "Use desktop OpenGL. This is default on x86 and MacOS platform."});
|
||||||
@@ -40,6 +54,7 @@ int main(int argc, char *argv[])
|
|||||||
cmd.addOption({"scriptarg", "String that will be passed to script as variable \"scriparg\"", "arg"});
|
cmd.addOption({"scriptarg", "String that will be passed to script as variable \"scriparg\"", "arg"});
|
||||||
cmd.addOption({"outdir", "Output dir for script (default: CWD)", "dir", "."});
|
cmd.addOption({"outdir", "Output dir for script (default: CWD)", "dir", "."});
|
||||||
cmd.addOption({"noexit", "Do not exit application when script finish"});
|
cmd.addOption({"noexit", "Do not exit application when script finish"});
|
||||||
|
cmd.addOption({"debug", "Print debug info"});
|
||||||
cmd.addHelpOption();
|
cmd.addHelpOption();
|
||||||
QStringList cmdArgs;
|
QStringList cmdArgs;
|
||||||
for(int i = 0; i < argc; i++)
|
for(int i = 0; i < argc; i++)
|
||||||
@@ -51,6 +66,9 @@ int main(int argc, char *argv[])
|
|||||||
if(cmd.isSet("gles"))
|
if(cmd.isSet("gles"))
|
||||||
useGLES = true;
|
useGLES = true;
|
||||||
|
|
||||||
|
if(cmd.isSet("debug"))
|
||||||
|
DEBUG_LOG = true;
|
||||||
|
|
||||||
if(cmd.isSet("thumb"))
|
if(cmd.isSet("thumb"))
|
||||||
{
|
{
|
||||||
QCoreApplication app(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
|
|||||||
+42
-34
@@ -1,37 +1,38 @@
|
|||||||
|
#include "about.h"
|
||||||
|
#include "batchprocessing.h"
|
||||||
|
#include "filemanager.h"
|
||||||
|
#include "histogram.h"
|
||||||
|
#include "loadrunable.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include <QScrollArea>
|
#include "markedfiles.h"
|
||||||
|
#include "settingsdialog.h"
|
||||||
|
#include "statusbar.h"
|
||||||
|
#include <QActionGroup>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDesktopServices>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QDockWidget>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QImageReader>
|
||||||
|
#include <QImageWriter>
|
||||||
|
#include <QJsonDocument>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMenuBar>
|
#include <QMenuBar>
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QStandardPaths>
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QMimeDatabase>
|
||||||
|
#include <QNetworkReply>
|
||||||
#include <QProgressDialog>
|
#include <QProgressDialog>
|
||||||
#include <QDebug>
|
#include <QScrollArea>
|
||||||
#include <QDockWidget>
|
#include <QSettings>
|
||||||
#include <QActionGroup>
|
#include <QStandardPaths>
|
||||||
|
#include <QStatusBar>
|
||||||
|
#include <QThreadPool>
|
||||||
|
#include <QSessionManager>
|
||||||
|
#include <QTimer>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <QSettings>
|
|
||||||
#include <QGuiApplication>
|
|
||||||
#include <QThreadPool>
|
|
||||||
#include <QStatusBar>
|
|
||||||
#include <QImageReader>
|
|
||||||
#include <QImageWriter>
|
|
||||||
#include <QMimeDatabase>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QTimer>
|
|
||||||
#include "loadrunable.h"
|
|
||||||
#include "markedfiles.h"
|
|
||||||
#include "about.h"
|
|
||||||
#include "statusbar.h"
|
|
||||||
#include "settingsdialog.h"
|
|
||||||
#include "histogram.h"
|
|
||||||
#include "batchprocessing.h"
|
|
||||||
#include "filemanager.h"
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
@@ -576,16 +577,23 @@ void MainWindow::loadFile(const QString &path)
|
|||||||
if(!path.isEmpty())
|
if(!path.isEmpty())
|
||||||
{
|
{
|
||||||
QFileInfo info(path);
|
QFileInfo info(path);
|
||||||
m_ringList->setFile(info.canonicalFilePath());
|
if(info.exists() && info.isReadable())
|
||||||
updateWindowTitle();
|
{
|
||||||
if(info.isDir())
|
m_ringList->setFile(info.canonicalFilePath());
|
||||||
_lastDir = info.absolutePath();
|
updateWindowTitle();
|
||||||
|
if(info.isDir())
|
||||||
|
_lastDir = info.absolutePath();
|
||||||
|
else
|
||||||
|
_lastDir = info.canonicalPath();
|
||||||
|
QSettings settings;
|
||||||
|
settings.setValue("mainwindow/lastdir", _lastDir);
|
||||||
|
if(settings.value("settings/bestfit", false).toBool())
|
||||||
|
m_image->bestFit();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
_lastDir = info.canonicalPath();
|
{
|
||||||
QSettings settings;
|
qWarning() << "File doesn't exist or is not readable";
|
||||||
settings.setValue("mainwindow/lastdir", _lastDir);
|
}
|
||||||
if(settings.value("settings/bestfit", false).toBool())
|
|
||||||
m_image->bestFit();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
-18
@@ -1,16 +1,17 @@
|
|||||||
#include "scriptengine.h"
|
#include "scriptengine.h"
|
||||||
#include <QDir>
|
#include "batchprocessing.h"
|
||||||
#include <QFileInfo>
|
#include "fitswrapper.h"
|
||||||
#include <QDebug>
|
#include "libxisf.h"
|
||||||
#include <QInputDialog>
|
#include "loadimage.h"
|
||||||
#include <QJsonValue>
|
|
||||||
#include <QJSValueIterator>
|
|
||||||
#include "loadrunable.h"
|
#include "loadrunable.h"
|
||||||
#include "rawimage.h"
|
#include "rawimage.h"
|
||||||
#include "loadimage.h"
|
#include <QDebug>
|
||||||
#include "batchprocessing.h"
|
#include <QDir>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QInputDialog>
|
||||||
|
#include <QJSValueIterator>
|
||||||
|
#include <QJsonValue>
|
||||||
#include <fitsio2.h>
|
#include <fitsio2.h>
|
||||||
#include "libxisf.h"
|
|
||||||
#ifdef PLATESOLVER
|
#ifdef PLATESOLVER
|
||||||
#include "solver.h"
|
#include "solver.h"
|
||||||
#endif // PLATESOLVER
|
#endif // PLATESOLVER
|
||||||
@@ -672,10 +673,11 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
|
|
||||||
if(isFITS(suffix()))
|
if(isFITS(suffix()))
|
||||||
{
|
{
|
||||||
fitsfile *file;
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
QString path = makeUNCPath(_path);
|
QString path = makeUNCPath(_path);
|
||||||
fits_open_diskfile(&file, path.toLocal8Bit().data(), READWRITE, &status);
|
FITSWrapper file(path, READWRITE, true);
|
||||||
|
status = file.status();
|
||||||
|
|
||||||
int num = 0;
|
int num = 0;
|
||||||
fits_get_num_hdus(file, &num, &status);
|
fits_get_num_hdus(file, &num, &status);
|
||||||
if(status)
|
if(status)
|
||||||
@@ -795,8 +797,7 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fits_close_file(file, &status);
|
if(status)qWarning() << "Failed to modify FITS header" << status;
|
||||||
|
|
||||||
return status == 0;
|
return status == 0;
|
||||||
}
|
}
|
||||||
else if(isXISF(suffix()))
|
else if(isXISF(suffix()))
|
||||||
@@ -804,9 +805,9 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
LibXISF::XISFModify modifyXISF;
|
LibXISF::XISFModify modifyXISF;
|
||||||
QString in = makeUNCPath(absoluteFilePath());
|
QFileInfo in(makeUNCPath(absoluteFilePath()));
|
||||||
QString out = in + "~";
|
QFileInfo out(in.absoluteFilePath() + "~");
|
||||||
modifyXISF.open(in.toLocal8Bit().data());
|
modifyXISF.open(in.filesystemFilePath());
|
||||||
qDebug() << "modify" << in << out;
|
qDebug() << "modify" << in << out;
|
||||||
|
|
||||||
for(auto &remove : modify->_remove)
|
for(auto &remove : modify->_remove)
|
||||||
@@ -821,9 +822,9 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
for(auto &property : modify->_property)
|
for(auto &property : modify->_property)
|
||||||
modifyXISF.updateProperty(modify->_imageIdx, property);
|
modifyXISF.updateProperty(modify->_imageIdx, property);
|
||||||
|
|
||||||
modifyXISF.save(out.toLocal8Bit().toStdString());
|
modifyXISF.save(out.filesystemFilePath());
|
||||||
modifyXISF.close();
|
modifyXISF.close();
|
||||||
std::filesystem::rename(out.toLocal8Bit().toStdString(), in.toLocal8Bit().toStdString());
|
std::filesystem::rename(out.filesystemFilePath(), in.filesystemFilePath());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch(std::filesystem::filesystem_error &err)
|
catch(std::filesystem::filesystem_error &err)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
#include "../src/rawimage.h"
|
#include "../src/rawimage.h"
|
||||||
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
#include "stb_image_write.h"
|
#include "stb_image_write.h"
|
||||||
|
|||||||
Reference in New Issue
Block a user