mirror of
https://github.com/xiaoyifang/goldendict-ng.git
synced 2024-11-24 16:54:08 +00:00
Merge branch 'dev'
This commit is contained in:
commit
158f8e405f
4
.github/scripts/windows-publish.ps1
vendored
4
.github/scripts/windows-publish.ps1
vendored
|
@ -47,6 +47,10 @@ function Main() {
|
|||
Write-Host "copy license.."
|
||||
Copy-Item "opencc\*" $archiveName\opencc\
|
||||
Write-Host "opencc config files.."
|
||||
|
||||
New-Item -ItemType Directory $archiveName\help
|
||||
Copy-Item "help\*" $archiveName\help\
|
||||
Write-Host "help files.."
|
||||
# 拷贝WinSDK dll
|
||||
$sdkDll="{0}Redist\{1}ucrt\DLLs\{2}\*.dll" -f $env:winSdkDir.Trim(),$env:winSdkVer.Trim(),$env:msvcArch
|
||||
Write-Host "copy sdk dll$($sdkDll)"
|
||||
|
|
6
.github/workflows/AutoTag.yml
vendored
6
.github/workflows/AutoTag.yml
vendored
|
@ -22,9 +22,9 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
|
||||
env:
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name: macos-6.2
|
||||
name: macos-6.x
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
@ -29,9 +29,9 @@ jobs:
|
|||
qt_arch: [clang_64]
|
||||
env:
|
||||
targetName: GoldenDict
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
|
||||
steps:
|
||||
# macos 11.0 默认环境变了,要指定
|
||||
|
@ -110,7 +110,7 @@ jobs:
|
|||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: ${{ env.targetName }}.dmg
|
||||
asset_name: ${{ matrix.qt_ver }}-${{ env.targetName }}_${{ matrix.os }}_${{steps.vars.outputs.release_date}}.dmg
|
||||
asset_name: ${{ matrix.qt_ver }}-${{ env.targetName }}_${{ matrix.os }}_universal_${{steps.vars.outputs.release_date}}.dmg
|
||||
tag: v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
overwrite: true
|
||||
release_name: GoldenDict-v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
|
@ -129,6 +129,7 @@ jobs:
|
|||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
4
.github/workflows/macos-PR-check.yml
vendored
4
.github/workflows/macos-PR-check.yml
vendored
|
@ -25,10 +25,6 @@ jobs:
|
|||
os: [macos-11.0]
|
||||
qt_ver: [5.15.2,6.2.4]
|
||||
qt_arch: [clang_64]
|
||||
env:
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
|
||||
steps:
|
||||
# macos 11.0 默认环境变了,要指定
|
||||
|
|
81
.github/workflows/macos-homebrew-PR-check.yml
vendored
Normal file
81
.github/workflows/macos-homebrew-PR-check.yml
vendored
Normal file
|
@ -0,0 +1,81 @@
|
|||
name: macos-homebrew-PR-check
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
on:
|
||||
|
||||
workflow_dispatch:
|
||||
|
||||
pull_request:
|
||||
branches:
|
||||
- dev
|
||||
- master
|
||||
- staged
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
- ".github/**"
|
||||
- "howto/**"
|
||||
- "*.md"
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-12]
|
||||
qt_ver: [6.3.1]
|
||||
qt_arch: [clang_64]
|
||||
env:
|
||||
targetName: GoldenDict
|
||||
steps:
|
||||
# - name: prepare env
|
||||
# run: |
|
||||
# cd /opt
|
||||
# mkdir homebrew
|
||||
# curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
|
||||
# export PATH=$PATH:/opt/homebrew/bin
|
||||
- name: Install Qt
|
||||
uses: xiaoyifang/install-qt-action@v3
|
||||
with:
|
||||
version: ${{ matrix.qt_ver }}
|
||||
arch: ${{ matrix.qt_arch }}
|
||||
cached: 'false'
|
||||
modules: qtwebengine qtwebchannel qtpositioning qt5compat qtmultimedia
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Set outputs
|
||||
id: githash
|
||||
run: |
|
||||
echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
|
||||
|
||||
- name: build macos
|
||||
run: |
|
||||
brew install pcre2 harfbuzz freetype
|
||||
brew install cmake ninja python
|
||||
brew install automake
|
||||
brew install autoconf
|
||||
brew install libtool
|
||||
brew install opencc
|
||||
brew install ffmpeg@5
|
||||
#brew reinstall $(brew deps ffmpeg) ffmpeg
|
||||
brew install libao
|
||||
brew install libiconv
|
||||
brew install lzo bzip2
|
||||
brew install libogg
|
||||
brew install zstd lzip
|
||||
brew install libtiff
|
||||
brew install libvorbis --force
|
||||
brew install hunspell
|
||||
wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2
|
||||
tar xvjf eb-4.4.3.tar.bz2
|
||||
cd eb-4.4.3 && ./configure && make -j 8 && sudo make install && cd ..
|
||||
#brew install qt # or use official offline installer
|
||||
brew install xz lzo
|
||||
brew install pkg-config
|
||||
|
||||
- name: compile
|
||||
run: |
|
||||
qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=no_extra_tiff_handler #CONFIG+=no_epwing_support # CONFIG+=no_ffmpeg_player #CONFIG+=no_qtmultimedia_player
|
||||
make
|
||||
|
166
.github/workflows/macos-homebrew.yml
vendored
Normal file
166
.github/workflows/macos-homebrew.yml
vendored
Normal file
|
@ -0,0 +1,166 @@
|
|||
name: macos-homebrew
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches:
|
||||
- dev
|
||||
- master
|
||||
# - staged
|
||||
paths-ignore:
|
||||
- 'docs/**'
|
||||
- ".github/**"
|
||||
- "howto/**"
|
||||
- "*.md"
|
||||
- ".clang-format"
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-11,macos-12]
|
||||
qt_ver: [6.4.0]
|
||||
qt_arch: [clang_64]
|
||||
env:
|
||||
targetName: GoldenDict
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
steps:
|
||||
# macos 11.0 默认环境变了,要指定
|
||||
- name: prepare env
|
||||
if: ${{ matrix.os == 'macos-11' }}
|
||||
run: |
|
||||
softwareupdate --all --install --force
|
||||
sudo xcode-select --print-path
|
||||
sudo xcode-select --switch /Library/Developer/CommandLineTools
|
||||
- uses: actions/setup-python@v3
|
||||
with:
|
||||
python-version: '3.9'
|
||||
- name: Install Qt
|
||||
uses: xiaoyifang/install-qt-action@v3
|
||||
with:
|
||||
version: ${{ matrix.qt_ver }}
|
||||
arch: ${{ matrix.qt_arch }}
|
||||
cached: 'false'
|
||||
modules: qtwebengine qtwebchannel qtpositioning qt5compat qtmultimedia qtimageformats
|
||||
setup-python: 'false'
|
||||
py7zrversion: '==0.18.1'
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Set outputs
|
||||
id: githash
|
||||
run: |
|
||||
echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
|
||||
|
||||
- name: build macos
|
||||
run: |
|
||||
brew install pcre2 harfbuzz freetype
|
||||
brew install cmake ninja python
|
||||
brew install automake
|
||||
brew install autoconf
|
||||
brew install libtool
|
||||
brew install opencc
|
||||
brew install ffmpeg
|
||||
brew install libao
|
||||
brew install libiconv
|
||||
brew install lzo bzip2
|
||||
brew install libogg
|
||||
brew install zstd lzip
|
||||
brew install libtiff
|
||||
brew install libvorbis
|
||||
brew install hunspell
|
||||
wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2
|
||||
tar xvjf eb-4.4.3.tar.bz2
|
||||
cd eb-4.4.3 && ./configure && make -j 8 && sudo make install && cd ..
|
||||
#brew install qt # or use official offline installer
|
||||
brew install xz lzo
|
||||
brew install pkg-config
|
||||
brew install create-dmg
|
||||
- name: compile
|
||||
run: |
|
||||
qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=no_extra_tiff_handler #CONFIG+=no_epwing_support # CONFIG+=no_ffmpeg_player #CONFIG+=no_qtmultimedia_player
|
||||
make -j8
|
||||
# libao was specificly build https://github.com/goldendict/goldendict/pull/377
|
||||
cp -fR maclibs/lib/libao* GoldenDict.app/Contents/Frameworks/
|
||||
|
||||
# # 打包
|
||||
# - name: package
|
||||
# run: |
|
||||
# macdeployqt ${targetName}.app -qmldir=. -verbose=1 -dmg
|
||||
# 打包
|
||||
- name: package
|
||||
run: |
|
||||
macdeployqt ${targetName}.app -qmldir=. -verbose=1
|
||||
codesign --force --deep -s - GoldenDict.app
|
||||
otool -L GoldenDict.app/Contents/MacOS/GoldenDict
|
||||
# otool -L GoldenDict.app/Contents/Frameworks/lib*
|
||||
mkdir tmp
|
||||
mv ${targetName}.app ./tmp
|
||||
# --background "installer_background.png"
|
||||
create-dmg --volname "${targetName} Installer" --volicon "icons/macicon.icns" --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon "${targetName}.app" 200 190 --hide-extension "${targetName}.app" --app-drop-link 600 185 --skip-jenkins "${targetName}.dmg" tmp/
|
||||
- name: Generate changelog
|
||||
if: ${{!env.prerelease}}
|
||||
id: changelog1
|
||||
uses: metcalfc/changelog-generator@v3.0.0
|
||||
with:
|
||||
myToken: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set outputs
|
||||
id: vars
|
||||
run: |
|
||||
echo "::set-output name=sha_short::$(git rev-parse --short=8 HEAD)"
|
||||
echo "::set-output name=release_date::$(date +'%Y%m%d')"
|
||||
echo "::set-output name=release_time::$(date +'%H%M%S')"
|
||||
echo "::set-output name=release_time_clock::$(date +'%H:%M:%S')"
|
||||
echo "::set-output name=release_hm::$(date +'%y%m%d')"
|
||||
|
||||
- name: changelog
|
||||
if: $${{env.prerelease}}
|
||||
id: changelog2
|
||||
run: |
|
||||
previousTag=$(git tag --sort=-creatordate | sed -n 2p)
|
||||
echo "previousTag : $previousTag"
|
||||
|
||||
CHANGELOG="$(git log --oneline --no-decorate $previousTag..HEAD)"
|
||||
CHANGELOG="${CHANGELOG//'%'/'%25'}"
|
||||
CHANGELOG="${CHANGELOG//$'\n'/'%0A'}"
|
||||
CHANGELOG="${CHANGELOG//$'\r'/'%0D'}"
|
||||
CHANGELOG="${CHANGELOG//'\"'/'%22'}"
|
||||
CHANGELOG="${CHANGELOG//"'"/ }"
|
||||
echo "::set-output name=COMMIT_SUMMARY::$(echo "$CHANGELOG")"
|
||||
# tag 上传Release
|
||||
- name: uploadRelease
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: ${{ env.targetName }}.dmg
|
||||
asset_name: ${{ matrix.qt_ver }}-${{ env.targetName }}_${{ matrix.os }}_homebrew_${{steps.vars.outputs.release_date}}.dmg
|
||||
tag: v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
overwrite: true
|
||||
release_name: GoldenDict-v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
prerelease: ${{env.prerelease}}
|
||||
body: |
|
||||
release on date: ${{steps.vars.outputs.release_date}} time: ${{steps.vars.outputs.release_time_clock}}
|
||||
branch: ${{ github.ref_name }}
|
||||
commit: ${{ steps.vars.outputs.sha_short }}
|
||||
Qt version: Qt5.15.2, Qt6.X
|
||||
Windows built with: msvc64, Visual studio 2019
|
||||
## goldendict.exe can not be used alone
|
||||
if you have a previous version. replace this maybe ok. if not ,download the whole bundle.
|
||||
|
||||
AppImage built with: Ubuntu-20.04 ,latest gcc
|
||||
macos built with: macos-10.15,macos-11.0,clang_64 x86_64
|
||||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
||||
${{ steps.changelog1.outputs.changelog }}
|
||||
${{ steps.changelog2.outputs.COMMIT_SUMMARY }}
|
161
.github/workflows/macos-m1.yml
vendored
Normal file
161
.github/workflows/macos-m1.yml
vendored
Normal file
|
@ -0,0 +1,161 @@
|
|||
name: macos-m1
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
on:
|
||||
# workflow_run:
|
||||
# workflows: [AutoTag]
|
||||
# types: [completed]
|
||||
workflow_dispatch:
|
||||
# push:
|
||||
# branches:
|
||||
# - dev
|
||||
# - master
|
||||
# # - staged
|
||||
# paths-ignore:
|
||||
# - 'docs/**'
|
||||
# - ".github/**"
|
||||
# - "howto/**"
|
||||
# - "*.md"
|
||||
# - ".clang-format"
|
||||
jobs:
|
||||
build:
|
||||
name: Build
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
os: [macos-12]
|
||||
qt_ver: [6.3.1]
|
||||
qt_arch: [clang_64]
|
||||
env:
|
||||
targetName: GoldenDict
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
steps:
|
||||
- name: prepare env
|
||||
run: |
|
||||
cd /opt
|
||||
mkdir homebrew
|
||||
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
|
||||
export PATH=$PATH:/opt/homebrew/bin
|
||||
- name: Install Qt
|
||||
uses: xiaoyifang/install-qt-action@v3
|
||||
with:
|
||||
version: ${{ matrix.qt_ver }}
|
||||
arch: ${{ matrix.qt_arch }}
|
||||
cached: 'false'
|
||||
modules: qtwebengine qtwebchannel qtpositioning qt5compat qtmultimedia
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 1
|
||||
- name: Set outputs
|
||||
id: githash
|
||||
run: |
|
||||
echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
|
||||
|
||||
- name: build macos
|
||||
run: |
|
||||
brew install pcre2 harfbuzz freetype
|
||||
brew install cmake ninja python
|
||||
brew install automake
|
||||
brew install autoconf
|
||||
brew install libtool
|
||||
brew install opencc
|
||||
brew install ffmpeg@5
|
||||
#brew reinstall $(brew deps ffmpeg) ffmpeg
|
||||
brew install libao
|
||||
brew install libiconv
|
||||
brew install lzo bzip2
|
||||
brew install libogg
|
||||
brew install zstd lzip
|
||||
brew install libtiff
|
||||
brew install libvorbis --force
|
||||
brew install hunspell
|
||||
wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2
|
||||
tar xvjf eb-4.4.3.tar.bz2
|
||||
cd eb-4.4.3 && ./configure && make -j 8 && sudo make install && cd ..
|
||||
#brew install qt # or use official offline installer
|
||||
brew install xz lzo
|
||||
brew install pkg-config
|
||||
brew install create-dmg
|
||||
- name: compile
|
||||
run: |
|
||||
qmake CONFIG+=release CONFIG+=no_macos_universal CONFIG+=zim_support CONFIG+=no_extra_tiff_handler #CONFIG+=no_epwing_support # CONFIG+=no_ffmpeg_player #CONFIG+=no_qtmultimedia_player
|
||||
make -j 8
|
||||
# # 打包
|
||||
# - name: package
|
||||
# run: |
|
||||
# macdeployqt ${targetName}.app -qmldir=. -verbose=1 -dmg
|
||||
# 打包
|
||||
- name: package
|
||||
run: |
|
||||
macdeployqt ${targetName}.app -qmldir=. -verbose=1
|
||||
codesign --force --deep -s - GoldenDict.app
|
||||
# otool -L GoldenDict.app/Contents/MacOS/GoldenDict
|
||||
# otool -L GoldenDict.app/Contents/Frameworks/lib*
|
||||
mkdir tmp
|
||||
mv ${targetName}.app ./tmp
|
||||
# --background "installer_background.png"
|
||||
create-dmg --volname "${targetName} Installer" --volicon "icons/macicon.icns" --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon "${targetName}.app" 200 190 --hide-extension "${targetName}.app" --app-drop-link 600 185 --skip-jenkins "${targetName}.dmg" tmp/
|
||||
- name: Generate changelog
|
||||
if: ${{!env.prerelease}}
|
||||
id: changelog1
|
||||
uses: metcalfc/changelog-generator@v3.0.0
|
||||
with:
|
||||
myToken: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Set outputs
|
||||
id: vars
|
||||
run: |
|
||||
echo "::set-output name=sha_short::$(git rev-parse --short=8 HEAD)"
|
||||
echo "::set-output name=release_date::$(date +'%Y%m%d')"
|
||||
echo "::set-output name=release_time::$(date +'%H%M%S')"
|
||||
echo "::set-output name=release_time_clock::$(date +'%H:%M:%S')"
|
||||
echo "::set-output name=release_hm::$(date +'%y%m%d')"
|
||||
|
||||
- name: changelog
|
||||
if: $${{env.prerelease}}
|
||||
id: changelog2
|
||||
run: |
|
||||
previousTag=$(git tag --sort=-creatordate | sed -n 2p)
|
||||
echo "previousTag : $previousTag"
|
||||
|
||||
CHANGELOG="$(git log --oneline --no-decorate $previousTag..HEAD)"
|
||||
CHANGELOG="${CHANGELOG//'%'/'%25'}"
|
||||
CHANGELOG="${CHANGELOG//$'\n'/'%0A'}"
|
||||
CHANGELOG="${CHANGELOG//$'\r'/'%0D'}"
|
||||
CHANGELOG="${CHANGELOG//'\"'/'%22'}"
|
||||
CHANGELOG="${CHANGELOG//"'"/ }"
|
||||
echo "::set-output name=COMMIT_SUMMARY::$(echo "$CHANGELOG")"
|
||||
# tag 上传Release
|
||||
- name: uploadRelease
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: ${{ env.targetName }}.dmg
|
||||
asset_name: ${{ matrix.qt_ver }}-${{ env.targetName }}_${{ matrix.os }}_homebrew_${{steps.vars.outputs.release_date}}.dmg
|
||||
tag: v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
overwrite: true
|
||||
release_name: GoldenDict-v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
prerelease: ${{env.prerelease}}
|
||||
body: |
|
||||
release on date: ${{steps.vars.outputs.release_date}} time: ${{steps.vars.outputs.release_time_clock}}
|
||||
branch: ${{ github.ref_name }}
|
||||
commit: ${{ steps.vars.outputs.sha_short }}
|
||||
Qt version: Qt5.15.2, Qt6.X
|
||||
Windows built with: msvc64, Visual studio 2019
|
||||
## goldendict.exe can not be used alone
|
||||
if you have a previous version. replace this maybe ok. if not ,download the whole bundle.
|
||||
|
||||
AppImage built with: Ubuntu-20.04 ,latest gcc
|
||||
macos built with: macos-10.15,macos-11.0,clang_64 x86_64
|
||||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
||||
${{ steps.changelog1.outputs.changelog }}
|
||||
${{ steps.changelog2.outputs.COMMIT_SUMMARY }}
|
7
.github/workflows/macos.yml
vendored
7
.github/workflows/macos.yml
vendored
|
@ -30,9 +30,9 @@ jobs:
|
|||
qt_arch: [clang_64]
|
||||
env:
|
||||
targetName: GoldenDict
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
|
||||
steps:
|
||||
# macos 11.0 默认环境变了,要指定
|
||||
|
@ -130,6 +130,7 @@ jobs:
|
|||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
||||
|
|
7
.github/workflows/ubuntu-6.2.yml
vendored
7
.github/workflows/ubuntu-6.2.yml
vendored
|
@ -30,9 +30,9 @@ jobs:
|
|||
qt_ver: [6.3.1]
|
||||
qt_arch: [gcc_64]
|
||||
env:
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
steps:
|
||||
- name: Install Qt
|
||||
uses: xiaoyifang/install-qt-action@v3
|
||||
|
@ -133,6 +133,7 @@ jobs:
|
|||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
||||
|
|
5
.github/workflows/ubuntu-PR-check.yml
vendored
5
.github/workflows/ubuntu-PR-check.yml
vendored
|
@ -25,10 +25,7 @@ jobs:
|
|||
os: [ubuntu-20.04]
|
||||
qt_ver: [5.15.2,6.2.4]
|
||||
qt_arch: [gcc_64]
|
||||
env:
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-python@v3
|
||||
with:
|
||||
|
|
7
.github/workflows/ubuntu.yml
vendored
7
.github/workflows/ubuntu.yml
vendored
|
@ -30,9 +30,9 @@ jobs:
|
|||
qt_ver: [5.15.2]
|
||||
qt_arch: [gcc_64]
|
||||
env:
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
steps:
|
||||
- name: Install Qt
|
||||
uses: xiaoyifang/install-qt-action@v3
|
||||
|
@ -133,6 +133,7 @@ jobs:
|
|||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
name: Windows-6.2
|
||||
name: Windows-6.x
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
@ -31,9 +31,9 @@ jobs:
|
|||
qt_arch: [win64_msvc2019_64]
|
||||
env:
|
||||
targetName: GoldenDict.exe
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
steps:
|
||||
- uses: actions/setup-python@v3
|
||||
with:
|
||||
|
@ -92,7 +92,6 @@ jobs:
|
|||
id: build
|
||||
shell: cmd
|
||||
run: |
|
||||
# call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }}
|
||||
qmake "CONFIG+=zim_support" CONFIG+=release
|
||||
nmake
|
||||
|
||||
|
@ -140,6 +139,7 @@ jobs:
|
|||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
||||
|
@ -177,7 +177,7 @@ jobs:
|
|||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: ${{ steps.package.outputs.packageName }}/GoldenDict-v22-Install.exe
|
||||
asset_name: ${{ matrix.qt_ver }}-GoldenDict-v22-Install.exe
|
||||
asset_name: ${{ matrix.qt_ver }}-GoldenDict-v${{env.version}}-${{env.version-suffix}}-Installer.exe
|
||||
tag: v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
overwrite: true
|
||||
release_name: GoldenDict-v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
13
.github/workflows/windows-PR-check.yml
vendored
13
.github/workflows/windows-PR-check.yml
vendored
|
@ -26,12 +26,6 @@ jobs:
|
|||
os: [windows-2019]
|
||||
qt_ver: [5.15.2,6.2.4]
|
||||
qt_arch: [win64_msvc2019_64]
|
||||
|
||||
env:
|
||||
targetName: GoldenDict.exe
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
steps:
|
||||
- uses: actions/setup-python@v3
|
||||
with:
|
||||
|
@ -66,12 +60,5 @@ jobs:
|
|||
id: build
|
||||
shell: cmd
|
||||
run: |
|
||||
# call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat" ${{ matrix.msvc_arch }}
|
||||
qmake "CONFIG+=zim_support" CONFIG+=release
|
||||
nmake
|
||||
|
||||
echo winSdkDir=%WindowsSdkDir% >> %GITHUB_ENV%
|
||||
echo winSdkVer=%WindowsSdkVersion% >> %GITHUB_ENV%
|
||||
echo vcToolsInstallDir=%VCToolsInstallDir% >> %GITHUB_ENV%
|
||||
echo vcToolsRedistDir=%VCToolsRedistDir% >> %GITHUB_ENV%
|
||||
echo QTDIR=%Qt6_DIR% >> %GITHUB_ENV%
|
||||
|
|
9
.github/workflows/windows.yml
vendored
9
.github/workflows/windows.yml
vendored
|
@ -32,9 +32,9 @@ jobs:
|
|||
qt_arch: [win64_msvc2019_64]
|
||||
env:
|
||||
targetName: GoldenDict.exe
|
||||
version: 22.8.23
|
||||
version-suffix: EndOfHeat
|
||||
prerelease: false
|
||||
version: 22.8.24
|
||||
version-suffix: alpha
|
||||
prerelease: true
|
||||
# 步骤
|
||||
steps:
|
||||
# 安装Qt
|
||||
|
@ -138,6 +138,7 @@ jobs:
|
|||
Qt6.X(Universal Build)
|
||||
Qt5.15.2(Intel Kind)
|
||||
auto built by github action. use on your on risk:-)
|
||||
**recommend version**:Qt6.X (with the latest bug fixes and performance enhancements)
|
||||
|
||||
Filename pattern: **[Qt version]-GoldenDict-[OS]-[release-date].[ext]**
|
||||
CHANGES:
|
||||
|
@ -177,7 +178,7 @@ jobs:
|
|||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: ${{ steps.package.outputs.packageName }}/GoldenDict-v22-Install.exe
|
||||
asset_name: ${{ matrix.qt_ver }}-GoldenDict-v22-Install.exe
|
||||
asset_name: ${{ matrix.qt_ver }}-GoldenDict-v${{env.version}}-${{env.version-suffix}}-Installer.exe
|
||||
tag: v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
overwrite: true
|
||||
release_name: GoldenDict-v${{env.version}}-${{env.version-suffix}}.${{ steps.vars.outputs.release_hm }}.${{ steps.vars.outputs.sha_short }}
|
||||
|
|
14
CHANGES.md
14
CHANGES.md
|
@ -1,6 +1,18 @@
|
|||
# Changes
|
||||
|
||||
## Until to now
|
||||
## Until Now
|
||||
|
||||
- change the original default style to classic style
|
||||
- add clipboard tracking menu in trayicon
|
||||
- concurrent fulltext index creation
|
||||
- add CJK fulltext search ability
|
||||
- many minor fixes .
|
||||
- add mdx source+srcset support
|
||||
- qt6.x help file can not open
|
||||
- many minor optimizations.
|
||||
- iframe website almost full support.(except some websites)
|
||||
|
||||
## Until 2022-8-31
|
||||
|
||||
- **CLEANING OLD/USELESS CODE**
|
||||
- remove Runnable Class in dsl, zim , epwing etc files.
|
||||
|
|
|
@ -32,3 +32,4 @@ Nasrollah Noori <nanopqr@gmail.com>: Persian translation
|
|||
Vladimir Gerovski: Macedonian Translation
|
||||
Nikolay Korotkiy <sikmir\gmail.com>: Finnish translation
|
||||
Robin Townsend: Lojban translation
|
||||
Patrik Studer: Swiss High-German translation (de-ch)
|
||||
|
|
|
@ -30,10 +30,13 @@ This code has been run and tested on Windows 10/11, Ubuntu Linux, Mac OS X.
|
|||
|
||||
### Fedora 35
|
||||
```
|
||||
sudo dnf install git pkg-config \
|
||||
sudo dnf install git pkg-config libzstd-devel opencc-devel xz-devel xz-lzma-compat\
|
||||
libvorbis-devel zlib-devel hunspell-devel lzo-devel bzip2-devel \
|
||||
libao-devel ffmpeg-devel libtiff-devel eb-devel qt5-qtx11extras-devel libXtst-devel \
|
||||
libxkbcommon-devel
|
||||
libxkbcommon-devel qt5-qtbase qt5-qttools qt5-qtsvg-devl qt5-qtwebengine-devel qt5-qtmultimedia-devl
|
||||
|
||||
qmake-qt5 CONFIG+=release CONFIG+=no_extra_tiff_handler CONFIG+=no_epwing_support
|
||||
make
|
||||
|
||||
|
||||
```
|
||||
|
|
|
@ -10,7 +10,6 @@ body
|
|||
margin-left: 2px;
|
||||
margin-bottom: 3px;
|
||||
background: white;
|
||||
font-family: Tahoma, Verdana, "Lucida Sans Unicode", "Segoe UI", "Palatino Linotype", "Arial Unicode MS", sans-serif;
|
||||
}
|
||||
|
||||
a
|
||||
|
|
|
@ -6,8 +6,7 @@ html {
|
|||
|
||||
body
|
||||
{
|
||||
font-family: Tahoma, Verdana, "Lucida Sans Unicode", sans-serif;
|
||||
height: 100%;
|
||||
font-family: system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Open Sans","Helvetica Neue",sans-serif;
|
||||
}
|
||||
|
||||
/* This stylesheet is used to highligh current selection when doing a search.
|
||||
|
|
|
@ -28,22 +28,11 @@ void ArticleInspector::setInspectPage( QWebEnginePage * page )
|
|||
}
|
||||
|
||||
qDebug() << page->lifecycleState();
|
||||
#if( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) )
|
||||
#if( QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) || QT_VERSION > QT_VERSION_CHECK(6,3,0) )
|
||||
page->triggerAction( QWebEnginePage::InspectElement );
|
||||
#else
|
||||
// without this line, application will crash on qt6.2 ,see https://bugreports.qt.io/browse/QTBUG-101724
|
||||
// and seems to hangup forever on qt6.3.0 ,so the best solution for now is to comment out the following lines.
|
||||
static bool first{ true };
|
||||
if( first )
|
||||
{
|
||||
qDebug()<<"inspector,phase first time";
|
||||
first = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
qDebug()<<"inspector,phase not first time";
|
||||
page->triggerAction( QWebEnginePage::InspectElement );
|
||||
}
|
||||
#endif
|
||||
|
||||
raise();
|
||||
|
|
|
@ -54,12 +54,15 @@ std::string ArticleMaker::makeHtmlHeader( QString const & word,
|
|||
// add jquery
|
||||
{
|
||||
result += "<script type=\"text/javascript\" "
|
||||
"src=\"qrc:///resources/jquery-3.6.0.slim.min.js\"></script>";
|
||||
"src=\"qrc:///scripts/jquery-3.6.0.slim.min.js\"></script>";
|
||||
|
||||
result += "<script> var $_$=$.noConflict(); </script>";
|
||||
|
||||
//custom javascript
|
||||
result += "<script type=\"text/javascript\" src=\"qrc:///resources/gd-custom.js\"></script>";
|
||||
result += "<script type=\"text/javascript\" src=\"qrc:///scripts/gd-custom.js\"></script>";
|
||||
|
||||
//iframe resizer javascript
|
||||
result += "<script type=\"text/javascript\" src=\"qrc:///scripts/iframeResizer.min.js\"></script>";
|
||||
}
|
||||
|
||||
// add qwebchannel
|
||||
|
@ -144,7 +147,7 @@ std::string ArticleMaker::makeHtmlHeader( QString const & word,
|
|||
"return tr_map[key] || '';"
|
||||
"}"
|
||||
"</script>";
|
||||
result+= "<script type=\"text/javascript\" src=\"qrc:///resources/gd-builtin.js\"></script>";
|
||||
result+= "<script type=\"text/javascript\" src=\"qrc:///scripts/gd-builtin.js\"></script>";
|
||||
result += "</head><body>";
|
||||
|
||||
return result;
|
||||
|
|
|
@ -1950,7 +1950,8 @@ void ArticleView::contextMenuRequested( QPoint const & pos )
|
|||
}
|
||||
|
||||
menu.addSeparator();
|
||||
menu.addAction( &inspectAction );
|
||||
if(!popupView||cfg.pinPopupWindow)
|
||||
menu.addAction( &inspectAction );
|
||||
|
||||
if ( !menu.isEmpty() )
|
||||
{
|
||||
|
|
|
@ -47,10 +47,10 @@ QRegularExpression Mdx::stylesRe2( "([\\s\"']href\\s*=)\\s*(?![\\s\"']|\\b(?:(?:
|
|||
QRegularExpression Mdx::inlineScriptRe( "<\\s*script(?:(?=\\s)(?:(?![\\s\"']src\\s*=)[^>])+|\\s*)>",
|
||||
QRegularExpression::CaseInsensitiveOption );
|
||||
QRegularExpression Mdx::closeScriptTagRe( "<\\s*/script\\s*>", QRegularExpression::CaseInsensitiveOption );
|
||||
QRegularExpression Mdx::srcRe( "([\\s\"']src\\s*=)\\s*([\"'])(?!\\s*\\b(?:(?:bres|https?|ftp)://"
|
||||
QRegularExpression Mdx::srcRe( "([\\s\"'](?:src|srcset)\\s*=)\\s*([\"'])(?!\\s*\\b(?:(?:bres|https?|ftp)://"
|
||||
"|(?:data|javascript):))(?:file://)?[\\x00-\\x1f\\x7f]*\\.*/?([^\">]+)\\2",
|
||||
QRegularExpression::CaseInsensitiveOption );
|
||||
QRegularExpression Mdx::srcRe2( "([\\s\"']src\\s*=)\\s*(?![\\s\"']|\\b(?:(?:bres|https?|ftp)://"
|
||||
QRegularExpression Mdx::srcRe2( "([\\s\"'](?:src|srcset)\\s*=)\\s*(?![\\s\"']|\\b(?:(?:bres|https?|ftp)://"
|
||||
"|(?:data|javascript):))(?:file://)?[\\x00-\\x1f\\x7f]*\\.*/?([^\\s\">]+)",
|
||||
QRegularExpression::CaseInsensitiveOption );
|
||||
|
||||
|
|
13
config.cc
13
config.cc
|
@ -2264,17 +2264,12 @@ QString getProgramDataDir() noexcept
|
|||
#endif
|
||||
}
|
||||
|
||||
QString getEmbedLocDir() noexcept
|
||||
{
|
||||
return ":/locale";
|
||||
}
|
||||
|
||||
QString getLocDir() noexcept
|
||||
{
|
||||
if ( QDir( getProgramDataDir() ).cd( "locale" ) )
|
||||
return getProgramDataDir() + "/locale";
|
||||
else
|
||||
return QCoreApplication::applicationDirPath() + "/locale";
|
||||
if ( QDir( getProgramDataDir() ).cd( "locale" ) )
|
||||
return getProgramDataDir() + "/locale";
|
||||
else
|
||||
return QCoreApplication::applicationDirPath() + "/locale";
|
||||
}
|
||||
|
||||
QString getHelpDir() noexcept
|
||||
|
|
|
@ -811,7 +811,6 @@ QString getUserQtCssFileName() ;
|
|||
QString getProgramDataDir() noexcept;
|
||||
|
||||
/// Returns the directory storing program localizized files (.qm).
|
||||
QString getEmbedLocDir() noexcept;
|
||||
QString getLocDir() noexcept;
|
||||
|
||||
/// Returns the directory storing program help files (.qch).
|
||||
|
|
|
@ -273,11 +273,11 @@ bool Class::loadIconFromFile( QString const & _filename, bool isFullName )
|
|||
return false;
|
||||
}
|
||||
|
||||
bool Class::loadIconFromText( QString const & text )
|
||||
bool Class::loadIconFromText( QString iconUrl, QString const & text )
|
||||
{
|
||||
if( text.isEmpty() )
|
||||
return false;
|
||||
QImage img( ":/icons/mdict-bg.png" );
|
||||
QImage img( iconUrl );
|
||||
|
||||
if ( !img.isNull() )
|
||||
{
|
||||
|
@ -293,7 +293,7 @@ bool Class::loadIconFromText( QString const & text )
|
|||
painter.drawImage( QPoint( img.width() == max ? 0 : ( max - img.width() ) / 2,
|
||||
img.height() == max ? 0 : ( max - img.height() ) / 2 ),
|
||||
img );
|
||||
painter.setCompositionMode(QPainter::CompositionMode_DestinationOut);
|
||||
painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);
|
||||
|
||||
QFont font = painter.font();
|
||||
//the text should be a little smaller than the icon
|
||||
|
|
|
@ -56,7 +56,9 @@ class Request: public QObject
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
Request( QObject * parent = nullptr ) : QObject( parent )
|
||||
{
|
||||
}
|
||||
/// Returns whether the request has been processed in full and finished.
|
||||
/// This means that the data accumulated is final and won't change anymore.
|
||||
bool isFinished();
|
||||
|
@ -177,7 +179,6 @@ class DataRequest: public Request
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
|
||||
/// Returns the number of bytes read, with a -1 meaning that so far it's
|
||||
/// uncertain whether resource even exists or not, and any non-negative value
|
||||
/// meaning that that amount of bytes is not available.
|
||||
|
@ -194,7 +195,9 @@ public:
|
|||
/// done, this can only be called after the request has finished.
|
||||
vector< char > & getFullData() ;
|
||||
|
||||
DataRequest(): hasAnyData( false ) {}
|
||||
DataRequest( QObject * parent = 0 ) : Request( parent ), hasAnyData( false )
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
|
@ -276,7 +279,7 @@ protected:
|
|||
// Load icon from filename directly if isFullName == true
|
||||
// else treat filename as name without extension
|
||||
bool loadIconFromFile( QString const & filename, bool isFullName = false );
|
||||
bool loadIconFromText( QString const & text );
|
||||
bool loadIconFromText( QString iconUrl, QString const & text );
|
||||
|
||||
QString getAbbrName( QString const & text );
|
||||
|
||||
|
|
4
dsl.cc
4
dsl.cc
|
@ -1100,7 +1100,9 @@ string DslDictionary::nodeToHtml( ArticleDom::Node const & node )
|
|||
|
||||
url.setScheme( "gdlookup" );
|
||||
url.setHost( "localhost" );
|
||||
url.setPath( Utils::Url::ensureLeadingSlash( gd::toQString( node.renderAsText() ) ) );
|
||||
wstring nodeStr = node.renderAsText();
|
||||
normalizeHeadword( nodeStr );
|
||||
url.setPath( Utils::Url::ensureLeadingSlash( gd::toQString( nodeStr ) ) );
|
||||
if( !node.tagAttrs.empty() )
|
||||
{
|
||||
QString attr = gd::toQString( node.tagAttrs ).remove( '\"' );
|
||||
|
|
119
epwing.cc
119
epwing.cc
|
@ -429,28 +429,6 @@ void EpwingDictionary::getArticleText( uint32_t articleAddress, QString & headwo
|
|||
|
||||
/// EpwingDictionary::getArticle()
|
||||
|
||||
class EpwingArticleRequest;
|
||||
|
||||
class EpwingArticleRequestRunnable: public QRunnable
|
||||
{
|
||||
EpwingArticleRequest & r;
|
||||
QSemaphore & hasExited;
|
||||
|
||||
public:
|
||||
|
||||
EpwingArticleRequestRunnable( EpwingArticleRequest & r_,
|
||||
QSemaphore & hasExited_ ): r( r_ ),
|
||||
hasExited( hasExited_ )
|
||||
{}
|
||||
|
||||
~EpwingArticleRequestRunnable()
|
||||
{
|
||||
hasExited.release();
|
||||
}
|
||||
|
||||
virtual void run();
|
||||
};
|
||||
|
||||
class EpwingArticleRequest: public Dictionary::DataRequest
|
||||
{
|
||||
friend class EpwingArticleRequestRunnable;
|
||||
|
@ -476,7 +454,11 @@ public:
|
|||
// new EpwingArticleRequestRunnable( *this, hasExited ) );
|
||||
}
|
||||
|
||||
void run(); // Run from another thread by EpwingArticleRequestRunnable
|
||||
void run();
|
||||
|
||||
void getBuiltInArticle(wstring const & word_, QVector< int > & pages,
|
||||
QVector< int > & offsets,
|
||||
multimap< wstring, pair< string, string > > & mainArticles );
|
||||
|
||||
virtual void cancel()
|
||||
{
|
||||
|
@ -491,11 +473,6 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
void EpwingArticleRequestRunnable::run()
|
||||
{
|
||||
r.run();
|
||||
}
|
||||
|
||||
void EpwingArticleRequest::run()
|
||||
{
|
||||
if ( Utils::AtomicInt::loadAcquire( isCancelled ) )
|
||||
|
@ -509,7 +486,6 @@ void EpwingArticleRequest::run()
|
|||
for( unsigned x = 0; x < alts.size(); ++x )
|
||||
{
|
||||
/// Make an additional query for each alt
|
||||
|
||||
vector< WordArticleLink > altChain = dict.findArticles( alts[ x ], ignoreDiacritics );
|
||||
|
||||
chain.insert( chain.end(), altChain.begin(), altChain.end() );
|
||||
|
@ -577,44 +553,10 @@ void EpwingArticleRequest::run()
|
|||
}
|
||||
|
||||
// Also try to find word in the built-in dictionary index
|
||||
try
|
||||
{
|
||||
string headword, articleText;
|
||||
|
||||
QVector< int > pg, off;
|
||||
{
|
||||
Mutex::Lock _( dict.eBook.getLibMutex() );
|
||||
dict.eBook.getArticlePos( gd::toQString( word ), pg, off );
|
||||
}
|
||||
|
||||
for( int i = 0; i < pg.size(); i++ )
|
||||
{
|
||||
bool already = false;
|
||||
for( int n = 0; n < pages.size(); n++ )
|
||||
{
|
||||
if( pages.at( n ) == pg.at( i )
|
||||
&& abs( offsets.at( n ) - off.at( i ) ) <= 4 )
|
||||
{
|
||||
already = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( !already )
|
||||
{
|
||||
dict.loadArticle( pg.at( i ), off.at( i ), headword, articleText );
|
||||
|
||||
mainArticles.insert( pair< wstring, pair< string, string > >(
|
||||
Folding::applySimpleCaseOnly( Utf8::decode( headword ) ),
|
||||
pair< string, string >( headword, articleText ) ) );
|
||||
|
||||
pages.append( pg.at( i ) );
|
||||
offsets.append( off.at( i ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(...)
|
||||
getBuiltInArticle(word, pages, offsets, mainArticles );
|
||||
for( unsigned x = 0; x < alts.size(); ++x )
|
||||
{
|
||||
getBuiltInArticle( alts[ x ], pages, offsets, alternateArticles );
|
||||
}
|
||||
|
||||
if ( mainArticles.empty() && alternateArticles.empty() )
|
||||
|
@ -657,6 +599,51 @@ void EpwingArticleRequest::run()
|
|||
finish();
|
||||
}
|
||||
|
||||
void EpwingArticleRequest::getBuiltInArticle( wstring const & word_,
|
||||
QVector< int > & pages,
|
||||
QVector< int > & offsets,
|
||||
multimap< wstring, pair< string, string > > & mainArticles )
|
||||
{
|
||||
try
|
||||
{
|
||||
string headword, articleText;
|
||||
|
||||
QVector< int > pg, off;
|
||||
{
|
||||
Mutex::Lock _( dict.eBook.getLibMutex() );
|
||||
dict.eBook.getArticlePos( gd::toQString( word_ ), pg, off );
|
||||
}
|
||||
|
||||
for( int i = 0; i < pg.size(); i++ )
|
||||
{
|
||||
bool already = false;
|
||||
for( int n = 0; n < pages.size(); n++ )
|
||||
{
|
||||
if( pages.at( n ) == pg.at( i ) && abs( offsets.at( n ) - off.at( i ) ) <= 4 )
|
||||
{
|
||||
already = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( !already )
|
||||
{
|
||||
dict.loadArticle( pg.at( i ), off.at( i ), headword, articleText );
|
||||
|
||||
mainArticles.insert(
|
||||
pair< wstring, pair< string, string > >( Folding::applySimpleCaseOnly( Utf8::decode( headword ) ),
|
||||
pair< string, string >( headword, articleText ) ) );
|
||||
|
||||
pages.append( pg.at( i ) );
|
||||
offsets.append( off.at( i ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
catch( ... )
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
sptr< Dictionary::DataRequest > EpwingDictionary::getArticle( wstring const & word,
|
||||
vector< wstring > const & alts,
|
||||
wstring const &,
|
||||
|
|
|
@ -126,6 +126,72 @@ QString FtsIndexing::nowIndexingName()
|
|||
return nowIndexing;
|
||||
}
|
||||
|
||||
void addSortedHeadwords( QList< FtsHeadword > & base_list, QList< FtsHeadword > const & add_list)
|
||||
{
|
||||
QList< FtsHeadword > list;
|
||||
|
||||
if( add_list.isEmpty() )
|
||||
return;
|
||||
|
||||
if( base_list.isEmpty() )
|
||||
{
|
||||
base_list = add_list;
|
||||
return;
|
||||
}
|
||||
|
||||
list.reserve( base_list.size() + add_list.size() );
|
||||
|
||||
QList< FtsHeadword >::iterator base_it = base_list.begin();
|
||||
QList< FtsHeadword >::const_iterator add_it = add_list.constBegin();
|
||||
|
||||
while( base_it != base_list.end() || add_it != add_list.end() )
|
||||
{
|
||||
if( base_it == base_list.end() )
|
||||
{
|
||||
while( add_it != add_list.end() )
|
||||
{
|
||||
list.append( *add_it );
|
||||
++add_it;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if( add_it == add_list.end() )
|
||||
{
|
||||
while( base_it != base_list.end() )
|
||||
{
|
||||
list.append( *base_it );
|
||||
++base_it;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if( *add_it < *base_it )
|
||||
{
|
||||
list.append( *add_it );
|
||||
++add_it;
|
||||
}
|
||||
else if( *add_it == *base_it )
|
||||
{
|
||||
base_it->dictIDs.append( add_it->dictIDs );
|
||||
for( QStringList::const_iterator itr = add_it->foundHiliteRegExps.constBegin();
|
||||
itr != add_it->foundHiliteRegExps.constEnd(); ++itr )
|
||||
{
|
||||
if( !base_it->foundHiliteRegExps.contains( *itr ) )
|
||||
base_it->foundHiliteRegExps.append( *itr );
|
||||
}
|
||||
++add_it;
|
||||
}
|
||||
else
|
||||
{
|
||||
list.append( *base_it );
|
||||
++base_it;
|
||||
}
|
||||
}
|
||||
|
||||
base_list.swap( list );
|
||||
}
|
||||
|
||||
FullTextSearchDialog::FullTextSearchDialog( QWidget * parent,
|
||||
Config::Class & cfg_,
|
||||
std::vector< sptr< Dictionary::Class > > const & dictionaries_,
|
||||
|
@ -405,6 +471,7 @@ void FullTextSearchDialog::accept()
|
|||
|
||||
void FullTextSearchDialog::searchReqFinished()
|
||||
{
|
||||
QList< FtsHeadword > allHeadwords;
|
||||
while ( searchReqs.size() )
|
||||
{
|
||||
std::list< sptr< Dictionary::DataRequest > >::iterator it;
|
||||
|
@ -421,13 +488,14 @@ void FullTextSearchDialog::searchReqFinished()
|
|||
QList< FtsHeadword > * headwords;
|
||||
if( (unsigned)(*it)->dataSize() >= sizeof( headwords ) )
|
||||
{
|
||||
QList< FtsHeadword > hws;
|
||||
try
|
||||
{
|
||||
(*it)->getDataSlice( 0, sizeof( headwords ), &headwords );
|
||||
model->addResults( QModelIndex(), *headwords );
|
||||
hws.swap( *headwords );
|
||||
std::sort( hws.begin(), hws.end() );
|
||||
delete headwords;
|
||||
ui.articlesFoundLabel->setText( tr( "Articles found: " )
|
||||
+ QString::number( results.size() ) );
|
||||
addSortedHeadwords( allHeadwords, hws );
|
||||
}
|
||||
catch( std::exception & e )
|
||||
{
|
||||
|
@ -449,6 +517,14 @@ void FullTextSearchDialog::searchReqFinished()
|
|||
else
|
||||
break;
|
||||
}
|
||||
|
||||
if( !allHeadwords.isEmpty() )
|
||||
{
|
||||
model->addResults( QModelIndex(), allHeadwords );
|
||||
ui.articlesFoundLabel->setText( tr( "Articles found: " )
|
||||
+ QString::number( results.size() ) );
|
||||
}
|
||||
|
||||
if ( searchReqs.empty() )
|
||||
{
|
||||
ui.searchProgressBar->hide();
|
||||
|
@ -608,27 +684,7 @@ void HeadwordsListModel::addResults(const QModelIndex & parent, QList< FtsHeadwo
|
|||
Q_UNUSED( parent );
|
||||
beginResetModel();
|
||||
|
||||
QList< FtsHeadword > temp;
|
||||
|
||||
for( int x = 0; x < hws.length(); x++ )
|
||||
{
|
||||
QList< FtsHeadword >::iterator it = std::lower_bound( headwords.begin(), headwords.end(), hws.at( x ) );
|
||||
if( it != headwords.end() && *it == hws.at( x ) )
|
||||
{
|
||||
it->dictIDs.push_back( hws.at( x ).dictIDs.front() );
|
||||
for( QStringList::const_iterator itr = it->foundHiliteRegExps.constBegin();
|
||||
itr != it->foundHiliteRegExps.constEnd(); ++itr )
|
||||
{
|
||||
if( !it->foundHiliteRegExps.contains( *itr ) )
|
||||
it->foundHiliteRegExps.append( *itr );
|
||||
}
|
||||
}
|
||||
else
|
||||
temp.append( hws.at( x ) );
|
||||
}
|
||||
|
||||
headwords.append( temp );
|
||||
std::sort( headwords.begin(), headwords.end() );
|
||||
addSortedHeadwords( headwords, hws );
|
||||
|
||||
endResetModel();
|
||||
emit contentChanged();
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
TEMPLATE = app
|
||||
TARGET = goldendict
|
||||
VERSION = 22.8.23-EndOfHeat
|
||||
VERSION = 22.8.24-alpha
|
||||
|
||||
# Generate version file. We do this here and in a build rule described later.
|
||||
# The build rule is required since qmake isn't run each time the project is
|
||||
|
@ -69,19 +69,18 @@ CONFIG += exceptions \
|
|||
stl \
|
||||
c++17 \
|
||||
lrelease \
|
||||
embed_translations \
|
||||
utf8_source \
|
||||
force_debug_info
|
||||
|
||||
mac {
|
||||
DEBUG:CONFIG += app_bundle
|
||||
CONFIG += app_bundle
|
||||
}
|
||||
|
||||
QM_FILES_RESOURCE_PREFIX = /locale/
|
||||
QM_FILES_INSTALL_PATH = /locale/
|
||||
OBJECTS_DIR = build
|
||||
UI_DIR = build
|
||||
MOC_DIR = build
|
||||
#RCC_DIR = build
|
||||
RCC_DIR = build
|
||||
LIBS += -lz \
|
||||
-lbz2 \
|
||||
-llzo2
|
||||
|
@ -90,7 +89,8 @@ win32 {
|
|||
TARGET = GoldenDict
|
||||
|
||||
win32-msvc* {
|
||||
VERSION = 22.8.23 # VS does not recognize 22.number.alpha,cause errors during compilation under MSVC++
|
||||
# VS does not recognize 22.number.alpha,cause errors during compilation under MSVC++
|
||||
VERSION = 22.8.24
|
||||
DEFINES += __WIN32 _CRT_SECURE_NO_WARNINGS
|
||||
contains(QMAKE_TARGET.arch, x86_64) {
|
||||
DEFINES += NOMINMAX __WIN64
|
||||
|
@ -138,7 +138,9 @@ win32 {
|
|||
CONFIG += chinese_conversion_support
|
||||
}
|
||||
}
|
||||
|
||||
!CONFIG( no_macos_universal ) {
|
||||
DEFINES += INCLUDE_LIBRARY_PATH
|
||||
}
|
||||
unix:!mac {
|
||||
DEFINES += HAVE_X11
|
||||
|
||||
|
@ -202,8 +204,8 @@ mac {
|
|||
-lvorbisfile \
|
||||
-lvorbis \
|
||||
-logg \
|
||||
-lhunspell \
|
||||
-llzo2
|
||||
|
||||
!CONFIG( no_ffmpeg_player ) {
|
||||
LIBS += -lao \
|
||||
-lswresample \
|
||||
|
@ -213,19 +215,38 @@ mac {
|
|||
}
|
||||
QT_CONFIG -= no-pkg-config
|
||||
CONFIG += link_pkgconfig
|
||||
|
||||
|
||||
!CONFIG( no_macos_universal ) {
|
||||
LIBS+= -lhunspell
|
||||
INCLUDEPATH = $${PWD}/maclibs/include
|
||||
LIBS += -L$${PWD}/maclibs/lib -framework AppKit -framework Carbon
|
||||
}
|
||||
else{
|
||||
PKGCONFIG += hunspell
|
||||
INCLUDEPATH = /opt/homebrew/include /usr/local/include
|
||||
LIBS += -L/opt/homebrew/lib -L/usr/local/lib -framework AppKit -framework Carbon
|
||||
}
|
||||
|
||||
OBJECTIVE_SOURCES += lionsupport.mm \
|
||||
machotkeywrapper.mm \
|
||||
macmouseover.mm \
|
||||
speechclient_mac.mm
|
||||
ICON = icons/macicon.icns
|
||||
QMAKE_INFO_PLIST = myInfo.plist
|
||||
|
||||
!CONFIG( no_macos_universal ) {
|
||||
QMAKE_POST_LINK = mkdir -p GoldenDict.app/Contents/Frameworks && \
|
||||
cp -nR $${PWD}/maclibs/lib/ GoldenDict.app/Contents/Frameworks/ && \
|
||||
mkdir -p GoldenDict.app/Contents/MacOS/help && \
|
||||
cp -R $${PWD}/help/*.qch GoldenDict.app/Contents/MacOS/help/
|
||||
|
||||
}
|
||||
else{
|
||||
QMAKE_POST_LINK = mkdir -p GoldenDict.app/Contents/Frameworks && \
|
||||
cp -nR $${PWD}/maclibs/lib/libeb.dylib GoldenDict.app/Contents/Frameworks/ && \
|
||||
mkdir -p GoldenDict.app/Contents/MacOS/help && \
|
||||
cp -R $${PWD}/help/*.qch GoldenDict.app/Contents/MacOS/help/
|
||||
}
|
||||
!CONFIG( no_chinese_conversion_support ) {
|
||||
CONFIG += chinese_conversion_support
|
||||
QMAKE_POST_LINK += && mkdir -p GoldenDict.app/Contents/MacOS/opencc && \
|
||||
|
@ -563,12 +584,14 @@ CONFIG( chinese_conversion_support ) {
|
|||
}
|
||||
|
||||
RESOURCES += resources.qrc \
|
||||
scripts.qrc \
|
||||
flags.qrc
|
||||
#EXTRA_TRANSLATIONS += thirdparty/qwebengine_ts/qtwebengine_zh_CN.ts
|
||||
TRANSLATIONS += locale/ru_RU.ts \
|
||||
locale/zh_CN.ts \
|
||||
locale/cs_CZ.ts \
|
||||
locale/de_DE.ts \
|
||||
locale/de_CH.ts \
|
||||
locale/el_GR.ts \
|
||||
locale/bg_BG.ts \
|
||||
locale/ar_SA.ts \
|
||||
|
@ -604,13 +627,38 @@ TRANSLATIONS += locale/ru_RU.ts \
|
|||
locale/jb_JB.ts \
|
||||
locale/hi_IN.ts \
|
||||
locale/ie_001.ts
|
||||
|
||||
# Build version file
|
||||
!isEmpty( hasGit ) {
|
||||
PRE_TARGETDEPS += $$PWD/version.txt
|
||||
}
|
||||
|
||||
# This makes qmake generate translations
|
||||
|
||||
|
||||
isEmpty(QMAKE_LRELEASE):QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease
|
||||
|
||||
|
||||
# The *.qm files might not exist when qmake is run for the first time,
|
||||
# causing the standard install rule to be ignored, and no translations
|
||||
# will be installed. With this, we create the qm files during qmake run.
|
||||
!win32 {
|
||||
system($${QMAKE_LRELEASE} -silent $${_PRO_FILE_} 2> /dev/null)
|
||||
}
|
||||
else{
|
||||
system($${QMAKE_LRELEASE} -silent $${_PRO_FILE_})
|
||||
}
|
||||
|
||||
updateqm.input = TRANSLATIONS
|
||||
updateqm.output = locale/${QMAKE_FILE_BASE}.qm
|
||||
updateqm.commands = $$QMAKE_LRELEASE \
|
||||
${QMAKE_FILE_IN} \
|
||||
-qm \
|
||||
${QMAKE_FILE_OUT}
|
||||
updateqm.CONFIG += no_link
|
||||
QMAKE_EXTRA_COMPILERS += updateqm
|
||||
TS_OUT = $$TRANSLATIONS
|
||||
TS_OUT ~= s/.ts/.qm/g
|
||||
PRE_TARGETDEPS += $$TS_OUT
|
||||
|
||||
include( thirdparty/qtsingleapplication/src/qtsingleapplication.pri )
|
||||
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -113,6 +113,10 @@ HelpWindow::HelpWindow( QWidget * parent, Config::Class & cfg_ ) :
|
|||
|
||||
helpEngine = new QHelpEngine( helpCollectionFile );
|
||||
|
||||
#if (QT_VERSION > QT_VERSION_CHECK(6,0,0))
|
||||
helpEngine->setReadOnly( false );
|
||||
#endif
|
||||
|
||||
if( !helpEngine->setupData() )
|
||||
{
|
||||
gdWarning( "Help engine initialization error: %s", helpEngine->error().toUtf8().data() );
|
||||
|
|
|
@ -23,7 +23,11 @@
|
|||
#include <QFileInfo>
|
||||
|
||||
#include <set>
|
||||
#ifndef INCLUDE_LIBRARY_PATH
|
||||
#include <hunspell.hxx>
|
||||
#else
|
||||
#include <hunspell/hunspell.hxx>
|
||||
#endif
|
||||
#include "gddebug.hh"
|
||||
#include "fsencoding.hh"
|
||||
#include "utils.hh"
|
||||
|
|
|
@ -19,22 +19,29 @@ void IframeSchemeHandler::requestStarted(QWebEngineUrlRequestJob *requestJob)
|
|||
|
||||
auto finishAction = [ = ]() -> void
|
||||
{
|
||||
QByteArray contentType = "text/html;charset=UTF-8";
|
||||
QByteArray contentType = "text/html";
|
||||
|
||||
QBuffer * buffer = new QBuffer( requestJob );
|
||||
// Handle reply data
|
||||
if( reply->error() != QNetworkReply::NoError )
|
||||
{
|
||||
QString emptyHtml = QString( "<html><body>%1</body></html>" ).arg( reply->errorString() );
|
||||
buffer->setData( emptyHtml.toUtf8() );
|
||||
requestJob->reply( contentType, buffer );
|
||||
return;
|
||||
}
|
||||
|
||||
QByteArray replyData = reply->readAll();
|
||||
QString articleString;
|
||||
|
||||
QTextCodec * codec = QTextCodec::codecForHtml( replyData, QTextCodec::codecForName( "UTF-8" ) );
|
||||
articleString = codec->toUnicode( replyData );
|
||||
// Handle reply data
|
||||
// 404 response may have response body.
|
||||
if( reply->error() != QNetworkReply::NoError && articleString.isEmpty())
|
||||
{
|
||||
if(reply->error()==QNetworkReply::ContentNotFoundError){
|
||||
//work around to fix QTBUG-106573
|
||||
requestJob->redirect(url);
|
||||
return;
|
||||
}
|
||||
QString emptyHtml = QString( "<html><body>%1</body></html>" ).arg( reply->errorString() );
|
||||
buffer->setData( emptyHtml.toUtf8() );
|
||||
requestJob->reply( contentType, buffer );
|
||||
return;
|
||||
}
|
||||
|
||||
// Change links from relative to absolute
|
||||
|
||||
|
@ -46,6 +53,10 @@ void IframeSchemeHandler::requestStarted(QWebEngineUrlRequestJob *requestJob)
|
|||
|
||||
QString baseTagHtml = "<base href=\"" + base + "\">";
|
||||
|
||||
QString depressionFocus ="<script type=\"application/javascript\"> HTMLElement.prototype.focus=function(){console.log(\"focus() has been disabled.\");}</script>"
|
||||
"<script type=\"text/javascript\" src=\"qrc:///scripts/iframeResizer.contentWindow.min.js\"></script>"
|
||||
"<script type=\"text/javascript\" src=\"qrc:///scripts/iframe-defer.js\"></script>";
|
||||
|
||||
// remove existed base tag
|
||||
articleString.remove( baseTag ) ;
|
||||
|
||||
|
@ -56,12 +67,14 @@ void IframeSchemeHandler::requestStarted(QWebEngineUrlRequestJob *requestJob)
|
|||
if( match.hasMatch() )
|
||||
{
|
||||
articleString.insert( match.capturedEnd(), baseTagHtml );
|
||||
articleString.insert( match.capturedEnd(), depressionFocus );
|
||||
}
|
||||
else
|
||||
{
|
||||
// the html contain no head element
|
||||
// just insert at the beginning of the html ,and leave it at the mercy of browser(chrome webengine)
|
||||
articleString.insert( 0, baseTagHtml );
|
||||
articleString.insert( 0, depressionFocus );
|
||||
}
|
||||
|
||||
buffer->setData(codec->fromUnicode(articleString));
|
||||
|
|
5164
locale/de_CH.ts
Normal file
5164
locale/de_CH.ts
Normal file
File diff suppressed because it is too large
Load diff
2
main.cc
2
main.cc
|
@ -399,7 +399,7 @@ int main( int argc, char ** argv )
|
|||
app.installTranslator( &qtTranslator );
|
||||
}
|
||||
|
||||
translator.load( Config::getEmbedLocDir() + "/" + localeName );
|
||||
translator.load( Config::getLocDir() + "/" + localeName );
|
||||
app.installTranslator( &translator );
|
||||
|
||||
QTranslator webengineTs;
|
||||
|
|
|
@ -181,7 +181,7 @@ MainWindow::MainWindow( Config::Class & cfg_ ):
|
|||
QWebEngineProfile::defaultProfile()->setUrlRequestInterceptor( wuri );
|
||||
|
||||
if(!cfg.preferences.hideGoldenDictHeader){
|
||||
QWebEngineProfile::defaultProfile()->setHttpUserAgent(QWebEngineProfile::defaultProfile()->httpUserAgent()+" GoldenDict/webengine");
|
||||
QWebEngineProfile::defaultProfile()->setHttpUserAgent(QWebEngineProfile::defaultProfile()->httpUserAgent()+" GoldenDict/WebEngine");
|
||||
}
|
||||
|
||||
qRegisterMetaType< Config::InputPhrase >();
|
||||
|
@ -237,8 +237,12 @@ MainWindow::MainWindow( Config::Class & cfg_ ):
|
|||
enableScanPopup->setCheckable( true );
|
||||
enableScanPopup->setVisible( cfg.preferences.enableScanPopup );
|
||||
navToolbar->widgetForAction( enableScanPopup )->setObjectName( "scanPopupButton" );
|
||||
if ( cfg.preferences.enableScanPopup && cfg.preferences.startWithScanPopupOn )
|
||||
if( cfg.preferences.enableScanPopup && cfg.preferences.startWithScanPopupOn )
|
||||
{
|
||||
enableScanPopup->setIcon( QIcon( ":/icons/wizard-selected.svg" ) );
|
||||
enableScanPopup->setChecked( true );
|
||||
}
|
||||
|
||||
|
||||
connect( enableScanPopup, SIGNAL( toggled( bool ) ),
|
||||
this, SLOT( scanEnableToggled( bool ) ) );
|
||||
|
@ -1514,6 +1518,8 @@ void MainWindow::makeScanPopup()
|
|||
connect( scanPopup.get(), SIGNAL( setExpandMode( bool ) ),
|
||||
this, SLOT( setExpandMode( bool ) ) );
|
||||
|
||||
connect( scanPopup.get(), &ScanPopup::inspectSignal,this,&MainWindow::inspectElement );
|
||||
|
||||
connect( scanPopup.get(), SIGNAL( forceAddWordToHistory( const QString & ) ),
|
||||
this, SLOT( forceAddWordToHistory( const QString & ) ) );
|
||||
|
||||
|
@ -3453,7 +3459,7 @@ static void filterAndCollectResources( QString & html, QRegExp & rx, const QStri
|
|||
{
|
||||
QUrl url( rx.cap( 1 ) );
|
||||
QString host = url.host();
|
||||
QString resourcePath = QString::fromLatin1( QUrl::toPercentEncoding( Utils::Url::path( url ), "/" ) );
|
||||
QString resourcePath = Utils::Url::path( url );
|
||||
|
||||
if ( !host.startsWith( '/' ) )
|
||||
host.insert( 0, '/' );
|
||||
|
@ -3470,6 +3476,7 @@ static void filterAndCollectResources( QString & html, QRegExp & rx, const QStri
|
|||
}
|
||||
|
||||
// Modify original url, set to the native one
|
||||
resourcePath = QString::fromLatin1( QUrl::toPercentEncoding( resourcePath, "/" ) );
|
||||
QString newUrl = sep + QDir( folder ).dirName() + host + resourcePath + sep;
|
||||
html.replace( pos, rx.cap().length(), newUrl );
|
||||
pos += newUrl.length();
|
||||
|
@ -3512,7 +3519,8 @@ void MainWindow::on_saveArticle_triggered()
|
|||
&selectedFilter,
|
||||
options );
|
||||
|
||||
bool complete = ( selectedFilter == filters[ 0 ] );
|
||||
// The " (*.html)" part of filters[i] is absent from selectedFilter in Qt 5.
|
||||
bool const complete = filters.at( 0 ).startsWith( selectedFilter );
|
||||
|
||||
if( fileName.isEmpty() )
|
||||
return;
|
||||
|
|
|
@ -198,88 +198,13 @@
|
|||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>254</red>
|
||||
<green>253</green>
|
||||
<blue>235</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>254</red>
|
||||
<green>253</green>
|
||||
<blue>235</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
<property name="frame">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="WordList" name="wordList">
|
||||
<property name="palette">
|
||||
<palette>
|
||||
<active>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>254</red>
|
||||
<green>253</green>
|
||||
<blue>235</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</active>
|
||||
<inactive>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>254</red>
|
||||
<green>253</green>
|
||||
<blue>235</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</inactive>
|
||||
<disabled>
|
||||
<colorrole role="Base">
|
||||
<brush brushstyle="SolidPattern">
|
||||
<color alpha="255">
|
||||
<red>255</red>
|
||||
<green>255</green>
|
||||
<blue>255</blue>
|
||||
</color>
|
||||
</brush>
|
||||
</colorrole>
|
||||
</disabled>
|
||||
</palette>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="WordList" name="wordList"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
|
|
11
mdx.cc
11
mdx.cc
|
@ -200,7 +200,7 @@ public:
|
|||
|
||||
};
|
||||
|
||||
class MdxDictionary: public BtreeIndexing::BtreeDictionary
|
||||
class MdxDictionary: public QObject, public BtreeIndexing::BtreeDictionary
|
||||
{
|
||||
Mutex idxMutex;
|
||||
File::Class idx;
|
||||
|
@ -695,10 +695,8 @@ class MddResourceRequest: public Dictionary::DataRequest
|
|||
|
||||
public:
|
||||
|
||||
MddResourceRequest( MdxDictionary & dict_,
|
||||
string const & resourceName_ ):
|
||||
dict( dict_ ),
|
||||
resourceName( Utf8::decode( resourceName_ ) )
|
||||
MddResourceRequest( MdxDictionary & dict_, string const & resourceName_ ) :
|
||||
Dictionary::DataRequest( &dict_ ), dict( dict_ ), resourceName( Utf8::decode( resourceName_ ) )
|
||||
{
|
||||
f = QtConcurrent::run( [ this ]() { this->run(); } );
|
||||
// QThreadPool::globalInstance()->start( [ this ]() { this->run(); } );
|
||||
|
@ -854,7 +852,6 @@ void MddResourceRequest::run()
|
|||
if( Filetype::isNameOfTiff( u8ResourceName ) )
|
||||
{
|
||||
// Convert it
|
||||
Mutex::Lock _( dataMutex );
|
||||
GdTiff::tiff2img( data );
|
||||
}
|
||||
}
|
||||
|
@ -902,7 +899,7 @@ void MdxDictionary::loadIcon() noexcept
|
|||
fileName.chop( 3 );
|
||||
QString text = QString::fromStdString( dictionaryName );
|
||||
|
||||
if( !loadIconFromFile( fileName ) && !loadIconFromText( text ) )
|
||||
if( !loadIconFromFile( fileName ) && !loadIconFromText(":/icons/mdict-bg.png", text ) )
|
||||
{
|
||||
// Use default icons
|
||||
dictionaryIcon = dictionaryNativeIcon = QIcon( ":/icons/mdict.png" );
|
||||
|
|
122
preferences.cc
122
preferences.cc
|
@ -19,32 +19,9 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
|||
connect( ui.enableScanPopup, SIGNAL( toggled( bool ) ),
|
||||
this, SLOT( enableScanPopupToggled( bool ) ) );
|
||||
|
||||
connect( ui.enableScanPopupModifiers, SIGNAL( toggled( bool ) ),
|
||||
this, SLOT( enableScanPopupModifiersToggled( bool ) ) );
|
||||
|
||||
connect( ui.showScanFlag, SIGNAL( toggled( bool ) ),
|
||||
this, SLOT( showScanFlagToggled( bool ) ) );
|
||||
|
||||
connect( ui.altKey, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( wholeAltClicked( bool ) ) );
|
||||
connect( ui.ctrlKey, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( wholeCtrlClicked( bool ) ) );
|
||||
connect( ui.shiftKey, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( wholeShiftClicked( bool ) ) );
|
||||
|
||||
connect( ui.leftAlt, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( sideAltClicked( bool ) ) );
|
||||
connect( ui.rightAlt, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( sideAltClicked( bool ) ) );
|
||||
connect( ui.leftCtrl, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( sideCtrlClicked( bool ) ) );
|
||||
connect( ui.rightCtrl, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( sideCtrlClicked( bool ) ) );
|
||||
connect( ui.leftShift, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( sideShiftClicked( bool ) ) );
|
||||
connect( ui.rightShift, SIGNAL( clicked( bool ) ),
|
||||
this, SLOT( sideShiftClicked( bool ) ) );
|
||||
|
||||
connect( ui.buttonBox, SIGNAL( helpRequested() ),
|
||||
this, SLOT( helpRequested() ) );
|
||||
|
||||
|
@ -64,7 +41,7 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
|||
|
||||
// See which other translations do we have
|
||||
|
||||
QStringList availLocs = QDir( Config::getEmbedLocDir() ).entryList( QStringList( "*.qm" ),
|
||||
QStringList availLocs = QDir( Config::getLocDir() ).entryList( QStringList( "*.qm" ),
|
||||
QDir::Files );
|
||||
|
||||
// We need to sort by language name -- otherwise list looks really weird
|
||||
|
@ -192,21 +169,7 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
|||
|
||||
ui.enableScanPopup->setChecked( p.enableScanPopup );
|
||||
ui.startWithScanPopupOn->setChecked( p.startWithScanPopupOn );
|
||||
ui.enableScanPopupModifiers->setChecked( p.enableScanPopupModifiers );
|
||||
|
||||
ui.altKey->setChecked( p.scanPopupModifiers & KeyboardState::Alt );
|
||||
ui.ctrlKey->setChecked( p.scanPopupModifiers & KeyboardState::Ctrl );
|
||||
ui.shiftKey->setChecked( p.scanPopupModifiers & KeyboardState::Shift );
|
||||
ui.winKey->setChecked( p.scanPopupModifiers & KeyboardState::Win );
|
||||
ui.leftAlt->setChecked( p.scanPopupModifiers & KeyboardState::LeftAlt );
|
||||
ui.rightAlt->setChecked( p.scanPopupModifiers & KeyboardState::RightAlt );
|
||||
ui.leftCtrl->setChecked( p.scanPopupModifiers & KeyboardState::LeftCtrl );
|
||||
ui.rightCtrl->setChecked( p.scanPopupModifiers & KeyboardState::RightCtrl );
|
||||
ui.leftShift->setChecked( p.scanPopupModifiers & KeyboardState::LeftShift );
|
||||
ui.rightShift->setChecked( p.scanPopupModifiers & KeyboardState::RightShift );
|
||||
|
||||
ui.scanPopupAltMode->setChecked( p.scanPopupAltMode );
|
||||
ui.scanPopupAltModeSecs->setValue( p.scanPopupAltModeSecs );
|
||||
ui.ignoreOwnClipboardChanges->setChecked( p.ignoreOwnClipboardChanges );
|
||||
ui.scanToMainWindow->setChecked( p.scanToMainWindow );
|
||||
ui.scanPopupUnpinnedWindowFlags->setCurrentIndex( p.scanPopupUnpinnedWindowFlags );
|
||||
|
@ -238,22 +201,6 @@ Preferences::Preferences( QWidget * parent, Config::Class & cfg_ ):
|
|||
|
||||
// Different platforms have different keys available
|
||||
|
||||
#ifdef Q_OS_WIN32
|
||||
ui.winKey->hide();
|
||||
#else
|
||||
ui.leftAlt->hide();
|
||||
ui.rightAlt->hide();
|
||||
ui.leftCtrl->hide();
|
||||
ui.rightCtrl->hide();
|
||||
ui.leftShift->hide();
|
||||
ui.rightShift->hide();
|
||||
#ifdef Q_OS_MAC
|
||||
ui.altKey->setText( "Opt" );
|
||||
ui.winKey->setText( "Ctrl" );
|
||||
ui.ctrlKey->setText( "Cmd" );
|
||||
#endif
|
||||
#endif
|
||||
|
||||
//Platform-specific options
|
||||
|
||||
#ifndef ENABLE_SPWF_CUSTOMIZATION
|
||||
|
@ -415,21 +362,7 @@ Config::Preferences Preferences::getPreferences()
|
|||
|
||||
p.enableScanPopup = ui.enableScanPopup->isChecked();
|
||||
p.startWithScanPopupOn = ui.startWithScanPopupOn->isChecked();
|
||||
p.enableScanPopupModifiers = ui.enableScanPopupModifiers->isChecked();
|
||||
|
||||
p.scanPopupModifiers += ui.altKey->isChecked() ? KeyboardState::Alt : 0;
|
||||
p.scanPopupModifiers += ui.ctrlKey->isChecked() ? KeyboardState::Ctrl: 0;
|
||||
p.scanPopupModifiers += ui.shiftKey->isChecked() ? KeyboardState::Shift: 0;
|
||||
p.scanPopupModifiers += ui.winKey->isChecked() ? KeyboardState::Win: 0;
|
||||
p.scanPopupModifiers += ui.leftAlt->isChecked() ? KeyboardState::LeftAlt: 0;
|
||||
p.scanPopupModifiers += ui.rightAlt->isChecked() ? KeyboardState::RightAlt: 0;
|
||||
p.scanPopupModifiers += ui.leftCtrl->isChecked() ? KeyboardState::LeftCtrl: 0;
|
||||
p.scanPopupModifiers += ui.rightCtrl->isChecked() ? KeyboardState::RightCtrl: 0;
|
||||
p.scanPopupModifiers += ui.leftShift->isChecked() ? KeyboardState::LeftShift: 0;
|
||||
p.scanPopupModifiers += ui.rightShift->isChecked() ? KeyboardState::RightShift: 0;
|
||||
|
||||
p.scanPopupAltMode = ui.scanPopupAltMode->isChecked();
|
||||
p.scanPopupAltModeSecs = ui.scanPopupAltModeSecs->value();
|
||||
p.ignoreOwnClipboardChanges = ui.ignoreOwnClipboardChanges->isChecked();
|
||||
p.scanToMainWindow = ui.scanToMainWindow->isChecked();
|
||||
#ifdef HAVE_X11
|
||||
|
@ -582,7 +515,7 @@ Config::Preferences Preferences::getPreferences()
|
|||
|
||||
void Preferences::enableScanPopupToggled( bool b )
|
||||
{
|
||||
ui.scanPopupModifiers->setEnabled( b && ui.enableScanPopupModifiers->isChecked() );
|
||||
ui.scanPopupModifiers->setEnabled( b );
|
||||
}
|
||||
|
||||
void Preferences::enableScanPopupModifiersToggled( bool b )
|
||||
|
@ -592,62 +525,11 @@ void Preferences::enableScanPopupModifiersToggled( bool b )
|
|||
ui.showScanFlag->setChecked( false );
|
||||
}
|
||||
|
||||
void Preferences::showScanFlagToggled( bool b )
|
||||
{
|
||||
if( b )
|
||||
ui.enableScanPopupModifiers->setChecked( false );
|
||||
}
|
||||
|
||||
void Preferences::on_scanPopupUnpinnedWindowFlags_currentIndexChanged( int index )
|
||||
{
|
||||
ui.scanPopupUnpinnedBypassWMHint->setEnabled( Config::spwfFromInt( index ) != Config::SPWF_default );
|
||||
}
|
||||
|
||||
void Preferences::wholeAltClicked( bool b )
|
||||
{
|
||||
if ( b )
|
||||
{
|
||||
ui.leftAlt->setChecked( false );
|
||||
ui.rightAlt->setChecked( false );
|
||||
}
|
||||
}
|
||||
|
||||
void Preferences::wholeCtrlClicked( bool b )
|
||||
{
|
||||
if ( b )
|
||||
{
|
||||
ui.leftCtrl->setChecked( false );
|
||||
ui.rightCtrl->setChecked( false );
|
||||
}
|
||||
}
|
||||
|
||||
void Preferences::wholeShiftClicked( bool b )
|
||||
{
|
||||
if ( b )
|
||||
{
|
||||
ui.leftShift->setChecked( false );
|
||||
ui.rightShift->setChecked( false );
|
||||
}
|
||||
}
|
||||
|
||||
void Preferences::sideAltClicked( bool )
|
||||
{
|
||||
if ( ui.leftAlt->isChecked() || ui.rightAlt->isChecked() )
|
||||
ui.altKey->setChecked( false );
|
||||
}
|
||||
|
||||
void Preferences::sideCtrlClicked( bool )
|
||||
{
|
||||
if ( ui.leftCtrl->isChecked() || ui.rightCtrl->isChecked() )
|
||||
ui.ctrlKey->setChecked( false );
|
||||
}
|
||||
|
||||
void Preferences::sideShiftClicked( bool )
|
||||
{
|
||||
if ( ui.leftShift->isChecked() || ui.rightShift->isChecked() )
|
||||
ui.shiftKey->setChecked( false );
|
||||
}
|
||||
|
||||
void Preferences::on_enableMainWindowHotkey_toggled( bool checked )
|
||||
{
|
||||
ui.mainWindowHotkey->setEnabled( checked );
|
||||
|
|
|
@ -35,17 +35,8 @@ private slots:
|
|||
|
||||
void enableScanPopupToggled( bool );
|
||||
void enableScanPopupModifiersToggled( bool );
|
||||
void showScanFlagToggled( bool b );
|
||||
void on_scanPopupUnpinnedWindowFlags_currentIndexChanged( int index );
|
||||
|
||||
void wholeAltClicked( bool );
|
||||
void wholeCtrlClicked( bool );
|
||||
void wholeShiftClicked( bool );
|
||||
|
||||
void sideAltClicked( bool );
|
||||
void sideCtrlClicked( bool );
|
||||
void sideShiftClicked( bool );
|
||||
|
||||
void on_enableMainWindowHotkey_toggled( bool checked );
|
||||
void on_enableClipboardHotkey_toggled( bool checked );
|
||||
|
||||
|
|
233
preferences.ui
233
preferences.ui
|
@ -452,17 +452,6 @@ the program would always start with the scan popup active.</string>
|
|||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="enableScanPopupModifiers">
|
||||
<property name="toolTip">
|
||||
<string>With this enabled, the popup would only show up if all chosen keys are
|
||||
in the pressed state when the word selection changes.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Only show popup when all selected keys are kept pressed:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="scanPopupModifiers">
|
||||
<property name="frameShape">
|
||||
|
@ -487,218 +476,9 @@ in the pressed state when the word selection changes.</string>
|
|||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="leftCtrl">
|
||||
<property name="toolTip">
|
||||
<string>Left Ctrl only</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Left Ctrl</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QCheckBox" name="rightShift">
|
||||
<property name="toolTip">
|
||||
<string>Right Shift only</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Right Shift</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="altKey">
|
||||
<property name="toolTip">
|
||||
<string>Alt key</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Alt</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="ctrlKey">
|
||||
<property name="toolTip">
|
||||
<string>Ctrl key</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Ctrl</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="leftAlt">
|
||||
<property name="toolTip">
|
||||
<string>Left Alt only</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Left Alt</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QCheckBox" name="shiftKey">
|
||||
<property name="toolTip">
|
||||
<string>Shift key</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Shift</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="rightAlt">
|
||||
<property name="toolTip">
|
||||
<string>Right Alt only</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Right Alt</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="rightCtrl">
|
||||
<property name="toolTip">
|
||||
<string>Right Ctrl only</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Right Ctrl</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QCheckBox" name="leftShift">
|
||||
<property name="toolTip">
|
||||
<string>Left Shift only</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Left Shift</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QCheckBox" name="winKey">
|
||||
<property name="toolTip">
|
||||
<string>Windows key or Meta key</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Win/Meta</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame">
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<property name="lineWidth">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="scanPopupAltMode">
|
||||
<property name="toolTip">
|
||||
<string>Normally, in order to activate a popup you have to
|
||||
maintain the chosen keys pressed while you select
|
||||
a word. With this enabled, the chosen keys may also
|
||||
be pressed shortly after the selection is done.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Keys may also be pressed afterwards, within</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSpinBox" name="scanPopupAltModeSecs">
|
||||
<property name="toolTip">
|
||||
<string>To avoid false positives, the keys are only monitored
|
||||
after the selection's done for a limited amount of
|
||||
seconds, which is specified here.</string>
|
||||
</property>
|
||||
<property name="wrapping">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="frame">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>secs</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_5">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="showScanFlag">
|
||||
<property name="toolTip">
|
||||
|
@ -1911,19 +1691,6 @@ from Stardict, Babylon and GLS dictionaries</string>
|
|||
<tabstop>cbAutostart</tabstop>
|
||||
<tabstop>interfaceLanguage</tabstop>
|
||||
<tabstop>startWithScanPopupOn</tabstop>
|
||||
<tabstop>enableScanPopupModifiers</tabstop>
|
||||
<tabstop>leftCtrl</tabstop>
|
||||
<tabstop>rightShift</tabstop>
|
||||
<tabstop>altKey</tabstop>
|
||||
<tabstop>ctrlKey</tabstop>
|
||||
<tabstop>leftAlt</tabstop>
|
||||
<tabstop>shiftKey</tabstop>
|
||||
<tabstop>rightAlt</tabstop>
|
||||
<tabstop>rightCtrl</tabstop>
|
||||
<tabstop>leftShift</tabstop>
|
||||
<tabstop>winKey</tabstop>
|
||||
<tabstop>scanPopupAltMode</tabstop>
|
||||
<tabstop>scanPopupAltModeSecs</tabstop>
|
||||
<tabstop>useProxyServer</tabstop>
|
||||
<tabstop>proxyType</tabstop>
|
||||
<tabstop>proxyHost</tabstop>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
MainWindow #translateLine, ScanPopup #translateLine, MainWindow #searchPane #wordList, MainWindow #dictsPane #dictsList,
|
||||
MainWindow #historyPane #historyList, MainWindow #favoritesPane #favoritesTree
|
||||
{
|
||||
background: white;
|
||||
|
||||
}
|
||||
|
||||
MainWindow #searchPane #translateLine
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
MainWindow #translateLine, ScanPopup #translateLine, MainWindow #wordList, MainWindow #dictsPane #dictsList,
|
||||
MainWindow #historyPane #historyList, MainWindow #favoritesPane #favoritesTree
|
||||
{
|
||||
background: white;
|
||||
|
||||
}
|
||||
|
||||
/* WARNING: hides all separators! */
|
||||
|
|
|
@ -3,9 +3,8 @@ MainWindow #translateLine, ScanPopup #translateLine, MainWindow #wordList, MainW
|
|||
}
|
||||
|
||||
MainWindow #translateLine[noResults="true"],
|
||||
ScanPopup #translateLine[noResults="true"]
|
||||
{
|
||||
background: #febb7d;
|
||||
ScanPopup #translateLine[noResults="true"] {
|
||||
background: #febb7d;
|
||||
}
|
||||
|
||||
#navToolbar #menuButton::menu-indicator {
|
||||
|
|
|
@ -57,9 +57,6 @@
|
|||
<file>icons/icon32_gls.png</file>
|
||||
<file>icons/folder.png</file>
|
||||
<file>icons/ontop.svg</file>
|
||||
<file>resources/jquery-3.6.0.slim.min.js</file>
|
||||
<file>resources/gd-custom.js</file>
|
||||
<file>resources/gd-builtin.js</file>
|
||||
<file>icons/addtab.svg</file>
|
||||
<file>icons/book.svg</file>
|
||||
<file>icons/bookcase.svg</file>
|
||||
|
|
10
scanpopup.cc
10
scanpopup.cc
|
@ -114,6 +114,8 @@ ScanPopup::ScanPopup( QWidget * parent,
|
|||
definition, SLOT( receiveExpandOptionalParts( bool ) ) );
|
||||
connect( definition, SIGNAL( setExpandMode( bool ) ),
|
||||
this, SIGNAL( setExpandMode( bool ) ) );
|
||||
connect( definition, SIGNAL( inspectSignal( QWebEnginePage* ) ),
|
||||
this, SLOT( inspectElementWhenPinned( QWebEnginePage* ) ) );
|
||||
connect( definition, SIGNAL( forceAddWordToHistory( QString ) ),
|
||||
this, SIGNAL( forceAddWordToHistory( QString ) ) );
|
||||
connect( this, SIGNAL( closeMenu() ),
|
||||
|
@ -369,6 +371,11 @@ void ScanPopup::disableScanning()
|
|||
}
|
||||
}
|
||||
|
||||
void ScanPopup::inspectElementWhenPinned( QWebEnginePage * page ){
|
||||
if(cfg.pinPopupWindow)
|
||||
emit inspectSignal(page);
|
||||
}
|
||||
|
||||
void ScanPopup::applyZoomFactor()
|
||||
{
|
||||
definition->setZoomFactor( cfg.preferences.zoomFactor );
|
||||
|
@ -514,6 +521,8 @@ void ScanPopup::delayShow()
|
|||
|
||||
void ScanPopup::clipboardChanged( QClipboard::Mode m )
|
||||
{
|
||||
if( !cfg.preferences.trackClipboardChanges )
|
||||
return;
|
||||
if( !isScanningEnabled )
|
||||
return;
|
||||
|
||||
|
@ -1085,6 +1094,7 @@ void ScanPopup::pinButtonClicked( bool checked )
|
|||
|
||||
mouseEnteredOnce = true;
|
||||
}
|
||||
cfg.pinPopupWindow = checked;
|
||||
|
||||
show();
|
||||
}
|
||||
|
|
|
@ -63,6 +63,7 @@ signals:
|
|||
void closeMenu();
|
||||
/// Signals to set expand optional parts mode (retranslation from/to MainWindow and dictionary bar)
|
||||
void setExpandMode( bool expand );
|
||||
void inspectSignal(QWebEnginePage * page);
|
||||
void setViewExpandMode( bool expand );
|
||||
/// Signal to switch expand optional parts mode
|
||||
void switchExpandMode();
|
||||
|
@ -92,6 +93,7 @@ signals:
|
|||
public slots:
|
||||
void requestWindowFocus();
|
||||
|
||||
void inspectElementWhenPinned( QWebEnginePage * page );
|
||||
/// Translates the word from the clipboard, showing the window etc.
|
||||
void translateWordFromClipboard();
|
||||
/// Translates the word from the clipboard selection
|
||||
|
|
10
scripts.qrc
Normal file
10
scripts.qrc
Normal file
|
@ -0,0 +1,10 @@
|
|||
<RCC>
|
||||
<qresource prefix="/">
|
||||
<file>scripts/iframeResizer.contentWindow.min.js</file>
|
||||
<file>scripts/iframeResizer.min.js</file>
|
||||
<file>scripts/gd-builtin.js</file>
|
||||
<file>scripts/gd-custom.js</file>
|
||||
<file>scripts/jquery-3.6.0.slim.min.js</file>
|
||||
<file>scripts/iframe-defer.js</file>
|
||||
</qresource>
|
||||
</RCC>
|
|
@ -49,23 +49,7 @@
|
|||
});
|
||||
|
||||
//monitor iframe height.
|
||||
|
||||
$("iframe").on("load", function () {
|
||||
var iframe = $(this);
|
||||
resizeIframe(iframe[0]);
|
||||
});
|
||||
|
||||
function resizeIframe(obj) {
|
||||
setInterval(function () {
|
||||
//in some cases ,the website in iframe will load result after document has been loaded. the height will continue to change.
|
||||
var height = $(obj).contents().height();
|
||||
$(obj).height(Math.min(2000, height));
|
||||
if (height >= 2000) {
|
||||
obj.scrolling = "yes";
|
||||
}
|
||||
}, 500);
|
||||
}
|
||||
|
||||
$('iframe').iFrameResize({ checkOrigin:false,maxHeight :800,scrolling:true,warningTimeout:0,minHeight :250,log:true,autoResize:false});
|
||||
});
|
||||
})($_$);
|
||||
|
20
scripts/iframe-defer.js
Normal file
20
scripts/iframe-defer.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
var start_time=new Date().getTime();
|
||||
|
||||
var interval = setInterval(function () {
|
||||
var end_time=new Date().getTime();
|
||||
//for 10 seconds.
|
||||
if(end_time-start_time>=10000){
|
||||
clearInterval(interval);
|
||||
}
|
||||
|
||||
const body = document.body;
|
||||
const html = document.documentElement;
|
||||
|
||||
const height = Math.max(body.scrollHeight, body.offsetHeight,
|
||||
html.clientHeight, html.scrollHeight, html.offsetHeight);
|
||||
|
||||
if ('parentIFrame' in window) {
|
||||
console.log("iframe set height to " + height);
|
||||
parentIFrame.size(height);
|
||||
}
|
||||
}, 500);
|
10
scripts/iframeResizer.contentWindow.min.js
vendored
Normal file
10
scripts/iframeResizer.contentWindow.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
scripts/iframeResizer.min.js
vendored
Normal file
9
scripts/iframeResizer.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
thirdparty/qwebengine_ts/qtwebengine_de_CH.qm
vendored
Normal file
BIN
thirdparty/qwebengine_ts/qtwebengine_de_CH.qm
vendored
Normal file
Binary file not shown.
20
utils.hh
20
utils.hh
|
@ -94,9 +94,23 @@ inline bool isExternalLink(QUrl const &url) {
|
|||
|
||||
inline bool isHtmlResources(QUrl const &url) {
|
||||
auto fileName = url.fileName();
|
||||
auto ext=fileName.mid(fileName.lastIndexOf("."));
|
||||
QStringList extensions{".css",".woff",".woff2","ttf",".bmp" ,".jpg", ".png",".gif", ".tif",".wav", ".ogg", ".oga", ".mp3", ".mp4", ".aac", ".flac",".mid", ".wv",".ape"} ;
|
||||
return extensions.contains( ext, Qt::CaseInsensitive );
|
||||
qsizetype index = fileName.lastIndexOf( "." );
|
||||
QStringList extensions{ ".css", ".woff", ".woff2", ".ttf", ".otf", ".bmp", ".jpg", ".png", ".gif", ".tif",
|
||||
".wav", ".ogg", ".oga", ".mp3", ".mp4", ".aac", ".flac", ".mid", ".wv", ".ape" };
|
||||
|
||||
if( index > -1 )
|
||||
{
|
||||
auto ext = fileName.mid( index );
|
||||
if( extensions.contains( ext, Qt::CaseInsensitive ) )
|
||||
return true;
|
||||
}
|
||||
// some url has the form like https://xxxx/audio?file=***.mp3&a=1 etc links.
|
||||
for( QString extension : extensions )
|
||||
{
|
||||
if( url.url().contains( extension, Qt::CaseInsensitive ) )
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
inline QString escape( QString const & plain )
|
||||
|
|
|
@ -399,9 +399,8 @@ sptr< DataRequest > WebSiteDictionary::getArticle( wstring const & str,
|
|||
"\" src=\""+encodeUrl.toStdString() +
|
||||
"\" onmouseover=\"processIframeMouseOver('gdexpandframe-" + getId() + "');\" "
|
||||
"onmouseout=\"processIframeMouseOut();\" "
|
||||
"scrolling=\"no\" marginwidth=\"0\" marginheight=\"0\" "
|
||||
"frameborder=\"0\" vspace=\"0\" hspace=\"0\""
|
||||
"style=\"overflow:visible; width:100%; display:block;\" sandbox=\"allow-same-origin allow-scripts allow-popups\">"
|
||||
"scrolling=\"no\" "
|
||||
"style=\"overflow:visible; width:100%; display:block; border:none;\" sandbox=\"allow-same-origin allow-scripts allow-popups\">"
|
||||
"</iframe>";
|
||||
|
||||
dr->getData().resize( result.size() );
|
||||
|
@ -538,7 +537,7 @@ void WebSiteDictionary::loadIcon() noexcept
|
|||
if( fInfo.isFile() )
|
||||
loadIconFromFile( fInfo.absoluteFilePath(), true );
|
||||
}
|
||||
if( dictionaryIcon.isNull() )
|
||||
if( dictionaryIcon.isNull() && !loadIconFromText(":/icons/webdict.svg", QString::fromStdString(name ) ) )
|
||||
dictionaryIcon = dictionaryNativeIcon = QIcon(":/icons/webdict.svg");
|
||||
dictionaryIconLoaded = true;
|
||||
}
|
||||
|
|
|
@ -21,7 +21,12 @@ void WebUrlRequestInterceptor::interceptRequest( QWebEngineUrlRequestInfo &info)
|
|||
//whitelist url does not block
|
||||
return;
|
||||
}
|
||||
if(Utils::isHtmlResources(info.requestUrl())){
|
||||
if( info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeImage
|
||||
|| info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeFontResource
|
||||
|| info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeStylesheet
|
||||
|| info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeMedia
|
||||
|| Utils::isHtmlResources( info.requestUrl() ) )
|
||||
{
|
||||
//let throuth the resources file.
|
||||
return;
|
||||
}
|
||||
|
|
63
wordlist.cc
63
wordlist.cc
|
@ -51,52 +51,22 @@ void WordList::updateMatchResults( bool finished )
|
|||
WordFinder::SearchResults const & results = wordFinder->getResults();
|
||||
|
||||
setUpdatesEnabled( false );
|
||||
//clear all existed items
|
||||
clear();
|
||||
|
||||
for( unsigned x = 0; x < results.size(); ++x )
|
||||
{
|
||||
QListWidgetItem * i = item( x );
|
||||
QListWidgetItem * i = new QListWidgetItem( results[ x ].first, this );
|
||||
i->setToolTip( results[ x ].first );
|
||||
|
||||
if ( !i )
|
||||
if( results[ x ].second )
|
||||
{
|
||||
i = new QListWidgetItem( results[ x ].first, this );
|
||||
i->setToolTip( results[ x ].first );
|
||||
|
||||
if ( results[ x ].second )
|
||||
{
|
||||
QFont f = i->font();
|
||||
f.setItalic( true );
|
||||
i->setFont( f );
|
||||
}
|
||||
addItem( i );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( i->text() != results[ x ].first )
|
||||
{
|
||||
i->setText( results[ x ].first );
|
||||
i->setToolTip( results[ x ].first );
|
||||
}
|
||||
|
||||
QFont f = i->font();
|
||||
if ( f.italic() != results[ x ].second )
|
||||
{
|
||||
f.setItalic( results[ x ].second );
|
||||
i->setFont( f );
|
||||
}
|
||||
f.setItalic( true );
|
||||
i->setFont( f );
|
||||
}
|
||||
|
||||
i->setTextAlignment(Qt::AlignLeft);
|
||||
}
|
||||
|
||||
while ( count() > (int) results.size() )
|
||||
{
|
||||
// Chop off any extra items that were there
|
||||
QListWidgetItem * i = takeItem( count() - 1 );
|
||||
|
||||
if ( i )
|
||||
delete i;
|
||||
else
|
||||
break;
|
||||
i->setTextAlignment( Qt::AlignLeft );
|
||||
}
|
||||
|
||||
if ( count() )
|
||||
|
@ -141,20 +111,3 @@ void WordList::refreshTranslateLine()
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
void WordList::resizeEvent( QResizeEvent * ev )
|
||||
{
|
||||
// In some rare cases Qt start send QResizeEvent recursively
|
||||
// up to full stack depletion (tested on Qt 4.8.5, 4.8.6).
|
||||
// We use this trick to break such suicidal process.
|
||||
|
||||
for( int x = 0; x < resizedSizes.size(); x++ )
|
||||
if( resizedSizes.at( x ) == ev->size() )
|
||||
return;
|
||||
|
||||
resizedSizes.push_back( ev->size() );
|
||||
|
||||
QListWidget::resizeEvent( ev );
|
||||
|
||||
resizedSizes.pop_back();
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@ public:
|
|||
{ translateLine = line; }
|
||||
|
||||
protected:
|
||||
virtual void resizeEvent( QResizeEvent * ev );
|
||||
|
||||
signals:
|
||||
void statusBarMessage(QString const & message, int timeout = 0, QPixmap const & pixmap = QPixmap());
|
||||
|
|
Loading…
Reference in a new issue