Compare commits

...

9 Commits

Author SHA1 Message Date
nou 0368c1f1dc Update metainfo xml 2022-12-10 07:48:17 +01:00
nou a1e98d818b Fix copy on btrfs 2022-12-09 19:58:15 +01:00
nou f3f194bcef Update translation and metainfo 2022-12-09 19:33:26 +01:00
nou efd36f96c3 Use native dialogs 2022-12-09 18:38:07 +01:00
nou 37923b37b3 Add error message for copy/move 2022-12-09 18:36:43 +01:00
nou 900453577e Fix includes 2022-11-28 17:36:37 +01:00
nou 34d466c3e0 Show checker pattern with transparent files 2022-11-28 17:32:23 +01:00
nou 9e98127084 Do gamma conversion manualy
Requesting sRGB capable framebuffer is unreliable
2022-11-28 17:31:50 +01:00
nou ba6062b925 Enale loading all image types that Qt can load 2022-11-27 21:10:43 +01:00
16 changed files with 208 additions and 65 deletions
+4 -5
View File
@@ -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 &currentFile)
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
View File
@@ -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 &currentFile = QString()); bool setDir(const QString path, const QString &currentFile = QString());
void setFile(const QString &file); void setFile(const QString &file);
+4 -10
View File
@@ -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
View File
@@ -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
-3
View File
@@ -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
View File
@@ -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*
{ {
+2
View File
@@ -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;
+18
View File
@@ -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);
+1 -1
View File
@@ -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
+29 -22
View File
@@ -7,30 +7,36 @@
<metadata_license>CC0-1.0</metadata_license> <metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0</project_license> <project_license>GPL-3.0</project_license>
<description> <description>
<p> <p>It is intended primarily for viewing astro photos and images. It supports the following formats:</p>
It is intended primarily for viewing astro photos and images. It supports the following formats: <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, PNG, BMP, GIF, PBM, PGM, PPM and SVG images</li>
<li>JPEG and PNG images</li> </ul>
</ul> <p>Features of applications:</p>
</p> <ul>
Features: <li>Using same stretch function as PixInsight</li>
<ul> <li>OpenGL accelerated drawing</li>
<li>Using same stretch function as PixInsight</li> <li>Index and search FITS XISF header data</li>
<li>OpenGL accelerated drawing</li> <li>Quick mark images and then copy/move marked files</li>
<li>Index and search FITS XISF header data</li> <li>Convert FITS &lt;-&gt; XISF</li>
<li>Quick mark images and then copy/move marked files</li> <li>Convert FITS/XISF -&gt; JPEG/PNG</li>
<li>Convert FITS &lt;-&gt; XISF</li> <li>Image statistics mean, media, min, max</li>
<li>Convert FITS/XISF -&gt; JPEG/PNG</li> <li>Support for WCS</li>
<li>Image statistics mean, media, min, max</li> <li>Thumbnails</li>
<li>Support for WCS</li> </ul>
<li>Thumbnails</li>
</ul>
<p>
</p>
</description> </description>
<categories>
<category>Graphics</category>
<category>Viewer</category>
<category>Science</category>
<category>Astronomy</category>
</categories>
<keywords>
<keyword>astronomy</keyword>
</keywords>
<url type="homepage">https://nouspiro.space/?page_id=206</url> <url type="homepage">https://nouspiro.space/?page_id=206</url>
<url type="bugtracker">https://github.com/flathub/space.nouspiro.tenmon/issues</url>
<screenshots> <screenshots>
<screenshot type="default"> <screenshot type="default">
<image>https://nouspiro.space/wp-content/uploads/2022/04/tenmon-1024x579.png</image> <image>https://nouspiro.space/wp-content/uploads/2022/04/tenmon-1024x579.png</image>
@@ -38,6 +44,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.
+35 -3
View File
@@ -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.
+35 -3
View File
@@ -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&apos;en-tête FITS</translation> <translation type="vanished">Éditeur d&apos;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.
+35 -3
View File
@@ -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>