Compare commits

..

17 Commits

Author SHA1 Message Date
nou 71fc1f2bd1 Release 20221215 2022-12-15 20:54:39 +01:00
nou f1ff04382b Add option to not use native file dialogs
Thanks to Patrick Chevalley for updated french tranlation
2022-12-15 20:36:19 +01:00
nou ad91adf1d9 Implement workaround for flatpak QFile::moveToTrash 2022-12-15 17:26:16 +01:00
nou b7369c2501 Remove unused variables in debayer shader 2022-12-15 00:25:00 +01:00
nou 79ed6b2059 Fix error in slovak translation 2022-12-15 00:10:52 +01:00
nou 380974a088 Allow saving debayered image 2022-12-15 00:03:29 +01:00
nou b1ad56ca1f Fix debayer shader 2022-12-15 00:03:14 +01:00
nou 58abef5a72 Update metainfo 2022-12-14 22:00:07 +01:00
nou 5427ff57cb Change superpixel tooltip 2022-12-14 21:58:24 +01:00
nou 6a2fa3f656 Update translation 2022-12-14 21:51:19 +01:00
nou c62ec7db8c Add move to trash action 2022-12-14 21:51:05 +01:00
nou d5eb0fdce5 Change key shortcuts 2022-12-14 21:50:30 +01:00
nou 6d25919e1f Add image formats to help 2022-12-14 21:50:05 +01:00
nou 26d1af6077 Add debayer 2022-12-14 21:18:25 +01:00
nou 44d8a8b856 Fix invert button 2022-12-14 17:42:13 +01:00
nou dab6c1f79d Add All files filter to open dialog 2022-12-14 17:16:32 +01:00
nou ce6a4cc40c Refresh dir when show hidden files is toggled 2022-12-13 21:31:23 +01:00
24 changed files with 331 additions and 114 deletions
+5 -1
View File
@@ -25,6 +25,7 @@ set(TENMON_SRC
about.cpp about.cpp
database.cpp database.cpp
databaseview.cpp databaseview.cpp
delete.cpp
filesystemwidget.cpp filesystemwidget.cpp
imageinfo.cpp imageinfo.cpp
imageringlist.cpp imageringlist.cpp
@@ -63,6 +64,8 @@ elseif(APPLE)
else() else()
add_compile_definitions("__PCL_LINUX") add_compile_definitions("__PCL_LINUX")
set(tenmon_ICON "") set(tenmon_ICON "")
find_package(PkgConfig REQUIRED)
pkg_search_module(GIO REQUIRED gio-2.0)
endif() endif()
add_executable(tenmon WIN32 MACOSX_BUNDLE ${tenmon_ICON} ${TENMON_SRC}) add_executable(tenmon WIN32 MACOSX_BUNDLE ${tenmon_ICON} ${TENMON_SRC})
@@ -76,13 +79,14 @@ elseif(APPLE)
target_link_directories(tenmon PRIVATE 3rdparty/lib/MacOS) target_link_directories(tenmon PRIVATE 3rdparty/lib/MacOS)
else() else()
target_link_directories(tenmon PRIVATE 3rdparty/lib/Linux) target_link_directories(tenmon PRIVATE 3rdparty/lib/Linux)
target_include_directories(tenmon PRIVATE ${GIO_INCLUDE_DIRS})
endif() endif()
target_link_libraries(tenmon Qt5::Widgets Qt5::Sql ${OpenCV_LIBS} ${GSL_LIB} ${GSLCBLAS_LIB} ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB}) target_link_libraries(tenmon Qt5::Widgets Qt5::Sql ${OpenCV_LIBS} ${GSL_LIB} ${GSLCBLAS_LIB} ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB})
if(APPLE) if(APPLE)
target_link_libraries(tenmon PCL-pxi lcms-pxi lz4-pxi RFC6234-pxi zlib-pxi "-framework CoreFoundation") target_link_libraries(tenmon PCL-pxi lcms-pxi lz4-pxi RFC6234-pxi zlib-pxi "-framework CoreFoundation")
else() else()
target_link_libraries(tenmon PCL lcms lz4 RFC6234 zlib) target_link_libraries(tenmon PCL lcms lz4 RFC6234 zlib ${GIO_LDFLAGS})
endif(APPLE) endif(APPLE)
if(LIBRAW_STATIC) if(LIBRAW_STATIC)
+1 -1
View File
@@ -13,7 +13,7 @@ img { margin: 5px; }
<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>
<li>CR2, NEF, DNG raw images</li> <li>CR2, NEF, DNG raw images</li>
</ul> </ul>
</p> </p>
+1 -1
View File
@@ -13,7 +13,7 @@ img { margin: 5px; }
<ul> <ul>
<li>FITS 8, 16 bit entier et 32 bit point flottant</li> <li>FITS 8, 16 bit entier et 32 bit point flottant</li>
<li>XISF 8, 16 bit entier et 32 bit point flottant</li> <li>XISF 8, 16 bit entier et 32 bit point flottant</li>
<li>images JPEG et PNG</li> <li>images JPEG, PNG, BMP, GIF, PBM, PGM, PPM et SVG</li>
<li>images RAW CR2, NEF, DNG</li> <li>images RAW CR2, NEF, DNG</li>
</ul> </ul>
</p> </p>
+1 -1
View File
@@ -12,7 +12,7 @@ p { padding:0px; margin:5px 5px 10px 5px; }
<ul> <ul>
<li>FITS 8, 16 bitové celočíselné a 32 bitové s plávajúcou čiarkou</li> <li>FITS 8, 16 bitové celočíselné a 32 bitové s plávajúcou čiarkou</li>
<li>XISF 8, 16 bitové celočíselné a 32 bitové s plávajúcou čiarkou</li> <li>XISF 8, 16 bitové celočíselné a 32 bitové s plávajúcou čiarkou</li>
<li>JPEG a PNG obrázky</li> <li>JPEG, PNG, BMP, GIF, PBM, PGM, PPM a SVG obrázky</li>
<li>CR2, NEF, DNG raw obrázky</li> <li>CR2, NEF, DNG raw obrázky</li>
</ul> </ul>
</p> </p>
+30
View File
@@ -0,0 +1,30 @@
#ifdef __linux__
#define QT_NO_KEYWORDS
#include <QString>
#include <iostream>
#include <gio/gio.h>
//flatpak bug prevent to use QFile::moveToTrash
bool moveToTrash(const QString &path)
{
GFile *gfile = g_file_new_for_path(path.toLocal8Bit().data());
GError *error = nullptr;
g_file_trash(gfile, nullptr, &error);
if(error)std::cerr << "failed to trash file " << error->code << " " << error->message << std::endl;
g_clear_error(&error);
g_object_unref(gfile);
return true;
}
#else
#include <QFile>
#include <QString>
bool moveToTrash(const QString &path)
{
return QFile::moveToTrash(path);
}
#endif
+1
View File
@@ -127,6 +127,7 @@ void Filetree::contextMenuEvent(QContextMenuEvent *event)
auto filter = m_fileSystemModel->filter(); auto filter = m_fileSystemModel->filter();
filter ^= QDir::Hidden; filter ^= QDir::Hidden;
m_fileSystemModel->setFilter(filter); m_fileSystemModel->setFilter(filter);
m_fileSystemModel->setRootPath(m_rootDir);
} }
} }
+53 -4
View File
@@ -153,7 +153,11 @@ void ImageWidget::setImage(std::shared_ptr<RawImage> image, int index)
} }
else m_image->generateMipMaps(); else m_image->generateMipMaps();
m_image->setLevelOfDetailRange(m_superpixel ? 1 : 0, m_image->mipMaxLevel()); if(m_debayerTex)
{
f->glDeleteTextures(1, &m_debayerTex);
m_debayerTex = 0;
}
update(); update();
} }
@@ -212,7 +216,6 @@ void ImageWidget::setOffset(int dx, int dy)
void ImageWidget::superPixel(bool enable) void ImageWidget::superPixel(bool enable)
{ {
m_superpixel = enable; m_superpixel = enable;
m_image->setLevelOfDetailRange(enable ? 1 : 0, m_image->mipMaxLevel());
update(); update();
} }
@@ -236,6 +239,9 @@ QImage ImageWidget::renderToImage()
m_program->setUniformValue("offset", 0.0f, 0.0f); m_program->setUniformValue("offset", 0.0f, 0.0f);
m_program->setUniformValue("zoom", 1.0f); m_program->setUniformValue("zoom", 1.0f);
if(m_superpixel && m_debayerTex)
f->glBindTexture(GL_TEXTURE_2D, m_debayerTex);
else
m_image->bind(0); m_image->bind(0);
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
@@ -332,14 +338,20 @@ void ImageWidget::paintGL()
} }
else else
{ {
debayer();
m_vao->bind(); m_vao->bind();
if(m_superpixel && m_debayerTex)
f->glBindTexture(GL_TEXTURE_2D, m_debayerTex);
else
m_image->bind(0); m_image->bind(0);
m_program->bind(); m_program->bind();
m_program->setUniformValue("viewport", (float)width(), (float)height()); m_program->setUniformValue("viewport", (float)width(), (float)height());
m_program->setUniformValue("offset", dx, dy); m_program->setUniformValue("offset", dx, dy);
m_program->setUniformValue("mtf_param", m_low, m_mid, m_high); m_program->setUniformValue("mtf_param", m_low, m_mid, m_high);
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_superpixel);
m_program->setUniformValue("invert", m_invert); m_program->setUniformValue("invert", m_invert);
#ifdef COLOR_MANAGMENT #ifdef COLOR_MANAGMENT
m_program->setUniformValue("srgb", m_srgb); m_program->setUniformValue("srgb", m_srgb);
@@ -416,12 +428,27 @@ void ImageWidget::initializeGL()
m_program->setUniformValue("qt_Texture0", (GLuint)0); m_program->setUniformValue("qt_Texture0", (GLuint)0);
m_program->setUniformValue("scale", 1.0f, 0.0f); m_program->setUniformValue("scale", 1.0f, 0.0f);
m_debayerProgram = std::unique_ptr<QOpenGLShaderProgram>(new QOpenGLShaderProgram);
m_debayerProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/debayer.vert");
m_debayerProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/debayer.frag");
if(f3)f3->glBindFragDataLocation(m_debayerProgram->programId(), 0, "color");
m_debayerProgram->bind();
m_debayerProgram->enableAttributeArray("qt_Vertex");
m_debayerProgram->setAttributeBuffer("qt_Vertex", GL_FLOAT, 0, 2, sizeof(float)*4);
m_debayerProgram->enableAttributeArray("qt_MultiTexCoord0");
m_debayerProgram->setAttributeBuffer("qt_MultiTexCoord0", GL_FLOAT, sizeof(float)*2, 2, sizeof(float)*4);
m_debayerProgram->setUniformValue("qt_Texture0", (GLuint)0);
if(!m_debayerProgram->link())
{
qDebug() << "Link failed" << m_debayerProgram->log();
}
m_vaoThumb->bind(); m_vaoThumb->bind();
m_thumbnailProgram = std::unique_ptr<QOpenGLShaderProgram>(new QOpenGLShaderProgram); m_thumbnailProgram = std::unique_ptr<QOpenGLShaderProgram>(new QOpenGLShaderProgram);
m_thumbnailProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/thumb.vert"); m_thumbnailProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/thumb.vert");
m_thumbnailProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/thumb.frag"); m_thumbnailProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/thumb.frag");
if(f3)f3->glBindFragDataLocation(m_program->programId(), 0, "color"); if(f3)f3->glBindFragDataLocation(m_thumbnailProgram->programId(), 0, "color");
m_thumbnailProgram->bind(); m_thumbnailProgram->bind();
m_thumbnailProgram->enableAttributeArray("qt_Vertex"); m_thumbnailProgram->enableAttributeArray("qt_Vertex");
m_thumbnailProgram->setAttributeBuffer("qt_Vertex", GL_FLOAT, 0, 2, sizeof(float)*4); m_thumbnailProgram->setAttributeBuffer("qt_Vertex", GL_FLOAT, 0, 2, sizeof(float)*4);
@@ -595,6 +622,28 @@ void ImageWidget::thumbSelect(QMouseEvent *event)
} }
} }
void ImageWidget::debayer()
{
if(m_debayerTex > 0 || !m_superpixel || !m_bwImg || m_imgWidth < 0)return;
QOpenGLFramebufferObject fbo(m_imgWidth, m_imgHeight, QOpenGLFramebufferObject::NoAttachment, GL_TEXTURE_2D, GL_RGBA16);
fbo.bind();
f->glViewport(0, 0, m_imgWidth, m_imgHeight);
m_debayerProgram->bind();
m_image->bind(0);
f->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
fbo.release();
f->glViewport(0, 0, m_width, m_height);
m_debayerTex = fbo.takeTexture();
f->glBindTexture(GL_TEXTURE_2D, m_debayerTex);
f->glGenerateMipmap(GL_TEXTURE_2D);
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
}
ImageScrollAreaGL::ImageScrollAreaGL(Database *database, QWidget *parent) : QWidget(parent) ImageScrollAreaGL::ImageScrollAreaGL(Database *database, QWidget *parent) : QWidget(parent)
{ {
QGridLayout *layout = new QGridLayout(this); QGridLayout *layout = new QGridLayout(this);
+3
View File
@@ -32,6 +32,7 @@ class ImageWidget : public QOpenGLWidget
QTimer *m_updateTimer; QTimer *m_updateTimer;
std::unique_ptr<QOpenGLShaderProgram> m_program; std::unique_ptr<QOpenGLShaderProgram> m_program;
std::unique_ptr<QOpenGLShaderProgram> m_thumbnailProgram; std::unique_ptr<QOpenGLShaderProgram> m_thumbnailProgram;
std::unique_ptr<QOpenGLShaderProgram> m_debayerProgram;
std::unique_ptr<QOpenGLBuffer> m_buffer; std::unique_ptr<QOpenGLBuffer> m_buffer;
std::unique_ptr<QOpenGLBuffer> m_bufferSizes; std::unique_ptr<QOpenGLBuffer> m_bufferSizes;
std::unique_ptr<QOpenGLTexture> m_image; std::unique_ptr<QOpenGLTexture> m_image;
@@ -39,6 +40,7 @@ class ImageWidget : public QOpenGLWidget
std::unique_ptr<QOpenGLVertexArrayObject> m_vaoThumb; std::unique_ptr<QOpenGLVertexArrayObject> m_vaoThumb;
std::unique_ptr<QOpenGLPixelTransferOptions> m_transferOptions; std::unique_ptr<QOpenGLPixelTransferOptions> m_transferOptions;
std::unique_ptr<QOpenGLTexture> m_thumbnailTexture; std::unique_ptr<QOpenGLTexture> m_thumbnailTexture;
GLuint m_debayerTex = 0;
std::shared_ptr<RawImage> m_rawImage; std::shared_ptr<RawImage> m_rawImage;
std::shared_ptr<WCSData> m_wcs; std::shared_ptr<WCSData> m_wcs;
int m_width, m_height; int m_width, m_height;
@@ -88,6 +90,7 @@ protected:
void mouseMoveEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override;
void thumbSelect(QMouseEvent *event); void thumbSelect(QMouseEvent *event);
void debayer();
signals: signals:
void fileDropped(const QString &path); void fileDropped(const QString &path);
void status(const QString &value, const QString &pixelCoords, const QString &celestialCoords); void status(const QString &value, const QString &pixelCoords, const QString &celestialCoords);
+36 -4
View File
@@ -30,6 +30,8 @@
#include <sys/socket.h> #include <sys/socket.h>
#endif #endif
bool moveToTrash(const QString &path);
int MainWindow::socketPair[2] = {0, 0}; int MainWindow::socketPair[2] = {0, 0};
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
@@ -55,6 +57,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
nameFilter.append(mimeType.suffixes()); nameFilter.append(mimeType.suffixes());
} }
_openFilter.append("*.fit *.fits *.xisf *.cr2 *.nef *.dng)"); _openFilter.append("*.fit *.fits *.xisf *.cr2 *.nef *.dng)");
_openFilter.append(tr(";;All files (*)"));
nameFilter.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);
@@ -128,8 +131,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
fileMenu->addAction(tr("Open"), this, SLOT(loadFile()), QKeySequence::Open); fileMenu->addAction(tr("Open"), this, SLOT(loadFile()), QKeySequence::Open);
fileMenu->addAction(tr("Save as"), this, SLOT(saveAs()), QKeySequence::Save); fileMenu->addAction(tr("Save as"), this, SLOT(saveAs()), QKeySequence::Save);
fileMenu->addSeparator(); fileMenu->addSeparator();
fileMenu->addAction(tr("Copy marked files"), this, SLOT(copyMarked())); fileMenu->addAction(tr("Copy marked files"), this, SLOT(copyMarked()), Qt::Key_F5);
fileMenu->addAction(tr("Move marked files"), this, SLOT(moveMarked())); fileMenu->addAction(tr("Move marked files"), this, SLOT(moveMarked()), Qt::Key_F6);
fileMenu->addAction(tr("Move marked files to trash"), this, &MainWindow::deleteMarked, QKeySequence::Delete);
fileMenu->addSeparator(); fileMenu->addSeparator();
fileMenu->addAction(tr("Index directory"), this, SLOT(indexDir())); fileMenu->addAction(tr("Index directory"), this, SLOT(indexDir()));
fileMenu->addAction(tr("Reindex files"), this, SLOT(reindex())); fileMenu->addAction(tr("Reindex files"), this, SLOT(reindex()));
@@ -161,7 +165,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
menuBar()->addMenu(viewMenu); menuBar()->addMenu(viewMenu);
QMenu *selectMenu = new QMenu(tr("Select"), this); QMenu *selectMenu = new QMenu(tr("Select"), this);
selectMenu->addAction(tr("Mark"), this, SLOT(markImage()), Qt::Key_F5); selectMenu->addAction(tr("Mark"), this, SLOT(markImage()), Qt::Key_F7);
selectMenu->addAction(tr("Unmark"), this, SLOT(unmarkImage()), Qt::Key_F8); selectMenu->addAction(tr("Unmark"), this, SLOT(unmarkImage()), Qt::Key_F8);
selectMenu->addSeparator(); selectMenu->addSeparator();
selectMenu->addAction(tr("Mark and next"), this, SLOT(markAndNext()), Qt::Key_M); selectMenu->addAction(tr("Mark and next"), this, SLOT(markAndNext()), Qt::Key_M);
@@ -330,7 +334,7 @@ void MainWindow::copyOrMove(bool copy, const QString &dest)
QProgressDialog progress(copy ? tr("Copying") : tr("Moving"), tr("Cancel"), 0, files.size(), this); QProgressDialog progress(copy ? tr("Copying") : tr("Moving"), tr("Cancel"), 0, files.size(), this);
progress.setWindowModality(Qt::WindowModal); progress.setWindowModality(Qt::WindowModal);
progress.show(); progress.show();
foreach(const QString &file, files) for(const QString &file : files)
{ {
bool result = false; bool result = false;
QFileInfo info(file); QFileInfo info(file);
@@ -551,6 +555,34 @@ void MainWindow::moveMarked()
copyOrMove(false); copyOrMove(false);
} }
void MainWindow::deleteMarked()
{
QStringList files = m_database->getMarkedFiles();
if(QMessageBox::question(this, tr("Move files to trash?"), tr("Do you want to move %1 files to trash?").arg(files.size())) != QMessageBox::Yes)
return;
QProgressDialog progress(tr("Moving marked files to trash"), tr("Cancel"), 0, files.size(), this);
progress.setWindowModality(Qt::WindowModal);
progress.show();
int i = 0;
for(const QString &file : files)
{
if(!QFile::exists(file))
continue;
if(progress.wasCanceled())
return;
if(!moveToTrash(file))
{
QMessageBox::warning(this, tr("Failed to move file to trash"), tr("Failed to move file to trash %1").arg(file));
return;
}
progress.setValue(i++);
}
m_database->clearMarkedFiles();
}
void MainWindow::toggleFullScreen() void MainWindow::toggleFullScreen()
{ {
if(isFullScreen()) if(isFullScreen())
+1
View File
@@ -59,6 +59,7 @@ protected slots:
void unmarkAndNext(); void unmarkAndNext();
void copyMarked(); void copyMarked();
void moveMarked(); void moveMarked();
void deleteMarked();
void toggleFullScreen(); void toggleFullScreen();
void liveMode(bool active); void liveMode(bool active);
void imageStats(bool imageStats); void imageStats(bool imageStats);
+2
View File
@@ -16,6 +16,8 @@
<file>shaders/image.vert</file> <file>shaders/image.vert</file>
<file>shaders/thumb.frag</file> <file>shaders/thumb.frag</file>
<file>shaders/thumb.vert</file> <file>shaders/thumb.vert</file>
<file>shaders/debayer.frag</file>
<file>shaders/debayer.vert</file>
</qresource> </qresource>
<qresource lang="en" prefix="/"> <qresource lang="en" prefix="/">
<file alias="help">about/help_en</file> <file alias="help">about/help_en</file>
+8
View File
@@ -3,6 +3,7 @@
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QLabel> #include <QLabel>
#include <QSettings> #include <QSettings>
#include <QApplication>
#include "rawimage.h" #include "rawimage.h"
extern int DEFAULT_WIDTH; extern int DEFAULT_WIDTH;
@@ -47,8 +48,12 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent)
m_thumSize->setValue(settings.value("settings/thumnailsize", THUMB_SIZE).toInt()); m_thumSize->setValue(settings.value("settings/thumnailsize", THUMB_SIZE).toInt());
m_thumSize->setToolTip(tr("Thumbnail size in pixels")); m_thumSize->setToolTip(tr("Thumbnail size in pixels"));
m_useNativeDialog = new QCheckBox(tr("Don't use native file dialog"), this);
m_useNativeDialog->setChecked(QApplication::testAttribute(Qt::AA_DontUseNativeDialogs));
layout->addRow(tr("Image preload count"), m_preloadImages); layout->addRow(tr("Image preload count"), m_preloadImages);
layout->addRow(tr("Thumbnails size"), m_thumSize); layout->addRow(tr("Thumbnails size"), m_thumSize);
layout->addRow(m_useNativeDialog);
layout->addRow(new QLabel(tr("Changes in settings will take effect after program restart."))); layout->addRow(new QLabel(tr("Changes in settings will take effect after program restart.")));
QDialogButtonBox *buttonBox = new QDialogButtonBox(this); QDialogButtonBox *buttonBox = new QDialogButtonBox(this);
@@ -67,6 +72,7 @@ void SettingsDialog::loadSettings()
THUMB_SIZE_BORDER = THUMB_SIZE + 10; THUMB_SIZE_BORDER = THUMB_SIZE + 10;
THUMB_SIZE_BORDER_Y = THUMB_SIZE + 30; THUMB_SIZE_BORDER_Y = THUMB_SIZE + 30;
DEFAULT_WIDTH = settings.value("settings/preloadimagecount", DEFAULT_WIDTH).toInt(); DEFAULT_WIDTH = settings.value("settings/preloadimagecount", DEFAULT_WIDTH).toInt();
QApplication::setAttribute(Qt::AA_DontUseNativeDialogs, settings.value("settings/dontusenativedialogs", false).toBool());
} }
void SettingsDialog::saveSettings() void SettingsDialog::saveSettings()
@@ -74,4 +80,6 @@ void SettingsDialog::saveSettings()
QSettings settings; QSettings settings;
settings.setValue("settings/thumbnailsize", m_thumSize->value()); settings.setValue("settings/thumbnailsize", m_thumSize->value());
settings.setValue("settings/preloadimagecount", m_preloadImages->value()); settings.setValue("settings/preloadimagecount", m_preloadImages->value());
settings.setValue("settings/dontusenativedialogs", m_useNativeDialog->isChecked());
QApplication::setAttribute(Qt::AA_DontUseNativeDialogs, m_useNativeDialog->isChecked());
} }
+2
View File
@@ -3,6 +3,7 @@
#include <QDialog> #include <QDialog>
#include <QSpinBox> #include <QSpinBox>
#include <QCheckBox>
class SettingsDialog : public QDialog class SettingsDialog : public QDialog
{ {
@@ -15,6 +16,7 @@ private:
QSpinBox *m_preloadImages; QSpinBox *m_preloadImages;
QSpinBox *m_thumSize; QSpinBox *m_thumSize;
QCheckBox *m_useNativeDialog;
}; };
#endif // SETTINGSDIALOG_H #endif // SETTINGSDIALOG_H
+41
View File
@@ -0,0 +1,41 @@
#version 330
uniform sampler2D qt_Texture0;
in vec2 qt_TexCoord0;
in vec2 center;
out vec4 color;
#define f(x, y) texelFetch(qt_Texture0, icenter + ivec2(x, y), 0).r
void main(void)
{
ivec2 texSize = textureSize(qt_Texture0, 0);
ivec2 icenter = ivec2(center);
ivec2 alternate = icenter % 2;
// cross, checker, theta, phi
const vec4 kA = vec4(-1.0, -1.5, 0.5, -1.0) / 8.0;
const vec4 kB = vec4( 2.0, 0.0, 0.0, 4.0) / 8.0;
const vec4 kC = vec4( 4.0, 6.0, 5.0, 5.0) / 8.0;
const vec4 kD = vec4( 0.0, 2.0, -1.0, -1.0) / 8.0;
const vec4 kE = vec4(-1.0, -1.5, -1.0, 0.5) / 8.0;
const vec4 kF = vec4( 2.0, 0.0, 4.0, 0.0) / 8.0;
float A = f(0,2) + f(0,-2);
float B = f(0,1) + f(0,-1);
float C = f(0,0);
float D = f(1,1) + f(-1,1) + f(1,-1) + f(-1,-1);
float E = f(2,0) + f(-2,0);
float F = f(1,0) + f(-1,0);
vec4 P = kA*A + kB*B + kC*C + kD*D + kE*E + kF*F;
color.rgb = alternate.y == 0 ?
(alternate.x == 0 ? vec3(C, P.xy) : // even row even col
vec3(P.z, C, P.w)) : // even row odd col
(alternate.x == 0 ? vec3(P.w, C, P.z) : // odd row even col
vec3(P.yx, C)); // odd row odd col
color.a = 1.0;
}
+16
View File
@@ -0,0 +1,16 @@
#version 330
uniform sampler2D qt_Texture0;
in vec2 qt_Vertex;
in vec2 qt_MultiTexCoord0;
out vec2 qt_TexCoord0;
out vec2 center;
void main(void)
{
vec2 texSize = vec2(textureSize(qt_Texture0, 0));
gl_Position = vec4(qt_Vertex, 0.0, 1.0);
qt_TexCoord0 = qt_MultiTexCoord0;
qt_TexCoord0.y = 1.0 - qt_TexCoord0.y;
center = qt_TexCoord0 * texSize.xy;
}
+1 -1
View File
@@ -34,7 +34,7 @@ void main(void)
if(bw)color = color.rrra; if(bw)color = color.rrra;
color = MTF(color, mtf_param); color = MTF(color, mtf_param);
if(invert)color = vec4(1.0) - color; if(invert)color.rgb = vec3(1.0) - color.rgb;
color.rgb = mix(checker(), color.rgb, color.a); color.rgb = mix(checker(), color.rgb, color.a);
+17 -1
View File
@@ -11,9 +11,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>RAW CR2, DNG, NEF</li>
<li>JPEG, PNG, BMP, GIF, PBM, PGM, PPM and SVG images</li> <li>JPEG, PNG, BMP, GIF, PBM, PGM, PPM and SVG images</li>
</ul> </ul>
<p>Features of applications:</p> <p>Features of application:</p>
<ul> <ul>
<li>Using same stretch function as PixInsight</li> <li>Using same stretch function as PixInsight</li>
<li>OpenGL accelerated drawing</li> <li>OpenGL accelerated drawing</li>
@@ -24,6 +25,8 @@
<li>Image statistics mean, media, min, max</li> <li>Image statistics mean, media, min, max</li>
<li>Support for WCS</li> <li>Support for WCS</li>
<li>Thumbnails</li> <li>Thumbnails</li>
<li>Convert CFA images to colour - debayer</li>
<li>Color space aware</li>
</ul> </ul>
</description> </description>
<categories> <categories>
@@ -40,10 +43,23 @@
<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>
<image>https://nouspiro.space/wp-content/uploads/2022/12/tenmon2-1024x645.png</image>
</screenshot> </screenshot>
</screenshots> </screenshots>
<content_rating type="oars-1.1"/> <content_rating type="oars-1.1"/>
<releases> <releases>
<release version="20221215" date="2022-12-15">
<description>
<ul>
<li>Add debayer support</li>
<li>Move to trash action</li>
<li>Change copy and move shortcuts to F5 and F6</li>
<li>Change mark and unmark key shortcuts to F7 and F8</li>
<li>Fix not refreshing file tree</li>
<li>Add option to not use native file dialog</li>
</ul>
</description>
</release>
<release version="20221209" date="2022-12-09"/> <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"/>
+1 -1
View File
@@ -34,7 +34,7 @@ StretchToolbar::StretchToolbar(QWidget *parent) : QToolBar(tr("Stretch toolbar")
invertButton->setCheckable(true); invertButton->setCheckable(true);
connect(invertButton, SIGNAL(toggled(bool)), this, SIGNAL(invert(bool))); connect(invertButton, SIGNAL(toggled(bool)), this, SIGNAL(invert(bool)));
QAction *superPixelButton = addAction(QIcon(":/bayer.png"), tr("Superpixel CFA draw 2x2 pixel as one")); QAction *superPixelButton = addAction(QIcon(":/bayer.png"), tr("Debayer CFA"));
superPixelButton->setCheckable(true); superPixelButton->setCheckable(true);
connect(superPixelButton, SIGNAL(toggled(bool)), this, SIGNAL(superPixel(bool))); connect(superPixelButton, SIGNAL(toggled(bool)), this, SIGNAL(superPixel(bool)));
Binary file not shown.
+35 -27
View File
@@ -154,10 +154,6 @@
<source>Filesystem</source> <source>Filesystem</source>
<translation>File system</translation> <translation>File system</translation>
</message> </message>
<message>
<source>FITS files database</source>
<translation type="vanished">FITS files database</translation>
</message>
<message> <message>
<source>Tenmon</source> <source>Tenmon</source>
<translation>Tenmon</translation> <translation>Tenmon</translation>
@@ -294,18 +290,10 @@
<source>Moving</source> <source>Moving</source>
<translation>Moving</translation> <translation>Moving</translation>
</message> </message>
<message>
<source>Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS *.XISF)</source>
<translation type="vanished">Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS *.XISF)</translation>
</message>
<message> <message>
<source>Indexing FITS files</source> <source>Indexing FITS files</source>
<translation>Indexing FITS files</translation> <translation>Indexing FITS files</translation>
</message> </message>
<message>
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
<translation type="vanished">JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
</message>
<message> <message>
<source>Reindex files</source> <source>Reindex files</source>
<translation>Reindex files</translation> <translation>Reindex files</translation>
@@ -322,17 +310,13 @@
<source>Star finder</source> <source>Star finder</source>
<translation>Star finder</translation> <translation>Star finder</translation>
</message> </message>
<message>
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
<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>
<source>Edit</source> <source>Edit</source>
<translation>Edit</translation> <translation>Edit</translation>
</message> </message>
<message> <message>
<source>FITS header editor</source> <source>FITS header editor</source>
<translation type="vanished">FITS header editor</translation> <translation>FITS header editor</translation>
</message> </message>
<message> <message>
<source>Settings</source> <source>Settings</source>
@@ -354,10 +338,6 @@
<source>Failed to move</source> <source>Failed to move</source>
<translation>Failed to move</translation> <translation>Failed to move</translation>
</message> </message>
<message>
<source>Failed to copy %1 from to %2</source>
<translation type="vanished">Failed to copy from %1 to %2</translation>
</message>
<message> <message>
<source>Failed to move from %1 to %2</source> <source>Failed to move from %1 to %2</source>
<translation>Failed to move from %1 to %2</translation> <translation>Failed to move from %1 to %2</translation>
@@ -367,8 +347,32 @@
<translation>Failed to copy from %1 to %2</translation> <translation>Failed to copy from %1 to %2</translation>
</message> </message>
<message> <message>
<source>Failed to move from %1 to %2ˇ</source> <source>;;All files (*)</source>
<translation type="obsolete">Failed to move from %1 to %2ˇ {1 ?}</translation> <translation>;;All files (*)</translation>
</message>
<message>
<source>Move files to trash?</source>
<translation>Move files to trash?</translation>
</message>
<message>
<source>Do you want to move %1 files to trash?</source>
<translation>Do you want to move %1 files to trash?</translation>
</message>
<message>
<source>Failed to move file to trash</source>
<translation>Failed to move file to trash</translation>
</message>
<message>
<source>Failed to move file to trash %1</source>
<translation>Failed to move file to trash %1</translation>
</message>
<message>
<source>Move marked files to trash</source>
<translation>Move marked files to trash</translation>
</message>
<message>
<source>Moving marked files to trash</source>
<translation>Moving marked files to trash</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -494,6 +498,10 @@
<source>Changes in settings will take effect after program restart.</source> <source>Changes in settings will take effect after program restart.</source>
<translation>Changes in settings will take effect after program restart.</translation> <translation>Changes in settings will take effect after program restart.</translation>
</message> </message>
<message>
<source>Don&apos;t use native file dialog</source>
<translation>Don&apos;t use native file dialog</translation>
</message>
</context> </context>
<context> <context>
<name>StretchToolbar</name> <name>StretchToolbar</name>
@@ -513,13 +521,13 @@
<source>Invert colors</source> <source>Invert colors</source>
<translation>Invert colors</translation> <translation>Invert colors</translation>
</message> </message>
<message>
<source>Superpixel CFA draw 2x2 pixel as one</source>
<translation>Superpixel CFA draw 2x2 pixel as one</translation>
</message>
<message> <message>
<source>Apply auto stretch on load</source> <source>Apply auto stretch on load</source>
<translation>Apply auto stretch on load</translation> <translation>Apply auto stretch on load</translation>
</message> </message>
<message>
<source>Debayer CFA</source>
<translation>Debayer CFA</translation>
</message>
</context> </context>
</TS> </TS>
Binary file not shown.
+39 -31
View File
@@ -154,10 +154,6 @@
<source>Filesystem</source> <source>Filesystem</source>
<translation>Système de fichier</translation> <translation>Système de fichier</translation>
</message> </message>
<message>
<source>FITS files database</source>
<translation type="vanished">FITS files database</translation>
</message>
<message> <message>
<source>Tenmon</source> <source>Tenmon</source>
<translation>Tenmon</translation> <translation>Tenmon</translation>
@@ -294,18 +290,10 @@
<source>Moving</source> <source>Moving</source>
<translation>Déplacement</translation> <translation>Déplacement</translation>
</message> </message>
<message>
<source>Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS *.XISF)</source>
<translation type="vanished">Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS *.XISF)</translation>
</message>
<message> <message>
<source>Indexing FITS files</source> <source>Indexing FITS files</source>
<translation>Indexation des fichiers FITS</translation> <translation>Indexation des fichiers FITS</translation>
</message> </message>
<message>
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
<translation type="vanished">JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
</message>
<message> <message>
<source>Reindex files</source> <source>Reindex files</source>
<translation>-indexer les fichiers</translation> <translation>-indexer les fichiers</translation>
@@ -322,17 +310,13 @@
<source>Star finder</source> <source>Star finder</source>
<translation>Détecteur d&apos;étoiles</translation> <translation>Détecteur d&apos;étoiles</translation>
</message> </message>
<message>
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
<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>
<source>Edit</source> <source>Edit</source>
<translation>Éditer</translation> <translation>Éditer</translation>
</message> </message>
<message> <message>
<source>FITS header editor</source> <source>FITS header editor</source>
<translation type="vanished">Éditeur d&apos;en-tête FITS</translation> <translation>Éditeur d&apos;en-tête FITS</translation>
</message> </message>
<message> <message>
<source>Settings</source> <source>Settings</source>
@@ -348,27 +332,47 @@
</message> </message>
<message> <message>
<source>Failed to copy</source> <source>Failed to copy</source>
<translation type="unfinished">Échec de la copie</translation> <translation>Échec de la copie</translation>
</message> </message>
<message> <message>
<source>Failed to move</source> <source>Failed to move</source>
<translation type="unfinished">Échec du déplacement</translation> <translation>É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>
<message> <message>
<source>Failed to move from %1 to %2</source> <source>Failed to move from %1 to %2</source>
<translation type="unfinished">Échec du déplacement de %1 vers %2</translation> <translation>Échec du déplacement de %1 vers %2</translation>
</message> </message>
<message> <message>
<source>Failed to copy from %1 to %2</source> <source>Failed to copy from %1 to %2</source>
<translation type="unfinished">Échec de la copie de %1 vers %2</translation> <translation>Échec de la copie de %1 vers %2</translation>
</message> </message>
<message> <message>
<source>Failed to move from %1 to %2ˇ</source> <source>;;All files (*)</source>
<translation type="obsolete">Échec du déplacement de %1 vers %2ˇ {1 ?}</translation> <translation>;;Tout les fichiers (*)</translation>
</message>
<message>
<source>Move files to trash?</source>
<translation>Déplacer les fichiers dans la corbeille?</translation>
</message>
<message>
<source>Do you want to move %1 files to trash?</source>
<translation>Voulez-vous déplacer le fichier %1 dans la corbeille?</translation>
</message>
<message>
<source>Failed to move file to trash</source>
<translation>Echec du déplacement dans la corbeille</translation>
</message>
<message>
<source>Failed to move file to trash %1</source>
<translation>Echec du déplacement de %1 dans la corbeille</translation>
</message>
<message>
<source>Move marked files to trash</source>
<translation>Déplacer les fichiers marqués dans la corbeille</translation>
</message>
<message>
<source>Moving marked files to trash</source>
<translation>Déplacement des fichiers marqués dans la corbeille</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -494,6 +498,10 @@
<source>Changes in settings will take effect after program restart.</source> <source>Changes in settings will take effect after program restart.</source>
<translation>Les changements de paramètres prendront effet après le redémarrage du programme.</translation> <translation>Les changements de paramètres prendront effet après le redémarrage du programme.</translation>
</message> </message>
<message>
<source>Don&apos;t use native file dialog</source>
<translation>N&apos;utilisez pas la boîte de dialogue de fichier natif</translation>
</message>
</context> </context>
<context> <context>
<name>StretchToolbar</name> <name>StretchToolbar</name>
@@ -513,13 +521,13 @@
<source>Invert colors</source> <source>Invert colors</source>
<translation>Inverser les couleurs</translation> <translation>Inverser les couleurs</translation>
</message> </message>
<message>
<source>Superpixel CFA draw 2x2 pixel as one</source>
<translation>Superpixel CFA dessine 2x2 pixels comme un seul</translation>
</message>
<message> <message>
<source>Apply auto stretch on load</source> <source>Apply auto stretch on load</source>
<translation>Appliquer la luminosité automatiquement au chargement</translation> <translation>Appliquer la luminosité automatiquement au chargement</translation>
</message> </message>
<message>
<source>Debayer CFA</source>
<translation>Débayeriser CFA</translation>
</message>
</context> </context>
</TS> </TS>
Binary file not shown.
+35 -39
View File
@@ -155,14 +155,6 @@
<source>Filesystem</source> <source>Filesystem</source>
<translation>Zoznam súborov</translation> <translation>Zoznam súborov</translation>
</message> </message>
<message>
<source>FITS Editor</source>
<translation type="vanished">FITS editor</translation>
</message>
<message>
<source>FITS files database</source>
<translation type="vanished">Databáza FITS súborov</translation>
</message>
<message> <message>
<source>Tenmon</source> <source>Tenmon</source>
<translation>Tenmon</translation> <translation>Tenmon</translation>
@@ -247,14 +239,6 @@
<source>Open file</source> <source>Open file</source>
<translation>Otvoriť súbor</translation> <translation>Otvoriť súbor</translation>
</message> </message>
<message>
<source>Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS)</source>
<translation type="vanished">Obrázky (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS)</translation>
</message>
<message>
<source>Images (*.jpg *.png *.JPG *.PNG)</source>
<translation type="vanished">Obrázky (*.jpg *.png *.JPG *.PNG)</translation>
</message>
<message> <message>
<source>Select destination</source> <source>Select destination</source>
<translation>Vybrať cieľ</translation> <translation>Vybrať cieľ</translation>
@@ -307,18 +291,10 @@
<source>Moving</source> <source>Moving</source>
<translation>Presúvanie</translation> <translation>Presúvanie</translation>
</message> </message>
<message>
<source>Images (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS *.XISF)</source>
<translation type="vanished">Obrázky (*.jpg *.jpeg *.png *.cr2 *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.FIT *.FITS *.XISF)</translation>
</message>
<message> <message>
<source>Indexing FITS files</source> <source>Indexing FITS files</source>
<translation>Indexovanie FITS/XISF súborov</translation> <translation>Indexovanie FITS/XISF súborov</translation>
</message> </message>
<message>
<source>JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</source>
<translation type="vanished">JPEG (*.jpg *.JPG);; PNG (*.png *.PNG);;FITS (*.fits *.FITS);;XISF (*.xisf *.XISF)</translation>
</message>
<message> <message>
<source>Reindex files</source> <source>Reindex files</source>
<translation>Reindexuj súbory</translation> <translation>Reindexuj súbory</translation>
@@ -335,17 +311,13 @@
<source>Star finder</source> <source>Star finder</source>
<translation>Vyhľadávač hviezd</translation> <translation>Vyhľadávač hviezd</translation>
</message> </message>
<message>
<source>Images (*.jpg *.jpeg *.png *.cr2 *.nef *.dng *.fit *.fits *.xisf *.JPG *.JPEG *.PNG *.CR2 *.NEF *.DNG *.FIT *.FITS *.XISF)</source>
<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>
<source>Edit</source> <source>Edit</source>
<translation>Upraviť</translation> <translation>Upraviť</translation>
</message> </message>
<message> <message>
<source>FITS header editor</source> <source>FITS header editor</source>
<translation type="vanished">Editor FITS hlavičky</translation> <translation>Editor FITS hlavičky</translation>
</message> </message>
<message> <message>
<source>Settings</source> <source>Settings</source>
@@ -367,10 +339,6 @@
<source>Failed to move</source> <source>Failed to move</source>
<translation>Zlyhalo presúvanie</translation> <translation>Zlyhalo presúvanie</translation>
</message> </message>
<message>
<source>Failed to copy %1 from to %2</source>
<translation type="vanished">Zlyhalo kopírovanie z %1 do %2</translation>
</message>
<message> <message>
<source>Failed to move from %1 to %2</source> <source>Failed to move from %1 to %2</source>
<translation>Zlyhalo presúvanie z %1 do %2</translation> <translation>Zlyhalo presúvanie z %1 do %2</translation>
@@ -380,8 +348,32 @@
<translation>Zlyhalo kopírovanie z %1 do %2</translation> <translation>Zlyhalo kopírovanie z %1 do %2</translation>
</message> </message>
<message> <message>
<source>Failed to move from %1 to %2ˇ</source> <source>;;All files (*)</source>
<translation type="obsolete">Zlyhalo presúvanie z %1 do %2ˇ {1 ?}</translation> <translation>;;Všetky súbory (*)</translation>
</message>
<message>
<source>Move files to trash?</source>
<translation>Presunúť súbory do koša?</translation>
</message>
<message>
<source>Do you want to move %1 files to trash?</source>
<translation>Presunúť %1 súborov do koša?</translation>
</message>
<message>
<source>Failed to move file to trash</source>
<translation>Zlyhalo presunutie súbora do koša</translation>
</message>
<message>
<source>Failed to move file to trash %1</source>
<translation>Zlyhalo presunutie súbora do koša %1</translation>
</message>
<message>
<source>Move marked files to trash</source>
<translation>Presunúť označené súbory do koša</translation>
</message>
<message>
<source>Moving marked files to trash</source>
<translation>Presúvanie do koša</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -507,6 +499,10 @@
<source>Changes in settings will take effect after program restart.</source> <source>Changes in settings will take effect after program restart.</source>
<translation>Zmeny v nastaveniach sa prejavia po reštarte programu.</translation> <translation>Zmeny v nastaveniach sa prejavia po reštarte programu.</translation>
</message> </message>
<message>
<source>Don&apos;t use native file dialog</source>
<translation>Nepoužívať natívny súborový dialóg</translation>
</message>
</context> </context>
<context> <context>
<name>StretchToolbar</name> <name>StretchToolbar</name>
@@ -526,13 +522,13 @@
<source>Invert colors</source> <source>Invert colors</source>
<translation>Invertuj farby</translation> <translation>Invertuj farby</translation>
</message> </message>
<message>
<source>Superpixel CFA draw 2x2 pixel as one</source>
<translation>Super pixel CFA kreslenie 2x2 pixelov ako jeden</translation>
</message>
<message> <message>
<source>Apply auto stretch on load</source> <source>Apply auto stretch on load</source>
<translation>Aplikuj automatické natiahnutie pri načítaní</translation> <translation>Aplikuj automatické natiahnutie pri načítaní</translation>
</message> </message>
<message>
<source>Debayer CFA</source>
<translation>Preveď CFA na farbu</translation>
</message>
</context> </context>
</TS> </TS>