From 83e44f05ebada2026e7cf743660bb0931c92012d Mon Sep 17 00:00:00 2001 From: Aaron Tan Date: Sat, 9 Mar 2024 15:53:02 -0500 Subject: [PATCH] #136: Move from qmake to CMake (#166) # Description This commit switches the project's build system from qmake to CMake. Using CMake has several advantages: * Looking forward, Qt 6 uses CMake by default. It will be easier to migrate to Qt 6 with CMake as the default build system. * CMake is essentially an industry standard for C++ projects. This is a good learning opportunity, and because there are many people using CMake, it is easy to find resources for most edge-cases. * Automatic discovery of tests whose build system is CMake-by-default. Part of a series of commits for #136. ## Type of change - [x] Breaking change (fix or feature that would cause existing functionality to not work as expected) - [x] This change requires a documentation update # How Has This Been Tested? Tested by building debug builds on macOS, Windows, and Linux. Packaging for release has not yet been tested, and will be tested once a release is closer. # Checklist: - [x] My code follows the style guidelines of this project (`black` for Python code, `.clang-format` in the `src/jyut-dict` directory for C++) - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have translated my user-facing strings to all currently-supported languages - [x] I have made corresponding changes to the documentation --- LICENSE | 2 +- README.md | 4 +- src/jyut-dict/CMakeLists.txt | 232 +++++++++++++++ src/jyut-dict/jyut-dict.pro | 370 ------------------------ src/jyut-dict/platform/mac/Info.plist | 2 +- src/jyut-dict/platform/windows/app.rc | 2 + src/jyut-dict/platform/windows/icon.ico | Bin 0 -> 120243 bytes 7 files changed, 238 insertions(+), 374 deletions(-) create mode 100644 src/jyut-dict/CMakeLists.txt delete mode 100644 src/jyut-dict/jyut-dict.pro create mode 100644 src/jyut-dict/platform/windows/app.rc create mode 100644 src/jyut-dict/platform/windows/icon.ico diff --git a/LICENSE b/LICENSE index 8369d03d..8f3d4da3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 Aaron Tan +Copyright (c) 2024 Aaron Tan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 84cb5d5a..523c9202 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ craft libs/qt/qtspeech craft karchive ``` 3. Set up Qt Creator with a kit from Craft, following instructions [here](https://community.kde.org/Craft#Using_Craft_with_an_IDE). -4. Open Jyut Dictionary in Qt Creator, and add DEFINES+="PORTABLE" to the QMake configuration if you would like to isolate your debug build from any system files. +4. Open CMakeLists.txt in Qt Creator, and define `CMAKE_CXX_FLAGS` as `-DPORTABLE -DDEBUG` in the CMake configuration if you would like to isolate your debug build from any system files. 5. Compile and run! #### Ubuntu: Manual Git clone + Qt Creator @@ -108,7 +108,7 @@ cmake .. -DCMAKE_BUILD_TYPE=release -DCMAKE_INSTALL_PREFIX=~/Qt/5.15.2/gcc_64 make sudo make install ``` -3. Open Jyut Dictionary in Qt Creator, and add DEFINES+="PORTABLE" to the QMake configuration if you would like to isolate your debug build from any system files. +3. Open CMakeLists.txt in Qt Creator, and define `CMAKE_CXX_FLAGS` as `-DPORTABLE -DDEBUG` in the CMake configuration if you would like to isolate your debug build from any system files. 4. Compile and run! ## Packaging for release diff --git a/src/jyut-dict/CMakeLists.txt b/src/jyut-dict/CMakeLists.txt new file mode 100644 index 00000000..aad6c61d --- /dev/null +++ b/src/jyut-dict/CMakeLists.txt @@ -0,0 +1,232 @@ +cmake_minimum_required(VERSION 3.5) + +project(CantoneseDictionary VERSION 2.23.0408 LANGUAGES CXX) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS + LinguistTools + Multimedia + Network + Sql + Svg + TextToSpeech + Widgets) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS + LinguistTools + Multimedia + Network + Sql + Svg + TextToSpeech + Widgets) +find_package(KF5Archive) + +set(TS_FILES + resources/translations/jyutdictionary-en.ts + resources/translations/jyutdictionary-fr.ts + resources/translations/jyutdictionary-fr_CA.ts + resources/translations/jyutdictionary-yue_Hans.ts + resources/translations/jyutdictionary-yue_Hant.ts + resources/translations/jyutdictionary-zh_Hans.ts + resources/translations/jyutdictionary-zh_Hant.ts + resources/translations/jyutdictionary-zh_Hans_HK.ts + resources/translations/jyutdictionary-zh_Hant_HK.ts) + +set(PROJECT_SOURCES + components/definitioncard/definitioncardsection.cpp + components/definitioncard/definitioncardwidget.cpp + components/definitioncard/definitioncontentwidget.cpp + components/definitioncard/definitionheaderwidget.cpp + components/dictionarylist/dictionarylistdelegate.cpp + components/dictionarylist/dictionarylistmodel.cpp + components/dictionarylist/dictionarylistview.cpp + components/entrysearchresult/resultlistdelegate.cpp + components/entrysearchresult/resultlistmodel.cpp + components/entrysearchresult/resultlistview.cpp + components/entryview/entryactionwidget.cpp + components/entryview/entrycontentwidget.cpp + components/entryview/entryheaderwidget.cpp + components/entryview/entryscrollarea.cpp + components/entryview/entryscrollareawidget.cpp + components/entryview/entryviewsentencecardsection.cpp + components/favouritewindow/favouritesplitter.cpp + components/historyview/searchhistorylistdelegate.cpp + components/historyview/searchhistorylistmodel.cpp + components/historyview/searchhistorylistview.cpp + components/historyview/searchhistorytab.cpp + components/historyview/viewhistorylistdelegate.cpp + components/historyview/viewhistorylistmodel.cpp + components/historyview/viewhistorylistview.cpp + components/historyview/viewhistorytab.cpp + components/layouts/flowlayout.cpp + components/magnifywindow/magnifyscrollarea.cpp + components/magnifywindow/magnifyscrollareawidget.cpp + components/mainwindow/mainsplitter.cpp + components/mainwindow/maintoolbar.cpp + components/mainwindow/searchlineedit.cpp + components/mainwindow/searchoptionsradiogroupbox.cpp + components/related/relatedbutton.cpp + components/related/relatedbuttoncontentwidget.cpp + components/related/relatedbuttonheaderwidget.cpp + components/related/relatedsection.cpp + components/sentencecard/loadingwidget.cpp + components/sentencecard/sentencecardwidget.cpp + components/sentencecard/sentencecontentwidget.cpp + components/sentencecard/sentenceheaderwidget.cpp + components/sentencesearchresult/sentenceresultlistdelegate.cpp + components/sentencesearchresult/sentenceresultlistmodel.cpp + components/sentencesearchresult/sentenceresultlistview.cpp + components/sentenceview/sentencescrollarea.cpp + components/sentenceview/sentencescrollareawidget.cpp + components/sentenceview/sentenceviewcontentwidget.cpp + components/sentenceview/sentenceviewheaderwidget.cpp + components/sentenceview/sentenceviewsentencecardsection.cpp + components/sentencewindow/sentencesplitter.cpp + components/settings/advancedtab.cpp + components/settings/contacttab.cpp + components/settings/dictionarytab.cpp + components/settings/settingstab.cpp + components/settings/texttab.cpp + dialogs/defaultdialog.cpp + dialogs/dictionarytabfailuredialog.cpp + dialogs/downloadaudiodialog.cpp + dialogs/downloadresultdialog.cpp + dialogs/entryspeakerrordialog.cpp + dialogs/exportdatabasedialog.cpp + dialogs/noupdatedialog.cpp + dialogs/overwriteconflictingdictionarydialog.cpp + dialogs/resetsettingsdialog.cpp + dialogs/restoredatabasedialog.cpp + logic/database/queryparseutils.cpp + logic/database/sqldatabasemanager.cpp + logic/database/sqldatabaseutils.cpp + logic/database/sqluserdatautils.cpp + logic/database/sqluserhistoryutils.cpp + logic/dictionary/dictionarymetadata.cpp + logic/dictionary/dictionarysource.cpp + logic/download/downloader.cpp + logic/entry/definitionsset.cpp + logic/entry/entry.cpp + logic/entry/entryspeaker.cpp + logic/search/searchoptionsmediator.cpp + logic/search/sqlsearch.cpp + logic/sentence/sentenceset.cpp + logic/sentence/sourcesentence.cpp + logic/settings/settings.cpp + logic/settings/settingsutils.cpp + logic/update/jyutdictionaryreleasechecker.cpp + logic/utils/chineseutils.cpp + logic/utils/scriptdetector.cpp + logic/utils/utils.cpp + logic/utils/utils_qt.cpp + main.cpp + windows/aboutwindow.cpp + windows/historywindow.cpp + windows/mainwindow.cpp + windows/settingswindow.cpp + windows/updatewindow.cpp + ${TS_FILES} +) + +include_directories( + ${CMAKE_SOURCE_DIR} +) + +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + qt_add_executable(CantoneseDictionary + MANUAL_FINALIZATION + ${PROJECT_SOURCES} + resources/resource.qrc + ) + +# qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) +else() + add_executable(CantoneseDictionary + ${PROJECT_SOURCES} + resources/resource.qrc + ) + +# qt5_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) +endif() + +target_link_libraries(CantoneseDictionary + PRIVATE Qt${QT_VERSION_MAJOR}::Widgets + PRIVATE Qt${QT_VERSION_MAJOR}::Multimedia + PRIVATE Qt${QT_VERSION_MAJOR}::Network + PRIVATE Qt${QT_VERSION_MAJOR}::Sql + PRIVATE Qt${QT_VERSION_MAJOR}::Svg + PRIVATE Qt${QT_VERSION_MAJOR}::TextToSpeech + PRIVATE KF5::Archive +) + +add_subdirectory( + logic/utils/test/TestChineseUtils +) +add_subdirectory( + logic/utils/test/TestScriptDetector +) + +set_target_properties(CantoneseDictionary PROPERTIES + MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/platform/mac/Info.plist + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +if (APPLE) + target_link_libraries(CantoneseDictionary PRIVATE "-framework AppKit") + TARGET_SOURCES(CantoneseDictionary + PRIVATE logic/utils/utils_mac.mm + PRIVATE resources/db/dict.db + PRIVATE resources/db/user.db + PRIVATE resources/licenses/FLOW_LAYOUT_LICENSE.txt + PRIVATE resources/settings/settings.ini + PRIVATE resources/icon/icon.icns + PRIVATE platform/mac/en.lproj/InfoPlist.strings + PRIVATE platform/mac/fr.lproj/InfoPlist.strings + PRIVATE platform/mac/yue_Hans.lproj/InfoPlist.strings + PRIVATE platform/mac/yue_Hant.lproj/InfoPlist.strings + PRIVATE platform/mac/zh_Hans.lproj/InfoPlist.strings + PRIVATE platform/mac/zh_Hant.lproj/InfoPlist.strings) + + set_property(SOURCE resources/db/dict.db PROPERTY MACOSX_PACKAGE_LOCATION "Resources") + set_property(SOURCE resources/db/user.db PROPERTY MACOSX_PACKAGE_LOCATION "Resources") + set_property(SOURCE resources/licenses/FLOW_LAYOUT_LICENSE.txt PROPERTY MACOSX_PACKAGE_LOCATION "Resources/Licenses") + set_property(SOURCE resources/settings/settings.ini PROPERTY MACOSX_PACKAGE_LOCATION "Resources") + set_property(SOURCE resources/icon/icon.icns PROPERTY MACOSX_PACKAGE_LOCATION "Resources") + set_property(SOURCE platform/mac/en.lproj/InfoPlist.strings PROPERTY MACOSX_PACKAGE_LOCATION "Resources/en.lproj") + set_property(SOURCE platform/mac/fr.lproj/InfoPlist.strings PROPERTY MACOSX_PACKAGE_LOCATION "Resources/fr.lproj") + set_property(SOURCE platform/mac/yue_Hans.lproj/InfoPlist.strings PROPERTY MACOSX_PACKAGE_LOCATION "Resources/yue-Hans.lproj") + set_property(SOURCE platform/mac/yue_Hant.lproj/InfoPlist.strings PROPERTY MACOSX_PACKAGE_LOCATION "Resources/yue-Hant.lproj") + set_property(SOURCE platform/mac/zh_Hans.lproj/InfoPlist.strings PROPERTY MACOSX_PACKAGE_LOCATION "Resources/zh-hans.lproj") + set_property(SOURCE platform/mac/zh_Hant.lproj/InfoPlist.strings PROPERTY MACOSX_PACKAGE_LOCATION "Resources/zh-hant.lproj") +elseif (UNIX) + TARGET_SOURCES(CantoneseDictionary PRIVATE logic/utils/utils_linux.cpp) + configure_file(resources/db/dict.db dict.db COPYONLY) + configure_file(resources/db/user.db user.db COPYONLY) + configure_file(resources/licenses/FLOW_LAYOUT_LICENSE.txt FLOW_LAYOUT_LICENSE.txt COPYONLY) + configure_file(resources/settings/settings.ini settings.ini COPYONLY) +elseif (WIN32) + enable_language("RC") + TARGET_SOURCES(CantoneseDictionary PRIVATE + logic/utils/utils_windows.cpp + platform/windows/app.rc) + configure_file(resources/db/dict.db dict.db COPYONLY) + configure_file(resources/db/user.db user.db COPYONLY) + configure_file(resources/licenses/FLOW_LAYOUT_LICENSE.txt FLOW_LAYOUT_LICENSE.txt COPYONLY) + configure_file(resources/settings/settings.ini settings.ini COPYONLY) +endif() + +install(TARGETS CantoneseDictionary + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +if(QT_VERSION_MAJOR EQUAL 6) + qt_finalize_executable(test) +endif() + diff --git a/src/jyut-dict/jyut-dict.pro b/src/jyut-dict/jyut-dict.pro deleted file mode 100644 index c36cae0c..00000000 --- a/src/jyut-dict/jyut-dict.pro +++ /dev/null @@ -1,370 +0,0 @@ -#------------------------------------------------- -# -# Project created by QtCreator 2018-10-19T02:04:51 -# -#------------------------------------------------- - -QT += core gui network sql svg multimedia texttospeech widgets KArchive -QMAKE_MACOSX_DEPLOYMENT_TARGET = 11.0 - -TARGET = "Jyut Dictionary" -TEMPLATE = app - -VERSION = 2.23.04.08 -QMAKE_TARGET_COMPANY = "Aaron Tan" -QMAKE_TARGET_PRODUCT = "Jyut Dictionary" -QMAKE_TARGET_DESCRIPTION = "Jyut Dictionary" -QMAKE_TARGET_COPYRIGHT = "Aaron Tan, 2023" - -# The following define makes your compiler emit warnings if you use -# any feature of Qt which has been marked as deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. -DEFINES += QT_DEPRECATED_WARNINGS - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 - -CONFIG += c++17 - -QMAKE_CXXFLAGS += "-Wno-implicit-fallthrough" - -SOURCES += \ - components/definitioncard/definitioncardsection.cpp \ - components/definitioncard/definitioncardwidget.cpp \ - components/definitioncard/definitioncontentwidget.cpp \ - components/definitioncard/definitionheaderwidget.cpp \ - components/dictionarylist/dictionarylistdelegate.cpp \ - components/dictionarylist/dictionarylistmodel.cpp \ - components/dictionarylist/dictionarylistview.cpp \ - components/entrysearchresult/resultlistdelegate.cpp \ - components/entrysearchresult/resultlistmodel.cpp \ - components/entrysearchresult/resultlistview.cpp \ - components/entryview/entryactionwidget.cpp \ - components/entryview/entrycontentwidget.cpp \ - components/entryview/entryheaderwidget.cpp \ - components/entryview/entryscrollarea.cpp \ - components/entryview/entryscrollareawidget.cpp \ - components/entryview/entryviewsentencecardsection.cpp \ - components/favouritewindow/favouritesplitter.cpp \ - components/historyview/searchhistorylistdelegate.cpp \ - components/historyview/searchhistorylistmodel.cpp \ - components/historyview/searchhistorylistview.cpp \ - components/historyview/searchhistorytab.cpp \ - components/historyview/viewhistorylistdelegate.cpp \ - components/historyview/viewhistorylistmodel.cpp \ - components/historyview/viewhistorylistview.cpp \ - components/historyview/viewhistorytab.cpp \ - components/layouts/flowlayout.cpp \ - components/magnifywindow/magnifyscrollarea.cpp \ - components/magnifywindow/magnifyscrollareawidget.cpp \ - components/mainwindow/mainsplitter.cpp \ - components/mainwindow/maintoolbar.cpp \ - components/mainwindow/searchlineedit.cpp \ - components/mainwindow/searchoptionsradiogroupbox.cpp \ - components/related/relatedbutton.cpp \ - components/related/relatedbuttoncontentwidget.cpp \ - components/related/relatedbuttonheaderwidget.cpp \ - components/related/relatedsection.cpp \ - components/sentencecard/loadingwidget.cpp \ - components/sentencecard/sentencecardwidget.cpp \ - components/sentencecard/sentencecontentwidget.cpp \ - components/sentencecard/sentenceheaderwidget.cpp \ - components/sentencesearchresult/sentenceresultlistdelegate.cpp \ - components/sentencesearchresult/sentenceresultlistmodel.cpp \ - components/sentencesearchresult/sentenceresultlistview.cpp \ - components/sentenceview/sentencescrollarea.cpp \ - components/sentenceview/sentencescrollareawidget.cpp \ - components/sentenceview/sentenceviewcontentwidget.cpp \ - components/sentenceview/sentenceviewheaderwidget.cpp \ - components/sentenceview/sentenceviewsentencecardsection.cpp \ - components/sentencewindow/sentencesplitter.cpp \ - components/settings/advancedtab.cpp \ - components/settings/contacttab.cpp \ - components/settings/dictionarytab.cpp \ - components/settings/settingstab.cpp \ - components/settings/texttab.cpp \ - dialogs/defaultdialog.cpp \ - dialogs/dictionarytabfailuredialog.cpp \ - dialogs/downloadaudiodialog.cpp \ - dialogs/downloadresultdialog.cpp \ - dialogs/entryspeakerrordialog.cpp \ - dialogs/exportdatabasedialog.cpp \ - dialogs/noupdatedialog.cpp \ - dialogs/overwriteconflictingdictionarydialog.cpp \ - dialogs/resetsettingsdialog.cpp \ - dialogs/restoredatabasedialog.cpp \ - logic/database/queryparseutils.cpp \ - logic/database/sqldatabasemanager.cpp \ - logic/database/sqldatabaseutils.cpp \ - logic/database/sqluserdatautils.cpp \ - logic/database/sqluserhistoryutils.cpp \ - logic/dictionary/dictionarymetadata.cpp \ - logic/dictionary/dictionarysource.cpp \ - logic/download/downloader.cpp \ - logic/entry/definitionsset.cpp \ - logic/entry/entry.cpp \ - logic/entry/entryspeaker.cpp \ - logic/search/searchoptionsmediator.cpp \ - logic/search/sqlsearch.cpp \ - logic/sentence/sentenceset.cpp \ - logic/sentence/sourcesentence.cpp \ - logic/settings/settings.cpp \ - logic/settings/settingsutils.cpp \ - logic/update/jyutdictionaryreleasechecker.cpp \ - logic/utils/chineseutils.cpp \ - logic/utils/scriptdetector.cpp \ - logic/utils/utils.cpp \ - logic/utils/utils_qt.cpp \ - main.cpp \ - windows/aboutwindow.cpp \ - windows/historywindow.cpp \ - windows/mainwindow.cpp \ - windows/settingswindow.cpp \ - windows/updatewindow.cpp - -HEADERS += \ - components/definitioncard/definitioncardsection.h \ - components/definitioncard/definitioncardwidget.h \ - components/definitioncard/definitioncontentwidget.h \ - components/definitioncard/definitionheaderwidget.h \ - components/definitioncard/icardheaderwidget.h \ - components/dictionarylist/dictionarylistdelegate.h \ - components/dictionarylist/dictionarylistmodel.h \ - components/dictionarylist/dictionarylistview.h \ - components/entrysearchresult/resultlistdelegate.h \ - components/entrysearchresult/resultlistmodel.h \ - components/entrysearchresult/resultlistview.h \ - components/entryview/entryactionwidget.h \ - components/entryview/entrycontentwidget.h \ - components/entryview/entryheaderwidget.h \ - components/entryview/entryscrollarea.h \ - components/entryview/entryscrollareawidget.h \ - components/entryview/entryviewsentencecardsection.h \ - components/favouritewindow/favouritesplitter.h \ - components/historyview/searchhistorylistdelegate.h \ - components/historyview/searchhistorylistmodel.h \ - components/historyview/searchhistorylistview.h \ - components/historyview/searchhistorytab.h \ - components/historyview/viewhistorylistdelegate.h \ - components/historyview/viewhistorylistmodel.h \ - components/historyview/viewhistorylistview.h \ - components/historyview/viewhistorytab.h \ - components/layouts/flowlayout.h \ - components/magnifywindow/magnifyscrollarea.h \ - components/magnifywindow/magnifyscrollareawidget.h \ - components/mainwindow/isearchlineedit.h \ - components/mainwindow/mainsplitter.h \ - components/mainwindow/maintoolbar.h \ - components/mainwindow/searchlineedit.h \ - components/mainwindow/searchoptionsradiogroupbox.h \ - components/related/relatedbutton.h \ - components/related/relatedbuttoncontentwidget.h \ - components/related/relatedbuttonheaderwidget.h \ - components/related/relatedsection.h \ - components/sentencecard/loadingwidget.h \ - components/sentencecard/sentencecardwidget.h \ - components/sentencecard/sentencecontentwidget.h \ - components/sentencecard/sentenceheaderwidget.h \ - components/sentencesearchresult/sentenceresultlistdelegate.h \ - components/sentencesearchresult/sentenceresultlistmodel.h \ - components/sentencesearchresult/sentenceresultlistview.h \ - components/sentenceview/sentencescrollarea.h \ - components/sentenceview/sentencescrollareawidget.h \ - components/sentenceview/sentenceviewcontentwidget.h \ - components/sentenceview/sentenceviewheaderwidget.h \ - components/sentenceview/sentenceviewsentencecardsection.h \ - components/sentencewindow/sentencesplitter.h \ - components/settings/advancedtab.h \ - components/settings/contacttab.h \ - components/settings/dictionarytab.h \ - components/settings/settingstab.h \ - components/settings/texttab.h \ - dialogs/defaultdialog.h \ - dialogs/dictionarytabfailuredialog.h \ - dialogs/downloadaudiodialog.h \ - dialogs/downloadresultdialog.h \ - dialogs/entryspeakerrordialog.h \ - dialogs/exportdatabasedialog.h \ - dialogs/noupdatedialog.h \ - dialogs/overwriteconflictingdictionarydialog.h \ - dialogs/resetsettingsdialog.h \ - dialogs/restoredatabasedialog.h \ - logic/database/queryparseutils.h \ - logic/database/sqldatabasemanager.h \ - logic/database/sqldatabaseutils.h \ - logic/database/sqluserdatautils.h \ - logic/database/sqluserhistoryutils.h \ - logic/dictionary/dictionarymetadata.h \ - logic/dictionary/dictionarysource.h \ - logic/download/downloader.h \ - logic/entry/definitionsset.h \ - logic/entry/entry.h \ - logic/entry/entrycharactersoptions.h \ - logic/entry/entryphoneticoptions.h \ - logic/entry/entryspeaker.h \ - logic/search/isearch.h \ - logic/search/isearchobservable.h \ - logic/search/isearchobserver.h \ - logic/search/isearchoptionsmediator.h \ - logic/search/searchqueries.h \ - logic/search/searchoptionsmediator.h \ - logic/search/searchparameters.h \ - logic/search/sqlsearch.h \ - logic/sentence/sentenceset.h \ - logic/sentence/sourcesentence.h \ - logic/settings/settings.h \ - logic/settings/settingsutils.h \ - logic/strings/strings.h \ - logic/update/iupdatechecker.h \ - logic/update/jyutdictionaryreleasechecker.h \ - logic/utils/chineseutils.h \ - logic/utils/qvariantutils.h \ - logic/utils/scriptdetector.h \ - logic/utils/utils.h \ - logic/utils/utils_qt.h \ - windows/aboutwindow.h \ - windows/historywindow.h \ - windows/mainwindow.h \ - windows/settingswindow.h \ - windows/updatewindow.h - -RESOURCES += \ - resources/resource.qrc - -TRANSLATIONS += \ - resources/translations/jyutdictionary-en.ts \ - resources/translations/jyutdictionary-fr.ts \ - resources/translations/jyutdictionary-fr_CA.ts \ - resources/translations/jyutdictionary-yue_Hans.ts \ - resources/translations/jyutdictionary-yue_Hant.ts \ - resources/translations/jyutdictionary-zh_Hans.ts \ - resources/translations/jyutdictionary-zh_Hant.ts \ - resources/translations/jyutdictionary-zh_Hans_HK.ts \ - resources/translations/jyutdictionary-zh_Hant_HK.ts - -macx: { - LIBS += -framework AppKit - OBJECTIVE_SOURCES += logic/utils/utils_mac.mm - HEADERS += logic/utils/utils_mac.h - - ICON = resources/icon/icon.icns - QMAKE_INFO_PLIST = platform/mac/Info.plist - - # Adds files to the Resources folder in macOS bundle - APP_DB_FILES.files = resources/db/dict.db - APP_DB_FILES.files += resources/db/user.db - APP_DB_FILES.path = Contents/Resources - QMAKE_BUNDLE_DATA += APP_DB_FILES - - # Add settings to Resources folder in macOS bundle - APP_SETTINGS_FILES.files = resources/settings/settings.ini - APP_SETTINGS_FILES.path = Contents/Resources - QMAKE_BUNDLE_DATA += APP_SETTINGS_FILES - - # Add licenses to Resources folder in macOS bundle - FLOW_LAYOUT_LICENSE_FILES.files = resources/licenses/FLOW_LAYOUT_LICENSE.txt - FLOW_LAYOUT_LICENSE_FILES.path = Contents/Resources/licenses - QMAKE_BUNDLE_DATA += FLOW_LAYOUT_LICENSE_FILES - - # Add translations of application name - TRANSLATE_en.files = platform/mac/en.lproj/InfoPlist.strings - TRANSLATE_en.path = Contents/Resources/en.lproj - QMAKE_BUNDLE_DATA += TRANSLATE_en - - TRANSLATE_fr.files = platform/mac/fr.lproj/InfoPlist.strings - TRANSLATE_fr.path = Contents/Resources/fr.lproj - QMAKE_BUNDLE_DATA += TRANSLATE_fr - - TRANSLATE_yue_Hans.files = platform/mac/yue_Hans.lproj/InfoPlist.strings - TRANSLATE_yue_Hans.path = Contents/Resources/yue-Hans.lproj - QMAKE_BUNDLE_DATA += TRANSLATE_yue_Hans - - TRANSLATE_yue_Hant.files = platform/mac/yue_Hant.lproj/InfoPlist.strings - TRANSLATE_yue_Hant.path = Contents/Resources/yue-Hant.lproj - QMAKE_BUNDLE_DATA += TRANSLATE_yue_Hant - - TRANSLATE_zh_Hans.files = platform/mac/zh_Hans.lproj/InfoPlist.strings - TRANSLATE_zh_Hans.path = Contents/Resources/zh-Hans.lproj - QMAKE_BUNDLE_DATA += TRANSLATE_zh_Hans - - TRANSLATE_zh_Hant.files = platform/mac/zh_Hant.lproj/InfoPlist.strings - TRANSLATE_zh_Hant.path = Contents/Resources/zh-Hant.lproj - QMAKE_BUNDLE_DATA += TRANSLATE_zh_Hant -} - -win32: { - # Prevent creation of release and debug folders in build directory - SOURCES += logic/utils/utils_windows.cpp - HEADERS += logic/utils/utils_windows.h - - CONFIG -= debug_and_release debug_and_release_target - RC_ICONS = resources/icon/icon.ico -} - -unix:!macx { - SOURCES += logic/utils/utils_linux.cpp - HEADERS += logic/utils/utils_linux.h - - # Move files to appropriate locations on desktop to install the program - binfile.extra = cp \"$$system_path($$OUT_PWD)/Jyut Dictionary\" $$system_path($$OUT_PWD)/jyut-dict - binfile.files += $$system_path($$OUT_PWD)/jyut-dict - binfile.path = /usr/bin/ - binfile.CONFIG += no_check_exist - dictfile.files += resources/db/dict.db - dictfile.path = /usr/share/jyut-dict/dictionaries/ - userfile.files += resources/db/user.db - userfile.path = /usr/share/jyut-dict/dictionaries/ - flowlayoutlicensefile.files += resources/licenses/FLOW_LAYOUT_LICENSE.txt - flowlayoutlicensefile.path = /usr/share/jyut-dict/licenses/ - shortcutfiles.files += platform/linux/jyut-dict.desktop - shortcutfiles.path = /usr/share/applications/ - icon.files += resources/icon/jyut-dict.svg - icon.path = /usr/share/icons/hicolor/scalable/apps/ - INSTALLS += binfile - INSTALLS += dictfile - INSTALLS += userfile - INSTALLS += flowlayoutlicensefile - INSTALLS += shortcutfiles - INSTALLS += icon -} - -unix|win32:!macx { - # Copy dictionary database to the build directory - DICTFILES = $$files($${PWD}/resources/db/dict.db) - DICTFILES += $$files($${PWD}/resources/db/user.db) - - copy_files.name = copy dictionary files - copy_files.input = DICTFILES - copy_files.output = $${OUT_PWD}/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} - copy_files.commands = ${COPY_FILE} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} - copy_files.CONFIG += no_link target_predeps - - QMAKE_EXTRA_COMPILERS += copy_files - - # Copy licenses to build directory - LICENSEFILES = $$files($${PWD}/resources/licenses/FLOW_LAYOUT_LICENSE.txt) - copy_licenses.name = copy licenses - copy_licenses.input = LICENSEFILES - copy_licenses.output = $${OUT_PWD}/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} - copy_licenses.commands = ${COPY_FILE} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} - copy_licenses.CONFIG += no_link target_predeps - - QMAKE_EXTRA_COMPILERS += copy_licenses - - # Copy settings file to build directory - SETTINGSFILES = $$files($${PWD}/resources/settings/settings.ini) - copy_settings.name = copy settings - copy_settings.input = SETTINGSFILES - copy_settings.output = $${OUT_PWD}/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} - copy_settings.commands = ${COPY_FILE} ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT} - copy_settings.CONFIG += no_link target_predeps - - QMAKE_EXTRA_COMPILERS += copy_settings -} - -DISTFILES += \ - resources/images/chevron-down_inverted.png \ - resources/images/chevron-up_inverted.png diff --git a/src/jyut-dict/platform/mac/Info.plist b/src/jyut-dict/platform/mac/Info.plist index 84bb7c61..fcc66fd1 100644 --- a/src/jyut-dict/platform/mac/Info.plist +++ b/src/jyut-dict/platform/mac/Info.plist @@ -9,7 +9,7 @@ CFBundleIdentifier com.aaronhktan.cantonesedictionary CFBundleExecutable - MacOS/Jyut Dictionary + MacOS/CantoneseDictionary CFBundleIconFile icon.icns CFBundleInfoDictionaryVersion diff --git a/src/jyut-dict/platform/windows/app.rc b/src/jyut-dict/platform/windows/app.rc new file mode 100644 index 00000000..c3c13047 --- /dev/null +++ b/src/jyut-dict/platform/windows/app.rc @@ -0,0 +1,2 @@ + +IDI_ICON1 ICON "icon.ico" \ No newline at end of file diff --git a/src/jyut-dict/platform/windows/icon.ico b/src/jyut-dict/platform/windows/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f54d93b8b45573dfba7bfbfbceba70b9c7c461f4 GIT binary patch literal 120243 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 literal 0 HcmV?d00001