Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a1e98d818b | |||
| f3f194bcef | |||
| efd36f96c3 | |||
| 37923b37b3 | |||
| 900453577e | |||
| 34d466c3e0 | |||
| 9e98127084 | |||
| ba6062b925 |
+4
-5
@@ -98,12 +98,14 @@ void Image::thumbnailLoadFinish(void *rawImage)
|
|||||||
emit thumbnailLoaded(this);
|
emit thumbnailLoaded(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageRingList::ImageRingList(Database *database, QObject *parent) : QAbstractItemModel(parent)
|
ImageRingList::ImageRingList(Database *database, const QStringList &nameFilter, QObject *parent) : QAbstractItemModel(parent)
|
||||||
, m_liveMode(false)
|
, m_liveMode(false)
|
||||||
, m_analyzeLevel(None)
|
, m_analyzeLevel(None)
|
||||||
, m_database(database)
|
, m_database(database)
|
||||||
|
, m_nameFilter(nameFilter)
|
||||||
{
|
{
|
||||||
connect(&m_fileSystemWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(dirChanged(QString)));
|
connect(&m_fileSystemWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(dirChanged(QString)));
|
||||||
|
m_nameFilter.replaceInStrings(QRegExp("^"), "*.");
|
||||||
m_thumbPool = new QThreadPool(this);
|
m_thumbPool = new QThreadPool(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,10 +124,7 @@ bool ImageRingList::setDir(const QString path, const QString ¤tFile)
|
|||||||
|
|
||||||
if(dir.exists())
|
if(dir.exists())
|
||||||
{
|
{
|
||||||
QStringList nameFilter;
|
QStringList list = dir.entryList(m_nameFilter, QDir::Files | QDir::Readable, m_liveMode ? QDir::Time : QDir::Name | QDir::IgnoreCase);
|
||||||
nameFilter << "*.jpg" << "*.jpeg" << "*.png" << "*.cr2" << "*.nef" << "*.dng" << "*.fit" << "*.fits" << "*.xisf";
|
|
||||||
|
|
||||||
QStringList list = dir.entryList(nameFilter, QDir::Files | QDir::Readable, m_liveMode ? QDir::Time : QDir::Name | QDir::IgnoreCase);
|
|
||||||
QStringList absolutePaths;
|
QStringList absolutePaths;
|
||||||
foreach(const QString &file, list)
|
foreach(const QString &file, list)
|
||||||
{
|
{
|
||||||
|
|||||||
+2
-1
@@ -60,8 +60,9 @@ class ImageRingList : public QAbstractItemModel
|
|||||||
AnalyzeLevel m_analyzeLevel;
|
AnalyzeLevel m_analyzeLevel;
|
||||||
QThreadPool *m_thumbPool;
|
QThreadPool *m_thumbPool;
|
||||||
Database *m_database;
|
Database *m_database;
|
||||||
|
QStringList m_nameFilter;
|
||||||
public:
|
public:
|
||||||
explicit ImageRingList(Database *database, QObject *parent = 0);
|
explicit ImageRingList(Database *database, const QStringList &nameFilter, QObject *parent = 0);
|
||||||
~ImageRingList() override;
|
~ImageRingList() override;
|
||||||
bool setDir(const QString path, const QString ¤tFile = QString());
|
bool setDir(const QString path, const QString ¤tFile = QString());
|
||||||
void setFile(const QString &file);
|
void setFile(const QString &file);
|
||||||
|
|||||||
+4
-10
@@ -27,10 +27,10 @@ const RawImageType rawImageTypes[] = {
|
|||||||
{QOpenGLTexture::Red, QOpenGLTexture::R32F, QOpenGLTexture::Float32, true},
|
{QOpenGLTexture::Red, QOpenGLTexture::R32F, QOpenGLTexture::Float32, true},
|
||||||
#ifdef COLOR_MANAGMENT
|
#ifdef COLOR_MANAGMENT
|
||||||
{QOpenGLTexture::RGB, QOpenGLTexture::SRGB8, QOpenGLTexture::UInt8, false},
|
{QOpenGLTexture::RGB, QOpenGLTexture::SRGB8, QOpenGLTexture::UInt8, false},
|
||||||
{QOpenGLTexture::RGBA,QOpenGLTexture::SRGB8, QOpenGLTexture::UInt8, false},
|
{QOpenGLTexture::RGBA,QOpenGLTexture::SRGB8_Alpha8, QOpenGLTexture::UInt8, false},
|
||||||
#else
|
#else
|
||||||
{QOpenGLTexture::RGB, QOpenGLTexture::RGB8_UNorm, QOpenGLTexture::UInt8, false},
|
{QOpenGLTexture::RGB, QOpenGLTexture::RGB8_UNorm, QOpenGLTexture::UInt8, false},
|
||||||
{QOpenGLTexture::RGBA,QOpenGLTexture::RGB8_UNorm, QOpenGLTexture::UInt8, false},
|
{QOpenGLTexture::RGBA,QOpenGLTexture::RGBA8_UNorm, QOpenGLTexture::UInt8, false},
|
||||||
#endif
|
#endif
|
||||||
{QOpenGLTexture::RGB, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false},
|
{QOpenGLTexture::RGB, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false},
|
||||||
{QOpenGLTexture::RGBA, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false},
|
{QOpenGLTexture::RGBA, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false},
|
||||||
@@ -87,9 +87,6 @@ ImageWidget::ImageWidget(Database *database, QWidget *parent) : QOpenGLWidget(pa
|
|||||||
});
|
});
|
||||||
|
|
||||||
setMouseTracking(true);
|
setMouseTracking(true);
|
||||||
#ifdef COLOR_MANAGMENT
|
|
||||||
setTextureFormat(GL_SRGB8_ALPHA8);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageWidget::~ImageWidget()
|
ImageWidget::~ImageWidget()
|
||||||
@@ -335,9 +332,6 @@ void ImageWidget::paintGL()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifdef COLOR_MANAGMENT
|
|
||||||
if(m_srgb)f->glEnable(GL_FRAMEBUFFER_SRGB);
|
|
||||||
#endif
|
|
||||||
m_vao->bind();
|
m_vao->bind();
|
||||||
m_image->bind(0);
|
m_image->bind(0);
|
||||||
m_program->bind();
|
m_program->bind();
|
||||||
@@ -347,10 +341,10 @@ void ImageWidget::paintGL()
|
|||||||
m_program->setUniformValue("zoom", 1.0f/m_scale);
|
m_program->setUniformValue("zoom", 1.0f/m_scale);
|
||||||
m_program->setUniformValue("bw", m_bwImg);
|
m_program->setUniformValue("bw", m_bwImg);
|
||||||
m_program->setUniformValue("invert", m_invert);
|
m_program->setUniformValue("invert", m_invert);
|
||||||
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
|
||||||
#ifdef COLOR_MANAGMENT
|
#ifdef COLOR_MANAGMENT
|
||||||
if(m_srgb)f->glDisable(GL_FRAMEBUFFER_SRGB);
|
m_program->setUniformValue("srgb", m_srgb);
|
||||||
#endif
|
#endif
|
||||||
|
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -406,7 +406,7 @@ void LoadRunable::run()
|
|||||||
{
|
{
|
||||||
QImage img(m_file);
|
QImage img(m_file);
|
||||||
#ifdef COLOR_MANAGMENT
|
#ifdef COLOR_MANAGMENT
|
||||||
if(img.colorSpace().isValid())
|
if(img.colorSpace().isValid() && img.colorSpace() != QColorSpace::SRgb)
|
||||||
img.convertToColorSpace(QColorSpace::SRgb);
|
img.convertToColorSpace(QColorSpace::SRgb);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -15,9 +15,6 @@ int main(int argc, char *argv[])
|
|||||||
format.setMinorVersion(3);
|
format.setMinorVersion(3);
|
||||||
format.setOption(QSurfaceFormat::DebugContext);
|
format.setOption(QSurfaceFormat::DebugContext);
|
||||||
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);
|
format.setProfile(QSurfaceFormat::OpenGLContextProfile::CoreProfile);
|
||||||
#ifdef COLOR_MANAGMENT
|
|
||||||
format.setColorSpace(QSurfaceFormat::sRGBColorSpace);
|
|
||||||
#endif
|
|
||||||
QSurfaceFormat::setDefaultFormat(format);
|
QSurfaceFormat::setDefaultFormat(format);
|
||||||
|
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|||||||
+42
-13
@@ -16,6 +16,8 @@
|
|||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
#include <QThreadPool>
|
#include <QThreadPool>
|
||||||
#include <QStatusBar>
|
#include <QStatusBar>
|
||||||
|
#include <QImageReader>
|
||||||
|
#include <QMimeDatabase>
|
||||||
#include "loadrunable.h"
|
#include "loadrunable.h"
|
||||||
#include "markedfiles.h"
|
#include "markedfiles.h"
|
||||||
#include "about.h"
|
#include "about.h"
|
||||||
@@ -37,6 +39,24 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
|
|||||||
|
|
||||||
SettingsDialog::loadSettings();
|
SettingsDialog::loadSettings();
|
||||||
|
|
||||||
|
QStringList nameFilter;
|
||||||
|
_saveFilter = tr("FITS (*.fits *.fit);;XISF (*.xisf);;");
|
||||||
|
_openFilter = tr("Images (");
|
||||||
|
QMimeDatabase db;
|
||||||
|
auto supportedFormats = QImageReader::supportedMimeTypes();
|
||||||
|
QStringList filters;
|
||||||
|
for(auto format : supportedFormats)
|
||||||
|
{
|
||||||
|
QMimeType mimeType = db.mimeTypeForName(format);
|
||||||
|
_saveFilter.append(mimeType.filterString() + ";;");
|
||||||
|
_openFilter.append("*.");
|
||||||
|
_openFilter.append(mimeType.suffixes().join(" *."));
|
||||||
|
_openFilter.append(" ");
|
||||||
|
nameFilter.append(mimeType.suffixes());
|
||||||
|
}
|
||||||
|
_openFilter.append("*.fit *.fits *.xisf *.cr2 *.nef *.dng)");
|
||||||
|
nameFilter.append({"fit", "fits", "xisf", "cr2", "nef", "dng"});
|
||||||
|
|
||||||
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);
|
||||||
infoDock->setWidget(m_info);
|
infoDock->setWidget(m_info);
|
||||||
@@ -62,7 +82,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
|
|||||||
connect(m_stretchPanel, &StretchToolbar::invert, m_imageGL->imageWidget(), &ImageWidget::invert);
|
connect(m_stretchPanel, &StretchToolbar::invert, m_imageGL->imageWidget(), &ImageWidget::invert);
|
||||||
connect(m_stretchPanel, &StretchToolbar::superPixel, m_imageGL->imageWidget(), &ImageWidget::superPixel);
|
connect(m_stretchPanel, &StretchToolbar::superPixel, m_imageGL->imageWidget(), &ImageWidget::superPixel);
|
||||||
|
|
||||||
m_ringList = new ImageRingList(m_database, this);
|
m_ringList = new ImageRingList(m_database, nameFilter, this);
|
||||||
m_filesystem = new FilesystemWidget(m_ringList, this);
|
m_filesystem = new FilesystemWidget(m_ringList, this);
|
||||||
connect(m_filesystem, SIGNAL(fileSelected(int)), this, SLOT(loadFile(int)));
|
connect(m_filesystem, SIGNAL(fileSelected(int)), this, SLOT(loadFile(int)));
|
||||||
|
|
||||||
@@ -296,7 +316,7 @@ void MainWindow::copyOrMove(bool copy)
|
|||||||
QString dest = QFileDialog::getExistingDirectory(this,
|
QString dest = QFileDialog::getExistingDirectory(this,
|
||||||
tr("Select destination"),
|
tr("Select destination"),
|
||||||
_lastDir,
|
_lastDir,
|
||||||
QFileDialog::ShowDirsOnly | QFileDialog::DontUseNativeDialog);
|
QFileDialog::ShowDirsOnly);
|
||||||
copyOrMove(copy, dest);
|
copyOrMove(copy, dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -312,6 +332,7 @@ void MainWindow::copyOrMove(bool copy, const QString &dest)
|
|||||||
progress.show();
|
progress.show();
|
||||||
foreach(const QString &file, files)
|
foreach(const QString &file, files)
|
||||||
{
|
{
|
||||||
|
bool result = false;
|
||||||
QFileInfo info(file);
|
QFileInfo info(file);
|
||||||
QFile srcFile(file);
|
QFile srcFile(file);
|
||||||
QFile dstFile(dir.absoluteFilePath(info.fileName()));
|
QFile dstFile(dir.absoluteFilePath(info.fileName()));
|
||||||
@@ -320,7 +341,7 @@ void MainWindow::copyOrMove(bool copy, const QString &dest)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(progress.wasCanceled())
|
if(progress.wasCanceled())
|
||||||
break;
|
return;
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
if(copy)
|
if(copy)
|
||||||
{
|
{
|
||||||
@@ -330,20 +351,30 @@ void MainWindow::copyOrMove(bool copy, const QString &dest)
|
|||||||
{
|
{
|
||||||
dstFile.remove();
|
dstFile.remove();
|
||||||
dstFile.close();
|
dstFile.close();
|
||||||
qDebug() << dstFile.fileName();
|
result = srcFile.copy(dstFile.fileName());
|
||||||
srcFile.copy(dstFile.fileName());
|
|
||||||
}
|
}
|
||||||
|
else result = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
srcFile.rename(dstFile.fileName());
|
result = srcFile.rename(dstFile.fileName());
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if(copy)
|
if(copy)
|
||||||
srcFile.copy(dstFile.fileName());
|
result = srcFile.copy(dstFile.fileName());
|
||||||
else
|
else
|
||||||
srcFile.rename(dstFile.fileName());
|
result = srcFile.rename(dstFile.fileName());
|
||||||
#endif
|
#endif
|
||||||
|
if(!result)
|
||||||
|
{
|
||||||
|
QString t = copy ? tr("Failed to copy") : tr("Failed to move");
|
||||||
|
QString m = copy ? tr("Failed to copy from %1 to %2") : tr("Failed to move from %1 to %2");
|
||||||
|
QMessageBox::StandardButton button = QMessageBox::warning(this, t,
|
||||||
|
m.arg(srcFile.fileName()).arg(dir.absolutePath()),
|
||||||
|
QMessageBox::Ignore | QMessageBox::Abort);
|
||||||
|
qDebug() << button;
|
||||||
|
if(button == QMessageBox::Abort)return;
|
||||||
|
}
|
||||||
progress.setValue(i++);
|
progress.setValue(i++);
|
||||||
}
|
}
|
||||||
m_database->clearMarkedFiles();
|
m_database->clearMarkedFiles();
|
||||||
@@ -372,9 +403,7 @@ void MainWindow::loadFile()
|
|||||||
QString file = QFileDialog::getOpenFileName(this,
|
QString file = QFileDialog::getOpenFileName(this,
|
||||||
tr("Open file"),
|
tr("Open file"),
|
||||||
_lastDir,
|
_lastDir,
|
||||||
tr("Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)"),
|
_openFilter);
|
||||||
nullptr,
|
|
||||||
QFileDialog::DontUseNativeDialog);
|
|
||||||
loadFile(file);
|
loadFile(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,7 +430,7 @@ void MainWindow::loadFile(int row)
|
|||||||
|
|
||||||
void MainWindow::indexDir()
|
void MainWindow::indexDir()
|
||||||
{
|
{
|
||||||
QString dir = QFileDialog::getExistingDirectory(this, tr("Index directory"), _lastDir, QFileDialog::ShowDirsOnly | QFileDialog::DontUseNativeDialog);
|
QString dir = QFileDialog::getExistingDirectory(this, tr("Index directory"), _lastDir, QFileDialog::ShowDirsOnly);
|
||||||
indexDir(dir);
|
indexDir(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,7 +457,7 @@ void MainWindow::saveAs()
|
|||||||
QString file = QFileDialog::getSaveFileName(this,
|
QString file = QFileDialog::getSaveFileName(this,
|
||||||
tr("Save as"),
|
tr("Save as"),
|
||||||
_lastDir,
|
_lastDir,
|
||||||
tr("JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)"),
|
_saveFilter,
|
||||||
&selectedFilter);
|
&selectedFilter);
|
||||||
auto filterToFormat = [](const QString &file, const QString &filter) -> const char*
|
auto filterToFormat = [](const QString &file, const QString &filter) -> const char*
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ class MainWindow : public QMainWindow
|
|||||||
QSocketNotifier *socketNotifier;
|
QSocketNotifier *socketNotifier;
|
||||||
QString _lastDir;
|
QString _lastDir;
|
||||||
bool _maximized;
|
bool _maximized;
|
||||||
|
QString _openFilter;
|
||||||
|
QString _saveFilter;
|
||||||
public:
|
public:
|
||||||
MainWindow(QWidget *parent = 0);
|
MainWindow(QWidget *parent = 0);
|
||||||
~MainWindow() override;
|
~MainWindow() override;
|
||||||
|
|||||||
@@ -4,9 +4,17 @@ uniform sampler2D qt_Texture0;
|
|||||||
uniform vec3 mtf_param;
|
uniform vec3 mtf_param;
|
||||||
uniform bool bw;
|
uniform bool bw;
|
||||||
uniform bool invert;
|
uniform bool invert;
|
||||||
|
uniform bool srgb;
|
||||||
in vec2 qt_TexCoord0;
|
in vec2 qt_TexCoord0;
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
|
||||||
|
vec3 Linear2sRGB(vec3 color)
|
||||||
|
{
|
||||||
|
return mix(12.92 * color.rgb,
|
||||||
|
1.055 * pow(color, vec3(1.0 / 2.4)) - 0.055,
|
||||||
|
greaterThan(color, vec3(0.0031308)));
|
||||||
|
}
|
||||||
|
|
||||||
vec4 MTF(vec4 x, vec3 m)
|
vec4 MTF(vec4 x, vec3 m)
|
||||||
{
|
{
|
||||||
x = (x - m.x) / (m.z - m.x);
|
x = (x - m.x) / (m.z - m.x);
|
||||||
@@ -14,6 +22,12 @@ vec4 MTF(vec4 x, vec3 m)
|
|||||||
return ((m.y - 1) * x) / ((2 * m.y - 1) * x - m.y);
|
return ((m.y - 1) * x) / ((2 * m.y - 1) * x - m.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vec3 checker()
|
||||||
|
{
|
||||||
|
vec2 pattern = fract(gl_FragCoord.xy * 0.0625) - 0.5;
|
||||||
|
return vec3(step(pattern.x * pattern.y, 0.0) * 0.25 + 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
color = texture(qt_Texture0, qt_TexCoord0);
|
color = texture(qt_Texture0, qt_TexCoord0);
|
||||||
@@ -22,6 +36,10 @@ void main(void)
|
|||||||
|
|
||||||
if(invert)color = vec4(1.0) - color;
|
if(invert)color = vec4(1.0) - color;
|
||||||
|
|
||||||
|
color.rgb = mix(checker(), color.rgb, color.a);
|
||||||
|
|
||||||
|
if(srgb)color.rgb = Linear2sRGB(color.rgb);
|
||||||
|
|
||||||
if(any(lessThan(qt_TexCoord0, vec2(0.0))) || any(greaterThan(qt_TexCoord0, vec2(1.0))))
|
if(any(lessThan(qt_TexCoord0, vec2(0.0))) || any(greaterThan(qt_TexCoord0, vec2(1.0))))
|
||||||
color = vec4(0.0, 0.0, 0.0, 1.0);
|
color = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,6 @@ Exec=tenmon %U
|
|||||||
Icon=space.nouspiro.tenmon
|
Icon=space.nouspiro.tenmon
|
||||||
Comment=FITS Image viewer
|
Comment=FITS Image viewer
|
||||||
Name=Tenmon
|
Name=Tenmon
|
||||||
Categories=Graphics;2DGraphics;RasterGraphics;Viewer;
|
Categories=Graphics;2DGraphics;RasterGraphics;Viewer;Science;Astronomy
|
||||||
MimeType=image/fits;image/x-xisf;
|
MimeType=image/fits;image/x-xisf;
|
||||||
Terminal=false
|
Terminal=false
|
||||||
|
|||||||
@@ -12,9 +12,10 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>FITS 8, 16 bit integer and 32 bit float</li>
|
<li>FITS 8, 16 bit integer and 32 bit float</li>
|
||||||
<li>XISF 8, 16 bit integer and 32 bit float</li>
|
<li>XISF 8, 16 bit integer and 32 bit float</li>
|
||||||
<li>JPEG and PNG images</li>
|
<li>JPEG, PNG, BMP, GIF, PBM, PGM, PPM and SVG images</li>
|
||||||
</ul>
|
</ul>
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
Features:
|
Features:
|
||||||
<ul>
|
<ul>
|
||||||
<li>Using same stretch function as PixInsight</li>
|
<li>Using same stretch function as PixInsight</li>
|
||||||
@@ -27,7 +28,6 @@
|
|||||||
<li>Support for WCS</li>
|
<li>Support for WCS</li>
|
||||||
<li>Thumbnails</li>
|
<li>Thumbnails</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
|
||||||
</p>
|
</p>
|
||||||
</description>
|
</description>
|
||||||
<url type="homepage">https://nouspiro.space/?page_id=206</url>
|
<url type="homepage">https://nouspiro.space/?page_id=206</url>
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
</screenshots>
|
</screenshots>
|
||||||
<content_rating type="oars-1.1"/>
|
<content_rating type="oars-1.1"/>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="20221209" date="2022-12-09"/>
|
||||||
<release version="20221126" date="2022-11-26"/>
|
<release version="20221126" date="2022-11-26"/>
|
||||||
<release version="20221121" date="2022-11-11"/>
|
<release version="20221121" date="2022-11-11"/>
|
||||||
<release version="20221023" date="2022-10-23"/>
|
<release version="20221023" date="2022-10-23"/>
|
||||||
|
|||||||
Binary file not shown.
@@ -304,7 +304,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
|
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
|
||||||
<translation>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
|
<translation type="vanished">JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Reindex files</source>
|
<source>Reindex files</source>
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
|
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
|
||||||
<translation>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</translation>
|
<translation type="vanished">Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Edit</source>
|
<source>Edit</source>
|
||||||
@@ -332,12 +332,44 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>FITS header editor</source>
|
<source>FITS header editor</source>
|
||||||
<translation>FITS header editor</translation>
|
<translation type="vanished">FITS header editor</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>Settings</translation>
|
<translation>Settings</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Images (</source>
|
||||||
|
<translation>Images (</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>FITS (*.fits *.fit);;XISF (*.xisf);;</source>
|
||||||
|
<translation>FITS image (*.fits *.fit);;XISF image (*.xisf);;</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy</source>
|
||||||
|
<translation>Failed to copy</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move</source>
|
||||||
|
<translation>Failed to move</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy %1 from to %2</source>
|
||||||
|
<translation type="vanished">Failed to copy from %1 to %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move from %1 to %2</source>
|
||||||
|
<translation>Failed to move from %1 to %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy from %1 to %2</source>
|
||||||
|
<translation>Failed to copy from %1 to %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move from %1 to %2ˇ</source>
|
||||||
|
<translation type="obsolete">Failed to move from %1 to %2ˇ {1 ?}</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MarkedFiles</name>
|
<name>MarkedFiles</name>
|
||||||
|
|||||||
Binary file not shown.
@@ -304,7 +304,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
|
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
|
||||||
<translation>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
|
<translation type="vanished">JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Reindex files</source>
|
<source>Reindex files</source>
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
|
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
|
||||||
<translation>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</translation>
|
<translation type="vanished">Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Edit</source>
|
<source>Edit</source>
|
||||||
@@ -332,12 +332,44 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>FITS header editor</source>
|
<source>FITS header editor</source>
|
||||||
<translation>Éditeur d'en-tête FITS</translation>
|
<translation type="vanished">Éditeur d'en-tête FITS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>Réglages</translation>
|
<translation>Réglages</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Images (</source>
|
||||||
|
<translation>Images (</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>FITS (*.fits *.fit);;XISF (*.xisf);;</source>
|
||||||
|
<translation>FITS image (*.fits *.fit);;XISF image (*.xisf);;</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy</source>
|
||||||
|
<translation type="unfinished">Échec de la copie</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move</source>
|
||||||
|
<translation type="unfinished">Échec du déplacement</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy %1 from to %2</source>
|
||||||
|
<translation type="obsolete">Échec de la copie de %1 vers %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move from %1 to %2</source>
|
||||||
|
<translation type="unfinished">Échec du déplacement de %1 vers %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy from %1 to %2</source>
|
||||||
|
<translation type="unfinished">Échec de la copie de %1 vers %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move from %1 to %2ˇ</source>
|
||||||
|
<translation type="obsolete">Échec du déplacement de %1 vers %2ˇ {1 ?}</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MarkedFiles</name>
|
<name>MarkedFiles</name>
|
||||||
|
|||||||
Binary file not shown.
@@ -317,7 +317,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
|
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
|
||||||
<translation>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
|
<translation type="vanished">JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Reindex files</source>
|
<source>Reindex files</source>
|
||||||
@@ -337,7 +337,7 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
|
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
|
||||||
<translation>Obrázky (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</translation>
|
<translation type="vanished">Obrázky (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Edit</source>
|
<source>Edit</source>
|
||||||
@@ -345,12 +345,44 @@
|
|||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>FITS header editor</source>
|
<source>FITS header editor</source>
|
||||||
<translation>Editor FITS hlavičky</translation>
|
<translation type="vanished">Editor FITS hlavičky</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>Nastavenia</translation>
|
<translation>Nastavenia</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Images (</source>
|
||||||
|
<translation>Obrázky (</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>FITS (*.fits *.fit);;XISF (*.xisf);;</source>
|
||||||
|
<translation>Obrázok FITS (*.fits *.fit);;Obrázok XISF (*.xisf);;</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy</source>
|
||||||
|
<translation>Zlyhalo kopírovanie</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move</source>
|
||||||
|
<translation>Zlyhalo presúvanie</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy %1 from to %2</source>
|
||||||
|
<translation type="vanished">Zlyhalo kopírovanie z %1 do %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move from %1 to %2</source>
|
||||||
|
<translation>Zlyhalo presúvanie z %1 do %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to copy from %1 to %2</source>
|
||||||
|
<translation>Zlyhalo kopírovanie z %1 do %2</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Failed to move from %1 to %2ˇ</source>
|
||||||
|
<translation type="obsolete">Zlyhalo presúvanie z %1 do %2ˇ {1 ?}</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>MarkedFiles</name>
|
<name>MarkedFiles</name>
|
||||||
|
|||||||
Reference in New Issue
Block a user