diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 70fd667..8c1f79a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,8 +17,8 @@ on: - develop jobs: - linux-qt5: - uses: lirios/.github/.github/workflows/build-linux-qt5.yml@master + linux-qt6: + uses: lirios/.github/.github/workflows/build-linux-qt6.yml@master with: build_dependencies: "cmake-shared fluid" windows: diff --git a/CMakeLists.txt b/CMakeLists.txt index 0505c1a..5956701 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.10.0) +cmake_minimum_required(VERSION 3.19) project("Calculator" VERSION "1.3.0" @@ -6,34 +6,15 @@ project("Calculator" LANGUAGES CXX C ) -## Shared macros and functions: -if(CALCULATOR_WITH_FLUID AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/fluid/CMakeLists.txt") - set(LIRI_LOCAL_ECM TRUE) - set(FLUID_WITH_DOCUMENTATION FALSE) - set(FLUID_WITH_DEMO FALSE) -endif() -if(LIRI_LOCAL_ECM) - list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/fluid/cmake/shared/modules") -else() - find_package(LiriCMakeShared "2.0.0" REQUIRED NO_MODULE) - list(APPEND CMAKE_MODULE_PATH "${LCS_MODULE_PATH}") -endif() +## Enable C++17: +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) -## Set minimum versions required. -set(QT_MIN_VERSION "5.10.0") - -## Liri specific setup common for all modules: -include(LiriSetup) - -## Features: -option(CALCULATOR_WITH_FLUID "Build together with Fluid" OFF) -add_feature_info("Calculator::WithFluid" CALCULATOR_WITH_FLUID "Build together with Fluid") - -## Find Qt 5. -find_package(Qt5 "${QT_MIN_VERSION}" - CONFIG REQUIRED - COMPONENTS +## Find Qt: +find_package(Qt6 + REQUIRED COMPONENTS Core + Core5Compat Gui Widgets Svg @@ -42,10 +23,8 @@ find_package(Qt5 "${QT_MIN_VERSION}" QuickControls2 LinguistTools ) +qt_standard_project_setup(REQUIRES 6.6) ## Add subdirectories: -if(CALCULATOR_WITH_FLUID) - add_subdirectory(fluid) -endif() add_subdirectory(data) add_subdirectory(src) diff --git a/README.md b/README.md index 365bf4f..3016dc4 100644 --- a/README.md +++ b/README.md @@ -13,17 +13,15 @@ A cross-platform material design calculator. ## Dependencies -Qt >= 5.10.0 with at least the following modules is required: +Qt >= 6.6 with at least the following modules is required: * [qtbase](http://code.qt.io/cgit/qt/qtbase.git) * [qtdeclarative](http://code.qt.io/cgit/qt/qtdeclarative.git) - * [qtquickcontrols2](http://code.qt.io/cgit/qt/qtquickcontrols2.git) The following modules and their dependencies are required: - * [cmake](https://gitlab.kitware.com/cmake/cmake) >= 3.10.0 - * [cmake-shared](https://github.com/lirios/cmake-shared.git) >= 1.0.0 - * [fluid](https://github.com/lirios/fluid.git) >= 1.0.0 + * [cmake](https://gitlab.kitware.com/cmake/cmake) >= 3.19.0 + * [fluid](https://github.com/lirios/fluid.git) >= 2.0.0 ## Installation @@ -38,10 +36,6 @@ make install # use sudo if necessary Replace `/path/to/prefix` to your installation prefix. Default is `/usr/local`. -You can also append the following options to the `cmake` command: - - * `-DCALCULATOR_WITH_FLUID:BOOL=ON`: Build with a local copy of the Fluid sources. - ## Licensing Licensed under the terms of the GNU General Public License version 3 or, at your option, any later version. diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt index d7dddc2..2838e11 100644 --- a/data/CMakeLists.txt +++ b/data/CMakeLists.txt @@ -6,7 +6,10 @@ if(UNIX AND NOT APPLE AND NOT ANDROID) get_filename_component(icon_directory "${icon_basename}" DIRECTORY) string(REPLACE "${icon_directory}/" "" icon_filename "${icon_basename}") string(REGEX REPLACE "\.(png|svg)" "" icon_filename "${icon_filename}") - set(dest_path "${INSTALL_DATADIR}/icons/hicolor/${icon_directory}/") + set(dest_path "${CMAKE_INSTALL_DATADIR}/icons/hicolor/${icon_directory}/") install(FILES "${source_path}" DESTINATION "${dest_path}") endforeach() endif() + +install(FILES io.liri.Calculator.appdata.xml DESTINATION "${CMAKE_INSTALL_DATADIR}/appdata") +install(FILES io.liri.Calculator.desktop DESTINATION "${CMAKE_INSTALL_DATADIR}/applications") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7c1d67c..0cfb527 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,53 +1,66 @@ -# Translations -file(GLOB LiriCalculator_TRANSLATIONS "${CMAKE_SOURCE_DIR}/translations/*_*.ts") -qt5_add_translation(LiriCalculator_QM_FILES ${LiriCalculator_TRANSLATIONS}) -if(WIN32) - set(_translations_destdir "${CMAKE_CURRENT_BINARY_DIR}/translations") -elseif(APPLE) - set(_translations_destdir "${CMAKE_CURRENT_BINARY_DIR}/Contents/Resources/data/translations") -elseif(LINUX OR BSD) - set(_translations_destdir "${INSTALL_DATADIR}/liri-calculator/translations") -endif() -if(DEFINED _translations_destdir) - install(FILES ${LiriCalculator_QM_FILES} DESTINATION "${_translations_destdir}") -endif() +qt_add_executable(LiriCalculator + WIN32 MACOSX_BUNDLE + main/main.cpp + filehandler/filehandler.cpp filehandler/filehandler.h +) + +qt_add_qml_module(LiriCalculator + URI Application + VERSION 2.0 + QML_FILES + engine/qmldir + engine/math.js + engine/MathJs.qml + ui/qmldir + ui/ButtonsPanel.qml + ui/ButtonsView.qml + ui/CalculationLine.qml + ui/CalculationZone.qml + ui/HistoryPanel.qml + ui/Main.qml + ui/NavButton.qml + ui/Shortcuts.qml + ui/Styles.qml + RESOURCES + icons/icon.png +) + +target_compile_definitions(LiriCalculator PRIVATE + QT_NO_CAST_FROM_ASCII + QT_NO_FOREACH +) + +file(GLOB ts_files "../translations/*.ts") +qt_add_translations(LiriCalculator + TS_FILES ${ts_files} + RESOURCE_PREFIX /qt/qml/Application/i18n +) + +target_link_libraries(LiriCalculator + PRIVATE + Qt6::Core + Qt6::Core5Compat + Qt6::Gui + Qt6::Widgets + Qt6::Qml + Qt6::Quick + Qt6::QuickControls2 +) if(APPLE OR WIN32) - set(LiriCalculator_OUTPUT_NAME "LiriCalculator") + set_target_properties(LiriCalculator PROPERTIES OUTPUT_NAME "LiriCalculator") else() - set(LiriCalculator_OUTPUT_NAME "liri-calculator") + set_target_properties(LiriCalculator PROPERTIES OUTPUT_NAME "liri-calculator") +endif() +if(APPLE) + set_target_properties(LiriCalculator PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER "io.liri.Calculator" + MACOSX_BUNDLE_ICON_FILE "io.liri.Calculator" + MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}" + ) endif() -liri_add_executable(LiriCalculator - OUTPUT_NAME - "${LiriCalculator_OUTPUT_NAME}" - SOURCES - main/main.cpp - filehandler/filehandler.cpp - filehandler/filehandler.h - ${LiriCalculator_QM_FILES} - RESOURCES - calculator.qrc - DEFINES - QT_NO_CAST_FROM_ASCII - QT_NO_FOREACH - APPDATA - "${CMAKE_CURRENT_SOURCE_DIR}/../data/io.liri.Calculator.appdata.xml" - DESKTOP - "${CMAKE_CURRENT_SOURCE_DIR}/../data/io.liri.Calculator.desktop" - LIBRARIES - Qt5::Core - Qt5::Gui - Qt5::Widgets - Qt5::Qml - Qt5::Quick - Qt5::QuickControls2 - GUI +install(TARGETS LiriCalculator + BUNDLE DESTINATION . + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) -set_target_properties(LiriCalculator PROPERTIES - MACOSX_BUNDLE_GUI_IDENTIFIER "io.liri.Calculator" - MACOSX_BUNDLE_ICON_FILE "io.liri.Calculator" - MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION}" -) - -liri_finalize_executable(LiriCalculator) diff --git a/src/calculator.qrc b/src/calculator.qrc deleted file mode 100644 index 6b6395a..0000000 --- a/src/calculator.qrc +++ /dev/null @@ -1,18 +0,0 @@ - - - engine/math.js - engine/MathJs.qml - engine/qmldir - icons/icon.png - ui/ButtonsPanel.qml - ui/ButtonsView.qml - ui/CalculationLine.qml - ui/CalculationZone.qml - ui/HistoryPanel.qml - ui/Main.qml - ui/NavButton.qml - ui/qmldir - ui/Shortcuts.qml - ui/Styles.qml - - diff --git a/src/filehandler/filehandler.cpp b/src/filehandler/filehandler.cpp index fd62659..33c0f32 100644 --- a/src/filehandler/filehandler.cpp +++ b/src/filehandler/filehandler.cpp @@ -54,7 +54,8 @@ void FileHandler::load(const QUrl &fileUrl) { return; } - const QUrl path = QQmlFileSelector::get(engine)->selector()->select(fileUrl); + QQmlFileSelector* selector = new QQmlFileSelector(engine); + const QUrl path = selector->selector()->select(fileUrl); const QString fileName = QQmlFile::urlToLocalFileOrQrc(path); if (QFile::exists(fileName)) { QFile file(fileName); @@ -102,3 +103,5 @@ QTextDocument *FileHandler::textDocument() const { return m_document->textDocument(); } + +#include "moc_filehandler.cpp" diff --git a/src/main/main.cpp b/src/main/main.cpp index 8d49a40..8b14787 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -35,43 +35,30 @@ #include "../filehandler/filehandler.h" +using namespace Qt::StringLiterals; + int main(int argc, char *argv[]) { // Set Material Design QtQuick Controls 2 style QQuickStyle::setStyle(QStringLiteral("Material")); - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - QApplication app(argc, argv); app.setOrganizationName(QStringLiteral("Liri")); app.setOrganizationDomain(QStringLiteral("liri.io")); app.setApplicationName(QStringLiteral("Calculator")); - app.setDesktopFileName(QStringLiteral("io.liri.Calculator.desktop")); - app.setWindowIcon(QIcon(QStringLiteral("qrc:/icons/icon.png"))); + app.setDesktopFileName(QStringLiteral("io.liri.Calculator")); + app.setWindowIcon(QIcon(QStringLiteral(":/qt/icons/icon.png"))); - // Load Translations + // Load Qt translations QTranslator qtTranslator; - qtTranslator.load(QStringLiteral("qt_") + QLocale::system().name(), - QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - app.installTranslator(&qtTranslator); + if (qtTranslator.load(QLocale(), "qt"_L1, "_"_L1, + QLibraryInfo::path(QLibraryInfo::TranslationsPath))) + app.installTranslator(&qtTranslator); + // Load translations from resources QTranslator translator; -#if (defined Q_OS_LINUX) - const QString translationsPath = QStandardPaths::locate( - QStandardPaths::GenericDataLocation, QStringLiteral("liri-calculator/translations/"), - QStandardPaths::LocateDirectory); -#elif (defined Q_OS_MACOS) - const QString translationsPath = - QDir(QCoreApplication::applicationDirPath()) - .absoluteFilePath(QStringLiteral("../Resources/data/translations/")); -#elif (defined Q_OS_WIN) - const QString translationsPath = QDir(QCoreApplication::applicationDirPath()) - .absoluteFilePath(QStringLiteral("translations/")); -#else -#error "Platform not supported" -#endif - if (translator.load(translationsPath + QStringLiteral("liri-calculator_") + QLocale::system().name())) - app.installTranslator(&translator); + if (translator.load(QLocale(), "liri-calculator"_L1, "_"_L1, ":/qt/qml/Application/i18n"_L1)) + QCoreApplication::installTranslator(&translator); // Set the X11 WM_CLASS so X11 desktops can find the desktop file qputenv("RESOURCE_NAME", "io.liri.Calculator"); @@ -87,11 +74,16 @@ int main(int argc, char *argv[]) qmlRegisterType("filehandler", 1, 0, "FileHandler"); + // Quit on error + QObject::connect(&engine, &QQmlApplicationEngine::objectCreationFailed, + QCoreApplication::instance(), QCoreApplication::quit, + Qt::QueuedConnection); + // setup qml imports engine.addImportPath(QStringLiteral("qrc:/")); // load main ui - engine.load(QUrl(QStringLiteral("qrc:/ui/Main.qml"))); + engine.loadFromModule("Application", "Main"); return app.exec(); } diff --git a/src/ui/ButtonsPanel.qml b/src/ui/ButtonsPanel.qml index 4cd9c0d..1e02b79 100644 --- a/src/ui/ButtonsPanel.qml +++ b/src/ui/ButtonsPanel.qml @@ -21,11 +21,11 @@ * $END_LICENSE$ */ -import QtQuick 2.7 -import QtQuick.Layouts 1.1 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Material 2.0 -import Fluid.Controls 1.0 +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material +import Fluid.Controls import ".." import "../engine" @@ -44,14 +44,14 @@ Rectangle { color: styles.accentColor labels: ['sqrt','exp','log','cos','sin','tan','acos','asin','atan','π','∞','x10^'] targets: ['sqrt(','exp(','log','cos(','sin(','tan(','acos(','asin(','atan(','pi','Infinity','e'] - onButtonClicked: calculationZone.appendToFormula(strToAppend) + onButtonClicked: (strToAppend) => calculationZone.appendToFormula(strToAppend) } ButtonsView { color: Material.color(Material.Grey, Material.Shade900) labels: ['7', '8', '9', '←', '4', '5', '6', '^', '1', '2', '3', '!', '.', '0', '(', ')'] targets: ['7', '8', '9', 'DEL', '4', '5', '6', '^', '1', '2', '3', '!', '.', '0', '(', ')'] - onButtonClicked: calculationZone.appendToFormula(strToAppend) + onButtonClicked: (strToAppend) => calculationZone.appendToFormula(strToAppend) onButtonLongPressed: { if (strToAppend === "DEL") { calculationZone.clearFormula(); @@ -63,7 +63,7 @@ Rectangle { color: Material.color(Material.Grey, Material.Shade800) labels: ['+', '-', '×', '÷'] targets: ['+', '-', '*', '/'] - onButtonClicked: calculationZone.appendToFormula(strToAppend) + onButtonClicked: (strToAppend) => calculationZone.appendToFormula(strToAppend) } } } diff --git a/src/ui/ButtonsView.qml b/src/ui/ButtonsView.qml index 34248c8..8cc9631 100644 --- a/src/ui/ButtonsView.qml +++ b/src/ui/ButtonsView.qml @@ -21,11 +21,11 @@ * $END_LICENSE$ */ -import QtQuick 2.7 -import QtQuick.Layouts 1.1 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Material 2.0 -import Fluid.Controls 1.0 +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material +import Fluid.Controls import ".." diff --git a/src/ui/CalculationLine.qml b/src/ui/CalculationLine.qml index e840b03..c0f60f9 100644 --- a/src/ui/CalculationLine.qml +++ b/src/ui/CalculationLine.qml @@ -1,9 +1,8 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.3 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Material 2.0 -import Fluid.Controls 1.0 - +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material +import Fluid.Controls Column { width: root.width diff --git a/src/ui/CalculationZone.qml b/src/ui/CalculationZone.qml index 537d432..9eefe98 100644 --- a/src/ui/CalculationZone.qml +++ b/src/ui/CalculationZone.qml @@ -1,9 +1,9 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.3 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Material 2.0 -import Fluid.Controls 1.0 -import Fluid.Effects 1.0 as FluidEffects +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material +import Fluid.Controls +import Fluid.Effects as FluidEffects Rectangle { id: calculationZone diff --git a/src/ui/HistoryPanel.qml b/src/ui/HistoryPanel.qml index 9b8700e..5c7aee6 100644 --- a/src/ui/HistoryPanel.qml +++ b/src/ui/HistoryPanel.qml @@ -21,11 +21,11 @@ * $END_LICENSE$ */ -import QtQuick 2.7 -import QtQuick.Layouts 1.1 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Material 2.0 -import Fluid.Controls 1.0 +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material +import Fluid.Controls import ".." import "../engine" diff --git a/src/ui/Main.qml b/src/ui/Main.qml index 9bf46c0..c89f0f5 100644 --- a/src/ui/Main.qml +++ b/src/ui/Main.qml @@ -21,15 +21,15 @@ * $END_LICENSE$ */ -import QtQuick 2.7 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Material 2.0 -import QtQuick.Controls 2.1 -import Fluid.Controls 1.0 as FluidControls -import Fluid.Controls 1.0 -import Qt.labs.platform 1.0 -import Qt.labs.settings 1.0 -import filehandler 1.0 +import QtCore +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls.Material +import QtQuick.Controls +import Fluid.Controls as FluidControls +import Fluid.Controls +import Qt.labs.platform +import filehandler import ".." import "../engine" diff --git a/src/ui/NavButton.qml b/src/ui/NavButton.qml index d7c00b2..a1ae056 100644 --- a/src/ui/NavButton.qml +++ b/src/ui/NavButton.qml @@ -1,8 +1,8 @@ -import QtQuick 2.7 -import QtQuick.Layouts 1.1 -import QtQuick.Controls 2.0 -import QtQuick.Controls.Material 2.0 -import Fluid.Controls 1.0 as FluidControls +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material +import Fluid.Controls as FluidControls FluidControls.ToolButton { implicitHeight: 40 diff --git a/src/ui/Shortcuts.qml b/src/ui/Shortcuts.qml index 1a2986c..eaea1d7 100644 --- a/src/ui/Shortcuts.qml +++ b/src/ui/Shortcuts.qml @@ -1,4 +1,4 @@ -import QtQuick 2.7 +import QtQuick Item { Shortcut { diff --git a/src/ui/Styles.qml b/src/ui/Styles.qml index 5beb2cc..9852792 100644 --- a/src/ui/Styles.qml +++ b/src/ui/Styles.qml @@ -1,5 +1,5 @@ -import QtQuick 2.0 -import QtQuick.Controls.Material 2.0 +import QtQuick +import QtQuick.Controls.Material Item { // Colors