Compare commits
59
Commits
1.3.0
...
a01d640c27
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a01d640c27 | ||
|
|
16800df138 | ||
|
|
7e8fd4ea21 | ||
|
|
04fa491cd8 | ||
|
|
dbf8c09368 | ||
|
|
369a17ed7d | ||
|
|
b19a4f8723 | ||
|
|
a8e5464e9f | ||
|
|
46f46480cb | ||
|
|
c06f900ac5 | ||
|
|
31303a20c7 | ||
|
|
319fd64fc6 | ||
|
|
cdd0b764a7 | ||
|
|
2a69482adb | ||
|
|
fc3ef1cd7f | ||
|
|
1de1517a81 | ||
|
|
04a4ab9bff | ||
|
|
011c1e858f | ||
|
|
4fe09757b3 | ||
|
|
82f1f10cca | ||
|
|
60eebea741 | ||
|
|
9b151e2fea | ||
|
|
9db9c3e9f7 | ||
|
|
9a18a41b8f | ||
|
|
c93ed94210 | ||
|
|
f4d272e014 | ||
|
|
d536e8c611 | ||
|
|
c8dfccb460 | ||
|
|
6fde9474ae | ||
|
|
c19fcaa560 | ||
|
|
602e2cccf8 | ||
|
|
3c1a3c54a7 | ||
|
|
032752faf9 | ||
|
|
457647c59f | ||
|
|
821e0f9fd6 | ||
|
|
26f51e418d | ||
|
|
cd2eac44f1 | ||
|
|
f0bb945c7d | ||
|
|
870e472f53 | ||
|
|
76677381de | ||
|
|
d2bd521ad0 | ||
|
|
265e894b3f | ||
|
|
6339a93c6c | ||
|
|
6da53ced81 | ||
|
|
8f0d4da7ad | ||
|
|
9c8ffb6c1b | ||
|
|
4c5c5e6fc6 | ||
|
|
b8cb10bb33 | ||
|
|
6e2f40633e | ||
|
|
a0ba7c1d17 | ||
|
|
b6d759d7c6 | ||
|
|
437c2f5618 | ||
|
|
7fd4924e64 | ||
|
|
c77808f3d8 | ||
|
|
86075a1ad0 | ||
|
|
a8e40a725c | ||
|
|
8edb6b015e | ||
|
|
5b2255e903 | ||
|
|
4948ea7445 |
@@ -1,35 +0,0 @@
|
||||
name: deepin 25 CI
|
||||
|
||||
on: [push, pull_request, workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
build-deepin-25-deb:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: linuxdeepin/deepin:crimson
|
||||
options: --user root
|
||||
|
||||
steps:
|
||||
- name: Update package lists and install basic tools
|
||||
run: |
|
||||
apt update
|
||||
apt install -y git ca-certificates curl file
|
||||
- uses: actions/checkout@v4
|
||||
- name: Get build dept.
|
||||
run: |
|
||||
apt install -y cmake qt6-base-dev qt6-svg-dev qt6-tools-dev libexiv2-dev
|
||||
- name: Build it
|
||||
run: |
|
||||
git config --global --add safe.directory '*' # to avoid "fatal: detected dubious ownership in repository at xxx"
|
||||
cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr .
|
||||
cmake --build build -j
|
||||
cd build
|
||||
cpack -G DEB
|
||||
- name: Try install it
|
||||
run: |
|
||||
cd build
|
||||
apt install -y ./*.deb
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: deepin-25-deb-package
|
||||
path: build/*.deb
|
||||
@@ -8,11 +8,11 @@ jobs:
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: '6.10.1'
|
||||
version: '6.10.3'
|
||||
modules: 'qtimageformats'
|
||||
cache: true
|
||||
- name: Install Conan and Dependencies
|
||||
@@ -33,7 +33,7 @@ jobs:
|
||||
run: |
|
||||
macdeployqt ./ppic.app -dmg
|
||||
ls
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: "macos-bundle"
|
||||
path: "*.dmg"
|
||||
|
||||
@@ -6,7 +6,7 @@ jobs:
|
||||
ubuntu-24-04-build:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Get build dept.
|
||||
run: |
|
||||
sudo apt update
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
run: |
|
||||
cd build
|
||||
sudo apt install ./*.deb
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ubuntu-24.04-deb-package
|
||||
path: build/*.deb
|
||||
|
||||
@@ -8,7 +8,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- qt_ver: '6.10.1'
|
||||
- qt_ver: '6.10.3'
|
||||
vs: '2022'
|
||||
aqt_arch: 'win64_msvc2022_64'
|
||||
msvc_arch: 'x64'
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
runs-on: windows-2022
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
@@ -35,7 +35,7 @@ jobs:
|
||||
nmake
|
||||
nmake clean
|
||||
windeployqt --verbose=2 --no-quick-import --no-translations --no-opengl-sw --no-system-d3d-compiler --no-system-dxc-compiler --skip-plugin-types tls,networkinformation release\ppic.exe
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: "windows-msvc${{ matrix.vs }}-qt${{ matrix.qt_ver }}-qmake-package"
|
||||
path: release/*
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- qt_ver: '6.10.1'
|
||||
- qt_ver: '6.10.3'
|
||||
vs: '2022'
|
||||
aqt_arch: 'win64_msvc2022_64'
|
||||
msvc_arch: 'x64'
|
||||
@@ -53,7 +53,7 @@ jobs:
|
||||
runs-on: windows-2022
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v6
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
@@ -79,9 +79,9 @@ jobs:
|
||||
ren .\exiv2-0.28.7-2022msvc-AMD64 dependencies_bin
|
||||
echo ::endgroup::
|
||||
echo ::group::===== zlib =====
|
||||
curl -fsSL -o zlib_src.zip https://zlib.net/zlib131.zip
|
||||
curl -fsSL -o zlib_src.zip https://github.com/madler/zlib/releases/download/v1.3.2/zlib132.zip
|
||||
7z x zlib_src.zip -y -o"dependencies_src"
|
||||
ren .\dependencies_src\zlib-1.3.1 zlib || goto :error
|
||||
ren .\dependencies_src\zlib-1.3.2 zlib || goto :error
|
||||
cmake ./dependencies_src/zlib -Bbuild_dependencies/zlib -DCMAKE_INSTALL_PREFIX="dependencies_bin" || goto :error
|
||||
cmake --build build_dependencies/zlib --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
@@ -125,17 +125,13 @@ jobs:
|
||||
cmake --build build --config Release
|
||||
cmake --install build --config Release --prefix "%PWD%\build"
|
||||
echo ::endgroup::
|
||||
echo ::group::===== passoc stuff =====
|
||||
curl -fsSL -o passoc-standalone.zip https://github.com/BLumia/pineapple-assoc-manager/releases/latest/download/pineapple-assoc-manager-qt${{ matrix.qt_ver }}-standalone.zip
|
||||
7z x passoc-standalone.zip passoc.exe -y -o"build/bin"
|
||||
echo ::endgroup::
|
||||
:: ------ pkg ------
|
||||
windeployqt --verbose=2 --no-compiler-runtime --no-quick-import --no-translations --no-network --no-opengl-sw --no-system-d3d-compiler --no-system-dxc-compiler --skip-plugin-types tls,networkinformation build\bin\ppic.exe
|
||||
robocopy ./dependencies_bin/bin build/bin *.dll
|
||||
if ErrorLevel 8 (exit /B 1)
|
||||
copy LICENSE build\bin
|
||||
exit /B 0
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: "windows-msvc${{ matrix.vs }}-qt${{ matrix.qt_ver }}-cmake-package"
|
||||
path: build/bin/*
|
||||
|
||||
+10
-16
@@ -4,7 +4,7 @@
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(pineapple-pictures VERSION 1.3.0) # don't forget to update NEWS file and AppStream metadata.
|
||||
project(pineapple-pictures VERSION 1.5.0) # don't forget to update NEWS file and AppStream metadata.
|
||||
|
||||
include(GNUInstallDirs)
|
||||
include(FeatureSummary)
|
||||
@@ -16,10 +16,11 @@ set (CMAKE_CXX_STANDARD 17)
|
||||
set (CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set (CMAKE_AUTOMOC ON)
|
||||
set (CMAKE_AUTORCC ON)
|
||||
set (CMAKE_AUTOUIC ON)
|
||||
|
||||
find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core)
|
||||
|
||||
set (QT_MINIMUM_VERSION "6.4")
|
||||
set (QT_MINIMUM_VERSION "6.5")
|
||||
|
||||
find_package(Qt${QT_VERSION_MAJOR} ${QT_MINIMUM_VERSION} REQUIRED
|
||||
COMPONENTS Widgets Svg SvgWidgets LinguistTools
|
||||
@@ -38,15 +39,12 @@ endif ()
|
||||
|
||||
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
|
||||
app/navigatorview.cpp
|
||||
app/opacityhelper.cpp
|
||||
app/toolbutton.cpp
|
||||
app/settings.cpp
|
||||
app/settingsdialog.cpp
|
||||
app/aboutdialog.cpp
|
||||
@@ -54,20 +52,16 @@ set (PPIC_CPP_FILES
|
||||
app/metadatadialog.cpp
|
||||
app/exiv2wrapper.cpp
|
||||
app/playlistmanager.cpp
|
||||
app/shortcutedit.cpp
|
||||
app/fileopeneventhandler.cpp
|
||||
)
|
||||
|
||||
set (PPIC_HEADER_FILES
|
||||
app/framelesswindow.h
|
||||
app/mainwindow.h
|
||||
app/actionmanager.h
|
||||
app/graphicsview.h
|
||||
app/graphicsscene.h
|
||||
app/bottombuttongroup.h
|
||||
app/navigatorview.h
|
||||
app/opacityhelper.h
|
||||
app/toolbutton.h
|
||||
app/settings.h
|
||||
app/settingsdialog.h
|
||||
app/aboutdialog.h
|
||||
@@ -75,10 +69,15 @@ set (PPIC_HEADER_FILES
|
||||
app/metadatadialog.h
|
||||
app/exiv2wrapper.h
|
||||
app/playlistmanager.h
|
||||
app/shortcutedit.h
|
||||
app/fileopeneventhandler.h
|
||||
)
|
||||
|
||||
set (PPIC_UI_FILES
|
||||
app/settingsdialog.ui
|
||||
app/aboutdialog.ui
|
||||
app/metadatadialog.ui
|
||||
)
|
||||
|
||||
set (PPIC_QRC_FILES
|
||||
assets/resources.qrc
|
||||
)
|
||||
@@ -101,6 +100,7 @@ endif ()
|
||||
add_executable (${EXE_NAME}
|
||||
${PPIC_HEADER_FILES}
|
||||
${PPIC_CPP_FILES}
|
||||
${PPIC_UI_FILES}
|
||||
${PPIC_QRC_FILES}
|
||||
${PPIC_RC_FILES}
|
||||
)
|
||||
@@ -271,12 +271,6 @@ if (DEFINED QM_FILE_INSTALL_DIR)
|
||||
endif()
|
||||
|
||||
if (WIN32)
|
||||
install(
|
||||
FILES dist/passoc/ppic.pacfg
|
||||
DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||
RENAME default-assoc.pacfg
|
||||
)
|
||||
|
||||
install(
|
||||
FILES
|
||||
dist/passoc/generic.ico
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 BLumia
|
||||
Copyright (c) 2026 BLumia
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -1,3 +1,48 @@
|
||||
Version 1.5.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2026-07-04
|
||||
|
||||
Features:
|
||||
* Introduced an optional titlebar that display file name and allows drag and double-click to move and toggle maximize state
|
||||
* Windows: Now the application will use the system's built-in animation for open window animation
|
||||
|
||||
Bugfixes:
|
||||
* Show empty url list should also reset window title to blank
|
||||
|
||||
Miscellaneous:
|
||||
* Update translations
|
||||
* Add vcs-browser link to AppStream metadata
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels (vistaus), VenusGirl (VenusGirl)
|
||||
|
||||
Version 1.4.1
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2026-04-05
|
||||
|
||||
Miscellaneous:
|
||||
* Update translations
|
||||
* Update Qt version to 6.10.3 for Windows and macOS pre-built binaries
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels (vistaus), Loc Huynh (hthienloc)
|
||||
|
||||
Version 1.4.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2026-02-11
|
||||
|
||||
Features:
|
||||
* Action to save image as new file with different format
|
||||
* Add Vietnamese and Slovenian translation
|
||||
|
||||
Miscellaneous:
|
||||
* Update copyright year to 2026
|
||||
* Update translations
|
||||
* Update Qt version to 6.10.2 for Windows and macOS pre-built binaries
|
||||
|
||||
Contributors:
|
||||
Loc Huynh, Sabri Ünal, VenusGirl, Andrej Poženel, Andrey
|
||||
|
||||
Version 1.3.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-12-20
|
||||
|
||||
@@ -1,4 +1,17 @@
|
||||
Yet another image viewer.
|
||||
# Sarasas Chip Workshop Picture
|
||||
|
||||
Yet another legacy Windows Photo Viewer with cross-platform support.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> SarasaCW Picture are still in refactoring. Please do not use it until this message removes.
|
||||
|
||||
## Summary
|
||||
|
||||
Sarasas Chip Workshop Picture (abbr. SarasaCW Picture) is a lightweight image viewer that has cross-platform support and similar user interface about legacy Windows Photo Viewer. It allows you view JPEG, PNG, GIF, SVG, PSD, KRA, XCF, TGA, HDR, AVIF and some other frequently used image formats files quickly and easily without changing your long-term Windows usage experience.
|
||||
|
||||
SarasaCW Picture is the **hard fork** of [Pineapple Pictures](https://github.com/BLumia/pineapple-pictures) since Pineapple Pictures 1.4.1 version.
|
||||
|
||||
<!--
|
||||
|
||||
|CI|Build Status|
|
||||
|---|---|
|
||||
@@ -8,10 +21,6 @@ Yet another image viewer.
|
||||
|
||||

|
||||
|
||||
## Summary
|
||||
|
||||
Pineapple Pictures is a lightweight image viewer that allows you view JPEG, PNG, GIF, SVG, PSD, KRA, XCF, TGA, HDR, AVIF and some other frequently used image formats files quickly and easily, and also provide a Stay-on-Top window setting that allows you pin the window so you can use it to pin a reference image at the top and then you can work with other software.
|
||||
|
||||
## Get it!
|
||||
|
||||
### Maintained by the original author
|
||||
@@ -71,3 +80,5 @@ It's possible to build it under Windows, Linux, macOS, and maybe other desktop p
|
||||
## License
|
||||
|
||||
Pineapple Pictures as a whole is licensed under MIT license. Individual files may have a different, but compatible license.
|
||||
|
||||
-->
|
||||
|
||||
+17
-4
@@ -1,3 +1,18 @@
|
||||
# Sarasas Chip Workshop 照片查看器
|
||||
|
||||
简单轻量的、具有跨平台支持的、经典样式的 Windows 照片查看器。
|
||||
|
||||
> [!IMPORTANT]
|
||||
> SarasaCW 照片查看器还在重构中。在这条信息被移除之前请不要使用它。
|
||||
|
||||
## 简介
|
||||
|
||||
Sarasas Chip Workshop 照片查看器(简称 SarasaCW 照片查看器)是一个轻量级的图片查看器。支持跨平台。界面风格类似于经典的 Windows 照片查看器。它可以让你快速轻松地浏览 JPEG、PNG、GIF、SVG、PSD、KRA、XCF、TGA、HDR、AVIF 以及其他一些常用的图片格式,且无需改变你长期的 Windows 使用习惯。
|
||||
|
||||
SarasaCW 照片查看器是[菠萝看图](https://github.com/BLumia/pineapple-pictures)的**硬分叉**,该分叉自菠萝看图 1.4.1 版本开始。
|
||||
|
||||
<!--
|
||||
|
||||
简单轻量的跨平台看图工具。
|
||||
|
||||
|CI|构建状态|
|
||||
@@ -8,10 +23,6 @@
|
||||
|
||||

|
||||
|
||||
## 简介
|
||||
|
||||
菠萝看图是一个轻量图像查看器,允许你简单快捷的查看 JPEG, PNG, GIF, SVG, PSD, KRA, XCF, TGA, HDR, AVIF 等常用格式的图像文件,并提供了置顶窗口的选项以便你在使用其它软件时也可以将参考图片固定在顶端。
|
||||
|
||||
## 立即获取!
|
||||
|
||||
### 由原作者维护
|
||||
@@ -72,3 +83,5 @@ $ cmake --build . # 如果你使用 Makefile 作为 CMake 生成器,也可以
|
||||
## 许可协议
|
||||
|
||||
菠萝看图整体使用 MIT 协议进行发布。项目所随的部分源文件可能具备不同但与之兼容的许可协议。
|
||||
|
||||
-->
|
||||
|
||||
+62
-144
@@ -3,176 +3,94 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "aboutdialog.h"
|
||||
#include "ui_aboutdialog.h"
|
||||
|
||||
#include <QAbstractButton>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QTextBrowser>
|
||||
#include <QTabWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QApplication>
|
||||
#include <QLabel>
|
||||
#include <QPushButton>
|
||||
#include <QFile>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
static QString loadEmbeddedHtml(QString&& path) {
|
||||
QFile htmlFile(path);
|
||||
bool canOpenFile = htmlFile.open(QIODevice::ReadOnly);
|
||||
QByteArray htmlRawContent = canOpenFile ? htmlFile.readAll() : QByteArrayLiteral("");
|
||||
return QString::fromUtf8(htmlRawContent);
|
||||
}
|
||||
|
||||
AboutDialog::AboutDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_tabWidget(new QTabWidget)
|
||||
, m_buttonBox(new QDialogButtonBox)
|
||||
, m_helpTextEdit(new QTextBrowser)
|
||||
, m_aboutTextEdit(new QTextBrowser)
|
||||
, m_specialThanksTextEdit(new QTextBrowser)
|
||||
, m_licenseTextEdit(new QTextBrowser)
|
||||
, m_3rdPartyLibsTextEdit(new QTextBrowser)
|
||||
: QDialog(parent), ui(new QT_PREPEND_NAMESPACE(Ui::AboutDialog))
|
||||
{
|
||||
this->setWindowTitle(tr("About"));
|
||||
ui->setupUi(this);
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
|
||||
const QStringList helpStr {
|
||||
u"<p>%1</p>"_s.arg(tr("Launch application with image file path as argument to load the file.")),
|
||||
u"<p>%1</p>"_s.arg(tr("Drag and drop image file onto the window is also supported.")),
|
||||
u"<p>%1</p>"_s.arg(tr("None of the operations in this application will alter the pictures on disk.")),
|
||||
u"<p>%1</p>"_s.arg(tr("Context menu option explanation:")),
|
||||
u"<ul>"_s,
|
||||
// blumia: Chain two arg() here since it seems lupdate will remove one of them if we use
|
||||
// the old `arg(QCoreApp::translate(), tr())` way, but it's worth to mention
|
||||
// `arg(QCoreApp::translate(), this->tr())` works, but lupdate will complain about the usage.
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Stay on top"))
|
||||
.arg(tr("Make window stay on top of all other windows.")),
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Protected mode"))
|
||||
.arg(tr("Avoid close window accidentally. (eg. by double clicking the window)")),
|
||||
u"<li><b>%1</b>:<br/>%2</li>"_s
|
||||
.arg(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"))
|
||||
.arg(tr("Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.")),
|
||||
u"</ul>"_s
|
||||
};
|
||||
// blumia: Chain two arg() here since it seems lupdate will remove one of them if we use
|
||||
// the old `arg(QCoreApp::translate(), tr())` way, but it's worth to mention
|
||||
// `arg(QCoreApp::translate(), this->tr())` works, but lupdate will complain about the usage.
|
||||
const QString HELP_HTML = loadEmbeddedHtml(u":/plain/help.html"_s)
|
||||
.arg(tr("General Help"))
|
||||
.arg(tr("Launch application with image file path as argument to load the file."))
|
||||
.arg(tr("Passing in a single image file will load all the images in that directory and start viewing from that image."))
|
||||
.arg(tr("Passing in multiple image files lets you view them one by one."))
|
||||
.arg(tr("Drag and drop image file onto the window is also supported."))
|
||||
.arg(tr("None of the operations in this application will alter the pictures on disk."))
|
||||
.arg(tr("Context Menu Help"))
|
||||
.arg(tr("Keep transformation", "The same meaning of MainWindow's Keep transformation."))
|
||||
.arg(tr("Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images."))
|
||||
.arg(tr("Checkerboard", "The same meaning of MainWindow's Checkerboard."))
|
||||
.arg(tr("Checkerboard light and dark theme can be adjusted in the configuration window, or easily switch it by holding Shift and clicking the button."));
|
||||
|
||||
const QStringList aboutStr {
|
||||
u"<center><img width='128' height='128' src=':/icons/app-icon.svg'/><br/>"_s,
|
||||
qApp->applicationDisplayName(),
|
||||
(u"<br/>"_s + tr("Version: %1").arg(
|
||||
const QString APP_NAME_ARG = qApp->applicationDisplayName();
|
||||
const QString APP_VERSION_ARG =
|
||||
#ifdef GIT_DESCRIBE_VERSION_STRING
|
||||
GIT_DESCRIBE_VERSION_STRING
|
||||
GIT_DESCRIBE_VERSION_STRING;
|
||||
#else
|
||||
qApp->applicationVersion()
|
||||
qApp->applicationVersion();
|
||||
#endif // GIT_DESCRIBE_VERSION_STRING
|
||||
)),
|
||||
u"<hr/>"_s,
|
||||
tr("Copyright (c) %1 %2", "%1 is year, %2 is the name of copyright holder(s)")
|
||||
.arg(u"2025"_s, u"<a href='https://github.com/BLumia'>@BLumia</a>"_s),
|
||||
u"<br/>"_s,
|
||||
tr("Logo designed by %1").arg(u"<a href='https://github.com/Lovelyblack'>@Lovelyblack</a>"_s),
|
||||
u"<hr/>"_s,
|
||||
tr("Built with Qt %1 (%2)").arg(QT_VERSION_STR, QSysInfo::buildCpuArchitecture()),
|
||||
QStringLiteral("<br/><a href='%1'>%2</a>").arg("https://github.com/BLumia/pineapple-pictures", tr("Source code")),
|
||||
u"</center>"_s
|
||||
};
|
||||
const QString QT_VERSION_ARG = QT_VERSION_STR;
|
||||
const QString QT_ARCH_ARG = QSysInfo::buildCpuArchitecture();
|
||||
const QString ABOUT_HTML = loadEmbeddedHtml(u":/plain/about.html"_s)
|
||||
.arg(APP_NAME_ARG)
|
||||
.arg(tr("Version: %1").arg(APP_VERSION_ARG))
|
||||
.arg(tr("Upstream author"))
|
||||
.arg(tr("Hard fork author"))
|
||||
.arg(tr("Logo designer"))
|
||||
.arg(tr("Built with Qt %1 (%2)").arg(QT_VERSION_ARG).arg(QT_ARCH_ARG))
|
||||
.arg(tr("Source code"));
|
||||
|
||||
QFile translaterHtml(u":/plain/translators.html"_s);
|
||||
bool canOpenFile = translaterHtml.open(QIODevice::ReadOnly);
|
||||
const QByteArray & translatorList = canOpenFile ? translaterHtml.readAll() : QByteArrayLiteral("");
|
||||
const QString SPECIAL_THANKS_HTML = loadEmbeddedHtml(u":/plain/special-thanks.html"_s)
|
||||
.arg(tr("Contributors"))
|
||||
.arg(tr("List of contributors on GitHub"))
|
||||
.arg(tr("Thanks to all people who contributed to this project."))
|
||||
.arg(tr("Translators"))
|
||||
.arg(tr("I would like to thank the following people who volunteered to translate this application."));
|
||||
|
||||
const QStringList specialThanksStr {
|
||||
u"<h1 align='center'>%1</h1><a href='%2'>%3</a><p>%4</p>"_s.arg(
|
||||
tr("Contributors"),
|
||||
u"https://github.com/BLumia/pineapple-pictures/graphs/contributors"_s,
|
||||
tr("List of contributors on GitHub"),
|
||||
tr("Thanks to all people who contributed to this project.")
|
||||
),
|
||||
const QString LICENSE_HTML = loadEmbeddedHtml(u":/plain/license.html"_s)
|
||||
.arg(tr("License"))
|
||||
.arg(tr("This application is released under the MIT License."))
|
||||
.arg(tr("License Verbatim Copy"));
|
||||
|
||||
u"<h1 align='center'>%1</h1><p>%2</p>%3"_s.arg(
|
||||
tr("Translators"),
|
||||
tr("I would like to thank the following people who volunteered to translate this application."),
|
||||
translatorList
|
||||
)
|
||||
};
|
||||
const QString THIRD_PARTY_LIBS_HTML = loadEmbeddedHtml(u":/plain/third-party-libs.html"_s)
|
||||
.arg(tr("Third-party Libraries"))
|
||||
.arg(tr("This application is built on the following free software libraries.", "Free as in freedom"))
|
||||
.arg(tr("Some of them are optional and might not be included with this distribution depending on the build environment."));
|
||||
|
||||
const QStringList licenseStr {
|
||||
u"<h1 align='center'><b>%1</b></h1>"_s.arg(tr("Your Rights")),
|
||||
u"<p>%1</p><p>%2</p><ul><li>%3</li><li>%4</li><li>%5</li><li>%6</li></ul>"_s.arg(
|
||||
tr("%1 is released under the MIT License."), // %1
|
||||
tr("This license grants people a number of freedoms:"), // %2
|
||||
tr("You are free to use %1, for any purpose"), // %3
|
||||
tr("You are free to distribute %1"), // %4
|
||||
tr("You can study how %1 works and change it"), // %5
|
||||
tr("You can distribute changed versions of %1") // %6
|
||||
).arg(u"<i>%1</i>"_s),
|
||||
u"<p>%1</p>"_s.arg(tr("The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.")),
|
||||
u"<hr/><pre>%2</pre>"_s
|
||||
};
|
||||
ui->m_helpTextEdit->setHtml(HELP_HTML);
|
||||
ui->m_aboutTextEdit->setHtml(ABOUT_HTML);
|
||||
ui->m_specialThanksTextEdit->setHtml(SPECIAL_THANKS_HTML);
|
||||
ui->m_licenseTextEdit->setHtml(LICENSE_HTML);
|
||||
ui->m_3rdPartyLibsTextEdit->setHtml(THIRD_PARTY_LIBS_HTML);
|
||||
|
||||
const QString mitLicense(QStringLiteral(R"(Expat/MIT License
|
||||
|
||||
Copyright © 2025 BLumia
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
)"));
|
||||
|
||||
const QStringList thirdPartyLibsStr {
|
||||
u"<h1 align='center'><b>%1</b></h1>"_s.arg(tr("Third-party Libraries used by %1")),
|
||||
tr("%1 is built on the following free software libraries:", "Free as in freedom"),
|
||||
u"<ul>"_s,
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
u"<li><a href='%1'>%2</a>: %3</li>"_s.arg("https://www.exiv2.org/", "Exiv2", "GPLv2"),
|
||||
#endif // EXIV2_VERSION
|
||||
u"<li><a href='%1'>%2</a>: %3</li>"_s.arg("https://www.qt.io/", "Qt", "GPLv2 + GPLv3 + LGPLv2.1 + LGPLv3"),
|
||||
u"</ul>"_s
|
||||
};
|
||||
|
||||
m_helpTextEdit->setText(helpStr.join('\n'));
|
||||
|
||||
m_aboutTextEdit->setText(aboutStr.join('\n'));
|
||||
m_aboutTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_specialThanksTextEdit->setText(specialThanksStr.join('\n'));
|
||||
m_specialThanksTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_licenseTextEdit->setText(licenseStr.join('\n').arg(qApp->applicationDisplayName(), mitLicense));
|
||||
|
||||
m_3rdPartyLibsTextEdit->setText(thirdPartyLibsStr.join('\n').arg(u"<i>%1</i>"_s).arg(qApp->applicationDisplayName()));
|
||||
m_3rdPartyLibsTextEdit->setOpenExternalLinks(true);
|
||||
|
||||
m_tabWidget->addTab(m_helpTextEdit, tr("&Help"));
|
||||
m_tabWidget->addTab(m_aboutTextEdit, tr("&About"));
|
||||
m_tabWidget->addTab(m_specialThanksTextEdit, tr("&Special Thanks"));
|
||||
m_tabWidget->addTab(m_licenseTextEdit, tr("&License"));
|
||||
m_tabWidget->addTab(m_3rdPartyLibsTextEdit, tr("&Third-party Libraries"));
|
||||
|
||||
m_buttonBox->setStandardButtons(QDialogButtonBox::Close);
|
||||
connect(m_buttonBox, QOverload<QAbstractButton *>::of(&QDialogButtonBox::clicked), this, [this](){
|
||||
connect(ui->m_buttonBox, QOverload<QAbstractButton *>::of(&QDialogButtonBox::clicked), this, [this](QAbstractButton * btn){
|
||||
Q_UNUSED(btn)
|
||||
this->close();
|
||||
});
|
||||
|
||||
setLayout(new QVBoxLayout);
|
||||
|
||||
layout()->addWidget(m_tabWidget);
|
||||
layout()->addWidget(m_buttonBox);
|
||||
|
||||
setMinimumSize(361, 161); // not sure why it complain "Unable to set geometry"
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
}
|
||||
|
||||
AboutDialog::~AboutDialog()
|
||||
{
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
QSize AboutDialog::sizeHint() const
|
||||
|
||||
+4
-11
@@ -8,9 +8,9 @@
|
||||
#include <QDialog>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QTextBrowser;
|
||||
class QTabWidget;
|
||||
class QDialogButtonBox;
|
||||
namespace Ui {
|
||||
class AboutDialog;
|
||||
}
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class AboutDialog : public QDialog
|
||||
@@ -23,14 +23,7 @@ public:
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private:
|
||||
QTabWidget * m_tabWidget = nullptr;
|
||||
QDialogButtonBox * m_buttonBox = nullptr;
|
||||
|
||||
QTextBrowser * m_helpTextEdit = nullptr;
|
||||
QTextBrowser * m_aboutTextEdit = nullptr;
|
||||
QTextBrowser * m_specialThanksTextEdit = nullptr;
|
||||
QTextBrowser * m_licenseTextEdit = nullptr;
|
||||
QTextBrowser * m_3rdPartyLibsTextEdit = nullptr;
|
||||
QT_PREPEND_NAMESPACE(Ui::AboutDialog) *ui;
|
||||
};
|
||||
|
||||
#endif // ABOUTDIALOG_H
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AboutDialog</class>
|
||||
<widget class="QDialog" name="AboutDialog">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::NonModal</enum>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>About</string>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>361</width>
|
||||
<height>161</height>
|
||||
</size>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="m_tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="helpTab">
|
||||
<attribute name="title">
|
||||
<string>&Help</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="helpTabLayout">
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="m_helpTextEdit">
|
||||
<property name="openExternalLinks">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="aboutTab">
|
||||
<attribute name="title">
|
||||
<string>&About</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="aboutTabLayout">
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="m_aboutTextEdit">
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="specialThanksTab">
|
||||
<attribute name="title">
|
||||
<string>&Special Thanks</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="specialThanksTabLayout">
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="m_specialThanksTextEdit">
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="licenseTab">
|
||||
<attribute name="title">
|
||||
<string>&License</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="licenseTabLayout">
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="m_licenseTextEdit">
|
||||
<property name="openExternalLinks">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="thirdPartyLibsTab">
|
||||
<attribute name="title">
|
||||
<string>&Third-party Libraries</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="thirdPartyLibsTabLayout">
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="m_3rdPartyLibsTextEdit">
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="m_buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
+139
-80
@@ -4,19 +4,17 @@
|
||||
|
||||
#include "actionmanager.h"
|
||||
|
||||
#include "settings.h"
|
||||
#include "mainwindow.h"
|
||||
#include "playlistmanager.h"
|
||||
#include "graphicsview.h"
|
||||
#include "graphicsscene.h"
|
||||
|
||||
#include <QGuiApplication>
|
||||
#include <QSvgRenderer>
|
||||
#include <QPainter>
|
||||
|
||||
#define ICON_NAME(name)\
|
||||
QStringLiteral(":/icons/" #name ".svg")
|
||||
|
||||
#define ACTION_NAME(s) QStringLiteral(STRIFY(s))
|
||||
#define STRIFY(s) #s
|
||||
|
||||
QIcon ActionManager::loadHidpiIcon(const QString &resp, QSize sz)
|
||||
static QIcon loadHidpiIcon(const QString &resp, QSize sz = QSize(32, 32))
|
||||
{
|
||||
QSvgRenderer r(resp);
|
||||
QPixmap pm = QPixmap(sz * qApp->devicePixelRatio());
|
||||
@@ -29,127 +27,188 @@ QIcon ActionManager::loadHidpiIcon(const QString &resp, QSize sz)
|
||||
|
||||
void ActionManager::setupAction(MainWindow *mainWindow)
|
||||
{
|
||||
// region: Action and Its Icon Creation
|
||||
|
||||
// Declare some convenient macros and lambdas.
|
||||
|
||||
#define ICON_NAME(name)\
|
||||
QStringLiteral(":/icons/" #name ".svg")
|
||||
|
||||
#define ACTION_NAME(s) QStringLiteral(STRIFY(s))
|
||||
#define STRIFY(s) #s
|
||||
|
||||
auto create_action = [] (QWidget *w, QAction **a, QString i, QString an, bool iconFromTheme = false) {
|
||||
*a = new QAction(w);
|
||||
if (!i.isNull())
|
||||
(*a)->setIcon(iconFromTheme ? QIcon::fromTheme(i) : ActionManager::loadHidpiIcon(i));
|
||||
(*a)->setIcon(iconFromTheme ? QIcon::fromTheme(i) : loadHidpiIcon(i));
|
||||
(*a)->setObjectName(an);
|
||||
w->addAction(*a);
|
||||
};
|
||||
#define CREATE_NEW_ICON_ACTION(w, a, i) create_action(w, &a, ICON_NAME(i), ACTION_NAME(a))
|
||||
|
||||
/// This macro for register normal action.
|
||||
#define CREATE_NEW_ACTION(w, a) create_action(w, &a, QString(), ACTION_NAME(a))
|
||||
/// This macro for register Qt theme action.
|
||||
#define CREATE_NEW_THEMEICON_ACTION(w, a, i) create_action(w, &a, QLatin1String(STRIFY(i)), ACTION_NAME(a), true)
|
||||
/// This macro for register action with our custom icon.
|
||||
#define CREATE_NEW_ICON_ACTION(w, a, i) create_action(w, &a, ICON_NAME(i), ACTION_NAME(a), false)
|
||||
|
||||
// TODO: We may replace all Qt theme icons to our custom icon for visual consistency.
|
||||
// TODO: Some icons are invalid.
|
||||
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionCopyPixmap, edit-copy);
|
||||
CREATE_NEW_ACTION(mainWindow, actionCopyFilePath);
|
||||
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionPrevPicture, go-previous);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionNextPicture, go-next);
|
||||
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionActualSize, zoom-original);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionToggleMaximize, view-fullscreen);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionFitToScreen, app-icon);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionFitByWidth, app-icon);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionFitByHeight, app-icon);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionZoomIn, zoom-in);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionZoomOut, zoom-out);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionToggleCheckerboard, view-background-checkerboard);
|
||||
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionFlipHorizontal, app-icon);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionFlipVertical, app-icon);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionRotateClockwise, object-rotate-right);
|
||||
#undef CREATE_NEW_ICON_ACTION
|
||||
|
||||
#define CREATE_NEW_ACTION(w, a) create_action(w, &a, QString(), ACTION_NAME(a))
|
||||
#define CREATE_NEW_THEMEICON_ACTION(w, a, i) create_action(w, &a, QLatin1String(STRIFY(i)), ACTION_NAME(a), true)
|
||||
CREATE_NEW_ACTION(mainWindow, actionRotateCounterClockwise);
|
||||
CREATE_NEW_ACTION(mainWindow, actionPrevPicture);
|
||||
CREATE_NEW_ACTION(mainWindow, actionNextPicture);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionRotateCounterClockwise, app-icon);
|
||||
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleAvoidResetTransform);
|
||||
CREATE_NEW_ICON_ACTION(mainWindow, actionToggleCheckerboard, view-background-checkerboard);
|
||||
CREATE_NEW_ACTION(mainWindow, actionTogglePauseAnimation);
|
||||
CREATE_NEW_ACTION(mainWindow, actionAnimationNextFrame);
|
||||
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionOpen, document-open);
|
||||
CREATE_NEW_ACTION(mainWindow, actionHorizontalFlip);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitInView);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitByWidth);
|
||||
CREATE_NEW_ACTION(mainWindow, actionFitLongImage);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionCopyPixmap, edit-copy);
|
||||
CREATE_NEW_ACTION(mainWindow, actionCopyFilePath);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionPaste, edit-paste);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionTrash, edit-delete);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleStayOnTop);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleProtectMode);
|
||||
CREATE_NEW_ACTION(mainWindow, actionToggleAvoidResetTransform);
|
||||
CREATE_NEW_ACTION(mainWindow, actionSettings);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionHelp, system-help);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionLocateInFileManager, system-file-manager);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionProperties, document-properties);
|
||||
CREATE_NEW_ACTION(mainWindow, actionQuitApp);
|
||||
#undef CREATE_NEW_ACTION
|
||||
|
||||
CREATE_NEW_ACTION(mainWindow, actionSettings);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionHelp, system-help);
|
||||
|
||||
// Remove convenient macros
|
||||
|
||||
#undef CREATE_NEW_ICON_ACTION
|
||||
#undef CREATE_NEW_THEMEICON_ACTION
|
||||
#undef CREATE_NEW_ACTION
|
||||
|
||||
retranslateUi(mainWindow);
|
||||
#undef STRIFY
|
||||
#undef ACTION_NAME
|
||||
#undef ICON_NAME
|
||||
|
||||
QMetaObject::connectSlotsByName(mainWindow);
|
||||
}
|
||||
// endregion
|
||||
|
||||
void ActionManager::retranslateUi(MainWindow *mainWindow)
|
||||
{
|
||||
Q_UNUSED(mainWindow);
|
||||
// region: Setup Checkable Action
|
||||
|
||||
actionOpen->setText(QCoreApplication::translate("MainWindow", "&Open...", nullptr));
|
||||
actionToggleAvoidResetTransform->setCheckable(true);
|
||||
actionToggleCheckerboard->setCheckable(true);
|
||||
actionTogglePauseAnimation->setCheckable(true);
|
||||
|
||||
actionActualSize->setText(QCoreApplication::translate("MainWindow", "Actual size", nullptr));
|
||||
actionToggleMaximize->setText(QCoreApplication::translate("MainWindow", "Toggle maximize", nullptr));
|
||||
actionZoomIn->setText(QCoreApplication::translate("MainWindow", "Zoom in", nullptr));
|
||||
actionZoomOut->setText(QCoreApplication::translate("MainWindow", "Zoom out", nullptr));
|
||||
actionToggleCheckerboard->setText(QCoreApplication::translate("MainWindow", "Toggle Checkerboard", nullptr));
|
||||
actionRotateClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate right", nullptr));
|
||||
actionRotateCounterClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate left", nullptr));
|
||||
// endregion
|
||||
|
||||
// region: Action Translatable Text Setup
|
||||
|
||||
actionCopyPixmap->setText(QCoreApplication::translate("MainWindow", "Copy P&ixmap", nullptr));
|
||||
actionCopyFilePath->setText(QCoreApplication::translate("MainWindow", "Copy &File Path", nullptr));
|
||||
|
||||
actionPrevPicture->setText(QCoreApplication::translate("MainWindow", "Previous image", nullptr));
|
||||
actionNextPicture->setText(QCoreApplication::translate("MainWindow", "Next image", nullptr));
|
||||
|
||||
actionActualSize->setText(QCoreApplication::translate("MainWindow", "Actual size", nullptr));
|
||||
actionFitToScreen->setText(QCoreApplication::translate("MainWindow", "Fit to screen", nullptr));
|
||||
actionFitByWidth->setText(QCoreApplication::translate("MainWindow", "Fit by width", nullptr));
|
||||
actionFitByHeight->setText(QCoreApplication::translate("MainWindow", "Fit by height", nullptr));
|
||||
actionZoomIn->setText(QCoreApplication::translate("MainWindow", "Zoom in", nullptr));
|
||||
actionZoomOut->setText(QCoreApplication::translate("MainWindow", "Zoom out", nullptr));
|
||||
|
||||
actionFlipHorizontal->setText(QCoreApplication::translate("MainWindow", "Flip &Horizontally", nullptr));
|
||||
actionFlipVertical->setText(QCoreApplication::translate("MainWindow", "Flip &Vertically", nullptr));
|
||||
actionRotateClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate right", nullptr));
|
||||
actionRotateCounterClockwise->setText(QCoreApplication::translate("MainWindow", "Rotate left", nullptr));
|
||||
|
||||
actionToggleAvoidResetTransform->setText(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"));
|
||||
actionToggleCheckerboard->setText(QCoreApplication::translate("MainWindow", "Toggle Checkerboard", nullptr));
|
||||
actionTogglePauseAnimation->setText(QCoreApplication::translate("MainWindow", "Pause/Resume Animation", nullptr));
|
||||
actionAnimationNextFrame->setText(QCoreApplication::translate("MainWindow", "Animation Go to Next Frame", nullptr));
|
||||
|
||||
actionHorizontalFlip->setText(QCoreApplication::translate("MainWindow", "Flip &Horizontally", nullptr));
|
||||
actionFitInView->setText(QCoreApplication::translate("MainWindow", "Fit to view", nullptr));
|
||||
actionFitByWidth->setText(QCoreApplication::translate("MainWindow", "Fit to width", nullptr));
|
||||
actionFitLongImage->setText(QCoreApplication::translate("MainWindow", "Fit long image", nullptr));
|
||||
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));
|
||||
actionTrash->setText(QCoreApplication::translate("MainWindow", "Move to Trash", nullptr));
|
||||
actionToggleStayOnTop->setText(QCoreApplication::translate("MainWindow", "Stay on top", nullptr));
|
||||
actionToggleProtectMode->setText(QCoreApplication::translate("MainWindow", "Protected mode", nullptr));
|
||||
actionToggleAvoidResetTransform->setText(QCoreApplication::translate("MainWindow", "Keep transformation", "The 'transformation' means the flip/rotation status that currently applied to the image view"));
|
||||
actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr));
|
||||
actionHelp->setText(QCoreApplication::translate("MainWindow", "Help", nullptr));
|
||||
#ifdef Q_OS_WIN
|
||||
actionLocateInFileManager->setText(
|
||||
QCoreApplication::translate(
|
||||
"MainWindow", "Show in File Explorer",
|
||||
"File Explorer is the name of explorer.exe under Windows"
|
||||
)
|
||||
);
|
||||
)
|
||||
);
|
||||
#else
|
||||
actionLocateInFileManager->setText(QCoreApplication::translate("MainWindow", "Show in directory", nullptr));
|
||||
#endif // Q_OS_WIN
|
||||
actionProperties->setText(QCoreApplication::translate("MainWindow", "Properties", nullptr));
|
||||
actionQuitApp->setText(QCoreApplication::translate("MainWindow", "Quit", nullptr));
|
||||
|
||||
actionSettings->setText(QCoreApplication::translate("MainWindow", "Configure...", nullptr));
|
||||
actionHelp->setText(QCoreApplication::translate("MainWindow", "Help", nullptr));
|
||||
// endregion
|
||||
|
||||
QMetaObject::connectSlotsByName(mainWindow);
|
||||
}
|
||||
|
||||
void ActionManager::setupShortcuts()
|
||||
{
|
||||
actionOpen->setShortcut(QKeySequence::Open);
|
||||
actionCopyPixmap->setShortcut(QKeySequence::Copy);
|
||||
|
||||
actionPrevPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_Left),
|
||||
QKeySequence(Qt::Key_PageUp),
|
||||
});
|
||||
actionNextPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_Right),
|
||||
QKeySequence(Qt::Key_PageDown),
|
||||
});
|
||||
|
||||
actionActualSize->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
|
||||
actionZoomIn->setShortcut(QKeySequence::ZoomIn);
|
||||
actionZoomOut->setShortcut(QKeySequence::ZoomOut);
|
||||
actionPrevPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_PageUp),
|
||||
QKeySequence(Qt::Key_Left),
|
||||
});
|
||||
actionNextPicture->setShortcuts({
|
||||
QKeySequence(Qt::Key_PageDown),
|
||||
QKeySequence(Qt::Key_Right),
|
||||
});
|
||||
actionHorizontalFlip->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
|
||||
actionCopyPixmap->setShortcut(QKeySequence::Copy);
|
||||
actionPaste->setShortcut(QKeySequence::Paste);
|
||||
|
||||
actionTrash->setShortcut(QKeySequence::Delete);
|
||||
actionHelp->setShortcut(QKeySequence::HelpContents);
|
||||
actionSettings->setShortcut(QKeySequence::Preferences);
|
||||
actionProperties->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_I));
|
||||
actionQuitApp->setShortcuts({
|
||||
QKeySequence(Qt::Key_Space),
|
||||
QKeySequence(Qt::Key_Escape)
|
||||
});
|
||||
|
||||
actionSettings->setShortcut(QKeySequence::Preferences);
|
||||
actionHelp->setShortcut(QKeySequence::HelpContents);
|
||||
}
|
||||
|
||||
void ActionManager::updateActionState(PlaylistManager* pm, GraphicsView* gv)
|
||||
{
|
||||
const auto* gs = gv->scene();
|
||||
const auto* settings = Settings::instance();
|
||||
|
||||
// Update copy actions
|
||||
bool canCopy = pm->currentIndex().has_value();
|
||||
actionCopyPixmap->setEnabled(canCopy);
|
||||
actionCopyFilePath->setEnabled(canCopy);
|
||||
|
||||
// Update Prev/Next Picture State
|
||||
const int galleryFileCount = pm->totalCount();
|
||||
const bool loopGallery = settings->loopGallery();
|
||||
actionPrevPicture->setEnabled(galleryFileCount > 1 && (loopGallery || !pm->isFirstIndex()));
|
||||
actionNextPicture->setEnabled(galleryFileCount > 1 && (loopGallery || !pm->isLastIndex()));
|
||||
|
||||
// Update Avoid Reset Transform
|
||||
actionToggleAvoidResetTransform->setChecked(gv->isAvoidResetTransform());
|
||||
// Update Checkerboard
|
||||
actionToggleCheckerboard->setChecked(gv->isCheckerboard());
|
||||
// Update Animation Graphics Action
|
||||
bool canPauseAnimation = gs->canPauseAnimation();
|
||||
actionTogglePauseAnimation->setEnabled(canPauseAnimation);
|
||||
if (canPauseAnimation) {
|
||||
actionTogglePauseAnimation->setChecked(gs->isPauseAnimation());
|
||||
} else {
|
||||
actionTogglePauseAnimation->setChecked(false);
|
||||
}
|
||||
bool canSkipAnimation = gs->canSkipAnimationFrame();
|
||||
actionAnimationNextFrame->setEnabled(canSkipAnimation);
|
||||
|
||||
// Update trash, located in explorer and properties.
|
||||
bool hasLoadedFile = pm->currentIndex().has_value();
|
||||
actionTrash->setEnabled(hasLoadedFile);
|
||||
actionLocateInFileManager->setEnabled(hasLoadedFile);
|
||||
actionProperties->setEnabled(hasLoadedFile);
|
||||
}
|
||||
|
||||
|
||||
+25
-24
@@ -8,7 +8,11 @@
|
||||
#include <QAction>
|
||||
|
||||
class MainWindow;
|
||||
class PlaylistManager;
|
||||
class GraphicsView;
|
||||
|
||||
/// Action Manager is separated from Main Window
|
||||
/// to manage all actions specifically.
|
||||
class ActionManager
|
||||
{
|
||||
public:
|
||||
@@ -16,44 +20,41 @@ public:
|
||||
~ActionManager() = default;
|
||||
|
||||
void setupAction(MainWindow * mainWindow);
|
||||
void retranslateUi(MainWindow *MainWindow);
|
||||
void setupShortcuts();
|
||||
|
||||
static QIcon loadHidpiIcon(const QString &resp, QSize sz = QSize(32, 32));
|
||||
public slots:
|
||||
void updateActionState(PlaylistManager* pm, GraphicsView* gv);
|
||||
|
||||
public:
|
||||
QAction *actionOpen;
|
||||
|
||||
QAction *actionActualSize;
|
||||
QAction *actionToggleMaximize;
|
||||
QAction *actionZoomIn;
|
||||
QAction *actionZoomOut;
|
||||
QAction *actionToggleCheckerboard;
|
||||
QAction *actionRotateClockwise;
|
||||
QAction *actionRotateCounterClockwise;
|
||||
QAction *actionCopyPixmap;
|
||||
QAction *actionCopyFilePath;
|
||||
|
||||
QAction *actionPrevPicture;
|
||||
QAction *actionNextPicture;
|
||||
|
||||
QAction *actionActualSize;
|
||||
QAction *actionFitToScreen;
|
||||
QAction *actionFitByWidth;
|
||||
QAction *actionFitByHeight;
|
||||
QAction *actionZoomIn;
|
||||
QAction *actionZoomOut;
|
||||
|
||||
QAction *actionFlipHorizontal;
|
||||
QAction *actionFlipVertical;
|
||||
QAction *actionRotateClockwise;
|
||||
QAction *actionRotateCounterClockwise;
|
||||
|
||||
QAction *actionToggleAvoidResetTransform;
|
||||
QAction *actionToggleCheckerboard;
|
||||
QAction *actionTogglePauseAnimation;
|
||||
QAction *actionAnimationNextFrame;
|
||||
|
||||
QAction *actionHorizontalFlip;
|
||||
QAction *actionFitInView;
|
||||
QAction *actionFitByWidth;
|
||||
QAction *actionFitLongImage;
|
||||
QAction *actionCopyPixmap;
|
||||
QAction *actionCopyFilePath;
|
||||
QAction *actionPaste;
|
||||
QAction *actionTrash;
|
||||
QAction *actionToggleStayOnTop;
|
||||
QAction *actionToggleProtectMode;
|
||||
QAction *actionToggleAvoidResetTransform;
|
||||
QAction *actionSettings;
|
||||
QAction *actionHelp;
|
||||
QAction *actionLocateInFileManager;
|
||||
QAction *actionProperties;
|
||||
QAction *actionQuitApp;
|
||||
|
||||
QAction *actionSettings;
|
||||
QAction *actionHelp;
|
||||
};
|
||||
|
||||
#endif // ACTIONMANAGER_H
|
||||
|
||||
+14
-32
@@ -4,54 +4,36 @@
|
||||
|
||||
#include "bottombuttongroup.h"
|
||||
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QToolButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QDebug>
|
||||
|
||||
BottomButtonGroup::BottomButtonGroup(const std::vector<QAction *> &actionList, QWidget *parent)
|
||||
: QGroupBox (parent)
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
QHBoxLayout * mainLayout = new QHBoxLayout(this);
|
||||
mainLayout->setSizeConstraint(QLayout::SetFixedSize);
|
||||
this->setLayout(mainLayout);
|
||||
this->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
|
||||
this->setStyleSheet("BottomButtonGroup {"
|
||||
"border: 1px solid gray;"
|
||||
"border-top-left-radius: 10px;"
|
||||
"border-top-right-radius: 10px;"
|
||||
"border-style: none;"
|
||||
"background-color:rgba(0,0,0,120)"
|
||||
"}"
|
||||
"QToolButton {"
|
||||
"background:transparent;"
|
||||
"}"
|
||||
"QToolButton:!focus {"
|
||||
"border-style: none;"
|
||||
"}");
|
||||
this->setStyleSheet(R"#(
|
||||
BottomButtonGroup {
|
||||
border-style: none;
|
||||
background: transparent;
|
||||
}
|
||||
QToolButton {
|
||||
background: transparent;
|
||||
border-style: none;
|
||||
}
|
||||
)#");
|
||||
|
||||
auto newActionBtn = [this](QAction * action) -> QToolButton * {
|
||||
for (QAction * action : actionList) {
|
||||
// Create button
|
||||
QToolButton * btn = new QToolButton(this);
|
||||
btn->setDefaultAction(action);
|
||||
btn->setIconSize(QSize(32, 32));
|
||||
btn->setFixedSize(40, 40);
|
||||
return btn;
|
||||
};
|
||||
|
||||
for (QAction * action : actionList) {
|
||||
addButton(newActionBtn(action));
|
||||
// Add button
|
||||
layout()->addWidget(btn);
|
||||
}
|
||||
}
|
||||
|
||||
void BottomButtonGroup::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
|
||||
void BottomButtonGroup::addButton(QAbstractButton *button)
|
||||
{
|
||||
layout()->addWidget(button);
|
||||
updateGeometry();
|
||||
}
|
||||
|
||||
@@ -10,18 +10,11 @@
|
||||
#include <QAbstractButton>
|
||||
#include <QGroupBox>
|
||||
|
||||
class OpacityHelper;
|
||||
class BottomButtonGroup : public QGroupBox
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BottomButtonGroup(const std::vector<QAction *> & actionList, QWidget *parent = nullptr);
|
||||
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
void addButton(QAbstractButton *button);
|
||||
|
||||
private:
|
||||
OpacityHelper * m_opacityHelper;
|
||||
};
|
||||
|
||||
#endif // BOTTOMBUTTONGROUP_H
|
||||
|
||||
@@ -1,136 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2023 Tad Young <yyc12321@outlook.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "framelesswindow.h"
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QHoverEvent>
|
||||
#include <QApplication>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWindow>
|
||||
|
||||
FramelessWindow::FramelessWindow(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_centralLayout(new QVBoxLayout(this))
|
||||
, m_oldCursorShape(Qt::ArrowCursor)
|
||||
, m_oldEdges()
|
||||
{
|
||||
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
|
||||
this->setMouseTracking(true);
|
||||
this->setAttribute(Qt::WA_Hover, true);
|
||||
this->installEventFilter(this);
|
||||
|
||||
m_centralLayout->setContentsMargins(QMargins());
|
||||
}
|
||||
|
||||
void FramelessWindow::setCentralWidget(QWidget *widget)
|
||||
{
|
||||
if (m_centralWidget) {
|
||||
m_centralLayout->removeWidget(m_centralWidget);
|
||||
m_centralWidget->deleteLater();
|
||||
}
|
||||
|
||||
m_centralLayout->addWidget(widget);
|
||||
m_centralWidget = widget;
|
||||
}
|
||||
|
||||
void FramelessWindow::installResizeCapture(QObject* widget)
|
||||
{
|
||||
widget->installEventFilter(this);
|
||||
}
|
||||
|
||||
bool FramelessWindow::eventFilter(QObject* o, QEvent* e)
|
||||
{
|
||||
switch (e->type()) {
|
||||
case QEvent::HoverMove:
|
||||
{
|
||||
QWidget* wg = qobject_cast<QWidget*>(o);
|
||||
if (wg != nullptr)
|
||||
return mouseHover(static_cast<QHoverEvent*>(e), wg);
|
||||
|
||||
break;
|
||||
}
|
||||
case QEvent::MouseButtonPress:
|
||||
return mousePress(static_cast<QMouseEvent*>(e));
|
||||
}
|
||||
|
||||
return QWidget::eventFilter(o, e);
|
||||
}
|
||||
|
||||
bool FramelessWindow::mouseHover(QHoverEvent* event, QWidget* wg)
|
||||
{
|
||||
if (!isMaximized() && !isFullScreen()) {
|
||||
QWindow* win = window()->windowHandle();
|
||||
Qt::Edges edges = this->getEdgesByPos(wg->mapToGlobal(event->oldPos()), win->frameGeometry());
|
||||
|
||||
// backup & restore cursor shape
|
||||
if (edges && !m_oldEdges)
|
||||
// entering the edge. backup cursor shape
|
||||
m_oldCursorShape = win->cursor().shape();
|
||||
if (!edges && m_oldEdges)
|
||||
// leaving the edge. restore cursor shape
|
||||
win->setCursor(m_oldCursorShape);
|
||||
|
||||
// save the latest edges status
|
||||
m_oldEdges = edges;
|
||||
|
||||
// show resize cursor shape if cursor is within border
|
||||
if (edges) {
|
||||
win->setCursor(this->getCursorByEdge(edges, Qt::ArrowCursor));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool FramelessWindow::mousePress(QMouseEvent* event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton && !isMaximized() && !isFullScreen()) {
|
||||
QWindow* win = window()->windowHandle();
|
||||
Qt::Edges edges = this->getEdgesByPos(event->globalPosition().toPoint(), win->frameGeometry());
|
||||
if (edges) {
|
||||
win->startSystemResize(edges);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Qt::CursorShape FramelessWindow::getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor)
|
||||
{
|
||||
if ((edges == (Qt::TopEdge | Qt::LeftEdge)) || (edges == (Qt::RightEdge | Qt::BottomEdge)))
|
||||
return Qt::SizeFDiagCursor;
|
||||
else if ((edges == (Qt::TopEdge | Qt::RightEdge)) || (edges == (Qt::LeftEdge | Qt::BottomEdge)))
|
||||
return Qt::SizeBDiagCursor;
|
||||
else if (edges & (Qt::TopEdge | Qt::BottomEdge))
|
||||
return Qt::SizeVerCursor;
|
||||
else if (edges & (Qt::LeftEdge | Qt::RightEdge))
|
||||
return Qt::SizeHorCursor;
|
||||
else
|
||||
return default_cursor;
|
||||
}
|
||||
|
||||
Qt::Edges FramelessWindow::getEdgesByPos(const QPoint gpos, const QRect& winrect)
|
||||
{
|
||||
const int borderWidth = 8;
|
||||
Qt::Edges edges;
|
||||
|
||||
int x = gpos.x() - winrect.x();
|
||||
int y = gpos.y() - winrect.y();
|
||||
|
||||
if (x < borderWidth)
|
||||
edges |= Qt::LeftEdge;
|
||||
if (x > (winrect.width() - borderWidth))
|
||||
edges |= Qt::RightEdge;
|
||||
if (y < borderWidth)
|
||||
edges |= Qt::TopEdge;
|
||||
if (y > (winrect.height() - borderWidth))
|
||||
edges |= Qt::BottomEdge;
|
||||
|
||||
return edges;
|
||||
}
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef FRAMELESSWINDOW_H
|
||||
#define FRAMELESSWINDOW_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QVBoxLayout;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class FramelessWindow : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FramelessWindow(QWidget *parent = nullptr);
|
||||
|
||||
void setCentralWidget(QWidget * widget);
|
||||
void installResizeCapture(QObject* widget);
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *o, QEvent *e) override;
|
||||
bool mouseHover(QHoverEvent* event, QWidget* wg);
|
||||
bool mousePress(QMouseEvent* event);
|
||||
|
||||
private:
|
||||
Qt::Edges m_oldEdges;
|
||||
Qt::CursorShape m_oldCursorShape;
|
||||
|
||||
Qt::CursorShape getCursorByEdge(const Qt::Edges& edges, Qt::CursorShape default_cursor);
|
||||
Qt::Edges getEdgesByPos(const QPoint pos, const QRect& winrect);
|
||||
|
||||
QVBoxLayout * m_centralLayout = nullptr;
|
||||
QWidget * m_centralWidget = nullptr; // just a pointer, doesn't take the ownership.
|
||||
};
|
||||
|
||||
#endif // FRAMELESSWINDOW_H
|
||||
+85
-13
@@ -6,6 +6,9 @@
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include <QStyleHints>
|
||||
#include <QOperatingSystemVersion>
|
||||
#include <QGuiApplication>
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QMimeData>
|
||||
#include <QDebug>
|
||||
@@ -16,6 +19,33 @@
|
||||
#include <QMovie>
|
||||
#include <QPainter>
|
||||
|
||||
static const QColor& ColorSchemaToTextForeground(Qt::ColorScheme colorScheme) {
|
||||
// YYC MARK:
|
||||
// If we are using Windows 10 and lower system or Qt which do not support "Windows 11"
|
||||
// theme (lower than Qt 6.7), we should only support light mode.
|
||||
// Because Qt's dark-mode-aware "Windows 11" theme is only well-supported on Windows 11.
|
||||
#if defined(Q_OS_WIN)
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||
colorScheme = Qt::ColorScheme::Light;
|
||||
#else
|
||||
if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows11) {
|
||||
colorScheme = Qt::ColorScheme::Light;
|
||||
}
|
||||
#endif // QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||
#endif // defined(Q_OS_WIN)
|
||||
|
||||
switch (colorScheme) {
|
||||
case Qt::ColorScheme::Dark:
|
||||
static QColor WHITE = QColor("White");
|
||||
return WHITE;
|
||||
case Qt::ColorScheme::Light:
|
||||
case Qt::ColorScheme::Unknown:
|
||||
default:
|
||||
static QColor BLACK = QColor("Black");
|
||||
return BLACK;
|
||||
}
|
||||
}
|
||||
|
||||
class PGraphicsPixmapItem : public QGraphicsPixmapItem
|
||||
{
|
||||
public:
|
||||
@@ -99,7 +129,8 @@ private:
|
||||
GraphicsScene::GraphicsScene(QObject *parent)
|
||||
: QGraphicsScene(parent)
|
||||
{
|
||||
showText(tr("Drag image here"));
|
||||
showText(tr("Drag image here", "The same meaning of MainWindow's hint."));
|
||||
connect(qGuiApp->styleHints(), &QStyleHints::colorSchemeChanged, this, &GraphicsScene::updateStyle);
|
||||
}
|
||||
|
||||
GraphicsScene::~GraphicsScene()
|
||||
@@ -121,7 +152,7 @@ void GraphicsScene::showText(const QString &text)
|
||||
{
|
||||
this->clear();
|
||||
QGraphicsTextItem * textItem = this->addText(text);
|
||||
textItem->setDefaultTextColor(QColor("White"));
|
||||
textItem->setDefaultTextColor(ColorSchemaToTextForeground(qGuiApp->styleHints()->colorScheme()));
|
||||
m_theThing = textItem;
|
||||
this->setSceneRect(m_theThing->boundingRect());
|
||||
}
|
||||
@@ -169,27 +200,57 @@ bool GraphicsScene::trySetTransformationMode(Qt::TransformationMode mode, float
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Fetch graphics item as our custom animated item.
|
||||
/// Return nullptr means this item is not animated item.
|
||||
static PGraphicsMovieItem* fetchAnimatedItem(QGraphicsItem *item) {
|
||||
return qgraphicsitem_cast<PGraphicsMovieItem *>(item);
|
||||
}
|
||||
|
||||
bool GraphicsScene::canPauseAnimation() const {
|
||||
return fetchAnimatedItem(m_theThing) != nullptr;
|
||||
}
|
||||
|
||||
bool GraphicsScene::isPauseAnimation() const {
|
||||
auto* animatedItem = fetchAnimatedItem(m_theThing);
|
||||
if (animatedItem != nullptr) {
|
||||
return animatedItem->movie()->state() == QMovie::Paused;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool GraphicsScene::togglePauseAnimation()
|
||||
{
|
||||
PGraphicsMovieItem * animatedItem = qgraphicsitem_cast<PGraphicsMovieItem *>(m_theThing);
|
||||
if (animatedItem) {
|
||||
auto* animatedItem = fetchAnimatedItem(m_theThing);
|
||||
if (animatedItem != nullptr) {
|
||||
animatedItem->movie()->setPaused(animatedItem->movie()->state() != QMovie::Paused);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GraphicsScene::canSkipAnimationFrame() const {
|
||||
return isPauseAnimation();
|
||||
}
|
||||
|
||||
bool GraphicsScene::skipAnimationFrame(int delta)
|
||||
{
|
||||
PGraphicsMovieItem * animatedItem = qgraphicsitem_cast<PGraphicsMovieItem *>(m_theThing);
|
||||
if (animatedItem) {
|
||||
const int frameCount = animatedItem->movie()->frameCount();
|
||||
const int currentFrame = animatedItem->movie()->currentFrameNumber();
|
||||
const int targetFrame = (currentFrame + delta) % frameCount;
|
||||
animatedItem->movie()->setPaused(true);
|
||||
return animatedItem->movie()->jumpToFrame(targetFrame);
|
||||
auto* animatedItem = fetchAnimatedItem(m_theThing);
|
||||
|
||||
// Only paused animated item can skip frame
|
||||
if (animatedItem == nullptr) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
if (animatedItem->movie()->state() != QMovie::Paused) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Perform skip
|
||||
const int frameCount = animatedItem->movie()->frameCount();
|
||||
const int currentFrame = animatedItem->movie()->currentFrameNumber();
|
||||
const int targetFrame = (currentFrame + delta) % frameCount;
|
||||
return animatedItem->movie()->jumpToFrame(targetFrame);
|
||||
}
|
||||
|
||||
QPixmap GraphicsScene::renderToPixmap()
|
||||
@@ -206,3 +267,14 @@ QPixmap GraphicsScene::renderToPixmap()
|
||||
|
||||
return pixmap;
|
||||
}
|
||||
|
||||
void GraphicsScene::updateStyle(Qt::ColorScheme colorScheme) {
|
||||
Q_UNUSED(colorScheme)
|
||||
|
||||
QGraphicsItem * item = this->m_theThing;
|
||||
if (item == nullptr) return;
|
||||
QGraphicsTextItem * textItem = qgraphicsitem_cast<QGraphicsTextItem*>(item);
|
||||
if (textItem == nullptr) return;
|
||||
|
||||
textItem->setDefaultTextColor(ColorSchemaToTextForeground(colorScheme));
|
||||
}
|
||||
|
||||
@@ -21,11 +21,26 @@ public:
|
||||
|
||||
bool trySetTransformationMode(Qt::TransformationMode mode, float scaleHint);
|
||||
|
||||
/// Check whether current thing is animation.
|
||||
/// Only animation thing can be paused.
|
||||
bool canPauseAnimation() const;
|
||||
/// Check whether we are pasuing an animation graphics.
|
||||
bool isPauseAnimation() const;
|
||||
/// Toggle animation graphics pause state.
|
||||
/// Return true for successfully toggle, otherwise false.
|
||||
bool togglePauseAnimation();
|
||||
/// Check whether we can skip animation frame.
|
||||
/// Only paused animation graphics can skip frame.
|
||||
bool canSkipAnimationFrame() const;
|
||||
/// Skip paused animation graphics with given frame.
|
||||
/// Return true for successfully skip, otherwise false.
|
||||
bool skipAnimationFrame(int delta = 1);
|
||||
|
||||
QPixmap renderToPixmap();
|
||||
|
||||
public slots:
|
||||
void updateStyle(Qt::ColorScheme colorScheme);
|
||||
|
||||
private:
|
||||
QGraphicsItem * m_theThing = nullptr;
|
||||
};
|
||||
|
||||
+55
-58
@@ -7,6 +7,8 @@
|
||||
#include "graphicsscene.h"
|
||||
#include "settings.h"
|
||||
|
||||
#include <QStyleHints>
|
||||
#include <QOperatingSystemVersion>
|
||||
#include <QDebug>
|
||||
#include <QColorSpace>
|
||||
#include <QMouseEvent>
|
||||
@@ -23,11 +25,12 @@ GraphicsView::GraphicsView(QWidget *parent)
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setResizeAnchor(QGraphicsView::AnchorUnderMouse);
|
||||
setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
|
||||
setStyleSheet("background-color: rgba(0, 0, 0, 220);"
|
||||
"border-radius: 3px;");
|
||||
setAcceptDrops(false);
|
||||
setCheckerboardEnabled(false);
|
||||
|
||||
updateStyle(qGuiApp->styleHints()->colorScheme());
|
||||
connect(qGuiApp->styleHints(), &QStyleHints::colorSchemeChanged, this, &GraphicsView::updateStyle);
|
||||
|
||||
connect(horizontalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
|
||||
connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &GraphicsView::viewportRectChanged);
|
||||
}
|
||||
@@ -137,8 +140,7 @@ void GraphicsView::resetTransform()
|
||||
|
||||
void GraphicsView::zoomView(qreal scaleFactor)
|
||||
{
|
||||
m_enableFitInView = false;
|
||||
m_longImageMode = false;
|
||||
m_enableFitToScreen = false;
|
||||
scale(scaleFactor, scaleFactor);
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
@@ -222,6 +224,8 @@ void GraphicsView::fitByOrientation(Qt::Orientation ori, bool scaleDownOnly)
|
||||
QRectF originalScene = sceneRect();
|
||||
QTransform currentTransform = transform();
|
||||
|
||||
// TODO: May be optimized by matrix arithmetic operation?
|
||||
|
||||
if (ori == Qt::Horizontal) {
|
||||
// For horizontal fit (fit by width), position at top (for tall images)
|
||||
// Find the scene point that corresponds to the top-center of the transformed image
|
||||
@@ -274,37 +278,12 @@ void GraphicsView::fitByOrientation(Qt::Orientation ori, bool scaleDownOnly)
|
||||
centerOn(sceneLeftCenter);
|
||||
}
|
||||
|
||||
m_enableFitInView = false;
|
||||
m_enableFitToScreen = false;
|
||||
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
}
|
||||
|
||||
bool GraphicsView::isLongImage() const
|
||||
{
|
||||
// Get the transformed image size (considering rotation and other transforms)
|
||||
QRectF transformedRect = transform().mapRect(sceneRect());
|
||||
QSizeF imageSize = transformedRect.size();
|
||||
|
||||
if (imageSize.isEmpty()) return false;
|
||||
|
||||
qreal aspectRatio = imageSize.width() / imageSize.height();
|
||||
|
||||
// Check if aspect ratio exceeds 5:2 (wide) or 2:5 (tall)
|
||||
return aspectRatio > 2.5 || aspectRatio < 0.4;
|
||||
}
|
||||
|
||||
void GraphicsView::fitLongImage()
|
||||
{
|
||||
QRectF transformedRect = transform().mapRect(sceneRect());
|
||||
|
||||
if (transformedRect.width() < transformedRect.height()) {
|
||||
fitByOrientation(Qt::Horizontal, true);
|
||||
} else {
|
||||
fitByOrientation(Qt::Vertical, true);
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::displayScene()
|
||||
{
|
||||
if (shouldAvoidTransform()) {
|
||||
@@ -312,14 +291,6 @@ void GraphicsView::displayScene()
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if should apply long image mode
|
||||
if (Settings::instance()->autoLongImageMode() && isLongImage()) {
|
||||
m_longImageMode = true;
|
||||
m_firstUserMediaLoaded = true;
|
||||
if (isSceneBiggerThanView()) fitLongImage();
|
||||
return;
|
||||
}
|
||||
|
||||
if (isSceneBiggerThanView()) {
|
||||
// Do fit-in-view
|
||||
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
||||
@@ -330,8 +301,7 @@ void GraphicsView::displayScene()
|
||||
emit navigatorViewRequired(false, transform());
|
||||
}
|
||||
|
||||
m_longImageMode = false;
|
||||
m_enableFitInView = true;
|
||||
m_enableFitToScreen = true;
|
||||
m_firstUserMediaLoaded = true;
|
||||
}
|
||||
|
||||
@@ -345,17 +315,12 @@ bool GraphicsView::isSceneBiggerThanView() const
|
||||
}
|
||||
|
||||
// Automately do fit in view when viewport(window) smaller than image original size.
|
||||
void GraphicsView::setEnableAutoFitInView(bool enable)
|
||||
void GraphicsView::setEnableAutoFitToScreen(bool enable)
|
||||
{
|
||||
m_enableFitInView = enable;
|
||||
m_enableFitToScreen = enable;
|
||||
}
|
||||
|
||||
void GraphicsView::setLongImageMode(bool enable)
|
||||
{
|
||||
m_longImageMode = enable;
|
||||
}
|
||||
|
||||
bool GraphicsView::avoidResetTransform() const
|
||||
bool GraphicsView::isAvoidResetTransform() const
|
||||
{
|
||||
return m_avoidResetTransform;
|
||||
}
|
||||
@@ -365,6 +330,15 @@ void GraphicsView::setAvoidResetTransform(bool avoidReset)
|
||||
m_avoidResetTransform = avoidReset;
|
||||
}
|
||||
|
||||
bool GraphicsView::isCheckerboard() const {
|
||||
return m_checkerboardEnabled;
|
||||
}
|
||||
|
||||
void GraphicsView::toggleCheckerboard(bool invertCheckerboardColor)
|
||||
{
|
||||
setCheckerboardEnabled(!m_checkerboardEnabled, invertCheckerboardColor);
|
||||
}
|
||||
|
||||
inline double zeroOrOne(double number)
|
||||
{
|
||||
return qFuzzyIsNull(number) ? 0 : (number > 0 ? 1 : -1);
|
||||
@@ -379,9 +353,37 @@ QTransform GraphicsView::resetScale(const QTransform & orig)
|
||||
orig.dx(), orig.dy());
|
||||
}
|
||||
|
||||
void GraphicsView::toggleCheckerboard(bool invertCheckerboardColor)
|
||||
{
|
||||
setCheckerboardEnabled(!m_checkerboardEnabled, invertCheckerboardColor);
|
||||
void GraphicsView::updateStyle(Qt::ColorScheme colorScheme) {
|
||||
// YYC MARK:
|
||||
// If we are using Windows 10 and lower system or Qt which do not support "Windows 11"
|
||||
// theme (lower than Qt 6.7), we should only support light mode.
|
||||
// Because Qt's dark-mode-aware "Windows 11" theme is only well-supported on Windows 11.
|
||||
#if defined(Q_OS_WIN)
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||
colorScheme = Qt::ColorScheme::Light;
|
||||
#else
|
||||
if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows11) {
|
||||
colorScheme = Qt::ColorScheme::Light;
|
||||
}
|
||||
#endif // QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||
#endif // defined(Q_OS_WIN)
|
||||
|
||||
switch (colorScheme) {
|
||||
case Qt::ColorScheme::Dark:
|
||||
setStyleSheet(R"#(
|
||||
border-style: none;
|
||||
background-color: black;
|
||||
)#");
|
||||
break;
|
||||
case Qt::ColorScheme::Light:
|
||||
case Qt::ColorScheme::Unknown:
|
||||
default:
|
||||
setStyleSheet(R"#(
|
||||
border-style: none;
|
||||
background-color: white;
|
||||
)#");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void GraphicsView::mousePressEvent(QMouseEvent *event)
|
||||
@@ -427,16 +429,11 @@ void GraphicsView::wheelEvent(QWheelEvent *event)
|
||||
|
||||
void GraphicsView::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
if (m_longImageMode) {
|
||||
// In long image mode, reapply long image logic on resize
|
||||
// We directly apply the long image mode logic without rechecking
|
||||
// if we should enter long image mode, as the mode is already active
|
||||
fitLongImage();
|
||||
} else if (m_enableFitInView) {
|
||||
if (m_enableFitToScreen) {
|
||||
bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(resetScale(transform()));
|
||||
if (originalSizeSmallerThanWindow && scaleFactor() >= 1) {
|
||||
// no longer need to do fitInView()
|
||||
// but we leave the m_enableFitInView value unchanged in case
|
||||
// but we leave the m_enableToScreen value unchanged in case
|
||||
// user resize down the window again.
|
||||
} else if (originalSizeSmallerThanWindow && scaleFactor() < 1) {
|
||||
resetScale();
|
||||
|
||||
+7
-10
@@ -38,24 +38,22 @@ public:
|
||||
|
||||
void displayScene();
|
||||
bool isSceneBiggerThanView() const;
|
||||
void setEnableAutoFitInView(bool enable = true);
|
||||
void setLongImageMode(bool enable = true);
|
||||
void setEnableAutoFitToScreen(bool enable = true);
|
||||
|
||||
bool avoidResetTransform() const;
|
||||
bool isAvoidResetTransform() const;
|
||||
void setAvoidResetTransform(bool avoidReset);
|
||||
|
||||
static QTransform resetScale(const QTransform & orig);
|
||||
bool isCheckerboard() const;
|
||||
void toggleCheckerboard(bool invertCheckerboardColor = false);
|
||||
|
||||
// Long image mode support
|
||||
bool isLongImage() const;
|
||||
void fitLongImage();
|
||||
static QTransform resetScale(const QTransform & orig);
|
||||
|
||||
signals:
|
||||
void navigatorViewRequired(bool required, QTransform transform);
|
||||
void viewportRectChanged();
|
||||
|
||||
public slots:
|
||||
void toggleCheckerboard(bool invertCheckerboardColor = false);
|
||||
void updateStyle(Qt::ColorScheme colorScheme);
|
||||
|
||||
private:
|
||||
void mousePressEvent(QMouseEvent * event) override;
|
||||
@@ -74,8 +72,7 @@ private:
|
||||
// Consider switch to 3 state for "no fit", "always fit" and "fit when view is smaller"?
|
||||
// ... or even more? e.g. "fit/snap width" things...
|
||||
// Currently it's "no fit" when it's false and "fit when view is smaller" when it's true.
|
||||
bool m_enableFitInView = false;
|
||||
bool m_longImageMode = false;
|
||||
bool m_enableFitToScreen = false;
|
||||
bool m_avoidResetTransform = false;
|
||||
bool m_checkerboardEnabled = false;
|
||||
bool m_useLightCheckerboard = false;
|
||||
|
||||
+5
-12
@@ -4,7 +4,6 @@
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "playlistmanager.h"
|
||||
#include "settings.h"
|
||||
|
||||
#ifdef Q_OS_MACOS
|
||||
@@ -68,21 +67,19 @@ int main(int argc, char *argv[])
|
||||
a.installEventFilter(fileOpenEventHandler);
|
||||
a.connect(fileOpenEventHandler, &FileOpenEventHandler::fileOpen, [&w](const QUrl & url){
|
||||
if (w.isHidden()) {
|
||||
w.setWindowOpacity(1);
|
||||
w.showNormal();
|
||||
} else {
|
||||
w.activateWindow();
|
||||
}
|
||||
w.showUrls({url});
|
||||
w.showFiles({url});
|
||||
w.initWindowSize();
|
||||
});
|
||||
|
||||
// Handle dock icon clicks to show hidden window
|
||||
a.connect(&a, &QApplication::applicationStateChanged, [&w](Qt::ApplicationState state) {
|
||||
if (state == Qt::ApplicationActive && w.isHidden()) {
|
||||
w.showUrls({});
|
||||
w.galleryCurrent(true, true);
|
||||
w.setWindowOpacity(1);
|
||||
w.showFiles({});
|
||||
w.galleryCurrent(false);
|
||||
w.showNormal();
|
||||
w.raise();
|
||||
w.activateWindow();
|
||||
@@ -90,12 +87,8 @@ int main(int argc, char *argv[])
|
||||
});
|
||||
#endif // Q_OS_MACOS
|
||||
|
||||
QStringList urlStrList = parser.positionalArguments();
|
||||
QList<QUrl> && urlList = PlaylistManager::convertToUrlList(urlStrList);
|
||||
|
||||
if (!urlList.isEmpty()) {
|
||||
w.showUrls(urlList);
|
||||
}
|
||||
QStringList fileList = parser.positionalArguments();
|
||||
w.showFiles(fileList);
|
||||
|
||||
w.initWindowSize();
|
||||
|
||||
|
||||
+240
-525
@@ -5,7 +5,6 @@
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include "settings.h"
|
||||
#include "toolbutton.h"
|
||||
#include "bottombuttongroup.h"
|
||||
#include "graphicsview.h"
|
||||
#include "navigatorview.h"
|
||||
@@ -38,6 +37,7 @@
|
||||
#include <QProcess>
|
||||
#include <QDesktopServices>
|
||||
#include <QMessageBox>
|
||||
#include <QVBoxLayout>
|
||||
|
||||
#ifdef HAVE_QTDBUS
|
||||
#include <QDBusInterface>
|
||||
@@ -47,105 +47,123 @@
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: FramelessWindow(parent)
|
||||
: QWidget(parent)
|
||||
, m_am(new ActionManager)
|
||||
, m_pm(new PlaylistManager(this))
|
||||
, m_fileSystemWatcher(new QFileSystemWatcher(this))
|
||||
{
|
||||
if (Settings::instance()->stayOnTop()) {
|
||||
this->setWindowFlag(Qt::WindowStaysOnTopHint);
|
||||
}
|
||||
this->setWindowFlags(Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
|
||||
m_centralLayout = new QVBoxLayout(this);
|
||||
// YYC MARK:
|
||||
// 72 px is the height of Windows Photo Viewer's bottom line.
|
||||
m_centralLayout->setContentsMargins(QMargins(0, 0, 0, 72)); // TODO: This value may be declared as a constant.
|
||||
|
||||
this->setAttribute(Qt::WA_TranslucentBackground, true);
|
||||
this->setMinimumSize(350, 330);
|
||||
// YYC MARK:
|
||||
// Blumis set original value is 350 x 330.
|
||||
// It is too small for modern device,
|
||||
// so I level it up to standard VGA resolution 640 x 480.
|
||||
this->setMinimumSize(640, 480);
|
||||
this->setWindowIcon(QIcon(u":/icons/app-icon.svg"_s));
|
||||
this->setMouseTracking(true);
|
||||
this->setAcceptDrops(true);
|
||||
|
||||
m_pm->setAutoLoadFilterSuffixes(supportedImageFormats());
|
||||
|
||||
m_fadeOutAnimation = new QPropertyAnimation(this, "windowOpacity"_ba);
|
||||
m_fadeOutAnimation->setDuration(300);
|
||||
m_fadeOutAnimation->setStartValue(1);
|
||||
m_fadeOutAnimation->setEndValue(0);
|
||||
m_floatUpAnimation = new QPropertyAnimation(this, "geometry"_ba);
|
||||
m_floatUpAnimation->setDuration(300);
|
||||
m_floatUpAnimation->setEasingCurve(QEasingCurve::OutCirc);
|
||||
m_exitAnimationGroup = new QParallelAnimationGroup(this);
|
||||
m_exitAnimationGroup->addAnimation(m_fadeOutAnimation);
|
||||
m_exitAnimationGroup->addAnimation(m_floatUpAnimation);
|
||||
connect(m_exitAnimationGroup, &QParallelAnimationGroup::finished,
|
||||
this, &MainWindow::doCloseWindow);
|
||||
m_pm->setAllowedSuffixes(supportedImageFormats());
|
||||
|
||||
GraphicsScene * scene = new GraphicsScene(this);
|
||||
|
||||
m_graphicsView = new GraphicsView(this);
|
||||
m_graphicsView->setScene(scene);
|
||||
this->setCentralWidget(m_graphicsView);
|
||||
|
||||
m_gv = new NavigatorView(this);
|
||||
m_gv->setFixedSize(220, 160);
|
||||
m_gv = new GraphicsView(this);
|
||||
m_gv->setScene(scene);
|
||||
m_gv->setMainView(m_graphicsView);
|
||||
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
|
||||
m_centralLayout->addWidget(m_gv);
|
||||
|
||||
connect(m_graphicsView, &GraphicsView::navigatorViewRequired,
|
||||
m_nav = new NavigatorView(this);
|
||||
// YYC MARK:
|
||||
// Blumia set original value is 220 x 160.
|
||||
// So if we set its height to 72 for respecting the height of Windows Photo Viewer,
|
||||
// the width should be set to 99 for keeping aspect ratio.
|
||||
m_nav->setFixedSize(99, 72);
|
||||
m_nav->setScene(scene);
|
||||
m_nav->setMainView(m_gv);
|
||||
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio);
|
||||
|
||||
connect(m_gv, &GraphicsView::navigatorViewRequired,
|
||||
this, [this](bool required, const QTransform & tf){
|
||||
m_gv->setTransform(GraphicsView::resetScale(tf));
|
||||
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
|
||||
m_gv->setVisible(required);
|
||||
m_gv->updateMainViewportRegion();
|
||||
m_nav->setTransform(GraphicsView::resetScale(tf));
|
||||
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio);
|
||||
m_nav->setVisible(required);
|
||||
m_nav->updateMainViewportRegion();
|
||||
});
|
||||
|
||||
connect(m_graphicsView, &GraphicsView::viewportRectChanged,
|
||||
m_gv, &NavigatorView::updateMainViewportRegion);
|
||||
|
||||
m_closeButton = new ToolButton(true, m_graphicsView);
|
||||
m_closeButton->setIconSize(QSize(32, 32));
|
||||
m_closeButton->setFixedSize(QSize(50, 50));
|
||||
m_closeButton->setIconResourcePath(":/icons/window-close.svg");
|
||||
|
||||
connect(m_closeButton, &QAbstractButton::clicked,
|
||||
this, &MainWindow::closeWindow);
|
||||
|
||||
m_prevButton = new ToolButton(false, m_graphicsView);
|
||||
m_prevButton->setIconSize(QSize(75, 75));
|
||||
m_prevButton->setIconResourcePath(":/icons/go-previous.svg");
|
||||
m_prevButton->setVisible(false);
|
||||
m_prevButton->setOpacity(0, false);
|
||||
m_nextButton = new ToolButton(false, m_graphicsView);
|
||||
m_nextButton->setIconSize(QSize(75, 75));
|
||||
m_nextButton->setIconResourcePath(":/icons/go-next.svg");
|
||||
m_nextButton->setVisible(false);
|
||||
m_nextButton->setOpacity(0, false);
|
||||
|
||||
connect(m_prevButton, &QAbstractButton::clicked,
|
||||
this, &MainWindow::galleryPrev);
|
||||
connect(m_nextButton, &QAbstractButton::clicked,
|
||||
this, &MainWindow::galleryNext);
|
||||
connect(m_gv, &GraphicsView::viewportRectChanged,
|
||||
m_nav, &NavigatorView::updateMainViewportRegion);
|
||||
|
||||
m_am->setupAction(this);
|
||||
|
||||
m_bottomButtonGroup = new BottomButtonGroup({
|
||||
m_am->actionActualSize,
|
||||
m_am->actionToggleMaximize,
|
||||
m_am->actionFitToScreen,
|
||||
m_am->actionZoomIn,
|
||||
m_am->actionZoomOut,
|
||||
m_am->actionPrevPicture,
|
||||
m_am->actionProperties,
|
||||
m_am->actionNextPicture,
|
||||
m_am->actionRotateCounterClockwise,
|
||||
m_am->actionRotateClockwise,
|
||||
m_am->actionFlipHorizontal,
|
||||
m_am->actionToggleCheckerboard,
|
||||
m_am->actionRotateClockwise
|
||||
}, this);
|
||||
|
||||
m_bottomButtonGroup->setOpacity(0, false);
|
||||
m_gv->setOpacity(0, false);
|
||||
m_closeButton->setOpacity(0, false);
|
||||
m_menu = new QMenu(this);
|
||||
|
||||
connect(m_pm, &PlaylistManager::totalCountChanged, this, &MainWindow::updateGalleryButtonsVisibility);
|
||||
{
|
||||
m_menu->addAction(m_am->actionCopyPixmap);
|
||||
m_menu->addAction(m_am->actionCopyFilePath);
|
||||
|
||||
connect(m_pm->model(), &PlaylistModel::modelReset, this, std::bind(&MainWindow::galleryCurrent, this, false, false));
|
||||
connect(m_pm, &PlaylistManager::currentIndexChanged, this, std::bind(&MainWindow::galleryCurrent, this, true, false));
|
||||
m_menu->addSeparator();
|
||||
|
||||
m_menu->addAction(m_am->actionPrevPicture);
|
||||
m_menu->addAction(m_am->actionNextPicture);
|
||||
|
||||
m_menu->addSeparator();
|
||||
|
||||
m_menu->addAction(m_am->actionActualSize);
|
||||
m_menu->addAction(m_am->actionFitToScreen);
|
||||
m_menu->addAction(m_am->actionFitByWidth);
|
||||
m_menu->addAction(m_am->actionFitByHeight);
|
||||
m_menu->addAction(m_am->actionZoomIn);
|
||||
m_menu->addAction(m_am->actionZoomOut);
|
||||
|
||||
m_menu->addSeparator();
|
||||
|
||||
m_menu->addAction(m_am->actionFlipHorizontal);
|
||||
m_menu->addAction(m_am->actionFlipVertical);
|
||||
m_menu->addAction(m_am->actionRotateClockwise);
|
||||
m_menu->addAction(m_am->actionRotateCounterClockwise);
|
||||
|
||||
m_menu->addSeparator();
|
||||
|
||||
m_menu->addAction(m_am->actionToggleAvoidResetTransform);
|
||||
m_menu->addAction(m_am->actionToggleCheckerboard);
|
||||
m_menu->addAction(m_am->actionTogglePauseAnimation);
|
||||
m_menu->addAction(m_am->actionAnimationNextFrame);
|
||||
|
||||
m_menu->addSeparator();
|
||||
|
||||
m_menu->addAction(m_am->actionTrash);
|
||||
m_menu->addAction(m_am->actionLocateInFileManager);
|
||||
m_menu->addAction(m_am->actionProperties);
|
||||
|
||||
m_menu->addSeparator();
|
||||
|
||||
m_menu->addAction(m_am->actionSettings);
|
||||
m_menu->addAction(m_am->actionHelp);
|
||||
}
|
||||
|
||||
connect(m_pm, &PlaylistManager::playlistChanged, this, std::bind(&MainWindow::updateActionState, this));
|
||||
|
||||
connect(m_pm, &PlaylistManager::playlistChanged, this, std::bind(&MainWindow::galleryCurrent, this, false));
|
||||
connect(m_pm, &PlaylistManager::currentIndexChanged, this, std::bind(&MainWindow::galleryCurrent, this, false));
|
||||
|
||||
connect(m_fileSystemWatcher, &QFileSystemWatcher::fileChanged, this, [this](){
|
||||
QTimer::singleShot(500, this, std::bind(&MainWindow::galleryCurrent, this, false, true));
|
||||
QTimer::singleShot(500, this, std::bind(&MainWindow::galleryCurrent, this, true));
|
||||
});
|
||||
|
||||
QShortcut * fullscreenShorucut = new QShortcut(QKeySequence(QKeySequence::FullScreen), this);
|
||||
@@ -156,15 +174,8 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
|
||||
QTimer::singleShot(0, this, [this](){
|
||||
m_am->setupShortcuts();
|
||||
Settings::instance()->applyUserShortcuts(this);
|
||||
});
|
||||
|
||||
// allow some mouse events can go through these widgets for resizing window.
|
||||
installResizeCapture(m_closeButton);
|
||||
installResizeCapture(m_graphicsView);
|
||||
installResizeCapture(m_graphicsView->viewport());
|
||||
installResizeCapture(m_gv);
|
||||
installResizeCapture(m_gv->viewport());
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
@@ -172,27 +183,16 @@ MainWindow::~MainWindow()
|
||||
|
||||
}
|
||||
|
||||
void MainWindow::showUrls(const QList<QUrl> &urls)
|
||||
void MainWindow::showFiles(const QStringList &files)
|
||||
{
|
||||
if (!urls.isEmpty()) {
|
||||
const QUrl & firstUrl = urls.first();
|
||||
if (urls.count() == 1) {
|
||||
const QString lowerCaseUrlPath(firstUrl.path().toLower());
|
||||
if (lowerCaseUrlPath.endsWith(".m3u8") || lowerCaseUrlPath.endsWith(".m3u")) {
|
||||
m_pm->loadM3U8Playlist(firstUrl);
|
||||
galleryCurrent(true, true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
m_graphicsView->showFileFromPath(firstUrl.toLocalFile());
|
||||
m_pm->loadPlaylist(urls);
|
||||
} else {
|
||||
m_graphicsView->showText(tr("File url list is empty"));
|
||||
m_pm->setPlaylist(urls);
|
||||
return;
|
||||
}
|
||||
m_pm->loadPlaylist(files);
|
||||
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio);
|
||||
}
|
||||
|
||||
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
|
||||
void MainWindow::showFiles(const QList<QUrl>& urls)
|
||||
{
|
||||
m_pm->loadPlaylist(urls);
|
||||
m_nav->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio);
|
||||
}
|
||||
|
||||
void MainWindow::initWindowSize()
|
||||
@@ -217,10 +217,10 @@ void MainWindow::adjustWindowSizeBySceneRect()
|
||||
{
|
||||
if (m_pm->totalCount() < 1) return;
|
||||
|
||||
QSize sceneSize = m_graphicsView->sceneRect().toRect().size();
|
||||
QSize sceneSize = m_gv->sceneRect().toRect().size();
|
||||
QSize sceneSizeWithMargins = sceneSize + QSize(130, 125);
|
||||
|
||||
if (m_graphicsView->scaleFactor() < 1 || size().expandedTo(sceneSizeWithMargins) != size()) {
|
||||
if (m_gv->scaleFactor() < 1 || size().expandedTo(sceneSizeWithMargins) != size()) {
|
||||
// if it scaled down by the resize policy:
|
||||
QSize screenSize = qApp->screenAt(QCursor::pos())->availableSize();
|
||||
if (screenSize.expandedTo(sceneSize) == screenSize) {
|
||||
@@ -234,7 +234,7 @@ void MainWindow::adjustWindowSizeBySceneRect()
|
||||
// The old window size may cause fitInView call from resize() and the
|
||||
// above resize() call won't reset the scale back to 1:1, so we
|
||||
// just call resetScale() here to ensure the thing is no longer scaled.
|
||||
m_graphicsView->resetScale();
|
||||
m_gv->resetScale();
|
||||
centerWindow();
|
||||
} else {
|
||||
// toggle maximum
|
||||
@@ -243,15 +243,9 @@ void MainWindow::adjustWindowSizeBySceneRect()
|
||||
}
|
||||
}
|
||||
|
||||
// can be empty if it is NOT from a local file.
|
||||
QUrl MainWindow::currentImageFileUrl() const
|
||||
{
|
||||
return m_pm->urlByIndex(m_pm->curIndex());
|
||||
}
|
||||
|
||||
void MainWindow::clearGallery()
|
||||
{
|
||||
m_pm->setPlaylist({});
|
||||
m_pm->clearPlaylist();
|
||||
}
|
||||
|
||||
void MainWindow::galleryPrev()
|
||||
@@ -259,10 +253,9 @@ void MainWindow::galleryPrev()
|
||||
const bool loopGallery = Settings::instance()->loopGallery();
|
||||
if (!loopGallery && m_pm->isFirstIndex()) return;
|
||||
|
||||
QModelIndex index = m_pm->previousIndex();
|
||||
if (index.isValid()) {
|
||||
m_pm->setCurrentIndex(index);
|
||||
m_graphicsView->showFileFromPath(m_pm->localFileByIndex(index));
|
||||
auto index = m_pm->previousIndex();
|
||||
if (index.has_value()) {
|
||||
m_pm->setCurrentIndex(*index);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -271,30 +264,29 @@ void MainWindow::galleryNext()
|
||||
const bool loopGallery = Settings::instance()->loopGallery();
|
||||
if (!loopGallery && m_pm->isLastIndex()) return;
|
||||
|
||||
QModelIndex index = m_pm->nextIndex();
|
||||
if (index.isValid()) {
|
||||
m_pm->setCurrentIndex(index);
|
||||
m_graphicsView->showFileFromPath(m_pm->localFileByIndex(index));
|
||||
auto index = m_pm->nextIndex();
|
||||
if (index.has_value()) {
|
||||
m_pm->setCurrentIndex(*index);
|
||||
}
|
||||
}
|
||||
|
||||
// Only use this to update minor information.
|
||||
void MainWindow::galleryCurrent(bool showLoadImageHintWhenEmpty, bool reloadImage)
|
||||
void MainWindow::galleryCurrent(bool fromFileWatcher)
|
||||
{
|
||||
QModelIndex index = m_pm->curIndex();
|
||||
bool shouldResetfileWatcher = true;
|
||||
if (index.isValid()) {
|
||||
const QString & localFilePath(m_pm->localFileByIndex(index));
|
||||
if (reloadImage) m_graphicsView->showFileFromPath(localFilePath);
|
||||
shouldResetfileWatcher = !updateFileWatcher(localFilePath);
|
||||
setWindowTitle(m_pm->urlByIndex(index).fileName());
|
||||
} else if (showLoadImageHintWhenEmpty && m_pm->totalCount() <= 0) {
|
||||
m_graphicsView->showText(QCoreApplication::translate("GraphicsScene", "Drag image here"));
|
||||
auto index = m_pm->currentIndex();
|
||||
if (index.has_value()) {
|
||||
QString localFilePath = m_pm->localFileByIndex(*index);
|
||||
m_gv->showFileFromPath(localFilePath);
|
||||
if (!fromFileWatcher) {
|
||||
updateFileWatcher(localFilePath);
|
||||
setWindowTitle(m_pm->urlByIndex(*index).fileName());
|
||||
}
|
||||
} else {
|
||||
m_gv->showText(tr("Drag image here"));
|
||||
setWindowTitle(QString());
|
||||
updateFileWatcher();
|
||||
}
|
||||
|
||||
updateGalleryButtonsVisibility();
|
||||
|
||||
if (shouldResetfileWatcher) updateFileWatcher();
|
||||
updateActionState();
|
||||
}
|
||||
|
||||
QStringList MainWindow::supportedImageFormats()
|
||||
@@ -314,72 +306,7 @@ void MainWindow::showEvent(QShowEvent *event)
|
||||
{
|
||||
updateWidgetsPosition();
|
||||
|
||||
return FramelessWindow::showEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::enterEvent(QEnterEvent *event)
|
||||
{
|
||||
m_bottomButtonGroup->setOpacity(1);
|
||||
m_gv->setOpacity(1);
|
||||
|
||||
m_closeButton->setOpacity(1);
|
||||
m_prevButton->setOpacity(1);
|
||||
m_nextButton->setOpacity(1);
|
||||
|
||||
return FramelessWindow::enterEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::leaveEvent(QEvent *event)
|
||||
{
|
||||
m_bottomButtonGroup->setOpacity(0);
|
||||
m_gv->setOpacity(0);
|
||||
|
||||
m_closeButton->setOpacity(0);
|
||||
m_prevButton->setOpacity(0);
|
||||
m_nextButton->setOpacity(0);
|
||||
|
||||
return FramelessWindow::leaveEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton && !isMaximized()) {
|
||||
m_clickedOnWindow = true;
|
||||
m_oldMousePos = event->pos();
|
||||
// qDebug() << m_oldMousePos << m_graphicsView->transform().m11()
|
||||
// << m_graphicsView->transform().m22() << m_graphicsView->matrix().m12();
|
||||
event->accept();
|
||||
}
|
||||
|
||||
return FramelessWindow::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton && m_clickedOnWindow && !isMaximized() && !isFullScreen()) {
|
||||
if (!window()->windowHandle()->startSystemMove()) {
|
||||
move(event->globalPosition().toPoint() - m_oldMousePos);
|
||||
}
|
||||
event->accept();
|
||||
}
|
||||
|
||||
return FramelessWindow::mouseMoveEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
m_clickedOnWindow = false;
|
||||
|
||||
// It seems the forward/back mouse button won't generate a key event [1] so we can't use
|
||||
// QShortcut or QKeySequence to indicate these shortcuts, so we do it here.
|
||||
// Reference:
|
||||
// [1]: https://codereview.qt-project.org/c/qt/qtbase/+/177475
|
||||
if (event->button() == Qt::ForwardButton || event->button() == Qt::BackButton) {
|
||||
event->button() == Qt::BackButton ? galleryPrev() : galleryNext();
|
||||
event->accept();
|
||||
}
|
||||
|
||||
return FramelessWindow::mouseReleaseEvent(event);
|
||||
return QWidget::showEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
@@ -392,7 +319,7 @@ void MainWindow::mouseDoubleClickEvent(QMouseEvent *event)
|
||||
|
||||
switch (Settings::instance()->doubleClickBehavior()) {
|
||||
case Settings::DoubleClickBehavior::Close:
|
||||
quitAppAction();
|
||||
closeWindow();
|
||||
event->accept();
|
||||
break;
|
||||
case Settings::DoubleClickBehavior::Maximize:
|
||||
@@ -444,7 +371,7 @@ void MainWindow::wheelEvent(QWheelEvent *event)
|
||||
}
|
||||
event->accept();
|
||||
} else {
|
||||
FramelessWindow::wheelEvent(event);
|
||||
QWidget::wheelEvent(event);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -452,96 +379,25 @@ void MainWindow::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
updateWidgetsPosition();
|
||||
|
||||
return FramelessWindow::resizeEvent(event);
|
||||
return QWidget::resizeEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
|
||||
{
|
||||
QMenu * menu = new QMenu;
|
||||
QMenu * copyMenu = new QMenu(tr("&Copy"));
|
||||
QUrl currentFileUrl = currentImageFileUrl();
|
||||
m_menu->exec(mapToGlobal(event->pos()));
|
||||
|
||||
QAction * copyPixmap = m_am->actionCopyPixmap;
|
||||
QAction * copyFilePath = m_am->actionCopyFilePath;
|
||||
|
||||
copyMenu->setIcon(QIcon::fromTheme(u"edit-copy"_s));
|
||||
copyMenu->addAction(copyPixmap);
|
||||
if (currentFileUrl.isValid()) {
|
||||
copyMenu->addAction(copyFilePath);
|
||||
}
|
||||
|
||||
QAction * paste = m_am->actionPaste;
|
||||
|
||||
QAction * trash = m_am->actionTrash;
|
||||
|
||||
QAction * stayOnTopMode = m_am->actionToggleStayOnTop;
|
||||
stayOnTopMode->setCheckable(true);
|
||||
stayOnTopMode->setChecked(stayOnTop());
|
||||
|
||||
QAction * protectedMode = m_am->actionToggleProtectMode;
|
||||
protectedMode->setCheckable(true);
|
||||
protectedMode->setChecked(m_protectedMode);
|
||||
|
||||
QAction * avoidResetTransform = m_am->actionToggleAvoidResetTransform;
|
||||
avoidResetTransform->setCheckable(true);
|
||||
avoidResetTransform->setChecked(m_graphicsView->avoidResetTransform());
|
||||
|
||||
QAction * toggleSettings = m_am->actionSettings;
|
||||
QAction * helpAction = m_am->actionHelp;
|
||||
QAction * propertiesAction = m_am->actionProperties;
|
||||
|
||||
#if 0
|
||||
menu->addAction(m_am->actionOpen);
|
||||
#endif // 0
|
||||
|
||||
if (copyMenu->actions().count() == 1) {
|
||||
menu->addActions(copyMenu->actions());
|
||||
} else {
|
||||
menu->addMenu(copyMenu);
|
||||
}
|
||||
|
||||
if (canPaste()) {
|
||||
menu->addAction(paste);
|
||||
}
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
menu->addAction(m_am->actionHorizontalFlip);
|
||||
#if 0
|
||||
menu->addAction(m_am->actionFitInView);
|
||||
menu->addAction(m_am->actionFitByWidth);
|
||||
#endif // 0
|
||||
menu->addSeparator();
|
||||
menu->addAction(stayOnTopMode);
|
||||
menu->addAction(protectedMode);
|
||||
menu->addAction(avoidResetTransform);
|
||||
menu->addSeparator();
|
||||
menu->addAction(toggleSettings);
|
||||
menu->addAction(helpAction);
|
||||
if (currentFileUrl.isValid()) {
|
||||
menu->addSeparator();
|
||||
if (currentFileUrl.isLocalFile()) {
|
||||
menu->addAction(trash);
|
||||
menu->addAction(m_am->actionLocateInFileManager);
|
||||
}
|
||||
menu->addAction(propertiesAction);
|
||||
}
|
||||
menu->exec(mapToGlobal(event->pos()));
|
||||
menu->deleteLater();
|
||||
copyMenu->deleteLater();
|
||||
|
||||
return FramelessWindow::contextMenuEvent(event);
|
||||
return QWidget::contextMenuEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
|
||||
{
|
||||
if (event->mimeData()->hasUrls() || event->mimeData()->hasImage() || event->mimeData()->hasText()) {
|
||||
if (event->mimeData()->hasUrls()) {
|
||||
event->acceptProposedAction();
|
||||
} else {
|
||||
event->ignore();
|
||||
}
|
||||
|
||||
return FramelessWindow::dragEnterEvent(event);
|
||||
return QWidget::dragEnterEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::dragMoveEvent(QDragMoveEvent *event)
|
||||
@@ -554,26 +410,10 @@ void MainWindow::dropEvent(QDropEvent *event)
|
||||
event->acceptProposedAction();
|
||||
|
||||
const QMimeData * mimeData = event->mimeData();
|
||||
|
||||
if (mimeData->hasUrls()) {
|
||||
const QList<QUrl> &urls = mimeData->urls();
|
||||
if (urls.isEmpty()) {
|
||||
m_graphicsView->showText(tr("File url list is empty"));
|
||||
} else {
|
||||
showUrls(urls);
|
||||
}
|
||||
} else if (mimeData->hasImage()) {
|
||||
QImage img = qvariant_cast<QImage>(mimeData->imageData());
|
||||
QPixmap pixmap = QPixmap::fromImage(img);
|
||||
if (pixmap.isNull()) {
|
||||
m_graphicsView->showText(tr("Image data is invalid"));
|
||||
} else {
|
||||
m_graphicsView->showImage(pixmap);
|
||||
}
|
||||
} else if (mimeData->hasText()) {
|
||||
m_graphicsView->showText(mimeData->text());
|
||||
showFiles(mimeData->urls());
|
||||
} else {
|
||||
m_graphicsView->showText(tr("Not supported mimedata: %1").arg(mimeData->formats().first()));
|
||||
m_gv->showText(tr("Not supported mimedata: %1").arg(mimeData->formats().first()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -591,75 +431,18 @@ void MainWindow::centerWindow()
|
||||
|
||||
void MainWindow::closeWindow()
|
||||
{
|
||||
if (Settings::instance()->useBuiltInCloseAnimation()) {
|
||||
QRect windowRect(this->geometry());
|
||||
m_floatUpAnimation->setStartValue(windowRect);
|
||||
m_floatUpAnimation->setEndValue(windowRect.adjusted(0, -80, 0, 0));
|
||||
m_floatUpAnimation->setStartValue(QRect(this->geometry().x(), this->geometry().y(), this->geometry().width(), this->geometry().height()));
|
||||
m_floatUpAnimation->setEndValue(QRect(this->geometry().x(), this->geometry().y()-80, this->geometry().width(), this->geometry().height()));
|
||||
m_exitAnimationGroup->start();
|
||||
} else {
|
||||
doCloseWindow();
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::updateWidgetsPosition()
|
||||
{
|
||||
m_closeButton->move(width() - m_closeButton->width(), 0);
|
||||
m_prevButton->move(25, (height() - m_prevButton->sizeHint().height()) / 2);
|
||||
m_nextButton->move(width() - m_nextButton->sizeHint().width() - 25,
|
||||
(height() - m_prevButton->sizeHint().height()) / 2);
|
||||
m_bottomButtonGroup->move((width() - m_bottomButtonGroup->width()) / 2,
|
||||
height() - m_bottomButtonGroup->height());
|
||||
m_gv->move(width() - m_gv->width(), height() - m_gv->height());
|
||||
}
|
||||
|
||||
void MainWindow::toggleProtectedMode()
|
||||
{
|
||||
m_protectedMode = !m_protectedMode;
|
||||
m_closeButton->setVisible(!m_protectedMode);
|
||||
updateGalleryButtonsVisibility();
|
||||
}
|
||||
|
||||
void MainWindow::toggleStayOnTop()
|
||||
{
|
||||
setWindowFlag(Qt::WindowStaysOnTopHint, !stayOnTop());
|
||||
show();
|
||||
(72 - m_bottomButtonGroup->height()) / 2 + (height() - 72));
|
||||
m_nav->move(width() - m_nav->width(), height() - m_nav->height());
|
||||
}
|
||||
|
||||
void MainWindow::toggleAvoidResetTransform()
|
||||
{
|
||||
m_graphicsView->setAvoidResetTransform(!m_graphicsView->avoidResetTransform());
|
||||
}
|
||||
|
||||
bool MainWindow::stayOnTop() const
|
||||
{
|
||||
return windowFlags().testFlag(Qt::WindowStaysOnTopHint);
|
||||
}
|
||||
|
||||
bool MainWindow::canPaste() const
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void MainWindow::quitAppAction(bool force)
|
||||
{
|
||||
if (!m_protectedMode || force) {
|
||||
closeWindow();
|
||||
}
|
||||
m_gv->setAvoidResetTransform(!m_gv->isAvoidResetTransform());
|
||||
}
|
||||
|
||||
void MainWindow::toggleFullscreen()
|
||||
@@ -685,148 +468,21 @@ QSize MainWindow::sizeHint() const
|
||||
return QSize(710, 530);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionOpen_triggered()
|
||||
{
|
||||
QStringList picturesLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
|
||||
QUrl pictureUrl = picturesLocations.isEmpty() ? QUrl::fromLocalFile(picturesLocations.first())
|
||||
: QUrl::fromLocalFile(QDir::homePath());
|
||||
QList<QUrl> urls(QFileDialog::getOpenFileUrls(this, QString(), pictureUrl));
|
||||
if (!urls.isEmpty()) {
|
||||
showUrls(urls);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionActualSize_triggered()
|
||||
{
|
||||
m_graphicsView->resetScale();
|
||||
m_graphicsView->setEnableAutoFitInView(false);
|
||||
m_graphicsView->setLongImageMode(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionToggleMaximize_triggered()
|
||||
{
|
||||
toggleMaximize();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionZoomIn_triggered()
|
||||
{
|
||||
if (m_graphicsView->scaleFactor() < 1000) {
|
||||
m_graphicsView->zoomView(1.25);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionZoomOut_triggered()
|
||||
{
|
||||
m_graphicsView->zoomView(0.8);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionHorizontalFlip_triggered()
|
||||
{
|
||||
m_graphicsView->flipView();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFitInView_triggered()
|
||||
{
|
||||
m_graphicsView->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
|
||||
m_graphicsView->setEnableAutoFitInView(m_graphicsView->scaleFactor() <= 1);
|
||||
m_graphicsView->setLongImageMode(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFitByWidth_triggered()
|
||||
{
|
||||
m_graphicsView->fitByOrientation();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFitLongImage_triggered()
|
||||
{
|
||||
m_graphicsView->setLongImageMode(true);
|
||||
m_graphicsView->fitLongImage();
|
||||
}
|
||||
// region: Action Trigger
|
||||
|
||||
void MainWindow::on_actionCopyPixmap_triggered()
|
||||
{
|
||||
QClipboard *cb = QApplication::clipboard();
|
||||
cb->setPixmap(m_graphicsView->scene()->renderToPixmap());
|
||||
cb->setPixmap(m_gv->scene()->renderToPixmap());
|
||||
}
|
||||
|
||||
void MainWindow::on_actionCopyFilePath_triggered()
|
||||
{
|
||||
QUrl currentFileUrl(currentImageFileUrl());
|
||||
if (currentFileUrl.isValid()) {
|
||||
QClipboard *cb = QApplication::clipboard();
|
||||
cb->setText(currentFileUrl.toLocalFile());
|
||||
}
|
||||
}
|
||||
auto index = m_pm->currentIndex();
|
||||
if (!index.has_value()) return;
|
||||
|
||||
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<QImage>(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()) {
|
||||
setWindowTitle(tr("Image From Clipboard"));
|
||||
m_graphicsView->showImage(clipboardImage);
|
||||
clearGallery();
|
||||
} else if (clipboardFileUrl.isValid()) {
|
||||
m_graphicsView->showFileFromPath(clipboardFileUrl.toLocalFile());
|
||||
m_pm->loadPlaylist(clipboardFileUrl);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionTrash_triggered()
|
||||
{
|
||||
QModelIndex index = m_pm->curIndex();
|
||||
if (!m_pm->urlByIndex(index).isLocalFile()) return;
|
||||
|
||||
QFile file(m_pm->localFileByIndex(index));
|
||||
QFileInfo fileInfo(file.fileName());
|
||||
|
||||
QMessageBox::StandardButton result = QMessageBox::question(this, tr("Move to Trash"),
|
||||
tr("Are you sure you want to move \"%1\" to recycle bin?").arg(fileInfo.fileName()));
|
||||
if (result == QMessageBox::Yes) {
|
||||
bool succ = file.moveToTrash();
|
||||
if (!succ) {
|
||||
QMessageBox::warning(this, tr("Failed to move file to trash"),
|
||||
tr("Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation."));
|
||||
} else {
|
||||
m_pm->removeAt(index);
|
||||
galleryCurrent(true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionToggleCheckerboard_triggered()
|
||||
{
|
||||
// TODO: is that okay to do this since we plan to support custom shortcuts?
|
||||
m_graphicsView->toggleCheckerboard(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier));
|
||||
}
|
||||
|
||||
void MainWindow::on_actionRotateClockwise_triggered()
|
||||
{
|
||||
m_graphicsView->rotateView();
|
||||
m_graphicsView->displayScene();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionRotateCounterClockwise_triggered()
|
||||
{
|
||||
m_graphicsView->rotateView(false);
|
||||
m_graphicsView->displayScene();
|
||||
QClipboard *cb = QApplication::clipboard();
|
||||
cb->setText(m_pm->localFileByIndex(*index));
|
||||
}
|
||||
|
||||
void MainWindow::on_actionPrevPicture_triggered()
|
||||
@@ -839,24 +495,60 @@ void MainWindow::on_actionNextPicture_triggered()
|
||||
galleryNext();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionTogglePauseAnimation_triggered()
|
||||
void MainWindow::on_actionActualSize_triggered()
|
||||
{
|
||||
m_graphicsView->scene()->togglePauseAnimation();
|
||||
m_gv->resetScale();
|
||||
m_gv->setEnableAutoFitToScreen(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionAnimationNextFrame_triggered()
|
||||
void MainWindow::on_actionFitToScreen_triggered()
|
||||
{
|
||||
m_graphicsView->scene()->skipAnimationFrame(1);
|
||||
m_gv->fitInView(m_nav->sceneRect(), Qt::KeepAspectRatio);
|
||||
m_gv->setEnableAutoFitToScreen(m_gv->scaleFactor() <= 1);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionToggleStayOnTop_triggered()
|
||||
void MainWindow::on_actionFitByWidth_triggered()
|
||||
{
|
||||
toggleStayOnTop();
|
||||
m_gv->fitByOrientation(Qt::Orientation::Horizontal);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionToggleProtectMode_triggered()
|
||||
void MainWindow::on_actionFitByHeight_triggered()
|
||||
{
|
||||
toggleProtectedMode();
|
||||
m_gv->fitByOrientation(Qt::Orientation::Vertical);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionZoomIn_triggered()
|
||||
{
|
||||
if (m_gv->scaleFactor() < 1000) {
|
||||
m_gv->zoomView(1.25);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionZoomOut_triggered()
|
||||
{
|
||||
m_gv->zoomView(0.8);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFlipHorizontal_triggered()
|
||||
{
|
||||
m_gv->flipView(true);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFlipVertical_triggered()
|
||||
{
|
||||
m_gv->flipView(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionRotateClockwise_triggered()
|
||||
{
|
||||
m_gv->rotateView(true);
|
||||
m_gv->displayScene();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionRotateCounterClockwise_triggered()
|
||||
{
|
||||
m_gv->rotateView(false);
|
||||
m_gv->displayScene();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionToggleAvoidResetTransform_triggered()
|
||||
@@ -864,37 +556,48 @@ void MainWindow::on_actionToggleAvoidResetTransform_triggered()
|
||||
toggleAvoidResetTransform();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionSettings_triggered()
|
||||
void MainWindow::on_actionToggleCheckerboard_triggered()
|
||||
{
|
||||
SettingsDialog * sd = new SettingsDialog(this);
|
||||
sd->exec();
|
||||
sd->deleteLater();
|
||||
m_gv->toggleCheckerboard(QGuiApplication::queryKeyboardModifiers().testFlag(Qt::ShiftModifier));
|
||||
}
|
||||
|
||||
void MainWindow::on_actionHelp_triggered()
|
||||
void MainWindow::on_actionTogglePauseAnimation_triggered()
|
||||
{
|
||||
AboutDialog * ad = new AboutDialog(this);
|
||||
ad->exec();
|
||||
ad->deleteLater();
|
||||
m_gv->scene()->togglePauseAnimation();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionProperties_triggered()
|
||||
void MainWindow::on_actionAnimationNextFrame_triggered()
|
||||
{
|
||||
QUrl currentFileUrl = currentImageFileUrl();
|
||||
if (!currentFileUrl.isValid()) return;
|
||||
m_gv->scene()->skipAnimationFrame(1);
|
||||
}
|
||||
|
||||
MetadataModel * md = new MetadataModel();
|
||||
md->setFile(currentFileUrl.toLocalFile());
|
||||
void MainWindow::on_actionTrash_triggered()
|
||||
{
|
||||
auto index = m_pm->currentIndex();
|
||||
if (!index.has_value()) return;
|
||||
if (!m_pm->urlByIndex(*index).isLocalFile()) return;
|
||||
|
||||
MetadataDialog * ad = new MetadataDialog(this);
|
||||
ad->setMetadataModel(md);
|
||||
ad->exec();
|
||||
ad->deleteLater();
|
||||
QFile file(m_pm->localFileByIndex(*index));
|
||||
QFileInfo fileInfo(file.fileName());
|
||||
|
||||
QMessageBox::StandardButton result = QMessageBox::question(this, tr("Move to Trash"),
|
||||
tr("Are you sure you want to move \"%1\" to recycle bin?").arg(fileInfo.fileName()));
|
||||
if (result == QMessageBox::Yes) {
|
||||
bool succ = file.moveToTrash();
|
||||
if (!succ) {
|
||||
QMessageBox::warning(this, tr("Failed to move file to trash"),
|
||||
tr("Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation."));
|
||||
} else {
|
||||
m_pm->removeFromPlaylist(*index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionLocateInFileManager_triggered()
|
||||
{
|
||||
QUrl currentFileUrl = currentImageFileUrl();
|
||||
auto index = m_pm->currentIndex();
|
||||
if (!index.has_value()) return;
|
||||
QUrl currentFileUrl = m_pm->urlByIndex(*index);
|
||||
if (!currentFileUrl.isValid()) return;
|
||||
|
||||
QFileInfo fileInfo(currentFileUrl.toLocalFile());
|
||||
@@ -927,20 +630,38 @@ void MainWindow::on_actionLocateInFileManager_triggered()
|
||||
#endif // Q_OS_WIN
|
||||
}
|
||||
|
||||
void MainWindow::on_actionQuitApp_triggered()
|
||||
void MainWindow::on_actionProperties_triggered()
|
||||
{
|
||||
quitAppAction(false);
|
||||
auto index = m_pm->currentIndex();
|
||||
if (!index.has_value()) return;
|
||||
QUrl currentFileUrl = m_pm->urlByIndex(*index);
|
||||
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::doCloseWindow()
|
||||
void MainWindow::on_actionSettings_triggered()
|
||||
{
|
||||
#ifdef Q_OS_MAC
|
||||
this->hide();
|
||||
#else
|
||||
this->close();
|
||||
#endif
|
||||
SettingsDialog * sd = new SettingsDialog(this);
|
||||
sd->exec();
|
||||
sd->deleteLater();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionHelp_triggered()
|
||||
{
|
||||
AboutDialog * ad = new AboutDialog(this);
|
||||
ad->exec();
|
||||
ad->deleteLater();
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
bool MainWindow::updateFileWatcher(const QString &basePath)
|
||||
{
|
||||
m_fileSystemWatcher->removePaths(m_fileSystemWatcher->files());
|
||||
@@ -948,12 +669,6 @@ bool MainWindow::updateFileWatcher(const QString &basePath)
|
||||
return false;
|
||||
}
|
||||
|
||||
void MainWindow::updateGalleryButtonsVisibility()
|
||||
{
|
||||
const int galleryFileCount = m_pm->totalCount();
|
||||
const bool loopGallery = Settings::instance()->loopGallery();
|
||||
m_prevButton->setVisible(!m_protectedMode && galleryFileCount > 1);
|
||||
m_nextButton->setVisible(!m_protectedMode && galleryFileCount > 1);
|
||||
m_prevButton->setEnabled(loopGallery || !m_pm->isFirstIndex());
|
||||
m_nextButton->setEnabled(loopGallery || !m_pm->isLastIndex());
|
||||
void MainWindow::updateActionState() {
|
||||
m_am->updateActionState(m_pm, m_gv);
|
||||
}
|
||||
|
||||
+30
-54
@@ -5,25 +5,23 @@
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include "framelesswindow.h"
|
||||
|
||||
#include <QParallelAnimationGroup>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QPushButton>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsOpacityEffect;
|
||||
class QMenu;
|
||||
class QVBoxLayout;
|
||||
class QGraphicsView;
|
||||
class QFileSystemWatcher;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class ActionManager;
|
||||
class PlaylistManager;
|
||||
class ToolButton;
|
||||
class GraphicsView;
|
||||
class NavigatorView;
|
||||
class BottomButtonGroup;
|
||||
class MainWindow : public FramelessWindow
|
||||
class MainWindow : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@@ -31,25 +29,20 @@ public:
|
||||
explicit MainWindow(QWidget *parent = nullptr);
|
||||
~MainWindow() override;
|
||||
|
||||
void showUrls(const QList<QUrl> &urls);
|
||||
void showFiles(const QStringList& files);
|
||||
void showFiles(const QList<QUrl>& urls);
|
||||
void initWindowSize();
|
||||
void adjustWindowSizeBySceneRect();
|
||||
QUrl currentImageFileUrl() const;
|
||||
|
||||
void clearGallery();
|
||||
void galleryPrev();
|
||||
void galleryNext();
|
||||
void galleryCurrent(bool showLoadImageHintWhenEmpty, bool reloadImage);
|
||||
void galleryCurrent(bool fromFileWatcher);
|
||||
|
||||
static QStringList supportedImageFormats();
|
||||
|
||||
protected slots:
|
||||
void showEvent(QShowEvent *event) override;
|
||||
void enterEvent(QEnterEvent *event) override;
|
||||
void leaveEvent(QEvent *event) override;
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||
void mouseDoubleClickEvent(QMouseEvent *event) override;
|
||||
void wheelEvent(QWheelEvent *event) override;
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
@@ -61,12 +54,7 @@ protected slots:
|
||||
void centerWindow();
|
||||
void closeWindow();
|
||||
void updateWidgetsPosition();
|
||||
void toggleProtectedMode();
|
||||
void toggleStayOnTop();
|
||||
void toggleAvoidResetTransform();
|
||||
bool stayOnTop() const;
|
||||
bool canPaste() const;
|
||||
void quitAppAction(bool force = false);
|
||||
void toggleFullscreen();
|
||||
void toggleMaximize();
|
||||
|
||||
@@ -74,62 +62,50 @@ protected:
|
||||
QSize sizeHint() const override;
|
||||
|
||||
private slots:
|
||||
void on_actionOpen_triggered();
|
||||
|
||||
void on_actionActualSize_triggered();
|
||||
void on_actionToggleMaximize_triggered();
|
||||
void on_actionZoomIn_triggered();
|
||||
void on_actionZoomOut_triggered();
|
||||
void on_actionToggleCheckerboard_triggered();
|
||||
void on_actionRotateClockwise_triggered();
|
||||
void on_actionRotateCounterClockwise_triggered();
|
||||
void on_actionCopyPixmap_triggered();
|
||||
void on_actionCopyFilePath_triggered();
|
||||
|
||||
void on_actionPrevPicture_triggered();
|
||||
void on_actionNextPicture_triggered();
|
||||
|
||||
void on_actionActualSize_triggered();
|
||||
void on_actionFitToScreen_triggered();
|
||||
void on_actionFitByWidth_triggered();
|
||||
void on_actionFitByHeight_triggered();
|
||||
void on_actionZoomIn_triggered();
|
||||
void on_actionZoomOut_triggered();
|
||||
|
||||
void on_actionFlipHorizontal_triggered();
|
||||
void on_actionFlipVertical_triggered();
|
||||
void on_actionRotateClockwise_triggered();
|
||||
void on_actionRotateCounterClockwise_triggered();
|
||||
|
||||
void on_actionToggleAvoidResetTransform_triggered();
|
||||
void on_actionToggleCheckerboard_triggered();
|
||||
void on_actionTogglePauseAnimation_triggered();
|
||||
void on_actionAnimationNextFrame_triggered();
|
||||
|
||||
void on_actionHorizontalFlip_triggered();
|
||||
void on_actionFitInView_triggered();
|
||||
void on_actionFitByWidth_triggered();
|
||||
void on_actionFitLongImage_triggered();
|
||||
void on_actionCopyPixmap_triggered();
|
||||
void on_actionCopyFilePath_triggered();
|
||||
void on_actionPaste_triggered();
|
||||
void on_actionTrash_triggered();
|
||||
void on_actionToggleStayOnTop_triggered();
|
||||
void on_actionToggleProtectMode_triggered();
|
||||
void on_actionToggleAvoidResetTransform_triggered();
|
||||
void on_actionLocateInFileManager_triggered();
|
||||
void on_actionProperties_triggered();
|
||||
|
||||
void on_actionSettings_triggered();
|
||||
void on_actionHelp_triggered();
|
||||
void on_actionProperties_triggered();
|
||||
void on_actionLocateInFileManager_triggered();
|
||||
void on_actionQuitApp_triggered();
|
||||
|
||||
void doCloseWindow();
|
||||
|
||||
private:
|
||||
bool updateFileWatcher(const QString & basePath = QString());
|
||||
void updateGalleryButtonsVisibility();
|
||||
void updateActionState();
|
||||
|
||||
private:
|
||||
ActionManager *m_am;
|
||||
PlaylistManager *m_pm;
|
||||
GraphicsView *m_gv;
|
||||
NavigatorView *m_nav;
|
||||
|
||||
QPoint m_oldMousePos;
|
||||
QPropertyAnimation *m_fadeOutAnimation;
|
||||
QPropertyAnimation *m_floatUpAnimation;
|
||||
QParallelAnimationGroup *m_exitAnimationGroup;
|
||||
QMenu *m_menu;
|
||||
QVBoxLayout * m_centralLayout = nullptr;
|
||||
QFileSystemWatcher *m_fileSystemWatcher;
|
||||
ToolButton *m_closeButton;
|
||||
ToolButton *m_prevButton;
|
||||
ToolButton *m_nextButton;
|
||||
GraphicsView *m_graphicsView;
|
||||
NavigatorView *m_gv;
|
||||
BottomButtonGroup *m_bottomButtonGroup;
|
||||
bool m_protectedMode = false;
|
||||
bool m_clickedOnWindow = false;
|
||||
};
|
||||
|
||||
#endif // MAINWINDOW_H
|
||||
|
||||
+18
-15
@@ -3,12 +3,12 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "metadatadialog.h"
|
||||
#include "ui_metadatadialog.h"
|
||||
|
||||
#include <QDialogButtonBox>
|
||||
#include <QPainter>
|
||||
#include <QStyledItemDelegate>
|
||||
#include <QTreeView>
|
||||
#include <QVBoxLayout>
|
||||
#include <QHeaderView>
|
||||
|
||||
#include "metadatamodel.h"
|
||||
@@ -73,30 +73,33 @@ protected:
|
||||
};
|
||||
|
||||
MetadataDialog::MetadataDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_treeView(new PropertyTreeView(this))
|
||||
: QDialog(parent), ui(new QT_PREPEND_NAMESPACE(Ui::MetadataDialog))
|
||||
{
|
||||
ui->setupUi(this);
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
|
||||
// YYC MARK:
|
||||
// Because we use custom QTreeView and we do not want to expose it to public domain.
|
||||
// So I have to use this way as the compromise.
|
||||
|
||||
// Create our custom QTreeView and insert them
|
||||
m_treeView = new PropertyTreeView(this);
|
||||
auto* layout = ui->verticalLayout;
|
||||
const int index = layout->indexOf(ui->m_buttonBox);
|
||||
layout->insertWidget(index, m_treeView);
|
||||
|
||||
// Setup our custom QTreeView
|
||||
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);
|
||||
connect(ui->m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::close);
|
||||
}
|
||||
|
||||
MetadataDialog::~MetadataDialog()
|
||||
{
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void MetadataDialog::setMetadataModel(MetadataModel * model)
|
||||
|
||||
@@ -11,6 +11,12 @@ QT_BEGIN_NAMESPACE
|
||||
class QTreeView;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui {
|
||||
class MetadataDialog;
|
||||
}
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class MetadataModel;
|
||||
class MetadataDialog : public QDialog
|
||||
{
|
||||
@@ -25,6 +31,7 @@ public:
|
||||
|
||||
private:
|
||||
QTreeView * m_treeView = nullptr;
|
||||
QT_PREPEND_NAMESPACE(Ui::MetadataDialog) *ui;
|
||||
};
|
||||
|
||||
#endif // METADATADIALOG_H
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MetadataDialog</class>
|
||||
<widget class="QDialog" name="MetadataDialog">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::NonModal</enum>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Image Metadata</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="m_buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
+38
-9
@@ -5,8 +5,9 @@
|
||||
#include "navigatorview.h"
|
||||
|
||||
#include "graphicsview.h"
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QStyleHints>
|
||||
#include <QOperatingSystemVersion>
|
||||
#include <QMouseEvent>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
@@ -14,12 +15,12 @@
|
||||
NavigatorView::NavigatorView(QWidget *parent)
|
||||
: QGraphicsView (parent)
|
||||
, m_viewportRegion(this->rect())
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setStyleSheet("background-color: rgba(0, 0, 0, 120);"
|
||||
"border-radius: 3px;");
|
||||
|
||||
updateStyle(qGuiApp->styleHints()->colorScheme());
|
||||
connect(qGuiApp->styleHints(), &QStyleHints::colorSchemeChanged, this, &NavigatorView::updateStyle);
|
||||
}
|
||||
|
||||
// doesn't take or manage its ownership
|
||||
@@ -28,11 +29,6 @@ void NavigatorView::setMainView(GraphicsView *mainView)
|
||||
m_mainView = mainView;
|
||||
}
|
||||
|
||||
void NavigatorView::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
|
||||
void NavigatorView::updateMainViewportRegion()
|
||||
{
|
||||
// Use QTimer::singleShot with lambda to delay the update
|
||||
@@ -45,6 +41,39 @@ void NavigatorView::updateMainViewportRegion()
|
||||
});
|
||||
}
|
||||
|
||||
void NavigatorView::updateStyle(Qt::ColorScheme colorScheme) {
|
||||
// YYC MARK:
|
||||
// If we are using Windows 10 and lower system or Qt which do not support "Windows 11"
|
||||
// theme (lower than Qt 6.7), we should only support light mode.
|
||||
// Because Qt's dark-mode-aware "Windows 11" theme is only well-supported on Windows 11.
|
||||
#if defined(Q_OS_WIN)
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||
colorScheme = Qt::ColorScheme::Light;
|
||||
#else
|
||||
if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows11) {
|
||||
colorScheme = Qt::ColorScheme::Light;
|
||||
}
|
||||
#endif // QT_VERSION < QT_VERSION_CHECK(6, 7, 0)
|
||||
#endif // defined(Q_OS_WIN)
|
||||
|
||||
switch (colorScheme) {
|
||||
case Qt::ColorScheme::Dark:
|
||||
setStyleSheet(R"#(
|
||||
border-style: none;
|
||||
background-color: rgba(255, 255, 255, 70);
|
||||
)#");
|
||||
break;
|
||||
case Qt::ColorScheme::Light:
|
||||
case Qt::ColorScheme::Unknown:
|
||||
default:
|
||||
setStyleSheet(R"#(
|
||||
border-style: none;
|
||||
background-color: rgba(0, 0, 0, 70);
|
||||
)#");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void NavigatorView::mousePressEvent(QMouseEvent *event)
|
||||
{
|
||||
m_mouseDown = true;
|
||||
|
||||
+1
-3
@@ -7,7 +7,6 @@
|
||||
|
||||
#include <QGraphicsView>
|
||||
|
||||
class OpacityHelper;
|
||||
class GraphicsView;
|
||||
class NavigatorView : public QGraphicsView
|
||||
{
|
||||
@@ -16,10 +15,10 @@ public:
|
||||
NavigatorView(QWidget *parent = nullptr);
|
||||
|
||||
void setMainView(GraphicsView *mainView);
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
public slots:
|
||||
void updateMainViewportRegion();
|
||||
void updateStyle(Qt::ColorScheme colorScheme);
|
||||
|
||||
private:
|
||||
void mousePressEvent(QMouseEvent * event) override;
|
||||
@@ -32,7 +31,6 @@ private:
|
||||
bool m_mouseDown = false;
|
||||
QPolygon m_viewportRegion;
|
||||
QGraphicsView *m_mainView = nullptr;
|
||||
OpacityHelper *m_opacityHelper = nullptr;
|
||||
};
|
||||
|
||||
#endif // NAVIGATORVIEW_H
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
OpacityHelper::OpacityHelper(QWidget *parent)
|
||||
: QObject(parent)
|
||||
, m_opacityFx(new QGraphicsOpacityEffect(parent))
|
||||
, m_opacityAnimation(new QPropertyAnimation(m_opacityFx, "opacity"))
|
||||
{
|
||||
parent->setGraphicsEffect(m_opacityFx);
|
||||
|
||||
m_opacityAnimation->setDuration(300);
|
||||
}
|
||||
|
||||
void OpacityHelper::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
if (!animated) {
|
||||
m_opacityFx->setOpacity(opacity);
|
||||
return;
|
||||
}
|
||||
|
||||
m_opacityAnimation->stop();
|
||||
m_opacityAnimation->setStartValue(m_opacityFx->opacity());
|
||||
m_opacityAnimation->setEndValue(opacity);
|
||||
m_opacityAnimation->start();
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef OPACITYHELPER_H
|
||||
#define OPACITYHELPER_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsOpacityEffect;
|
||||
class QPropertyAnimation;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class OpacityHelper : QObject
|
||||
{
|
||||
public:
|
||||
OpacityHelper(QWidget * parent);
|
||||
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
protected:
|
||||
QGraphicsOpacityEffect * m_opacityFx;
|
||||
QPropertyAnimation * m_opacityAnimation;
|
||||
};
|
||||
|
||||
#endif // OPACITYHELPER_H
|
||||
+232
-201
@@ -9,152 +9,13 @@
|
||||
#include <QFileInfo>
|
||||
#include <QUrl>
|
||||
|
||||
PlaylistModel::PlaylistModel(QObject *parent)
|
||||
: QAbstractListModel(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
PlaylistModel::~PlaylistModel()
|
||||
= default;
|
||||
|
||||
void PlaylistModel::setPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
beginResetModel();
|
||||
m_playlist = urls;
|
||||
endResetModel();
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::loadPlaylist(const QList<QUrl> & urls)
|
||||
{
|
||||
if (urls.isEmpty()) return {};
|
||||
if (urls.count() == 1) {
|
||||
return loadPlaylist(urls.constFirst());
|
||||
} else {
|
||||
setPlaylist(urls);
|
||||
return index(0);
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::loadPlaylist(const QUrl &url)
|
||||
{
|
||||
QFileInfo info(url.toLocalFile());
|
||||
QDir dir(info.path());
|
||||
QString && currentFileName = info.fileName();
|
||||
|
||||
if (dir.path() == m_currentDir) {
|
||||
int idx = indexOf(url);
|
||||
return idx == -1 ? appendToPlaylist(url) : index(idx);
|
||||
}
|
||||
|
||||
QStringList entryList = dir.entryList(
|
||||
m_autoLoadSuffixes,
|
||||
QDir::Files | QDir::NoSymLinks, QDir::NoSort);
|
||||
|
||||
QCollator collator;
|
||||
collator.setNumericMode(true);
|
||||
|
||||
std::sort(entryList.begin(), entryList.end(), collator);
|
||||
|
||||
QList<QUrl> playlist;
|
||||
|
||||
int idx = -1;
|
||||
for (int i = 0; i < entryList.count(); i++) {
|
||||
const QString & fileName = entryList.at(i);
|
||||
const QString & oneEntry = dir.absoluteFilePath(fileName);
|
||||
const QUrl & url = QUrl::fromLocalFile(oneEntry);
|
||||
playlist.append(url);
|
||||
if (fileName == currentFileName) {
|
||||
idx = i;
|
||||
}
|
||||
}
|
||||
if (idx == -1) {
|
||||
idx = playlist.count();
|
||||
playlist.append(url);
|
||||
}
|
||||
m_currentDir = dir.path();
|
||||
|
||||
setPlaylist(playlist);
|
||||
|
||||
return index(idx);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistModel::appendToPlaylist(const QUrl &url)
|
||||
{
|
||||
const int lastIndex = rowCount();
|
||||
beginInsertRows(QModelIndex(), lastIndex, lastIndex);
|
||||
m_playlist.append(url);
|
||||
endInsertRows();
|
||||
return index(lastIndex);
|
||||
}
|
||||
|
||||
bool PlaylistModel::removeAt(int index)
|
||||
{
|
||||
if (index < 0 || index >= rowCount()) return false;
|
||||
beginRemoveRows(QModelIndex(), index, index);
|
||||
m_playlist.removeAt(index);
|
||||
endRemoveRows();
|
||||
return true;
|
||||
}
|
||||
|
||||
int PlaylistModel::indexOf(const QUrl &url) const
|
||||
{
|
||||
return m_playlist.indexOf(url);
|
||||
}
|
||||
|
||||
QUrl PlaylistModel::urlByIndex(int index) const
|
||||
{
|
||||
return m_playlist.value(index);
|
||||
}
|
||||
|
||||
QStringList PlaylistModel::autoLoadFilterSuffixes() const
|
||||
{
|
||||
return m_autoLoadSuffixes;
|
||||
}
|
||||
|
||||
QHash<int, QByteArray> PlaylistModel::roleNames() const
|
||||
{
|
||||
QHash<int, QByteArray> result = QAbstractListModel::roleNames();
|
||||
result.insert(UrlRole, "url");
|
||||
return result;
|
||||
}
|
||||
|
||||
int PlaylistModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return m_playlist.count();
|
||||
}
|
||||
|
||||
QVariant PlaylistModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid()) return {};
|
||||
|
||||
switch (role) {
|
||||
case Qt::DisplayRole:
|
||||
return m_playlist.at(index.row()).fileName();
|
||||
case UrlRole:
|
||||
return m_playlist.at(index.row());
|
||||
}
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
PlaylistManager::PlaylistManager(QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_currentIndex(std::nullopt)
|
||||
, m_playlist()
|
||||
, m_allowedSuffixes()
|
||||
{
|
||||
connect(&m_model, &PlaylistModel::rowsRemoved, this,
|
||||
[this](const QModelIndex &, int, int) {
|
||||
if (m_model.rowCount() <= m_currentIndex) {
|
||||
setProperty("currentIndex", m_currentIndex - 1);
|
||||
}
|
||||
});
|
||||
|
||||
auto onRowCountChanged = [this](){
|
||||
emit totalCountChanged(m_model.rowCount());
|
||||
};
|
||||
|
||||
connect(&m_model, &PlaylistModel::rowsInserted, this, onRowCountChanged);
|
||||
connect(&m_model, &PlaylistModel::rowsRemoved, this, onRowCountChanged);
|
||||
connect(&m_model, &PlaylistModel::modelReset, this, onRowCountChanged);
|
||||
}
|
||||
|
||||
PlaylistManager::~PlaylistManager()
|
||||
@@ -162,35 +23,106 @@ PlaylistManager::~PlaylistManager()
|
||||
|
||||
}
|
||||
|
||||
PlaylistModel *PlaylistManager::model()
|
||||
{
|
||||
return &m_model;
|
||||
// region: Allowed Suffixes Operations
|
||||
|
||||
const QStringList& PlaylistManager::allowedSuffixes() const {
|
||||
return m_allowedSuffixes;
|
||||
}
|
||||
|
||||
void PlaylistManager::setPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
m_model.setPlaylist(urls);
|
||||
void PlaylistManager::setAllowedSuffixes(const QStringList& nameFilters) {
|
||||
m_allowedSuffixes = nameFilters;
|
||||
emit allowedSuffixesChanged(m_allowedSuffixes);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadPlaylist(const QList<QUrl> &urls)
|
||||
{
|
||||
QModelIndex idx = m_model.loadPlaylist(urls);
|
||||
setProperty("currentIndex", idx.row());
|
||||
return idx;
|
||||
// endregion
|
||||
|
||||
// region: Playlist Loader and Reset
|
||||
|
||||
bool PlaylistManager::loadPlaylist(const QStringList& files) {
|
||||
// Convert string list to url list first
|
||||
QList<QUrl> urls;
|
||||
for (const QString & file : std::as_const(files)) {
|
||||
urls.append(urlFromString(file));
|
||||
}
|
||||
|
||||
return loadPlaylist(urls);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadPlaylist(const QUrl &url)
|
||||
{
|
||||
QModelIndex idx = m_model.loadPlaylist(url);
|
||||
setProperty("currentIndex", idx.row());
|
||||
return idx;
|
||||
bool PlaylistManager::loadPlaylist(const QList<QUrl>& urls) {
|
||||
// Check its count, and check M3U8 playlist for single file case.
|
||||
if (urls.isEmpty()) {
|
||||
clearPlaylist();
|
||||
return true;
|
||||
} else if (urls.count() == 1) {
|
||||
const QUrl& firstUrl = urls.first();
|
||||
const QString lowerCaseUrlPath(firstUrl.path().toLower());
|
||||
if (lowerCaseUrlPath.endsWith(".m3u8") || lowerCaseUrlPath.endsWith(".m3u")) {
|
||||
return loadM3U8Playlist(firstUrl);
|
||||
} else {
|
||||
return loadSingleFilePlaylist(firstUrl);
|
||||
}
|
||||
} else {
|
||||
return loadMultipleFilesPlaylist(std::move(urls));
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadM3U8Playlist(const QUrl &url)
|
||||
{
|
||||
bool PlaylistManager::loadSingleFilePlaylist(const QUrl& url) {
|
||||
// Check URL at first
|
||||
if (!checkUrl(url))
|
||||
return false;
|
||||
|
||||
QFileInfo info(url.toLocalFile());
|
||||
QDir dir(info.path());
|
||||
QString currentFileName = info.fileName();
|
||||
|
||||
QStringList entryList = dir.entryList(
|
||||
m_allowedSuffixes, QDir::Files | QDir::NoSymLinks, QDir::NoSort);
|
||||
|
||||
QCollator collator;
|
||||
collator.setNumericMode(true);
|
||||
|
||||
std::sort(entryList.begin(), entryList.end(), collator);
|
||||
|
||||
QList<QUrl> playlist;
|
||||
std::optional<qsizetype> idx = std::nullopt;
|
||||
for (qsizetype i = 0; i < entryList.count(); i++) {
|
||||
const QString &fileName = entryList.at(i);
|
||||
const QString &oneEntry = dir.absoluteFilePath(fileName);
|
||||
const QUrl &url = QUrl::fromLocalFile(oneEntry);
|
||||
if (!checkUrl(url)) {
|
||||
return false;
|
||||
}
|
||||
playlist.append(url);
|
||||
if (fileName == currentFileName) {
|
||||
idx = i;
|
||||
}
|
||||
}
|
||||
|
||||
setPlaylist(std::move(playlist), idx);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PlaylistManager::loadMultipleFilesPlaylist(const QList<QUrl>&& urls) {
|
||||
// Check all of them are valid
|
||||
for (const auto& url : std::as_const(urls)) {
|
||||
if (!checkUrl(url)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Set playlist and return
|
||||
setPlaylist(std::move(urls));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool PlaylistManager::loadM3U8Playlist(const QUrl& url) {
|
||||
// Check URL at first
|
||||
if (!checkUrl(url))
|
||||
return false;
|
||||
|
||||
QList<QUrl> urls;
|
||||
QFile file(url.toLocalFile());
|
||||
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
QList<QUrl> urls;
|
||||
while (!file.atEnd()) {
|
||||
QString line = file.readLine();
|
||||
if (line.startsWith('#')) {
|
||||
@@ -198,86 +130,185 @@ QModelIndex PlaylistManager::loadM3U8Playlist(const QUrl &url)
|
||||
}
|
||||
QFileInfo fileInfo(file);
|
||||
QUrl item = QUrl::fromUserInput(line, fileInfo.absolutePath());
|
||||
if (!checkUrl(item)) {
|
||||
return false;
|
||||
}
|
||||
urls.append(item);
|
||||
}
|
||||
return loadPlaylist(urls);
|
||||
} else {
|
||||
return {};
|
||||
return false;
|
||||
}
|
||||
|
||||
setPlaylist(std::move(urls));
|
||||
return true;
|
||||
}
|
||||
|
||||
void PlaylistManager::setPlaylist(const QList<QUrl>&& urls, std::optional<qsizetype> indexHint) {
|
||||
// Setup playlist
|
||||
m_playlist = std::move(urls);
|
||||
|
||||
// Set index with hint
|
||||
if (indexHint.has_value()) {
|
||||
m_currentIndex = *indexHint;
|
||||
}
|
||||
sanitizeIndex();
|
||||
|
||||
// Raise signal
|
||||
emit playlistChanged(totalCount());
|
||||
}
|
||||
|
||||
void PlaylistManager::clearPlaylist() {
|
||||
m_playlist.clear();
|
||||
sanitizeIndex();
|
||||
emit playlistChanged(this->totalCount());
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
// region: Playlist Operations
|
||||
|
||||
void PlaylistManager::appendToPlaylist(const QString &file)
|
||||
{
|
||||
return appendToPlaylist(urlFromString(file));
|
||||
}
|
||||
|
||||
void PlaylistManager::appendToPlaylist(const QUrl &url)
|
||||
{
|
||||
m_playlist.append(url);
|
||||
sanitizeIndex();
|
||||
emit playlistChanged(totalCount());
|
||||
}
|
||||
|
||||
bool PlaylistManager::insertIntoPlaylist(qsizetype index, const QString &file)
|
||||
{
|
||||
return insertIntoPlaylist(index, urlFromString(file));
|
||||
}
|
||||
|
||||
bool PlaylistManager::insertIntoPlaylist(qsizetype index, const QUrl &url)
|
||||
{
|
||||
if (index < 0 || index > totalCount()) {
|
||||
return false;
|
||||
} else {
|
||||
m_playlist.insert(index, url);
|
||||
sanitizeIndex();
|
||||
emit playlistChanged(totalCount());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
int PlaylistManager::totalCount() const
|
||||
bool PlaylistManager::removeFromPlaylist(qsizetype index)
|
||||
{
|
||||
return m_model.rowCount();
|
||||
if (index < 0 || index >= totalCount()) {
|
||||
return false;
|
||||
} else {
|
||||
m_playlist.removeAt(index);
|
||||
sanitizeIndex();
|
||||
emit playlistChanged(totalCount());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::previousIndex() const
|
||||
{
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
// endregion
|
||||
|
||||
return m_model.index(isFirstIndex() ? count - 1 : m_currentIndex - 1);
|
||||
// region: Index Operations
|
||||
|
||||
qsizetype PlaylistManager::totalCount() const
|
||||
{
|
||||
return m_playlist.count();
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::nextIndex() const
|
||||
std::optional<qsizetype> PlaylistManager::previousIndex() const
|
||||
{
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
|
||||
return m_model.index(isLastIndex() ? 0 : m_currentIndex + 1);
|
||||
if (!m_currentIndex.has_value() || totalCount() <= 0) return std::nullopt;
|
||||
return (isFirstIndex() ? totalCount() - 1 : *m_currentIndex - 1);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::curIndex() const
|
||||
std::optional<qsizetype> PlaylistManager::nextIndex() const
|
||||
{
|
||||
return m_model.index(m_currentIndex);
|
||||
if (!m_currentIndex.has_value() || totalCount() <= 0) return std::nullopt;
|
||||
return (isLastIndex() ? 0 : *m_currentIndex + 1);
|
||||
}
|
||||
|
||||
bool PlaylistManager::isFirstIndex() const
|
||||
{
|
||||
return m_currentIndex == 0;
|
||||
return m_currentIndex.has_value() && *m_currentIndex == 0;
|
||||
}
|
||||
|
||||
bool PlaylistManager::isLastIndex() const
|
||||
{
|
||||
return m_currentIndex + 1 == totalCount();
|
||||
return m_currentIndex.has_value() && *m_currentIndex + 1 == totalCount();
|
||||
}
|
||||
|
||||
void PlaylistManager::setCurrentIndex(const QModelIndex &index)
|
||||
std::optional<qsizetype> PlaylistManager::currentIndex() const
|
||||
{
|
||||
if (index.isValid() && index.row() >= 0 && index.row() < totalCount()) {
|
||||
setProperty("currentIndex", index.row());
|
||||
return m_currentIndex;
|
||||
}
|
||||
|
||||
bool PlaylistManager::setCurrentIndex(qsizetype index)
|
||||
{
|
||||
if (!m_currentIndex.has_value()) {
|
||||
return false;
|
||||
}
|
||||
if (index < 0 || index >= totalCount()) {
|
||||
return false;
|
||||
}
|
||||
if (*m_currentIndex == index) {
|
||||
return true;
|
||||
}
|
||||
|
||||
m_currentIndex = index;
|
||||
emit currentIndexChanged(index);
|
||||
return true;
|
||||
}
|
||||
|
||||
QUrl PlaylistManager::urlByIndex(const QModelIndex &index)
|
||||
QUrl PlaylistManager::urlByIndex(qsizetype index) const
|
||||
{
|
||||
return m_model.urlByIndex(index.row());
|
||||
return m_playlist.value(index);
|
||||
}
|
||||
|
||||
QString PlaylistManager::localFileByIndex(const QModelIndex &index)
|
||||
QString PlaylistManager::localFileByIndex(qsizetype index) const
|
||||
{
|
||||
return urlByIndex(index).toLocalFile();
|
||||
}
|
||||
|
||||
bool PlaylistManager::removeAt(const QModelIndex &index)
|
||||
{
|
||||
return m_model.removeAt(index.row());
|
||||
}
|
||||
// endregion
|
||||
|
||||
void PlaylistManager::setAutoLoadFilterSuffixes(const QStringList &nameFilters)
|
||||
{
|
||||
m_model.setProperty("autoLoadFilterSuffixes", nameFilters);
|
||||
}
|
||||
// region: Misc
|
||||
|
||||
QList<QUrl> PlaylistManager::convertToUrlList(const QStringList &files)
|
||||
void PlaylistManager::sanitizeIndex()
|
||||
{
|
||||
QList<QUrl> urlList;
|
||||
for (const QString & str : std::as_const(files)) {
|
||||
QUrl url = QUrl::fromLocalFile(str);
|
||||
if (url.isValid()) {
|
||||
urlList.append(url);
|
||||
auto cnt = totalCount();
|
||||
if (cnt == 0) {
|
||||
// If playlist is empty, current index should be invalid.
|
||||
m_currentIndex = std::nullopt;
|
||||
} else {
|
||||
if (m_currentIndex.has_value()) {
|
||||
// Clamp current index in playlist range.
|
||||
// If it is already in range, not change was done.
|
||||
auto currentIndex = *m_currentIndex;
|
||||
if (currentIndex < 0) {
|
||||
m_currentIndex = 0;
|
||||
} else if (currentIndex >= cnt) {
|
||||
m_currentIndex = cnt - 1;
|
||||
} else {
|
||||
; // No change.
|
||||
}
|
||||
} else {
|
||||
// If there is no set value for current index,
|
||||
// set it at the beginning of playlist.
|
||||
m_currentIndex = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return urlList;
|
||||
}
|
||||
|
||||
bool PlaylistManager::checkUrl(const QUrl& url)
|
||||
{
|
||||
return url.isValid() && url.isLocalFile();
|
||||
}
|
||||
|
||||
QUrl PlaylistManager::urlFromString(const QString& file)
|
||||
{
|
||||
return QUrl::fromLocalFile(file);
|
||||
}
|
||||
|
||||
// endregion
|
||||
|
||||
+107
-65
@@ -5,84 +5,126 @@
|
||||
#pragma once
|
||||
|
||||
#include <QUrl>
|
||||
#include <QAbstractListModel>
|
||||
|
||||
class PlaylistModel : public QAbstractListModel
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum PlaylistRole {
|
||||
UrlRole = Qt::UserRole
|
||||
};
|
||||
Q_ENUM(PlaylistRole)
|
||||
Q_PROPERTY(QStringList autoLoadFilterSuffixes MEMBER m_autoLoadSuffixes NOTIFY autoLoadFilterSuffixesChanged)
|
||||
|
||||
explicit PlaylistModel(QObject *parent = nullptr);
|
||||
~PlaylistModel() override;
|
||||
|
||||
void setPlaylist(const QList<QUrl> & urls);
|
||||
QModelIndex loadPlaylist(const QList<QUrl> & urls);
|
||||
QModelIndex loadPlaylist(const QUrl & url);
|
||||
QModelIndex appendToPlaylist(const QUrl & url);
|
||||
bool removeAt(int index);
|
||||
int indexOf(const QUrl & url) const;
|
||||
QUrl urlByIndex(int index) const;
|
||||
QStringList autoLoadFilterSuffixes() const;
|
||||
|
||||
QHash<int, QByteArray> roleNames() const override;
|
||||
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
|
||||
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
|
||||
|
||||
signals:
|
||||
void autoLoadFilterSuffixesChanged(QStringList suffixes);
|
||||
|
||||
private:
|
||||
// model data
|
||||
QList<QUrl> m_playlist;
|
||||
// properties
|
||||
QStringList m_autoLoadSuffixes = {};
|
||||
// internal
|
||||
QString m_currentDir;
|
||||
};
|
||||
#include <QObject>
|
||||
#include <optional>
|
||||
|
||||
/// The manager of playlist.
|
||||
class PlaylistManager : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
Q_PROPERTY(int currentIndex MEMBER m_currentIndex NOTIFY currentIndexChanged)
|
||||
Q_PROPERTY(QStringList autoLoadFilterSuffixes WRITE setAutoLoadFilterSuffixes)
|
||||
Q_PROPERTY(PlaylistModel * model READ model CONSTANT)
|
||||
|
||||
explicit PlaylistManager(QObject *parent = nullptr);
|
||||
/// Constructs a PlaylistManager with an optional parent QObject.
|
||||
explicit PlaylistManager(QObject* parent = nullptr);
|
||||
/// Destructor.
|
||||
~PlaylistManager();
|
||||
|
||||
PlaylistModel * model();
|
||||
/// Get the allowed file suffixes of this playlist.
|
||||
/// @return The current list of allowed suffixes.
|
||||
const QStringList& allowedSuffixes() const;
|
||||
/// Set the allowed file suffixes of this playlist.
|
||||
/// @remark This only works for "load the whole directory by one file" case.
|
||||
/// @param[in] nameFilters The new list of allowed suffixes.
|
||||
void setAllowedSuffixes(const QStringList& nameFilters);
|
||||
|
||||
void setPlaylist(const QList<QUrl> & url);
|
||||
Q_INVOKABLE QModelIndex loadPlaylist(const QList<QUrl> & urls);
|
||||
Q_INVOKABLE QModelIndex loadPlaylist(const QUrl & url);
|
||||
Q_INVOKABLE QModelIndex loadM3U8Playlist(const QUrl & url);
|
||||
/// Load user specified files as playlist.
|
||||
/// @remark The wrapper for another overload.
|
||||
/// @return True for successful load, otherwise false.
|
||||
bool loadPlaylist(const QStringList& files);
|
||||
/// Load user specified URLs as playlist.
|
||||
/// @remark This function automatically dispatch these files into correct sub-load functions.
|
||||
/// @return True for successful load, otherwise false.
|
||||
bool loadPlaylist(const QList<QUrl>& urls);
|
||||
/// Clear the entire playlist and reset current index.
|
||||
void clearPlaylist();
|
||||
|
||||
int totalCount() const;
|
||||
QModelIndex previousIndex() const;
|
||||
QModelIndex nextIndex() const;
|
||||
QModelIndex curIndex() const;
|
||||
/// Append a local file path to the playlist.
|
||||
void appendToPlaylist(const QString& file);
|
||||
/// Append a URL to the playlist.
|
||||
void appendToPlaylist(const QUrl& url);
|
||||
/// Insert a local file path at the given index.
|
||||
/// @return True if inserted successfully, false if index is out of range.
|
||||
bool insertIntoPlaylist(qsizetype index, const QString& file);
|
||||
/// Insert a URL at the given index.
|
||||
/// @return True if inserted successfully, false if index is out of range.
|
||||
bool insertIntoPlaylist(qsizetype index, const QUrl& url);
|
||||
/// Remove the entry at the given index.
|
||||
/// @return True if removed successfully, false if index is out of range.
|
||||
bool removeFromPlaylist(qsizetype index);
|
||||
|
||||
/// Returns the total number of items in the playlist.
|
||||
/// @return Total count of entries in the playlist.
|
||||
qsizetype totalCount() const;
|
||||
/// Try fetching previous index.
|
||||
/// @details This previous index is gallery-loop-aware.
|
||||
/// @return std::nullopt if playlist is empty, otherwise the previous index considering gallery loop.
|
||||
std::optional<qsizetype> previousIndex() const;
|
||||
/// Try fetching next index.
|
||||
/// @details This next index is gallery-loop-aware.
|
||||
/// @return std::nullopt if playlist is empty, otherwise the next index considering gallery loop.
|
||||
std::optional<qsizetype> nextIndex() const;
|
||||
/// Check whether current index is the first index.
|
||||
/// @return False if current index is not the first index or playlist is empty, otherwise true.
|
||||
bool isFirstIndex() const;
|
||||
/// Check whether current index is the last index.
|
||||
/// @return False if current index is not the last index or playlist is empty, otherwise true.
|
||||
bool isLastIndex() const;
|
||||
void setCurrentIndex(const QModelIndex & index);
|
||||
QUrl urlByIndex(const QModelIndex & index);
|
||||
QString localFileByIndex(const QModelIndex & index);
|
||||
bool removeAt(const QModelIndex & index);
|
||||
|
||||
void setAutoLoadFilterSuffixes(const QStringList &nameFilters);
|
||||
|
||||
static QList<QUrl> convertToUrlList(const QStringList & files);
|
||||
/// Returns the current index.
|
||||
/// @return std::nullopt if the playlist is empty, otherwise the current index.
|
||||
std::optional<qsizetype> currentIndex() const;
|
||||
/// Set the current index.
|
||||
/// @remark Index only can be set when playlist is not empty.
|
||||
/// @return True if successful set, including "not changed" set, otherwise false.
|
||||
/// This return value only indicates whether we can set index and given index is valid for setting.
|
||||
/// If "no changed" set occurs, this function returns true, but doesn't raise current index changed signal.
|
||||
bool setCurrentIndex(qsizetype index);
|
||||
/// Returns the URL at the given index.
|
||||
/// @return The URL if index is valid.
|
||||
/// This class guarantee that this QUrl is pointing to a local file.
|
||||
QUrl urlByIndex(qsizetype index) const;
|
||||
/// Returns the local file path at the given index.
|
||||
/// @return The local file path if index is valid.
|
||||
/// This class guarantee that local file path always is valid.
|
||||
QString localFileByIndex(qsizetype index) const;
|
||||
|
||||
signals:
|
||||
void currentIndexChanged(int index);
|
||||
void totalCountChanged(int count);
|
||||
void allowedSuffixesChanged(const QStringList& suffixes);
|
||||
/// Raised when index was changed bu setter.
|
||||
/// The argument holds the new current index.
|
||||
/// Please note that this signal will NOT be raised by the whole playlist change caused index change.
|
||||
void currentIndexChanged(qsizetype index);
|
||||
/// The whole playlist was changed, involving loading, editing and deleting some or full entries.
|
||||
/// The argument holds the total count of new play list.
|
||||
void playlistChanged(qsizetype count);
|
||||
|
||||
private:
|
||||
int m_currentIndex = -1;
|
||||
PlaylistModel m_model;
|
||||
/// The fundamental playlist setter.
|
||||
/// @details All playlist load functions will call this function to set playlist at last.
|
||||
/// @param[in] urls ALl urls in this list should be checked by checkUrl() function.
|
||||
/// @param[in] indexHint Try to set current index to this index if possible.
|
||||
void setPlaylist(const QList<QUrl>&& urls, std::optional<qsizetype> indexHint = std::nullopt);
|
||||
/// Load playlist from a single file.
|
||||
/// @details This function scans the same directory for siblings matching allowed suffixes, sorted naturally.
|
||||
/// @return True if the playlist was loaded successfully, false otherwise.
|
||||
bool loadSingleFilePlaylist(const QUrl& url);
|
||||
/// Load playlist from multiple URLs directly.
|
||||
/// @return True if all URLs are valid, false otherwise.
|
||||
bool loadMultipleFilesPlaylist(const QList<QUrl>&& urls);
|
||||
/// Load playlist from an M3U/M3U8 playlist file.
|
||||
/// @return True if loaded successfully, false otherwise.
|
||||
bool loadM3U8Playlist(const QUrl& url);
|
||||
|
||||
/// Make sure that current index is valid.
|
||||
/// @details This function usually is used by those functions manipulating playlist.
|
||||
void sanitizeIndex();
|
||||
|
||||
/// Check whether given QUrl is proper to be put into playlist.
|
||||
/// @details Only the url pointing to local file can be put into playlist.
|
||||
static bool checkUrl(const QUrl& url);
|
||||
/// Convert a string to local file into a QUrl.
|
||||
/// @param[in] file The string pointing to local file.
|
||||
static QUrl urlFromString(const QString& file);
|
||||
|
||||
std::optional<qsizetype> m_currentIndex;
|
||||
QList<QUrl> m_playlist;
|
||||
QStringList m_allowedSuffixes;
|
||||
};
|
||||
|
||||
+16
-97
@@ -13,6 +13,14 @@
|
||||
#include <QKeySequence>
|
||||
#include <QMetaEnum>
|
||||
|
||||
Settings *Settings::instance()
|
||||
{
|
||||
// SAFETY:
|
||||
// This is a global singleton and it is leaked by design.
|
||||
static Settings* INSTANCE = new Settings(nullptr);
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
namespace QEnumHelper
|
||||
{
|
||||
template <typename E>
|
||||
@@ -34,27 +42,6 @@ namespace QEnumHelper
|
||||
}
|
||||
}
|
||||
|
||||
Settings *Settings::m_settings_instance = nullptr;
|
||||
|
||||
Settings *Settings::instance()
|
||||
{
|
||||
if (!m_settings_instance) {
|
||||
m_settings_instance = new Settings;
|
||||
}
|
||||
|
||||
return m_settings_instance;
|
||||
}
|
||||
|
||||
bool Settings::stayOnTop() const
|
||||
{
|
||||
return m_qsettings->value("stay_on_top", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::useBuiltInCloseAnimation() const
|
||||
{
|
||||
return m_qsettings->value("use_built_in_close_animation", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::useLightCheckerboard() const
|
||||
{
|
||||
return m_qsettings->value("use_light_checkerboard", false).toBool();
|
||||
@@ -65,11 +52,6 @@ bool Settings::loopGallery() const
|
||||
return m_qsettings->value("loop_gallery", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::autoLongImageMode() const
|
||||
{
|
||||
return m_qsettings->value("auto_long_image_mode", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::svgTiny12Only() const
|
||||
{
|
||||
// Qt 6.7.0's SVG support is terrible caused by huge memory usage, see QTBUG-124287
|
||||
@@ -85,44 +67,28 @@ bool Settings::svgTiny12Only() const
|
||||
|
||||
Settings::DoubleClickBehavior Settings::doubleClickBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("double_click_behavior", "Close").toString();
|
||||
|
||||
return QEnumHelper::fromString<DoubleClickBehavior>(result, DoubleClickBehavior::Close);
|
||||
QString result = m_qsettings->value("double_click_behavior", "").toString();
|
||||
return QEnumHelper::fromString<DoubleClickBehavior>(result, DoubleClickBehavior::Ignore);
|
||||
}
|
||||
|
||||
Settings::MouseWheelBehavior Settings::mouseWheelBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("mouse_wheel_behavior", "Zoom").toString();
|
||||
|
||||
QString result = m_qsettings->value("mouse_wheel_behavior", "").toString();
|
||||
return QEnumHelper::fromString<MouseWheelBehavior>(result, MouseWheelBehavior::Zoom);
|
||||
}
|
||||
|
||||
Settings::WindowSizeBehavior Settings::initWindowSizeBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("init_window_size_behavior", "Auto").toString();
|
||||
|
||||
return QEnumHelper::fromString<WindowSizeBehavior>(result, WindowSizeBehavior::Auto);
|
||||
QString result = m_qsettings->value("init_window_size_behavior", "").toString();
|
||||
return QEnumHelper::fromString<WindowSizeBehavior>(result, WindowSizeBehavior::Windowed);
|
||||
}
|
||||
|
||||
Qt::HighDpiScaleFactorRoundingPolicy Settings::hiDpiScaleFactorBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("hidpi_scale_factor_behavior", "PassThrough").toString();
|
||||
|
||||
QString result = m_qsettings->value("hidpi_scale_factor_behavior", "").toString();
|
||||
return QEnumHelper::fromString<Qt::HighDpiScaleFactorRoundingPolicy>(result, Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
|
||||
}
|
||||
|
||||
void Settings::setStayOnTop(bool on)
|
||||
{
|
||||
m_qsettings->setValue("stay_on_top", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setUseBuiltInCloseAnimation(bool on)
|
||||
{
|
||||
m_qsettings->setValue("use_built_in_close_animation", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setUseLightCheckerboard(bool light)
|
||||
{
|
||||
m_qsettings->setValue("use_light_checkerboard", light);
|
||||
@@ -135,12 +101,6 @@ void Settings::setLoopGallery(bool on)
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setAutoLongImageMode(bool on)
|
||||
{
|
||||
m_qsettings->setValue("auto_long_image_mode", on);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setSvgTiny12Only(bool on)
|
||||
{
|
||||
m_qsettings->setValue("svg_tiny12_only", on);
|
||||
@@ -171,47 +131,6 @@ void Settings::setHiDpiScaleFactorBehavior(Qt::HighDpiScaleFactorRoundingPolicy
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::applyUserShortcuts(QWidget *widget)
|
||||
{
|
||||
m_qsettings->beginGroup("shortcuts");
|
||||
const QStringList shortcutNames = m_qsettings->allKeys();
|
||||
for (const QString & name : shortcutNames) {
|
||||
QList<QKeySequence> shortcuts = m_qsettings->value(name).value<QList<QKeySequence>>();
|
||||
setShortcutsForAction(widget, name, shortcuts, false);
|
||||
}
|
||||
m_qsettings->endGroup();
|
||||
}
|
||||
|
||||
bool Settings::setShortcutsForAction(QWidget *widget, const QString &objectName,
|
||||
QList<QKeySequence> shortcuts, bool writeConfig)
|
||||
{
|
||||
QAction * targetAction = nullptr;
|
||||
for (QAction * action : widget->actions()) {
|
||||
if (action->objectName() == objectName) {
|
||||
targetAction = action;
|
||||
} else {
|
||||
for (const QKeySequence & shortcut : std::as_const(shortcuts)) {
|
||||
if (action->shortcuts().contains(shortcut)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (targetAction) {
|
||||
targetAction->setShortcuts(shortcuts);
|
||||
}
|
||||
|
||||
if (targetAction && writeConfig) {
|
||||
m_qsettings->beginGroup("shortcuts");
|
||||
m_qsettings->setValue(objectName, QVariant::fromValue(shortcuts));
|
||||
m_qsettings->endGroup();
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#if defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
#include <windows.h>
|
||||
// QCoreApplication::applicationDirPath() parses the "applicationDirPath" from arg0, which...
|
||||
@@ -230,8 +149,8 @@ QString getApplicationDirPath()
|
||||
}
|
||||
#endif // defined(FLAG_PORTABLE_MODE_SUPPORT) && defined(Q_OS_WIN)
|
||||
|
||||
Settings::Settings()
|
||||
: QObject(qApp)
|
||||
Settings::Settings(QObject *parent)
|
||||
: QObject(parent)
|
||||
{
|
||||
QString configPath;
|
||||
|
||||
|
||||
+2
-13
@@ -25,6 +25,7 @@ public:
|
||||
};
|
||||
Q_ENUM(MouseWheelBehavior)
|
||||
|
||||
// TODO: I want to remove Auto behavior in future.
|
||||
enum WindowSizeBehavior {
|
||||
Auto,
|
||||
Maximized,
|
||||
@@ -34,36 +35,24 @@ public:
|
||||
|
||||
static Settings *instance();
|
||||
|
||||
bool stayOnTop() const;
|
||||
bool useBuiltInCloseAnimation() const;
|
||||
bool useLightCheckerboard() const;
|
||||
bool loopGallery() const;
|
||||
bool autoLongImageMode() const;
|
||||
bool svgTiny12Only() const;
|
||||
DoubleClickBehavior doubleClickBehavior() const;
|
||||
MouseWheelBehavior mouseWheelBehavior() const;
|
||||
WindowSizeBehavior initWindowSizeBehavior() const;
|
||||
Qt::HighDpiScaleFactorRoundingPolicy hiDpiScaleFactorBehavior() const;
|
||||
|
||||
void setStayOnTop(bool on);
|
||||
void setUseBuiltInCloseAnimation(bool on);
|
||||
void setUseLightCheckerboard(bool light);
|
||||
void setLoopGallery(bool on);
|
||||
void setAutoLongImageMode(bool on);
|
||||
void setSvgTiny12Only(bool on);
|
||||
void setDoubleClickBehavior(DoubleClickBehavior dcb);
|
||||
void setMouseWheelBehavior(MouseWheelBehavior mwb);
|
||||
void setInitWindowSizeBehavior(WindowSizeBehavior wsb);
|
||||
void setHiDpiScaleFactorBehavior(Qt::HighDpiScaleFactorRoundingPolicy hidpi);
|
||||
|
||||
void applyUserShortcuts(QWidget * widget);
|
||||
bool setShortcutsForAction(QWidget * widget, const QString & objectName,
|
||||
QList<QKeySequence> shortcuts, bool writeConfig = true);
|
||||
|
||||
private:
|
||||
Settings();
|
||||
|
||||
static Settings *m_settings_instance;
|
||||
Settings(QObject *parent = nullptr);
|
||||
|
||||
QSettings *m_qsettings;
|
||||
|
||||
|
||||
+113
-170
@@ -3,158 +3,107 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "settingsdialog.h"
|
||||
#include "ui_settingsdialog.h"
|
||||
|
||||
#include "settings.h"
|
||||
#include "shortcutedit.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QCheckBox>
|
||||
#include <QComboBox>
|
||||
#include <QFormLayout>
|
||||
#include <QKeySequenceEdit>
|
||||
#include <QScrollArea>
|
||||
#include <QSplitter>
|
||||
#include <QApplication>
|
||||
#include <QTimer>
|
||||
#include <QStringListModel>
|
||||
#include <QMessageBox>
|
||||
#include <type_traits>
|
||||
|
||||
template <typename E, typename = std::enable_if_t<std::is_enum_v<E>>>
|
||||
class EnumComboBoxTransformer {
|
||||
public:
|
||||
using Pair = QPair<E, QString>;
|
||||
using Pairs = QList<QPair<E, QString>>;
|
||||
|
||||
EnumComboBoxTransformer(Pairs &&pairs) : pairs(std::move(pairs)) {}
|
||||
~EnumComboBoxTransformer() = default;
|
||||
Q_DISABLE_COPY_MOVE(EnumComboBoxTransformer)
|
||||
|
||||
/// Build Qt model used for QComboBox
|
||||
QStringListModel* buildComboBoxModel(QObject *parent = nullptr) const {
|
||||
QStringList dropDownEntries;
|
||||
for (const auto& pair : std::as_const(this->pairs)) {
|
||||
dropDownEntries.append(pair.second);
|
||||
}
|
||||
return new QStringListModel(dropDownEntries, parent);
|
||||
}
|
||||
/// Convert QComboBox index to enum value.
|
||||
E to_value(int index) const {
|
||||
return this->pairs.at(static_cast<qsizetype>(index)).first;
|
||||
}
|
||||
/// Convert enum value to QComboBox index.
|
||||
int to_index(E value) const {
|
||||
for (qsizetype i = 0; i < pairs.size(); ++i) {
|
||||
if (pairs.at(i).first == value) {
|
||||
return static_cast<int>(i);
|
||||
}
|
||||
}
|
||||
// Value not found
|
||||
throw std::invalid_argument("invalid enum value for finding index");
|
||||
}
|
||||
|
||||
private:
|
||||
Pairs pairs;
|
||||
};
|
||||
|
||||
static EnumComboBoxTransformer<Settings::DoubleClickBehavior> DC_OPTIONS {
|
||||
{
|
||||
{Settings::DoubleClickBehavior::Ignore, QCoreApplication::translate("SettingsDialog", "Do nothing")},
|
||||
{Settings::DoubleClickBehavior::Close, QCoreApplication::translate("SettingsDialog", "Close the window")},
|
||||
{Settings::DoubleClickBehavior::Maximize, QCoreApplication::translate("SettingsDialog", "Toggle maximize")},
|
||||
{Settings::DoubleClickBehavior::FullScreen, QCoreApplication::translate("SettingsDialog", "Toggle fullscreen")}
|
||||
}
|
||||
};
|
||||
|
||||
static EnumComboBoxTransformer<Settings::MouseWheelBehavior, QString> MW_OPTIONS {
|
||||
{
|
||||
{ Settings::MouseWheelBehavior::Zoom, QCoreApplication::translate("SettingsDialog", "Zoom in and out") },
|
||||
{ Settings::MouseWheelBehavior::Switch, QCoreApplication::translate("SettingsDialog", "View next or previous item") }
|
||||
}
|
||||
};
|
||||
|
||||
static EnumComboBoxTransformer<Settings::WindowSizeBehavior, QString> IWS_OPTIONS {
|
||||
{
|
||||
{ Settings::WindowSizeBehavior::Auto, QCoreApplication::translate("SettingsDialog", "Auto size") },
|
||||
{ Settings::WindowSizeBehavior::Maximized, QCoreApplication::translate("SettingsDialog", "Maximized") },
|
||||
{ Settings::WindowSizeBehavior::Windowed, QCoreApplication::translate("SettingsDialog", "Windowed") }
|
||||
}
|
||||
};
|
||||
|
||||
static EnumComboBoxTransformer<Qt::HighDpiScaleFactorRoundingPolicy, QString> HIDPI_OPTIONS {
|
||||
{
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Round, QCoreApplication::translate("SettingsDialog", "Round (Integer scaling)", "This option means round up for .5 and above") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Ceil, QCoreApplication::translate("SettingsDialog", "Ceil (Integer scaling)", "This option means always round up") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Floor, QCoreApplication::translate("SettingsDialog", "Floor (Integer scaling)", "This option means always round down") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::PassThrough, QCoreApplication::translate("SettingsDialog", "Follow system (Fractional scaling)", "This option means don't round") }
|
||||
}
|
||||
};
|
||||
|
||||
SettingsDialog::SettingsDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_stayOnTop(new QCheckBox)
|
||||
, m_useBuiltInCloseAnimation(new QCheckBox)
|
||||
, m_useLightCheckerboard(new QCheckBox)
|
||||
, m_loopGallery(new QCheckBox)
|
||||
, m_autoLongImageMode(new QCheckBox)
|
||||
, m_svgTiny12Only(new QCheckBox)
|
||||
, m_doubleClickBehavior(new QComboBox)
|
||||
, m_mouseWheelBehavior(new QComboBox)
|
||||
, m_initWindowSizeBehavior(new QComboBox)
|
||||
, m_hiDpiRoundingPolicyBehavior(new QComboBox)
|
||||
: QDialog(parent), ui(new QT_PREPEND_NAMESPACE(Ui::SettingsDialog))
|
||||
{
|
||||
this->setWindowTitle(tr("Settings"));
|
||||
ui->setupUi(this);
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
|
||||
QHBoxLayout * mainLayout = new QHBoxLayout(this);
|
||||
QTabWidget * settingsTabs = new QTabWidget(this);
|
||||
mainLayout->addWidget(settingsTabs);
|
||||
|
||||
QWidget * settingsFormHolder = new QWidget;
|
||||
QFormLayout * settingsForm = new QFormLayout(settingsFormHolder);
|
||||
settingsTabs->addTab(settingsFormHolder, tr("Options"));
|
||||
|
||||
QSplitter * shortcutEditorSplitter = new QSplitter;
|
||||
shortcutEditorSplitter->setOrientation(Qt::Vertical);
|
||||
shortcutEditorSplitter->setChildrenCollapsible(false);
|
||||
QScrollArea * shortcutScrollArea = new QScrollArea;
|
||||
shortcutEditorSplitter->addWidget(shortcutScrollArea);
|
||||
shortcutScrollArea->setWidgetResizable(true);
|
||||
shortcutScrollArea->setMinimumHeight(200);
|
||||
QWidget * shortcutsFormHolder = new QWidget;
|
||||
QFormLayout * shortcutsForm = new QFormLayout(shortcutsFormHolder);
|
||||
shortcutScrollArea->setWidget(shortcutsFormHolder);
|
||||
settingsTabs->addTab(shortcutEditorSplitter, tr("Shortcuts"));
|
||||
|
||||
for (const QAction * action : parent->actions()) {
|
||||
ShortcutEdit * shortcutEdit = new ShortcutEdit;
|
||||
shortcutEdit->setObjectName(QLatin1String("shortcut_") + action->objectName());
|
||||
shortcutEdit->setShortcuts(action->shortcuts());
|
||||
shortcutsForm->addRow(action->text(), shortcutEdit);
|
||||
connect(shortcutEdit, &ShortcutEdit::editButtonClicked, this, [=](){
|
||||
if (shortcutEditorSplitter->count() == 1) shortcutEditorSplitter->addWidget(new QWidget);
|
||||
ShortcutEditor * shortcutEditor = new ShortcutEditor(shortcutEdit);
|
||||
shortcutEditor->setDescription(tr("Editing shortcuts for action \"%1\":").arg(action->text()));
|
||||
QWidget * oldEditor = shortcutEditorSplitter->replaceWidget(1, shortcutEditor);
|
||||
shortcutEditorSplitter->setSizes({shortcutEditorSplitter->height(), 1});
|
||||
oldEditor->deleteLater();
|
||||
});
|
||||
connect(shortcutEdit, &ShortcutEdit::applyShortcutsRequested, this, [=](QList<QKeySequence> newShortcuts){
|
||||
bool succ = Settings::instance()->setShortcutsForAction(parent, shortcutEdit->objectName().mid(9),
|
||||
newShortcuts);
|
||||
if (!succ) {
|
||||
QMessageBox::warning(this, tr("Failed to set shortcuts"),
|
||||
tr("Please check if shortcuts are duplicated with existing shortcuts."));
|
||||
}
|
||||
shortcutEdit->setShortcuts(action->shortcuts());
|
||||
});
|
||||
}
|
||||
|
||||
static QList< QPair<Settings::DoubleClickBehavior, QString> > _dc_options {
|
||||
{ Settings::DoubleClickBehavior::Ignore, tr("Do nothing") },
|
||||
{ Settings::DoubleClickBehavior::Close, tr("Close the window") },
|
||||
{ Settings::DoubleClickBehavior::Maximize, tr("Toggle maximize") },
|
||||
{ Settings::DoubleClickBehavior::FullScreen, tr("Toggle fullscreen") }
|
||||
};
|
||||
|
||||
static QList< QPair<Settings::MouseWheelBehavior, QString> > _mw_options {
|
||||
{ Settings::MouseWheelBehavior::Zoom, tr("Zoom in and out") },
|
||||
{ Settings::MouseWheelBehavior::Switch, tr("View next or previous item") }
|
||||
};
|
||||
|
||||
static QList< QPair<Settings::WindowSizeBehavior, QString> > _iws_options {
|
||||
{ Settings::WindowSizeBehavior::Auto, tr("Auto size") },
|
||||
{ Settings::WindowSizeBehavior::Maximized, tr("Maximized") },
|
||||
{ Settings::WindowSizeBehavior::Windowed, tr("Windowed") }
|
||||
};
|
||||
|
||||
static QList< QPair<Qt::HighDpiScaleFactorRoundingPolicy, QString> > _hidpi_options {
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Round, tr("Round (Integer scaling)", "This option means round up for .5 and above") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Ceil, tr("Ceil (Integer scaling)", "This option means always round up") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::Floor, tr("Floor (Integer scaling)", "This option means always round down") },
|
||||
{ Qt::HighDpiScaleFactorRoundingPolicy::PassThrough, tr("Follow system (Fractional scaling)", "This option means don't round") }
|
||||
};
|
||||
|
||||
QStringList dcbDropDown;
|
||||
for (const QPair<Settings::DoubleClickBehavior, QString> & dcOption : _dc_options) {
|
||||
dcbDropDown.append(dcOption.second);
|
||||
}
|
||||
|
||||
QStringList mwbDropDown;
|
||||
for (const QPair<Settings::MouseWheelBehavior, QString> & mwOption : _mw_options) {
|
||||
mwbDropDown.append(mwOption.second);
|
||||
}
|
||||
|
||||
QStringList iwsbDropDown;
|
||||
for (const QPair<Settings::WindowSizeBehavior, QString> & iwsOption : _iws_options) {
|
||||
iwsbDropDown.append(iwsOption.second);
|
||||
}
|
||||
|
||||
QStringList hidpiDropDown;
|
||||
for (const QPair<Qt::HighDpiScaleFactorRoundingPolicy, QString> & hidpiOption : _hidpi_options) {
|
||||
hidpiDropDown.append(hidpiOption.second);
|
||||
}
|
||||
|
||||
settingsForm->addRow(tr("Stay on top when start-up"), m_stayOnTop);
|
||||
settingsForm->addRow(tr("Use built-in close window animation"), m_useBuiltInCloseAnimation);
|
||||
settingsForm->addRow(tr("Use light-color checkerboard"), m_useLightCheckerboard);
|
||||
settingsForm->addRow(tr("Loop the loaded gallery"), m_loopGallery);
|
||||
settingsForm->addRow(tr("Auto long image mode"), m_autoLongImageMode);
|
||||
settingsForm->addRow(tr("Limit SVG support to SVG Tiny 1.2"), m_svgTiny12Only);
|
||||
settingsForm->addRow(tr("Double-click behavior"), m_doubleClickBehavior);
|
||||
settingsForm->addRow(tr("Mouse wheel behavior"), m_mouseWheelBehavior);
|
||||
settingsForm->addRow(tr("Default window size"), m_initWindowSizeBehavior);
|
||||
settingsForm->addRow(tr("HiDPI scale factor rounding policy"), m_hiDpiRoundingPolicyBehavior);
|
||||
|
||||
m_stayOnTop->setChecked(Settings::instance()->stayOnTop());
|
||||
m_useBuiltInCloseAnimation->setChecked(Settings::instance()->useBuiltInCloseAnimation());
|
||||
m_useLightCheckerboard->setChecked(Settings::instance()->useLightCheckerboard());
|
||||
m_loopGallery->setChecked(Settings::instance()->loopGallery());
|
||||
m_autoLongImageMode->setChecked(Settings::instance()->autoLongImageMode());
|
||||
m_svgTiny12Only->setChecked(Settings::instance()->svgTiny12Only());
|
||||
m_doubleClickBehavior->setModel(new QStringListModel(dcbDropDown));
|
||||
Settings::DoubleClickBehavior dcb = Settings::instance()->doubleClickBehavior();
|
||||
m_doubleClickBehavior->setCurrentIndex(static_cast<int>(dcb));
|
||||
m_mouseWheelBehavior->setModel(new QStringListModel(mwbDropDown));
|
||||
Settings::MouseWheelBehavior mwb = Settings::instance()->mouseWheelBehavior();
|
||||
m_mouseWheelBehavior->setCurrentIndex(static_cast<int>(mwb));
|
||||
m_initWindowSizeBehavior->setModel(new QStringListModel(iwsbDropDown));
|
||||
Settings::WindowSizeBehavior iwsb = Settings::instance()->initWindowSizeBehavior();
|
||||
m_initWindowSizeBehavior->setCurrentIndex(static_cast<int>(iwsb));
|
||||
m_hiDpiRoundingPolicyBehavior->setModel(new QStringListModel(hidpiDropDown));
|
||||
Qt::HighDpiScaleFactorRoundingPolicy hidpi = Settings::instance()->hiDpiScaleFactorBehavior();
|
||||
for (int i = 0; i < _hidpi_options.count(); i++) {
|
||||
if (_hidpi_options.at(i).first == hidpi) {
|
||||
m_hiDpiRoundingPolicyBehavior->setCurrentIndex(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
auto* settings = Settings::instance();
|
||||
ui->m_useLightCheckerboard->setChecked(settings->useLightCheckerboard());
|
||||
ui->m_loopGallery->setChecked(settings->loopGallery());
|
||||
ui->m_svgTiny12Only->setChecked(settings->svgTiny12Only());
|
||||
ui->m_doubleClickBehavior->setModel(DC_OPTIONS.buildComboBoxModel(this));
|
||||
Settings::DoubleClickBehavior dcb = settings->doubleClickBehavior();
|
||||
ui->m_doubleClickBehavior->setCurrentIndex(DC_OPTIONS.to_index(dcb));
|
||||
ui->m_mouseWheelBehavior->setModel(MW_OPTIONS.buildComboBoxModel(this));
|
||||
Settings::MouseWheelBehavior mwb = settings->mouseWheelBehavior();
|
||||
ui->m_mouseWheelBehavior->setCurrentIndex(MW_OPTIONS.to_index(mwb));
|
||||
ui->m_initWindowSizeBehavior->setModel(IWS_OPTIONS.buildComboBoxModel(this));
|
||||
Settings::WindowSizeBehavior iwsb = settings->initWindowSizeBehavior();
|
||||
ui->m_initWindowSizeBehavior->setCurrentIndex(IWS_OPTIONS.to_index(iwsb));
|
||||
ui->m_hiDpiRoundingPolicyBehavior->setModel(HIDPI_OPTIONS.buildComboBoxModel(this));
|
||||
Qt::HighDpiScaleFactorRoundingPolicy hidpi = settings->hiDpiScaleFactorBehavior();
|
||||
ui->m_hiDpiRoundingPolicyBehavior->setCurrentIndex(HIDPI_OPTIONS.to_index(hidpi));
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
# define QCHECKBOX_CHECKSTATECHANGED QCheckBox::checkStateChanged
|
||||
@@ -164,51 +113,45 @@ SettingsDialog::SettingsDialog(QWidget *parent)
|
||||
# define QT_CHECKSTATE int
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
|
||||
connect(m_stayOnTop, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setStayOnTop(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_useBuiltInCloseAnimation, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseBuiltInCloseAnimation(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_useLightCheckerboard, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
connect(ui->m_useLightCheckerboard, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseLightCheckerboard(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_loopGallery, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
connect(ui->m_loopGallery, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setLoopGallery(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_autoLongImageMode, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setAutoLongImageMode(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_svgTiny12Only, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
connect(ui->m_svgTiny12Only, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setSvgTiny12Only(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_doubleClickBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setDoubleClickBehavior(_dc_options.at(index).first);
|
||||
connect(ui->m_doubleClickBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setDoubleClickBehavior(DC_OPTIONS.to_value(index));
|
||||
});
|
||||
|
||||
connect(m_mouseWheelBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setMouseWheelBehavior(_mw_options.at(index).first);
|
||||
connect(ui->m_mouseWheelBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setMouseWheelBehavior(MW_OPTIONS.to_value(index));
|
||||
});
|
||||
|
||||
connect(m_initWindowSizeBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setInitWindowSizeBehavior(_iws_options.at(index).first);
|
||||
connect(ui->m_initWindowSizeBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setInitWindowSizeBehavior(IWS_OPTIONS.to_value(index));
|
||||
});
|
||||
|
||||
connect(m_hiDpiRoundingPolicyBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setHiDpiScaleFactorBehavior(_hidpi_options.at(index).first);
|
||||
connect(ui->m_hiDpiRoundingPolicyBehavior, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [ = ](int index){
|
||||
Settings::instance()->setHiDpiScaleFactorBehavior(HIDPI_OPTIONS.to_value(index));
|
||||
});
|
||||
|
||||
adjustSize();
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
// YYC MARK:
|
||||
// Use adjustSize() to make sure all ComboBox are expanded by its items.
|
||||
// Because items are added after inserting them into layout.
|
||||
// It is inviable to call this function in ctor because this relys on Qt event system.
|
||||
// It only can be done by QTimer::singleShot().
|
||||
QTimer::singleShot(0, this, [this](){
|
||||
this->adjustSize();
|
||||
});
|
||||
}
|
||||
|
||||
SettingsDialog::~SettingsDialog()
|
||||
{
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
+7
-17
@@ -5,11 +5,14 @@
|
||||
#ifndef SETTINGSDIALOG_H
|
||||
#define SETTINGSDIALOG_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QDialog>
|
||||
|
||||
class QCheckBox;
|
||||
class QComboBox;
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui {
|
||||
class SettingsDialog;
|
||||
}
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class SettingsDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
@@ -17,21 +20,8 @@ public:
|
||||
explicit SettingsDialog(QWidget *parent = nullptr);
|
||||
~SettingsDialog();
|
||||
|
||||
signals:
|
||||
|
||||
public slots:
|
||||
|
||||
private:
|
||||
QCheckBox * m_stayOnTop = nullptr;
|
||||
QCheckBox * m_useBuiltInCloseAnimation = nullptr;
|
||||
QCheckBox * m_useLightCheckerboard = nullptr;
|
||||
QCheckBox * m_loopGallery = nullptr;
|
||||
QCheckBox * m_autoLongImageMode = nullptr;
|
||||
QCheckBox * m_svgTiny12Only = nullptr;
|
||||
QComboBox * m_doubleClickBehavior = nullptr;
|
||||
QComboBox * m_mouseWheelBehavior = nullptr;
|
||||
QComboBox * m_initWindowSizeBehavior = nullptr;
|
||||
QComboBox * m_hiDpiRoundingPolicyBehavior = nullptr;
|
||||
QT_PREPEND_NAMESPACE(Ui::SettingsDialog) *ui;
|
||||
};
|
||||
|
||||
#endif // SETTINGSDIALOG_H
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SettingsDialog</class>
|
||||
<widget class="QDialog" name="SettingsDialog">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::NonModal</enum>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Settings</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="mainLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="settingsTabs">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="optionsTab">
|
||||
<attribute name="title">
|
||||
<string>Options</string>
|
||||
</attribute>
|
||||
<layout class="QFormLayout" name="settingsForm">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="m_useLightCheckerboard">
|
||||
<property name="text">
|
||||
<string>Use light-color checkerboard</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="m_loopGallery">
|
||||
<property name="text">
|
||||
<string>Loop the loaded gallery</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="m_svgTiny12Only">
|
||||
<property name="text">
|
||||
<string>Limit SVG support to SVG Tiny 1.2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="m_doubleClickBehaviorLabel">
|
||||
<property name="text">
|
||||
<string>Double-click behavior</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QComboBox" name="m_doubleClickBehavior"/>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="m_mouseWheelBehaviorLabel">
|
||||
<property name="text">
|
||||
<string>Mouse wheel behavior</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QComboBox" name="m_mouseWheelBehavior"/>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="m_initWindowSizeBehaviorLabel">
|
||||
<property name="text">
|
||||
<string>Default window size</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QComboBox" name="m_initWindowSizeBehavior"/>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="m_hiDpiRoundingPolicyBehaviorLabel">
|
||||
<property name="text">
|
||||
<string>HiDPI scale factor rounding policy</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QComboBox" name="m_hiDpiRoundingPolicyBehavior"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -1,126 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2024 Gary Wang <opensource@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "shortcutedit.h"
|
||||
|
||||
#include <QLabel>
|
||||
#include <QToolButton>
|
||||
#include <QHBoxLayout>
|
||||
#include <QFormLayout>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QKeySequenceEdit>
|
||||
|
||||
ShortcutEditor::ShortcutEditor(ShortcutEdit * shortcutEdit, QWidget * parent)
|
||||
: QWidget(parent)
|
||||
, m_descriptionLabel(new QLabel)
|
||||
, m_shortcutEdit(shortcutEdit)
|
||||
, m_shortcutLayout(new QFormLayout)
|
||||
{
|
||||
Q_CHECK_PTR(m_shortcutEdit);
|
||||
|
||||
QDialogButtonBox * buttons = new QDialogButtonBox(QDialogButtonBox::Apply | QDialogButtonBox::Discard);
|
||||
|
||||
QVBoxLayout * layout = new QVBoxLayout(this);
|
||||
layout->addWidget(m_descriptionLabel);
|
||||
layout->addLayout(m_shortcutLayout);
|
||||
layout->addWidget(buttons);
|
||||
|
||||
connect(buttons, &QDialogButtonBox::clicked, this, [=](QAbstractButton *button){
|
||||
if ((QPushButton *)button == buttons->button(QDialogButtonBox::Apply)) {
|
||||
applyShortcuts();
|
||||
} else {
|
||||
reloadShortcuts();
|
||||
}
|
||||
});
|
||||
connect(shortcutEdit, &ShortcutEdit::shortcutsChanged, this, &ShortcutEditor::reloadShortcuts);
|
||||
|
||||
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
|
||||
|
||||
reloadShortcuts();
|
||||
}
|
||||
|
||||
void ShortcutEditor::setDescription(const QString &desc)
|
||||
{
|
||||
m_descriptionLabel->setText(desc);
|
||||
}
|
||||
|
||||
void ShortcutEditor::reloadShortcuts()
|
||||
{
|
||||
if (!m_keySequenceEdits.isEmpty()) {
|
||||
for (QKeySequenceEdit * keyseqEdit : m_keySequenceEdits) {
|
||||
m_shortcutLayout->removeRow(keyseqEdit);
|
||||
}
|
||||
m_keySequenceEdits.clear();
|
||||
}
|
||||
|
||||
QList<QKeySequence> shortcuts = m_shortcutEdit->shortcuts();
|
||||
shortcuts.append(QKeySequence());
|
||||
for (const QKeySequence & shortcut : shortcuts) {
|
||||
QKeySequenceEdit * keyseqEdit = new QKeySequenceEdit(this);
|
||||
keyseqEdit->setClearButtonEnabled(true);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
|
||||
keyseqEdit->setMaximumSequenceLength(1);
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
|
||||
keyseqEdit->setKeySequence(shortcut);
|
||||
m_keySequenceEdits.append(keyseqEdit);
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_keySequenceEdits.count(); i++) {
|
||||
m_shortcutLayout->addRow(tr("Shortcut #%1").arg(i + 1), m_keySequenceEdits.at(i));
|
||||
}
|
||||
}
|
||||
|
||||
void ShortcutEditor::applyShortcuts()
|
||||
{
|
||||
QList<QKeySequence> shortcuts;
|
||||
for (const QKeySequenceEdit * keyseqEdit : m_keySequenceEdits) {
|
||||
if (!keyseqEdit->keySequence().isEmpty() && !shortcuts.contains(keyseqEdit->keySequence())) {
|
||||
shortcuts.append(keyseqEdit->keySequence());
|
||||
}
|
||||
}
|
||||
emit m_shortcutEdit->applyShortcutsRequested(shortcuts);
|
||||
}
|
||||
|
||||
// ----------------------------------------
|
||||
|
||||
ShortcutEdit::ShortcutEdit(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_shortcutsLabel(new QLabel(this))
|
||||
, m_setShortcutButton(new QToolButton(this))
|
||||
{
|
||||
m_setShortcutButton->setText("...");
|
||||
|
||||
QHBoxLayout * layout = new QHBoxLayout(this);
|
||||
layout->setContentsMargins(0, 0, 0, 0);
|
||||
layout->addWidget(m_shortcutsLabel, 1);
|
||||
layout->addWidget(m_setShortcutButton);
|
||||
|
||||
connect(this, &ShortcutEdit::shortcutsChanged, this, [=](){
|
||||
QStringList shortcutTexts;
|
||||
for (const QKeySequence & shortcut : std::as_const(m_shortcuts)) {
|
||||
shortcutTexts.append(shortcut.toString(QKeySequence::NativeText));
|
||||
}
|
||||
m_shortcutsLabel->setText(shortcutTexts.isEmpty() ? tr("No shortcuts") : shortcutTexts.join(", "));
|
||||
m_shortcutsLabel->setDisabled(shortcutTexts.isEmpty());
|
||||
});
|
||||
|
||||
connect(m_setShortcutButton, &QToolButton::clicked, this, &ShortcutEdit::editButtonClicked);
|
||||
|
||||
adjustSize();
|
||||
}
|
||||
|
||||
ShortcutEdit::~ShortcutEdit()
|
||||
{
|
||||
}
|
||||
|
||||
QList<QKeySequence> ShortcutEdit::shortcuts() const
|
||||
{
|
||||
return m_shortcuts;
|
||||
}
|
||||
|
||||
void ShortcutEdit::setShortcuts(const QList<QKeySequence> &shortcuts)
|
||||
{
|
||||
m_shortcuts = shortcuts;
|
||||
emit shortcutsChanged();
|
||||
}
|
||||
@@ -1,55 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2024 Gary Wang <opensource@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <QWidget>
|
||||
#include <QList>
|
||||
#include <QKeySequence>
|
||||
|
||||
class QLabel;
|
||||
class QFormLayout;
|
||||
class QToolButton;
|
||||
class QKeySequenceEdit;
|
||||
class ShortcutEdit;
|
||||
class ShortcutEditor : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ShortcutEditor(ShortcutEdit * shortcutEdit, QWidget * parent = nullptr);
|
||||
~ShortcutEditor() = default;
|
||||
|
||||
void setDescription(const QString & desc);
|
||||
|
||||
void reloadShortcuts();
|
||||
void applyShortcuts();
|
||||
|
||||
private:
|
||||
QLabel * m_descriptionLabel;
|
||||
ShortcutEdit * m_shortcutEdit;
|
||||
QFormLayout * m_shortcutLayout;
|
||||
QList<QKeySequenceEdit *> m_keySequenceEdits;
|
||||
};
|
||||
|
||||
class ShortcutEdit : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_PROPERTY(QList<QKeySequence> shortcuts MEMBER m_shortcuts WRITE setShortcuts NOTIFY shortcutsChanged)
|
||||
public:
|
||||
explicit ShortcutEdit(QWidget * parent = nullptr);
|
||||
~ShortcutEdit();
|
||||
|
||||
QList<QKeySequence> shortcuts() const;
|
||||
void setShortcuts(const QList<QKeySequence> &shortcuts);
|
||||
|
||||
signals:
|
||||
void shortcutsChanged();
|
||||
void editButtonClicked();
|
||||
void applyShortcutsRequested(QList<QKeySequence> newShortcuts);
|
||||
|
||||
private:
|
||||
QList<QKeySequence> m_shortcuts;
|
||||
QLabel * m_shortcutsLabel;
|
||||
QToolButton * m_setShortcutButton;
|
||||
};
|
||||
@@ -1,38 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#include "toolbutton.h"
|
||||
|
||||
#include "actionmanager.h"
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <QPainter>
|
||||
#include <QGraphicsOpacityEffect>
|
||||
#include <QPropertyAnimation>
|
||||
|
||||
ToolButton::ToolButton(bool hoverColor, QWidget *parent)
|
||||
: QPushButton(parent)
|
||||
, m_opacityHelper(new OpacityHelper(this))
|
||||
{
|
||||
setFlat(true);
|
||||
QString qss = "QPushButton {"
|
||||
"background: transparent;"
|
||||
"}";
|
||||
if (hoverColor) {
|
||||
qss += "QPushButton:hover {"
|
||||
"background: red;"
|
||||
"}";
|
||||
}
|
||||
setStyleSheet(qss);
|
||||
}
|
||||
|
||||
void ToolButton::setIconResourcePath(const QString &iconp)
|
||||
{
|
||||
this->setIcon(ActionManager::loadHidpiIcon(iconp, this->iconSize()));
|
||||
}
|
||||
|
||||
void ToolButton::setOpacity(qreal opacity, bool animated)
|
||||
{
|
||||
m_opacityHelper->setOpacity(opacity, animated);
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
#ifndef TOOLBUTTON_H
|
||||
#define TOOLBUTTON_H
|
||||
|
||||
#include <QPushButton>
|
||||
|
||||
class OpacityHelper;
|
||||
class ToolButton : public QPushButton
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
ToolButton(bool hoverColor = false, QWidget * parent = nullptr);
|
||||
void setIconResourcePath(const QString &iconp);
|
||||
|
||||
public slots:
|
||||
void setOpacity(qreal opacity, bool animated = true);
|
||||
|
||||
private:
|
||||
OpacityHelper * m_opacityHelper;
|
||||
};
|
||||
|
||||
#endif // TOOLBUTTON_H
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Arrossegueu una imatge aquí</translation>
|
||||
@@ -210,194 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>La llista d'ubicacions és buida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Les dades de la imatge no són vàlides</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>El tipus MIME no és compatible: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copia el &mapa de píxels</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copia el camí del &fitxer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Propietats</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Mantén a sobre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Mode protegit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Amplia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Redueix</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Inverteix &horitzontalment</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Enganxa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Commuta el tauler d'escacs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Obre...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Mida real</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Commuta la maximització</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Commuta la maximització</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Imatge anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Imatge següent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configura...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Ajuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Mostra al navegador de fitxers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Mostra a la carpeta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Surt</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Ziehen Sie das Bild hierher</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Die Datei-URL-Liste ist leer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Bilddaten sind ungültig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Nicht unterstützte Mimedaten: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>P&ixmap kopieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>&Dateipfad kopieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Eigenschaften</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Oben bleiben</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Geschützter Modus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Hineinzoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Herauszoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>&Horizontal spiegeln</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>%Einfügen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Schachbrettmuster umschalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Öffnen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Tatsächliche Größe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximieren umschalten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Nach rechts drehen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Vorheriges Bild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Nächstes Bild</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Konfigurieren …</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Hilfe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Im Dateiexplorer zeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Im Verzeichnis zeigen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Beenden</translation>
|
||||
</message>
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -198,194 +198,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Zoom out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>&Paste</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Actual size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<source>Toggle maximize</source>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Rotate right</source>
|
||||
<source>Zoom out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Rotate left</source>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Arrastre una imagen aquí</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>La lista de ubicaciones está vacía</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copiar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Los datos de la imagen no son válidos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>El tipo MIME no es compatible: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Imagen del portapapeles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>¿Estás seguro de que quieres mover "%1" a la papelera de reciclaje?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Mover a la papelera ha fallado, puede deberse a un problema con los permisos de los archivos, una limitación del sistema de archivos o una limitación de la plataforma.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copiar &mapa de píxeles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copiar &ruta de archivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Propiedades</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Mantener encima</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Modo protegido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Conservar la transformación</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Ampliar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Reducir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Pausar/Reanudar animación</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Ir al siguiente fotograma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Voltear &horizontalmente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Para visualizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Ajustar al ancho</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Pegar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Activar/desactivar el tablero de ajedrez</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Abrir...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Tamaño real</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximizar/desmaximizar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Girar a la derecha</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Girar a la izquierda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Imagen anterior</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Imagen siguiente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Mover a la papelera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configurar...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Ayuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Mostrar en el Explorador de archivos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Mostrar en la carpeta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Salir</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Faites glisser l'image ici</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>La liste des URL de fichiers est vide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Les données d'image ne sont pas valides</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Mimedata non pris en charge : %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copier P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copier le &chemin du fichier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Propriétés</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Rester en-haut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Mode protégé</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Zoom avant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Zoom arrière</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Retourner &horizontalement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>Co&ller</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Dés/activer le damier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Ouvrir...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Taille actuelle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Dés/activer l'agrandissement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Pivoter vers la droite</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Image précédente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Image suivant</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configurer…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Aide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Afficher dans le navigateur de fichiers</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Afficher dans le dossier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Quitter</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Tarik gambar ke sini</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Daftar url file kosong</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Salin</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Data gambar tidak valid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Tidak didukung mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Salin P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Salin &Path Berkas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Properti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Tetap di atas</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Mode Terlindungi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Simpan transformasi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Perbesar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Perkecil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Putar Secara &Horizontal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Tempel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Ukuran asli</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<source>Toggle maximize</source>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Perkecil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Putar Secara &Horizontal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Tempel</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Ukuran asli</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Putar ke kanan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Konfigurasi...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Dukungan</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Keluar</translation>
|
||||
</message>
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Trascina qui l'immagine</translation>
|
||||
@@ -210,194 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>L'elenco degli URL dei file è vuoto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Copia</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>I dati dell'immagine non sono validi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Dati mime non supportati: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Immagine dagli appunti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Sei sicuro di voler spostare "%1" nel cestino?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Impossibile spostare il file nel cestino</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Lo spostamento nel cestino non è riuscito, potrebbe essere causato da un problema di autorizzazione del file, da una limitazione del file system o da una limitazione della piattaforma.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Copia P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Copia &Percorso file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Proprietà</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Rimani in cima</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Modalità protetta</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Mantieni trasformazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Zoom avanti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Zoom indietro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Pausa/Riprendi animazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Animazione Vai al fotogramma successivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Capovolgi &Orizzontalmente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Adatto alla visualizzazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Adatta alla larghezza</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Adatta immagine lunga</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Incolla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Attiva/disattiva scacchiera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Apri...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Dimensione reale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Attiva massimizzazione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Ruota a destra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Ruota a sinistra</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Immagine precedente</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Immagine successiva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Sposta nel cestino</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Configura...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Aiuto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Mostra in Esplora file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Mostra nella directory</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Esci</translation>
|
||||
</message>
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>ここに画像をドラッグしてください</translation>
|
||||
@@ -210,194 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>ファイルurlリストがエンプティーです</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>コピー(&C)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>画像のデータが無効です</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>無効なmimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>クリップボードからの画像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>「%1」をゴミ箱に移動しますか?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>ゴミ箱への移動に失敗しました。ファイルのアクセス許可や、ファイルシステムの制限、プラットフォームの制限などを確認してください。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>画像をコピー(&I)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>ファイルパスをコピー(&F)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>プロパティ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>最前面に表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>プロテクトモード</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>表示状態を維持する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>拡大</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>縮小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>一時停止 / 再開のアニメーション</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>次のフレームへ移動するアニメーション</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>画像を左右反転する(&H)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>表示に合わせる</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>横幅に合わせる</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>貼り付け(&P)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>背景を格子模様に切り替え</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>開く(&O)…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>実際のサイズ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>最大化を切り替える</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>右に回転</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>左に回転</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>前の画像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>次の画像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>ゴミ箱へ移動する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>設定...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>ヘルプ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>エクスプローラーで表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>ディレクトリに表示する</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>終了</translation>
|
||||
</message>
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>이미지를 여기로 끌기</translation>
|
||||
@@ -210,194 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>파일 URL 목록이 비어 있습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>복사(&C)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>이미지 데이터가 잘못되었습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>지원되지 않는 mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>다른 이름으로 저장</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>현재 열려 있는 이미지가 없습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>%1 이미지 (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>지원되는 이미지 형식을 사용할 수 없습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>이미지 저장 실패: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>클립보드에서 이미지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>"%1"을 휴지통으로 옮기시겠습니까?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>파일을 휴지통으로 이동하지 못했습니다</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>휴지통으로 이동하지 못했습니다. 파일 권한 문제, 파일 시스템 제한 또는 플랫폼 제한으로 인해 발생할 수 있습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Pixmap 복사(&I)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>파일 경로 복사(&F)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>속성</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>맨 위에 유지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>보호 모드</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>변형 유지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>확대</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>다른 이름으로 저장(&A)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>축소</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>애니메이션 일시 중지/재개</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>애니메이션 다음 프레임으로 이동</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>수평으로 뒤집기(&H)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>보기에 맞춤</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>너비에 맞춤</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>긴 이미지 맞추기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>붙여넣기(&P)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>바둑판 전환</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>열기(&O)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>실제 크기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>최대화 전환</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>오른쪽으로 회전</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>왼쪽으로 회전</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>이전 이미지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>다음 이미지</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>휴지통으로 이동</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>구성...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>도움말</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>파일 탐색기에 표시</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>디렉터리에 표시</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>종료</translation>
|
||||
</message>
|
||||
@@ -854,7 +887,7 @@
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>SVG 지원을 SVG Tiny 1.2로 제한</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Dra bilde hit</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Listen over filnettadresser er ugyldig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Ugyldig bildedata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Ustøttet MIME-data: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Er du sikker på at du vil flytte "%1" til papirkurven?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Flytt til papirkurven mislyktes, det kan skyldes filtillatelsesproblem, filsystembegrensning eller plattformbegrensning.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation type="unfinished">Kopier p&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Kopier &filbane</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Egenskaper</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Behold øverst</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Beskyttet modus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Behold transformasjon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Førstørr</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Forminsk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Speilvend &horisontalt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Lim inn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished">Skru av/på rutemønster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Åpne …</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Faktisk størrelse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maksimering av/på</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Roter til høyre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Forrige bilde</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Neste bilde</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Flytt til papirkurven</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Sett opp …</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Hjelp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Vis i filutforsker</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished">Vis i mappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Avslutt</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Sleep een afbeelding hierheen</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>De bestandspadlijst is leeg</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopiëren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Beschadigde afbeeldingsgegevens</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Niet-ondersteunde mime-gegevens: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Opslaan als</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>Er is geen afbeelding geopend.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>%1-afbeelding (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Er zijn geen ondersteunde formaten beschikbaar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>De afbeelding kan niet worden opgeslagen: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Afbeelding van klembord</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Weet u zeker dat u “%1” naar de prullenbak wilt verplaatsen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Verplaatsen naar prullenbak mislukt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Het bestand kan niet naar de prullenbak worden verplaatst, mogelijk door een rechtenprobleem of systeembeperking.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>P&ixmap kopiëren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>&Bestandspad kopiëren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Eigenschappen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Altijd bovenop</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Beschermde modus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Bewerkingen onthouden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Inzoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Opslaan &als…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Uitzoomen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Animatie pauzeren/hervatten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Ga naar volgend animatieframe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>&Horizontaal spiegelen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Inpassen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Aanpassen aan breedte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Lange afbeelding inpassen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Plakken</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Schaakbordpatroon aan/uit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Openen…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Ware grootte</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Maximaliseren aan/uit</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Naar rechts draaien</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Naar links draaien</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Vorige afbeelding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Volgende afbeelding</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Verplaatsen naar prullenbak</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Instellen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Hulp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Tonen in bestandsbeheer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Tonen in map</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Afsluiten</translation>
|
||||
</message>
|
||||
@@ -858,7 +891,7 @@
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Svg-ondersteuning beperken tot SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -198,194 +198,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>کاپی کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>تصویر دا نقشہ کاپی کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>وشیشتاواں</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>سرکھیات سیٹنگ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>وڈا کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>چھوٹا کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>لیٹویں اُلٹاؤ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>پیسٹ کرو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>چیکبورڈ چالو بدلو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>کھُلھو…</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>اصلی اکار</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>ودھو ودھ بدلو</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>سجے گھنماؤ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>پچھلی تصویر</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>اگلی تصویر</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>مدد</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>بند کرو</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Перетащите изображение сюда</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Список URL-адресов файлов пуст</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Скопировать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Параметры изображения недействительны</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Неподдерживаемые mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Сохранить как</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>В настоящее время нет открытых изображений.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>%1 Изображение (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Нет доступных поддерживаемых форматов изображений.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>Не удалось сохранить изображение: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Изображение из буфера обмена</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Вы уверены, что хотите переместить "%1" в корзину?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Не удалось переместить файл в корзину</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Перемещение в корзину не удалось, возможно, из-за проблем с правами доступа к файлу, ограничений файловой системы или ограничений платформы.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Скопировать P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Скопировать &путь к файлу</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Свойства</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Поверх всех окон</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Защищенный режим</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Сохранять трансформацию</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Увеличить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Сохранить как...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Уменьшить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Пауза/Возобновление анимации</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Перейти к следующему кадру анимации</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Отразить по &горизонтали</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Уместить все</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Уместить по ширине</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Уместить по длине</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Вставить</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Переключить фоновый рисунок</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Открыть...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Фактический размер</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Переключить окно</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Повернуть вправо</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Повернуть влево</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Предыдущее изображение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Следующее изображение</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Переместить в корзину</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Параметры...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Помощь</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Показать в проводнике</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Показать в папке</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Выход</translation>
|
||||
</message>
|
||||
@@ -858,7 +891,7 @@
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ограничить поддержку SVG до SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation type="unfinished"></translation>
|
||||
@@ -210,194 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>ගොනු ඒ.ස.නි. (url) ලැයිස්තුව හිස් ය</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&පිටපත්</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>රූපයේ දත්ත වලංගු නොවේ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Zoom out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>&Paste</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Actual size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<source>Toggle maximize</source>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Rotate right</source>
|
||||
<source>Zoom out</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Rotate left</source>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
|
||||
@@ -0,0 +1,935 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="sl">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="29"/>
|
||||
<source>About</source>
|
||||
<translation>O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="32"/>
|
||||
<source>Launch application with image file path as argument to load the file.</source>
|
||||
<translation>Zaženite aplikacijo s potjo do slikovne datoteke kot argumentom za nalaganje datoteke.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="33"/>
|
||||
<source>Drag and drop image file onto the window is also supported.</source>
|
||||
<translation>Podprta je tudi funkcija povleci in spusti, da povlečete slikovno datoteko v okno.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="34"/>
|
||||
<source>None of the operations in this application will alter the pictures on disk.</source>
|
||||
<translation>Nobena od operacij v tej aplikaciji ne bo spremenila slik na disku.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="35"/>
|
||||
<source>Context menu option explanation:</source>
|
||||
<translation>Razlaga možnosti kontekstnega menija:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="42"/>
|
||||
<source>Make window stay on top of all other windows.</source>
|
||||
<translation>Okno naj ostane nad vsemi drugimi okni.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="45"/>
|
||||
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
|
||||
<translation>Izogibajte se nenamernemu zapiranju okna (npr. z dvojnim klikom na okno)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="48"/>
|
||||
<source>Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.</source>
|
||||
<translation>Pri preklapljanju med slikami se izogibajte ponastavitvi stanja povečave/vrtenja/preobrata, ki je bilo uporabljeno za pogled slike.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="55"/>
|
||||
<source>Version: %1</source>
|
||||
<translation>Različica: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="66"/>
|
||||
<source>Logo designed by %1</source>
|
||||
<translation>Logotip je oblikoval %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="68"/>
|
||||
<source>Built with Qt %1 (%2)</source>
|
||||
<translation>Zgrajeno s Qt %1 (%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="69"/>
|
||||
<source>Source code</source>
|
||||
<translation>Izvorna koda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="79"/>
|
||||
<source>Contributors</source>
|
||||
<translation>Sodelavci</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="81"/>
|
||||
<source>List of contributors on GitHub</source>
|
||||
<translation>Seznam sodelavcev na GitHubu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="82"/>
|
||||
<source>Thanks to all people who contributed to this project.</source>
|
||||
<translation>Hvala vsem ljudem, ki so prispevali k temu projektu.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="86"/>
|
||||
<source>Translators</source>
|
||||
<translation>Prevajalci</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="87"/>
|
||||
<source>I would like to thank the following people who volunteered to translate this application.</source>
|
||||
<translation>Rad bi se zahvalil naslednjim ljudem, ki so se prostovoljno javili za prevod te aplikacije.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="131"/>
|
||||
<source>%1 is built on the following free software libraries:</source>
|
||||
<comment>Free as in freedom</comment>
|
||||
<translation>%1 je zgrajen na naslednjih knjižnicah brezplačne programske opreme:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="155"/>
|
||||
<source>&Special Thanks</source>
|
||||
<translation>&Posebna zahvala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="157"/>
|
||||
<source>&Third-party Libraries</source>
|
||||
<translation>&Knjižnice tretjih oseb</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="93"/>
|
||||
<source>Your Rights</source>
|
||||
<translation>Vaše pravice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="63"/>
|
||||
<source>Copyright (c) %1 %2</source>
|
||||
<comment>%1 is year, %2 is the name of copyright holder(s)</comment>
|
||||
<translation>Avtorske pravice (c) %1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="95"/>
|
||||
<source>%1 is released under the MIT License.</source>
|
||||
<translation>%1 je izdan pod licenco MIT.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="96"/>
|
||||
<source>This license grants people a number of freedoms:</source>
|
||||
<translation>Ta licenca daje ljudem številne svoboščine:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="97"/>
|
||||
<source>You are free to use %1, for any purpose</source>
|
||||
<translation>%1 lahko uporabljate za kakršen koli namen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="98"/>
|
||||
<source>You are free to distribute %1</source>
|
||||
<translation>Prosto lahko distribuirate %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="99"/>
|
||||
<source>You can study how %1 works and change it</source>
|
||||
<translation>Lahko preučite, kako deluje %1, in ga spremenite</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="100"/>
|
||||
<source>You can distribute changed versions of %1</source>
|
||||
<translation>Spremenjene različice %1 lahko distribuirate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="102"/>
|
||||
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
|
||||
<translation>Licenca MIT vam zagotavlja to svobodo. Nihče vam je ne sme vzeti.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="130"/>
|
||||
<source>Third-party Libraries used by %1</source>
|
||||
<translation>Knjižnice tretjih oseb, ki jih uporablja %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="153"/>
|
||||
<source>&Help</source>
|
||||
<translation>&Pomoč</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="154"/>
|
||||
<source>&About</source>
|
||||
<translation>&O</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="156"/>
|
||||
<source>&License</source>
|
||||
<translation>&Licenca</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Povlecite sliko sem</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsView</name>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Datoteka ni veljavna slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Podatki o sliki so neveljavni ali trenutno niso podprti</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Seznam url-jev datotek je prazen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopiraj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Podatki slike so neveljavni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Ni podprtih podatkov mime: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Shrani kot</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>Trenutno ni odprta nobena slika.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>Slika %1 (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Nobenih podprtih formatov slik ni na razpolago.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>Shranjevanje slike ni uspelo: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Slika iz odložišča</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Ali ste prepričani, da želite premakniti "%1" v koš?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Datoteke ni bilo mogoče premakniti v koš</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Premik v koš ni uspel. Morda je vzrok težava z dovoljenji za datoteke, omejitev datotečnega sistema ali omejitev platforme.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Kopiraj P&ixmapo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Kopiraj &pot datoteke</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Lastnosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Ostani na vrhu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Zaščiten način</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Ohrani transformacijo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Povečaj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Shrani &kot...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Pomanjšaj</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Začasna ustavitev/nadaljevanje animacije</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Animacija Pojdi na naslednji okvir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Obrni &vodoravno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Prilagodi pogledu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Prilagodi širini</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Prilagodi dolgi sliki</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Prilepi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Preklopi šahovnico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Odpri...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Dejanska velikost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Preklopi maksimiranje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Zavrti desno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Zavrti levo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Prejšnja slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Naslednja slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Premakni v koš</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Konfiguriraj...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Pomoč</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Prikaži v Raziskovalcu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Prikaži v imeniku</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Izhod</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataDialog</name>
|
||||
<message>
|
||||
<location filename="../metadatadialog.cpp" line="84"/>
|
||||
<source>Image Metadata</source>
|
||||
<translation>Metapodatki slike</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataModel</name>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="43"/>
|
||||
<source>Origin</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Izvor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="44"/>
|
||||
<source>Image</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Slika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="48"/>
|
||||
<source>File</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Datoteka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="45"/>
|
||||
<source>Camera</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Kamera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="35"/>
|
||||
<source>%1 File</source>
|
||||
<translation>%1 Datoteka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="42"/>
|
||||
<source>Description</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Opis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="46"/>
|
||||
<source>Advanced photo</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Napredna fotografija</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="47"/>
|
||||
<source>GPS</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>GPS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="52"/>
|
||||
<source>Dimensions</source>
|
||||
<translation>Dimenzije</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="54"/>
|
||||
<source>Aspect ratio</source>
|
||||
<translation>Razmerje stranic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="58"/>
|
||||
<source>Frame count</source>
|
||||
<translation>Število sličic</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="62"/>
|
||||
<source>Name</source>
|
||||
<translation>Ime</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="64"/>
|
||||
<source>Item type</source>
|
||||
<translation>Vrsta elementa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="66"/>
|
||||
<source>Folder path</source>
|
||||
<translation>Pot do imenika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="68"/>
|
||||
<source>Size</source>
|
||||
<translation>Velikost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="70"/>
|
||||
<source>Date created</source>
|
||||
<translation>Datum nastanka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="72"/>
|
||||
<source>Date modified</source>
|
||||
<translation>Datum spremembe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="79"/>
|
||||
<source>Title</source>
|
||||
<translation>Naslov</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="81"/>
|
||||
<source>Subject</source>
|
||||
<translation>Zadeva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="83"/>
|
||||
<source>Rating</source>
|
||||
<translation>Ocena</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="85"/>
|
||||
<source>Tags</source>
|
||||
<translation>Oznake</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="87"/>
|
||||
<source>Comments</source>
|
||||
<translation>Komentarji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="90"/>
|
||||
<source>Authors</source>
|
||||
<translation>Avtorji</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="92"/>
|
||||
<source>Date taken</source>
|
||||
<translation>Datum posnetka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="98"/>
|
||||
<source>Program name</source>
|
||||
<translation>Ime programa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="100"/>
|
||||
<source>Copyright</source>
|
||||
<translation>Avtorske pravice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="103"/>
|
||||
<source>Horizontal resolution</source>
|
||||
<translation>Horizontalna ločljivost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="105"/>
|
||||
<source>Vertical resolution</source>
|
||||
<translation>Navpična ločljivost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="107"/>
|
||||
<source>Resolution unit</source>
|
||||
<translation>Enota ločljivosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="109"/>
|
||||
<source>Colour representation</source>
|
||||
<translation>Barvna predstavitev</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="112"/>
|
||||
<source>Camera maker</source>
|
||||
<translation>Izdelovalec kamer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="114"/>
|
||||
<source>Camera model</source>
|
||||
<translation>Model kamere</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="116"/>
|
||||
<source>F-stop</source>
|
||||
<translation>F-stop</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="118"/>
|
||||
<source>Exposure time</source>
|
||||
<translation>Čas izpostavljenosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="120"/>
|
||||
<source>ISO speed</source>
|
||||
<translation>Hitrost ISO</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="122"/>
|
||||
<source>Exposure bias</source>
|
||||
<translation>Pristranskost izpostavljenosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="124"/>
|
||||
<source>Focal length</source>
|
||||
<translation>Goriščna razdalja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="126"/>
|
||||
<source>Max aperture</source>
|
||||
<translation>Največja zaslonka</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="128"/>
|
||||
<source>Metering mode</source>
|
||||
<translation>Način merjenja</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="130"/>
|
||||
<source>Subject distance</source>
|
||||
<translation>Razdalja motiva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="132"/>
|
||||
<source>Flash mode</source>
|
||||
<translation>Način bliskavice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="134"/>
|
||||
<source>35mm focal length</source>
|
||||
<translation>Goriščna razdalja 35 mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="137"/>
|
||||
<source>Lens model</source>
|
||||
<translation>Model objektiva</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="139"/>
|
||||
<source>Contrast</source>
|
||||
<translation>Kontrast</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="141"/>
|
||||
<source>Brightness</source>
|
||||
<translation>Svetlost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="143"/>
|
||||
<source>Exposure program</source>
|
||||
<translation>Program izpostavljenosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="145"/>
|
||||
<source>Saturation</source>
|
||||
<translation>Nasičenost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="147"/>
|
||||
<source>Sharpness</source>
|
||||
<translation>Ostrina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="149"/>
|
||||
<source>White balance</source>
|
||||
<translation>Ravnovesje beline</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="151"/>
|
||||
<source>Digital zoom</source>
|
||||
<translation>Digitalna povečava</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="153"/>
|
||||
<source>EXIF version</source>
|
||||
<translation>Različica EXIF</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="156"/>
|
||||
<source>Latitude reference</source>
|
||||
<translation>Referenčna zemljepisna širina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="158"/>
|
||||
<source>Latitude</source>
|
||||
<translation>Zemljepisna širina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="160"/>
|
||||
<source>Longitude reference</source>
|
||||
<translation>Referenčna dolžina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="162"/>
|
||||
<source>Longitude</source>
|
||||
<translation>Zemljepisna dolžina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="164"/>
|
||||
<source>Altitude reference</source>
|
||||
<translation>Referenčna višina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="166"/>
|
||||
<source>Altitude</source>
|
||||
<translation>Nadmorska višina</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="176"/>
|
||||
<source>%1 x %2</source>
|
||||
<translation>%1 x %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="194"/>
|
||||
<source>%1 : %2</source>
|
||||
<translation>%1 : %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Property</source>
|
||||
<translation>Lastnost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Value</source>
|
||||
<translation>Vrednost</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Nastavitve</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Možnosti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Bližnjice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>Urejanje bližnjic za dejanje "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>Nastavitev bližnjic ni uspela</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>Preverite, ali so bližnjice podvojene z obstoječimi bližnjicami.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Ne naredi ničesar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Zapri okno</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Preklopi maksimiranje</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>Preklopi celozaslonski način</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Povečava in pomanjšava</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Ogled naslednjega ali prejšnjega elementa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Samodejna velikost</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Maksimizirano</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Okenski način</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Zaokroženo (celoštevilsko skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Zaokroževanje navzgor (celoštevilsko skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Zaokroževanje navzdol (celoštevilsko skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Sledi sistemu (delno skaliranje)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Ostani na vrhu pri zagonu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation>Uporabi vgrajeno animacijo zapiranja okna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Uporabite svetlo šahovnico</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>Ponavljaj naloženo galerijo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Samodejni način dolge slike</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>Omeji podporo za SVG na SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Obnašanje dvojnega klika</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Obnašanje miškinega kolesca</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Privzeta velikost okna</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Politika zaokroževanja faktorja merila HiDPI</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Brez bližnjic</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Bližnjica #%1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>main</name>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="42"/>
|
||||
<source>Pineapple Pictures</source>
|
||||
<translation>Pineapple Slike</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="45"/>
|
||||
<source>List supported image format suffixes, and quit program.</source>
|
||||
<translation>Naštej podprte pripone slikovnih formatov in zapri program.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="49"/>
|
||||
<source>File list.</source>
|
||||
<translation>Seznam datotek.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>படத்தை இங்கே இழுக்கவும்</translation>
|
||||
@@ -198,194 +198,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>கோப்பு முகவரி பட்டியல் காலியாக உள்ளது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>நகலெடு (&c)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>படத் தரவு தவறானது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>மைமெடாட்டாவை ஆதரிக்கவில்லை: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>கிளிப்போர்டிலிருந்து படம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>பின் மறுசுழற்சி செய்ய "%1" ஐ நகர்த்த விரும்புகிறீர்களா?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>கோப்பை குப்பைக்கு நகர்த்துவதில் தோல்வி</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>குப்பைக்கு நகர்வது தோல்வியுற்றது, இது கோப்பு இசைவு சிக்கல், கோப்பு முறைமை வரம்பு அல்லது இயங்குதள வரம்பு ஆகியவற்றால் ஏற்படலாம்.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>பி & ஐஎக்ச்மேப்பை நகலெடுக்கவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>கோப்பு பாதையை நகலெடுக்கவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>பண்புகள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>மேலே இருங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>பாதுகாக்கப்பட்ட பயன்முறை</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>மாற்றத்தைத் தொடருங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>பெரிதாக்கு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>சிறிதாக்கு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>இடைநிறுத்தம்/அனிமேசனை மீண்டும் தொடங்குங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>அனிமேசன் அடுத்த சட்டகத்திற்குச் செல்லுங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>கிடைமட்டமாக புரட்டவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>பார்க்க பொருத்தமானது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>அகலத்திற்கு ஏற்றது</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>ஒட்டு (&p)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>செக்கர்போர்டை மாற்றவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>& திறந்த ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>உண்மையான அளவு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>அதிகபட்சத்தை மாற்றவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>வலதுபுறம் சுழற்றுங்கள்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>இடதுபுறம் சுழலும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>முந்தைய படம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>அடுத்த படம்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>குப்பைக்கு நகர்த்தவும்</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>உள்ளமைக்கவும் ...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>உதவி</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>கோப்பு எக்ச்ப்ளோரரில் காண்பி</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>கோப்பகத்தில் காட்டு</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>வெளியேறு</translation>
|
||||
</message>
|
||||
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Resmi buraya sürükleyin</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Dosya URL listesi boş</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Kopyala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Resim verisi geçersiz</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Desteklenmeyen dosya türü verisi: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Panodaki Resim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>"%1" ögesini geri dönüşüm kutusuna taşımak istediğinizden emin misiniz?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Dosya çöpe taşınamadı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Çöp kutusuna taşıma başarısız oldu, dosya izin sorunu, dosya sistemi sınırlaması veya platform sınırlamasından kaynaklanıyor olabilir.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>P&ixmap'i Kopyala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>&Dosya Yolunu Kopyala</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Özellikler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Üstte tut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Korumalı kip</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Dönüşümü koru</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Yaklaştır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Uzaklaştır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Canlandırmayı Duraklat/Sürdür</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Canlandırma Sonraki Kareye Git</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>&Yatay Çevir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Görünüme sığdır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Genişliğe sığdır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Geniş resmi sığdır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>Ya&pıştır</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Damalı Ekrana Geç</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Aç...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Gerçek boyut</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Tam boyuta geç</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Sağa döndür</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Sola döndür</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Önceki resim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Sonraki resim</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Çöp Kutusuna Taşı</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Yapılandır...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Yardım</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Dosya Gezgini'nde Göster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Dizinde göster</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Çıkış</translation>
|
||||
</message>
|
||||
@@ -858,7 +891,7 @@
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>SVG desteğini SVG Tiny 1.2 ile sınırla</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
|
||||
@@ -174,7 +174,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Перетягніть зображення сюди</translation>
|
||||
@@ -210,194 +210,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Список URL-адрес файлів порожній</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Скопіювати</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Дані зображення недійсні</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Не підтримується mimedata: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Скопіювати P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Скопіювати &шлях до файлу</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Властивості</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Поверх всіх вікон</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Захищений режим</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Зберігати трансформацію</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Збільшити</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Зменшити</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Перевернути по &горизонталі</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Вставити</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Перемкнути шахову дошку</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Відкрити...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Фактичний розмір</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Перемкнути на максимум</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Перегорнути праворуч</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Попереднє зображення</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Наступне зображення</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Налаштувати...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Допомога</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Показати у файловому провіднику</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Показати у теці</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Вийти</translation>
|
||||
</message>
|
||||
|
||||
@@ -0,0 +1,936 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="vi">
|
||||
<context>
|
||||
<name>AboutDialog</name>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="29"/>
|
||||
<source>About</source>
|
||||
<translation>Giới thiệu về</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="32"/>
|
||||
<source>Launch application with image file path as argument to load the file.</source>
|
||||
<translation>Khởi chạy ứng dụng với đường dẫn tệp hình ảnh làm đối số để tải tệp.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="33"/>
|
||||
<source>Drag and drop image file onto the window is also supported.</source>
|
||||
<translation>Kéo và thả tệp hình ảnh vào cửa sổ cũng được hỗ trợ.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="34"/>
|
||||
<source>None of the operations in this application will alter the pictures on disk.</source>
|
||||
<translation>Không có thao tác nào trong ứng dụng này sẽ làm thay đổi hình ảnh trên đĩa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="35"/>
|
||||
<source>Context menu option explanation:</source>
|
||||
<translation>Giải thích tùy chọn menu ngữ cảnh:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="42"/>
|
||||
<source>Make window stay on top of all other windows.</source>
|
||||
<translation>Đặt cửa sổ ở trên cùng của tất cả các cửa sổ khác.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="45"/>
|
||||
<source>Avoid close window accidentally. (eg. by double clicking the window)</source>
|
||||
<translation>Tránh vô tình đóng cửa sổ. (ví dụ: bằng cách nhấp đúp vào cửa sổ)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="48"/>
|
||||
<source>Avoid resetting the zoom/rotation/flip state that was applied to the image view when switching between images.</source>
|
||||
<translation>Tránh đặt lại trạng thái zoom/xoay/lật đã được áp dụng cho xem hình ảnh khi chuyển đổi giữa các hình ảnh.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="55"/>
|
||||
<source>Version: %1</source>
|
||||
<translation>Phiên bản: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="66"/>
|
||||
<source>Logo designed by %1</source>
|
||||
<translation>Logo được thiết kế bởi %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="68"/>
|
||||
<source>Built with Qt %1 (%2)</source>
|
||||
<translation>Được xây dựng với Qt %1 (%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="69"/>
|
||||
<source>Source code</source>
|
||||
<translation>Mã nguồn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="79"/>
|
||||
<source>Contributors</source>
|
||||
<translation>Người đóng góp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="81"/>
|
||||
<source>List of contributors on GitHub</source>
|
||||
<translation>Danh sách những người đóng góp trên GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="82"/>
|
||||
<source>Thanks to all people who contributed to this project.</source>
|
||||
<translation>Cảm ơn tất cả những người đã đóng góp cho dự án này.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="86"/>
|
||||
<source>Translators</source>
|
||||
<translation>Vietnam Linux L10n <https://github.com/linux-l10n-vi>
|
||||
Loc Huynh <https://github.com/hthienloc></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="87"/>
|
||||
<source>I would like to thank the following people who volunteered to translate this application.</source>
|
||||
<translation>Tôi xin cảm ơn những người sau đây đã tình nguyện dịch ứng dụng này.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="131"/>
|
||||
<source>%1 is built on the following free software libraries:</source>
|
||||
<comment>Free as in freedom</comment>
|
||||
<translation>%1 được xây dựng trên các thư viện phần mềm miễn phí sau:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="155"/>
|
||||
<source>&Special Thanks</source>
|
||||
<translation>&Cảm ơn đặc biệt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="157"/>
|
||||
<source>&Third-party Libraries</source>
|
||||
<translation>&Thư viện của bên thứ ba</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="93"/>
|
||||
<source>Your Rights</source>
|
||||
<translation>Quyền của bạn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="63"/>
|
||||
<source>Copyright (c) %1 %2</source>
|
||||
<comment>%1 is year, %2 is the name of copyright holder(s)</comment>
|
||||
<translation>Bản quyền (c) %1 %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="95"/>
|
||||
<source>%1 is released under the MIT License.</source>
|
||||
<translation>%1 được phát hành theo Giấy phép MIT.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="96"/>
|
||||
<source>This license grants people a number of freedoms:</source>
|
||||
<translation>Giấy phép này cấp cho mọi người một số quyền tự do:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="97"/>
|
||||
<source>You are free to use %1, for any purpose</source>
|
||||
<translation>Bạn được tự do sử dụng %1, cho bất kỳ mục đích nào</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="98"/>
|
||||
<source>You are free to distribute %1</source>
|
||||
<translation>Bạn được tự do phân phối %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="99"/>
|
||||
<source>You can study how %1 works and change it</source>
|
||||
<translation>Bạn có thể nghiên cứu cách %1 hoạt động và thay đổi nó</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="100"/>
|
||||
<source>You can distribute changed versions of %1</source>
|
||||
<translation>Bạn có thể phân phối các phiên bản đã thay đổi của %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="102"/>
|
||||
<source>The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.</source>
|
||||
<translation>Giấy phép MIT đảm bảo cho bạn sự tự do này. Không ai được phép mang nó đi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="130"/>
|
||||
<source>Third-party Libraries used by %1</source>
|
||||
<translation>Thư viện của bên thứ ba được %1 sử dụng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="153"/>
|
||||
<source>&Help</source>
|
||||
<translation>&Trợ giúp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="154"/>
|
||||
<source>&About</source>
|
||||
<translation>&Giới thiệu giới thiệu về</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../aboutdialog.cpp" line="156"/>
|
||||
<source>&License</source>
|
||||
<translation>&Giấy phép</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>Kéo hình ảnh vào đây</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>GraphicsView</name>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="51"/>
|
||||
<source>File is not a valid image</source>
|
||||
<translation>Tệp không phải là hình ảnh hợp lệ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../graphicsview.cpp" line="55"/>
|
||||
<location filename="../graphicsview.cpp" line="60"/>
|
||||
<location filename="../graphicsview.cpp" line="71"/>
|
||||
<source>Image data is invalid or currently unsupported</source>
|
||||
<translation>Dữ liệu hình ảnh không hợp lệ hoặc hiện không được hỗ trợ</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>Danh sách url tệp trống</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>&Sao chép</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>Dữ liệu hình ảnh không hợp lệ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>Dữ liệu mimedata không được hỗ trợ: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>Lưu dưới dạng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>Hiện tại không có hình ảnh nào được mở.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>Hình ảnh %1 (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>Không có định dạng hình ảnh được hỗ trợ.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>Không lưu được hình ảnh: %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>Hình ảnh từ bộ nhớ tạm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>Bạn có chắc chắn muốn chuyển "%1" vào thùng rác không?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>Không thể di chuyển tệp vào thùng rác</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>Di chuyển vào thùng rác không thành công, nguyên nhân có thể là do vấn đề về quyền đối với tệp, giới hạn hệ thống tệp hoặc giới hạn nền tảng.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>Sao chép P&ixmap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>Sao chép Đường &dẫn tệp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>Thuộc tính</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>Luôn trên đầu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>Chế độ bảo vệ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>Giữ sự chuyển đổi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>Phóng to</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>Lưu &dưới dạng...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>Thu nhỏ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>Tạm dừng/Tiếp tục hoạt ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>Hoạt hình Chuyển đến khung tiếp theo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>Lật &Theo chiều ngang</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>Phù hợp để xem</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>Vừa với chiều rộng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>Vừa với hình ảnh dài</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Dán</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>Chuyển đổi bàn cờ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>&Mở...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>Kích thước thực tế</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Chuyển đổi tối đa hóa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>Xoay phải</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>Xoay trái</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>Hình ảnh trước đó</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>Hình ảnh tiếp theo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>Chuyển vào Thùng rác</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>Cấu hình...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>Trợ giúp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>Hiển thị trong tệp Explorer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>Hiển thị trong thư mục</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>Thoát</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataDialog</name>
|
||||
<message>
|
||||
<location filename="../metadatadialog.cpp" line="84"/>
|
||||
<source>Image Metadata</source>
|
||||
<translation>Siêu dữ liệu hình ảnh</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MetadataModel</name>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="43"/>
|
||||
<source>Origin</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Nguồn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="44"/>
|
||||
<source>Image</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Hình ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="48"/>
|
||||
<source>File</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Tệp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="45"/>
|
||||
<source>Camera</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Camera</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="35"/>
|
||||
<source>%1 File</source>
|
||||
<translation>Tệp %1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="42"/>
|
||||
<source>Description</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Mô tả</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="46"/>
|
||||
<source>Advanced photo</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>Ảnh nâng cao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="47"/>
|
||||
<source>GPS</source>
|
||||
<comment>Section name.</comment>
|
||||
<translation>GPS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="52"/>
|
||||
<source>Dimensions</source>
|
||||
<translation>Kích thước</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="54"/>
|
||||
<source>Aspect ratio</source>
|
||||
<translation>Tỷ lệ khung hình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="58"/>
|
||||
<source>Frame count</source>
|
||||
<translation>Số khung hình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="62"/>
|
||||
<source>Name</source>
|
||||
<translation>Tên</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="64"/>
|
||||
<source>Item type</source>
|
||||
<translation>Loại mặt hàng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="66"/>
|
||||
<source>Folder path</source>
|
||||
<translation>Đường dẫn thư mục</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="68"/>
|
||||
<source>Size</source>
|
||||
<translation>Kích thước</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="70"/>
|
||||
<source>Date created</source>
|
||||
<translation>Ngày tạo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="72"/>
|
||||
<source>Date modified</source>
|
||||
<translation>Ngày sửa đổi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="79"/>
|
||||
<source>Title</source>
|
||||
<translation>Tiêu đề</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="81"/>
|
||||
<source>Subject</source>
|
||||
<translation>Chủ thể</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="83"/>
|
||||
<source>Rating</source>
|
||||
<translation>Đánh giá</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="85"/>
|
||||
<source>Tags</source>
|
||||
<translation>Thẻ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="87"/>
|
||||
<source>Comments</source>
|
||||
<translation>Bình luận</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="90"/>
|
||||
<source>Authors</source>
|
||||
<translation>Các tác giả</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="92"/>
|
||||
<source>Date taken</source>
|
||||
<translation>Ngày chụp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="98"/>
|
||||
<source>Program name</source>
|
||||
<translation>Tên chương trình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="100"/>
|
||||
<source>Copyright</source>
|
||||
<translation>Bản quyền</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="103"/>
|
||||
<source>Horizontal resolution</source>
|
||||
<translation>Độ phân giải ngang</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="105"/>
|
||||
<source>Vertical resolution</source>
|
||||
<translation>Độ phân giải dọc</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="107"/>
|
||||
<source>Resolution unit</source>
|
||||
<translation>Đơn vị độ phân giải</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="109"/>
|
||||
<source>Colour representation</source>
|
||||
<translation>Thể hiện màu sắc</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="112"/>
|
||||
<source>Camera maker</source>
|
||||
<translation>Nhà sản xuất máy ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="114"/>
|
||||
<source>Camera model</source>
|
||||
<translation>Mẫu máy ảnh</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="116"/>
|
||||
<source>F-stop</source>
|
||||
<translation>F-dừng lại</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="118"/>
|
||||
<source>Exposure time</source>
|
||||
<translation>Thời gian phơi nhiễm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="120"/>
|
||||
<source>ISO speed</source>
|
||||
<translation>Tốc độ ISO</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="122"/>
|
||||
<source>Exposure bias</source>
|
||||
<translation>Xu hướng tiếp xúc</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="124"/>
|
||||
<source>Focal length</source>
|
||||
<translation>Tiêu cự</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="126"/>
|
||||
<source>Max aperture</source>
|
||||
<translation>Khẩu độ tối đa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="128"/>
|
||||
<source>Metering mode</source>
|
||||
<translation>Chế độ đo sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="130"/>
|
||||
<source>Subject distance</source>
|
||||
<translation>Khoảng cách chủ đề</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="132"/>
|
||||
<source>Flash mode</source>
|
||||
<translation>Chế độ đèn nháy</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="134"/>
|
||||
<source>35mm focal length</source>
|
||||
<translation>tiêu cự 35mm</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="137"/>
|
||||
<source>Lens model</source>
|
||||
<translation>Mẫu ống kính</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="139"/>
|
||||
<source>Contrast</source>
|
||||
<translation>Độ tương phản</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="141"/>
|
||||
<source>Brightness</source>
|
||||
<translation>Độ sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="143"/>
|
||||
<source>Exposure program</source>
|
||||
<translation>Chương trình phơi sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="145"/>
|
||||
<source>Saturation</source>
|
||||
<translation>Độ bão hòa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="147"/>
|
||||
<source>Sharpness</source>
|
||||
<translation>Độ sắc nét</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="149"/>
|
||||
<source>White balance</source>
|
||||
<translation>Cân bằng trắng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="151"/>
|
||||
<source>Digital zoom</source>
|
||||
<translation>Zoom kỹ thuật số</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="153"/>
|
||||
<source>EXIF version</source>
|
||||
<translation>Phiên bản EXIF</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="156"/>
|
||||
<source>Latitude reference</source>
|
||||
<translation>Tham chiếu vĩ độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="158"/>
|
||||
<source>Latitude</source>
|
||||
<translation>Vĩ độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="160"/>
|
||||
<source>Longitude reference</source>
|
||||
<translation>Tham chiếu kinh độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="162"/>
|
||||
<source>Longitude</source>
|
||||
<translation>Kinh độ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="164"/>
|
||||
<source>Altitude reference</source>
|
||||
<translation>Tham chiếu độ cao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="166"/>
|
||||
<source>Altitude</source>
|
||||
<translation>Độ cao</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="176"/>
|
||||
<source>%1 x %2</source>
|
||||
<translation>%1 x %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="194"/>
|
||||
<source>%1 : %2</source>
|
||||
<translation>%1 : %2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Property</source>
|
||||
<translation>Tài sản</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../metadatamodel.cpp" line="319"/>
|
||||
<source>Value</source>
|
||||
<translation>Giá trị</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SettingsDialog</name>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="33"/>
|
||||
<source>Settings</source>
|
||||
<translation>Cài đặt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="41"/>
|
||||
<source>Options</source>
|
||||
<translation>Tùy chọn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="53"/>
|
||||
<source>Shortcuts</source>
|
||||
<translation>Phím tắt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="63"/>
|
||||
<source>Editing shortcuts for action "%1":</source>
|
||||
<translation>Chỉnh sửa phím tắt cho hành động "%1":</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="72"/>
|
||||
<source>Failed to set shortcuts</source>
|
||||
<translation>Không đặt được phím tắt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="73"/>
|
||||
<source>Please check if shortcuts are duplicated with existing shortcuts.</source>
|
||||
<translation>Vui lòng kiểm tra xem các phím tắt có bị trùng lặp với các phím tắt hiện có hay không.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="80"/>
|
||||
<source>Do nothing</source>
|
||||
<translation>Không làm gì cả</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="81"/>
|
||||
<source>Close the window</source>
|
||||
<translation>Đóng cửa sổ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="82"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>Chuyển đổi tối đa hóa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="83"/>
|
||||
<source>Toggle fullscreen</source>
|
||||
<translation>Chuyển đổi toàn màn hình</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="87"/>
|
||||
<source>Zoom in and out</source>
|
||||
<translation>Zoom và thu nhỏ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="88"/>
|
||||
<source>View next or previous item</source>
|
||||
<translation>Xem mục tiếp theo hoặc trước đó</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="92"/>
|
||||
<source>Auto size</source>
|
||||
<translation>Kích thước tự động</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="93"/>
|
||||
<source>Maximized</source>
|
||||
<translation>Tối đa hóa</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="94"/>
|
||||
<source>Windowed</source>
|
||||
<translation>Có cửa sổ</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="98"/>
|
||||
<source>Round (Integer scaling)</source>
|
||||
<comment>This option means round up for .5 and above</comment>
|
||||
<translation>Tròn (Tỷ lệ số nguyên)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="99"/>
|
||||
<source>Ceil (Integer scaling)</source>
|
||||
<comment>This option means always round up</comment>
|
||||
<translation>Ceil (Tỷ lệ số nguyên)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="100"/>
|
||||
<source>Floor (Integer scaling)</source>
|
||||
<comment>This option means always round down</comment>
|
||||
<translation>Tầng (Tỷ lệ số nguyên)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="101"/>
|
||||
<source>Follow system (Fractional scaling)</source>
|
||||
<comment>This option means don't round</comment>
|
||||
<translation>Hệ thống theo dõi (Chia tỷ lệ phân số)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="124"/>
|
||||
<source>Stay on top when start-up</source>
|
||||
<translation>Luôn dẫn đầu khi khởi nghiệp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="125"/>
|
||||
<source>Use built-in close window animation</source>
|
||||
<translation>Sử dụng hoạt ảnh đóng cửa sổ tích hợp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="126"/>
|
||||
<source>Use light-color checkerboard</source>
|
||||
<translation>Sử dụng bàn cờ màu sáng</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="127"/>
|
||||
<source>Loop the loaded gallery</source>
|
||||
<translation>Lặp lại thư viện đã tải</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="128"/>
|
||||
<source>Auto long image mode</source>
|
||||
<translation>Chế độ hình ảnh dài tự động</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="129"/>
|
||||
<source>Limit SVG support to SVG Tiny 1.2</source>
|
||||
<translation>Giới hạn hỗ trợ SVG ở SVG Tiny 1.2</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="130"/>
|
||||
<source>Double-click behavior</source>
|
||||
<translation>Hành vi bấm đúp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="131"/>
|
||||
<source>Mouse wheel behavior</source>
|
||||
<translation>Hành vi của bánh xe chuột</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="132"/>
|
||||
<source>Default window size</source>
|
||||
<translation>Kích thước cửa sổ mặc định</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../settingsdialog.cpp" line="133"/>
|
||||
<source>HiDPI scale factor rounding policy</source>
|
||||
<translation>Chính sách làm tròn hệ số tỷ lệ HiDPI</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEdit</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="104"/>
|
||||
<source>No shortcuts</source>
|
||||
<translation>Không phím tắt</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ShortcutEditor</name>
|
||||
<message>
|
||||
<location filename="../shortcutedit.cpp" line="70"/>
|
||||
<source>Shortcut #%1</source>
|
||||
<translation>Phím tắt #%1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>main</name>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="42"/>
|
||||
<source>Pineapple Pictures</source>
|
||||
<translation>Pineapple Pictures</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="45"/>
|
||||
<source>List supported image format suffixes, and quit program.</source>
|
||||
<translation>Liệt kê các hậu tố định dạng hình ảnh được hỗ trợ và thoát khỏi chương trình.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../main.cpp" line="49"/>
|
||||
<source>File list.</source>
|
||||
<translation>Danh sách tệp.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
@@ -178,7 +178,7 @@
|
||||
<context>
|
||||
<name>GraphicsScene</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="292"/>
|
||||
<location filename="../mainwindow.cpp" line="293"/>
|
||||
<location filename="../graphicsscene.cpp" line="102"/>
|
||||
<source>Drag image here</source>
|
||||
<translation>拖放图片至此</translation>
|
||||
@@ -214,194 +214,227 @@
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="190"/>
|
||||
<location filename="../mainwindow.cpp" line="561"/>
|
||||
<location filename="../mainwindow.cpp" line="191"/>
|
||||
<location filename="../mainwindow.cpp" line="568"/>
|
||||
<source>File url list is empty</source>
|
||||
<translation>文件 URL 列表为空</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="461"/>
|
||||
<location filename="../mainwindow.cpp" line="462"/>
|
||||
<source>&Copy</source>
|
||||
<translation>复制(&C)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="569"/>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<source>Image data is invalid</source>
|
||||
<translation>图片数据无效</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="576"/>
|
||||
<location filename="../mainwindow.cpp" line="583"/>
|
||||
<source>Not supported mimedata: %1</source>
|
||||
<translation>不受支持的 MimeData 格式:%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="783"/>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<location filename="../mainwindow.cpp" line="727"/>
|
||||
<location filename="../mainwindow.cpp" line="734"/>
|
||||
<location filename="../mainwindow.cpp" line="764"/>
|
||||
<source>Save As</source>
|
||||
<translation>另存为</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="710"/>
|
||||
<source>No image is currently open.</source>
|
||||
<translation>当前未打开图像。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="722"/>
|
||||
<source>%1 Image (*.%2)</source>
|
||||
<translation>%1 图像 (*.%2)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="728"/>
|
||||
<source>No supported image formats are available.</source>
|
||||
<translation>没有可用的图像格式。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="765"/>
|
||||
<source>Failed to save image: %1</source>
|
||||
<translation>保存图像失败:%1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="854"/>
|
||||
<source>Image From Clipboard</source>
|
||||
<translation>剪切板图片</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="801"/>
|
||||
<location filename="../mainwindow.cpp" line="872"/>
|
||||
<source>Are you sure you want to move "%1" to recycle bin?</source>
|
||||
<translation>您确认要将“%1”移动到回收站吗?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="805"/>
|
||||
<location filename="../mainwindow.cpp" line="876"/>
|
||||
<source>Failed to move file to trash</source>
|
||||
<translation>无法移动文件至回收站</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="806"/>
|
||||
<location filename="../mainwindow.cpp" line="877"/>
|
||||
<source>Move to trash failed, it might caused by file permission issue, file system limitation, or platform limitation.</source>
|
||||
<translation>移至回收站失败,这可能由文件权限、文件系统或平台限制导致。</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<source>Copy P&ixmap</source>
|
||||
<translation>复制位图(&I)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<source>Copy &File Path</source>
|
||||
<translation>复制文件路径(&F)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<location filename="../actionmanager.cpp" line="127"/>
|
||||
<source>Properties</source>
|
||||
<translation>属性</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../aboutdialog.cpp" line="41"/>
|
||||
<source>Stay on top</source>
|
||||
<translation>总在最前</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../aboutdialog.cpp" line="44"/>
|
||||
<source>Protected mode</source>
|
||||
<translation>保护模式</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="112"/>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../aboutdialog.cpp" line="47"/>
|
||||
<source>Keep transformation</source>
|
||||
<comment>The 'transformation' means the flip/rotation status that currently applied to the image view</comment>
|
||||
<translation>保持视图变换</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<source>Zoom in</source>
|
||||
<translation>放大</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<source>Save &As...</source>
|
||||
<translation>另存为(&A)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<source>Zoom out</source>
|
||||
<translation>缩小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<location filename="../actionmanager.cpp" line="101"/>
|
||||
<source>Pause/Resume Animation</source>
|
||||
<translation>暂定/继续动画播放</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="100"/>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<source>Animation Go to Next Frame</source>
|
||||
<translation>动画逐帧播放</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="102"/>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<source>Flip &Horizontally</source>
|
||||
<translation>水平翻转(&H)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="103"/>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<source>Fit to view</source>
|
||||
<translation>自适应视图大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="104"/>
|
||||
<location filename="../actionmanager.cpp" line="106"/>
|
||||
<source>Fit to width</source>
|
||||
<translation>自适应宽度</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="105"/>
|
||||
<location filename="../actionmanager.cpp" line="107"/>
|
||||
<source>Fit long image</source>
|
||||
<translation>自适应长图</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="108"/>
|
||||
<location filename="../actionmanager.cpp" line="110"/>
|
||||
<source>&Paste</source>
|
||||
<translation>粘贴(&P)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="92"/>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<source>Toggle Checkerboard</source>
|
||||
<translation>切换棋盘格</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="86"/>
|
||||
<location filename="../actionmanager.cpp" line="87"/>
|
||||
<source>&Open...</source>
|
||||
<translation>打开(&O)...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="88"/>
|
||||
<location filename="../actionmanager.cpp" line="90"/>
|
||||
<source>Actual size</source>
|
||||
<translation>实际大小</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="89"/>
|
||||
<location filename="../actionmanager.cpp" line="91"/>
|
||||
<source>Toggle maximize</source>
|
||||
<translation>最大化窗口</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="93"/>
|
||||
<location filename="../actionmanager.cpp" line="95"/>
|
||||
<source>Rotate right</source>
|
||||
<translation>向右旋转</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="94"/>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<source>Rotate left</source>
|
||||
<translation>向左旋转</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="96"/>
|
||||
<location filename="../actionmanager.cpp" line="98"/>
|
||||
<source>Previous image</source>
|
||||
<translation>上一个图像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="97"/>
|
||||
<location filename="../actionmanager.cpp" line="99"/>
|
||||
<source>Next image</source>
|
||||
<translation>下一个图像</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../mainwindow.cpp" line="800"/>
|
||||
<location filename="../actionmanager.cpp" line="109"/>
|
||||
<location filename="../mainwindow.cpp" line="871"/>
|
||||
<location filename="../actionmanager.cpp" line="111"/>
|
||||
<source>Move to Trash</source>
|
||||
<translation>移至回收站</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="113"/>
|
||||
<location filename="../actionmanager.cpp" line="115"/>
|
||||
<source>Configure...</source>
|
||||
<translation>设置...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="114"/>
|
||||
<location filename="../actionmanager.cpp" line="116"/>
|
||||
<source>Help</source>
|
||||
<translation>帮助</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="117"/>
|
||||
<location filename="../actionmanager.cpp" line="119"/>
|
||||
<source>Show in File Explorer</source>
|
||||
<comment>File Explorer is the name of explorer.exe under Windows</comment>
|
||||
<translation>在文件资源管理器中显示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="123"/>
|
||||
<location filename="../actionmanager.cpp" line="125"/>
|
||||
<source>Show in directory</source>
|
||||
<translation>在文件夹中显示</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../actionmanager.cpp" line="126"/>
|
||||
<location filename="../actionmanager.cpp" line="128"/>
|
||||
<source>Quit</source>
|
||||
<translation>退出</translation>
|
||||
</message>
|
||||
|
||||
-158
@@ -1,158 +0,0 @@
|
||||
image:
|
||||
- Visual Studio 2022
|
||||
environment:
|
||||
CMAKE_INSTALL_PREFIX: C:\projects\cmake
|
||||
LIBZ: C:\projects\zlib
|
||||
LIBEXPAT: C:\projects\libexpat
|
||||
LIBAVIF: C:\projects\libavif
|
||||
LIBEXIV2: C:\projects\exiv2
|
||||
PPKG: C:\projects\ppkg
|
||||
matrix:
|
||||
- job_name: mingw_64_qt6_8
|
||||
QTDIR: C:\Qt\6.8\mingw_64
|
||||
MINGW64: C:\Qt\mingw_64\Tools\mingw1310_64
|
||||
KF_BRANCH: master
|
||||
EXIV2_VERSION: "0.28.7"
|
||||
EXIV2_CMAKE_OPTIONS: "-DEXIV2_ENABLE_BROTLI=OFF -DEXIV2_ENABLE_INIH=OFF -DEXIV2_BUILD_EXIV2_COMMAND=OFF"
|
||||
PPIC_CMAKE_OPTIONS: "-DPREFER_QT_5=OFF"
|
||||
WINDEPLOYQT_ARGS: "--verbose=2 --no-quick-import --no-translations --no-opengl-sw --no-system-d3d-compiler --skip-plugin-types tls,networkinformation"
|
||||
|
||||
install:
|
||||
- mkdir %CMAKE_INSTALL_PREFIX%
|
||||
- mkdir %LIBZ%
|
||||
- mkdir %LIBEXPAT%
|
||||
- mkdir %LIBAVIF%
|
||||
- mkdir %LIBEXIV2%
|
||||
- mkdir %PPKG%
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
- git submodule update --init --recursive
|
||||
- set PATH=%PATH%;%CMAKE_INSTALL_PREFIX%;%QTDIR%\bin;%MINGW64%\bin;%PPKG%
|
||||
- set CC=%MINGW64%\bin\gcc.exe
|
||||
- set CXX=%MINGW64%\bin\g++.exe
|
||||
|
||||
build_script:
|
||||
# prepare
|
||||
- mkdir 3rdparty
|
||||
- choco install ninja
|
||||
- cd %PPKG%
|
||||
- curl -fsSL -o ppkg.exe https://github.com/BLumia/pineapple-package-manager/releases/latest/download/ppkg.exe
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# download and install zlib for KArchive
|
||||
- cd %LIBZ%
|
||||
- curl -fsSL -o zlib131.zip https://zlib.net/zlib131.zip
|
||||
- 7z x zlib131.zip -y
|
||||
- cd zlib-1.3.1
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX%
|
||||
- cmake --build . --config Release
|
||||
- cmake --build . --config Release --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# install ECM so we can build KImageFormats
|
||||
- cd 3rdparty
|
||||
- git clone -b %KF_BRANCH% -q https://invent.kde.org/frameworks/extra-cmake-modules.git
|
||||
- git rev-parse HEAD
|
||||
- cd extra-cmake-modules
|
||||
- cmake -G "Ninja" . -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% -DBUILD_TESTING=OFF
|
||||
- cmake --build .
|
||||
- cmake --build . --target install
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# install AOM for libavif AV1 decoding support...
|
||||
- cd 3rdparty
|
||||
#- git clone -b v3.9.1 --depth 1 https://aomedia.googlesource.com/aom
|
||||
#- cd aom
|
||||
#- mkdir build.aom
|
||||
#- cd build.aom
|
||||
#- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% -DENABLE_DOCS=OFF -DBUILD_SHARED_LIBS=ON -DAOM_TARGET_CPU=generic -DENABLE_TESTS=OFF -DENABLE_TESTDATA=OFF -DENABLE_TOOLS=OFF -DENABLE_EXAMPLES=0
|
||||
#- cmake --build . --config Release
|
||||
#- cmake --build . --config Release --target install/strip
|
||||
- mkdir aom
|
||||
- cd aom
|
||||
- curl -fsSL -o ppkg-aom.zip https://sourceforge.net/projects/pineapple-package-manager/files/packages/mingw-w64-x86_64-windows/aom-3.9.1-2.zip
|
||||
- ppkg ppkg-aom.zip
|
||||
- 7z x ppkg-aom.zip LICENSE -y
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# install libavif for avif format support of KImageFormats
|
||||
- cd %LIBAVIF%
|
||||
- curl -fsSL -o libavif-v1_3_0.zip https://github.com/AOMediaCodec/libavif/archive/v1.3.0.zip
|
||||
- 7z x libavif-v1_3_0.zip -y
|
||||
- cd libavif-1.3.0
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% -DAVIF_CODEC_AOM=SYSTEM -DAVIF_CODEC_AOM_DECODE=ON -DAVIF_CODEC_AOM_ENCODE=ON -DAVIF_LIBYUV=LOCAL
|
||||
- cmake --build . --config Release
|
||||
- cmake --build . --config Release --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# install KArchive for kra format support of KImageFormats
|
||||
- cd 3rdparty
|
||||
- git clone -b %KF_BRANCH% -q https://invent.kde.org/frameworks/karchive.git
|
||||
- git rev-parse HEAD
|
||||
- cd karchive
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" -DBUILD_TESTING=OFF -DWITH_LIBZSTD=OFF -DWITH_BZIP2=OFF -DWITH_LIBLZMA=OFF -DWITH_OPENSSL=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX%
|
||||
- cmake --build . --config Release
|
||||
- cmake --build . --config Release --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# build libexpat for libexiv2
|
||||
- cd %LIBEXPAT%
|
||||
- curl -fsSL -o R_2_7_3.zip https://github.com/libexpat/libexpat/archive/R_2_7_3.zip
|
||||
- 7z x R_2_7_3.zip -y
|
||||
- cd libexpat-R_2_7_3/expat/
|
||||
- cmake -G "Ninja" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% -DEXPAT_BUILD_EXAMPLES=OFF -DEXPAT_BUILD_TESTS=OFF -DEXPAT_BUILD_TOOLS=OFF
|
||||
- cmake --build . --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# build libexiv2
|
||||
- cd %LIBEXIV2%
|
||||
- curl -fsSL -o v%EXIV2_VERSION%.zip https://github.com/Exiv2/exiv2/archive/v%EXIV2_VERSION%.zip
|
||||
- 7z x v%EXIV2_VERSION%.zip -y
|
||||
- cd exiv2-%EXIV2_VERSION%
|
||||
- cmake -G "Ninja" . -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX% %EXIV2_CMAKE_OPTIONS%
|
||||
- cmake --build . --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# install KImageFormats
|
||||
- cd 3rdparty
|
||||
- git clone -b %KF_BRANCH% -q https://invent.kde.org/frameworks/kimageformats.git
|
||||
- git rev-parse HEAD
|
||||
- cd kimageformats
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" -DBUILD_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DKDE_INSTALL_QTPLUGINDIR=%QTDIR%\plugins
|
||||
- cmake --build . --config Release
|
||||
- cmake --build . --config Release --target install/strip
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# finally...
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" %PPIC_CMAKE_OPTIONS% -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=%CMAKE_INSTALL_PREFIX% -DCMAKE_INSTALL_PREFIX='%cd%'
|
||||
- cmake --build . --config Release
|
||||
- cmake --build . --config Release --target install/strip
|
||||
# fixme: I don't know how to NOT make the binary installed to the ./bin/ folder...
|
||||
- cd bin
|
||||
- copy %APPVEYOR_BUILD_FOLDER%\LICENSE
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libaom.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libexpat-1.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libexiv2.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libavif.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libzlib.dll
|
||||
- copy %CMAKE_INSTALL_PREFIX%\bin\libKF?Archive.dll
|
||||
- windeployqt %WINDEPLOYQT_ARGS% .\ppic.exe
|
||||
# copy 3rdparty licenses for the libs we vendored for windows...
|
||||
- mkdir licenses
|
||||
- cd licenses
|
||||
- copy %APPVEYOR_BUILD_FOLDER%\3rdparty\aom\LICENSE License.aom.txt
|
||||
- copy %APPVEYOR_BUILD_FOLDER%\3rdparty\karchive\LICENSES\LGPL-2.0-or-later.txt License.KArchive.txt
|
||||
- copy %APPVEYOR_BUILD_FOLDER%\3rdparty\kimageformats\LICENSES\LGPL-2.1-or-later.txt License.kimageformats.txt
|
||||
- copy %LIBEXPAT%\libexpat-R_2_7_3\expat\COPYING License.expat.txt
|
||||
- copy %LIBAVIF%\libavif-1.3.0\LICENSE License.libavif.txt
|
||||
- copy %LIBEXIV2%\exiv2-%EXIV2_VERSION%\COPYING License.exiv2.txt
|
||||
# TODO: Qt, zlib
|
||||
- cd ..
|
||||
# for debug..
|
||||
- tree /f
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
- xcopy %CMAKE_INSTALL_PREFIX% .\cmake-prefix-copy /E /H /C /I
|
||||
|
||||
artifacts:
|
||||
- path: build\bin
|
||||
- path: cmake-prefix-copy
|
||||
@@ -6,7 +6,7 @@ BEGIN
|
||||
BLOCK "040904E4"
|
||||
BEGIN
|
||||
VALUE "FileDescription", "Pineapple Pictures - Image Viewer"
|
||||
VALUE "LegalCopyright", "MIT/Expat License - Copyright (C) 2024 Gary Wang"
|
||||
VALUE "LegalCopyright", "MIT/Expat License - Copyright (C) 2026 Gary Wang"
|
||||
VALUE "ProductName", "Pineapple Pictures"
|
||||
VALUE "ProductVersion", "@PROJECT_VERSION@"
|
||||
END
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
<center>
|
||||
<p>
|
||||
<img width='128' height='128' src=':/icons/app-icon.svg'/>
|
||||
<br/>
|
||||
<!-- Application name -->
|
||||
<span>%1</span>
|
||||
<br/>
|
||||
<!-- Version info -->
|
||||
<span>%2</span>
|
||||
</p>
|
||||
<hr/>
|
||||
<p>
|
||||
<!-- Upstream author and fork author -->
|
||||
<span>%3</span><span>: </span><a href='https://github.com/BLumia'>@BLumia</a>
|
||||
<br/>
|
||||
<span>%4</span><span>: </span><a href='https://github.com/yyc12345'>@yyc12345</a>
|
||||
<br/>
|
||||
<!-- Icon author -->
|
||||
<span>%5</span><span>: </span><a href='https://github.com/Lovelyblack'>@Lovelyblack</a>
|
||||
</p>
|
||||
<hr/>
|
||||
<p>
|
||||
<!-- Built Qt version info -->
|
||||
<span>%6</span>
|
||||
<br/>
|
||||
<!-- Source code -->
|
||||
<span>%7</span><span>: </span><a href='https://github.com/BLumia/pineapple-pictures'>GitHub</a>
|
||||
</p>
|
||||
</center>
|
||||
@@ -0,0 +1,29 @@
|
||||
<!-- General help -->
|
||||
<h1 align='center'>%1</h1>
|
||||
<ul>
|
||||
<li>
|
||||
<span>%2</span>
|
||||
<ul>
|
||||
<li>%3</li>
|
||||
<li>%4</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>%5</li>
|
||||
<li>%6</li>
|
||||
</ul>
|
||||
<hr/>
|
||||
<!-- Context menu option help -->
|
||||
<h1 align='center'>%7</h1>
|
||||
<!-- Context menu option list -->
|
||||
<ul>
|
||||
<li>
|
||||
<b>%8</b><span>:</span>
|
||||
<br/>
|
||||
<span>%9</span>
|
||||
</li>
|
||||
<li>
|
||||
<b>%10</b><span>:</span>
|
||||
<br/>
|
||||
<span>%11</span>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -0,0 +1,29 @@
|
||||
<!-- License -->
|
||||
<h1 align='center'><b>%1</b></h1>
|
||||
<p>%2</p>
|
||||
<hr/>
|
||||
<!-- VErbatime license -->
|
||||
<h1 align='center'><b>%3</b></h1>
|
||||
<pre>
|
||||
Expat/MIT License
|
||||
|
||||
Copyright © 2026 BLumia
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
</pre>
|
||||
@@ -1,3 +1,14 @@
|
||||
<!-- Contributor title -->
|
||||
<h1 align='center'>%1</h1>
|
||||
<!-- Contributor list -->
|
||||
<a href='https://github.com/BLumia/pineapple-pictures/graphs/contributors'>%2</a>
|
||||
<!-- The message to thank these contributors -->
|
||||
<p>%3</p>
|
||||
|
||||
<!-- Translator title -->
|
||||
<h1 align='center'>%4</h1>
|
||||
<!-- The message to thank these translators -->
|
||||
<p>%5</p>
|
||||
<ul>
|
||||
<li><u>Catalan</u>: Toni Estévez</li>
|
||||
<li><u>Chinese (Simplified)</u>: Percy Hong</li>
|
||||
@@ -12,8 +23,10 @@
|
||||
<li><u>Punjabi (Pakistan)</u>: bgo-eiu</li>
|
||||
<li><u>Russian</u>: Sergey Shornikov, Artem, Andrey</li>
|
||||
<li><u>Sinhala</u>: HelaBasa</li>
|
||||
<li><u>Slovenian</u>: Andrej Poženel - SDT</li>
|
||||
<li><u>Spanish</u>: Toni Estévez, Génesis Toxical, William(ѕ)ⁿ, gallegonovato</li>
|
||||
<li><u>Tamil</u>: தமிழ்நேரம் (TamilNeram)</li>
|
||||
<li><u>Turkish</u>: E-Akcaer, Oğuz Ersen, Sabri Ünal</li>
|
||||
<li><u>Ukrainian</u>: Dan, volkov, Сергій</li>
|
||||
<li><u>Vietnamese</u>: Loc Huynh</li>
|
||||
</ul>
|
||||
@@ -0,0 +1,15 @@
|
||||
<!-- Title -->
|
||||
<h1 align='center'><b>%1</b></h1>
|
||||
<!-- List intro message -->
|
||||
<p>%2</p>
|
||||
<p>%3</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href='https://www.qt.io/'>Qt</a><span>: </span>
|
||||
<span>GPLv2 + GPLv3 + LGPLv2.1 + LGPLv3</span>
|
||||
</li>
|
||||
<li style="display: none;">
|
||||
<a href='https://www.exiv2.org/'>Exiv2</a><span>: </span>
|
||||
<span>GPLv2</span>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -10,6 +10,10 @@
|
||||
<file>icons/window-close.svg</file>
|
||||
<file>icons/go-next.svg</file>
|
||||
<file>icons/go-previous.svg</file>
|
||||
<file>plain/translators.html</file>
|
||||
<file>plain/help.html</file>
|
||||
<file>plain/about.html</file>
|
||||
<file>plain/special-thanks.html</file>
|
||||
<file>plain/license.html</file>
|
||||
<file>plain/third-party-libs.html</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -4,18 +4,26 @@
|
||||
<name>Pineapple Pictures</name>
|
||||
<name xml:lang="es">Pineapple Pictures</name>
|
||||
<name xml:lang="ja">Pineapple Pictures</name>
|
||||
<name xml:lang="ko">Pineapple Pictures</name>
|
||||
<name xml:lang="nl">Pineapple Afbeeldingen</name>
|
||||
<name xml:lang="ru">Pineapple Pictures</name>
|
||||
<name xml:lang="sl">Pineapple Slike</name>
|
||||
<name xml:lang="ta">அன்னாசி படங்கள்</name>
|
||||
<name xml:lang="tr">Pineapple Resimler</name>
|
||||
<name xml:lang="uk">Pineapple Pictures</name>
|
||||
<name xml:lang="vi">Pineapple Pictures</name>
|
||||
<name xml:lang="zh-CN">菠萝看图</name>
|
||||
<summary>Image Viewer</summary>
|
||||
<summary xml:lang="es">Visor de imágenes</summary>
|
||||
<summary xml:lang="ja">画像ビューアー</summary>
|
||||
<summary xml:lang="ko">이미지 뷰어</summary>
|
||||
<summary xml:lang="nl">Afbeeldingsweergave</summary>
|
||||
<summary xml:lang="ru">Просмотр изображений</summary>
|
||||
<summary xml:lang="sl">Pregledovalnik slik</summary>
|
||||
<summary xml:lang="ta">பட பார்வையாளர்</summary>
|
||||
<summary xml:lang="tr">Resim Görüntüleyici</summary>
|
||||
<summary xml:lang="uk">Переглядач зображень</summary>
|
||||
<summary xml:lang="vi">Trình xem ảnh</summary>
|
||||
<summary xml:lang="zh-CN">图像查看器</summary>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>MIT</project_license>
|
||||
@@ -23,10 +31,13 @@
|
||||
<p>Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support.</p>
|
||||
<p xml:lang="es">Pineapple Pictures es un visor de imágenes ligero y fácil de usar que viene con una práctica miniatura de navegación al hacer zoom, y no contiene ningún soporte de gestión de imágenes.</p>
|
||||
<p xml:lang="ja">Pineapple Picturesは、ズームイン時に便利なナビゲーションサムネイルを備えた軽量で使いやすい画像ビューアです。画像管理のサポートは含まれていません。</p>
|
||||
<p xml:lang="ko">Pineapple Pictures는 가볍고 사용하기 쉬운 이미지 뷰어로, 확대 시 편리한 내비게이션 썸네일과 함께 제공되며 이미지 관리 지원이 포함되어 있지 않습니다.</p>
|
||||
<p xml:lang="nl">Pineapple Afbeeldingen is een licht en eenvoudig te gebruiken afbeeldingsweergaveprogramma met miniatuurnavigatie na inzoomen. Het programma heeft echter geen fotobeheermogelijkheid.</p>
|
||||
<p xml:lang="ru">Pineapple Pictures - это легкий и простой в использовании просмотрщик изображений, оснащенный удобной навигацией по миниатюрам при увеличении масштаба и не содержащий никакой поддержки управления изображениями.</p>
|
||||
<p xml:lang="sl">Pineapple Pictures je lahek in enostaven pregledovalnik slik, ki ima pri povečavi priročno sličico za navigacijo in ne vsebuje nobene podpore za upravljanje slik.</p>
|
||||
<p xml:lang="ta">அன்னாசி படங்கள் ஒரு இலகுரக மற்றும் பயன்படுத்த எளிதான பட பார்வையாளராகும், இது பெரிதாக்கும்போது ஒரு எளிமையான வழிசெலுத்தல் சிறுபடத்துடன் வருகிறது, மேலும் எந்த பட மேலாண்மை ஆதரவையும் கொண்டிருக்கவில்லை.</p>
|
||||
<p xml:lang="uk">Pineapple Pictures – це легкий і простий у використанні переглядач зображень, який постачається зі зручною навігаційною мініатюрою при збільшенні масштабу і не містить жодної підтримки керування зображеннями.</p>
|
||||
<p xml:lang="vi">Pineapple Pictures là trình xem hình ảnh nhẹ và dễ sử dụng, đi kèm với hình thu nhỏ điều hướng tiện dụng khi phóng to và không chứa bất kỳ hỗ trợ quản lý hình ảnh nào.</p>
|
||||
<p xml:lang="zh-CN">菠萝看图是一个轻量级易用的图像查看器,在图片放大时提供了方便的鸟瞰导航功能,且不包含任何图片管理功能。</p>
|
||||
</description>
|
||||
<developer id="net.blumia">
|
||||
@@ -42,6 +53,7 @@
|
||||
<url type="bugtracker">https://github.com/BLumia/pineapple-pictures/issues</url>
|
||||
<url type="donation">https://ko-fi.com/blumia</url>
|
||||
<url type="translate">https://hosted.weblate.org/projects/pineapple-pictures/</url>
|
||||
<url type="vcs-browser">https://github.com/BLumia/pineapple-pictures</url>
|
||||
<provides>
|
||||
<binary>ppic</binary>
|
||||
</provides>
|
||||
@@ -50,10 +62,13 @@
|
||||
<caption>Main window when an image file is loaded</caption>
|
||||
<caption xml:lang="es">Ventana principal cuando se carga un archivo de imagen</caption>
|
||||
<caption xml:lang="ja">画像ファイル読み込み時のメインウィンドウ</caption>
|
||||
<caption xml:lang="ko">이미지 파일이 로드될 때 기본 창</caption>
|
||||
<caption xml:lang="nl">Hoofdvenster na het laden van een afbeelding</caption>
|
||||
<caption xml:lang="ru">Основное окно после загрузки файла изображения</caption>
|
||||
<caption xml:lang="sl">Glavno okno ob nalaganju slikovne datoteke</caption>
|
||||
<caption xml:lang="ta">ஒரு படக் கோப்பு ஏற்றப்படும் போது முதன்மையான சாளரம்</caption>
|
||||
<caption xml:lang="uk">Головне вікно після завантаження файлу зображення</caption>
|
||||
<caption xml:lang="vi">Cửa sổ chính khi tải tệp hình ảnh</caption>
|
||||
<caption xml:lang="zh-CN">加载图片后的主窗口</caption>
|
||||
<image type="source" width="1503" height="640">https://pineapple-pictures.sourceforge.io/ppic-gui-static.png</image>
|
||||
</screenshot>
|
||||
@@ -61,10 +76,13 @@
|
||||
<caption>Zooming in a raster image</caption>
|
||||
<caption xml:lang="es">Ampliar una imagen rasterizada</caption>
|
||||
<caption xml:lang="ja">ラスター画像の拡大</caption>
|
||||
<caption xml:lang="ko">래스터 이미지 확대하기</caption>
|
||||
<caption xml:lang="nl">Inzoomen op een roosterafbeelding</caption>
|
||||
<caption xml:lang="ru">Масштабирование растрового изображения</caption>
|
||||
<caption xml:lang="sl">Povečevanje rastrske slike</caption>
|
||||
<caption xml:lang="ta">ராச்டர் படத்தில் பெரிதாக்குதல்</caption>
|
||||
<caption xml:lang="uk">Масштабування растрового зображення</caption>
|
||||
<caption xml:lang="vi">Phóng to hình ảnh raster</caption>
|
||||
<caption xml:lang="zh-CN">放大浏览位图</caption>
|
||||
<image type="source" width="771" height="553">https://pineapple-pictures.sourceforge.io/ppic-zoom-raster.png</image>
|
||||
</screenshot>
|
||||
@@ -72,15 +90,66 @@
|
||||
<caption>Zooming in a vector image</caption>
|
||||
<caption xml:lang="es">Ampliar una imagen vectorial</caption>
|
||||
<caption xml:lang="ja">ベクター画像の拡大</caption>
|
||||
<caption xml:lang="ko">벡터 이미지 확대하기</caption>
|
||||
<caption xml:lang="nl">Inzoomen op een vectorafbeelding</caption>
|
||||
<caption xml:lang="ru">Масштабирование векторного изображения</caption>
|
||||
<caption xml:lang="sl">Povečevanje vektorske slike</caption>
|
||||
<caption xml:lang="ta">ஒரு திசையன் படத்தில் பெரிதாக்குதல்</caption>
|
||||
<caption xml:lang="uk">Масштабування векторного зображення</caption>
|
||||
<caption xml:lang="vi">Phóng to hình ảnh vector</caption>
|
||||
<caption xml:lang="zh-CN">放大浏览矢量图</caption>
|
||||
<image type="source" width="771" height="553">https://pineapple-pictures.sourceforge.io/ppic-zoom-svg.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release type="stable" version="1.5.0" date="2026-07-04T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>Introduced an optional titlebar that display file name and allows drag and double-click to move and toggle maximize state</li>
|
||||
<li>Windows: Now the application will use the system's built-in animation for open window animation</li>
|
||||
</ul>
|
||||
<p>This release fixes the following bug:</p>
|
||||
<ul>
|
||||
<li>Show empty url list should also reset window title to blank</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update translations</li>
|
||||
<li>Add vcs-browser link to AppStream metadata</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels (vistaus), VenusGirl (VenusGirl)</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.4.1" date="2026-04-05T00:00:00Z">
|
||||
<description>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update translations</li>
|
||||
<li>Update Qt version to 6.10.3 for Windows and macOS pre-built binaries</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels (vistaus), Loc Huynh (hthienloc)</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.4.0" date="2026-02-11T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>Action to save image as new file with different format</li>
|
||||
<li>Add Vietnamese and Slovenian translation</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update copyright year to 2026</li>
|
||||
<li>Update translations</li>
|
||||
<li>Update Qt version to 6.10.2 for Windows and macOS pre-built binaries</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Loc Huynh, Sabri Ünal, VenusGirl, Andrej Poženel, Andrey</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.3.0" date="2025-12-20T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
|
||||
@@ -2,16 +2,16 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: 2025-11-30 14:00+0000\n"
|
||||
"Last-Translator: VenusGirl <VenusGirl@outlook.com>\n"
|
||||
"Language-Team: Korean <https://hosted.weblate.org/projects/"
|
||||
"pineapple-pictures/appstream-metadata/ko/>\n"
|
||||
"PO-Revision-Date: 2025-12-27 02:00+0000\n"
|
||||
"Last-Translator: Gary Wang <wzc782970009@gmail.com>\n"
|
||||
"Language-Team: Korean <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/ko/>\n"
|
||||
"Language: ko\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.15-dev\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
@@ -48,4 +48,4 @@ msgstr "벡터 이미지 확대하기"
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
msgstr "Gary (BLumia) Wang 외"
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: 2026-01-25 01:53+0000\n"
|
||||
"Last-Translator: Andrej Poženel - SDT <anderlli0053@live.com>\n"
|
||||
"Language-Team: Slovenian <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/sl/>\n"
|
||||
"Language: sl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
|
||||
"n%100==4 ? 2 : 3;\n"
|
||||
"X-Generator: Weblate 5.16-dev\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr "Pineapple Slike"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr "Pregledovalnik slik"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
"Pineapple Pictures je lahek in enostaven pregledovalnik slik, ki ima pri "
|
||||
"povečavi priročno sličico za navigacijo in ne vsebuje nobene podpore za "
|
||||
"upravljanje slik."
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr "Glavno okno ob nalaganju slikovne datoteke"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr "Povečevanje rastrske slike"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr "Povečevanje vektorske slike"
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang et al."
|
||||
@@ -2,24 +2,26 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
"PO-Revision-Date: 2025-12-20 20:00+0000\n"
|
||||
"Last-Translator: Sabri Ünal <yakushabb@gmail.com>\n"
|
||||
"Language-Team: Turkish <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/tr/>\n"
|
||||
"Language: tr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
msgstr "Pineapple Resimler"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
msgstr "Resim Görüntüleyici"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
@@ -44,4 +46,4 @@ msgstr ""
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
msgstr "Gary (BLumia) Wang et al."
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\n"
|
||||
"PO-Revision-Date: 2025-12-25 17:00+0000\n"
|
||||
"Last-Translator: Loc Huynh <huynhloc.contact@gmail.com>\n"
|
||||
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/pineapple-"
|
||||
"pictures/appstream-metadata/vi/>\n"
|
||||
"Language: vi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.15.1\n"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr "Pineapple Pictures"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr "Trình xem ảnh"
|
||||
|
||||
#. (itstool) path: description/p
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:12
|
||||
msgid "Pineapple Pictures is a lightweight and easy-to-use image viewer that comes with a handy navigation thumbnail when zoom-in, and doesn't contain any image management support."
|
||||
msgstr ""
|
||||
"Pineapple Pictures là trình xem hình ảnh nhẹ và dễ sử dụng, đi kèm với hình "
|
||||
"thu nhỏ điều hướng tiện dụng khi phóng to và không chứa bất kỳ hỗ trợ quản "
|
||||
"lý hình ảnh nào."
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr "Cửa sổ chính khi tải tệp hình ảnh"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr "Phóng to hình ảnh raster"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr "Phóng to hình ảnh vector"
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang et al."
|
||||
Vendored
-118
@@ -1,118 +0,0 @@
|
||||
targetApp=ppic.exe
|
||||
friendlyAppName=Pineapple Pictures
|
||||
friendlyAppName[zh_CN]=菠萝看图
|
||||
openCommand="\"{targetAppFullPath}\" \"%1\""
|
||||
|
||||
[ProgId/jpeg]
|
||||
name=JPEG Image
|
||||
name[zh_CN]=JPEG 图像
|
||||
extensions=jpg,jpeg,jfif
|
||||
|
||||
[ProgId/gif]
|
||||
name=GIF Animation Image
|
||||
name[zh_CN]=GIF 动图
|
||||
|
||||
[ProgId/png]
|
||||
name=PNG Image
|
||||
name[zh_CN]=PNG 图像
|
||||
|
||||
[ProgId/svg]
|
||||
name=Scalable Vector Graphics
|
||||
name[zh_CN]=可缩放矢量图像
|
||||
|
||||
[ProgId/webp]
|
||||
name=WebP Image
|
||||
name[zh_CN]=WebP 图像
|
||||
extensions=webp
|
||||
|
||||
[ProgId/avif]
|
||||
name=AV1 Image File
|
||||
name[zh_CN]=AV1 图像文件
|
||||
|
||||
[ProgId/ico]
|
||||
name=Windows Icon Image
|
||||
name[zh_CN]=Windows 图标图像
|
||||
|
||||
[ProgId/icns]
|
||||
name=Apple Icon Image
|
||||
name[zh_CN]=苹果图标图像
|
||||
|
||||
[ProgId/psd]
|
||||
name=Photoshop Document
|
||||
name[zh_CN]=Photoshop 文档
|
||||
extensions=psd,psb,pdd,psdt
|
||||
|
||||
[ProgId/kra]
|
||||
name=Krita Document
|
||||
name[zh_CN]=Krita 文档
|
||||
|
||||
[ProgId/xcf]
|
||||
name=GIMP Document
|
||||
name[zh_CN]=GIMP 文档
|
||||
|
||||
[ProgId/tga]
|
||||
name=TARGA Image
|
||||
name[zh_CN]=TARGA 图像
|
||||
|
||||
[ProgId/tif]
|
||||
name=Tagged Image File Format
|
||||
name[zh_CN]=标签图像文件格式
|
||||
extensions=tif,tiff
|
||||
|
||||
[ProgId/bmp]
|
||||
name=Bitmap
|
||||
name[zh_CN]=位图
|
||||
|
||||
[ProgId/wbmp]
|
||||
name=Wireless Bitmap
|
||||
name[zh_CN]=无线位图
|
||||
|
||||
[ProgId/dds]
|
||||
name=DirectDraw Surface
|
||||
|
||||
[ProgId/hdr]
|
||||
name=High Dynamic Range Image
|
||||
name[zh_CN]=高动态范围图像
|
||||
|
||||
[ProgId/iff]
|
||||
name=Interchange File Format
|
||||
name[zh_CN]=可交换文件格式
|
||||
|
||||
[ProgId/pic]
|
||||
name=Softimage Picture
|
||||
name[zh_CN]=Softimage 图像
|
||||
|
||||
[ProgId/pcx]
|
||||
name=PiCture eXchange PC Paintbrush Image
|
||||
name[zh_CN]=PC Paintbrush 图像
|
||||
|
||||
[ProgId/qoi]
|
||||
name=Quite OK Image
|
||||
name[zh_CN]=挺 OK 图像
|
||||
|
||||
[ProgId/ras]
|
||||
name=Sun Raster Image
|
||||
name[zh_CN]=Sun 栅格图象
|
||||
extensions=ras,sun
|
||||
|
||||
[ProgId/ora]
|
||||
name=OpenRaster Image
|
||||
name[zh_CN]=OpenRaster 图象
|
||||
|
||||
[ProgId/ani]
|
||||
name=Animated Cursor
|
||||
name[zh_CN]=动态光标
|
||||
|
||||
[ProgId/pfm]
|
||||
name=Portable Float Map
|
||||
extensions=pfm,phm
|
||||
|
||||
[ProgId/rgb]
|
||||
name=Silicon Graphics Image
|
||||
extensions=rgb,rgba,bw,sgi
|
||||
|
||||
[ProgId/pxr]
|
||||
name=Pixar Raster Image
|
||||
|
||||
[ProgId/sct]
|
||||
name=Scitex Continuous Tone
|
||||
@@ -1,101 +0,0 @@
|
||||
# SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
QT += core widgets gui svg svgwidgets
|
||||
|
||||
TARGET = ppic
|
||||
TEMPLATE = app
|
||||
DEFINES += PPIC_VERSION_STRING=\\\"x.y.z\\\"
|
||||
|
||||
win32 {
|
||||
DEFINES += FLAG_PORTABLE_MODE_SUPPORT=1
|
||||
}
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if you use deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
CONFIG += c++17 lrelease embed_translations
|
||||
|
||||
SOURCES += \
|
||||
app/aboutdialog.cpp \
|
||||
app/main.cpp \
|
||||
app/framelesswindow.cpp \
|
||||
app/mainwindow.cpp \
|
||||
app/graphicsview.cpp \
|
||||
app/bottombuttongroup.cpp \
|
||||
app/graphicsscene.cpp \
|
||||
app/navigatorview.cpp \
|
||||
app/opacityhelper.cpp \
|
||||
app/toolbutton.cpp \
|
||||
app/settings.cpp \
|
||||
app/settingsdialog.cpp \
|
||||
app/metadatamodel.cpp \
|
||||
app/metadatadialog.cpp \
|
||||
app/exiv2wrapper.cpp \
|
||||
app/actionmanager.cpp \
|
||||
app/playlistmanager.cpp \
|
||||
app/shortcutedit.cpp \
|
||||
app/fileopeneventhandler.cpp
|
||||
|
||||
HEADERS += \
|
||||
app/aboutdialog.h \
|
||||
app/framelesswindow.h \
|
||||
app/mainwindow.h \
|
||||
app/graphicsview.h \
|
||||
app/bottombuttongroup.h \
|
||||
app/graphicsscene.h \
|
||||
app/navigatorview.h \
|
||||
app/opacityhelper.h \
|
||||
app/toolbutton.h \
|
||||
app/settings.h \
|
||||
app/settingsdialog.h \
|
||||
app/metadatamodel.h \
|
||||
app/metadatadialog.h \
|
||||
app/exiv2wrapper.h \
|
||||
app/actionmanager.h \
|
||||
app/playlistmanager.h \
|
||||
app/shortcutedit.h \
|
||||
app/fileopeneventhandler.h
|
||||
|
||||
TRANSLATIONS = \
|
||||
app/translations/PineapplePictures_en.ts \
|
||||
app/translations/PineapplePictures_zh_CN.ts \
|
||||
app/translations/PineapplePictures_de.ts \
|
||||
app/translations/PineapplePictures_es.ts \
|
||||
app/translations/PineapplePictures_fr.ts \
|
||||
app/translations/PineapplePictures_nb_NO.ts \
|
||||
app/translations/PineapplePictures_nl.ts \
|
||||
app/translations/PineapplePictures_ru.ts \
|
||||
app/translations/PineapplePictures_si.ts \
|
||||
app/translations/PineapplePictures_id.ts
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
||||
|
||||
RESOURCES += \
|
||||
assets/resources.qrc
|
||||
|
||||
# Generate from svg:
|
||||
# magick -density 512x512 -background none app-icon.svg -define icon:auto-resize app-icon.ico
|
||||
RC_ICONS = assets/icons/app-icon.ico
|
||||
|
||||
# Windows only, for rc file (we're not going to use the .rc file in this repo)
|
||||
QMAKE_TARGET_PRODUCT = Pineapple Pictures
|
||||
QMAKE_TARGET_DESCRIPTION = Pineapple Pictures - Image Viewer
|
||||
QMAKE_TARGET_COPYRIGHT = MIT/Expat License - Copyright (C) 2024 Gary Wang
|
||||
|
||||
# MSVC only, since QMake doesn't have a CMAKE_CXX_STANDARD_LIBRARIES or cpp_winlibs similar thing
|
||||
win32-msvc* {
|
||||
LIBS += -luser32
|
||||
}
|
||||
Reference in New Issue
Block a user