Compare commits
75 Commits
0a45cd7c22
...
1.4.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 437c2f5618 | |||
|
|
7fd4924e64 | ||
| c77808f3d8 | |||
| 86075a1ad0 | |||
| a8e40a725c | |||
|
|
8edb6b015e | ||
| 5b2255e903 | |||
| 4948ea7445 | |||
| e09348e064 | |||
|
|
fce6a835b7 | ||
| afcd126c00 | |||
| aa025b0f3b | |||
| e6e738412d | |||
| 2e748e19e1 | |||
| 4b5c9e9ebd | |||
| cdfa8b78a4 | |||
| 1ba5ae60dc | |||
|
|
08d1c09033 | ||
| 612b542e2a | |||
| d74db66ab5 | |||
| 9dd34b3fce | |||
| adfe6c51da | |||
|
|
96565b2ccf | ||
| 107440145a | |||
| 1c55e3194e | |||
| 9021ff2579 | |||
| 10e1e91e7b | |||
| ef887d7a06 | |||
| 5446d94966 | |||
| a2f42c2e3d | |||
| 56b18353db | |||
| 9170765344 | |||
|
|
ee7b3beda4 | ||
| 919a672c17 | |||
| e52a6d8eed | |||
| 8b0c8ec194 | |||
|
|
1da7fff518 | ||
| e216592205 | |||
| 8fc9d06937 | |||
| 73b15da182 | |||
| f4f7d93e38 | |||
| 591b01a83a | |||
| f8d3dcc899 | |||
| f0ed9d0ca1 | |||
|
|
13227cfac9 | ||
| b73df5ea1a | |||
| 4375fe1c2d | |||
| 4654cb21a0 | |||
| ba23208a7a | |||
| ed5a602332 | |||
| 347681e604 | |||
| 505ab9e2a6 | |||
| c787e14a69 | |||
| 29c5783a66 | |||
|
|
ddc75f7cd0 | ||
| f976fea418 | |||
| 2846e4907b | |||
| c828f86b74 | |||
| 040e2a7b5f | |||
| b566096b1f | |||
| 2bee79c064 | |||
|
|
91696963ae | ||
| 1623ca315a | |||
| 3cfb25db9a | |||
| 36854d19f4 | |||
| 3f7ebd2f6c | |||
| 291a98ea97 | |||
| 24a0b581f3 | |||
| 369aa13be3 | |||
| b964fdc77f | |||
| d6d2703c93 | |||
| c6068ba23d | |||
| fbdd858fbd | |||
| 8333f17199 | |||
| 30eb06cba7 |
3
.git-blame-ignore-revs
Normal file
3
.git-blame-ignore-revs
Normal file
@@ -0,0 +1,3 @@
|
||||
# .git-blame-ignore-revs
|
||||
# CR LF to LF
|
||||
ed5a6023326fd2ab420ded76976501be33e0b389
|
||||
5
.gitattributes
vendored
Normal file
5
.gitattributes
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
*.txt text eol=lf
|
||||
*.cpp text eol=lf
|
||||
*.h text eol=lf
|
||||
*.ui text eol=lf
|
||||
*.qml text eol=lf
|
||||
35
.github/workflows/deepin.yml
vendored
Normal file
35
.github/workflows/deepin.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
||||
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
|
||||
3
.github/workflows/macos.yml
vendored
3
.github/workflows/macos.yml
vendored
@@ -12,8 +12,9 @@ jobs:
|
||||
- name: Install Qt
|
||||
uses: jurplel/install-qt-action@v4
|
||||
with:
|
||||
version: '6.9.0'
|
||||
version: '6.10.2'
|
||||
modules: 'qtimageformats'
|
||||
cache: true
|
||||
- name: Install Conan and Dependencies
|
||||
id: conan
|
||||
working-directory: ./
|
||||
|
||||
28
.github/workflows/ubuntu.yml
vendored
28
.github/workflows/ubuntu.yml
vendored
@@ -1,32 +1,8 @@
|
||||
name: Ubuntu CI
|
||||
|
||||
on: [push, pull_request]
|
||||
on: [push, pull_request, workflow_dispatch]
|
||||
|
||||
jobs:
|
||||
ubuntu-22-04-build:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Get build dept.
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install cmake qtbase5-dev libqt5svg5-dev qttools5-dev libexiv2-dev
|
||||
- name: Build it
|
||||
run: |
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ../ -DPREFER_QT_5=ON
|
||||
make
|
||||
cpack -G DEB
|
||||
- name: Try install it
|
||||
run: |
|
||||
cd build
|
||||
sudo apt install ./*.deb
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ubuntu-22.04-deb-package
|
||||
path: build/*.deb
|
||||
|
||||
ubuntu-24-04-build:
|
||||
runs-on: ubuntu-24.04
|
||||
steps:
|
||||
@@ -39,7 +15,7 @@ jobs:
|
||||
run: |
|
||||
mkdir build
|
||||
cd build
|
||||
cmake ../ -DPREFER_QT_5=OFF
|
||||
cmake ../
|
||||
make
|
||||
cpack -G DEB
|
||||
- name: Try install it
|
||||
|
||||
40
.github/workflows/windows.yml
vendored
40
.github/workflows/windows.yml
vendored
@@ -8,7 +8,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- qt_ver: '6.9.0'
|
||||
- qt_ver: '6.10.2'
|
||||
vs: '2022'
|
||||
aqt_arch: 'win64_msvc2022_64'
|
||||
msvc_arch: 'x64'
|
||||
@@ -23,6 +23,7 @@ jobs:
|
||||
arch: ${{ matrix.aqt_arch }}
|
||||
version: ${{ matrix.qt_ver }}
|
||||
modules: 'qtimageformats'
|
||||
cache: true
|
||||
- name: Build
|
||||
shell: cmd
|
||||
run: |
|
||||
@@ -44,7 +45,7 @@ jobs:
|
||||
strategy:
|
||||
matrix:
|
||||
include:
|
||||
- qt_ver: '6.9.0'
|
||||
- qt_ver: '6.10.2'
|
||||
vs: '2022'
|
||||
aqt_arch: 'win64_msvc2022_64'
|
||||
msvc_arch: 'x64'
|
||||
@@ -59,6 +60,7 @@ jobs:
|
||||
arch: ${{ matrix.aqt_arch }}
|
||||
version: ${{ matrix.qt_ver }}
|
||||
modules: 'qtimageformats'
|
||||
cache: true
|
||||
- name: Build
|
||||
shell: cmd
|
||||
run: |
|
||||
@@ -72,9 +74,9 @@ jobs:
|
||||
set CMAKE_PREFIX_PATH=%PWD%/dependencies_bin
|
||||
mkdir dependencies_src
|
||||
echo ::group::===== exiv2 =====
|
||||
curl -fsSL -o exiv2_bin.zip https://github.com/Exiv2/exiv2/releases/download/v0.28.3/exiv2-0.28.3-2019msvc64.zip
|
||||
curl -fsSL -o exiv2_bin.zip https://github.com/Exiv2/exiv2/releases/download/v0.28.7/exiv2-0.28.7-2022msvc-AMD64.zip
|
||||
7z x exiv2_bin.zip -y
|
||||
ren .\exiv2-0.28.3-2019msvc64 dependencies_bin
|
||||
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
|
||||
@@ -82,23 +84,23 @@ jobs:
|
||||
ren .\dependencies_src\zlib-1.3.1 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
|
||||
curl -fsSL -o expat_src.zip https://github.com/libexpat/libexpat/archive/R_2_6_2.zip
|
||||
echo ::endgroup::
|
||||
echo ::group::===== AOM for libavif AVI decoding support =====
|
||||
git clone -q -b v3.12.0 --depth 1 https://aomedia.googlesource.com/aom dependencies_src/aom
|
||||
git clone -q -b v3.13.1 --depth 1 https://aomedia.googlesource.com/aom dependencies_src/aom
|
||||
cmake ./dependencies_src/aom -Bbuild_dependencies/aom -DCMAKE_INSTALL_PREFIX="dependencies_bin" -DENABLE_DOCS=OFF -DBUILD_SHARED_LIBS=ON -DAOM_TARGET_CPU=generic -DENABLE_TESTS=OFF -DENABLE_TESTDATA=OFF -DENABLE_TOOLS=OFF -DENABLE_EXAMPLES=0 || goto :error
|
||||
cmake --build build_dependencies/aom --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
echo ::group::===== libavif =====
|
||||
curl -fsSL -o libavif-v1_2_1.zip https://github.com/AOMediaCodec/libavif/archive/v1.2.1.zip
|
||||
7z x libavif-v1_2_1.zip -y -o"dependencies_src"
|
||||
ren .\dependencies_src\libavif-1.2.1 libavif || goto :error
|
||||
cmake ./dependencies_src/libavif -Bbuild_dependencies/libavif -DCMAKE_INSTALL_PREFIX="dependencies_bin" -DAVIF_CODEC_AOM=ON -DAVIF_LIBYUV=LOCAL
|
||||
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 -o"dependencies_src"
|
||||
ren .\dependencies_src\libavif-1.3.0 libavif || goto :error
|
||||
cmake ./dependencies_src/libavif -Bbuild_dependencies/libavif -DCMAKE_INSTALL_PREFIX="dependencies_bin" -DAVIF_CODEC_AOM=SYSTEM -DAVIF_CODEC_AOM_DECODE=ON -DAVIF_CODEC_AOM_ENCODE=ON -DAVIF_LIBYUV=LOCAL
|
||||
cmake --build build_dependencies/libavif --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
echo ::group::===== expat =====
|
||||
curl -fsSL -o expat_src.zip https://github.com/libexpat/libexpat/archive/R_2_7_3.zip
|
||||
7z x expat_src.zip -y -o"dependencies_src"
|
||||
ren .\dependencies_src\libexpat-R_2_6_2 expat || goto :error
|
||||
ren .\dependencies_src\libexpat-R_2_7_3 expat || goto :error
|
||||
cmake ./dependencies_src/expat/expat -Bbuild_dependencies/expat -DCMAKE_INSTALL_PREFIX="dependencies_bin" || goto :error
|
||||
cmake --build build_dependencies/expat --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
@@ -109,20 +111,26 @@ jobs:
|
||||
echo ::endgroup::
|
||||
echo ::group::===== KArchive =====
|
||||
git clone -q https://invent.kde.org/frameworks/karchive.git dependencies_src/karchive
|
||||
cmake .\dependencies_src\karchive -Bbuild_dependencies/karchive -DWITH_LIBZSTD=OFF -DWITH_BZIP2=OFF -DWITH_LIBLZMA=OFF -DCMAKE_INSTALL_PREFIX="dependencies_bin" || goto :error
|
||||
cmake .\dependencies_src\karchive -Bbuild_dependencies/karchive -DBUILD_TESTING=OFF -DWITH_LIBZSTD=OFF -DWITH_BZIP2=OFF -DWITH_LIBLZMA=OFF -DCMAKE_INSTALL_PREFIX="dependencies_bin" || goto :error
|
||||
cmake --build build_dependencies/karchive --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
echo ::group::===== KImageFormats =====
|
||||
git clone -q https://invent.kde.org/frameworks/kimageformats.git dependencies_src/kimageformats
|
||||
cmake .\dependencies_src\kimageformats -Bbuild_dependencies/kimageformats -DKDE_INSTALL_QTPLUGINDIR=%QT_ROOT_DIR%\plugins || goto :error
|
||||
cmake .\dependencies_src\kimageformats -Bbuild_dependencies/kimageformats -DBUILD_TESTING=OFF -DKDE_INSTALL_QTPLUGINDIR=%QT_ROOT_DIR%\plugins || goto :error
|
||||
cmake --build build_dependencies/kimageformats --config Release --target=install || goto :error
|
||||
echo ::endgroup::
|
||||
:: ------ app ------
|
||||
cmake -Bbuild . -DCMAKE_INSTALL_PREFIX="%PWD%\build\"
|
||||
echo ::group::===== App (Build'n'Install) =====
|
||||
cmake -Bbuild .
|
||||
cmake --build build --config Release
|
||||
cmake --build build --config Release --target=install
|
||||
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-quick-import --no-translations --no-opengl-sw --no-system-d3d-compiler --no-system-dxc-compiler --skip-plugin-types tls,networkinformation build\bin\ppic.exe
|
||||
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
|
||||
|
||||
6
.gitignore
vendored
6
.gitignore
vendored
@@ -11,6 +11,12 @@
|
||||
|
||||
# Generic Build Dir
|
||||
[Bb]uild/
|
||||
cmake-build-*/
|
||||
|
||||
# IDE/Editor config folders
|
||||
.vscode/
|
||||
.idea/
|
||||
.qtcreator/
|
||||
|
||||
# Clangd cache
|
||||
.cache/
|
||||
|
||||
@@ -4,13 +4,12 @@
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
project(pineapple-pictures VERSION 0.9.2) # don't forget to update NEWS file and AppStream metadata.
|
||||
project(pineapple-pictures VERSION 1.3.0) # don't forget to update NEWS file and AppStream metadata.
|
||||
|
||||
include(GNUInstallDirs)
|
||||
include(FeatureSummary)
|
||||
|
||||
option (EXIV2_METADATA_SUPPORT "Better image metadata support via libexiv2" ON)
|
||||
option (PREFER_QT_5 "Prefer to use Qt 5" OFF)
|
||||
option (TRANSLATION_RESOURCE_EMBEDDING "Embedding .qm translation files inside resource" OFF)
|
||||
|
||||
set (CMAKE_CXX_STANDARD 17)
|
||||
@@ -18,27 +17,15 @@ set (CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
set (CMAKE_AUTOMOC ON)
|
||||
set (CMAKE_AUTORCC ON)
|
||||
|
||||
if (PREFER_QT_5)
|
||||
find_package(QT NAMES Qt5 REQUIRED COMPONENTS Core)
|
||||
else ()
|
||||
find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core)
|
||||
endif ()
|
||||
find_package(QT NAMES Qt6 REQUIRED COMPONENTS Core)
|
||||
|
||||
if (${QT_VERSION_MAJOR} EQUAL "5")
|
||||
set (QT_MINIMUM_VERSION "5.15.2")
|
||||
else ()
|
||||
set (QT_MINIMUM_VERSION "6.4")
|
||||
endif ()
|
||||
set (QT_MINIMUM_VERSION "6.4")
|
||||
|
||||
find_package(Qt${QT_VERSION_MAJOR} ${QT_MINIMUM_VERSION} REQUIRED
|
||||
COMPONENTS Widgets Svg LinguistTools
|
||||
COMPONENTS Widgets Svg SvgWidgets LinguistTools
|
||||
OPTIONAL_COMPONENTS DBus
|
||||
)
|
||||
|
||||
if (${QT_VERSION_MAJOR} EQUAL "6")
|
||||
find_package(Qt${QT_DEFAULT_MAJOR_VERSION} ${QT_MINIMUM_VERSION} CONFIG REQUIRED SvgWidgets)
|
||||
endif ()
|
||||
|
||||
if (EXIV2_METADATA_SUPPORT)
|
||||
find_package(exiv2)
|
||||
set_package_properties(exiv2 PROPERTIES
|
||||
@@ -107,7 +94,8 @@ file (GLOB PPIC_TS_FILES app/translations/*.ts)
|
||||
set (PPIC_CPP_FILES_FOR_I18N ${PPIC_CPP_FILES})
|
||||
|
||||
if (WIN32)
|
||||
list(APPEND PPIC_RC_FILES assets/pineapple-pictures.rc)
|
||||
configure_file(assets/pineapple-pictures.rc.in pineapple-pictures.rc @ONLY)
|
||||
list(APPEND PPIC_RC_FILES ${CMAKE_CURRENT_BINARY_DIR}/pineapple-pictures.rc)
|
||||
endif ()
|
||||
|
||||
add_executable (${EXE_NAME}
|
||||
@@ -117,26 +105,25 @@ add_executable (${EXE_NAME}
|
||||
${PPIC_RC_FILES}
|
||||
)
|
||||
|
||||
if (${QT_VERSION_MAJOR} EQUAL "6")
|
||||
if (TRANSLATION_RESOURCE_EMBEDDING)
|
||||
qt_add_translations(${EXE_NAME} TS_FILES ${PPIC_TS_FILES})
|
||||
else()
|
||||
qt_add_translations(${EXE_NAME} TS_FILES ${PPIC_TS_FILES} QM_FILES_OUTPUT_VARIABLE PPIC_QM_FILES)
|
||||
endif()
|
||||
set(ADD_TRANSLATIONS_ADDITIONAL_ARGS)
|
||||
|
||||
if (Qt6_VERSION VERSION_GREATER_EQUAL "6.9.0")
|
||||
set(ADD_TRANSLATIONS_ADDITIONAL_ARGS MERGE_QT_TRANSLATIONS)
|
||||
endif()
|
||||
|
||||
if (TRANSLATION_RESOURCE_EMBEDDING)
|
||||
qt_add_translations(${EXE_NAME} ${ADD_TRANSLATIONS_ADDITIONAL_ARGS} TS_FILES ${PPIC_TS_FILES})
|
||||
else()
|
||||
qt_create_translation(PPIC_QM_FILES ${PPIC_CPP_FILES_FOR_I18N} ${PPIC_TS_FILES})
|
||||
qt_add_translations(${EXE_NAME} ${ADD_TRANSLATIONS_ADDITIONAL_ARGS} TS_FILES ${PPIC_TS_FILES} QM_FILES_OUTPUT_VARIABLE PPIC_QM_FILES)
|
||||
endif()
|
||||
|
||||
target_sources(${EXE_NAME} PRIVATE ${PPIC_QM_FILES})
|
||||
|
||||
target_link_libraries (${EXE_NAME} Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Svg)
|
||||
if (${QT_VERSION_MAJOR} EQUAL "6")
|
||||
target_link_libraries (${EXE_NAME} Qt::SvgWidgets)
|
||||
endif ()
|
||||
target_link_libraries (${EXE_NAME} Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Svg Qt${QT_VERSION_MAJOR}::SvgWidgets)
|
||||
|
||||
if (exiv2_FOUND)
|
||||
if(NOT TARGET Exiv2::exiv2lib AND TARGET exiv2lib)
|
||||
# for exiv2 0.27.x
|
||||
# for exiv2 0.27.x and (macOS?) conan build
|
||||
add_library(Exiv2::exiv2lib ALIAS exiv2lib)
|
||||
endif()
|
||||
target_link_libraries (${EXE_NAME}
|
||||
@@ -147,7 +134,7 @@ if (exiv2_FOUND)
|
||||
)
|
||||
endif ()
|
||||
|
||||
if (TARGET Qt5::DBus OR TARGET Qt6::DBus)
|
||||
if (TARGET Qt6::DBus)
|
||||
target_link_libraries (${EXE_NAME}
|
||||
Qt${QT_VERSION_MAJOR}::DBus
|
||||
)
|
||||
@@ -283,6 +270,25 @@ 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
|
||||
dist/passoc/jpeg.ico
|
||||
dist/passoc/gif.ico
|
||||
dist/passoc/svg.ico
|
||||
dist/passoc/png.ico
|
||||
dist/passoc/psd.ico
|
||||
DESTINATION "${CMAKE_INSTALL_BINDIR}/icons"
|
||||
)
|
||||
endif()
|
||||
|
||||
feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES)
|
||||
|
||||
# CPACK: General Settings
|
||||
@@ -298,7 +304,7 @@ elseif (APPLE)
|
||||
elseif (UNIX)
|
||||
set (CPACK_SYSTEM_NAME "${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
|
||||
set (CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
|
||||
set (CPACK_DEBIAN_PACKAGE_RECOMMENDS "kimageformat-plugins")
|
||||
set (CPACK_DEBIAN_PACKAGE_RECOMMENDS "kimageformat6-plugins")
|
||||
endif()
|
||||
|
||||
include(CPack)
|
||||
|
||||
2
LICENSE
2
LICENSE
@@ -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
|
||||
|
||||
121
NEWS
121
NEWS
@@ -1,3 +1,121 @@
|
||||
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
|
||||
|
||||
Features:
|
||||
* New option to limit SVG support to SVG Tiny 1.2 standard
|
||||
* Windows: ship tools and configurations that help user associate image files to this program
|
||||
|
||||
Bugfixes:
|
||||
* Fix window not appear at the screen that the mouse cursor is at
|
||||
* Fix Windows prebuilt binary having AVIF plugin included but not actually support it
|
||||
|
||||
Miscellaneous:
|
||||
* CPack DEB: will now recommend "kimageformat6-plugins" instead of the KF5 version
|
||||
* Update translations
|
||||
* Update exiv2 version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
VenusGirl, Andrey
|
||||
|
||||
Version 1.2.1
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-11-22
|
||||
|
||||
Bugfixes:
|
||||
* Fix incorrect color when display some CMYK images.
|
||||
|
||||
Miscellaneous:
|
||||
* Now use Qt 6.10.1 for pre-built binary
|
||||
* Update README description and AppStream metainfo
|
||||
* Update translations
|
||||
* Update libavif, AOM and expat version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
albanobattistella
|
||||
|
||||
Version 1.2.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-09-21
|
||||
|
||||
Features:
|
||||
* Long image mode that detect extra wide image and auto fit by its thin side
|
||||
* Windows: Add product version to binary metadata / resource file
|
||||
|
||||
Miscellaneous:
|
||||
* Update translations
|
||||
* Update libavif version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels, albanobattistella, Sabri Ünal
|
||||
|
||||
Version 1.1.1
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-08-02
|
||||
|
||||
Features:
|
||||
* Click dock icon should show window when it's hidden on macOS
|
||||
|
||||
Bugfixes:
|
||||
* Ensure "Fit by Width" position the view to the beginning of the image
|
||||
|
||||
Miscellaneous:
|
||||
* Update translations
|
||||
* Update Exiv2 version for Windows binary build
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels, VenusGirl, தமிழ்நேரம்
|
||||
|
||||
Version 1.1.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-07-06
|
||||
|
||||
Features:
|
||||
* New option to disable built-in close window animation
|
||||
* New option to disable gallery looping
|
||||
* Support load m3u8 as image gallery playlist
|
||||
|
||||
Miscellaneous:
|
||||
* Drop Qt 5 support
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels, albanobattistella, தமிழ்நேரம்
|
||||
|
||||
Version 1.0.0
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-05-03
|
||||
|
||||
Features:
|
||||
* Support enforces windowed mode on start-up
|
||||
* Reload image automatically when current image gets updated
|
||||
|
||||
Bugfixes:
|
||||
* Display correct text language on macOS
|
||||
|
||||
Miscellaneous:
|
||||
* Use native text for shortcut editor's label
|
||||
* Display native commandline message when possible
|
||||
* Merge Qt translations into app applications as well
|
||||
|
||||
Contributors:
|
||||
Heimen Stoffels, albanobattistella, mmahhi
|
||||
|
||||
Version 0.9.2
|
||||
~~~~~~~~~~~~~
|
||||
Released: 2025-03-05
|
||||
@@ -123,7 +241,7 @@ Version 0.7.1
|
||||
Released: 2023-07-08
|
||||
|
||||
Features:
|
||||
* TIF and TIFF format files in the same folder will now be automatedly added to the gallery
|
||||
* TIF and TIFF format files in the same folder will now be automatically added to the gallery
|
||||
* Built-in window resizing now also supports Linux desktop. (macOS might also works as well)
|
||||
|
||||
Bugfixes:
|
||||
@@ -132,4 +250,3 @@ Bugfixes:
|
||||
|
||||
Contributors:
|
||||
yyc12345
|
||||
|
||||
|
||||
15
README.md
15
README.md
@@ -23,13 +23,22 @@ Pineapple Pictures is a lightweight image viewer that allows you view JPEG, PNG,
|
||||
|
||||
### Maintained by contributors / certain distro's package maintainers
|
||||
|
||||
- Debian (since bullseye) or Ubuntu (since 21.04): `sudo apt install pineapple-pictures`
|
||||
- Nix / NixOS: [pineapple-pictures](https://search.nixos.org/packages?channel=unstable&show=pineapple-pictures&from=0&size=50&sort=relevance&type=packages&query=pineapple-pictures) (maintained by @wineee)
|
||||
[](https://repology.org/project/pineapple-pictures/versions)
|
||||
|
||||
## Help Translation!
|
||||
## Contribution
|
||||
|
||||
Beside feedback and code contribution, other contributions are also welcome!
|
||||
|
||||
### Help Translation!
|
||||
|
||||
[Translate this project on Weblate!](https://hosted.weblate.org/projects/pineapple-pictures/)
|
||||
|
||||
### Funding
|
||||
|
||||
[](https://ko-fi.com/blumia)
|
||||
|
||||
[Afdian](https://afdian.com/a/BLumia)
|
||||
|
||||
## Build it manually:
|
||||
|
||||
Current state, we need:
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
### 由原作者维护
|
||||
|
||||
- [GitHub Release 页面](https://github.com/BLumia/pineapple-pictures/releases) | [gitee 发布页面](https://gitee.com/blumia/pineapple-pictures/releases)
|
||||
- [GitHub Release 页面](https://github.com/BLumia/pineapple-pictures/releases)
|
||||
- [SourceForge](https://sourceforge.net/projects/pineapple-pictures/)
|
||||
- Archlinux AUR: [pineapple-pictures](https://aur.archlinux.org/packages/pineapple-pictures/) | [pineapple-pictures-git](https://aur.archlinux.org/packages/pineapple-pictures-git/)
|
||||
- [Itch.io 商店](https://blumia.itch.io/pineapple-pictures)
|
||||
@@ -24,13 +24,22 @@
|
||||
|
||||
### 由贡献者/对应发行版的打包人员维护
|
||||
|
||||
- Debian (自 bullseye 起) 或 Ubuntu (自 21.04 起): `sudo apt install pineapple-pictures`
|
||||
- Nix / NixOS: [pineapple-pictures](https://search.nixos.org/packages?channel=unstable&show=pineapple-pictures&from=0&size=50&sort=relevance&type=packages&query=pineapple-pictures) (由 [@wineee](https://github.com/wineee) 维护)
|
||||
[](https://repology.org/project/pineapple-pictures/versions)
|
||||
|
||||
## 帮助翻译!
|
||||
## 参与贡献
|
||||
|
||||
除了参与反馈和代码贡献外,也欢迎各种类型的贡献!
|
||||
|
||||
### 帮助翻译!
|
||||
|
||||
[在 Weblate 上帮助此项目翻译到更多语言!](https://hosted.weblate.org/projects/pineapple-pictures/)
|
||||
|
||||
### 打赏
|
||||
|
||||
[Afdian | 爱发电](https://afdian.com/a/BLumia)
|
||||
|
||||
[](https://ko-fi.com/blumia)
|
||||
|
||||
## 手动构建步骤:
|
||||
|
||||
当前状态,我们需要先确保如下依赖可用:
|
||||
|
||||
10
REUSE.toml
10
REUSE.toml
@@ -3,17 +3,23 @@ SPDX-PackageName = "Pineapple Pictures"
|
||||
SPDX-PackageDownloadLocation = "https://github.com/BLumia/pineapple-pictures"
|
||||
|
||||
[[annotations]]
|
||||
path = [".gitignore", "appveyor.yml", ".github/**"]
|
||||
path = [".gitattributes", ".git-blame-ignore-revs", ".gitignore", "appveyor.yml", ".github/**"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "None"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["README**.md", "NEWS", "assets/**.rc", "assets/**.qrc", "dist/**"]
|
||||
path = ["README**.md", "NEWS", "assets/**.rc.in", "assets/**.qrc", "dist/appstream/**", "dist/**.in", "dist/**.desktop"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "None"
|
||||
SPDX-License-Identifier = "CC0-1.0"
|
||||
|
||||
[[annotations]]
|
||||
path = ["dist/passoc/**"]
|
||||
precedence = "aggregate"
|
||||
SPDX-FileCopyrightText = "2025 Gary Wang"
|
||||
SPDX-License-Identifier = "MIT"
|
||||
|
||||
[[annotations]]
|
||||
path = ["app/translations/**.ts", "assets/plain/translators.html"]
|
||||
precedence = "aggregate"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
#include <QPushButton>
|
||||
#include <QFile>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
AboutDialog::AboutDialog(QWidget *parent)
|
||||
: QDialog(parent)
|
||||
, m_tabWidget(new QTabWidget)
|
||||
@@ -27,60 +29,60 @@ AboutDialog::AboutDialog(QWidget *parent)
|
||||
this->setWindowTitle(tr("About"));
|
||||
|
||||
const QStringList helpStr {
|
||||
QStringLiteral("<p>%1</p>").arg(tr("Launch application with image file path as argument to load the file.")),
|
||||
QStringLiteral("<p>%1</p>").arg(tr("Drag and drop image file onto the window is also supported.")),
|
||||
QStringLiteral("<p>%1</p>").arg(tr("None of the operations in this application will alter the pictures on disk.")),
|
||||
QStringLiteral("<p>%1</p>").arg(tr("Context menu option explanation:")),
|
||||
QStringLiteral("<ul>"),
|
||||
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.
|
||||
QStringLiteral("<li><b>%1</b>:<br/>%2</li>")
|
||||
.arg(QCoreApplication::translate("MainWindow", "Stay on top"))
|
||||
.arg(tr("Make window stay on top of all other windows.")),
|
||||
QStringLiteral("<li><b>%1</b>:<br/>%2</li>")
|
||||
.arg(QCoreApplication::translate("MainWindow", "Protected mode"))
|
||||
.arg(tr("Avoid close window accidentally. (eg. by double clicking the window)")),
|
||||
QStringLiteral("<li><b>%1</b>:<br/>%2</li>")
|
||||
.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.")),
|
||||
QStringLiteral("</ul>")
|
||||
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
|
||||
};
|
||||
|
||||
const QStringList aboutStr {
|
||||
QStringLiteral("<center><img width='128' height='128' src=':/icons/app-icon.svg'/><br/>"),
|
||||
u"<center><img width='128' height='128' src=':/icons/app-icon.svg'/><br/>"_s,
|
||||
qApp->applicationDisplayName(),
|
||||
(QStringLiteral("<br/>") + tr("Version: %1").arg(
|
||||
(u"<br/>"_s + tr("Version: %1").arg(
|
||||
#ifdef GIT_DESCRIBE_VERSION_STRING
|
||||
GIT_DESCRIBE_VERSION_STRING
|
||||
#else
|
||||
qApp->applicationVersion()
|
||||
#endif // GIT_DESCRIBE_VERSION_STRING
|
||||
)),
|
||||
QStringLiteral("<hr/>"),
|
||||
u"<hr/>"_s,
|
||||
tr("Copyright (c) %1 %2", "%1 is year, %2 is the name of copyright holder(s)")
|
||||
.arg(QStringLiteral("2025"), QStringLiteral("<a href='https://github.com/BLumia'>@BLumia</a>")),
|
||||
QStringLiteral("<br/>"),
|
||||
tr("Logo designed by %1").arg(QStringLiteral("<a href='https://github.com/Lovelyblack'>@Lovelyblack</a>")),
|
||||
QStringLiteral("<hr/>"),
|
||||
.arg(u"2026"_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")),
|
||||
QStringLiteral("</center>")
|
||||
u"</center>"_s
|
||||
};
|
||||
|
||||
QFile translaterHtml(":/plain/translators.html");
|
||||
QFile translaterHtml(u":/plain/translators.html"_s);
|
||||
bool canOpenFile = translaterHtml.open(QIODevice::ReadOnly);
|
||||
const QByteArray & translatorList = canOpenFile ? translaterHtml.readAll() : QByteArrayLiteral("");
|
||||
|
||||
const QStringList specialThanksStr {
|
||||
QStringLiteral("<h1 align='center'>%1</h1><a href='%2'>%3</a><p>%4</p>").arg(
|
||||
u"<h1 align='center'>%1</h1><a href='%2'>%3</a><p>%4</p>"_s.arg(
|
||||
tr("Contributors"),
|
||||
QStringLiteral("https://github.com/BLumia/pineapple-pictures/graphs/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.")
|
||||
),
|
||||
|
||||
QStringLiteral("<h1 align='center'>%1</h1><p>%2</p>%3").arg(
|
||||
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
|
||||
@@ -88,22 +90,22 @@ AboutDialog::AboutDialog(QWidget *parent)
|
||||
};
|
||||
|
||||
const QStringList licenseStr {
|
||||
QStringLiteral("<h1 align='center'><b>%1</b></h1>").arg(tr("Your Rights")),
|
||||
QStringLiteral("<p>%1</p><p>%2</p><ul><li>%3</li><li>%4</li><li>%5</li><li>%6</li></ul>").arg(
|
||||
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(QStringLiteral("<i>%1</i>")),
|
||||
QStringLiteral("<p>%1</p>").arg(tr("The MIT license guarantees you this freedom. Nobody is ever permitted to take it away.")),
|
||||
QStringLiteral("<hr/><pre>%2</pre>")
|
||||
).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
|
||||
};
|
||||
|
||||
const QString mitLicense(QStringLiteral(R"(Expat/MIT License
|
||||
|
||||
Copyright (c) 2025 BLumia
|
||||
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
|
||||
@@ -125,14 +127,14 @@ SOFTWARE.
|
||||
)"));
|
||||
|
||||
const QStringList thirdPartyLibsStr {
|
||||
QStringLiteral("<h1 align='center'><b>%1</b></h1>").arg(tr("Third-party Libraries used by %1")),
|
||||
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"),
|
||||
QStringLiteral("<ul>"),
|
||||
u"<ul>"_s,
|
||||
#ifdef HAVE_EXIV2_VERSION
|
||||
QStringLiteral("<li><a href='%1'>%2</a>: %3</li>").arg("https://www.exiv2.org/", "Exiv2", "GPLv2"),
|
||||
u"<li><a href='%1'>%2</a>: %3</li>"_s.arg("https://www.exiv2.org/", "Exiv2", "GPLv2"),
|
||||
#endif // EXIV2_VERSION
|
||||
QStringLiteral("<li><a href='%1'>%2</a>: %3</li>").arg("https://www.qt.io/", "Qt", "GPLv2 + GPLv3 + LGPLv2.1 + LGPLv3"),
|
||||
QStringLiteral("</ul>")
|
||||
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'));
|
||||
@@ -145,7 +147,7 @@ SOFTWARE.
|
||||
|
||||
m_licenseTextEdit->setText(licenseStr.join('\n').arg(qApp->applicationDisplayName(), mitLicense));
|
||||
|
||||
m_3rdPartyLibsTextEdit->setText(thirdPartyLibsStr.join('\n').arg(QStringLiteral("<i>%1</i>").arg(qApp->applicationDisplayName())));
|
||||
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"));
|
||||
|
||||
@@ -16,16 +16,6 @@
|
||||
#define ACTION_NAME(s) QStringLiteral(STRIFY(s))
|
||||
#define STRIFY(s) #s
|
||||
|
||||
ActionManager::ActionManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ActionManager::~ActionManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QIcon ActionManager::loadHidpiIcon(const QString &resp, QSize sz)
|
||||
{
|
||||
QSvgRenderer r(resp);
|
||||
@@ -65,9 +55,11 @@ void ActionManager::setupAction(MainWindow *mainWindow)
|
||||
CREATE_NEW_ACTION(mainWindow, actionAnimationNextFrame);
|
||||
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionOpen, document-open);
|
||||
CREATE_NEW_THEMEICON_ACTION(mainWindow, actionSaveAs, document-save-as);
|
||||
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);
|
||||
@@ -93,6 +85,7 @@ void ActionManager::retranslateUi(MainWindow *mainWindow)
|
||||
Q_UNUSED(mainWindow);
|
||||
|
||||
actionOpen->setText(QCoreApplication::translate("MainWindow", "&Open...", nullptr));
|
||||
actionSaveAs->setText(QCoreApplication::translate("MainWindow", "Save &As...", nullptr));
|
||||
|
||||
actionActualSize->setText(QCoreApplication::translate("MainWindow", "Actual size", nullptr));
|
||||
actionToggleMaximize->setText(QCoreApplication::translate("MainWindow", "Toggle maximize", nullptr));
|
||||
@@ -111,6 +104,7 @@ void ActionManager::retranslateUi(MainWindow *mainWindow)
|
||||
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));
|
||||
@@ -137,6 +131,7 @@ void ActionManager::retranslateUi(MainWindow *mainWindow)
|
||||
void ActionManager::setupShortcuts()
|
||||
{
|
||||
actionOpen->setShortcut(QKeySequence::Open);
|
||||
actionSaveAs->setShortcut(QKeySequence::SaveAs);
|
||||
actionActualSize->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
|
||||
actionZoomIn->setShortcut(QKeySequence::ZoomIn);
|
||||
actionZoomOut->setShortcut(QKeySequence::ZoomOut);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
@@ -12,8 +12,8 @@ class MainWindow;
|
||||
class ActionManager
|
||||
{
|
||||
public:
|
||||
ActionManager();
|
||||
~ActionManager();
|
||||
explicit ActionManager() = default;
|
||||
~ActionManager() = default;
|
||||
|
||||
void setupAction(MainWindow * mainWindow);
|
||||
void retranslateUi(MainWindow *MainWindow);
|
||||
@@ -23,6 +23,7 @@ public:
|
||||
|
||||
public:
|
||||
QAction *actionOpen;
|
||||
QAction *actionSaveAs;
|
||||
|
||||
QAction *actionActualSize;
|
||||
QAction *actionToggleMaximize;
|
||||
@@ -41,6 +42,7 @@ public:
|
||||
QAction *actionHorizontalFlip;
|
||||
QAction *actionFitInView;
|
||||
QAction *actionFitByWidth;
|
||||
QAction *actionFitLongImage;
|
||||
QAction *actionCopyPixmap;
|
||||
QAction *actionCopyFilePath;
|
||||
QAction *actionPaste;
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
|
||||
#include "opacityhelper.h"
|
||||
|
||||
#include <functional>
|
||||
|
||||
#include <QToolButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QDebug>
|
||||
|
||||
@@ -17,14 +17,7 @@ FramelessWindow::FramelessWindow(QWidget *parent)
|
||||
, m_oldCursorShape(Qt::ArrowCursor)
|
||||
, m_oldEdges()
|
||||
{
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);
|
||||
#else
|
||||
// There is a bug in Qt 5 that will make pressing Meta+Up cause the app
|
||||
// fullscreen under Windows, see QTBUG-91226 to learn more.
|
||||
// The bug seems no longer exists in Qt 6 (I only tested it under Qt 6.3.0).
|
||||
this->setWindowFlags(Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinimizeButtonHint);
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
this->setMouseTracking(true);
|
||||
this->setAttribute(Qt::WA_Hover, true);
|
||||
this->installEventFilter(this);
|
||||
@@ -97,11 +90,7 @@ bool FramelessWindow::mousePress(QMouseEvent* event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton && !isMaximized() && !isFullScreen()) {
|
||||
QWindow* win = window()->windowHandle();
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
Qt::Edges edges = this->getEdgesByPos(event->globalPosition().toPoint(), win->frameGeometry());
|
||||
#else
|
||||
Qt::Edges edges = this->getEdgesByPos(event->globalPos(), win->frameGeometry());
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
if (edges) {
|
||||
win->startSystemResize(edges);
|
||||
return true;
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#include "graphicsscene.h"
|
||||
|
||||
#include "settings.h"
|
||||
|
||||
#include <QGraphicsSceneMouseEvent>
|
||||
#include <QMimeData>
|
||||
#include <QDebug>
|
||||
@@ -130,10 +132,9 @@ void GraphicsScene::showSvg(const QString &filepath)
|
||||
QGraphicsSvgItem * svgItem = new QGraphicsSvgItem();
|
||||
QSvgRenderer * render = new QSvgRenderer(svgItem);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
// Qt 6.7.0's SVG support is terrible caused by huge memory usage, see QTBUG-124287
|
||||
// Qt 6.7.1's is somewhat better, memory issue seems fixed, but still laggy when zoom in,
|
||||
// see QTBUG-126771. Anyway let's disable it for now.
|
||||
render->setOptions(QtSvg::Tiny12FeaturesOnly);
|
||||
if (Settings::instance()->svgTiny12Only()) {
|
||||
render->setOptions(QtSvg::Tiny12FeaturesOnly);
|
||||
}
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
render->load(filepath);
|
||||
svgItem->setSharedRenderer(render);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2022 Gary Wang <wzc782970009@gmail.com>
|
||||
// SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "settings.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QColorSpace>
|
||||
#include <QMouseEvent>
|
||||
#include <QScrollBar>
|
||||
#include <QMimeData>
|
||||
@@ -41,9 +42,7 @@ void GraphicsView::showFileFromPath(const QString &filePath)
|
||||
QImageReader imageReader(filePath);
|
||||
imageReader.setAutoTransform(true);
|
||||
imageReader.setDecideFormatFromContent(true);
|
||||
#if QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
|
||||
imageReader.setAllocationLimit(0);
|
||||
#endif //QT_VERSION > QT_VERSION_CHECK(6, 0, 0)
|
||||
|
||||
// Since if the image format / plugin does not support this feature, imageFormat() will returns an invalid format.
|
||||
// So we cannot use imageFormat() and check if it returns QImage::Format_Invalid to detect if we support the file.
|
||||
@@ -55,6 +54,18 @@ void GraphicsView::showFileFromPath(const QString &filePath)
|
||||
} else if (!imageReader.canRead()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
} else {
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
QImage && img = imageReader.read();
|
||||
if (img.isNull()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
} else {
|
||||
if (img.format() == QImage::Format_CMYK8888) {
|
||||
img.convertToColorSpace(QColorSpace::SRgb);
|
||||
}
|
||||
img.setDevicePixelRatio(devicePixelRatioF());
|
||||
showImage(img);
|
||||
}
|
||||
#else
|
||||
QPixmap && pixmap = QPixmap::fromImageReader(&imageReader);
|
||||
if (pixmap.isNull()) {
|
||||
showText(tr("Image data is invalid or currently unsupported"));
|
||||
@@ -62,6 +73,7 @@ void GraphicsView::showFileFromPath(const QString &filePath)
|
||||
pixmap.setDevicePixelRatio(devicePixelRatioF());
|
||||
showImage(pixmap);
|
||||
}
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 8, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -126,6 +138,7 @@ void GraphicsView::resetTransform()
|
||||
void GraphicsView::zoomView(qreal scaleFactor)
|
||||
{
|
||||
m_enableFitInView = false;
|
||||
m_longImageMode = false;
|
||||
scale(scaleFactor, scaleFactor);
|
||||
applyTransformationModeByScaleFactor();
|
||||
emit navigatorViewRequired(!isThingSmallerThanWindowWith(transform()), transform());
|
||||
@@ -142,6 +155,10 @@ void GraphicsView::rotateView(bool clockwise)
|
||||
0, 0, 1);
|
||||
tf = transform() * tf;
|
||||
setTransform(tf);
|
||||
|
||||
// Apply transformation mode but don't emit navigator signal here
|
||||
// Let displayScene() handle the navigator visibility correctly
|
||||
applyTransformationModeByScaleFactor();
|
||||
}
|
||||
|
||||
void GraphicsView::flipView(bool horizontal)
|
||||
@@ -173,27 +190,121 @@ void GraphicsView::fitByOrientation(Qt::Orientation ori, bool scaleDownOnly)
|
||||
{
|
||||
resetScale();
|
||||
|
||||
QRectF viewRect = this->viewport()->rect().adjusted(2, 2, -2, -2);
|
||||
QRectF viewRect = this->viewport()->rect();
|
||||
QRectF imageRect = transform().mapRect(sceneRect());
|
||||
QSize viewSize = viewRect.size().toSize();
|
||||
|
||||
qreal ratio;
|
||||
|
||||
if (ori == Qt::Horizontal) {
|
||||
ratio = viewRect.width() / imageRect.width();
|
||||
// Horizontal fit means fit by width
|
||||
if (scaleDownOnly && imageRect.width() <= viewSize.width()) {
|
||||
// Image width already fits, no scaling needed
|
||||
ratio = 1;
|
||||
} else {
|
||||
ratio = viewRect.width() / imageRect.width();
|
||||
}
|
||||
} else {
|
||||
ratio = viewRect.height() / imageRect.height();
|
||||
// Vertical fit means fit by height
|
||||
if (scaleDownOnly && imageRect.height() <= viewSize.height()) {
|
||||
// Image height already fits, no scaling needed
|
||||
ratio = 1;
|
||||
} else {
|
||||
ratio = viewRect.height() / imageRect.height();
|
||||
}
|
||||
}
|
||||
|
||||
if (scaleDownOnly && ratio > 1) ratio = 1;
|
||||
if (ratio != 1) {
|
||||
scale(ratio, ratio);
|
||||
}
|
||||
|
||||
// Position the image correctly based on orientation with rotation consideration
|
||||
QRectF originalScene = sceneRect();
|
||||
QTransform currentTransform = transform();
|
||||
|
||||
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
|
||||
QPointF sceneTopCenter;
|
||||
|
||||
if (qFuzzyIsNull(currentTransform.m12()) && qFuzzyIsNull(currentTransform.m21())) {
|
||||
// 0° or 180° rotation
|
||||
if (currentTransform.m11() > 0 && currentTransform.m22() > 0) {
|
||||
// 0° rotation: use original top-center
|
||||
sceneTopCenter = QPointF(originalScene.center().x(), originalScene.top());
|
||||
} else {
|
||||
// 180° rotation: the visual "top" is now at the scene bottom
|
||||
sceneTopCenter = QPointF(originalScene.center().x(), originalScene.bottom());
|
||||
}
|
||||
} else {
|
||||
// 90/270 degree rotation: the "top" in view corresponds to left/right in scene
|
||||
if (currentTransform.m12() > 0) {
|
||||
// 90 degree: top in view = left in scene
|
||||
sceneTopCenter = QPointF(originalScene.left(), originalScene.center().y());
|
||||
} else {
|
||||
// 270 degree: top in view = right in scene
|
||||
sceneTopCenter = QPointF(originalScene.right(), originalScene.center().y());
|
||||
}
|
||||
}
|
||||
centerOn(sceneTopCenter);
|
||||
} else {
|
||||
// For vertical fit (fit by height), position at left (for wide images)
|
||||
// Find the scene point that corresponds to the left-center of the transformed image
|
||||
QPointF sceneLeftCenter;
|
||||
|
||||
if (qFuzzyIsNull(currentTransform.m12()) && qFuzzyIsNull(currentTransform.m21())) {
|
||||
// 0° or 180° rotation
|
||||
if (currentTransform.m11() > 0 && currentTransform.m22() > 0) {
|
||||
// 0° rotation: use original left-center
|
||||
sceneLeftCenter = QPointF(originalScene.left(), originalScene.center().y());
|
||||
} else {
|
||||
// 180° rotation: the visual "left" is now at the scene right
|
||||
sceneLeftCenter = QPointF(originalScene.right(), originalScene.center().y());
|
||||
}
|
||||
} else {
|
||||
// 90/270 degree rotation: the "left" in view corresponds to top/bottom in scene
|
||||
if (currentTransform.m21() > 0) {
|
||||
// 90 degree: left in view = top in scene
|
||||
sceneLeftCenter = QPointF(originalScene.center().x(), originalScene.top());
|
||||
} else {
|
||||
// 270 degree: left in view = bottom in scene
|
||||
sceneLeftCenter = QPointF(originalScene.center().x(), originalScene.bottom());
|
||||
}
|
||||
}
|
||||
centerOn(sceneLeftCenter);
|
||||
}
|
||||
|
||||
scale(ratio, ratio);
|
||||
centerOn(imageRect.top(), 0);
|
||||
m_enableFitInView = 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()) {
|
||||
@@ -201,10 +312,25 @@ void GraphicsView::displayScene()
|
||||
return;
|
||||
}
|
||||
|
||||
if (isSceneBiggerThanView()) {
|
||||
fitInView(sceneRect(), Qt::KeepAspectRatio);
|
||||
// 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);
|
||||
// After fitInView, the image should fit the window, so hide navigator
|
||||
emit navigatorViewRequired(false, transform());
|
||||
} else {
|
||||
// Image is already smaller than window, no navigator needed
|
||||
emit navigatorViewRequired(false, transform());
|
||||
}
|
||||
|
||||
m_longImageMode = false;
|
||||
m_enableFitInView = true;
|
||||
m_firstUserMediaLoaded = true;
|
||||
}
|
||||
@@ -224,6 +350,11 @@ void GraphicsView::setEnableAutoFitInView(bool enable)
|
||||
m_enableFitInView = enable;
|
||||
}
|
||||
|
||||
void GraphicsView::setLongImageMode(bool enable)
|
||||
{
|
||||
m_longImageMode = enable;
|
||||
}
|
||||
|
||||
bool GraphicsView::avoidResetTransform() const
|
||||
{
|
||||
return m_avoidResetTransform;
|
||||
@@ -296,7 +427,12 @@ void GraphicsView::wheelEvent(QWheelEvent *event)
|
||||
|
||||
void GraphicsView::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
if (m_enableFitInView) {
|
||||
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) {
|
||||
bool originalSizeSmallerThanWindow = isThingSmallerThanWindowWith(resetScale(transform()));
|
||||
if (originalSizeSmallerThanWindow && scaleFactor() >= 1) {
|
||||
// no longer need to do fitInView()
|
||||
|
||||
@@ -39,12 +39,17 @@ public:
|
||||
void displayScene();
|
||||
bool isSceneBiggerThanView() const;
|
||||
void setEnableAutoFitInView(bool enable = true);
|
||||
void setLongImageMode(bool enable = true);
|
||||
|
||||
bool avoidResetTransform() const;
|
||||
void setAvoidResetTransform(bool avoidReset);
|
||||
|
||||
static QTransform resetScale(const QTransform & orig);
|
||||
|
||||
// Long image mode support
|
||||
bool isLongImage() const;
|
||||
void fitLongImage();
|
||||
|
||||
signals:
|
||||
void navigatorViewRequired(bool required, QTransform transform);
|
||||
void viewportRectChanged();
|
||||
@@ -70,6 +75,7 @@ private:
|
||||
// ... 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_avoidResetTransform = false;
|
||||
bool m_checkerboardEnabled = false;
|
||||
bool m_useLightCheckerboard = false;
|
||||
|
||||
30
app/main.cpp
30
app/main.cpp
@@ -17,33 +17,32 @@
|
||||
#include <QTranslator>
|
||||
#include <QUrl>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QCoreApplication::setApplicationName("Pineapple Pictures");
|
||||
QCoreApplication::setApplicationName(u"Pineapple Pictures"_s);
|
||||
QCoreApplication::setApplicationVersion(PPIC_VERSION_STRING);
|
||||
QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Settings::instance()->hiDpiScaleFactorBehavior());
|
||||
|
||||
QApplication a(argc, argv);
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||
a.setAttribute(Qt::ApplicationAttribute::AA_UseHighDpiPixmaps);
|
||||
#endif
|
||||
|
||||
QTranslator translator;
|
||||
#if defined(TRANSLATION_RESOURCE_EMBEDDING)
|
||||
const QString qmDir = QLatin1String(":/i18n/");
|
||||
const QString qmDir = u":/i18n/"_s;
|
||||
#elif defined(QM_FILE_INSTALL_ABSOLUTE_DIR)
|
||||
const QString qmDir = QT_STRINGIFY(QM_FILE_INSTALL_ABSOLUTE_DIR);
|
||||
#else
|
||||
const QString qmDir = QDir(QCoreApplication::applicationDirPath()).absoluteFilePath("translations");
|
||||
#endif
|
||||
if (translator.load(QLocale(), QLatin1String("PineapplePictures"), QLatin1String("_"), qmDir)) {
|
||||
if (translator.load(QLocale(), u"PineapplePictures"_s, u"_"_s, qmDir)) {
|
||||
QCoreApplication::installTranslator(&translator);
|
||||
}
|
||||
|
||||
QGuiApplication::setApplicationDisplayName(QCoreApplication::translate("main", "Pineapple Pictures"));
|
||||
|
||||
// commandline options
|
||||
QCommandLineOption supportedImageFormats(QStringLiteral("supported-image-formats"), QCoreApplication::translate("main", "List supported image format suffixes, and quit program."));
|
||||
QCommandLineOption supportedImageFormats(u"supported-image-formats"_s, QCoreApplication::translate("main", "List supported image format suffixes, and quit program."));
|
||||
// parse commandline arguments
|
||||
QCommandLineParser parser;
|
||||
parser.addOption(supportedImageFormats);
|
||||
@@ -52,8 +51,13 @@ int main(int argc, char *argv[])
|
||||
parser.process(a);
|
||||
|
||||
if (parser.isSet(supportedImageFormats)) {
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 9, 0)
|
||||
fputs(qPrintable(MainWindow::supportedImageFormats().join(QChar('\n'))), stdout);
|
||||
::exit(EXIT_SUCCESS);
|
||||
#else
|
||||
QCommandLineParser::showMessageAndExit(QCommandLineParser::MessageType::Information,
|
||||
MainWindow::supportedImageFormats().join(QChar('\n')));
|
||||
#endif
|
||||
}
|
||||
|
||||
MainWindow w;
|
||||
@@ -72,6 +76,18 @@ int main(int argc, char *argv[])
|
||||
w.showUrls({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.showNormal();
|
||||
w.raise();
|
||||
w.activateWindow();
|
||||
}
|
||||
});
|
||||
#endif // Q_OS_MACOS
|
||||
|
||||
QStringList urlStrList = parser.positionalArguments();
|
||||
|
||||
@@ -38,12 +38,15 @@
|
||||
#include <QProcess>
|
||||
#include <QDesktopServices>
|
||||
#include <QMessageBox>
|
||||
#include <QImageWriter>
|
||||
|
||||
#ifdef HAVE_QTDBUS
|
||||
#include <QDBusInterface>
|
||||
#include <QDBusConnectionInterface>
|
||||
#endif // HAVE_QTDBUS
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
MainWindow::MainWindow(QWidget *parent)
|
||||
: FramelessWindow(parent)
|
||||
, m_am(new ActionManager)
|
||||
@@ -56,28 +59,24 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
|
||||
this->setAttribute(Qt::WA_TranslucentBackground, true);
|
||||
this->setMinimumSize(350, 330);
|
||||
this->setWindowIcon(QIcon(":/icons/app-icon.svg"));
|
||||
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");
|
||||
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");
|
||||
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,
|
||||
#ifdef Q_OS_MAC
|
||||
this, &QWidget::hide);
|
||||
#else
|
||||
this, &QWidget::close);
|
||||
#endif
|
||||
this, &MainWindow::doCloseWindow);
|
||||
|
||||
GraphicsScene * scene = new GraphicsScene(this);
|
||||
|
||||
@@ -92,7 +91,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
m_gv->fitInView(m_gv->sceneRect(), Qt::KeepAspectRatio);
|
||||
|
||||
connect(m_graphicsView, &GraphicsView::navigatorViewRequired,
|
||||
this, [ = ](bool required, const QTransform & tf){
|
||||
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);
|
||||
@@ -141,10 +140,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
m_gv->setOpacity(0, false);
|
||||
m_closeButton->setOpacity(0, false);
|
||||
|
||||
connect(m_pm, &PlaylistManager::totalCountChanged, this, [this](int galleryFileCount) {
|
||||
m_prevButton->setVisible(galleryFileCount > 1);
|
||||
m_nextButton->setVisible(galleryFileCount > 1);
|
||||
});
|
||||
connect(m_pm, &PlaylistManager::totalCountChanged, this, &MainWindow::updateGalleryButtonsVisibility);
|
||||
|
||||
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));
|
||||
@@ -180,10 +176,20 @@ MainWindow::~MainWindow()
|
||||
void MainWindow::showUrls(const QList<QUrl> &urls)
|
||||
{
|
||||
if (!urls.isEmpty()) {
|
||||
m_graphicsView->showFileFromPath(urls.first().toLocalFile());
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -251,6 +257,9 @@ void MainWindow::clearGallery()
|
||||
|
||||
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);
|
||||
@@ -260,6 +269,9 @@ void MainWindow::galleryPrev()
|
||||
|
||||
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);
|
||||
@@ -281,6 +293,8 @@ void MainWindow::galleryCurrent(bool showLoadImageHintWhenEmpty, bool reloadImag
|
||||
m_graphicsView->showText(QCoreApplication::translate("GraphicsScene", "Drag image here"));
|
||||
}
|
||||
|
||||
updateGalleryButtonsVisibility();
|
||||
|
||||
if (shouldResetfileWatcher) updateFileWatcher();
|
||||
}
|
||||
|
||||
@@ -304,7 +318,7 @@ void MainWindow::showEvent(QShowEvent *event)
|
||||
return FramelessWindow::showEvent(event);
|
||||
}
|
||||
|
||||
void MainWindow::enterEvent(QT_ENTER_EVENT *event)
|
||||
void MainWindow::enterEvent(QEnterEvent *event)
|
||||
{
|
||||
m_bottomButtonGroup->setOpacity(1);
|
||||
m_gv->setOpacity(1);
|
||||
@@ -345,11 +359,7 @@ void MainWindow::mouseMoveEvent(QMouseEvent *event)
|
||||
{
|
||||
if (event->buttons() & Qt::LeftButton && m_clickedOnWindow && !isMaximized() && !isFullScreen()) {
|
||||
if (!window()->windowHandle()->startSystemMove()) {
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
move(event->globalPosition().toPoint() - m_oldMousePos);
|
||||
#else
|
||||
move(event->globalPos() - m_oldMousePos);
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
}
|
||||
event->accept();
|
||||
}
|
||||
@@ -451,13 +461,11 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
|
||||
QMenu * menu = new QMenu;
|
||||
QMenu * copyMenu = new QMenu(tr("&Copy"));
|
||||
QUrl currentFileUrl = currentImageFileUrl();
|
||||
QImage clipboardImage;
|
||||
QUrl clipboardFileUrl;
|
||||
|
||||
QAction * copyPixmap = m_am->actionCopyPixmap;
|
||||
QAction * copyFilePath = m_am->actionCopyFilePath;
|
||||
|
||||
copyMenu->setIcon(QIcon::fromTheme(QLatin1String("edit-copy")));
|
||||
copyMenu->setIcon(QIcon::fromTheme(u"edit-copy"_s));
|
||||
copyMenu->addAction(copyPixmap);
|
||||
if (currentFileUrl.isValid()) {
|
||||
copyMenu->addAction(copyFilePath);
|
||||
@@ -497,6 +505,12 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
|
||||
menu->addAction(paste);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (currentFileUrl.isValid()) {
|
||||
menu->addAction(m_am->actionSaveAs);
|
||||
}
|
||||
#endif // 0
|
||||
|
||||
menu->addSeparator();
|
||||
|
||||
menu->addAction(m_am->actionHorizontalFlip);
|
||||
@@ -584,12 +598,16 @@ void MainWindow::centerWindow()
|
||||
|
||||
void MainWindow::closeWindow()
|
||||
{
|
||||
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();
|
||||
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()
|
||||
@@ -607,8 +625,7 @@ void MainWindow::toggleProtectedMode()
|
||||
{
|
||||
m_protectedMode = !m_protectedMode;
|
||||
m_closeButton->setVisible(!m_protectedMode);
|
||||
m_prevButton->setVisible(!m_protectedMode);
|
||||
m_nextButton->setVisible(!m_protectedMode);
|
||||
updateGalleryButtonsVisibility();
|
||||
}
|
||||
|
||||
void MainWindow::toggleStayOnTop()
|
||||
@@ -686,10 +703,75 @@ void MainWindow::on_actionOpen_triggered()
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionSaveAs_triggered()
|
||||
{
|
||||
QUrl currentFileUrl = currentImageFileUrl();
|
||||
if (!currentFileUrl.isValid()) {
|
||||
QMessageBox::warning(this, tr("Save As"), tr("No image is currently open."));
|
||||
return;
|
||||
}
|
||||
|
||||
QStringList supportedFormats;
|
||||
QStringList nameFilters;
|
||||
|
||||
const QList<QByteArray> imageFormats = QImageWriter::supportedImageFormats();
|
||||
for (const QByteArray &format : imageFormats) {
|
||||
QString formatStr = QString::fromLatin1(format).toLower();
|
||||
if (!formatStr.isEmpty()) {
|
||||
supportedFormats << formatStr;
|
||||
nameFilters << tr("%1 Image (*.%2)").arg(formatStr.toUpper(), formatStr);
|
||||
}
|
||||
}
|
||||
|
||||
if (imageFormats.isEmpty()) {
|
||||
QMessageBox::warning(this, tr("Save As"),
|
||||
tr("No supported image formats are available."));
|
||||
return;
|
||||
}
|
||||
|
||||
QString selectedFilter;
|
||||
QString saveFilePath = QFileDialog::getSaveFileName(this,
|
||||
tr("Save As"),
|
||||
QStandardPaths::writableLocation(QStandardPaths::PicturesLocation),
|
||||
nameFilters.join(";;"),
|
||||
&selectedFilter);
|
||||
|
||||
if (saveFilePath.isEmpty()) {
|
||||
return; // User cancelled
|
||||
}
|
||||
|
||||
// Ensure the file has the correct extension
|
||||
QString expectedExtension;
|
||||
|
||||
const int filterIndex = nameFilters.indexOf(selectedFilter);
|
||||
if (filterIndex != -1) {
|
||||
expectedExtension = supportedFormats.at(filterIndex);
|
||||
}
|
||||
|
||||
if (!expectedExtension.isEmpty() && !saveFilePath.endsWith('.' + expectedExtension, Qt::CaseInsensitive)) {
|
||||
saveFilePath += '.' + expectedExtension;
|
||||
}
|
||||
|
||||
// Save the image
|
||||
QImageReader imageReader(currentFileUrl.toLocalFile());
|
||||
imageReader.setAutoTransform(true);
|
||||
imageReader.setDecideFormatFromContent(true);
|
||||
imageReader.setAllocationLimit(0);
|
||||
QImage img(imageReader.read());
|
||||
QImageWriter writer(saveFilePath);
|
||||
writer.setFormat(expectedExtension.toLatin1());
|
||||
if (!writer.write(img)) {
|
||||
QMessageBox::warning(this, tr("Save As"),
|
||||
tr("Failed to save image: %1").arg(writer.errorString()));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void MainWindow::on_actionActualSize_triggered()
|
||||
{
|
||||
m_graphicsView->resetScale();
|
||||
m_graphicsView->setEnableAutoFitInView(false);
|
||||
m_graphicsView->setLongImageMode(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionToggleMaximize_triggered()
|
||||
@@ -718,6 +800,7 @@ 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()
|
||||
@@ -725,6 +808,12 @@ void MainWindow::on_actionFitByWidth_triggered()
|
||||
m_graphicsView->fitByOrientation();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionFitLongImage_triggered()
|
||||
{
|
||||
m_graphicsView->setLongImageMode(true);
|
||||
m_graphicsView->fitLongImage();
|
||||
}
|
||||
|
||||
void MainWindow::on_actionCopyPixmap_triggered()
|
||||
{
|
||||
QClipboard *cb = QApplication::clipboard();
|
||||
@@ -784,7 +873,7 @@ void MainWindow::on_actionTrash_triggered()
|
||||
if (result == QMessageBox::Yes) {
|
||||
bool succ = file.moveToTrash();
|
||||
if (!succ) {
|
||||
QMessageBox::warning(this, "Failed to move file to trash",
|
||||
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);
|
||||
@@ -803,14 +892,12 @@ void MainWindow::on_actionRotateClockwise_triggered()
|
||||
{
|
||||
m_graphicsView->rotateView();
|
||||
m_graphicsView->displayScene();
|
||||
m_gv->setVisible(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionRotateCounterClockwise_triggered()
|
||||
{
|
||||
m_graphicsView->rotateView(false);
|
||||
m_graphicsView->displayScene();
|
||||
m_gv->setVisible(false);
|
||||
}
|
||||
|
||||
void MainWindow::on_actionPrevPicture_triggered()
|
||||
@@ -895,9 +982,9 @@ void MainWindow::on_actionLocateInFileManager_triggered()
|
||||
QDesktopServices::openUrl(folderUrl);
|
||||
return;
|
||||
}
|
||||
QDBusInterface fm1Iface(QStringLiteral("org.freedesktop.FileManager1"),
|
||||
QStringLiteral("/org/freedesktop/FileManager1"),
|
||||
QStringLiteral("org.freedesktop.FileManager1"));
|
||||
QDBusInterface fm1Iface(u"org.freedesktop.FileManager1"_s,
|
||||
u"/org/freedesktop/FileManager1"_s,
|
||||
u"org.freedesktop.FileManager1"_s);
|
||||
fm1Iface.setTimeout(1000);
|
||||
fm1Iface.callWithArgumentList(QDBus::Block, "ShowItems", {
|
||||
QStringList{currentFileUrl.toString()},
|
||||
@@ -916,9 +1003,28 @@ void MainWindow::on_actionQuitApp_triggered()
|
||||
quitAppAction(false);
|
||||
}
|
||||
|
||||
void MainWindow::doCloseWindow()
|
||||
{
|
||||
#ifdef Q_OS_MAC
|
||||
this->hide();
|
||||
#else
|
||||
this->close();
|
||||
#endif
|
||||
}
|
||||
|
||||
bool MainWindow::updateFileWatcher(const QString &basePath)
|
||||
{
|
||||
m_fileSystemWatcher->removePaths(m_fileSystemWatcher->files());
|
||||
if (!basePath.isEmpty()) return m_fileSystemWatcher->addPath(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());
|
||||
}
|
||||
|
||||
@@ -11,12 +11,6 @@
|
||||
#include <QPropertyAnimation>
|
||||
#include <QPushButton>
|
||||
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||
typedef QEnterEvent QT_ENTER_EVENT;
|
||||
#else
|
||||
typedef QEvent QT_ENTER_EVENT;
|
||||
#endif // QT_VERSION_CHECK(6, 0, 0)
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QGraphicsOpacityEffect;
|
||||
class QGraphicsView;
|
||||
@@ -51,7 +45,7 @@ public:
|
||||
|
||||
protected slots:
|
||||
void showEvent(QShowEvent *event) override;
|
||||
void enterEvent(QT_ENTER_EVENT *event) override;
|
||||
void enterEvent(QEnterEvent *event) override;
|
||||
void leaveEvent(QEvent *event) override;
|
||||
void mousePressEvent(QMouseEvent *event) override;
|
||||
void mouseMoveEvent(QMouseEvent *event) override;
|
||||
@@ -81,6 +75,7 @@ protected:
|
||||
|
||||
private slots:
|
||||
void on_actionOpen_triggered();
|
||||
void on_actionSaveAs_triggered();
|
||||
|
||||
void on_actionActualSize_triggered();
|
||||
void on_actionToggleMaximize_triggered();
|
||||
@@ -99,6 +94,7 @@ private slots:
|
||||
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();
|
||||
@@ -112,8 +108,11 @@ private slots:
|
||||
void on_actionLocateInFileManager_triggered();
|
||||
void on_actionQuitApp_triggered();
|
||||
|
||||
void doCloseWindow();
|
||||
|
||||
private:
|
||||
bool updateFileWatcher(const QString & basePath = QString());
|
||||
void updateGalleryButtonsVisibility();
|
||||
|
||||
private:
|
||||
ActionManager *m_am;
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
#include <QFileInfo>
|
||||
#include <QImageReader>
|
||||
|
||||
using namespace Qt::Literals::StringLiterals;
|
||||
|
||||
MetadataModel::MetadataModel(QObject *parent)
|
||||
: QAbstractItemModel(parent)
|
||||
{
|
||||
@@ -37,131 +39,131 @@ void MetadataModel::setFile(const QString &imageFilePath)
|
||||
const QString & imageDimensionsString = imageSize(imgReader.size());
|
||||
const QString & imageRatioString = imageSizeRatio(imgReader.size());
|
||||
|
||||
appendSection(QStringLiteral("Description"), tr("Description", "Section name."));
|
||||
appendSection(QStringLiteral("Origin"), tr("Origin", "Section name."));
|
||||
appendSection(QStringLiteral("Image"), tr("Image", "Section name."));
|
||||
appendSection(QStringLiteral("Camera"), tr("Camera", "Section name."));
|
||||
appendSection(QStringLiteral("AdvancedPhoto"), tr("Advanced photo", "Section name."));
|
||||
appendSection(QStringLiteral("GPS"), tr("GPS", "Section name."));
|
||||
appendSection(QStringLiteral("File"), tr("File", "Section name."));
|
||||
appendSection(u"Description"_s, tr("Description", "Section name."));
|
||||
appendSection(u"Origin"_s, tr("Origin", "Section name."));
|
||||
appendSection(u"Image"_s, tr("Image", "Section name."));
|
||||
appendSection(u"Camera"_s, tr("Camera", "Section name."));
|
||||
appendSection(u"AdvancedPhoto"_s, tr("Advanced photo", "Section name."));
|
||||
appendSection(u"GPS"_s, tr("GPS", "Section name."));
|
||||
appendSection(u"File"_s, tr("File", "Section name."));
|
||||
|
||||
if (imgReader.supportsOption(QImageIOHandler::Size)) {
|
||||
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.Dimensions"),
|
||||
appendProperty(u"Image"_s, u"Image.Dimensions"_s,
|
||||
tr("Dimensions"), imageDimensionsString);
|
||||
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.SizeRatio"),
|
||||
appendProperty(u"Image"_s, u"Image.SizeRatio"_s,
|
||||
tr("Aspect ratio"), imageRatioString);
|
||||
}
|
||||
if (imgReader.supportsAnimation() && imgReader.imageCount() > 1) {
|
||||
appendProperty(QStringLiteral("Image"), QStringLiteral("Image.FrameCount"),
|
||||
appendProperty(u"Image"_s, u"Image.FrameCount"_s,
|
||||
tr("Frame count"), QString::number(imgReader.imageCount()));
|
||||
}
|
||||
|
||||
appendProperty(QStringLiteral("File"), QStringLiteral("File.Name"),
|
||||
appendProperty(u"File"_s, u"File.Name"_s,
|
||||
tr("Name"), fileInfo.fileName());
|
||||
appendProperty(QStringLiteral("File"), QStringLiteral("File.ItemType"),
|
||||
appendProperty(u"File"_s, u"File.ItemType"_s,
|
||||
tr("Item type"), itemTypeString);
|
||||
appendProperty(QStringLiteral("File"), QStringLiteral("File.Path"),
|
||||
appendProperty(u"File"_s, u"File.Path"_s,
|
||||
tr("Folder path"), QDir::toNativeSeparators(fileInfo.path()));
|
||||
appendProperty(QStringLiteral("File"), QStringLiteral("File.Size"),
|
||||
appendProperty(u"File"_s, u"File.Size"_s,
|
||||
tr("Size"), sizeString);
|
||||
appendProperty(QStringLiteral("File"), QStringLiteral("File.CreatedTime"),
|
||||
appendProperty(u"File"_s, u"File.CreatedTime"_s,
|
||||
tr("Date created"), birthTimeString);
|
||||
appendProperty(QStringLiteral("File"), QStringLiteral("File.LastModified"),
|
||||
appendProperty(u"File"_s, u"File.LastModified"_s,
|
||||
tr("Date modified"), lastModifiedTimeString);
|
||||
|
||||
Exiv2Wrapper wrapper;
|
||||
if (wrapper.load(imageFilePath)) {
|
||||
wrapper.cacheSections();
|
||||
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Description"),
|
||||
QStringLiteral("Xmp.dc.title"), tr("Title"), true);
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Description"),
|
||||
QStringLiteral("Exif.Image.ImageDescription"), tr("Subject"), true);
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Description"),
|
||||
QStringLiteral("Exif.Image.Rating"), tr("Rating"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Description"),
|
||||
QStringLiteral("Xmp.dc.subject"), tr("Tags"));
|
||||
appendPropertyIfNotEmpty(QStringLiteral("Description"), QStringLiteral("Description.Comments"),
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Xmp.dc.title"_s, tr("Title"), true);
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Exif.Image.ImageDescription"_s, tr("Subject"), true);
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Exif.Image.Rating"_s, tr("Rating"));
|
||||
appendExivPropertyIfExist(wrapper, u"Description"_s,
|
||||
u"Xmp.dc.subject"_s, tr("Tags"));
|
||||
appendPropertyIfNotEmpty(u"Description"_s, u"Description.Comments"_s,
|
||||
tr("Comments"), wrapper.comment());
|
||||
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
|
||||
QStringLiteral("Exif.Image.Artist"), tr("Authors"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
|
||||
QStringLiteral("Exif.Photo.DateTimeOriginal"), tr("Date taken"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Artist"_s, tr("Authors"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Photo.DateTimeOriginal"_s, tr("Date taken"));
|
||||
// FIXME: We may fetch the same type of metadata from different metadata collection.
|
||||
// Current implementation is not pretty and may need to do a rework...
|
||||
// appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
|
||||
// QStringLiteral("Xmp.xmp.CreatorTool"), tr("Program name"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
|
||||
QStringLiteral("Exif.Image.Software"), tr("Program name"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Origin"),
|
||||
QStringLiteral("Exif.Image.Copyright"), tr("Copyright"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Software"_s, tr("Program name"));
|
||||
appendExivPropertyIfExist(wrapper, u"Origin"_s,
|
||||
u"Exif.Image.Copyright"_s, tr("Copyright"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Image"),
|
||||
QStringLiteral("Exif.Image.XResolution"), tr("Horizontal resolution"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Image"),
|
||||
QStringLiteral("Exif.Image.YResolution"), tr("Vertical resolution"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Image"),
|
||||
QStringLiteral("Exif.Image.ResolutionUnit"), tr("Resolution unit"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Image"),
|
||||
QStringLiteral("Exif.Photo.ColorSpace"), tr("Colour representation"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.XResolution"_s, tr("Horizontal resolution"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.YResolution"_s, tr("Vertical resolution"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Image.ResolutionUnit"_s, tr("Resolution unit"));
|
||||
appendExivPropertyIfExist(wrapper, u"Image"_s,
|
||||
u"Exif.Photo.ColorSpace"_s, tr("Colour representation"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Image.Make"), tr("Camera maker"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Image.Model"), tr("Camera model"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.FNumber"), tr("F-stop"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.ExposureTime"), tr("Exposure time"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.ISOSpeedRatings"), tr("ISO speed"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.ExposureBiasValue"), tr("Exposure bias"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.FocalLength"), tr("Focal length"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.MaxApertureValue"), tr("Max aperture"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.MeteringMode"), tr("Metering mode"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.SubjectDistance"), tr("Subject distance"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.Flash"), tr("Flash mode"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("Camera"),
|
||||
QStringLiteral("Exif.Photo.FocalLengthIn35mmFilm"), tr("35mm focal length"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Image.Make"_s, tr("Camera maker"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Image.Model"_s, tr("Camera model"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FNumber"_s, tr("F-stop"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ExposureTime"_s, tr("Exposure time"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ISOSpeedRatings"_s, tr("ISO speed"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.ExposureBiasValue"_s, tr("Exposure bias"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FocalLength"_s, tr("Focal length"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.MaxApertureValue"_s, tr("Max aperture"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.MeteringMode"_s, tr("Metering mode"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.SubjectDistance"_s, tr("Subject distance"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.Flash"_s, tr("Flash mode"));
|
||||
appendExivPropertyIfExist(wrapper, u"Camera"_s,
|
||||
u"Exif.Photo.FocalLengthIn35mmFilm"_s, tr("35mm focal length"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.LensModel"), tr("Lens model"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.Contrast"), tr("Contrast"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.BrightnessValue"), tr("Brightness"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.ExposureProgram"), tr("Exposure program"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.Saturation"), tr("Saturation"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.Sharpness"), tr("Sharpness"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.WhiteBalance"), tr("White balance"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.DigitalZoomRatio"), tr("Digital zoom"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("AdvancedPhoto"),
|
||||
QStringLiteral("Exif.Photo.ExifVersion"), tr("EXIF version"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.LensModel"_s, tr("Lens model"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Contrast"_s, tr("Contrast"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.BrightnessValue"_s, tr("Brightness"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.ExposureProgram"_s, tr("Exposure program"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Saturation"_s, tr("Saturation"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.Sharpness"_s, tr("Sharpness"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.WhiteBalance"_s, tr("White balance"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.DigitalZoomRatio"_s, tr("Digital zoom"));
|
||||
appendExivPropertyIfExist(wrapper, u"AdvancedPhoto"_s,
|
||||
u"Exif.Photo.ExifVersion"_s, tr("EXIF version"));
|
||||
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
|
||||
QStringLiteral("Exif.GPSInfo.GPSLatitudeRef"), tr("Latitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
|
||||
QStringLiteral("Exif.GPSInfo.GPSLatitude"), tr("Latitude"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
|
||||
QStringLiteral("Exif.GPSInfo.GPSLongitudeRef"), tr("Longitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
|
||||
QStringLiteral("Exif.GPSInfo.GPSLongitude"), tr("Longitude"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
|
||||
QStringLiteral("Exif.GPSInfo.GPSAltitudeRef"), tr("Altitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, QStringLiteral("GPS"),
|
||||
QStringLiteral("Exif.GPSInfo.GPSAltitude"), tr("Altitude"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLatitudeRef"_s, tr("Latitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLatitude"_s, tr("Latitude"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLongitudeRef"_s, tr("Longitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSLongitude"_s, tr("Longitude"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSAltitudeRef"_s, tr("Altitude reference"));
|
||||
appendExivPropertyIfExist(wrapper, u"GPS"_s,
|
||||
u"Exif.GPSInfo.GPSAltitude"_s, tr("Altitude"));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <QMouseEvent>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
|
||||
NavigatorView::NavigatorView(QWidget *parent)
|
||||
: QGraphicsView (parent)
|
||||
@@ -34,10 +35,14 @@ void NavigatorView::setOpacity(qreal opacity, bool animated)
|
||||
|
||||
void NavigatorView::updateMainViewportRegion()
|
||||
{
|
||||
if (m_mainView != nullptr) {
|
||||
m_viewportRegion = mapFromScene(m_mainView->mapToScene(m_mainView->rect()));
|
||||
update();
|
||||
}
|
||||
// Use QTimer::singleShot with lambda to delay the update
|
||||
// This ensures all geometry updates are complete before calculating viewport region
|
||||
QTimer::singleShot(0, [this]() {
|
||||
if (m_mainView != nullptr) {
|
||||
m_viewportRegion = mapFromScene(m_mainView->mapToScene(m_mainView->rect()));
|
||||
update();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void NavigatorView::mousePressEvent(QMouseEvent *event)
|
||||
|
||||
@@ -186,6 +186,26 @@ QModelIndex PlaylistManager::loadPlaylist(const QUrl &url)
|
||||
return idx;
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::loadM3U8Playlist(const QUrl &url)
|
||||
{
|
||||
QFile file(url.toLocalFile());
|
||||
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
QList<QUrl> urls;
|
||||
while (!file.atEnd()) {
|
||||
QString line = file.readLine();
|
||||
if (line.startsWith('#')) {
|
||||
continue;
|
||||
}
|
||||
QFileInfo fileInfo(file);
|
||||
QUrl item = QUrl::fromUserInput(line, fileInfo.absolutePath());
|
||||
urls.append(item);
|
||||
}
|
||||
return loadPlaylist(urls);
|
||||
} else {
|
||||
return {};
|
||||
}
|
||||
}
|
||||
|
||||
int PlaylistManager::totalCount() const
|
||||
{
|
||||
return m_model.rowCount();
|
||||
@@ -196,7 +216,7 @@ QModelIndex PlaylistManager::previousIndex() const
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
|
||||
return m_model.index(m_currentIndex - 1 < 0 ? count - 1 : m_currentIndex - 1);
|
||||
return m_model.index(isFirstIndex() ? count - 1 : m_currentIndex - 1);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::nextIndex() const
|
||||
@@ -204,7 +224,7 @@ QModelIndex PlaylistManager::nextIndex() const
|
||||
int count = totalCount();
|
||||
if (count == 0) return {};
|
||||
|
||||
return m_model.index(m_currentIndex + 1 == count ? 0 : m_currentIndex + 1);
|
||||
return m_model.index(isLastIndex() ? 0 : m_currentIndex + 1);
|
||||
}
|
||||
|
||||
QModelIndex PlaylistManager::curIndex() const
|
||||
@@ -212,6 +232,16 @@ QModelIndex PlaylistManager::curIndex() const
|
||||
return m_model.index(m_currentIndex);
|
||||
}
|
||||
|
||||
bool PlaylistManager::isFirstIndex() const
|
||||
{
|
||||
return m_currentIndex == 0;
|
||||
}
|
||||
|
||||
bool PlaylistManager::isLastIndex() const
|
||||
{
|
||||
return m_currentIndex + 1 == totalCount();
|
||||
}
|
||||
|
||||
void PlaylistManager::setCurrentIndex(const QModelIndex &index)
|
||||
{
|
||||
if (index.isValid() && index.row() >= 0 && index.row() < totalCount()) {
|
||||
|
||||
@@ -61,11 +61,14 @@ public:
|
||||
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);
|
||||
|
||||
int totalCount() const;
|
||||
QModelIndex previousIndex() const;
|
||||
QModelIndex nextIndex() const;
|
||||
QModelIndex curIndex() const;
|
||||
bool isFirstIndex() const;
|
||||
bool isLastIndex() const;
|
||||
void setCurrentIndex(const QModelIndex & index);
|
||||
QUrl urlByIndex(const QModelIndex & index);
|
||||
QString localFileByIndex(const QModelIndex & index);
|
||||
|
||||
@@ -45,16 +45,44 @@ Settings *Settings::instance()
|
||||
return m_settings_instance;
|
||||
}
|
||||
|
||||
bool Settings::stayOnTop()
|
||||
bool Settings::stayOnTop() const
|
||||
{
|
||||
return m_qsettings->value("stay_on_top", true).toBool();
|
||||
}
|
||||
|
||||
bool Settings::useLightCheckerboard()
|
||||
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();
|
||||
}
|
||||
|
||||
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
|
||||
// Qt 6.7.1's is somewhat better, memory issue seems fixed, but still laggy when zoom in, see QTBUG-126771.
|
||||
// Qt 6.9.3 and Qt 6.10.1 seems no longer have the laggy issue, so let's make the default value different
|
||||
// based on Qt version.
|
||||
#if QT_VERSION < QT_VERSION_CHECK(6, 9, 3)
|
||||
return m_qsettings->value("svg_tiny12_only", true).toBool();
|
||||
#else
|
||||
return m_qsettings->value("svg_tiny12_only", false).toBool();
|
||||
#endif // QT_VERSION < QT_VERSION_CHECK(6, 9, 3)
|
||||
}
|
||||
|
||||
Settings::DoubleClickBehavior Settings::doubleClickBehavior() const
|
||||
{
|
||||
QString result = m_qsettings->value("double_click_behavior", "Close").toString();
|
||||
@@ -89,12 +117,36 @@ void Settings::setStayOnTop(bool 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);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setLoopGallery(bool on)
|
||||
{
|
||||
m_qsettings->setValue("loop_gallery", 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);
|
||||
m_qsettings->sync();
|
||||
}
|
||||
|
||||
void Settings::setDoubleClickBehavior(DoubleClickBehavior dcb)
|
||||
{
|
||||
m_qsettings->setValue("double_click_behavior", QEnumHelper::toString(dcb));
|
||||
|
||||
@@ -34,15 +34,23 @@ public:
|
||||
|
||||
static Settings *instance();
|
||||
|
||||
bool stayOnTop();
|
||||
bool useLightCheckerboard();
|
||||
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);
|
||||
|
||||
@@ -20,7 +20,11 @@
|
||||
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)
|
||||
@@ -118,14 +122,22 @@ SettingsDialog::SettingsDialog(QWidget *parent)
|
||||
}
|
||||
|
||||
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));
|
||||
@@ -144,14 +156,38 @@ SettingsDialog::SettingsDialog(QWidget *parent)
|
||||
}
|
||||
}
|
||||
|
||||
connect(m_stayOnTop, &QCheckBox::stateChanged, this, [ = ](int state){
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
|
||||
# define QCHECKBOX_CHECKSTATECHANGED QCheckBox::checkStateChanged
|
||||
# define QT_CHECKSTATE Qt::CheckState
|
||||
#else
|
||||
# define QCHECKBOX_CHECKSTATECHANGED QCheckBox::stateChanged
|
||||
# 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_useLightCheckerboard, &QCheckBox::stateChanged, this, [ = ](int state){
|
||||
connect(m_useBuiltInCloseAnimation, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseBuiltInCloseAnimation(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(m_useLightCheckerboard, &QCHECKBOX_CHECKSTATECHANGED, this, [ = ](QT_CHECKSTATE state){
|
||||
Settings::instance()->setUseLightCheckerboard(state == Qt::Checked);
|
||||
});
|
||||
|
||||
connect(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){
|
||||
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);
|
||||
});
|
||||
|
||||
@@ -23,7 +23,11 @@ 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;
|
||||
|
||||
@@ -40,11 +40,6 @@ ShortcutEditor::ShortcutEditor(ShortcutEdit * shortcutEdit, QWidget * parent)
|
||||
reloadShortcuts();
|
||||
}
|
||||
|
||||
ShortcutEditor::~ShortcutEditor()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ShortcutEditor::setDescription(const QString &desc)
|
||||
{
|
||||
m_descriptionLabel->setText(desc);
|
||||
@@ -63,9 +58,7 @@ void ShortcutEditor::reloadShortcuts()
|
||||
shortcuts.append(QKeySequence());
|
||||
for (const QKeySequence & shortcut : shortcuts) {
|
||||
QKeySequenceEdit * keyseqEdit = new QKeySequenceEdit(this);
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
|
||||
keyseqEdit->setClearButtonEnabled(true);
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 4, 0)
|
||||
#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
|
||||
keyseqEdit->setMaximumSequenceLength(1);
|
||||
#endif // QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)
|
||||
|
||||
@@ -18,7 +18,7 @@ class ShortcutEditor : public QWidget
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit ShortcutEditor(ShortcutEdit * shortcutEdit, QWidget * parent = nullptr);
|
||||
~ShortcutEditor();
|
||||
~ShortcutEditor() = default;
|
||||
|
||||
void setDescription(const QString & desc);
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
935
app/translations/PineapplePictures_sl.ts
Normal file
935
app/translations/PineapplePictures_sl.ts
Normal file
@@ -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>
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
936
app/translations/PineapplePictures_vi.ts
Normal file
936
app/translations/PineapplePictures_vi.ts
Normal file
@@ -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 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>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 type="unfinished"></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>
|
||||
File diff suppressed because it is too large
Load Diff
32
appveyor.yml
32
appveyor.yml
@@ -10,20 +10,12 @@ environment:
|
||||
matrix:
|
||||
- job_name: mingw_64_qt6_8
|
||||
QTDIR: C:\Qt\6.8\mingw_64
|
||||
MINGW64: C:\Qt\Tools\mingw1310_64
|
||||
MINGW64: C:\Qt\mingw_64\Tools\mingw1310_64
|
||||
KF_BRANCH: master
|
||||
EXIV2_VERSION: "0.28.3"
|
||||
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"
|
||||
- job_name: mingw81_64_qt5_15_2
|
||||
QTDIR: C:\Qt\5.15.2\mingw81_64
|
||||
MINGW64: C:\Qt\Tools\mingw810_64
|
||||
KF_BRANCH: kf5
|
||||
EXIV2_VERSION: "0.27.7"
|
||||
EXIV2_CMAKE_OPTIONS: "-DEXIV2_BUILD_SAMPLES=OFF -DEXIV2_ENABLE_WIN_UNICODE=ON -DEXIV2_BUILD_EXIV2_COMMAND=OFF"
|
||||
PPIC_CMAKE_OPTIONS: "-DPREFER_QT_5=ON"
|
||||
WINDEPLOYQT_ARGS: "--verbose=2 --no-quick-import --no-translations --no-opengl-sw --no-angle --no-system-d3d-compiler"
|
||||
|
||||
install:
|
||||
- mkdir %CMAKE_INSTALL_PREFIX%
|
||||
@@ -82,12 +74,12 @@ build_script:
|
||||
- cd %APPVEYOR_BUILD_FOLDER%
|
||||
# install libavif for avif format support of KImageFormats
|
||||
- cd %LIBAVIF%
|
||||
- curl -fsSL -o libavif-v1_1_1.zip https://github.com/AOMediaCodec/libavif/archive/v1.1.1.zip
|
||||
- 7z x libavif-v1_1_1.zip -y
|
||||
- cd libavif-1.1.1
|
||||
- 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=ON -DAVIF_LOCAL_LIBYUV=ON
|
||||
- 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%
|
||||
@@ -98,15 +90,15 @@ build_script:
|
||||
- cd karchive
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake .. -G "Ninja" -DWITH_LIBZSTD=OFF -DWITH_BZIP2=OFF -DWITH_LIBLZMA=OFF -DWITH_OPENSSL=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=%CMAKE_INSTALL_PREFIX%
|
||||
- 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_6_2.zip https://github.com/libexpat/libexpat/archive/R_2_6_2.zip
|
||||
- 7z x R_2_6_2.zip -y
|
||||
- cd libexpat-R_2_6_2/expat/
|
||||
- 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%
|
||||
@@ -151,8 +143,8 @@ build_script:
|
||||
- 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_6_2\expat\COPYING License.expat.txt
|
||||
- copy %LIBAVIF%\libavif-1.1.1\LICENSE License.libavif.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 ..
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
IDI_ICON1 ICON DISCARDABLE "icons/app-icon.ico"
|
||||
IDI_ICON1 ICON DISCARDABLE "@CMAKE_CURRENT_SOURCE_DIR@/assets/icons/app-icon.ico"
|
||||
1 VERSIONINFO
|
||||
BEGIN
|
||||
BLOCK "StringFileInfo"
|
||||
@@ -6,8 +6,9 @@ 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
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
@@ -12,8 +12,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>
|
||||
|
||||
22
dist/MacOSXBundleInfo.plist.in
vendored
22
dist/MacOSXBundleInfo.plist.in
vendored
@@ -30,6 +30,28 @@
|
||||
<true/>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||
<!-- FIXME: this list can't be automatically generated by Qt's CMake API, don't know why. -->
|
||||
<key>CFBundleLocalizations</key>
|
||||
<array>
|
||||
<string>en</string>
|
||||
<string>ca</string>
|
||||
<string>de</string>
|
||||
<string>es</string>
|
||||
<string>fr</string>
|
||||
<string>id</string>
|
||||
<string>it</string>
|
||||
<string>ja</string>
|
||||
<string>ko</string>
|
||||
<string>nb_NO</string>
|
||||
<string>nl</string>
|
||||
<string>pa_PK</string>
|
||||
<string>ru</string>
|
||||
<string>si</string>
|
||||
<string>ta</string>
|
||||
<string>tr</string>
|
||||
<string>uk</string>
|
||||
<string>zh_CN</string>
|
||||
</array>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<!-- JPEG -->
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
<launchable type="desktop-id">net.blumia.pineapple-pictures.desktop</launchable>
|
||||
<url type="homepage">https://github.com/BLumia/pineapple-pictures</url>
|
||||
<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>
|
||||
<provides>
|
||||
<binary>ppic</binary>
|
||||
@@ -80,6 +81,134 @@
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<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>
|
||||
<ul>
|
||||
<li>New option to limit SVG support to SVG Tiny 1.2 standard</li>
|
||||
<li>Windows: ship tools and configurations that help user associate image files to this program</li>
|
||||
</ul>
|
||||
<p>This release fixes the following bugs:</p>
|
||||
<ul>
|
||||
<li>Fix window not appear at the screen that the mouse cursor is at</li>
|
||||
<li>Fix Windows prebuilt binary having AVIF plugin included but not actually support it</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>CPack DEB: will now recommend "kimageformat6-plugins" instead of the KF5 version</li>
|
||||
<li>Update translations</li>
|
||||
<li>Update exiv2 version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>VenusGirl, Andrey</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.2.1" date="2025-11-22T00:00:00Z">
|
||||
<description>
|
||||
<p>This release fixes the following bug:</p>
|
||||
<ul>
|
||||
<li>Fix incorrect color when display some CMYK images.</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Now use Qt 6.10.1 for pre-built binary</li>
|
||||
<li>Update README description and AppStream metainfo</li>
|
||||
<li>Update translations</li>
|
||||
<li>Update libavif, AOM and expat version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>albanobattistella</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.2.0" date="2025-09-21T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>Long image mode that detect extra wide image and auto fit by its thin side</li>
|
||||
<li>Windows: Add product version to binary metadata / resource file</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update translations</li>
|
||||
<li>Update libavif version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels, albanobattistella, Sabri Ünal</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.1.1" date="2025-08-02T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following feature:</p>
|
||||
<ul>
|
||||
<li>Click dock icon should show window when it's hidden on macOS</li>
|
||||
</ul>
|
||||
<p>This release fixes the following bug:</p>
|
||||
<ul>
|
||||
<li>Ensure "Fit by Width" position the view to the beginning of the image</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Update translations</li>
|
||||
<li>Update Exiv2 version for Windows binary build</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels, VenusGirl, தமிழ்நேரம்</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.1.0" date="2025-07-06T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>New option to disable built-in close window animation</li>
|
||||
<li>New option to disable gallery looping</li>
|
||||
<li>Support load m3u8 as image gallery playlist</li>
|
||||
</ul>
|
||||
<p>This release includes the following change:</p>
|
||||
<ul>
|
||||
<li>Drop Qt 5 support</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels, albanobattistella, தமிழ்நேரம்</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="1.0.0" date="2025-05-03T00:00:00Z">
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>Support enforces windowed mode on start-up</li>
|
||||
<li>Reload image automatically when current image gets updated</li>
|
||||
</ul>
|
||||
<p>This release fixes the following bug:</p>
|
||||
<ul>
|
||||
<li>Display correct text language on macOS</li>
|
||||
</ul>
|
||||
<p>This release includes the following changes:</p>
|
||||
<ul>
|
||||
<li>Use native text for shortcut editor's label</li>
|
||||
<li>Display native commandline message when possible</li>
|
||||
<li>Merge Qt translations into app applications as well</li>
|
||||
</ul>
|
||||
<p>With contributions from:</p>
|
||||
<p>Heimen Stoffels, albanobattistella, mmahhi</p>
|
||||
</description>
|
||||
</release>
|
||||
<release type="stable" version="0.9.2" date="2025-03-05T00:00:00Z">
|
||||
<description>
|
||||
<p>This release fixes the following bug:</p>
|
||||
@@ -210,7 +339,7 @@
|
||||
<description>
|
||||
<p>This release adds the following features:</p>
|
||||
<ul>
|
||||
<li>TIF and TIFF format files in the same folder will now be automatedly added to the gallery</li>
|
||||
<li>TIF and TIFF format files in the same folder will now be automatically added to the gallery</li>
|
||||
<li>Built-in window resizing now also supports Linux desktop. (macOS might also works as well)</li>
|
||||
</ul>
|
||||
<p>This release fixes the following bugs:</p>
|
||||
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ca.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ca.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: ca\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.de.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.de.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: de\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.fr.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.fr.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: fr\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.id.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.id.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: id\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.it.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.it.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: it\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
51
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ko.po
vendored
Normal file
51
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.ko.po
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\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.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 "이미지 뷰어"
|
||||
|
||||
#. (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는 가볍고 사용하기 쉬운 이미지 뷰어로, 확대 시 편리한 내비"
|
||||
"게이션 썸네일과 함께 제공되며 이미지 관리 지원이 포함되어 있지 않습니다."
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr "이미지 파일이 로드될 때 기본 창"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr "래스터 이미지 확대하기"
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr "벡터 이미지 확대하기"
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang 외"
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.nb_NO.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.nb_NO.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: nb_NO\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.pa_PK.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.pa_PK.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: pa_PK\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.si.po
vendored
Normal file
47
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.si.po
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
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"
|
||||
"Language: si\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"
|
||||
|
||||
#. (itstool) path: component/name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:7
|
||||
msgid "Pineapple Pictures"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr ""
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr ""
|
||||
53
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.sl.po
vendored
Normal file
53
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.sl.po
vendored
Normal file
@@ -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."
|
||||
49
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.tr.po
vendored
Normal file
49
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.tr.po
vendored
Normal file
@@ -0,0 +1,49 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"POT-Creation-Date: 2023-08-22 18:49中国标准时间\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 "Pineapple Resimler"
|
||||
|
||||
#. (itstool) path: component/summary
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:9
|
||||
msgid "Image Viewer"
|
||||
msgstr "Resim Görüntüleyici"
|
||||
|
||||
#. (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 ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:17
|
||||
msgid "Main window when an image file is loaded"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:22
|
||||
msgid "Zooming in a raster image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: screenshot/caption
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:27
|
||||
msgid "Zooming in a vector image"
|
||||
msgstr ""
|
||||
|
||||
#. (itstool) path: component/developer_name
|
||||
#: net.blumia.pineapple-pictures.metainfo.xml:34
|
||||
msgid "Gary (BLumia) Wang et al."
|
||||
msgstr "Gary (BLumia) Wang et al."
|
||||
52
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.vi.po
vendored
Normal file
52
dist/appstream/po/net.blumia.pineapple-pictures.metainfo.vi.po
vendored
Normal file
@@ -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."
|
||||
BIN
dist/passoc/generic.ico
vendored
Normal file
BIN
dist/passoc/generic.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 74 KiB |
BIN
dist/passoc/gif.ico
vendored
Normal file
BIN
dist/passoc/gif.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
dist/passoc/jpeg.ico
vendored
Normal file
BIN
dist/passoc/jpeg.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
dist/passoc/png.ico
vendored
Normal file
BIN
dist/passoc/png.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 71 KiB |
118
dist/passoc/ppic.pacfg
vendored
Normal file
118
dist/passoc/ppic.pacfg
vendored
Normal file
@@ -0,0 +1,118 @@
|
||||
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
|
||||
BIN
dist/passoc/psd.ico
vendored
Normal file
BIN
dist/passoc/psd.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
dist/passoc/svg.ico
vendored
Normal file
BIN
dist/passoc/svg.ico
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
@@ -1,14 +1,17 @@
|
||||
# SPDX-FileCopyrightText: 2024 Gary Wang <git@blumia.net>
|
||||
# SPDX-FileCopyrightText: 2025 Gary Wang <git@blumia.net>
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
QT += core widgets gui svg
|
||||
greaterThan(QT_MAJOR_VERSION, 5): QT += svgwidgets
|
||||
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
|
||||
@@ -64,7 +67,7 @@ HEADERS += \
|
||||
app/fileopeneventhandler.h
|
||||
|
||||
TRANSLATIONS = \
|
||||
app/translations/PineapplePictures.ts \
|
||||
app/translations/PineapplePictures_en.ts \
|
||||
app/translations/PineapplePictures_zh_CN.ts \
|
||||
app/translations/PineapplePictures_de.ts \
|
||||
app/translations/PineapplePictures_es.ts \
|
||||
@@ -84,7 +87,7 @@ RESOURCES += \
|
||||
assets/resources.qrc
|
||||
|
||||
# Generate from svg:
|
||||
# magick convert -density 512x512 -background none app-icon.svg -define icon:auto-resize app-icon.ico
|
||||
# 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)
|
||||
|
||||
Reference in New Issue
Block a user