Compare commits

..

34 Commits

Author SHA1 Message Date
Jonas Kvinge
d2205cfe81 Release 1.2.15 2025-11-25 02:50:34 +01:00
Jonas Kvinge
5830f247f6 Update Changelog 2025-11-25 02:05:26 +01:00
Jonas Kvinge
8b4c57d933 GroupedIconView: Remove deprecated QStyle::State_Editing 2025-11-23 03:14:57 +01:00
Jonas Kvinge
67cec09176 gitignore: Add .qtcreator 2025-11-23 03:14:24 +01:00
Jonas Kvinge
2df658e1f3 ListenBrainzScrobbler: Ignore connection closed 2025-11-23 01:11:59 +01:00
Jonas Kvinge
f3bc9b151c README: Update OBS URL's 2025-11-23 00:47:56 +01:00
Jonas Kvinge
b06b59d0c5 nsi: Bump ffmpeg for msvc x86_64 2025-11-22 14:20:40 +01:00
Jonas Kvinge
99d75ade06 CI: Bump MSVC SDK version 2025-11-22 02:15:20 +01:00
Jonas Kvinge
3f63246068 Add macos-15-intel runner 2025-11-22 00:47:30 +01:00
dependabot[bot]
b205a5f964 Bump actions/checkout from 5 to 6
Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 19:46:25 +01:00
dependabot[bot]
aeaef12dd4 Bump vmactions/freebsd-vm from 1.2.6 to 1.2.7
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.6 to 1.2.7.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.6...v1.2.7)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-21 19:45:43 +01:00
Jonas Kvinge
02d76f17f7 CollectionModel: Make SortText static 2025-11-15 22:10:55 +01:00
Strawberry Bot
e4e12c6fa6 New translations 2025-11-13 23:25:27 +01:00
uninstall-your-browser
270ae6085b FilterParser: Convert number to nanoseconds for length filter 2025-11-13 23:23:19 +01:00
Jonas Kvinge
7065a405a5 CI: Remove macos-13 2025-11-12 01:10:19 +01:00
Jonas Kvinge
d8c72c3dd9 ParserBase: Remove use of QString::removeFirst 2025-11-11 21:37:19 +01:00
Jonas Kvinge
b65502e167 XSPFParser: Handle platform and url 2025-11-11 00:56:36 +01:00
Jonas Kvinge
132f8df853 ParserBase: Convert spotify URLs 2025-11-11 00:56:13 +01:00
Jonas Kvinge
12e3cffe63 CI: Fix ssh command 2025-11-10 20:43:09 +01:00
dependabot[bot]
56a637682d Bump vmactions/freebsd-vm from 1.2.5 to 1.2.6
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.5...v1.2.6)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 20:01:38 +01:00
dependabot[bot]
d9b105f89e Bump vmactions/openbsd-vm from 1.2.2 to 1.2.3
Bumps [vmactions/openbsd-vm](https://github.com/vmactions/openbsd-vm) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/vmactions/openbsd-vm/releases)
- [Commits](https://github.com/vmactions/openbsd-vm/compare/v1.2.2...v1.2.3)

---
updated-dependencies:
- dependency-name: vmactions/openbsd-vm
  dependency-version: 1.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-10 17:26:57 +01:00
dependabot[bot]
bd6b45e43f Bump vmactions/freebsd-vm from 1.2.4 to 1.2.5
Bumps [vmactions/freebsd-vm](https://github.com/vmactions/freebsd-vm) from 1.2.4 to 1.2.5.
- [Release notes](https://github.com/vmactions/freebsd-vm/releases)
- [Commits](https://github.com/vmactions/freebsd-vm/compare/v1.2.4...v1.2.5)

---
updated-dependencies:
- dependency-name: vmactions/freebsd-vm
  dependency-version: 1.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 18:54:16 +01:00
dependabot[bot]
539172fb70 Bump vmactions/openbsd-vm from 1.2.1 to 1.2.2
Bumps [vmactions/openbsd-vm](https://github.com/vmactions/openbsd-vm) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/vmactions/openbsd-vm/releases)
- [Commits](https://github.com/vmactions/openbsd-vm/compare/v1.2.1...v1.2.2)

---
updated-dependencies:
- dependency-name: vmactions/openbsd-vm
  dependency-version: 1.2.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-11-03 18:11:33 +01:00
Jonas Kvinge
ebd92b3a7f nsi: Bump ffmpeg 2025-11-01 12:22:43 +01:00
Jonas Kvinge
b00ae5b210 nsi: Bump icu 2025-10-31 23:47:49 +01:00
Jonas Kvinge
c8e3cf981b main: Try different language codes for QtSparkle 2025-10-31 23:06:00 +01:00
Jonas Kvinge
038f69779f CI: Manually codesign libbrotli 2025-10-30 23:56:17 +01:00
Jonas Kvinge
a4de7559ac Fix loading language from system UI languages
Fixes #1847
2025-10-30 23:54:42 +01:00
dependabot[bot]
0537b072fe Bump actions/download-artifact from 5 to 6
Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 6.
- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/download-artifact
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-30 01:36:11 +01:00
dependabot[bot]
2657c9f96a Bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-30 01:35:56 +01:00
Jonas Kvinge
7e178b1f1a PlaylistView: Always keep EditKeyPressed 2025-10-30 01:35:30 +01:00
Jonas Kvinge
dd8513d02c PlaylistView: Disable EditKeyPressed when inline metadata editing is disabled 2025-10-27 20:19:50 +01:00
Andrew Tribick
5f0175094b Support unofficial::getopt-win32::getopt as a getopt library target
Handles the vcpkg case
2025-10-26 13:06:11 +01:00
Jonas Kvinge
b4c5b9e1e1 Turn on git revision 2025-10-26 13:05:56 +01:00
22 changed files with 383 additions and 295 deletions

View File

@@ -97,7 +97,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -134,14 +134,14 @@ jobs:
run: echo "subdir=$(echo ${{matrix.opensuse_version}} | sed 's/leap:/lp/g' | sed 's/\.//g')" > $GITHUB_OUTPUT run: echo "subdir=$(echo ${{matrix.opensuse_version}} | sed 's/leap:/lp/g' | sed 's/\.//g')" > $GITHUB_OUTPUT
- name: Upload source - name: Upload source
if: matrix.opensuse_version == 'tumbleweed' if: matrix.opensuse_version == 'tumbleweed'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: source name: source
path: | path: |
/usr/src/packages/SOURCES/*.xz /usr/src/packages/SOURCES/*.xz
- name: Upload rpm - name: Upload rpm
if: matrix.opensuse_version != 'tumbleweed' if: matrix.opensuse_version != 'tumbleweed'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: opensuse-${{steps.set-subdir.outputs.subdir}} name: opensuse-${{steps.set-subdir.outputs.subdir}}
path: | path: |
@@ -209,7 +209,7 @@ jobs:
sparsehash-devel sparsehash-devel
rapidjson-devel rapidjson-devel
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -234,7 +234,7 @@ jobs:
working-directory: build working-directory: build
run: rpmbuild -ba strawberry.spec run: rpmbuild -ba strawberry.spec
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: fedora-${{matrix.fedora_version}} name: fedora-${{matrix.fedora_version}}
path: | path: |
@@ -307,7 +307,7 @@ jobs:
- name: Remove files - name: Remove files
run: rm -rf /usr/lib64/qt6/lib/cmake/Qt6Sql/{Qt6QMYSQL*,Qt6QODBCD*,Qt6QPSQL*,Qt6QIBase*} run: rm -rf /usr/lib64/qt6/lib/cmake/Qt6Sql/{Qt6QMYSQL*,Qt6QODBCD*,Qt6QPSQL*,Qt6QIBase*}
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -333,7 +333,7 @@ jobs:
run: rpmbuild -ba strawberry.spec run: rpmbuild -ba strawberry.spec
- name: Upload artifacts - name: Upload artifacts
if: matrix.openmandriva_version != 'cooker' if: matrix.openmandriva_version != 'cooker'
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: openmandriva-${{matrix.openmandriva_version}} name: openmandriva-${{matrix.openmandriva_version}}
path: | path: |
@@ -409,7 +409,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -434,7 +434,7 @@ jobs:
working-directory: build working-directory: build
run: rpmbuild -ba strawberry.spec run: rpmbuild -ba strawberry.spec
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: mageia-${{matrix.mageia_version}} name: mageia-${{matrix.mageia_version}}
path: | path: |
@@ -511,7 +511,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -528,7 +528,7 @@ jobs:
- name: Copy deb - name: Copy deb
run: cp ../*.deb . run: cp ../*.deb .
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: debian-${{matrix.debian_version}} name: debian-${{matrix.debian_version}}
path: | path: |
@@ -607,7 +607,7 @@ jobs:
cmake --build build --config Release --parallel 4 cmake --build build --config Release --parallel 4
cmake --install build cmake --install build
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -624,7 +624,7 @@ jobs:
- name: Copy deb - name: Copy deb
run: cp ../*.deb ../*.ddeb . run: cp ../*.deb ../*.ddeb .
- name: Upload artifacts - name: Upload artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v5
with: with:
name: ubuntu-${{matrix.ubuntu_version}} name: ubuntu-${{matrix.ubuntu_version}}
path: | path: |
@@ -699,7 +699,7 @@ jobs:
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
run: apt install -y keyboxd run: apt install -y keyboxd
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -735,13 +735,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
- name: Build FreeBSD - name: Build FreeBSD
id: build-freebsd id: build-freebsd
uses: vmactions/freebsd-vm@v1.2.4 uses: vmactions/freebsd-vm@v1.2.7
with: with:
usesh: true usesh: true
mem: 4096 mem: 4096
@@ -760,13 +760,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
- name: Build OpenBSD - name: Build OpenBSD
id: build-openbsd id: build-openbsd
uses: vmactions/openbsd-vm@v1.2.1 uses: vmactions/openbsd-vm@v1.2.3
with: with:
usesh: true usesh: true
mem: 4096 mem: 4096
@@ -787,7 +787,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
runner: [ 'macos-13', 'macos-15' ] runner: [ 'macos-15-intel', 'macos-15' ]
buildtype: [ 'release' ] buildtype: [ 'release' ]
runs-on: ${{ matrix.runner }} runs-on: ${{ matrix.runner }}
@@ -826,7 +826,7 @@ jobs:
rm -f uninstall.sh rm -f uninstall.sh
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -839,7 +839,7 @@ jobs:
p12-password: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE_PASSWORD }} p12-password: ${{ secrets.APPLE_DEVELOPER_ID_CERTIFICATE_PASSWORD }}
- name: Download macOS dependencies - name: Download macOS dependencies
run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-macos-dependencies/releases/latest/download/strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz run: curl -f -O -L https://github.com/strawberrymusicplayer/strawberry-macos-dependencies$(test "${{env.arch}}" = "x86_64" && echo "-intel" || echo "")/releases/latest/download/strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz
- name: Extract macOS dependencies - name: Extract macOS dependencies
run: sudo tar -C / -xf strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz run: sudo tar -C / -xf strawberry-macos-${{env.arch}}-${{env.buildtype}}.tar.xz
@@ -890,9 +890,9 @@ jobs:
run: make deploy run: make deploy
- name: Manually Codesign - name: Manually Codesign
if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-13' if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-15-intel'
working-directory: build working-directory: build
run: codesign -s 383J84DVB6 -f strawberry.app/Contents/Frameworks/{libpcre2-8.0.dylib,libpcre2-16.0.dylib,libpng16.16.dylib,libfreetype.6.dylib,libzstd.1.dylib} strawberry.app/Contents/Frameworks/png.framework/png strawberry.app run: codesign -s 383J84DVB6 -f strawberry.app/Contents/Frameworks/{libpcre2-8.0.dylib,libpcre2-16.0.dylib,libpng16.16.dylib,libfreetype.6.dylib,libzstd.1.dylib,libbrotlicommon.1.dylib,libbrotlienc.1.dylib} strawberry.app/Contents/Frameworks/png.framework/png strawberry.app
- name: Manually Codesign - name: Manually Codesign
if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-15' if: github.repository == 'strawberrymusicplayer/strawberry' && github.event.pull_request.head.repo.fork == false && matrix.runner == 'macos-15'
@@ -977,7 +977,7 @@ jobs:
run: echo "cmake_buildtype=$(echo ${{env.buildtype}} | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')" >> $GITHUB_ENV run: echo "cmake_buildtype=$(echo ${{env.buildtype}} | awk '{print toupper(substr($0,0,1))tolower(substr($0,2))}')" >> $GITHUB_ENV
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -1080,7 +1080,7 @@ jobs:
run: echo "cmake_buildtype=$(echo ${{matrix.buildtype}} | sed 's/.*/\u&/')" >> $GITHUB_ENV run: echo "cmake_buildtype=$(echo ${{matrix.buildtype}} | sed 's/.*/\u&/')" >> $GITHUB_ENV
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -1310,7 +1310,7 @@ jobs:
- name: Set SDK version - name: Set SDK version
if: matrix.arch != 'arm64' if: matrix.arch != 'arm64'
shell: bash shell: bash
run: echo "sdk_version=10.0.19041.0" >> $GITHUB_ENV run: echo "sdk_version=10.0.22621.0" >> $GITHUB_ENV
- name: Set SDK version - name: Set SDK version
if: matrix.arch == 'arm64' if: matrix.arch == 'arm64'
@@ -1321,10 +1321,6 @@ jobs:
shell: cmd shell: cmd
run: choco install --no-progress rsync run: choco install --no-progress rsync
- name: Set SSH command
shell: bash
run: echo "ssh_command=/c/ProgramData/chocolatey/lib/rsync/tools/$(ls -1 /c/ProgramData/chocolatey/lib/rsync/tools/ | grep -v '\.zip$' | grep '^cwrsync' | tail -1)/bin/ssh.exe" >> $GITHUB_ENV
- name: Cleanup PATH - name: Cleanup PATH
uses: egor-tensin/cleanup-path@v4 uses: egor-tensin/cleanup-path@v4
with: with:
@@ -1409,7 +1405,7 @@ jobs:
vsversion: 2022 vsversion: 2022
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
submodules: recursive submodules: recursive
@@ -1623,7 +1619,7 @@ jobs:
- name: rsync - name: rsync
if: steps.set-upload-path.outputs.upload_path != '' if: steps.set-upload-path.outputs.upload_path != ''
shell: bash shell: bash
run: rsync -e "${{env.ssh_command}} -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/StrawberrySetup*.exe ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{steps.set-upload-path.outputs.upload_path}}/ run: rsync -e "/c/ProgramData/chocolatey/lib/rsync/tools/bin/ssh.exe -p ${{secrets.SSH_PORT}} -o StrictHostKeyChecking=no" -var build/StrawberrySetup*.exe ${{secrets.SSH_USER}}@${{secrets.SSH_HOST}}:${{steps.set-upload-path.outputs.upload_path}}/
upload: upload:
@@ -1642,11 +1638,11 @@ jobs:
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
run: sudo apt install -y git rsync run: sudo apt install -y git rsync
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Download artifacts - name: Download artifacts
uses: actions/download-artifact@v5 uses: actions/download-artifact@v6
with: with:
path: artifacts path: artifacts
- name: SSH Setup - name: SSH Setup
@@ -1690,7 +1686,7 @@ jobs:
DEBIAN_FRONTEND: noninteractive DEBIAN_FRONTEND: noninteractive
run: sudo apt install -y git jq gh run: sudo apt install -y git jq gh
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@v6
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Show release assets - name: Show release assets
@@ -1698,7 +1694,7 @@ jobs:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
run: gh release view "${{github.event.release.tag_name}}" --json assets | jq -r '.assets[].name' run: gh release view "${{github.event.release.tag_name}}" --json assets | jq -r '.assets[].name'
- name: Download artifacts - name: Download artifacts
uses: actions/download-artifact@v5 uses: actions/download-artifact@v6
with: with:
path: artifacts path: artifacts
- name: Add artifacts to release - name: Add artifacts to release

1
.gitignore vendored
View File

@@ -1,6 +1,7 @@
/build /build
/bin /bin
/CMakeLists.txt.user /CMakeLists.txt.user
/.qtcreator
/.kdev4 /.kdev4
/strawberry.kdev4 /strawberry.kdev4
/.vscode /.vscode

View File

@@ -266,6 +266,8 @@ if(WIN32)
set(GETOPT_LIBRARIES getopt-win::getopt) set(GETOPT_LIBRARIES getopt-win::getopt)
elseif(TARGET getopt::getopt_shared) elseif(TARGET getopt::getopt_shared)
set(GETOPT_LIBRARIES getopt::getopt_shared) set(GETOPT_LIBRARIES getopt::getopt_shared)
elseif(TARGET unofficial::getopt-win32::getopt)
set(GETOPT_LIBRARIES unofficial::getopt-win32::getopt)
else() else()
message(FATAL_ERROR "Missing getopt") message(FATAL_ERROR "Missing getopt")
endif() endif()

View File

@@ -2,6 +2,15 @@ Strawberry Music Player
======================= =======================
ChangeLog ChangeLog
Version 1.2.15 (2025.11.25):
* Fixed system default language not respected
* Fixed length filter search
* Fixed playlist parser converting Spotify URL's
* Removed use of deprecated QStyle::State_Editing
* Ignore connection closed errors for ListenBrainz
* (Windows) Support building with vcpkg unofficial::getopt-win32::getopt
Version 1.2.14 (2025.10.25): Version 1.2.14 (2025.10.25):
Bugfixes: Bugfixes:

View File

@@ -17,7 +17,9 @@ Its written in **C++ using the Qt framework**, designed for **audiophiles and
- **Forum:** https://forum.strawberrymusicplayer.org - **Forum:** https://forum.strawberrymusicplayer.org
- **GitHub:** https://github.com/strawberrymusicplayer/strawberry - **GitHub:** https://github.com/strawberrymusicplayer/strawberry
- **Latest builds:** https://builds.strawberrymusicplayer.org - **Latest builds:** https://builds.strawberrymusicplayer.org
- **openSUSE Build Service:** https://build.opensuse.org/package/show/home:jonaski:audio/strawberry - **openSUSE Build Service:**
- Stable: https://build.opensuse.org/package/show/home:jonaski:strawberry/strawberry
- Unstable: https://build.opensuse.org/package/show/home:jonaski:strawberry-dev/strawberry
- **Ubuntu PPAs:** - **Ubuntu PPAs:**
- Stable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry - Stable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry
- Unstable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry-unstable - Unstable: https://launchpad.net/~jonaski/+archive/ubuntu/strawberry-unstable

View File

@@ -1,6 +1,6 @@
set(STRAWBERRY_VERSION_MAJOR 1) set(STRAWBERRY_VERSION_MAJOR 1)
set(STRAWBERRY_VERSION_MINOR 2) set(STRAWBERRY_VERSION_MINOR 2)
set(STRAWBERRY_VERSION_PATCH 14) set(STRAWBERRY_VERSION_PATCH 15)
#set(STRAWBERRY_VERSION_PRERELEASE rc1) #set(STRAWBERRY_VERSION_PRERELEASE rc1)
set(INCLUDE_GIT_REVISION OFF) set(INCLUDE_GIT_REVISION OFF)

View File

@@ -51,6 +51,7 @@
</screenshots> </screenshots>
<update_contact>eclipseo@fedoraproject.org</update_contact> <update_contact>eclipseo@fedoraproject.org</update_contact>
<releases> <releases>
<release version="1.2.15" date="2025-11-25"/>
<release version="1.2.14" date="2025-10-25"/> <release version="1.2.14" date="2025-10-25"/>
<release version="1.2.13" date="2025-08-31"/> <release version="1.2.13" date="2025-08-31"/>
<release version="1.2.12" date="2025-08-12"/> <release version="1.2.12" date="2025-08-12"/>

View File

@@ -477,15 +477,15 @@ Section "Strawberry" Strawberry
; Common files ; Common files
File "icudt77.dll" File "icudt78.dll"
!ifdef msvc && arch_arm64 !ifdef msvc && arch_arm64
File "fftw3.dll" File "fftw3.dll"
!else !else
File "libfftw3-3.dll" File "libfftw3-3.dll"
!endif !endif
!ifdef msvc && debug !ifdef msvc && debug
File "icuin77d.dll" File "icuin78d.dll"
File "icuuc77d.dll" File "icuuc78d.dll"
File "libxml2d.dll" File "libxml2d.dll"
File "Qt6Concurrentd.dll" File "Qt6Concurrentd.dll"
File "Qt6Cored.dll" File "Qt6Cored.dll"
@@ -494,8 +494,8 @@ Section "Strawberry" Strawberry
File "Qt6Sqld.dll" File "Qt6Sqld.dll"
File "Qt6Widgetsd.dll" File "Qt6Widgetsd.dll"
!else !else
File "icuin77.dll" File "icuin78.dll"
File "icuuc77.dll" File "icuuc78.dll"
File "libxml2.dll" File "libxml2.dll"
File "Qt6Concurrent.dll" File "Qt6Concurrent.dll"
File "Qt6Core.dll" File "Qt6Core.dll"
@@ -505,6 +505,7 @@ Section "Strawberry" Strawberry
File "Qt6Widgets.dll" File "Qt6Widgets.dll"
!endif !endif
!ifdef msvc && arch_x86
File "avcodec-61.dll" File "avcodec-61.dll"
File "avfilter-10.dll" File "avfilter-10.dll"
File "avformat-61.dll" File "avformat-61.dll"
@@ -512,6 +513,14 @@ Section "Strawberry" Strawberry
File "postproc-58.dll" File "postproc-58.dll"
File "swresample-5.dll" File "swresample-5.dll"
File "swscale-8.dll" File "swscale-8.dll"
!else
File "avcodec-62.dll"
File "avfilter-11.dll"
File "avformat-62.dll"
File "avutil-60.dll"
File "swresample-6.dll"
File "swscale-9.dll"
!endif
; Register Strawberry with Default Programs ; Register Strawberry with Default Programs
Var /GLOBAL AppIcon Var /GLOBAL AppIcon
@@ -1019,15 +1028,15 @@ Section "Uninstall"
; Common files ; Common files
Delete "$INSTDIR\icudt77.dll" Delete "$INSTDIR\icudt78.dll"
!ifdef msvc && arch_arm64 !ifdef msvc && arch_arm64
Delete "$INSTDIR\fftw3.dll" Delete "$INSTDIR\fftw3.dll"
!else !else
Delete "$INSTDIR\libfftw3-3.dll" Delete "$INSTDIR\libfftw3-3.dll"
!endif !endif
!ifdef msvc && debug !ifdef msvc && debug
Delete "$INSTDIR\icuin77d.dll" Delete "$INSTDIR\icuin78d.dll"
Delete "$INSTDIR\icuuc77d.dll" Delete "$INSTDIR\icuuc78d.dll"
Delete "$INSTDIR\libxml2d.dll" Delete "$INSTDIR\libxml2d.dll"
Delete "$INSTDIR\Qt6Concurrentd.dll" Delete "$INSTDIR\Qt6Concurrentd.dll"
Delete "$INSTDIR\Qt6Cored.dll" Delete "$INSTDIR\Qt6Cored.dll"
@@ -1036,8 +1045,8 @@ Section "Uninstall"
Delete "$INSTDIR\Qt6Sqld.dll" Delete "$INSTDIR\Qt6Sqld.dll"
Delete "$INSTDIR\Qt6Widgetsd.dll" Delete "$INSTDIR\Qt6Widgetsd.dll"
!else !else
Delete "$INSTDIR\icuin77.dll" Delete "$INSTDIR\icuin78.dll"
Delete "$INSTDIR\icuuc77.dll" Delete "$INSTDIR\icuuc78.dll"
Delete "$INSTDIR\libxml2.dll" Delete "$INSTDIR\libxml2.dll"
Delete "$INSTDIR\Qt6Concurrent.dll" Delete "$INSTDIR\Qt6Concurrent.dll"
Delete "$INSTDIR\Qt6Core.dll" Delete "$INSTDIR\Qt6Core.dll"
@@ -1047,6 +1056,7 @@ Section "Uninstall"
Delete "$INSTDIR\Qt6Widgets.dll" Delete "$INSTDIR\Qt6Widgets.dll"
!endif !endif
!ifdef msvc && arch_x86
Delete "$INSTDIR\avcodec-61.dll" Delete "$INSTDIR\avcodec-61.dll"
Delete "$INSTDIR\avfilter-10.dll" Delete "$INSTDIR\avfilter-10.dll"
Delete "$INSTDIR\avformat-61.dll" Delete "$INSTDIR\avformat-61.dll"
@@ -1054,6 +1064,14 @@ Section "Uninstall"
Delete "$INSTDIR\postproc-58.dll" Delete "$INSTDIR\postproc-58.dll"
Delete "$INSTDIR\swresample-5.dll" Delete "$INSTDIR\swresample-5.dll"
Delete "$INSTDIR\swscale-8.dll" Delete "$INSTDIR\swscale-8.dll"
!else
Delete "$INSTDIR\avcodec-62.dll"
Delete "$INSTDIR\avfilter-11.dll"
Delete "$INSTDIR\avformat-62.dll"
Delete "$INSTDIR\avutil-60.dll"
Delete "$INSTDIR\swresample-6.dll"
Delete "$INSTDIR\swscale-9.dll"
!endif
!ifdef mingw !ifdef mingw
Delete "$INSTDIR\gio-modules\libgiognutls.dll" Delete "$INSTDIR\gio-modules\libgiognutls.dll"

View File

@@ -185,7 +185,7 @@ class CollectionModel : public SimpleTreeModel<CollectionItem> {
static QString PrettyYearAlbumDisc(const int year, const QString &album, const int disc); static QString PrettyYearAlbumDisc(const int year, const QString &album, const int disc);
static QString PrettyDisc(const int disc); static QString PrettyDisc(const int disc);
static QString PrettyFormat(const Song &song); static QString PrettyFormat(const Song &song);
QString SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums); static QString SortText(const GroupBy group_by, const Song &song, const bool sort_skip_articles_for_artists, const bool sort_skip_articles_for_albums);
static QString SortText(QString text); static QString SortText(QString text);
static QString SortTextForName(const QString &name, const bool sort_skip_articles); static QString SortTextForName(const QString &name, const bool sort_skip_articles);
static QString SortTextForNumber(const int number); static QString SortTextForNumber(const int number);

View File

@@ -41,17 +41,19 @@ Translations::~Translations() {
} }
void Translations::LoadTranslation(const QString &prefix, const QString &path, const QString &language) { bool Translations::LoadTranslation(const QString &prefix, const QString &path, const QString &language) {
const QString basefilename = prefix + u'_' + language; const QString basefilename = prefix + u'_' + language;
QTranslator *t = new QTranslator; QTranslator *t = new QTranslator;
if (t->load(basefilename, path)) { if (!t->load(basefilename, path)) {
qLog(Debug) << "Tranlations loaded from" << basefilename;
QCoreApplication::installTranslator(t);
translations_ << t;
}
else {
delete t; delete t;
return false;
} }
qLog(Debug) << "Tranlations loaded from" << basefilename;
QCoreApplication::installTranslator(t);
translations_ << t;
return true;
} }

View File

@@ -31,7 +31,7 @@ class Translations {
public: public:
explicit Translations(); explicit Translations();
~Translations(); ~Translations();
void LoadTranslation(const QString &prefix, const QString &path, const QString &language); bool LoadTranslation(const QString &prefix, const QString &path, const QString &language);
private: private:
QList<QTranslator*> translations_; QList<QTranslator*> translations_;

View File

@@ -22,6 +22,7 @@
#include <QString> #include <QString>
#include "constants/timeconstants.h"
#include "filterparser.h" #include "filterparser.h"
#include "filtertreenop.h" #include "filtertreenop.h"
#include "filtertreeand.h" #include "filtertreeand.h"
@@ -322,7 +323,7 @@ FilterTree *FilterParser::createSearchTermTreeNode(const QString &column, const
else if (Song::kInt64SearchColumns.contains(column, Qt::CaseInsensitive)) { else if (Song::kInt64SearchColumns.contains(column, Qt::CaseInsensitive)) {
qint64 number = 0; qint64 number = 0;
if (column == "length"_L1) { if (column == "length"_L1) {
number = ParseTime(value); number = ParseTime(value) * kNsecPerSec;
} }
else { else {
number = value.toLongLong(); number = value.toLongLong();

View File

@@ -260,46 +260,78 @@ int main(int argc, char *argv[]) {
IconLoader::Init(); IconLoader::Init();
#ifdef HAVE_TRANSLATIONS #ifdef HAVE_TRANSLATIONS
QString language = options.language();
if (language.isEmpty()) { QStringList languages;
Settings s;
s.beginGroup(BehaviourSettings::kSettingsGroup); // Load language from command line options
language = s.value(BehaviourSettings::kLanguage).toString(); if (!options.language().isEmpty()) {
s.endGroup(); languages << options.language();
} }
if (language.isEmpty()) { // Load language from settings
if (languages.isEmpty()) {
Settings s;
s.beginGroup(BehaviourSettings::kSettingsGroup);
const QString language = s.value(BehaviourSettings::kLanguage).toString();
s.endGroup();
if (!language.isEmpty()) {
languages << language;
}
}
// Use system UI languages
if (languages.isEmpty()) {
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
const QStringList system_languages = QLocale::system().uiLanguages(QLocale::TagSeparator::Underscore); languages = QLocale::system().uiLanguages(QLocale::TagSeparator::Underscore);
#else #else
const QStringList system_languages = QLocale::system().uiLanguages(); const QStringList system_languages = QLocale::system().uiLanguages();
#endif for (const QString &language : system_languages) {
if (system_languages.isEmpty()) { QString language_underscore = language;
language = QLocale::system().name(); language_underscore = language_underscore.replace(u'-', u'_');
languages << language_underscore;
} }
else {
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
language = system_languages.first();
#else
language = system_languages.first();
language = language.replace(u'-', u'_');
#endif #endif
} }
if (languages.isEmpty()) {
languages << QLocale::system().name();
} }
ScopedPtr<Translations> translations(new Translations); ScopedPtr<Translations> translations(new Translations);
translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language); for (const QString &language : std::as_const(languages)) {
translations->LoadTranslation(u"strawberry"_s, u":/i18n"_s, language); if (translations->LoadTranslation(u"qt"_s, QLibraryInfo::path(QLibraryInfo::TranslationsPath), language)) {
translations->LoadTranslation(u"strawberry"_s, QStringLiteral(TRANSLATIONS_DIR), language); break;
translations->LoadTranslation(u"strawberry"_s, QCoreApplication::applicationDirPath(), language); }
translations->LoadTranslation(u"strawberry"_s, QDir::currentPath(), language); }
# ifdef HAVE_QTSPARKLE static const QStringList language_paths = QStringList() << u":/i18n"_s
qtsparkle::LoadTranslations(language); << QStringLiteral(TRANSLATIONS_DIR)
# endif << QCoreApplication::applicationDirPath()
<< QDir::currentPath();
#endif for (const QString &language : std::as_const(languages)) {
bool language_loaded = false;
for (const QString &language_path : language_paths) {
if (translations->LoadTranslation(u"strawberry"_s, language_path, language)) {
language_loaded = true;
break;
}
}
if (language_loaded) {
break;
}
}
#ifdef HAVE_QTSPARKLE
for (const QString &language : std::as_const(languages)) {
if (qtsparkle::LoadTranslations(language)) {
break;
}
}
#endif // HAVE_QTSPARKLE
#endif // HAVE_TRANSLATIONS
Application app; Application app;

View File

@@ -1315,10 +1315,14 @@ void PlaylistView::ReloadSettings() {
force_background_redraw_ = true; force_background_redraw_ = true;
} }
if (editmetadatainline) EditTriggers edit_triggers = editTriggers();
setEditTriggers(editTriggers() | QAbstractItemView::SelectedClicked); if (editmetadatainline) {
else edit_triggers |= QAbstractItemView::SelectedClicked;
setEditTriggers(editTriggers() & ~QAbstractItemView::SelectedClicked); }
else {
edit_triggers &= ~QAbstractItemView::SelectedClicked;
}
setEditTriggers(edit_triggers);
if (playlist_) playlist_->set_auto_sort(auto_sort_); if (playlist_) playlist_->set_auto_sort(auto_sort_);

View File

@@ -55,7 +55,14 @@ void ParserBase::LoadSong(const QString &filename_or_url, const qint64 beginning
filename = url.toLocalFile(); filename = url.toLocalFile();
} }
else if (song->is_stream()) { else if (song->is_stream()) {
song->set_url(QUrl::fromUserInput(filename_or_url)); url = QUrl::fromUserInput(filename_or_url);
if (url.host() == "open.spotify.com"_L1 && url.path().startsWith("/track/"_L1)) {
song->set_source(Song::Source::Spotify);
url.setScheme("spotify"_L1);
url.setHost(QString());
url.setPath(url.path().remove(0, 1).replace(u'/', u':'));
}
song->set_url(url);
song->set_filetype(Song::FileType::Stream); song->set_filetype(Song::FileType::Stream);
song->set_valid(true); song->set_valid(true);
return; return;

View File

@@ -78,7 +78,7 @@ ParserBase::LoadResult XSPFParser::Load(QIODevice *device, const QString &playli
Song XSPFParser::ParseTrack(QXmlStreamReader *reader, const QDir &dir, const bool collection_lookup) const { Song XSPFParser::ParseTrack(QXmlStreamReader *reader, const QDir &dir, const bool collection_lookup) const {
QString title, artist, album, location, art; QString platform, location, title, artist, album, art;
qint64 nanosec = -1; qint64 nanosec = -1;
int track_num = -1; int track_num = -1;
@@ -87,7 +87,10 @@ Song XSPFParser::ParseTrack(QXmlStreamReader *reader, const QDir &dir, const boo
QString name = reader->name().toString(); QString name = reader->name().toString();
switch (type) { switch (type) {
case QXmlStreamReader::StartElement:{ case QXmlStreamReader::StartElement:{
if (name == "location"_L1) { if (name == "platform"_L1) {
platform = reader->readElementText().toLower();
}
else if (name == "location"_L1 || name == "url"_L1) {
location = QUrl::fromPercentEncoding(reader->readElementText().toUtf8()); location = QUrl::fromPercentEncoding(reader->readElementText().toUtf8());
} }
else if (name == "title"_L1) { else if (name == "title"_L1) {

View File

@@ -346,6 +346,12 @@ void ListenBrainzScrobbler::UpdateNowPlayingRequestFinished(QNetworkReply *reply
QObject::disconnect(reply, nullptr, this, nullptr); QObject::disconnect(reply, nullptr, this, nullptr);
reply->deleteLater(); reply->deleteLater();
// ListenBrainz frequently close the connection, ignore any connection closed errors to avoid error popups
if (reply->error() == QNetworkReply::NetworkError::RemoteHostClosedError) {
JsonBaseRequest::Error(QStringLiteral("%1 (%2)").arg(reply->errorString()).arg(reply->error()));
return;
}
const JsonObjectResult json_object_result = ParseJsonObject(reply); const JsonObjectResult json_object_result = ParseJsonObject(reply);
if (!json_object_result.success()) { if (!json_object_result.success()) {
Error(json_object_result.error_message); Error(json_object_result.error_message);
@@ -451,6 +457,14 @@ void ListenBrainzScrobbler::ScrobbleRequestFinished(QNetworkReply *reply, Scrobb
submitted_ = false; submitted_ = false;
// ListenBrainz frequently close the connection, ignore any connection closed errors to avoid error popups
if (reply->error() == QNetworkReply::NetworkError::RemoteHostClosedError) {
JsonBaseRequest::Error(QStringLiteral("%1 (%2)").arg(reply->errorString()).arg(reply->error()));
cache_->ClearSent(cache_items);
submit_error_ = true;
return;
}
const JsonObjectResult json_object_result = ParseJsonObject(reply); const JsonObjectResult json_object_result = ParseJsonObject(reply);
if (json_object_result.success()) { if (json_object_result.success()) {
const QJsonObject &json_object = json_object_result.json_object; const QJsonObject &json_object = json_object_result.json_object;

File diff suppressed because it is too large Load Diff

View File

@@ -347,7 +347,7 @@
</message> </message>
<message> <message>
<source>WaveRubber</source> <source>WaveRubber</source>
<translation type="unfinished">WaveRubber</translation> <translation/>
</message> </message>
</context> </context>
<context> <context>
@@ -549,7 +549,7 @@
</message> </message>
<message> <message>
<source>p&amp;lughw</source> <source>p&amp;lughw</source>
<translation type="unfinished">p&amp;lughw</translation> <translation>p&amp;ghoul</translation>
</message> </message>
<message> <message>
<source>pcm</source> <source>pcm</source>
@@ -3056,7 +3056,7 @@ S&apos;il n&apos;en existe pas alors Strawberry utilisera la plus grande image d
</message> </message>
<message> <message>
<source>MenuPopupToolButton</source> <source>MenuPopupToolButton</source>
<translation type="unfinished">MenuPopupToolButton</translation> <translation/>
</message> </message>
<message> <message>
<source>&amp;Music</source> <source>&amp;Music</source>

View File

@@ -1088,7 +1088,7 @@ Se não houver resultados, ele usará a maior imagem no diretório.</translation
</message> </message>
<message> <message>
<source>Use various artists for compilation albums</source> <source>Use various artists for compilation albums</source>
<translation type="unfinished">Use various artists for compilation albums</translation> <translation>Use vários artistas para álbuns de coletâneas</translation>
</message> </message>
<message> <message>
<source>Skip leading articles (&quot;the&quot;, &quot;a&quot;, &quot;an&quot;) when sorting artist names</source> <source>Skip leading articles (&quot;the&quot;, &quot;a&quot;, &quot;an&quot;) when sorting artist names</source>

View File

@@ -3196,7 +3196,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message> </message>
<message> <message>
<source>Open audio &amp;CD...</source> <source>Open audio &amp;CD...</source>
<translation>Ses CDsi aç</translation> <translation>Ses CD'si ...</translation>
</message> </message>
<message> <message>
<source>&amp;Cover Manager</source> <source>&amp;Cover Manager</source>
@@ -3575,7 +3575,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message> </message>
<message> <message>
<source>Do not show this message again.</source> <source>Do not show this message again.</source>
<translation type="unfinished">Do not show this message again.</translation> <translation>Bu mesajı bir daha gösterme.</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -3737,7 +3737,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message> </message>
<message> <message>
<source>Popup duration</source> <source>Popup duration</source>
<translation type="unfinished">Popup duration</translation> <translation>Açılır pencere süresi</translation>
</message> </message>
<message> <message>
<source> seconds</source> <source> seconds</source>
@@ -3745,19 +3745,19 @@ If there are no matches then it will use the largest image in the directory.</tr
</message> </message>
<message> <message>
<source>Disable duration</source> <source>Disable duration</source>
<translation type="unfinished">Disable duration</translation> <translation>Süreyi devre dışı bırak</translation>
</message> </message>
<message> <message>
<source>Show a notification when I change the volume</source> <source>Show a notification when I change the volume</source>
<translation type="unfinished">Show a notification when I change the volume</translation> <translation>Ses seviyesini değiştirdiğimde bir bildirim göster</translation>
</message> </message>
<message> <message>
<source>Show a notification when I change the repeat/shuffle mode</source> <source>Show a notification when I change the repeat/shuffle mode</source>
<translation type="unfinished">Show a notification when I change the repeat/shuffle mode</translation> <translation>Yinele/karıştır modunu değiştirdiğimde bir bildirim göster</translation>
</message> </message>
<message> <message>
<source>Show a notification when I pause playback</source> <source>Show a notification when I pause playback</source>
<translation type="unfinished">Show a notification when I pause playback</translation> <translation>Oynatmayı durdurduğumda bir bildirim göster</translation>
</message> </message>
<message> <message>
<source>Show a notification when I resume playback</source> <source>Show a notification when I resume playback</source>
@@ -3769,11 +3769,11 @@ If there are no matches then it will use the largest image in the directory.</tr
</message> </message>
<message> <message>
<source>Custom message settings</source> <source>Custom message settings</source>
<translation type="unfinished">Custom message settings</translation> <translation>Özel mesaj ayarları</translation>
</message> </message>
<message> <message>
<source>Use a custom message for notifications</source> <source>Use a custom message for notifications</source>
<translation type="unfinished">Use a custom message for notifications</translation> <translation>Bildirimler için özel bir mesaj kullan</translation>
</message> </message>
<message> <message>
<source>Preview</source> <source>Preview</source>
@@ -3801,7 +3801,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message> </message>
<message> <message>
<source>Text options</source> <source>Text options</source>
<translation type="unfinished">Text options</translation> <translation>Yazı seçenekleri</translation>
</message> </message>
<message> <message>
<source>Choose font...</source> <source>Choose font...</source>
@@ -4167,7 +4167,7 @@ If there are no matches then it will use the largest image in the directory.</tr
</message> </message>
<message> <message>
<source>File extension</source> <source>File extension</source>
<translation type="unfinished">File extension</translation> <translation>Dosya uzantısı</translation>
</message> </message>
</context> </context>
<context> <context>
@@ -6231,7 +6231,7 @@ Devam etmek istediğinizden emin misiniz?</translation>
<name>SongLoaderInserter</name> <name>SongLoaderInserter</name>
<message> <message>
<source>Error while loading audio CD.</source> <source>Error while loading audio CD.</source>
<translation>Ses CD&apos;si yüklenirken hata.</translation> <translation>Ses CD'si yüklenirken hata.</translation>
</message> </message>
<message> <message>
<source>Loading tracks</source> <source>Loading tracks</source>
@@ -7226,7 +7226,7 @@ Devam etmek istediğinizden emin misiniz?</translation>
<name>TranscoderOptionsASF</name> <name>TranscoderOptionsASF</name>
<message> <message>
<source>Form</source> <source>Form</source>
<translation type="unfinished">Form</translation> <translation>Biçim</translation>
</message> </message>
<message> <message>
<source>Bitrate</source> <source>Bitrate</source>
@@ -7320,7 +7320,7 @@ Devam etmek istediğinizden emin misiniz?</translation>
<name>TranscoderOptionsOpus</name> <name>TranscoderOptionsOpus</name>
<message> <message>
<source>Form</source> <source>Form</source>
<translation type="unfinished">Form</translation> <translation>Biçim</translation>
</message> </message>
<message> <message>
<source>Bitrate</source> <source>Bitrate</source>
@@ -7328,19 +7328,19 @@ Devam etmek istediğinizden emin misiniz?</translation>
</message> </message>
<message> <message>
<source> kbps</source> <source> kbps</source>
<translation type="unfinished"> kbps</translation> <translation> kbps</translation>
</message> </message>
</context> </context>
<context> <context>
<name>TranscoderOptionsSpeex</name> <name>TranscoderOptionsSpeex</name>
<message> <message>
<source>Form</source> <source>Form</source>
<translation type="unfinished">Form</translation> <translation>Biçim</translation>
</message> </message>
<message> <message>
<source>Quality</source> <source>Quality</source>
<comment>Sound quality</comment> <comment>Sound quality</comment>
<translation type="unfinished">Quality</translation> <translation>Kalite</translation>
</message> </message>
<message> <message>
<source>Bitrate</source> <source>Bitrate</source>
@@ -7348,11 +7348,11 @@ Devam etmek istediğinizden emin misiniz?</translation>
</message> </message>
<message> <message>
<source>automatic</source> <source>automatic</source>
<translation type="unfinished">automatic</translation> <translation>otomatik</translation>
</message> </message>
<message> <message>
<source> kbps</source> <source> kbps</source>
<translation type="unfinished"> kbps</translation> <translation> kbps</translation>
</message> </message>
<message> <message>
<source>Average bitrate</source> <source>Average bitrate</source>
@@ -7360,15 +7360,15 @@ Devam etmek istediğinizden emin misiniz?</translation>
</message> </message>
<message> <message>
<source>disabled</source> <source>disabled</source>
<translation type="unfinished">disabled</translation> <translation>devre dışı</translation>
</message> </message>
<message> <message>
<source>Encoding mode</source> <source>Encoding mode</source>
<translation type="unfinished">Encoding mode</translation> <translation>Kodlama modu</translation>
</message> </message>
<message> <message>
<source>Auto</source> <source>Auto</source>
<translation type="unfinished">Auto</translation> <translation>Otomatik</translation>
</message> </message>
<message> <message>
<source>Ultra wide band (UWB)</source> <source>Ultra wide band (UWB)</source>

View File

@@ -265,7 +265,6 @@ void GroupedIconView::paintEvent(QPaintEvent *e) {
const QItemSelectionModel *selections = selectionModel(); const QItemSelectionModel *selections = selectionModel();
const bool focus = (hasFocus() || viewport()->hasFocus()) && current.isValid(); const bool focus = (hasFocus() || viewport()->hasFocus()) && current.isValid();
const QStyle::State opt_state = option.state; const QStyle::State opt_state = option.state;
const QAbstractItemView::State viewState = state();
const bool enabled = (opt_state & QStyle::State_Enabled) != 0; const bool enabled = (opt_state & QStyle::State_Enabled) != 0;
int maxSize = (flow() == TopToBottom) ? viewport()->size().width() - 2 * spacing() : viewport()->size().height() - 2 * spacing(); int maxSize = (flow() == TopToBottom) ? viewport()->size().width() - 2 * spacing() : viewport()->size().height() - 2 * spacing();
@@ -301,9 +300,6 @@ void GroupedIconView::paintEvent(QPaintEvent *e) {
} }
if (focus && current == *it) { if (focus && current == *it) {
option.state |= QStyle::State_HasFocus; option.state |= QStyle::State_HasFocus;
if (viewState == EditingState) {
option.state |= QStyle::State_Editing;
}
} }
itemDelegate()->paint(&painter, option, *it); itemDelegate()->paint(&painter, option, *it);