diff --git a/CMakeLists.txt b/CMakeLists.txt index c776517..69a3605 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ set (PPIC_CPP_FILES app/main.cpp app/framelesswindow.cpp app/mainwindow.cpp + app/actionmanager.cpp app/graphicsview.cpp app/graphicsscene.cpp app/bottombuttongroup.cpp @@ -47,6 +48,7 @@ set (PPIC_CPP_FILES set (PPIC_HEADER_FILES app/framelesswindow.h app/mainwindow.h + app/actionmanager.h app/graphicsview.h app/graphicsscene.h app/bottombuttongroup.h diff --git a/app/actionmanager.cpp b/app/actionmanager.cpp new file mode 100644 index 0000000..6351c47 --- /dev/null +++ b/app/actionmanager.cpp @@ -0,0 +1,62 @@ +#include "actionmanager.h" + +#include "mainwindow.h" + +#include + +#define CREATE_NEW_ACTION(window, action)\ + action = new QAction(window);\ + action->setObjectName(QString::fromUtf8( #action ));\ + window->addAction(action); + +ActionManager::ActionManager() +{ + +} + +ActionManager::~ActionManager() +{ + +} + +void ActionManager::setupAction(MainWindow *mainWindow) +{ + CREATE_NEW_ACTION(mainWindow, actionCopyPixmap); + CREATE_NEW_ACTION(mainWindow, actionCopyFilePath); + CREATE_NEW_ACTION(mainWindow, actionPaste); + CREATE_NEW_ACTION(mainWindow, actionToggleStayOnTop); + CREATE_NEW_ACTION(mainWindow, actionToggleProtectMode); + CREATE_NEW_ACTION(mainWindow, actionSettings); + CREATE_NEW_ACTION(mainWindow, actionHelp); + CREATE_NEW_ACTION(mainWindow, actionProperties); + CREATE_NEW_ACTION(mainWindow, actionQuitApp); + + retranslateUi(mainWindow); + + QMetaObject::connectSlotsByName(mainWindow); +} + +void ActionManager::retranslateUi(MainWindow *mainWindow) +{ + Q_UNUSED(mainWindow); + + actionCopyPixmap->setText(QCoreApplication::translate("MainWindow", "Copy P&ixmap", nullptr)); + actionCopyFilePath->setText(QCoreApplication::translate("MainWindow", "Copy &File Path", nullptr)); + actionPaste->setText(QCoreApplication::translate("MainWindow", "&Paste", nullptr)); + actionToggleStayOnTop->setText(QCoreApplication::translate("MainWindow", "Stay on top", nullptr)); + actionToggleProtectMode->setText(QCoreApplication::translate("MainWindow", "Protected mode", nullptr)); + actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr)); + actionHelp->setText(QCoreApplication::translate("MainWindow", "Help", nullptr)); + actionProperties->setText(QCoreApplication::translate("MainWindow", "Properties", nullptr)); + actionQuitApp->setText(QCoreApplication::translate("MainWindow", "Quit", nullptr)); +} + +void ActionManager::setupShortcuts() +{ + actionQuitApp->setShortcuts({ + QKeySequence(Qt::Key_Space), + QKeySequence(Qt::Key_Escape) + }); + actionQuitApp->setShortcutContext(Qt::ApplicationShortcut); +} + diff --git a/app/actionmanager.h b/app/actionmanager.h new file mode 100644 index 0000000..6f88cfd --- /dev/null +++ b/app/actionmanager.h @@ -0,0 +1,30 @@ +#ifndef ACTIONMANAGER_H +#define ACTIONMANAGER_H + +#include + +class MainWindow; + +class ActionManager +{ +public: + ActionManager(); + ~ActionManager(); + + void setupAction(MainWindow * mainWindow); + void retranslateUi(MainWindow *MainWindow); + void setupShortcuts(); + +public: + QAction *actionCopyPixmap; + QAction *actionCopyFilePath; + QAction *actionPaste; + QAction *actionToggleStayOnTop; + QAction *actionToggleProtectMode; + QAction *actionSettings; + QAction *actionHelp; + QAction *actionProperties; + QAction *actionQuitApp; +}; + +#endif // ACTIONMANAGER_H diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp index f018da6..21b221d 100644 --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -10,6 +10,7 @@ #include "aboutdialog.h" #include "metadatamodel.h" #include "metadatadialog.h" +#include "actionmanager.h" #include #include @@ -25,9 +26,11 @@ #include #include #include +#include -MainWindow::MainWindow(QWidget *parent) : - FramelessWindow(parent) +MainWindow::MainWindow(QWidget *parent) + : FramelessWindow(parent) + , m_am(new ActionManager) { if (Settings::instance()->stayOnTop()) { this->setWindowFlag(Qt::WindowStaysOnTopHint); @@ -110,7 +113,7 @@ MainWindow::MainWindow(QWidget *parent) : connect(m_bottomButtonGroup, &BottomButtonGroup::zoomInBtnClicked, this, [ = ](){ m_graphicsView->zoomView(1.25); }); connect(m_bottomButtonGroup, &BottomButtonGroup::zoomOutBtnClicked, - this, [ = ](){ m_graphicsView->zoomView(0.75); }); + this, [ = ](){ m_graphicsView->zoomView(0.8); }); connect(m_bottomButtonGroup, &BottomButtonGroup::toggleCheckerboardBtnClicked, this, [ = ](){ m_graphicsView->toggleCheckerboard(); }); connect(m_bottomButtonGroup, &BottomButtonGroup::rotateRightBtnClicked, @@ -130,14 +133,6 @@ MainWindow::MainWindow(QWidget *parent) : m_nextButton->setVisible(isGalleryAvailable()); }); - QShortcut * quitAppShorucut = new QShortcut(QKeySequence(Qt::Key_Space), this); - connect(quitAppShorucut, &QShortcut::activated, - std::bind(&MainWindow::quitAppAction, this, false)); - - QShortcut * quitAppShorucut2 = new QShortcut(QKeySequence(Qt::Key_Escape), this); - connect(quitAppShorucut2, &QShortcut::activated, - std::bind(&MainWindow::quitAppAction, this, false)); - QShortcut * prevPictureShorucut = new QShortcut(QKeySequence(Qt::Key_PageUp), this); connect(prevPictureShorucut, &QShortcut::activated, this, &MainWindow::galleryPrev); @@ -150,7 +145,13 @@ MainWindow::MainWindow(QWidget *parent) : connect(fullscreenShorucut, &QShortcut::activated, this, &MainWindow::toggleFullscreen); + m_am->setupAction(this); + centerWindow(); + + QTimer::singleShot(0, this, [this](){ + m_am->setupShortcuts(); + }); } MainWindow::~MainWindow() @@ -370,19 +371,29 @@ void MainWindow::mouseDoubleClickEvent(QMouseEvent *event) void MainWindow::wheelEvent(QWheelEvent *event) { QPoint numDegrees = event->angleDelta() / 8; - bool needZoom = false, zoomIn = false; + bool needWeelEvent = false, wheelUp = false; + bool actionIsZoom = event->modifiers().testFlag(Qt::ControlModifier) + || Settings::instance()->mouseWheelBehavior() == ActionZoomImage; // NOTE: Only checking angleDelta since the QWheelEvent::pixelDelta() doc says // pixelDelta() value is driver specific and unreliable on X11... // We are not scrolling the canvas, just zoom in or out, so it probably // doesn't matter here. if (!numDegrees.isNull() && numDegrees.y() != 0) { - needZoom = true; - zoomIn = numDegrees.y() > 0; + needWeelEvent = true; + wheelUp = numDegrees.y() > 0; } - if (needZoom) { - m_graphicsView->zoomView(zoomIn ? 1.25 : 0.8); + if (needWeelEvent) { + if (actionIsZoom) { + m_graphicsView->zoomView(wheelUp ? 1.25 : 0.8); + } else { + if (wheelUp) { + galleryPrev(); + } else { + galleryNext(); + } + } event->accept(); } else { FramelessWindow::wheelEvent(event); @@ -404,97 +415,38 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event) QImage clipboardImage; QUrl clipboardFileUrl; - const QMimeData * clipboardData = QApplication::clipboard()->mimeData(); - if (clipboardData->hasImage()) { - QVariant imageVariant(clipboardData->imageData()); - if (imageVariant.isValid()) { - clipboardImage = qvariant_cast(imageVariant); - } - } else if (clipboardData->hasText()) { - QString clipboardText(clipboardData->text()); - if (clipboardText.startsWith("PICTURE:")) { - QString maybeFilename(clipboardText.mid(8)); - if (QFile::exists(maybeFilename)) { - clipboardFileUrl = QUrl::fromLocalFile(maybeFilename); - } - } - } + QAction * copyPixmap = m_am->actionCopyPixmap; + QAction * copyFilePath = m_am->actionCopyFilePath; - QAction * copyPixmap = new QAction(tr("Copy P&ixmap")); - connect(copyPixmap, &QAction::triggered, this, [ = ](){ - QClipboard *cb = QApplication::clipboard(); - cb->setPixmap(m_graphicsView->scene()->renderToPixmap()); - }); - QAction * copyFilePath = new QAction(tr("Copy &File Path")); - connect(copyFilePath, &QAction::triggered, this, [ = ](){ - QClipboard *cb = QApplication::clipboard(); - cb->setText(currentFileUrl.toLocalFile()); - }); copyMenu->addAction(copyPixmap); if (currentFileUrl.isValid()) { copyMenu->addAction(copyFilePath); } - QAction * pasteImage = new QAction(tr("&Paste Image")); - connect(pasteImage, &QAction::triggered, this, [ = ](){ - clearGallery(); - m_graphicsView->showImage(clipboardImage); - }); + QAction * paste = m_am->actionPaste; - QAction * pasteImageFile = new QAction(tr("&Paste Image File")); - connect(pasteImageFile, &QAction::triggered, this, [ = ](){ - m_graphicsView->showFileFromUrl(clipboardFileUrl, true); - }); - - QAction * stayOnTopMode = new QAction(tr("Stay on top")); - connect(stayOnTopMode, &QAction::triggered, this, [ = ](){ - toggleStayOnTop(); - }); + QAction * stayOnTopMode = m_am->actionToggleStayOnTop; stayOnTopMode->setCheckable(true); stayOnTopMode->setChecked(stayOnTop()); - QAction * protectedMode = new QAction(tr("Protected mode")); - connect(protectedMode, &QAction::triggered, this, [ = ](){ - toggleProtectedMode(); - }); + QAction * protectedMode = m_am->actionToggleProtectMode; protectedMode->setCheckable(true); protectedMode->setChecked(m_protectedMode); - QAction * toggleSettings = new QAction(tr("Configure...")); - connect(toggleSettings, &QAction::triggered, this, [ = ](){ - SettingsDialog * sd = new SettingsDialog(this); - sd->exec(); - sd->deleteLater(); - }); - - QAction * helpAction = new QAction(tr("Help")); - connect(helpAction, &QAction::triggered, this, [ = ](){ - AboutDialog * ad = new AboutDialog(this); - ad->exec(); - ad->deleteLater(); - }); - - QAction * propertiesAction = new QAction(tr("Properties")); - connect(propertiesAction, &QAction::triggered, this, [ = ](){ - MetadataModel * md = new MetadataModel(); - md->setFile(currentFileUrl.toLocalFile()); - - MetadataDialog * ad = new MetadataDialog(this); - ad->setMetadataModel(md); - ad->exec(); - ad->deleteLater(); - }); + QAction * toggleSettings = m_am->actionSettings; + QAction * helpAction = m_am->actionHelp; + QAction * propertiesAction = m_am->actionProperties; if (copyMenu->actions().count() == 1) { menu->addActions(copyMenu->actions()); } else { menu->addMenu(copyMenu); } - if (!clipboardImage.isNull()) { - menu->addAction(pasteImage); - } else if (clipboardFileUrl.isValid()) { - menu->addAction(pasteImageFile); + + if (canPaste()) { + menu->addAction(paste); } + menu->addSeparator(); menu->addAction(stayOnTopMode); menu->addAction(protectedMode); @@ -507,6 +459,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event) } menu->exec(mapToGlobal(event->pos())); menu->deleteLater(); + copyMenu->deleteLater(); return FramelessWindow::contextMenuEvent(event); } @@ -563,6 +516,22 @@ bool MainWindow::stayOnTop() return windowFlags().testFlag(Qt::WindowStaysOnTopHint); } +bool MainWindow::canPaste() +{ + const QMimeData * clipboardData = QApplication::clipboard()->mimeData(); + if (clipboardData->hasImage()) { + return true; + } else if (clipboardData->hasText()) { + QString clipboardText(clipboardData->text()); + if (clipboardText.startsWith("PICTURE:")) { + QString maybeFilename(clipboardText.mid(8)); + if (QFile::exists(maybeFilename)) { + return true; + } + } + } +} + void MainWindow::quitAppAction(bool force) { if (!m_protectedMode || force) { @@ -592,3 +561,90 @@ QSize MainWindow::sizeHint() const { return QSize(710, 530); } + +void MainWindow::on_actionCopyPixmap_triggered() +{ + QClipboard *cb = QApplication::clipboard(); + cb->setPixmap(m_graphicsView->scene()->renderToPixmap()); +} + +void MainWindow::on_actionCopyFilePath_triggered() +{ + QUrl currentFileUrl(currentImageFileUrl()); + if (currentFileUrl.isValid()) { + QClipboard *cb = QApplication::clipboard(); + cb->setText(currentFileUrl.toLocalFile()); + } +} + +void MainWindow::on_actionPaste_triggered() +{ + QImage clipboardImage; + QUrl clipboardFileUrl; + + const QMimeData * clipboardData = QApplication::clipboard()->mimeData(); + if (clipboardData->hasImage()) { + QVariant imageVariant(clipboardData->imageData()); + if (imageVariant.isValid()) { + clipboardImage = qvariant_cast(imageVariant); + } + } else if (clipboardData->hasText()) { + QString clipboardText(clipboardData->text()); + if (clipboardText.startsWith("PICTURE:")) { + QString maybeFilename(clipboardText.mid(8)); + if (QFile::exists(maybeFilename)) { + clipboardFileUrl = QUrl::fromLocalFile(maybeFilename); + } + } + } + + if (!clipboardImage.isNull()) { + clearGallery(); + m_graphicsView->showImage(clipboardImage); + } else if (clipboardFileUrl.isValid()) { + m_graphicsView->showFileFromUrl(clipboardFileUrl, true); + } +} + +void MainWindow::on_actionToggleStayOnTop_triggered() +{ + toggleStayOnTop(); +} + +void MainWindow::on_actionToggleProtectMode_triggered() +{ + toggleProtectedMode(); +} + +void MainWindow::on_actionSettings_triggered() +{ + SettingsDialog * sd = new SettingsDialog(this); + sd->exec(); + sd->deleteLater(); +} + +void MainWindow::on_actionHelp_triggered() +{ + AboutDialog * ad = new AboutDialog(this); + ad->exec(); + ad->deleteLater(); +} + +void MainWindow::on_actionProperties_triggered() +{ + QUrl currentFileUrl = currentImageFileUrl(); + if (!currentFileUrl.isValid()) return; + + MetadataModel * md = new MetadataModel(); + md->setFile(currentFileUrl.toLocalFile()); + + MetadataDialog * ad = new MetadataDialog(this); + ad->setMetadataModel(md); + ad->exec(); + ad->deleteLater(); +} + +void MainWindow::on_actionQuitApp_triggered() +{ + quitAppAction(false); +} diff --git a/app/mainwindow.h b/app/mainwindow.h index 635e4ef..b32be48 100644 --- a/app/mainwindow.h +++ b/app/mainwindow.h @@ -12,6 +12,7 @@ class QGraphicsOpacityEffect; class QGraphicsView; QT_END_NAMESPACE +class ActionManager; class ToolButton; class GraphicsView; class NavigatorView; @@ -55,6 +56,7 @@ protected slots: void toggleProtectedMode(); void toggleStayOnTop(); bool stayOnTop(); + bool canPaste(); void quitAppAction(bool force = false); void toggleFullscreen(); void toggleMaximize(); @@ -62,7 +64,20 @@ protected slots: protected: QSize sizeHint() const override; +private slots: + void on_actionCopyPixmap_triggered(); + void on_actionCopyFilePath_triggered(); + void on_actionPaste_triggered(); + void on_actionToggleStayOnTop_triggered(); + void on_actionToggleProtectMode_triggered(); + void on_actionSettings_triggered(); + void on_actionHelp_triggered(); + void on_actionProperties_triggered(); + void on_actionQuitApp_triggered(); + private: + ActionManager *m_am; + QPoint m_oldMousePos; QPropertyAnimation *m_fadeOutAnimation; QPropertyAnimation *m_floatUpAnimation; diff --git a/app/settings.cpp b/app/settings.cpp index f7f9922..d28b358 100644 --- a/app/settings.cpp +++ b/app/settings.cpp @@ -28,6 +28,13 @@ DoubleClickBehavior Settings::doubleClickBehavior() return stringToDoubleClickBehavior(result); } +MouseWheelBehavior Settings::mouseWheelBehavior() +{ + QString result = m_qsettings->value("mouse_wheel_behavior", "close").toString().toLower(); + + return stringToMouseWheelBehavior(result); +} + void Settings::setStayOnTop(bool on) { m_qsettings->setValue("stay_on_top", on); @@ -40,6 +47,12 @@ void Settings::setDoubleClickBehavior(DoubleClickBehavior dcb) m_qsettings->sync(); } +void Settings::setMouseWheelBehavior(MouseWheelBehavior mwb) +{ + m_qsettings->setValue("mouse_wheel_behavior", mouseWheelBehaviorToString(mwb)); + m_qsettings->sync(); +} + QString Settings::doubleClickBehaviorToString(DoubleClickBehavior dcb) { static QMap _map { @@ -51,6 +64,16 @@ QString Settings::doubleClickBehaviorToString(DoubleClickBehavior dcb) return _map.value(dcb, "close"); } +QString Settings::mouseWheelBehaviorToString(MouseWheelBehavior mwb) +{ + static QMap _map { + {ActionZoomImage, "zoom"}, + {ActionPrevNextImage, "switch"} + }; + + return _map.value(mwb, "zoom"); +} + DoubleClickBehavior Settings::stringToDoubleClickBehavior(QString str) { static QMap _map { @@ -62,6 +85,16 @@ DoubleClickBehavior Settings::stringToDoubleClickBehavior(QString str) return _map.value(str, ActionCloseWindow); } +MouseWheelBehavior Settings::stringToMouseWheelBehavior(QString str) +{ + static QMap _map { + {"zoom", ActionZoomImage}, + {"switch", ActionPrevNextImage} + }; + + return _map.value(str, ActionZoomImage); +} + Settings::Settings() : QObject(qApp) { diff --git a/app/settings.h b/app/settings.h index 3656e2e..6ba49c9 100644 --- a/app/settings.h +++ b/app/settings.h @@ -8,8 +8,16 @@ enum DoubleClickBehavior { ActionCloseWindow, ActionMaximizeWindow, - ActionStart = ActionDoNothing, - ActionEnd = ActionMaximizeWindow + DCActionStart = ActionDoNothing, + DCActionEnd = ActionMaximizeWindow +}; + +enum MouseWheelBehavior { + ActionZoomImage, + ActionPrevNextImage, + + MWActionStart = ActionZoomImage, + MWActionEnd = ActionPrevNextImage }; class Settings : public QObject @@ -20,12 +28,16 @@ public: bool stayOnTop(); DoubleClickBehavior doubleClickBehavior(); + MouseWheelBehavior mouseWheelBehavior(); void setStayOnTop(bool on); void setDoubleClickBehavior(DoubleClickBehavior dcb); + void setMouseWheelBehavior(MouseWheelBehavior mwb); static QString doubleClickBehaviorToString(DoubleClickBehavior dcb); + static QString mouseWheelBehaviorToString(MouseWheelBehavior mwb); static DoubleClickBehavior stringToDoubleClickBehavior(QString str); + static MouseWheelBehavior stringToMouseWheelBehavior(QString str); private: Settings(); diff --git a/app/settingsdialog.cpp b/app/settingsdialog.cpp index 6a097db..4a6e484 100644 --- a/app/settingsdialog.cpp +++ b/app/settingsdialog.cpp @@ -11,29 +11,44 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QDialog(parent) , m_stayOnTop(new QCheckBox) , m_doubleClickBehavior(new QComboBox) + , m_mouseWheelBehavior(new QComboBox) { this->setWindowTitle(tr("Settings")); QFormLayout * settingsForm = new QFormLayout(this); - static QMap _map { + static QMap _dc_map { { ActionDoNothing, tr("Do nothing") }, { ActionCloseWindow, tr("Close the window") }, { ActionMaximizeWindow, tr("Toggle maximize") } }; - QStringList dropDown; - for (int dcb = ActionStart; dcb <= ActionEnd; dcb++) { - dropDown.append(_map.value(static_cast(dcb))); + static QMap _mw_map { + { ActionZoomImage, tr("Zoom in and out") }, + { ActionPrevNextImage, tr("View next or previous item") } + }; + + QStringList dcbDropDown; + for (int dcb = DCActionStart; dcb <= DCActionEnd; dcb++) { + dcbDropDown.append(_dc_map.value(static_cast(dcb))); + } + + QStringList mwbDropDown; + for (int mwb = MWActionStart; mwb <= MWActionEnd; mwb++) { + mwbDropDown.append(_mw_map.value(static_cast(mwb))); } settingsForm->addRow(tr("Stay on top when start-up"), m_stayOnTop); settingsForm->addRow(tr("Double-click behavior"), m_doubleClickBehavior); + settingsForm->addRow(tr("Mouse wheel behavior"), m_mouseWheelBehavior); m_stayOnTop->setChecked(Settings::instance()->stayOnTop()); - m_doubleClickBehavior->setModel(new QStringListModel(dropDown)); + m_doubleClickBehavior->setModel(new QStringListModel(dcbDropDown)); DoubleClickBehavior dcb = Settings::instance()->doubleClickBehavior(); m_doubleClickBehavior->setCurrentIndex(static_cast(dcb)); + m_mouseWheelBehavior->setModel(new QStringListModel(mwbDropDown)); + MouseWheelBehavior mwb = Settings::instance()->mouseWheelBehavior(); + m_mouseWheelBehavior->setCurrentIndex(static_cast(mwb)); connect(m_stayOnTop, &QCheckBox::stateChanged, this, [ = ](int state){ Settings::instance()->setStayOnTop(state == Qt::Checked); @@ -43,6 +58,10 @@ SettingsDialog::SettingsDialog(QWidget *parent) Settings::instance()->setDoubleClickBehavior(static_cast(index)); }); + connect(m_mouseWheelBehavior, QOverload::of(&QComboBox::currentIndexChanged), this, [ = ](int index){ + Settings::instance()->setMouseWheelBehavior(static_cast(index)); + }); + this->setMinimumSize(300, 61); // not sure why it complain "Unable to set geometry" setWindowFlag(Qt::WindowContextHelpButtonHint, false); } diff --git a/app/settingsdialog.h b/app/settingsdialog.h index 5fb043e..9892f1c 100644 --- a/app/settingsdialog.h +++ b/app/settingsdialog.h @@ -20,6 +20,7 @@ public slots: private: QCheckBox * m_stayOnTop = nullptr; QComboBox * m_doubleClickBehavior = nullptr; + QComboBox * m_mouseWheelBehavior = nullptr; }; #endif // SETTINGSDIALOG_H diff --git a/translations/PineapplePictures.ts b/translations/PineapplePictures.ts index 5442680..201ef53 100644 --- a/translations/PineapplePictures.ts +++ b/translations/PineapplePictures.ts @@ -200,62 +200,62 @@ MainWindow - + File url list is empty - + &Copy - + Copy P&ixmap - + Copy &File Path - - &Paste Image - - - - - &Paste Image File - - - - + Properties - + Stay on top - + Protected mode - + + &Paste + + + + Configure... - + Help + + + Quit + + MetadataDialog @@ -548,35 +548,50 @@ SettingsDialog - + Settings - + Do nothing - + Close the window - + Toggle maximize - + + Zoom in and out + + + + + View next or previous item + + + + Stay on top when start-up - + Double-click behavior + + + Mouse wheel behavior + + main diff --git a/translations/PineapplePictures_de.ts b/translations/PineapplePictures_de.ts index a82ab6d..ccc844b 100644 --- a/translations/PineapplePictures_de.ts +++ b/translations/PineapplePictures_de.ts @@ -204,62 +204,70 @@ MainWindow - + File url list is empty Die Datei-URL-Liste ist leer - + &Copy &Kopieren - + Copy P&ixmap P&ixmap kopieren - + Copy &File Path &Dateipfad kopieren - &Paste Image - Bild &einfügen + Bild &einfügen - &Paste Image File - Bilddatei &einfügen + Bilddatei &einfügen - + Properties Eigenschaften - + Stay on top Oben bleiben - + Protected mode Geschützter Modus - - Configure... - Konfigurieren … + + &Paste + - + + Configure... + Konfigurieren … + + + Help Hilfe + + + Quit + + MetadataDialog @@ -456,7 +464,7 @@ 35mm focal length - 35 mm Brennweite + 35 mm Brennweite @@ -552,35 +560,50 @@ SettingsDialog - + Settings Einstellungen - + Do nothing Nichts tun - + Close the window Fenster schließen - + Toggle maximize Maximieren umschalten - + + Zoom in and out + + + + + View next or previous item + + + + Stay on top when start-up Beim Start oben bleiben - + Double-click behavior Doppelklickverhalten + + + Mouse wheel behavior + + main diff --git a/translations/PineapplePictures_es.ts b/translations/PineapplePictures_es.ts index e18fce0..7bd97e4 100644 --- a/translations/PineapplePictures_es.ts +++ b/translations/PineapplePictures_es.ts @@ -200,62 +200,62 @@ MainWindow - + File url list is empty - + &Copy - + Copy P&ixmap - + Copy &File Path - - &Paste Image - - - - - &Paste Image File - - - - + Properties - + Stay on top - + Protected mode - + + &Paste + + + + Configure... - + Help + + + Quit + + MetadataDialog @@ -548,35 +548,50 @@ SettingsDialog - + Settings - + Do nothing - + Close the window - + Toggle maximize - + + Zoom in and out + + + + + View next or previous item + + + + Stay on top when start-up - + Double-click behavior + + + Mouse wheel behavior + + main diff --git a/translations/PineapplePictures_fr.ts b/translations/PineapplePictures_fr.ts index 23fa972..1e1379e 100644 --- a/translations/PineapplePictures_fr.ts +++ b/translations/PineapplePictures_fr.ts @@ -21,7 +21,7 @@ Context menu option explanation: - Explication des options du menu contextuel : + Explication des options du menu contextuel : @@ -36,7 +36,7 @@ Version: %1 - Version : %1 + Version : %1 @@ -87,7 +87,7 @@ %1 is built on the following free software libraries: Free as in freedom - %1 est basé sur les bibliothèques de logiciels libres suivantes : + %1 est basé sur les bibliothèques de logiciels libres suivantes : @@ -112,7 +112,7 @@ This license grants people a number of freedoms: - Cette licence accorde aux personnes un certain nombre de libertés : + Cette licence accorde aux personnes un certain nombre de libertés : @@ -146,7 +146,7 @@ %1 is built on the following free software libraries: - %1 est basé sur les bibliothèques de logiciels libres suivantes : + %1 est basé sur les bibliothèques de logiciels libres suivantes : @@ -198,68 +198,76 @@ Not supported mimedata: %1 - Mimedata non pris en charge : %1 + Mimedata non pris en charge : %1 MainWindow - + File url list is empty La liste des URL de fichiers est vide - + &Copy &Copier - + Copy P&ixmap Copier P&ixmap - + Copy &File Path Copier le &chemin du fichier - &Paste Image - &Coller l'image + &Coller l'image - &Paste Image File - &Coller le fichier d'image + &Coller le fichier d'image - + Properties Propriétés - + Stay on top Rester en-haut - + Protected mode Mode protégé - + + &Paste + + + + Configure... Configurer… - + Help Aide + + + Quit + + MetadataDialog @@ -456,7 +464,7 @@ 35mm focal length - Distance focale de 35 mm + Distance focale de 35 mm @@ -552,35 +560,50 @@ SettingsDialog - + Settings Paramètres - + Do nothing Ne rien faire - + Close the window Fermer la fenêtre - + Toggle maximize Activer/désactiver l'agrandissement - + + Zoom in and out + + + + + View next or previous item + + + + Stay on top when start-up Rester en-haut lors du démarrage - + Double-click behavior Comportement du double-clic + + + Mouse wheel behavior + + main diff --git a/translations/PineapplePictures_nb_NO.ts b/translations/PineapplePictures_nb_NO.ts index e323575..dd13989 100644 --- a/translations/PineapplePictures_nb_NO.ts +++ b/translations/PineapplePictures_nb_NO.ts @@ -204,62 +204,70 @@ MainWindow - + File url list is empty Listen over filnettadresser er ugyldig - + &Copy &Kopier - + Copy P&ixmap - + Copy &File Path Kopier %filsti - &Paste Image - &Lim inn bilde + &Lim inn bilde - &Paste Image File - &Lim inn bildefil + &Lim inn bildefil - + Properties Egenskaper - + Stay on top Behold øverst - + Protected mode Beskyttet modus - + + &Paste + + + + Configure... Sett opp … - + Help Hjelp + + + Quit + + MetadataDialog @@ -552,35 +560,50 @@ SettingsDialog - + Settings Innstillinger - + Do nothing Ikke gjør noe - + Close the window Lukk vinduet - + Toggle maximize Veksle maksimering - + + Zoom in and out + + + + + View next or previous item + + + + Stay on top when start-up Behold i forgrunnen ved oppstart - + Double-click behavior Dobbeltklikksoppførsel + + + Mouse wheel behavior + + main diff --git a/translations/PineapplePictures_ru.ts b/translations/PineapplePictures_ru.ts index 85b10e0..0a88622 100644 --- a/translations/PineapplePictures_ru.ts +++ b/translations/PineapplePictures_ru.ts @@ -200,62 +200,70 @@ MainWindow - + File url list is empty Список URL-адресов файлов пуст - + &Copy &Копировать - + Copy P&ixmap Копировать P&ixmap - + Copy &File Path Копировать &путь к файлу - &Paste Image - &Вставить изображение + &Вставить изображение - &Paste Image File - &Вставить файл изображения + &Вставить файл изображения - + Properties Свойства - + Stay on top Поверх всех окон - + Protected mode Защищённый режим - + + &Paste + + + + Configure... Настроить... - + Help Помощь + + + Quit + + MetadataDialog @@ -548,35 +556,50 @@ SettingsDialog - + Settings Настройки - + Do nothing Ничего не делать - + Close the window Закрыть окно - + Toggle maximize Развернуть окно - + + Zoom in and out + + + + + View next or previous item + + + + Stay on top when start-up Поверх всех окон при запуске - + Double-click behavior Поведение при двойном щелчке + + + Mouse wheel behavior + + main diff --git a/translations/PineapplePictures_zh_CN.ts b/translations/PineapplePictures_zh_CN.ts index 0d6f4d7..f91cc52 100644 --- a/translations/PineapplePictures_zh_CN.ts +++ b/translations/PineapplePictures_zh_CN.ts @@ -204,62 +204,70 @@ MainWindow - + File url list is empty 文件 URL 列表为空 - + &Copy 复制(&C) - + Copy P&ixmap 复制位图(&I) - + Copy &File Path 复制文件路径(&F) - &Paste Image - 粘贴图像(&P) + 粘贴图像(&P) - &Paste Image File - 粘贴图像文件(&P) + 粘贴图像文件(&P) - + Properties 属性 - + Stay on top 总在最前 - + Protected mode 保护模式 - + + &Paste + 粘贴(&P) + + + Configure... 设置... - + Help 帮助 + + + Quit + 退出 + MetadataDialog @@ -552,35 +560,50 @@ SettingsDialog - + Settings 设定 - + Do nothing 什么也不做 - + Close the window 关闭窗口 - + Toggle maximize 最大化窗口 - + + Zoom in and out + 放大和缩小 + + + + View next or previous item + 查看下一项或上一项 + + + Stay on top when start-up 启动时保持窗口总在最前 - + Double-click behavior 双击时的行为 + + + Mouse wheel behavior + 鼠标滚轮行为 + main