Compare commits
13 Commits
27afb2ea5f
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| cb1237cbc4 | |||
| dbc9baba13 | |||
| bd99501616 | |||
| fccbf4d810 | |||
| 0a11289f34 | |||
| 53167e7bb5 | |||
| 1e940de31b | |||
| f1b5ec81c0 | |||
| 8b8759facb | |||
| 468862ad35 | |||
| 974d482d5b | |||
| d45bf37e50 | |||
| 56a8a0e789 |
@@ -29,6 +29,7 @@ add_subdirectory(libXISF)
|
|||||||
|
|
||||||
set(TENMON_SRC
|
set(TENMON_SRC
|
||||||
src/about.cpp src/about.h
|
src/about.cpp src/about.h
|
||||||
|
src/application.cpp src/application.h
|
||||||
src/batchprocessing.cpp src/batchprocessing.h src/batchprocessing.ui
|
src/batchprocessing.cpp src/batchprocessing.h src/batchprocessing.ui
|
||||||
src/chartgraph.h src/chartgraph.cpp
|
src/chartgraph.h src/chartgraph.cpp
|
||||||
src/database.cpp src/database.h
|
src/database.cpp src/database.h
|
||||||
@@ -39,6 +40,7 @@ set(TENMON_SRC
|
|||||||
src/filemanager.h src/filemanager.cpp src/filemanager.ui
|
src/filemanager.h src/filemanager.cpp src/filemanager.ui
|
||||||
src/filesystemwidget.cpp src/filesystemwidget.h
|
src/filesystemwidget.cpp src/filesystemwidget.h
|
||||||
src/fitskeyword.ui
|
src/fitskeyword.ui
|
||||||
|
src/fitswrapper.h src/fitswrapper.cpp
|
||||||
src/histogram.cpp src/histogram.h
|
src/histogram.cpp src/histogram.h
|
||||||
src/httpdownloader.h src/httpdownloader.cpp
|
src/httpdownloader.h src/httpdownloader.cpp
|
||||||
src/imageinfo.cpp src/imageinfo.h
|
src/imageinfo.cpp src/imageinfo.h
|
||||||
@@ -73,6 +75,9 @@ elseif(APPLE)
|
|||||||
set(tenmon_ICON ${CMAKE_CURRENT_SOURCE_DIR}/resources/tenmon.icns)
|
set(tenmon_ICON ${CMAKE_CURRENT_SOURCE_DIR}/resources/tenmon.icns)
|
||||||
find_package(Qt6 COMPONENTS DBus REQUIRED)
|
find_package(Qt6 COMPONENTS DBus REQUIRED)
|
||||||
set_source_files_properties(${tenmon_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
set_source_files_properties(${tenmon_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
|
||||||
|
set(MACOSX_BUNDLE_ICON_FILE "tenmon.icns")
|
||||||
|
set(MACOSX_BUNDLE_BUNDLE_NAME "tenmon")
|
||||||
|
set(MACOSX_BUNDLE_GUI_IDENTIFIER "space.nouspiro.tenmon")
|
||||||
else()
|
else()
|
||||||
set(tenmon_ICON "")
|
set(tenmon_ICON "")
|
||||||
find_package(Qt6 COMPONENTS DBus REQUIRED)
|
find_package(Qt6 COMPONENTS DBus REQUIRED)
|
||||||
@@ -111,6 +116,7 @@ endif(STELLARSOLVER_INCLUDE AND STELLARSOLVER_LIB)
|
|||||||
target_link_libraries(tenmon PRIVATE Qt6::Widgets Qt6::Sql Qt6::OpenGLWidgets Qt6::Qml Qt6::Charts Qt6::Svg ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} ${LCMS2_LIB} XISF)
|
target_link_libraries(tenmon PRIVATE Qt6::Widgets Qt6::Sql Qt6::OpenGLWidgets Qt6::Qml Qt6::Charts Qt6::Svg ${EXIF_LIB} ${FITS_LIB} ${RAW_LIB} ${WCS_LIB} ${LCMS2_LIB} XISF)
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
target_link_libraries(tenmon PRIVATE Qt6::DBus "-framework CoreFoundation")
|
target_link_libraries(tenmon PRIVATE Qt6::DBus "-framework CoreFoundation")
|
||||||
|
set_target_properties(tenmon PROPERTIES MACOSX_BUNDLE_INFO_PLIST "${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in")
|
||||||
elseif(UNIX)
|
elseif(UNIX)
|
||||||
target_link_libraries(tenmon PRIVATE Qt6::DBus)
|
target_link_libraries(tenmon PRIVATE Qt6::DBus)
|
||||||
endif(APPLE)
|
endif(APPLE)
|
||||||
@@ -133,8 +139,12 @@ if(UNIX AND NOT APPLE)
|
|||||||
install(SCRIPT install.cmake)
|
install(SCRIPT install.cmake)
|
||||||
else()
|
else()
|
||||||
install(FILES space.nouspiro.tenmon.desktop DESTINATION "${CMAKE_INSTALL_DATADIR}/applications")
|
install(FILES space.nouspiro.tenmon.desktop DESTINATION "${CMAKE_INSTALL_DATADIR}/applications")
|
||||||
install(FILES resources/space.nouspiro.tenmon.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/64x64/apps")
|
install(FILES resources/space.nouspiro.tenmon_16.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/16x16/apps" RENAME space.nouspiro.tenmon.png)
|
||||||
|
install(FILES resources/space.nouspiro.tenmon_32.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/32x32/apps" RENAME space.nouspiro.tenmon.png)
|
||||||
|
install(FILES resources/space.nouspiro.tenmon_64.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/64x64/apps" RENAME space.nouspiro.tenmon.png)
|
||||||
install(FILES resources/space.nouspiro.tenmon_128.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps" RENAME space.nouspiro.tenmon.png)
|
install(FILES resources/space.nouspiro.tenmon_128.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps" RENAME space.nouspiro.tenmon.png)
|
||||||
|
install(FILES resources/space.nouspiro.tenmon_256.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/256x256/apps" RENAME space.nouspiro.tenmon.png)
|
||||||
|
install(FILES resources/space.nouspiro.tenmon_512.png DESTINATION "${CMAKE_INSTALL_DATADIR}/icons/hicolor/512x512/apps" RENAME space.nouspiro.tenmon.png)
|
||||||
install(FILES space.nouspiro.tenmon.xisf.xml DESTINATION "${CMAKE_INSTALL_DATADIR}/mime/packages")
|
install(FILES space.nouspiro.tenmon.xisf.xml DESTINATION "${CMAKE_INSTALL_DATADIR}/mime/packages")
|
||||||
endif()
|
endif()
|
||||||
install(FILES space.nouspiro.tenmon.metainfo.xml DESTINATION "${CMAKE_INSTALL_DATADIR}/metainfo")
|
install(FILES space.nouspiro.tenmon.metainfo.xml DESTINATION "${CMAKE_INSTALL_DATADIR}/metainfo")
|
||||||
|
|||||||
@@ -0,0 +1,50 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>tenmon</string>
|
||||||
|
<key>CFBundleGetInfoString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleLongVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||||
|
<key>CSResourcesFileMapped</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||||
|
<key>CFBundleDocumentTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>fits</string>
|
||||||
|
<string>fit</string>
|
||||||
|
<string>xisf</string>
|
||||||
|
<string>png</string>
|
||||||
|
<string>jpg</string>
|
||||||
|
<string>jpeg</string>
|
||||||
|
<string>tiff</string>
|
||||||
|
<string>tif</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -123,8 +123,11 @@ This example filters for files where: "Bias" is in the file name, the OBJECT pro
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>Database tree</h3>
|
<h3>Database tree</h3>
|
||||||
<p>This is another view that show indexed database as tree. You can add or remove tree filter that construct a tree structure from FITS keywords. Each level of tree
|
<p>This is another view that show indexed database as tree. You can add or remove tree grouping that construct a tree structure from FITS keywords. Each level of tree
|
||||||
will be based on this filter. You can specify one keywords multiple times.</p>
|
will be based on this grouping. You can specify one keywords multiple times. When adding a grouping you can also specify aggregation function that is applied to last level.
|
||||||
|
SUM will add up all numbers in that group usefull for example for EXPTIME. COUNT will show how many files are in that group. AVG will show average value, MIN,MAX,MEDIAN will calculate
|
||||||
|
minimum, maximum and media value in that group. So if you select CCD-TEMP as last with AVG it will calculate average temperature. Double click on file in tree view will open
|
||||||
|
that file.</p>
|
||||||
|
|
||||||
<h3>Plate Solving</h3>
|
<h3>Plate Solving</h3>
|
||||||
<p>This module can plate solve images and update FITS header with solution for FITS and XISF images.
|
<p>This module can plate solve images and update FITS header with solution for FITS and XISF images.
|
||||||
|
|||||||
@@ -103,8 +103,11 @@ Cet exemple filtre les fichiers où : "Bias" figure dans le nom de fichier, la p
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>Database tree</h3>
|
<h3>Database tree</h3>
|
||||||
<p>This is another view that show indexed database as tree. You can add or remove tree filter that construct a tree structure from FITS keywords. Each level of tree
|
<p>This is another view that show indexed database as tree. You can add or remove tree grouping that construct a tree structure from FITS keywords. Each level of tree
|
||||||
will be based on this filter. You can specify one keywords multiple times.</p>
|
will be based on this grouping. You can specify one keywords multiple times. When adding a grouping you can also specify aggregation function that is applied to last level.
|
||||||
|
SUM will add up all numbers in that group usefull for example for EXPTIME. COUNT will show how many files are in that group. AVG will show average value, MIN,MAX,MEDIAN will calculate
|
||||||
|
minimum, maximum and media value in that group. So if you select CCD-TEMP as last with AVG it will calculate average temperature. Double click on file in tree view will open
|
||||||
|
that file.</p>
|
||||||
|
|
||||||
<h3>Plate Solving</h3>
|
<h3>Plate Solving</h3>
|
||||||
<p>This module can plate solve images and update FITS header with solution for FITS and XISF images.
|
<p>This module can plate solve images and update FITS header with solution for FITS and XISF images.
|
||||||
|
|||||||
@@ -106,8 +106,11 @@ zástupný znak za hocijaký reťazec znakov aj žiadny. Znak _ je tiež zástup
|
|||||||
Bez použitia zástupných znakov sa vyhľadá iba presný výskyt.</p>
|
Bez použitia zástupných znakov sa vyhľadá iba presný výskyt.</p>
|
||||||
|
|
||||||
<h3>Database tree</h3>
|
<h3>Database tree</h3>
|
||||||
<p>This is another view that show indexed database as tree. You can add or remove tree filter that construct a tree structure from FITS keywords. Each level of tree
|
<p>This is another view that show indexed database as tree. You can add or remove tree grouping that construct a tree structure from FITS keywords. Each level of tree
|
||||||
will be based on this filter. You can specify one keywords multiple times.</p>
|
will be based on this grouping. You can specify one keywords multiple times. When adding a grouping you can also specify aggregation function that is applied to last level.
|
||||||
|
SUM will add up all numbers in that group usefull for example for EXPTIME. COUNT will show how many files are in that group. AVG will show average value, MIN,MAX,MEDIAN will calculate
|
||||||
|
minimum, maximum and media value in that group. So if you select CCD-TEMP as last with AVG it will calculate average temperature. Double click on file in tree view will open
|
||||||
|
that file.</p>
|
||||||
|
|
||||||
<h3>Plate Solving</h3>
|
<h3>Plate Solving</h3>
|
||||||
<p>Tento modul umožnuje vyriešiť obrázok a určiť RA, DEC koordináty a aktualizovať FITS a XISF súbory s WCS dátami.
|
<p>Tento modul umožnuje vyriešiť obrázok a určiť RA, DEC koordináty a aktualizovať FITS a XISF súbory s WCS dátami.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<table><tr>
|
<table><tr>
|
||||||
<td style="padding-right:10px"><img src=":/space.nouspiro.tenmon.png"></td>
|
<td style="padding-right:10px"><img src=":/space.nouspiro.tenmon_64.png"></td>
|
||||||
<td><h3>Tenmon</h3>
|
<td><h3>Tenmon</h3>
|
||||||
Tenmon is FITS/XISF image viewer and converter. It also index FITS keywords.<br>
|
Tenmon is FITS/XISF image viewer and converter. It also index FITS keywords.<br>
|
||||||
v@GITVERSION@ Copyright © 2026 Dušan Poizl<br><br>
|
v@GITVERSION@ Copyright © 2026 Dušan Poizl<br><br>
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ find_program(XDG-DESKTOP-MENU_EXECUTABLE xdg-desktop-menu)
|
|||||||
find_program(XDG-ICON-RESOURCE_EXECUTABLE xdg-icon-resource)
|
find_program(XDG-ICON-RESOURCE_EXECUTABLE xdg-icon-resource)
|
||||||
find_program(XDG-MIME xdg-mime)
|
find_program(XDG-MIME xdg-mime)
|
||||||
execute_process(COMMAND ${XDG-DESKTOP-MENU_EXECUTABLE} install --novendor space.nouspiro.tenmon.desktop WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
execute_process(COMMAND ${XDG-DESKTOP-MENU_EXECUTABLE} install --novendor space.nouspiro.tenmon.desktop WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 64 resources/space.nouspiro.tenmon.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 16 resources/space.nouspiro.tenmon_16.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 32 resources/space.nouspiro.tenmon_32.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 64 resources/space.nouspiro.tenmon_64.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 128 resources/space.nouspiro.tenmon_128.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 128 resources/space.nouspiro.tenmon_128.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 256 resources/space.nouspiro.tenmon_256.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
execute_process(COMMAND ${XDG-ICON-RESOURCE_EXECUTABLE} install --novendor --size 512 resources/space.nouspiro.tenmon_512.png space.nouspiro.tenmon WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
execute_process(COMMAND ${XDG-MIME} install --novendor space.nouspiro.tenmon.xisf.xml WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
execute_process(COMMAND ${XDG-MIME} install --novendor space.nouspiro.tenmon.xisf.xml WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR})
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 1.4 MiB |
@@ -15,7 +15,7 @@
|
|||||||
<file>bggr.png</file>
|
<file>bggr.png</file>
|
||||||
<file>grbg.png</file>
|
<file>grbg.png</file>
|
||||||
<file>gbrg.png</file>
|
<file>gbrg.png</file>
|
||||||
<file>space.nouspiro.tenmon.png</file>
|
<file>space.nouspiro.tenmon_64.png</file>
|
||||||
<file>../translations/tenmon_pt_BR.qm</file>
|
<file>../translations/tenmon_pt_BR.qm</file>
|
||||||
<file alias="help">../about/help_en</file>
|
<file alias="help">../about/help_en</file>
|
||||||
<file>colormap.png</file>
|
<file>colormap.png</file>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
|
After Width: | Height: | Size: 247 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
@@ -60,6 +60,17 @@
|
|||||||
</screenshots>
|
</screenshots>
|
||||||
<content_rating type="oars-1.1"/>
|
<content_rating type="oars-1.1"/>
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="20260412" date="2026-04-12">
|
||||||
|
<description>
|
||||||
|
<ul>
|
||||||
|
<li>Add database tree to show database entries grouped in tree structure</li>
|
||||||
|
<li>Add database summary table. This can show total exposure time for OBJECT and FILTER for example</li>
|
||||||
|
<li>Copy files to clipboard from database view</li>
|
||||||
|
<li>Copy to clipboard text from database tables so they can be pasted to Excel</li>
|
||||||
|
<li>Add CLI option to run scripts and generate thumbnails</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release version="20260217" date="2026-02-17">
|
<release version="20260217" date="2026-02-17">
|
||||||
<description>
|
<description>
|
||||||
<ul>
|
<ul>
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
#include "application.h"
|
||||||
|
|
||||||
|
#include <QFileOpenEvent>
|
||||||
|
|
||||||
|
Application::Application(int &argc, char **argv) : QApplication(argc, argv)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Application::event(QEvent *event)
|
||||||
|
{
|
||||||
|
if (event->type() == QEvent::FileOpen) {
|
||||||
|
QFileOpenEvent *openEvent = static_cast<QFileOpenEvent *>(event);
|
||||||
|
emit openFileEvent(openEvent->file());
|
||||||
|
}
|
||||||
|
|
||||||
|
return QApplication::event(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#ifndef APPLICATION_H
|
||||||
|
#define APPLICATION_H
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
class Application : public QApplication
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
Application(int &argc, char **argv);
|
||||||
|
bool event(QEvent *event) override;
|
||||||
|
signals:
|
||||||
|
void openFileEvent(const QString &file);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // APPLICATION_H
|
||||||
@@ -337,7 +337,7 @@ void BatchProcessing::newMessageCli(const QString &message, bool error)
|
|||||||
if(error)
|
if(error)
|
||||||
qWarning() << message;
|
qWarning() << message;
|
||||||
else
|
else
|
||||||
qDebug() << message;
|
qInfo() << message;
|
||||||
}
|
}
|
||||||
|
|
||||||
QJSValue BatchProcessing::getString(const QString &label, const QString &text)
|
QJSValue BatchProcessing::getString(const QString &label, const QString &text)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
DatabaseTreeSettings::DatabaseTreeSettings(const QStringList &data, QStringList keywords, QWidget *parent) : QDialog(parent)
|
DatabaseTreeSettings::DatabaseTreeSettings(const QStringList &data, QStringList keywords, QWidget *parent) : QDialog(parent)
|
||||||
{
|
{
|
||||||
setWindowTitle(tr("Add tree filter"));
|
setWindowTitle(tr("Add tree grouping"));
|
||||||
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
||||||
setLayout(vlayout);
|
setLayout(vlayout);
|
||||||
|
|
||||||
@@ -324,13 +324,16 @@ QSqlQuery DatabaseTree::getGroupQuery(const QString &aggregateFunc) const
|
|||||||
if(i == _keys.size() - 1)
|
if(i == _keys.size() - 1)
|
||||||
{
|
{
|
||||||
QString tmp = aggregateFunc + "(" + cols.last() + ")";
|
QString tmp = aggregateFunc + "(" + cols.last() + ")";
|
||||||
|
if(aggregateFunc == "COUNT")
|
||||||
|
cols.append("COUNT(*)");
|
||||||
|
else
|
||||||
cols.last() = tmp;
|
cols.last() = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList group = cols;
|
QStringList group = cols;
|
||||||
group.removeLast();
|
group.removeLast();
|
||||||
QString sql = "SELECT " + cols.join(',') + " FROM fits_files AS f" + join + " GROUP BY " + group.join(',');
|
QString sql = "SELECT " + cols.join(',') + " FROM fits_files AS f" + join + " GROUP BY " + group.join(',') + " ORDER BY " + cols.join(" NULLS LAST,") + " NULLS LAST";
|
||||||
|
|
||||||
QSqlQuery query(sql, _database->db());
|
QSqlQuery query(sql, _database->db());
|
||||||
for(auto &val : _keys)
|
for(auto &val : _keys)
|
||||||
@@ -371,7 +374,7 @@ void DatabaseTree::prepareQueries()
|
|||||||
else if(_keys[i] == "DATE-OBS_YEAR-MONTH-DAY")
|
else if(_keys[i] == "DATE-OBS_YEAR-MONTH-DAY")
|
||||||
col = QString("STRFTIME('%Y-%m-%d', h%1.value)").arg(i);
|
col = QString("STRFTIME('%Y-%m-%d', h%1.value)").arg(i);
|
||||||
|
|
||||||
sql = QString("SELECT %1 FROM fits_files AS f").arg(col) + join + where + QString(" GROUP BY %1 ORDER BY %1").arg(col);
|
sql = QString("SELECT %1 FROM fits_files AS f").arg(col) + join + where + QString(" GROUP BY %1 ORDER BY %1 NULLS LAST").arg(col);
|
||||||
|
|
||||||
qDebug() << "Tree query for" << _keys[i] << sql;
|
qDebug() << "Tree query for" << _keys[i] << sql;
|
||||||
QSqlQuery query(sql, _database->db());
|
QSqlQuery query(sql, _database->db());
|
||||||
@@ -444,7 +447,7 @@ DatabaseTreeView::DatabaseTreeView(Database *database, QWidget *parent) : QWidge
|
|||||||
,_database(database)
|
,_database(database)
|
||||||
{
|
{
|
||||||
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
QVBoxLayout *vlayout = new QVBoxLayout(this);
|
||||||
QHBoxLayout *hlayout = new QHBoxLayout(this);
|
QHBoxLayout *hlayout = new QHBoxLayout;
|
||||||
|
|
||||||
_model = new DatabaseTree(database, this);
|
_model = new DatabaseTree(database, this);
|
||||||
_treeView = new QTreeView(this);
|
_treeView = new QTreeView(this);
|
||||||
@@ -470,7 +473,7 @@ DatabaseTreeView::DatabaseTreeView(Database *database, QWidget *parent) : QWidge
|
|||||||
connect(_filters, &QComboBox::currentIndexChanged, this, &DatabaseTreeView::filterChanged);
|
connect(_filters, &QComboBox::currentIndexChanged, this, &DatabaseTreeView::filterChanged);
|
||||||
filterChanged(_filters->currentIndex());
|
filterChanged(_filters->currentIndex());
|
||||||
|
|
||||||
QStackedWidget *stackedWidget = new QStackedWidget;
|
QStackedWidget *stackedWidget = new QStackedWidget(this);
|
||||||
stackedWidget->addWidget(_treeView);
|
stackedWidget->addWidget(_treeView);
|
||||||
stackedWidget->addWidget(_tableView);
|
stackedWidget->addWidget(_tableView);
|
||||||
|
|
||||||
@@ -576,6 +579,9 @@ void DatabaseTreeView::setQuery(const QString &func)
|
|||||||
if(!func.isEmpty())
|
if(!func.isEmpty())
|
||||||
{
|
{
|
||||||
QString tmp = func + "(" + keys.last() + ")";
|
QString tmp = func + "(" + keys.last() + ")";
|
||||||
|
if(func == "COUNT")
|
||||||
|
keys.append("COUNT");
|
||||||
|
else
|
||||||
keys.last() = tmp;
|
keys.last() = tmp;
|
||||||
}
|
}
|
||||||
for(auto &key : keys)
|
for(auto &key : keys)
|
||||||
|
|||||||
@@ -1,19 +1,20 @@
|
|||||||
#include "databaseview.h"
|
|
||||||
#include <QVBoxLayout>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QDialogButtonBox>
|
|
||||||
#include <QHeaderView>
|
|
||||||
#include <QSqlError>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QContextMenuEvent>
|
|
||||||
#include <QRegularExpression>
|
|
||||||
#include <QGuiApplication>
|
|
||||||
#include <QClipboard>
|
|
||||||
#include <QMimeData>
|
|
||||||
#include <iostream>
|
|
||||||
#include "batchprocessing.h"
|
#include "batchprocessing.h"
|
||||||
|
#include "databaseview.h"
|
||||||
|
#include <QClipboard>
|
||||||
|
#include <QContextMenuEvent>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDialogButtonBox>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QHeaderView>
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QMimeData>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QRegularExpression>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QSqlError>
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
const QStringList DEFAULT_COLUMNS = {"EXPTIME", "OBJECT", "RA", "DEC"};
|
const QStringList DEFAULT_COLUMNS = {"EXPTIME", "OBJECT", "RA", "DEC"};
|
||||||
|
|
||||||
@@ -248,7 +249,7 @@ void FITSFileModel::prepareQuery()
|
|||||||
{
|
{
|
||||||
setHeaderData(i++, Qt::Horizontal, column);
|
setHeaderData(i++, Qt::Horizontal, column);
|
||||||
}
|
}
|
||||||
std::cout << sql.toStdString() << std::endl;
|
qDebug() << "DB SQL" << sql;
|
||||||
if(lastError().type() != QSqlError::NoError)
|
if(lastError().type() != QSqlError::NoError)
|
||||||
qDebug() << "Database error" << lastError();
|
qDebug() << "Database error" << lastError();
|
||||||
|
|
||||||
@@ -318,9 +319,12 @@ DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent
|
|||||||
m_model = new FITSFileModel(m_database, this);
|
m_model = new FITSFileModel(m_database, this);
|
||||||
|
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
m_tableView->setModel(m_model);
|
|
||||||
m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
|
m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList());
|
||||||
|
m_tableView->setModel(m_model);
|
||||||
|
QTimer::singleShot(200, [this](){
|
||||||
|
QSettings settings;
|
||||||
m_tableView->horizontalHeader()->restoreState(settings.value("databaseview/header").toByteArray());
|
m_tableView->horizontalHeader()->restoreState(settings.value("databaseview/header").toByteArray());
|
||||||
|
});
|
||||||
|
|
||||||
QHBoxLayout *hlayout = new QHBoxLayout();
|
QHBoxLayout *hlayout = new QHBoxLayout();
|
||||||
layout->addLayout(hlayout);
|
layout->addLayout(hlayout);
|
||||||
|
|||||||
@@ -0,0 +1,89 @@
|
|||||||
|
#include "fitswrapper.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
|
FITSWrapper::FITSWrapper(const QString &path, int mode, bool open)
|
||||||
|
{
|
||||||
|
_path = path;
|
||||||
|
_mode = mode;
|
||||||
|
|
||||||
|
if(open)
|
||||||
|
fits_open_diskfile(&_file, path.toLocal8Bit().data(), mode, &_status);
|
||||||
|
else
|
||||||
|
fits_create_diskfile(&_file, path.toLocal8Bit().data(), &_status);
|
||||||
|
|
||||||
|
if(_status == FILE_NOT_OPENED || _status == FILE_NOT_CREATED)
|
||||||
|
{
|
||||||
|
qWarning() << "Could not open file directly trying memfile workaround" << path;
|
||||||
|
if(open)
|
||||||
|
{
|
||||||
|
QFile fr(path);
|
||||||
|
if(fr.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
_bufferSize = fr.size();
|
||||||
|
_bufferPtr = malloc(_bufferSize);
|
||||||
|
fr.read((char*)_bufferPtr, _bufferSize);
|
||||||
|
_status = 0;
|
||||||
|
fits_open_memfile(&_file, "memfile", mode, &_bufferPtr, &_bufferSize, 0, realloc, &_status);
|
||||||
|
if(_status)
|
||||||
|
{
|
||||||
|
free(_bufferPtr);
|
||||||
|
_bufferPtr = nullptr;
|
||||||
|
_bufferSize = 0;
|
||||||
|
qWarning() << "fits_open_memfile failed";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qWarning() << "QFile failed to open file" << path;
|
||||||
|
_status = FILE_NOT_OPENED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_bufferSize = 2880;
|
||||||
|
_bufferPtr = malloc(_bufferSize);
|
||||||
|
fits_create_memfile(&_file, &_bufferPtr, &_bufferSize, 0, realloc, &_status);
|
||||||
|
if(_status)
|
||||||
|
{
|
||||||
|
free(_bufferPtr);
|
||||||
|
_bufferPtr = nullptr;
|
||||||
|
_bufferSize = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FITSWrapper::~FITSWrapper()
|
||||||
|
{
|
||||||
|
if(_file)
|
||||||
|
{
|
||||||
|
_status = 0;
|
||||||
|
fits_close_file(_file, &_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_mode == READWRITE && _bufferPtr)
|
||||||
|
{
|
||||||
|
qDebug() << "Writing FITS memfile" << _bufferSize;
|
||||||
|
QFile fw(_path);
|
||||||
|
if(fw.open(QIODevice::WriteOnly | QIODevice::Truncate))
|
||||||
|
{
|
||||||
|
if(fw.write((char*)_bufferPtr, _bufferSize) != (qint64)_bufferSize)
|
||||||
|
qWarning() << "Failed to write to file";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
qWarning() << "Failed to open fits file for writing";
|
||||||
|
}
|
||||||
|
|
||||||
|
free(_bufferPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
int FITSWrapper::status() const
|
||||||
|
{
|
||||||
|
return _status;
|
||||||
|
}
|
||||||
|
|
||||||
|
FITSWrapper::operator fitsfile *()
|
||||||
|
{
|
||||||
|
return _file;
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
#ifndef FITSWRAPPER_H
|
||||||
|
#define FITSWRAPPER_H
|
||||||
|
|
||||||
|
#include <QByteArray>
|
||||||
|
#include <QString>
|
||||||
|
#include <fitsio.h>
|
||||||
|
|
||||||
|
class FITSWrapper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit FITSWrapper(const QString &path, int mode, bool open);
|
||||||
|
~FITSWrapper();
|
||||||
|
FITSWrapper(FITSWrapper &other) = delete;
|
||||||
|
int status() const;
|
||||||
|
operator fitsfile*();
|
||||||
|
private:
|
||||||
|
QString _path;
|
||||||
|
int _status = 0;
|
||||||
|
int _mode = 0;
|
||||||
|
fitsfile *_file;
|
||||||
|
size_t _bufferSize = 0;
|
||||||
|
void *_bufferPtr = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // FITSWRAPPER_H
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
#include "loadimage.h"
|
#include "loadimage.h"
|
||||||
#include <QElapsedTimer>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QFileInfo>
|
|
||||||
#include <QDir>
|
|
||||||
#include <libraw/libraw.h>
|
|
||||||
#include <fitsio2.h>
|
|
||||||
#include "libxisf.h"
|
#include "libxisf.h"
|
||||||
#include <libexif/exif-data.h>
|
|
||||||
#include "rawimage.h"
|
#include "rawimage.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QElapsedTimer>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <libexif/exif-data.h>
|
||||||
|
#include <libraw/libraw.h>
|
||||||
|
#include "fitswrapper.h"
|
||||||
|
|
||||||
QString makeUNCPath(const QString &path)
|
QString makeUNCPath(const QString &path)
|
||||||
{
|
{
|
||||||
@@ -85,7 +85,6 @@ int loadFITSHeader(fitsfile *file, ImageInfoData &info)
|
|||||||
|
|
||||||
bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage> &image, bool planar, uint32_t index)
|
bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage> &image, bool planar, uint32_t index)
|
||||||
{
|
{
|
||||||
fitsfile *file;
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
int num = 0;
|
int num = 0;
|
||||||
long naxes[3] = {0};
|
long naxes[3] = {0};
|
||||||
@@ -99,7 +98,9 @@ bool loadFITS(const QString path, ImageInfoData &info, std::shared_ptr<RawImage>
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
fits_open_diskfile(&file, path.toLocal8Bit().data(), READONLY, &status);
|
FITSWrapper file(path, READONLY, true);
|
||||||
|
status = file.status();
|
||||||
|
|
||||||
if(status)return checkError();
|
if(status)return checkError();
|
||||||
fits_get_num_hdus(file, &num, &status);
|
fits_get_num_hdus(file, &num, &status);
|
||||||
if(status)return checkError();
|
if(status)return checkError();
|
||||||
@@ -222,7 +223,6 @@ noload:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fits_close_file(file, &status);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,7 +231,8 @@ bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
LibXISF::XISFReader xisf;
|
LibXISF::XISFReader xisf;
|
||||||
xisf.open(path.toLocal8Bit().data());
|
QFileInfo fileInfo(path);
|
||||||
|
xisf.open(fileInfo.filesystemFilePath());
|
||||||
|
|
||||||
if(index >= (uint32_t)xisf.imagesCount())return false;
|
if(index >= (uint32_t)xisf.imagesCount())return false;
|
||||||
const LibXISF::Image &xisfImage = xisf.getImage(index);
|
const LibXISF::Image &xisfImage = xisf.getImage(index);
|
||||||
@@ -344,15 +345,14 @@ bool loadXISF(const QString &path, ImageInfoData &info, std::shared_ptr<RawImage
|
|||||||
|
|
||||||
bool readFITSHeader(const QString &path, ImageInfoData &info)
|
bool readFITSHeader(const QString &path, ImageInfoData &info)
|
||||||
{
|
{
|
||||||
fitsfile *fr;
|
|
||||||
int status = 0;
|
|
||||||
QString path2 = makeUNCPath(path);
|
QString path2 = makeUNCPath(path);
|
||||||
fits_open_diskfile(&fr, path2.toLocal8Bit().data(), READONLY, &status);
|
|
||||||
|
|
||||||
if(fr && status == 0)
|
FITSWrapper file(path, READONLY, true);
|
||||||
|
int status = file.status();
|
||||||
|
|
||||||
|
if(file && status == 0)
|
||||||
{
|
{
|
||||||
status = loadFITSHeader(fr, info);
|
status = loadFITSHeader(file, info);
|
||||||
fits_close_file(fr, &status);
|
|
||||||
}
|
}
|
||||||
return status == 0;
|
return status == 0;
|
||||||
}
|
}
|
||||||
@@ -363,7 +363,8 @@ bool readXISFHeader(const QString &path, ImageInfoData &info)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
LibXISF::XISFReader xisf;
|
LibXISF::XISFReader xisf;
|
||||||
xisf.open(path2.toLocal8Bit().data());
|
QFileInfo fileInfo(path2);
|
||||||
|
xisf.open(fileInfo.filesystemFilePath());
|
||||||
const LibXISF::Image &image = xisf.getImage(0, false);
|
const LibXISF::Image &image = xisf.getImage(0, false);
|
||||||
|
|
||||||
auto fitskeywords = image.fitsKeywords();
|
auto fitskeywords = image.fitsKeywords();
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
#include "loadrunable.h"
|
#include "loadrunable.h"
|
||||||
|
#include "fitswrapper.h"
|
||||||
#include "imageringlist.h"
|
#include "imageringlist.h"
|
||||||
|
#include "loadimage.h"
|
||||||
|
#include "rawimage.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QElapsedTimer>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QElapsedTimer>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <fitsio2.h>
|
#include <fitsio2.h>
|
||||||
#include "rawimage.h"
|
|
||||||
#include "loadimage.h"
|
|
||||||
#include <lcms2.h>
|
#include <lcms2.h>
|
||||||
|
|
||||||
LoadRunable::LoadRunable(const QString &file, Image *receiver, AnalyzeLevel level, int index, bool thumbnail) :
|
LoadRunable::LoadRunable(const QString &file, Image *receiver, AnalyzeLevel level, int index, bool thumbnail) :
|
||||||
@@ -269,7 +270,8 @@ void ConvertRunable::run()
|
|||||||
image.setByteshuffling(true);
|
image.setByteshuffling(true);
|
||||||
|
|
||||||
xisf.writeImage(image);
|
xisf.writeImage(image);
|
||||||
xisf.save(m_outfile.toLocal8Bit().data());
|
QFileInfo fileInfo(makeUNCPath(m_outfile));
|
||||||
|
xisf.save(fileInfo.filesystemFilePath());
|
||||||
}
|
}
|
||||||
catch(LibXISF::Error &err)
|
catch(LibXISF::Error &err)
|
||||||
{
|
{
|
||||||
@@ -281,9 +283,10 @@ void ConvertRunable::run()
|
|||||||
if(m_format == "fits")
|
if(m_format == "fits")
|
||||||
{
|
{
|
||||||
int status = 0;
|
int status = 0;
|
||||||
fitsfile *fw;
|
|
||||||
if(QFileInfo(m_outfile).exists())QFile::remove(m_outfile);
|
if(QFileInfo(m_outfile).exists())QFile::remove(m_outfile);
|
||||||
fits_create_diskfile(&fw, m_outfile.toLocal8Bit().data(), &status);
|
FITSWrapper fw(m_outfile, READWRITE, false);
|
||||||
|
if(fw.status())return;
|
||||||
|
|
||||||
if(!m_params.compressionType.isEmpty())
|
if(!m_params.compressionType.isEmpty())
|
||||||
{
|
{
|
||||||
if(m_params.compressionType == "gzip")
|
if(m_params.compressionType == "gzip")
|
||||||
@@ -292,7 +295,6 @@ void ConvertRunable::run()
|
|||||||
fits_set_compression_type(fw, RICE_1, &status);
|
fits_set_compression_type(fw, RICE_1, &status);
|
||||||
}
|
}
|
||||||
writeFITSImage(fw, rawimage, imageinfo);
|
writeFITSImage(fw, rawimage, imageinfo);
|
||||||
fits_close_file(fw, &status);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,28 @@
|
|||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include <QApplication>
|
#include "application.h"
|
||||||
#include <QSurfaceFormat>
|
|
||||||
#include <QTranslator>
|
|
||||||
#include <QCommandLineParser>
|
#include <QCommandLineParser>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
#include <QSurfaceFormat>
|
||||||
|
#include <QTranslator>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "../thumbnailer/genthumbnail.h"
|
#include "../thumbnailer/genthumbnail.h"
|
||||||
#ifdef Q_OS_WIN64
|
#ifdef Q_OS_WIN64
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
bool DEBUG_LOG = false;
|
||||||
|
|
||||||
|
QtMessageHandler defaultHandler = nullptr;
|
||||||
|
|
||||||
|
void messageHandler(QtMsgType type, const QMessageLogContext &ctx, const QString &message)
|
||||||
|
{
|
||||||
|
if(defaultHandler)
|
||||||
|
{
|
||||||
|
if(DEBUG_LOG || type != QtMsgType::QtDebugMsg)
|
||||||
|
defaultHandler(type, ctx, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
@@ -29,6 +42,7 @@ int main(int argc, char *argv[])
|
|||||||
freopen("CONOUT$", "w", stderr);
|
freopen("CONOUT$", "w", stderr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
defaultHandler = qInstallMessageHandler(messageHandler);
|
||||||
|
|
||||||
QCommandLineParser cmd;
|
QCommandLineParser cmd;
|
||||||
cmd.addOption({"gl", "Use desktop OpenGL. This is default on x86 and MacOS platform."});
|
cmd.addOption({"gl", "Use desktop OpenGL. This is default on x86 and MacOS platform."});
|
||||||
@@ -40,6 +54,7 @@ int main(int argc, char *argv[])
|
|||||||
cmd.addOption({"scriptarg", "String that will be passed to script as variable \"scriparg\"", "arg"});
|
cmd.addOption({"scriptarg", "String that will be passed to script as variable \"scriparg\"", "arg"});
|
||||||
cmd.addOption({"outdir", "Output dir for script (default: CWD)", "dir", "."});
|
cmd.addOption({"outdir", "Output dir for script (default: CWD)", "dir", "."});
|
||||||
cmd.addOption({"noexit", "Do not exit application when script finish"});
|
cmd.addOption({"noexit", "Do not exit application when script finish"});
|
||||||
|
cmd.addOption({"debug", "Print debug info"});
|
||||||
cmd.addHelpOption();
|
cmd.addHelpOption();
|
||||||
QStringList cmdArgs;
|
QStringList cmdArgs;
|
||||||
for(int i = 0; i < argc; i++)
|
for(int i = 0; i < argc; i++)
|
||||||
@@ -51,6 +66,9 @@ int main(int argc, char *argv[])
|
|||||||
if(cmd.isSet("gles"))
|
if(cmd.isSet("gles"))
|
||||||
useGLES = true;
|
useGLES = true;
|
||||||
|
|
||||||
|
if(cmd.isSet("debug"))
|
||||||
|
DEBUG_LOG = true;
|
||||||
|
|
||||||
if(cmd.isSet("thumb"))
|
if(cmd.isSet("thumb"))
|
||||||
{
|
{
|
||||||
QCoreApplication app(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
@@ -84,11 +102,10 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
QSurfaceFormat::setDefaultFormat(format);
|
QSurfaceFormat::setDefaultFormat(format);
|
||||||
|
|
||||||
|
Application a(argc, argv);
|
||||||
QApplication a(argc, argv);
|
|
||||||
a.setOrganizationName("nou");
|
a.setOrganizationName("nou");
|
||||||
a.setApplicationName("Tenmon");
|
a.setApplicationName("Tenmon");
|
||||||
a.setWindowIcon(QIcon(":/space.nouspiro.tenmon.png"));
|
a.setWindowIcon(QIcon(":/space.nouspiro.tenmon_64.png"));
|
||||||
|
|
||||||
QTranslator translator;
|
QTranslator translator;
|
||||||
QTranslator translator2;
|
QTranslator translator2;
|
||||||
@@ -109,6 +126,7 @@ int main(int argc, char *argv[])
|
|||||||
a.installTranslator(&translator2);
|
a.installTranslator(&translator2);
|
||||||
|
|
||||||
MainWindow w;
|
MainWindow w;
|
||||||
|
QObject::connect(&a, &Application::openFileEvent, &w, static_cast<void (MainWindow::*)(const QString&)>(&MainWindow::loadFile));
|
||||||
w.show();
|
w.show();
|
||||||
|
|
||||||
if(!cmd.positionalArguments().isEmpty() && !cmd.isSet("script"))
|
if(!cmd.positionalArguments().isEmpty() && !cmd.isSet("script"))
|
||||||
|
|||||||
@@ -1,37 +1,38 @@
|
|||||||
|
#include "about.h"
|
||||||
|
#include "batchprocessing.h"
|
||||||
|
#include "filemanager.h"
|
||||||
|
#include "histogram.h"
|
||||||
|
#include "loadrunable.h"
|
||||||
#include "mainwindow.h"
|
#include "mainwindow.h"
|
||||||
#include <QScrollArea>
|
#include "markedfiles.h"
|
||||||
|
#include "settingsdialog.h"
|
||||||
|
#include "statusbar.h"
|
||||||
|
#include <QActionGroup>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QDesktopServices>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QDockWidget>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QGuiApplication>
|
||||||
|
#include <QImageReader>
|
||||||
|
#include <QImageWriter>
|
||||||
|
#include <QJsonDocument>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QMenuBar>
|
#include <QMenuBar>
|
||||||
#include <QFileDialog>
|
|
||||||
#include <QStandardPaths>
|
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
#include <QMimeDatabase>
|
||||||
|
#include <QNetworkReply>
|
||||||
#include <QProgressDialog>
|
#include <QProgressDialog>
|
||||||
#include <QDebug>
|
#include <QScrollArea>
|
||||||
#include <QDockWidget>
|
#include <QSettings>
|
||||||
#include <QActionGroup>
|
#include <QStandardPaths>
|
||||||
|
#include <QStatusBar>
|
||||||
|
#include <QThreadPool>
|
||||||
|
#include <QSessionManager>
|
||||||
|
#include <QTimer>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <QSettings>
|
|
||||||
#include <QGuiApplication>
|
|
||||||
#include <QThreadPool>
|
|
||||||
#include <QStatusBar>
|
|
||||||
#include <QImageReader>
|
|
||||||
#include <QImageWriter>
|
|
||||||
#include <QMimeDatabase>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QNetworkReply>
|
|
||||||
#include <QTimer>
|
|
||||||
#include "loadrunable.h"
|
|
||||||
#include "markedfiles.h"
|
|
||||||
#include "about.h"
|
|
||||||
#include "statusbar.h"
|
|
||||||
#include "settingsdialog.h"
|
|
||||||
#include "histogram.h"
|
|
||||||
#include "batchprocessing.h"
|
|
||||||
#include "filemanager.h"
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
@@ -404,6 +405,14 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
|
|||||||
if(_plateSolving)_plateSolving->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
|
if(_plateSolving)_plateSolving->setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);
|
||||||
m_stretchPanel->setFloatable(false);
|
m_stretchPanel->setFloatable(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(settings.value("settings/checkupdate", false).toBool())
|
||||||
|
{
|
||||||
|
QDateTime lastcheck = settings.value("settings/lastcheck").toDateTime();
|
||||||
|
QDateTime weekago = QDateTime::currentDateTimeUtc().addDays(-7);
|
||||||
|
if(!lastcheck.isValid() || lastcheck < weekago)
|
||||||
|
checkNewVersion(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
@@ -576,6 +585,8 @@ void MainWindow::loadFile(const QString &path)
|
|||||||
if(!path.isEmpty())
|
if(!path.isEmpty())
|
||||||
{
|
{
|
||||||
QFileInfo info(path);
|
QFileInfo info(path);
|
||||||
|
if(info.exists() && info.isReadable())
|
||||||
|
{
|
||||||
m_ringList->setFile(info.canonicalFilePath());
|
m_ringList->setFile(info.canonicalFilePath());
|
||||||
updateWindowTitle();
|
updateWindowTitle();
|
||||||
if(info.isDir())
|
if(info.isDir())
|
||||||
@@ -587,6 +598,11 @@ void MainWindow::loadFile(const QString &path)
|
|||||||
if(settings.value("settings/bestfit", false).toBool())
|
if(settings.value("settings/bestfit", false).toBool())
|
||||||
m_image->bestFit();
|
m_image->bestFit();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qWarning() << "File doesn't exist or is not readable";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::loadFiles(const QStringList &paths)
|
void MainWindow::loadFiles(const QStringList &paths)
|
||||||
@@ -815,21 +831,27 @@ void MainWindow::exportCSV()
|
|||||||
m_databaseView->exportCSV(file);
|
m_databaseView->exportCSV(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::checkNewVersion()
|
void MainWindow::checkNewVersion(bool autocheck)
|
||||||
{
|
{
|
||||||
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
|
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
|
||||||
QNetworkRequest request(QUrl("https://gitea.nouspiro.space/api/v1/repos/nou/tenmon/releases/latest"));
|
QNetworkRequest request(QUrl("https://gitea.nouspiro.space/api/v1/repos/nou/tenmon/releases/latest"));
|
||||||
request.setRawHeader("accept", "application/json");
|
request.setRawHeader("accept", "application/json");
|
||||||
QNetworkReply *reply = manager->get(request);
|
QNetworkReply *reply = manager->get(request);
|
||||||
connect(reply, &QNetworkReply::finished, [this, manager, reply](){
|
connect(reply, &QNetworkReply::finished, [this, manager, reply, autocheck](){
|
||||||
QJsonParseError error;
|
QJsonParseError error;
|
||||||
QJsonDocument json = QJsonDocument::fromJson(reply->readAll(), &error);
|
QJsonDocument json = QJsonDocument::fromJson(reply->readAll(), &error);
|
||||||
if(json.isObject() && json.object().contains("tag_name"))
|
if(json.isObject() && json.object().contains("tag_name"))
|
||||||
{
|
{
|
||||||
|
QSettings settings;
|
||||||
|
settings.setValue("settings/lastcheck", QDateTime::currentDateTimeUtc());
|
||||||
|
|
||||||
QString tag = json.object().value("tag_name").toString();
|
QString tag = json.object().value("tag_name").toString();
|
||||||
QString version = getVersion();
|
QString version = getVersion();
|
||||||
if(version >= tag)
|
if(version >= tag)
|
||||||
|
{
|
||||||
|
if(!autocheck)
|
||||||
QMessageBox::information(this, tr("Update check"), tr("You have newest version"));
|
QMessageBox::information(this, tr("Update check"), tr("You have newest version"));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(QMessageBox::question(this, tr("Update check"), tr("New version %1 is available. Do you want to download it now?").arg(tag)) == QMessageBox::Yes)
|
if(QMessageBox::question(this, tr("Update check"), tr("New version %1 is available. Do you want to download it now?").arg(tag)) == QMessageBox::Yes)
|
||||||
@@ -843,6 +865,7 @@ void MainWindow::checkNewVersion()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if(!autocheck)
|
||||||
QMessageBox::warning(this, tr("Update check"), tr("Failed to check version"));
|
QMessageBox::warning(this, tr("Update check"), tr("Failed to check version"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public slots:
|
|||||||
void showMarkFilesDialog();
|
void showMarkFilesDialog();
|
||||||
void showSettingsDialog();
|
void showSettingsDialog();
|
||||||
void exportCSV();
|
void exportCSV();
|
||||||
void checkNewVersion();
|
void checkNewVersion(bool autocheck = false);
|
||||||
void openFileManager();
|
void openFileManager();
|
||||||
void runScript(const QString &script, const QString &outdir, const QStringList &paths, const QString &arg, bool exit);
|
void runScript(const QString &script, const QString &outdir, const QStringList &paths, const QString &arg, bool exit);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
#include "scriptengine.h"
|
#include "scriptengine.h"
|
||||||
#include <QDir>
|
#include "batchprocessing.h"
|
||||||
#include <QFileInfo>
|
#include "fitswrapper.h"
|
||||||
#include <QDebug>
|
#include "libxisf.h"
|
||||||
#include <QInputDialog>
|
#include "loadimage.h"
|
||||||
#include <QJsonValue>
|
|
||||||
#include <QJSValueIterator>
|
|
||||||
#include "loadrunable.h"
|
#include "loadrunable.h"
|
||||||
#include "rawimage.h"
|
#include "rawimage.h"
|
||||||
#include "loadimage.h"
|
#include <QDebug>
|
||||||
#include "batchprocessing.h"
|
#include <QDir>
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QInputDialog>
|
||||||
|
#include <QJSValueIterator>
|
||||||
|
#include <QJsonValue>
|
||||||
#include <fitsio2.h>
|
#include <fitsio2.h>
|
||||||
#include "libxisf.h"
|
|
||||||
#ifdef PLATESOLVER
|
#ifdef PLATESOLVER
|
||||||
#include "solver.h"
|
#include "solver.h"
|
||||||
#endif // PLATESOLVER
|
#endif // PLATESOLVER
|
||||||
@@ -672,10 +673,11 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
|
|
||||||
if(isFITS(suffix()))
|
if(isFITS(suffix()))
|
||||||
{
|
{
|
||||||
fitsfile *file;
|
|
||||||
int status = 0;
|
int status = 0;
|
||||||
QString path = makeUNCPath(_path);
|
QString path = makeUNCPath(_path);
|
||||||
fits_open_diskfile(&file, path.toLocal8Bit().data(), READWRITE, &status);
|
FITSWrapper file(path, READWRITE, true);
|
||||||
|
status = file.status();
|
||||||
|
|
||||||
int num = 0;
|
int num = 0;
|
||||||
fits_get_num_hdus(file, &num, &status);
|
fits_get_num_hdus(file, &num, &status);
|
||||||
if(status)
|
if(status)
|
||||||
@@ -795,8 +797,7 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fits_close_file(file, &status);
|
if(status)qWarning() << "Failed to modify FITS header" << status;
|
||||||
|
|
||||||
return status == 0;
|
return status == 0;
|
||||||
}
|
}
|
||||||
else if(isXISF(suffix()))
|
else if(isXISF(suffix()))
|
||||||
@@ -804,9 +805,9 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
LibXISF::XISFModify modifyXISF;
|
LibXISF::XISFModify modifyXISF;
|
||||||
QString in = makeUNCPath(absoluteFilePath());
|
QFileInfo in(makeUNCPath(absoluteFilePath()));
|
||||||
QString out = in + "~";
|
QFileInfo out(in.absoluteFilePath() + "~");
|
||||||
modifyXISF.open(in.toLocal8Bit().data());
|
modifyXISF.open(in.filesystemFilePath());
|
||||||
qDebug() << "modify" << in << out;
|
qDebug() << "modify" << in << out;
|
||||||
|
|
||||||
for(auto &remove : modify->_remove)
|
for(auto &remove : modify->_remove)
|
||||||
@@ -821,9 +822,9 @@ bool File::modifyFITSRecords(const FITSRecordModify *modify)
|
|||||||
for(auto &property : modify->_property)
|
for(auto &property : modify->_property)
|
||||||
modifyXISF.updateProperty(modify->_imageIdx, property);
|
modifyXISF.updateProperty(modify->_imageIdx, property);
|
||||||
|
|
||||||
modifyXISF.save(out.toLocal8Bit().toStdString());
|
modifyXISF.save(out.filesystemFilePath());
|
||||||
modifyXISF.close();
|
modifyXISF.close();
|
||||||
std::filesystem::rename(out.toLocal8Bit().toStdString(), in.toLocal8Bit().toStdString());
|
std::filesystem::rename(out.filesystemFilePath(), in.filesystemFilePath());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch(std::filesystem::filesystem_error &err)
|
catch(std::filesystem::filesystem_error &err)
|
||||||
|
|||||||
@@ -147,6 +147,10 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent)
|
|||||||
else if(lang == "sk")m_lang->setCurrentIndex(2);
|
else if(lang == "sk")m_lang->setCurrentIndex(2);
|
||||||
else if(lang == "pt_BR")m_lang->setCurrentIndex(3);
|
else if(lang == "pt_BR")m_lang->setCurrentIndex(3);
|
||||||
|
|
||||||
|
m_checkUpdate = new QCheckBox(tr("Check for new version"), this);
|
||||||
|
m_checkUpdate->setToolTip(tr("Check for new version every week"));
|
||||||
|
m_checkUpdate->setChecked(settings.value("settings/checkupdate", false).toBool());
|
||||||
|
|
||||||
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(tr("Saturation"), m_saturation);
|
layout->addRow(tr("Saturation"), m_saturation);
|
||||||
@@ -156,6 +160,7 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent)
|
|||||||
layout->addRow(m_qualityThumbnail);
|
layout->addRow(m_qualityThumbnail);
|
||||||
layout->addRow(m_useNativeDialog);
|
layout->addRow(m_useNativeDialog);
|
||||||
layout->addRow(m_bestFit);
|
layout->addRow(m_bestFit);
|
||||||
|
layout->addRow(m_checkUpdate);
|
||||||
layout->addRow(new QLabel(tr("FITS header highlight"), this));
|
layout->addRow(new QLabel(tr("FITS header highlight"), this));
|
||||||
layout->addRow(m_headerHighlight);
|
layout->addRow(m_headerHighlight);
|
||||||
layout->addRow(m_keyword, color);
|
layout->addRow(m_keyword, color);
|
||||||
@@ -265,4 +270,5 @@ void SettingsDialog::saveSettings()
|
|||||||
case 3: lang = "pt_BR"; break;
|
case 3: lang = "pt_BR"; break;
|
||||||
}
|
}
|
||||||
settings.setValue("settings/lang", lang);
|
settings.setValue("settings/lang", lang);
|
||||||
|
settings.setValue("settings/checkupdate", m_checkUpdate->isChecked());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ private:
|
|||||||
QColor m_color = Qt::yellow;
|
QColor m_color = Qt::yellow;
|
||||||
QLineEdit *m_keyword;
|
QLineEdit *m_keyword;
|
||||||
QComboBox *m_lang;
|
QComboBox *m_lang;
|
||||||
|
QCheckBox *m_checkUpdate;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SETTINGSDIALOG_H
|
#endif // SETTINGSDIALOG_H
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
#include "../src/rawimage.h"
|
#include "../src/rawimage.h"
|
||||||
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
#define STB_IMAGE_WRITE_IMPLEMENTATION
|
||||||
#include "stb_image_write.h"
|
#include "stb_image_write.h"
|
||||||
|
|||||||
@@ -174,17 +174,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DataBaseView</name>
|
<name>DataBaseView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="327"/>
|
<location filename="../src/databaseview.cpp" line="328"/>
|
||||||
<source>Select columns</source>
|
<source>Select columns</source>
|
||||||
<translation>Select columns</translation>
|
<translation>Select columns</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="378"/>
|
<location filename="../src/databaseview.cpp" line="379"/>
|
||||||
<source>Text to search, you can % as wildcard</source>
|
<source>Text to search, you can % as wildcard</source>
|
||||||
<translation>Text to search, you can % as wildcard</translation>
|
<translation>Text to search, you can % as wildcard</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="394"/>
|
<location filename="../src/databaseview.cpp" line="395"/>
|
||||||
<source>Filter</source>
|
<source>Filter</source>
|
||||||
<translation>Filter</translation>
|
<translation>Filter</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -192,27 +192,27 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTableView</name>
|
<name>DatabaseTableView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="265"/>
|
<location filename="../src/databaseview.cpp" line="266"/>
|
||||||
<source>Mark</source>
|
<source>Mark</source>
|
||||||
<translation>Mark</translation>
|
<translation>Mark</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="266"/>
|
<location filename="../src/databaseview.cpp" line="267"/>
|
||||||
<source>Unmark</source>
|
<source>Unmark</source>
|
||||||
<translation>Unmark</translation>
|
<translation>Unmark</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="267"/>
|
<location filename="../src/databaseview.cpp" line="268"/>
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
<translation>Open</translation>
|
<translation>Open</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="268"/>
|
<location filename="../src/databaseview.cpp" line="269"/>
|
||||||
<source>Open file location</source>
|
<source>Open file location</source>
|
||||||
<translation>Open file location</translation>
|
<translation>Open file location</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="269"/>
|
<location filename="../src/databaseview.cpp" line="270"/>
|
||||||
<source>Copy files</source>
|
<source>Copy files</source>
|
||||||
<translation>Copy files</translation>
|
<translation>Copy files</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -220,23 +220,42 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeSettings</name>
|
<name>DatabaseTreeSettings</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="13"/>
|
|
||||||
<source>Add tree filter</source>
|
<source>Add tree filter</source>
|
||||||
<translation>Add tree filter</translation>
|
<translation type="vanished">Add tree filter</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="16"/>
|
||||||
|
<source>Add tree grouping</source>
|
||||||
|
<translation>Add tree grouping</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="41"/>
|
||||||
|
<source>Aggregate function</source>
|
||||||
|
<translation>Aggregate function</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="45"/>
|
||||||
|
<source>This aggregate function will be applied to last level of grouping</source>
|
||||||
|
<translation>This aggregate function will be applied to last level of grouping</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeView</name>
|
<name>DatabaseTreeView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="358"/>
|
<location filename="../src/databasetree.cpp" line="480"/>
|
||||||
<source>Add</source>
|
<source>Add</source>
|
||||||
<translation>Add</translation>
|
<translation>Add</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="359"/>
|
<location filename="../src/databasetree.cpp" line="481"/>
|
||||||
<source>Remove</source>
|
<source>Remove</source>
|
||||||
<translation>Remove</translation>
|
<translation>Remove</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="482"/>
|
||||||
|
<source>Tree/Table</source>
|
||||||
|
<translation>Tree/Table</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Dialog</name>
|
<name>Dialog</name>
|
||||||
@@ -249,7 +268,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>FITSFileModel</name>
|
<name>FITSFileModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="244"/>
|
<location filename="../src/databaseview.cpp" line="245"/>
|
||||||
<source>File name</source>
|
<source>File name</source>
|
||||||
<translation>File name</translation>
|
<translation>File name</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -431,7 +450,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>HelpDialog</name>
|
<name>HelpDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/about.cpp" line="33"/>
|
<location filename="../src/about.cpp" line="35"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>Help</translation>
|
<translation>Help</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
@@ -174,17 +174,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DataBaseView</name>
|
<name>DataBaseView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="327"/>
|
<location filename="../src/databaseview.cpp" line="328"/>
|
||||||
<source>Select columns</source>
|
<source>Select columns</source>
|
||||||
<translation>Choix des colonnes</translation>
|
<translation>Choix des colonnes</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="378"/>
|
<location filename="../src/databaseview.cpp" line="379"/>
|
||||||
<source>Text to search, you can % as wildcard</source>
|
<source>Text to search, you can % as wildcard</source>
|
||||||
<translation>Texte à chercher, utilisez % comme caractère générique</translation>
|
<translation>Texte à chercher, utilisez % comme caractère générique</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="394"/>
|
<location filename="../src/databaseview.cpp" line="395"/>
|
||||||
<source>Filter</source>
|
<source>Filter</source>
|
||||||
<translation>Filtre</translation>
|
<translation>Filtre</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -192,27 +192,27 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTableView</name>
|
<name>DatabaseTableView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="265"/>
|
<location filename="../src/databaseview.cpp" line="266"/>
|
||||||
<source>Mark</source>
|
<source>Mark</source>
|
||||||
<translation>Marquer</translation>
|
<translation>Marquer</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="266"/>
|
<location filename="../src/databaseview.cpp" line="267"/>
|
||||||
<source>Unmark</source>
|
<source>Unmark</source>
|
||||||
<translation>Décocher</translation>
|
<translation>Décocher</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="267"/>
|
<location filename="../src/databaseview.cpp" line="268"/>
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
<translation type="unfinished">Ouvrir</translation>
|
<translation type="unfinished">Ouvrir</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="268"/>
|
<location filename="../src/databaseview.cpp" line="269"/>
|
||||||
<source>Open file location</source>
|
<source>Open file location</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="269"/>
|
<location filename="../src/databaseview.cpp" line="270"/>
|
||||||
<source>Copy files</source>
|
<source>Copy files</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -220,23 +220,38 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeSettings</name>
|
<name>DatabaseTreeSettings</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="13"/>
|
<location filename="../src/databasetree.cpp" line="16"/>
|
||||||
<source>Add tree filter</source>
|
<source>Add tree grouping</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="41"/>
|
||||||
|
<source>Aggregate function</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="45"/>
|
||||||
|
<source>This aggregate function will be applied to last level of grouping</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeView</name>
|
<name>DatabaseTreeView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="358"/>
|
<location filename="../src/databasetree.cpp" line="480"/>
|
||||||
<source>Add</source>
|
<source>Add</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="359"/>
|
<location filename="../src/databasetree.cpp" line="481"/>
|
||||||
<source>Remove</source>
|
<source>Remove</source>
|
||||||
<translation type="unfinished">Supprimer</translation>
|
<translation type="unfinished">Supprimer</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="482"/>
|
||||||
|
<source>Tree/Table</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Dialog</name>
|
<name>Dialog</name>
|
||||||
@@ -249,7 +264,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>FITSFileModel</name>
|
<name>FITSFileModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="244"/>
|
<location filename="../src/databaseview.cpp" line="245"/>
|
||||||
<source>File name</source>
|
<source>File name</source>
|
||||||
<translation>Nom de fichier</translation>
|
<translation>Nom de fichier</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -431,7 +446,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>HelpDialog</name>
|
<name>HelpDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/about.cpp" line="33"/>
|
<location filename="../src/about.cpp" line="35"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>Aide</translation>
|
<translation>Aide</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
@@ -175,17 +175,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DataBaseView</name>
|
<name>DataBaseView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="327"/>
|
<location filename="../src/databaseview.cpp" line="328"/>
|
||||||
<source>Select columns</source>
|
<source>Select columns</source>
|
||||||
<translation>Selecionar colunas</translation>
|
<translation>Selecionar colunas</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="378"/>
|
<location filename="../src/databaseview.cpp" line="379"/>
|
||||||
<source>Text to search, you can % as wildcard</source>
|
<source>Text to search, you can % as wildcard</source>
|
||||||
<translation>Texto a ser pesquisado, você pode % como curinga</translation>
|
<translation>Texto a ser pesquisado, você pode % como curinga</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="394"/>
|
<location filename="../src/databaseview.cpp" line="395"/>
|
||||||
<source>Filter</source>
|
<source>Filter</source>
|
||||||
<translation>Filtro</translation>
|
<translation>Filtro</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -193,27 +193,27 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTableView</name>
|
<name>DatabaseTableView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="265"/>
|
<location filename="../src/databaseview.cpp" line="266"/>
|
||||||
<source>Mark</source>
|
<source>Mark</source>
|
||||||
<translation>Assinalar</translation>
|
<translation>Assinalar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="266"/>
|
<location filename="../src/databaseview.cpp" line="267"/>
|
||||||
<source>Unmark</source>
|
<source>Unmark</source>
|
||||||
<translation>Desmarcar</translation>
|
<translation>Desmarcar</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="267"/>
|
<location filename="../src/databaseview.cpp" line="268"/>
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
<translation type="unfinished">Abrir</translation>
|
<translation type="unfinished">Abrir</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="268"/>
|
<location filename="../src/databaseview.cpp" line="269"/>
|
||||||
<source>Open file location</source>
|
<source>Open file location</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="269"/>
|
<location filename="../src/databaseview.cpp" line="270"/>
|
||||||
<source>Copy files</source>
|
<source>Copy files</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -221,23 +221,38 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeSettings</name>
|
<name>DatabaseTreeSettings</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="13"/>
|
<location filename="../src/databasetree.cpp" line="16"/>
|
||||||
<source>Add tree filter</source>
|
<source>Add tree grouping</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="41"/>
|
||||||
|
<source>Aggregate function</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="45"/>
|
||||||
|
<source>This aggregate function will be applied to last level of grouping</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeView</name>
|
<name>DatabaseTreeView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="358"/>
|
<location filename="../src/databasetree.cpp" line="480"/>
|
||||||
<source>Add</source>
|
<source>Add</source>
|
||||||
<translation type="unfinished">Add</translation>
|
<translation type="unfinished">Add</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="359"/>
|
<location filename="../src/databasetree.cpp" line="481"/>
|
||||||
<source>Remove</source>
|
<source>Remove</source>
|
||||||
<translation type="unfinished">Retirar</translation>
|
<translation type="unfinished">Retirar</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="482"/>
|
||||||
|
<source>Tree/Table</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Dialog</name>
|
<name>Dialog</name>
|
||||||
@@ -250,7 +265,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>FITSFileModel</name>
|
<name>FITSFileModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="244"/>
|
<location filename="../src/databaseview.cpp" line="245"/>
|
||||||
<source>File name</source>
|
<source>File name</source>
|
||||||
<translation>Nome do arquivo</translation>
|
<translation>Nome do arquivo</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -265,7 +280,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../src/fitskeyword.ui" line="41"/>
|
<location filename="../src/fitskeyword.ui" line="41"/>
|
||||||
<source>Add</source>
|
<source>Add</source>
|
||||||
<translation type="unfinished">Add</translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/fitskeyword.ui" line="48"/>
|
<location filename="../src/fitskeyword.ui" line="48"/>
|
||||||
@@ -432,7 +447,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>HelpDialog</name>
|
<name>HelpDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/about.cpp" line="33"/>
|
<location filename="../src/about.cpp" line="35"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>Ajuda</translation>
|
<translation>Ajuda</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
@@ -174,17 +174,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DataBaseView</name>
|
<name>DataBaseView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="327"/>
|
<location filename="../src/databaseview.cpp" line="328"/>
|
||||||
<source>Select columns</source>
|
<source>Select columns</source>
|
||||||
<translation>Vyber stĺpce</translation>
|
<translation>Vyber stĺpce</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="378"/>
|
<location filename="../src/databaseview.cpp" line="379"/>
|
||||||
<source>Text to search, you can % as wildcard</source>
|
<source>Text to search, you can % as wildcard</source>
|
||||||
<translation>Text na vyhľadanie, môžete použit % ako zástupný znak</translation>
|
<translation>Text na vyhľadanie, môžete použit % ako zástupný znak</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="394"/>
|
<location filename="../src/databaseview.cpp" line="395"/>
|
||||||
<source>Filter</source>
|
<source>Filter</source>
|
||||||
<translatorcomment>Meno súboru</translatorcomment>
|
<translatorcomment>Meno súboru</translatorcomment>
|
||||||
<translation>Filter</translation>
|
<translation>Filter</translation>
|
||||||
@@ -193,27 +193,27 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTableView</name>
|
<name>DatabaseTableView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="265"/>
|
<location filename="../src/databaseview.cpp" line="266"/>
|
||||||
<source>Mark</source>
|
<source>Mark</source>
|
||||||
<translation>Označiť</translation>
|
<translation>Označiť</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="266"/>
|
<location filename="../src/databaseview.cpp" line="267"/>
|
||||||
<source>Unmark</source>
|
<source>Unmark</source>
|
||||||
<translation>Odznačiť</translation>
|
<translation>Odznačiť</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="267"/>
|
<location filename="../src/databaseview.cpp" line="268"/>
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
<translation>Otvoriť</translation>
|
<translation>Otvoriť</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="268"/>
|
<location filename="../src/databaseview.cpp" line="269"/>
|
||||||
<source>Open file location</source>
|
<source>Open file location</source>
|
||||||
<translation>Otvoriť umiestnenie súboru</translation>
|
<translation>Otvoriť umiestnenie súboru</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="269"/>
|
<location filename="../src/databaseview.cpp" line="270"/>
|
||||||
<source>Copy files</source>
|
<source>Copy files</source>
|
||||||
<translation>Skopírovať súbory</translation>
|
<translation>Skopírovať súbory</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -221,23 +221,42 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeSettings</name>
|
<name>DatabaseTreeSettings</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="13"/>
|
|
||||||
<source>Add tree filter</source>
|
<source>Add tree filter</source>
|
||||||
<translation>Pridať stromový filter</translation>
|
<translation type="vanished">Pridať stromový filter</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="16"/>
|
||||||
|
<source>Add tree grouping</source>
|
||||||
|
<translation>Pridaj stromové zoskupovanie</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="41"/>
|
||||||
|
<source>Aggregate function</source>
|
||||||
|
<translation>Agregačná funkcia</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="45"/>
|
||||||
|
<source>This aggregate function will be applied to last level of grouping</source>
|
||||||
|
<translation>Táto agregáčná funkcia bude použitá na poslednú úroveň zoskupovania</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>DatabaseTreeView</name>
|
<name>DatabaseTreeView</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="358"/>
|
<location filename="../src/databasetree.cpp" line="480"/>
|
||||||
<source>Add</source>
|
<source>Add</source>
|
||||||
<translation>Pridať</translation>
|
<translation>Pridať</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databasetree.cpp" line="359"/>
|
<location filename="../src/databasetree.cpp" line="481"/>
|
||||||
<source>Remove</source>
|
<source>Remove</source>
|
||||||
<translation>Odstrániť</translation>
|
<translation>Odstrániť</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/databasetree.cpp" line="482"/>
|
||||||
|
<source>Tree/Table</source>
|
||||||
|
<translation>Strom/Tabuľka</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>Dialog</name>
|
<name>Dialog</name>
|
||||||
@@ -250,7 +269,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>FITSFileModel</name>
|
<name>FITSFileModel</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/databaseview.cpp" line="244"/>
|
<location filename="../src/databaseview.cpp" line="245"/>
|
||||||
<source>File name</source>
|
<source>File name</source>
|
||||||
<translation>Meno súboru</translation>
|
<translation>Meno súboru</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -432,7 +451,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>HelpDialog</name>
|
<name>HelpDialog</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/about.cpp" line="33"/>
|
<location filename="../src/about.cpp" line="35"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>Pomoc</translation>
|
<translation>Pomoc</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||