Compare commits

..
Author SHA1 Message Date
Gary Wang cf95436aa9 WIP: property dialog 2020-10-30 14:12:21 +08:00
30 changed files with 254 additions and 533 deletions

No files matched your search

+26 -26
View File
@@ -12,34 +12,34 @@ set (QT_MINIMUM_VERSION "5.10")
find_package(Qt5 ${QT_MINIMUM_VERSION} CONFIG REQUIRED Widgets Svg LinguistTools) find_package(Qt5 ${QT_MINIMUM_VERSION} CONFIG REQUIRED Widgets Svg LinguistTools)
set (PPIC_CPP_FILES set (PPIC_CPP_FILES
app/main.cpp main.cpp
app/mainwindow.cpp mainwindow.cpp
app/graphicsview.cpp graphicsview.cpp
app/graphicsscene.cpp graphicsscene.cpp
app/bottombuttongroup.cpp bottombuttongroup.cpp
app/navigatorview.cpp navigatorview.cpp
app/opacityhelper.cpp opacityhelper.cpp
app/toolbutton.cpp toolbutton.cpp
app/settings.cpp settings.cpp
app/settingsdialog.cpp settingsdialog.cpp
app/aboutdialog.cpp aboutdialog.cpp
app/metadatamodel.cpp metadatamodel.cpp
app/metadatadialog.cpp metadatadialog.cpp
) )
set (PPIC_HEADER_FILES set (PPIC_HEADER_FILES
app/mainwindow.h mainwindow.h
app/graphicsview.h graphicsview.h
app/graphicsscene.h graphicsscene.h
app/bottombuttongroup.h bottombuttongroup.h
app/navigatorview.h navigatorview.h
app/opacityhelper.h opacityhelper.h
app/toolbutton.h toolbutton.h
app/settings.h settings.h
app/settingsdialog.h settingsdialog.h
app/aboutdialog.h aboutdialog.h
app/metadatamodel.h metadatamodel.h
app/metadatadialog.h metadatadialog.h
) )
set (PPIC_QRC_FILES set (PPIC_QRC_FILES
@@ -53,7 +53,7 @@ set (PPIC_RC_FILES
set (EXE_NAME ppic) set (EXE_NAME ppic)
# Translation # Translation
file (GLOB PPIC_TS_FILES translations/*.ts) file (GLOB PPIC_TS_FILES languages/*.ts)
set (PPIC_CPP_FILES_FOR_I18N ${PPIC_CPP_FILES}) set (PPIC_CPP_FILES_FOR_I18N ${PPIC_CPP_FILES})
qt5_create_translation(PPIC_QM_FILES ${PPIC_CPP_FILES_FOR_I18N} ${PPIC_TS_FILES}) qt5_create_translation(PPIC_QM_FILES ${PPIC_CPP_FILES_FOR_I18N} ${PPIC_TS_FILES})
File renamed without changes.
View File
File renamed without changes.
-101
View File
@@ -1,101 +0,0 @@
#include "metadatadialog.h"
#include <QDialogButtonBox>
#include <QPainter>
#include <QStyledItemDelegate>
#include <QTreeView>
#include <QVBoxLayout>
#include <QHeaderView>
#include "metadatamodel.h"
class PropertyTreeView : public QTreeView
{
public:
explicit PropertyTreeView(QWidget* parent) : QTreeView(parent) {}
~PropertyTreeView() {}
protected:
void rowsInserted(const QModelIndex& parent, int start, int end) override
{
QTreeView::rowsInserted(parent, start, end);
if (!parent.isValid()) {
for (int row = start; row <= end; ++row) {
setupSection(row);
}
}
}
void reset() override
{
QTreeView::reset();
if (model()) {
for (int row = 0; row < model()->rowCount(); ++row) {
setupSection(row);
}
}
}
private:
void setupSection(int row)
{
expand(model()->index(row, 0));
setFirstColumnSpanned(row, QModelIndex(), true);
}
};
class PropertyTreeItemDelegate : public QStyledItemDelegate
{
public:
PropertyTreeItemDelegate(QObject* parent)
: QStyledItemDelegate(parent)
{}
protected:
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override
{
QStyleOptionViewItem opt = option;
if (!index.parent().isValid()) {
opt.font.setBold(true);
opt.features.setFlag(QStyleOptionViewItem::Alternate);
}
QStyledItemDelegate::paint(painter, opt, index);
}
};
MetadataDialog::MetadataDialog(QWidget *parent)
: QDialog(parent)
, m_treeView(new PropertyTreeView(this))
{
m_treeView->setRootIsDecorated(false);
m_treeView->setIndentation(0);
m_treeView->setItemDelegate(new PropertyTreeItemDelegate(m_treeView));
m_treeView->header()->resizeSection(0, sizeHint().width() / 2);
setWindowTitle(tr("Image Metadata"));
QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
setLayout(new QVBoxLayout);
layout()->addWidget(m_treeView);
layout()->addWidget(buttonBox);
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::close);
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
}
MetadataDialog::~MetadataDialog()
{
}
void MetadataDialog::setMetadataModel(MetadataModel * model)
{
m_treeView->setModel(model);
}
QSize MetadataDialog::sizeHint() const
{
return QSize(520, 350);
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1 -8
View File
@@ -51,15 +51,8 @@ void GraphicsView::showFileFromUrl(const QUrl &url, bool doRequestGallery)
// QImage::Format imageFormat = imageReader.imageFormat(); // QImage::Format imageFormat = imageReader.imageFormat();
if (imageReader.format().isEmpty()) { if (imageReader.format().isEmpty()) {
showText(tr("File is not a valid image")); showText(tr("File is not a valid image"));
} else if (!imageReader.supportsAnimation() && !imageReader.canRead()) {
showText(tr("Image data is invalid or currently unsupported"));
} else { } else {
const QPixmap & pixmap = QPixmap::fromImageReader(&imageReader); showImage(QPixmap::fromImageReader(&imageReader));
if (pixmap.isNull()) {
showText(tr("Image data is invalid or currently unsupported"));
} else {
showImage(pixmap);
}
} }
} }
File renamed without changes.
@@ -4,157 +4,157 @@
<context> <context>
<name>AboutDialog</name> <name>AboutDialog</name>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="22"/> <location filename="../aboutdialog.cpp" line="22"/>
<source>About</source> <source>About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="25"/> <location filename="../aboutdialog.cpp" line="25"/>
<source>Launch application with image file path as argument to load the file.</source> <source>Launch application with image file path as argument to load the file.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="26"/> <location filename="../aboutdialog.cpp" line="26"/>
<source>Drag and drop image file onto the window is also supported.</source> <source>Drag and drop image file onto the window is also supported.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="27"/> <location filename="../aboutdialog.cpp" line="27"/>
<source>Context menu option explanation:</source> <source>Context menu option explanation:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="31"/> <location filename="../aboutdialog.cpp" line="31"/>
<source>Make window stay on top of all other windows.</source> <source>Make window stay on top of all other windows.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="35"/> <location filename="../aboutdialog.cpp" line="35"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source> <source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="44"/> <location filename="../aboutdialog.cpp" line="44"/>
<source>Version: %1</source> <source>Version: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="47"/> <location filename="../aboutdialog.cpp" line="47"/>
<source>Copyright (c) 2020 %1</source> <source>Copyright (c) 2020 %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="49"/> <location filename="../aboutdialog.cpp" line="49"/>
<source>Logo designed by %1</source> <source>Logo designed by %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="51"/> <location filename="../aboutdialog.cpp" line="51"/>
<source>Built with Qt %1 (%2)</source> <source>Built with Qt %1 (%2)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="52"/> <location filename="../aboutdialog.cpp" line="52"/>
<source>Source code</source> <source>Source code</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="58"/> <location filename="../aboutdialog.cpp" line="58"/>
<source>Contributors</source> <source>Contributors</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="60"/> <location filename="../aboutdialog.cpp" line="60"/>
<source>List of contributors on GitHub</source> <source>List of contributors on GitHub</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="61"/> <location filename="../aboutdialog.cpp" line="61"/>
<source>Thanks to all people who contributed to this project.</source> <source>Thanks to all people who contributed to this project.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="65"/> <location filename="../aboutdialog.cpp" line="65"/>
<source>Translators</source> <source>Translators</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="66"/> <location filename="../aboutdialog.cpp" line="66"/>
<source>I would like to thank the following people who volunteered to translate this application.</source> <source>I would like to thank the following people who volunteered to translate this application.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="131"/> <location filename="../aboutdialog.cpp" line="131"/>
<source>&amp;Special Thanks</source> <source>&amp;Special Thanks</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="133"/> <location filename="../aboutdialog.cpp" line="133"/>
<source>&amp;Third-party Libraries</source> <source>&amp;Third-party Libraries</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="72"/> <location filename="../aboutdialog.cpp" line="72"/>
<source>Your Rights</source> <source>Your Rights</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="74"/> <location filename="../aboutdialog.cpp" line="74"/>
<source>%1 is released under the MIT License.</source> <source>%1 is released under the MIT License.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="75"/> <location filename="../aboutdialog.cpp" line="75"/>
<source>This license grants people a number of freedoms:</source> <source>This license grants people a number of freedoms:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="76"/> <location filename="../aboutdialog.cpp" line="76"/>
<source>You are free to use %1, for any purpose</source> <source>You are free to use %1, for any purpose</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="77"/> <location filename="../aboutdialog.cpp" line="77"/>
<source>You are free to distribute %1</source> <source>You are free to distribute %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="78"/> <location filename="../aboutdialog.cpp" line="78"/>
<source>You can study how %1 works and change it</source> <source>You can study how %1 works and change it</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="79"/> <location filename="../aboutdialog.cpp" line="79"/>
<source>You can distribute changed versions of %1</source> <source>You can distribute changed versions of %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="81"/> <location filename="../aboutdialog.cpp" line="81"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source> <source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="109"/> <location filename="../aboutdialog.cpp" line="109"/>
<source>Third-party Libraries used by %1</source> <source>Third-party Libraries used by %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="110"/> <location filename="../aboutdialog.cpp" line="110"/>
<source>%1 is built on the following free software libraries:</source> <source>%1 is built on the following free software libraries:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="129"/> <location filename="../aboutdialog.cpp" line="129"/>
<source>&amp;Help</source> <source>&amp;Help</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="130"/> <location filename="../aboutdialog.cpp" line="130"/>
<source>&amp;About</source> <source>&amp;About</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="132"/> <location filename="../aboutdialog.cpp" line="132"/>
<source>&amp;License</source> <source>&amp;License</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -162,7 +162,7 @@
<context> <context>
<name>GraphicsScene</name> <name>GraphicsScene</name>
<message> <message>
<location filename="../app/graphicsscene.cpp" line="16"/> <location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source> <source>Drag image here</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -170,28 +170,22 @@
<context> <context>
<name>GraphicsView</name> <name>GraphicsView</name>
<message> <message>
<location filename="../app/graphicsview.cpp" line="261"/> <location filename="../graphicsview.cpp" line="254"/>
<source>File url list is empty</source> <source>File url list is empty</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/graphicsview.cpp" line="53"/> <location filename="../graphicsview.cpp" line="53"/>
<source>File is not a valid image</source> <source>File is not a valid image</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/graphicsview.cpp" line="55"/> <location filename="../graphicsview.cpp" line="262"/>
<location filename="../app/graphicsview.cpp" line="59"/>
<source>Image data is invalid or currently unsupported</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<source>Image data is invalid</source> <source>Image data is invalid</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/graphicsview.cpp" line="276"/> <location filename="../graphicsview.cpp" line="269"/>
<source>Not supported mimedata: %1</source> <source>Not supported mimedata: %1</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -199,59 +193,59 @@
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../app/mainwindow.cpp" line="178"/> <location filename="../mainwindow.cpp" line="178"/>
<source>File url list is empty</source> <source>File url list is empty</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="417"/> <location filename="../mainwindow.cpp" line="417"/>
<source>&amp;Copy</source> <source>&amp;Copy</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="438"/> <location filename="../mainwindow.cpp" line="438"/>
<source>Copy P&amp;ixmap</source> <source>Copy P&amp;ixmap</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="443"/> <location filename="../mainwindow.cpp" line="443"/>
<source>Copy &amp;File Path</source> <source>Copy &amp;File Path</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="453"/> <location filename="../mainwindow.cpp" line="453"/>
<source>&amp;Paste Image</source> <source>&amp;Paste Image</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="459"/> <location filename="../mainwindow.cpp" line="459"/>
<source>&amp;Paste Image File</source> <source>&amp;Paste Image File</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="492"/> <location filename="../mainwindow.cpp" line="492"/>
<source>Properties</source> <source>Properties</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="30"/> <location filename="../aboutdialog.cpp" line="30"/>
<location filename="../app/mainwindow.cpp" line="464"/> <location filename="../mainwindow.cpp" line="464"/>
<source>Stay on top</source> <source>Stay on top</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="34"/> <location filename="../aboutdialog.cpp" line="34"/>
<location filename="../app/mainwindow.cpp" line="471"/> <location filename="../mainwindow.cpp" line="471"/>
<source>Protected mode</source> <source>Protected mode</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="478"/> <location filename="../mainwindow.cpp" line="478"/>
<source>Configure...</source> <source>Configure...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="485"/> <location filename="../mainwindow.cpp" line="485"/>
<source>Help</source> <source>Help</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -259,7 +253,7 @@
<context> <context>
<name>MetadataDialog</name> <name>MetadataDialog</name>
<message> <message>
<location filename="../app/metadatadialog.cpp" line="75"/> <location filename="../metadatadialog.cpp" line="16"/>
<source>Image Metadata</source> <source>Image Metadata</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -267,142 +261,66 @@
<context> <context>
<name>MetadataModel</name> <name>MetadataModel</name>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="36"/> <location filename="../metadatamodel.cpp" line="29"/>
<source>Origin</source> <source>General</source>
<comment>Section name.</comment> <comment>General info about the image, section name.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="38"/> <location filename="../metadatamodel.cpp" line="32"/>
<source>Image</source> <source>File Name</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="44"/> <location filename="../metadatamodel.cpp" line="34"/>
<source>File</source> <source>File Size</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="40"/> <location filename="../metadatamodel.cpp" line="36"/>
<source>Camera</source> <source>Last Modified</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="27"/> <location filename="../metadatamodel.cpp" line="38"/>
<source>%1 File</source> <source>Image Size</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="35"/> <location filename="../metadatamodel.cpp" line="46"/>
<source>Description</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="42"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="47"/>
<source>Dimensions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="49"/>
<source>Aspect Ratio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="52"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="54"/>
<source>Item type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="56"/>
<source>Folder path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="58"/>
<source>Size</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="60"/>
<source>Date Created</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="62"/>
<source>Date Modified</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<source>%1 x %2</source> <source>%1 x %2</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../app/metadatamodel.cpp" line="88"/>
<source>%1 : %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="204"/>
<source>Property</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="204"/>
<source>Value</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>SettingsDialog</name> <name>SettingsDialog</name>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="15"/> <location filename="../settingsdialog.cpp" line="15"/>
<source>Settings</source> <source>Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="20"/> <location filename="../settingsdialog.cpp" line="20"/>
<source>Do nothing</source> <source>Do nothing</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="21"/> <location filename="../settingsdialog.cpp" line="21"/>
<source>Close the window</source> <source>Close the window</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="22"/> <location filename="../settingsdialog.cpp" line="22"/>
<source>Toggle maximize</source> <source>Toggle maximize</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="30"/> <location filename="../settingsdialog.cpp" line="30"/>
<source>Stay on top when start-up</source> <source>Stay on top when start-up</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="31"/> <location filename="../settingsdialog.cpp" line="31"/>
<source>Double-click behavior</source> <source>Double-click behavior</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -410,12 +328,12 @@
<context> <context>
<name>main</name> <name>main</name>
<message> <message>
<location filename="../app/main.cpp" line="27"/> <location filename="../main.cpp" line="27"/>
<source>Pineapple Pictures</source> <source>Pineapple Pictures</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/main.cpp" line="31"/> <location filename="../main.cpp" line="31"/>
<source>File list.</source> <source>File list.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@@ -4,157 +4,157 @@
<context> <context>
<name>AboutDialog</name> <name>AboutDialog</name>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="22"/> <location filename="../aboutdialog.cpp" line="22"/>
<source>About</source> <source>About</source>
<translation>关于</translation> <translation>关于</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="25"/> <location filename="../aboutdialog.cpp" line="25"/>
<source>Launch application with image file path as argument to load the file.</source> <source>Launch application with image file path as argument to load the file.</source>
<translation>以图片文件的路径作为参数运行程序即可直接打开图片文件。</translation> <translation>以图片文件的路径作为参数运行程序即可直接打开图片文件。</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="26"/> <location filename="../aboutdialog.cpp" line="26"/>
<source>Drag and drop image file onto the window is also supported.</source> <source>Drag and drop image file onto the window is also supported.</source>
<translation>也支持拖放图片文件到窗口内来加载图片。</translation> <translation>也支持拖放图片文件到窗口内来加载图片。</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="27"/> <location filename="../aboutdialog.cpp" line="27"/>
<source>Context menu option explanation:</source> <source>Context menu option explanation:</source>
<translation>菜单项说明:</translation> <translation>菜单项说明:</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="31"/> <location filename="../aboutdialog.cpp" line="31"/>
<source>Make window stay on top of all other windows.</source> <source>Make window stay on top of all other windows.</source>
<translation>使窗口始终至于其它非置顶窗口上方。</translation> <translation>使窗口始终至于其它非置顶窗口上方。</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="35"/> <location filename="../aboutdialog.cpp" line="35"/>
<source>Avoid close window accidentally. (eg. by double clicking the window)</source> <source>Avoid close window accidentally. (eg. by double clicking the window)</source>
<translation>避免窗口意外关闭。(如:不小心双击了窗口触发了关闭窗口行为)</translation> <translation>避免窗口意外关闭。(如:不小心双击了窗口触发了关闭窗口行为)</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="44"/> <location filename="../aboutdialog.cpp" line="44"/>
<source>Version: %1</source> <source>Version: %1</source>
<translation>版本: %1</translation> <translation>版本: %1</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="47"/> <location filename="../aboutdialog.cpp" line="47"/>
<source>Copyright (c) 2020 %1</source> <source>Copyright (c) 2020 %1</source>
<translation>版权所有 (c) 2020 %1</translation> <translation>版权所有 (c) 2020 %1</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="49"/> <location filename="../aboutdialog.cpp" line="49"/>
<source>Logo designed by %1</source> <source>Logo designed by %1</source>
<translation>Logo 由 %1 设计</translation> <translation>Logo 由 %1 设计</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="51"/> <location filename="../aboutdialog.cpp" line="51"/>
<source>Built with Qt %1 (%2)</source> <source>Built with Qt %1 (%2)</source>
<translation>使用 Qt %1 (%2) 进行构建</translation> <translation>使用 Qt %1 (%2) 进行构建</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="52"/> <location filename="../aboutdialog.cpp" line="52"/>
<source>Source code</source> <source>Source code</source>
<translation>源代码</translation> <translation>源代码</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="58"/> <location filename="../aboutdialog.cpp" line="58"/>
<source>Contributors</source> <source>Contributors</source>
<translation>贡献者</translation> <translation>贡献者</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="60"/> <location filename="../aboutdialog.cpp" line="60"/>
<source>List of contributors on GitHub</source> <source>List of contributors on GitHub</source>
<translation>GitHub 上的贡献者列表</translation> <translation>GitHub 上的贡献者列表</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="61"/> <location filename="../aboutdialog.cpp" line="61"/>
<source>Thanks to all people who contributed to this project.</source> <source>Thanks to all people who contributed to this project.</source>
<translation>感谢所有参与此项目的朋友。</translation> <translation>感谢所有参与此项目的朋友。</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="65"/> <location filename="../aboutdialog.cpp" line="65"/>
<source>Translators</source> <source>Translators</source>
<translation>翻译者</translation> <translation>翻译者</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="66"/> <location filename="../aboutdialog.cpp" line="66"/>
<source>I would like to thank the following people who volunteered to translate this application.</source> <source>I would like to thank the following people who volunteered to translate this application.</source>
<translation>我想要感谢下列自愿参与翻译此应用程序的朋友。</translation> <translation>我想要感谢下列自愿参与翻译此应用程序的朋友。</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="131"/> <location filename="../aboutdialog.cpp" line="131"/>
<source>&amp;Special Thanks</source> <source>&amp;Special Thanks</source>
<translation>致谢(&amp;S)</translation> <translation>致谢(&amp;S)</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="133"/> <location filename="../aboutdialog.cpp" line="133"/>
<source>&amp;Third-party Libraries</source> <source>&amp;Third-party Libraries</source>
<translation>第三方程序库(&amp;T)</translation> <translation>第三方程序库(&amp;T)</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="72"/> <location filename="../aboutdialog.cpp" line="72"/>
<source>Your Rights</source> <source>Your Rights</source>
<translation>用户的权利</translation> <translation>用户的权利</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="74"/> <location filename="../aboutdialog.cpp" line="74"/>
<source>%1 is released under the MIT License.</source> <source>%1 is released under the MIT License.</source>
<translation>%1 是在 MIT 许可协议下发布的。</translation> <translation>%1 是在 MIT 许可协议下发布的。</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="75"/> <location filename="../aboutdialog.cpp" line="75"/>
<source>This license grants people a number of freedoms:</source> <source>This license grants people a number of freedoms:</source>
<translation>此许可证赋予人们以下自由的权利:</translation> <translation>此许可证赋予人们以下自由的权利:</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="76"/> <location filename="../aboutdialog.cpp" line="76"/>
<source>You are free to use %1, for any purpose</source> <source>You are free to use %1, for any purpose</source>
<translation>任何人都可以为了任何目的自由地使用 %1</translation> <translation>任何人都可以为了任何目的自由地使用 %1</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="77"/> <location filename="../aboutdialog.cpp" line="77"/>
<source>You are free to distribute %1</source> <source>You are free to distribute %1</source>
<translation>任何人都可以自由地分发 %1</translation> <translation>任何人都可以自由地分发 %1</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="78"/> <location filename="../aboutdialog.cpp" line="78"/>
<source>You can study how %1 works and change it</source> <source>You can study how %1 works and change it</source>
<translation>任何人都可以自由地研究 %1 的工作原理并对其进行修改</translation> <translation>任何人都可以自由地研究 %1 的工作原理并对其进行修改</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="79"/> <location filename="../aboutdialog.cpp" line="79"/>
<source>You can distribute changed versions of %1</source> <source>You can distribute changed versions of %1</source>
<translation>任何人都可以自由地分发修改过的 %1 版本</translation> <translation>任何人都可以自由地分发修改过的 %1 版本</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="81"/> <location filename="../aboutdialog.cpp" line="81"/>
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source> <source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
<translation>此软件通过 MIT 许可证赋予用户上述自由,任何人无权剥夺。</translation> <translation>此软件通过 MIT 许可证赋予用户上述自由,任何人无权剥夺。</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="109"/> <location filename="../aboutdialog.cpp" line="109"/>
<source>Third-party Libraries used by %1</source> <source>Third-party Libraries used by %1</source>
<translation>%1 使用的第三方程序库</translation> <translation>%1 使用的第三方程序库</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="110"/> <location filename="../aboutdialog.cpp" line="110"/>
<source>%1 is built on the following free software libraries:</source> <source>%1 is built on the following free software libraries:</source>
<translation>%1 采用了下列自由软件程序库进行构建:</translation> <translation>%1 采用了下列自由软件程序库进行构建:</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="129"/> <location filename="../aboutdialog.cpp" line="129"/>
<source>&amp;Help</source> <source>&amp;Help</source>
<translation>帮助(&amp;H)</translation> <translation>帮助(&amp;H)</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="130"/> <location filename="../aboutdialog.cpp" line="130"/>
<source>&amp;About</source> <source>&amp;About</source>
<translation>关于(&amp;A)</translation> <translation>关于(&amp;A)</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="132"/> <location filename="../aboutdialog.cpp" line="132"/>
<source>&amp;License</source> <source>&amp;License</source>
<translation>软件许可证(&amp;L)</translation> <translation>软件许可证(&amp;L)</translation>
</message> </message>
@@ -162,7 +162,7 @@
<context> <context>
<name>GraphicsScene</name> <name>GraphicsScene</name>
<message> <message>
<location filename="../app/graphicsscene.cpp" line="16"/> <location filename="../graphicsscene.cpp" line="16"/>
<source>Drag image here</source> <source>Drag image here</source>
<translation>拖放图片至此</translation> <translation>拖放图片至此</translation>
</message> </message>
@@ -170,28 +170,22 @@
<context> <context>
<name>GraphicsView</name> <name>GraphicsView</name>
<message> <message>
<location filename="../app/graphicsview.cpp" line="261"/> <location filename="../graphicsview.cpp" line="254"/>
<source>File url list is empty</source> <source>File url list is empty</source>
<translation>文件 URL 列表为空</translation> <translation>文件 URL 列表为空</translation>
</message> </message>
<message> <message>
<location filename="../app/graphicsview.cpp" line="53"/> <location filename="../graphicsview.cpp" line="53"/>
<source>File is not a valid image</source> <source>File is not a valid image</source>
<translation>文件不是有效的图片文件</translation> <translation>文件不是有效的图片文件</translation>
</message> </message>
<message> <message>
<location filename="../app/graphicsview.cpp" line="55"/> <location filename="../graphicsview.cpp" line="262"/>
<location filename="../app/graphicsview.cpp" line="59"/>
<source>Image data is invalid or currently unsupported</source>
<translation>图像数据无效或暂未支持</translation>
</message>
<message>
<location filename="../app/graphicsview.cpp" line="269"/>
<source>Image data is invalid</source> <source>Image data is invalid</source>
<translation>图片数据无效</translation> <translation>图片数据无效</translation>
</message> </message>
<message> <message>
<location filename="../app/graphicsview.cpp" line="276"/> <location filename="../graphicsview.cpp" line="269"/>
<source>Not supported mimedata: %1</source> <source>Not supported mimedata: %1</source>
<translation>不受支持的 MimeData 格式:%1</translation> <translation>不受支持的 MimeData 格式:%1</translation>
</message> </message>
@@ -199,59 +193,59 @@
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../app/mainwindow.cpp" line="178"/> <location filename="../mainwindow.cpp" line="178"/>
<source>File url list is empty</source> <source>File url list is empty</source>
<translation>文件 URL 列表为空</translation> <translation>文件 URL 列表为空</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="417"/> <location filename="../mainwindow.cpp" line="417"/>
<source>&amp;Copy</source> <source>&amp;Copy</source>
<translation>复制(&amp;C)</translation> <translation>复制(&amp;C)</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="438"/> <location filename="../mainwindow.cpp" line="438"/>
<source>Copy P&amp;ixmap</source> <source>Copy P&amp;ixmap</source>
<translation>复制位图(&amp;I)</translation> <translation>复制位图(&amp;I)</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="443"/> <location filename="../mainwindow.cpp" line="443"/>
<source>Copy &amp;File Path</source> <source>Copy &amp;File Path</source>
<translation>复制文件路径(&amp;F)</translation> <translation>复制文件路径(&amp;F)</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="453"/> <location filename="../mainwindow.cpp" line="453"/>
<source>&amp;Paste Image</source> <source>&amp;Paste Image</source>
<translation>粘贴图像(&amp;P)</translation> <translation>粘贴图像(&amp;P)</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="459"/> <location filename="../mainwindow.cpp" line="459"/>
<source>&amp;Paste Image File</source> <source>&amp;Paste Image File</source>
<translation>粘贴图像文件(&amp;P)</translation> <translation>粘贴图像文件(&amp;P)</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="492"/> <location filename="../mainwindow.cpp" line="492"/>
<source>Properties</source> <source>Properties</source>
<translation>属性</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="30"/> <location filename="../aboutdialog.cpp" line="30"/>
<location filename="../app/mainwindow.cpp" line="464"/> <location filename="../mainwindow.cpp" line="464"/>
<source>Stay on top</source> <source>Stay on top</source>
<translation>总在最前</translation> <translation>总在最前</translation>
</message> </message>
<message> <message>
<location filename="../app/aboutdialog.cpp" line="34"/> <location filename="../aboutdialog.cpp" line="34"/>
<location filename="../app/mainwindow.cpp" line="471"/> <location filename="../mainwindow.cpp" line="471"/>
<source>Protected mode</source> <source>Protected mode</source>
<translation>保护模式</translation> <translation>保护模式</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="478"/> <location filename="../mainwindow.cpp" line="478"/>
<source>Configure...</source> <source>Configure...</source>
<translation>设置...</translation> <translation>设置...</translation>
</message> </message>
<message> <message>
<location filename="../app/mainwindow.cpp" line="485"/> <location filename="../mainwindow.cpp" line="485"/>
<source>Help</source> <source>Help</source>
<translation>帮助</translation> <translation>帮助</translation>
</message> </message>
@@ -259,150 +253,74 @@
<context> <context>
<name>MetadataDialog</name> <name>MetadataDialog</name>
<message> <message>
<location filename="../app/metadatadialog.cpp" line="75"/> <location filename="../metadatadialog.cpp" line="16"/>
<source>Image Metadata</source> <source>Image Metadata</source>
<translation>图像元信息</translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context> <context>
<name>MetadataModel</name> <name>MetadataModel</name>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="36"/> <location filename="../metadatamodel.cpp" line="29"/>
<source>Origin</source> <source>General</source>
<comment>Section name.</comment> <comment>General info about the image, section name.</comment>
<translation>来源</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="38"/> <location filename="../metadatamodel.cpp" line="32"/>
<source>Image</source> <source>File Name</source>
<comment>Section name.</comment> <translation type="unfinished"></translation>
<translation>图像</translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="44"/> <location filename="../metadatamodel.cpp" line="34"/>
<source>File</source> <source>File Size</source>
<comment>Section name.</comment> <translation type="unfinished"></translation>
<translation>文件</translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="40"/> <location filename="../metadatamodel.cpp" line="36"/>
<source>Camera</source> <source>Last Modified</source>
<comment>Section name.</comment> <translation type="unfinished"></translation>
<translation>照相机</translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="27"/> <location filename="../metadatamodel.cpp" line="38"/>
<source>%1 File</source> <source>Image Size</source>
<translation>%1 文件</translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../app/metadatamodel.cpp" line="35"/> <location filename="../metadatamodel.cpp" line="46"/>
<source>Description</source>
<comment>Section name.</comment>
<translation>说明</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="41"/>
<source>Advanced photo</source>
<comment>Section name.</comment>
<translation>高级照片</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="42"/>
<source>GPS</source>
<comment>Section name.</comment>
<translation>GPS</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="47"/>
<source>Dimensions</source>
<translation>分辨率</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="49"/>
<source>Aspect Ratio</source>
<translation>纵横比</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="52"/>
<source>Name</source>
<translation>名称</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="54"/>
<source>Item type</source>
<translation>项目类型</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="56"/>
<source>Folder path</source>
<translation>文件夹路径</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="58"/>
<source>Size</source>
<translation>大小</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="60"/>
<source>Date Created</source>
<translation>创建日期</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="62"/>
<source>Date Modified</source>
<translation>修改日期</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="70"/>
<source>%1 x %2</source> <source>%1 x %2</source>
<translation>%1 x %2</translation> <translation type="unfinished"></translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="88"/>
<source>%1 : %2</source>
<translation>%1 : %2</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="204"/>
<source>Property</source>
<translation>属性</translation>
</message>
<message>
<location filename="../app/metadatamodel.cpp" line="204"/>
<source>Value</source>
<translation>值</translation>
</message> </message>
</context> </context>
<context> <context>
<name>SettingsDialog</name> <name>SettingsDialog</name>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="15"/> <location filename="../settingsdialog.cpp" line="15"/>
<source>Settings</source> <source>Settings</source>
<translation>设定</translation> <translation>设定</translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="20"/> <location filename="../settingsdialog.cpp" line="20"/>
<source>Do nothing</source> <source>Do nothing</source>
<translation>什么也不做</translation> <translation>什么也不做</translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="21"/> <location filename="../settingsdialog.cpp" line="21"/>
<source>Close the window</source> <source>Close the window</source>
<translation>关闭窗口</translation> <translation>关闭窗口</translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="22"/> <location filename="../settingsdialog.cpp" line="22"/>
<source>Toggle maximize</source> <source>Toggle maximize</source>
<translation>最大化窗口</translation> <translation>最大化窗口</translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="30"/> <location filename="../settingsdialog.cpp" line="30"/>
<source>Stay on top when start-up</source> <source>Stay on top when start-up</source>
<translation>启动时保持窗口总在最前</translation> <translation>启动时保持窗口总在最前</translation>
</message> </message>
<message> <message>
<location filename="../app/settingsdialog.cpp" line="31"/> <location filename="../settingsdialog.cpp" line="31"/>
<source>Double-click behavior</source> <source>Double-click behavior</source>
<translation>双击时的行为</translation> <translation>双击时的行为</translation>
</message> </message>
@@ -410,12 +328,12 @@
<context> <context>
<name>main</name> <name>main</name>
<message> <message>
<location filename="../app/main.cpp" line="27"/> <location filename="../main.cpp" line="27"/>
<source>Pineapple Pictures</source> <source>Pineapple Pictures</source>
<translation>菠萝看图</translation> <translation>菠萝看图</translation>
</message> </message>
<message> <message>
<location filename="../app/main.cpp" line="31"/> <location filename="../main.cpp" line="31"/>
<source>File list.</source> <source>File list.</source>
<translation>文件列表。</translation> <translation>文件列表。</translation>
</message> </message>
View File
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.
+41
View File
@@ -0,0 +1,41 @@
#include "metadatadialog.h"
#include <QDialogButtonBox>
#include <QTreeView>
#include <QVBoxLayout>
#include "metadatamodel.h"
MetadataDialog::MetadataDialog(QWidget *parent)
: QDialog(parent)
, m_treeView(new QTreeView(this))
{
m_treeView->setRootIsDecorated(false);
m_treeView->setIndentation(0);
setWindowTitle(tr("Image Metadata"));
QDialogButtonBox * buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
setLayout(new QVBoxLayout);
layout()->addWidget(m_treeView);
layout()->addWidget(buttonBox);
connect(buttonBox, &QDialogButtonBox::close, this, &QDialog::close);
}
MetadataDialog::~MetadataDialog()
{
}
void MetadataDialog::setMetadataModel(MetadataModel * model)
{
m_treeView->setModel(model);
m_treeView->expandAll();
}
QSize MetadataDialog::sizeHint() const
{
return QSize(520, 350);
}
File renamed without changes.
+11 -57
View File
@@ -21,45 +21,21 @@ void MetadataModel::setFile(const QString &imageFilePath)
QFileInfo fileInfo(imageFilePath); QFileInfo fileInfo(imageFilePath);
// It'll be fine if we don't re-use the image reader we pass to the graphics scene for now. // It'll be fine if we don't re-use the image reader we pass to the graphics scene for now.
QImageReader imgReader(imageFilePath); QImageReader imgReader(imageFilePath);
imgReader.setAutoTransform(true);
imgReader.setDecideFormatFromContent(true);
const QString & itemTypeString = tr("%1 File").arg(QString(imgReader.format().toUpper()));
const QString & sizeString = QLocale().formattedDataSize(fileInfo.size()); const QString & sizeString = QLocale().formattedDataSize(fileInfo.size());
const QString & birthTimeString = QLocale().toString(fileInfo.birthTime(), QLocale::LongFormat); const QString & timeString = QLocale().toString(fileInfo.lastModified(), QLocale::LongFormat);
const QString & lastModifiedTimeString = QLocale().toString(fileInfo.lastModified(), QLocale::LongFormat); const QString & imageSizeString = imageSize(imgReader.size());
const QString & imageDimensionsString = imageSize(imgReader.size());
const QString & imageRatioString = imageSizeRatio(imgReader.size());
#if 0 appendSection(QStringLiteral("General"), tr("General", "General info about the image, section name."));
appendSection(QStringLiteral("Description"), tr("Description", "Section name."));
appendSection(QStringLiteral("Origin"), tr("Origin", "Section name."));
#endif // 0
appendSection(QStringLiteral("Image"), tr("Image", "Section name."));
#if 0
appendSection(QStringLiteral("Camera"), tr("Camera", "Section name."));
appendSection(QStringLiteral("AdvancedPhoto"), tr("Advanced photo", "Section name."));
appendSection(QStringLiteral("GPS"), tr("GPS", "Section name."));
#endif // 0
appendSection(QStringLiteral("File"), tr("File", "Section name."));
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.Dimensions"), appendProperty(QStringLiteral("General"), QStringLiteral("General.Name"),
tr("Dimensions"), imageDimensionsString); tr("File Name"), fileInfo.fileName());
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.SizeRatio"), appendProperty(QStringLiteral("General"), QStringLiteral("General.Size"),
tr("Aspect Ratio"), imageRatioString); tr("File Size"), sizeString);
appendProperty(QStringLiteral("General"), QStringLiteral("General.Time"),
appendProperty(QStringLiteral("File"), QStringLiteral("File.Name"), tr("Last Modified"), timeString);
tr("Name"), fileInfo.fileName()); appendProperty(QStringLiteral("General"), QStringLiteral("General.ImageSize"),
appendProperty(QStringLiteral("File"), QStringLiteral("File.ItemType"), tr("Image Size"), imageSizeString);
tr("Item type"), itemTypeString);
appendProperty(QStringLiteral("File"), QStringLiteral("File.Path"),
tr("Folder path"), fileInfo.path());
appendProperty(QStringLiteral("File"), QStringLiteral("File.Size"),
tr("Size"), sizeString);
appendProperty(QStringLiteral("File"), QStringLiteral("File.CreatedTime"),
tr("Date Created"), birthTimeString);
appendProperty(QStringLiteral("File"), QStringLiteral("File.LastModified"),
tr("Date Modified"), lastModifiedTimeString);
} }
QString MetadataModel::imageSize(const QSize &size) QString MetadataModel::imageSize(const QSize &size)
@@ -75,19 +51,6 @@ QString MetadataModel::imageSize(const QSize &size)
return imageSize; return imageSize;
} }
int simplegcd(int a, int b) {
return b == 0 ? a : simplegcd(b, a % b);
}
QString MetadataModel::imageSizeRatio(const QSize &size)
{
if (!size.isValid()) {
return QStringLiteral("-");
}
int gcd = simplegcd(size.width(), size.height());
return tr("%1 : %2").arg(QString::number(size.width() / gcd), QString::number(size.height() / gcd));
}
bool MetadataModel::appendSection(const QString &sectionKey, const QString &sectionDisplayName) bool MetadataModel::appendSection(const QString &sectionKey, const QString &sectionDisplayName)
{ {
if (m_sections.contains(sectionKey)) { if (m_sections.contains(sectionKey)) {
@@ -194,12 +157,3 @@ QVariant MetadataModel::data(const QModelIndex &index, int role) const
: m_properties[propertyList[index.row()]].second; : m_properties[propertyList[index.row()]].second;
} }
} }
QVariant MetadataModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (orientation == Qt::Vertical || role != Qt::DisplayRole) {
return QVariant();
}
return section == 0 ? tr("Property") : tr("Value");
}
-2
View File
@@ -13,7 +13,6 @@ public:
void setFile(const QString & imageFilePath); void setFile(const QString & imageFilePath);
static QString imageSize(const QSize &size); static QString imageSize(const QSize &size);
static QString imageSizeRatio(const QSize &size);
bool appendSection(const QString & sectionKey, const QString & sectionDisplayName); bool appendSection(const QString & sectionKey, const QString & sectionDisplayName);
bool appendProperty(const QString & sectionKey, const QString & propertyKey, bool appendProperty(const QString & sectionKey, const QString & propertyKey,
const QString & propertyDisplayName, const QString & propertyValue = QString()); const QString & propertyDisplayName, const QString & propertyValue = QString());
@@ -30,7 +29,6 @@ private:
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex & = QModelIndex()) const override; int columnCount(const QModelIndex & = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
// [SECTION_KEY] // [SECTION_KEY]
QList<QString> m_sections; QList<QString> m_sections;
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+27 -27
View File
@@ -17,37 +17,37 @@ DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11 lrelease embed_translations CONFIG += c++11 lrelease embed_translations
SOURCES += \ SOURCES += \
app/aboutdialog.cpp \ aboutdialog.cpp \
app/main.cpp \ main.cpp \
app/mainwindow.cpp \ mainwindow.cpp \
app/graphicsview.cpp \ graphicsview.cpp \
app/bottombuttongroup.cpp \ bottombuttongroup.cpp \
app/graphicsscene.cpp \ graphicsscene.cpp \
app/navigatorview.cpp \ navigatorview.cpp \
app/opacityhelper.cpp \ opacityhelper.cpp \
app/toolbutton.cpp \ toolbutton.cpp \
app/settings.cpp \ settings.cpp \
app/settingsdialog.cpp \ settingsdialog.cpp \
app/metadatamodel.cpp \ metadatamodel.cpp \
app/metadatadialog.cpp metadatadialog.cpp
HEADERS += \ HEADERS += \
app/aboutdialog.h \ aboutdialog.h \
app/mainwindow.h \ mainwindow.h \
app/graphicsview.h \ graphicsview.h \
app/bottombuttongroup.h \ bottombuttongroup.h \
app/graphicsscene.h \ graphicsscene.h \
app/navigatorview.h \ navigatorview.h \
app/opacityhelper.h \ opacityhelper.h \
app/toolbutton.h \ toolbutton.h \
app/settings.h \ settings.h \
app/settingsdialog.h \ settingsdialog.h \
app/metadatamodel.h \ metadatamodel.h \
app/metadatadialog.h metadatadialog.h
TRANSLATIONS = \ TRANSLATIONS = \
translations/PineapplePictures.ts \ languages/PineapplePictures.ts \
translations/PineapplePictures_zh_CN.ts languages/PineapplePictures_zh_CN.ts
# Default rules for deployment. # Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin qnx: target.path = /tmp/$${TARGET}/bin
View File
File renamed without changes.
View File
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
View File
File renamed without changes.