From d79a7df38930837efc0c40fac3b6c2eab0a322ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E5=AD=90=E6=A5=9A=5Czhuzi?= Date: Mon, 11 Mar 2024 00:02:11 +0800 Subject: [PATCH] update --- CMakeLists.txt | 10 -- example/CMakeLists.txt | 14 +-- example/example.qrc | 8 ++ example/{example_en.ts => example_en_US.ts} | 89 +++++++++-------- example/{example_zh.ts => example_zh_CN.ts} | 83 ++++++++-------- .../qml-Qt6/window/FluentInitalizrWindow.qml | 7 +- example/qml/window/FluentInitalizrWindow.qml | 7 +- example/res/template/App.qml.in | 17 ++++ example/res/template/CMakeLists.txt.in | 90 ++++++++++++++++++ example/res/template/en_US.ts.in | 22 +++++ example/res/template/logo.ico.in | Bin 0 -> 119074 bytes example/res/template/main.cpp.in | 32 +++++++ example/res/template/main.qml.in | 35 +++++++ example/res/template/qml.qrc.in | 7 ++ example/res/template/zh_CN.ts.in | 22 +++++ example/src/helper/InitalizrHelper.cpp | 81 +++++++++++++++- example/src/helper/InitalizrHelper.h | 7 +- example/src/helper/TranslateHelper.cpp | 4 +- src/.cmake/version_dll.rc.in | 21 ++-- src/CMakeLists.txt | 15 +++ 20 files changed, 454 insertions(+), 117 deletions(-) rename example/{example_en.ts => example_en_US.ts} (99%) rename example/{example_zh.ts => example_zh_CN.ts} (99%) create mode 100644 example/res/template/App.qml.in create mode 100644 example/res/template/CMakeLists.txt.in create mode 100644 example/res/template/en_US.ts.in create mode 100644 example/res/template/logo.ico.in create mode 100644 example/res/template/main.cpp.in create mode 100644 example/res/template/main.qml.in create mode 100644 example/res/template/qml.qrc.in create mode 100644 example/res/template/zh_CN.ts.in diff --git a/CMakeLists.txt b/CMakeLists.txt index 67815a6e..f0402239 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,20 +13,10 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/.cmake/) include(GetGitRevisionDescription) option(FLUENTUI_BUILD_EXAMPLES "Build FluentUI demo applications." ON) -option(FLUENTUI_BUILD_STATIC_LIB "Build static library." OFF) find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) -set(QT_SDK_DIR "${Qt${QT_VERSION_MAJOR}_DIR}/../../..") -cmake_path(SET QT_SDK_DIR NORMALIZE ${QT_SDK_DIR}) - -#设置QML插件输出目录,可以通过外部设置,如果外部没有设置就默认到\qml\FluentUI目录下 -set(FLUENTUI_QML_PLUGIN_DIRECTORY "" CACHE PATH "Path to FluentUI plugin") -if(NOT FLUENTUI_QML_PLUGIN_DIRECTORY) - set(FLUENTUI_QML_PLUGIN_DIRECTORY ${QT_SDK_DIR}/qml/FluentUI) -endif() - add_subdirectory(src) #Release也支持日志打印代码位置 diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt index 2fc602c1..c5909e20 100644 --- a/example/CMakeLists.txt +++ b/example/CMakeLists.txt @@ -39,13 +39,13 @@ endif() #国际化 find_program(QT_LUPDATE NAMES lupdate) find_program(QT_LRELEASE NAMES lrelease) -if (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}_en.qm) - execute_process(COMMAND ${QT_LUPDATE} ${CMAKE_CURRENT_LIST_DIR} -ts ${PROJECT_NAME}_en.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) - execute_process(COMMAND ${QT_LRELEASE} ${PROJECT_NAME}_en.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) +if (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}_en_US.qm) + execute_process(COMMAND ${QT_LUPDATE} ${CMAKE_CURRENT_LIST_DIR} -ts ${PROJECT_NAME}_en_US.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + execute_process(COMMAND ${QT_LRELEASE} ${PROJECT_NAME}_en_US.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif () -if (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}_zh.qm) - execute_process(COMMAND ${QT_LUPDATE} ${CMAKE_CURRENT_LIST_DIR} -ts ${PROJECT_NAME}_zh.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) - execute_process(COMMAND ${QT_LRELEASE} ${PROJECT_NAME}_zh.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) +if (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}_zh_CN.qm) + execute_process(COMMAND ${QT_LUPDATE} ${CMAKE_CURRENT_LIST_DIR} -ts ${PROJECT_NAME}_zh_CN.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + execute_process(COMMAND ${QT_LRELEASE} ${PROJECT_NAME}_zh_CN.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) endif () file(GLOB QM_FILE_PATHS ${CMAKE_CURRENT_LIST_DIR}/ *.qm) @@ -86,7 +86,7 @@ if(QT_VERSION VERSION_GREATER_EQUAL "6.2") endforeach(filepath) #遍历所有资源文件 - file(GLOB_RECURSE RES_PATHS *.png *.jpg *.svg *.ico *.ttf *.webp *.obj) + file(GLOB_RECURSE RES_PATHS *.png *.jpg *.svg *.ico *.ttf *.webp *.in) foreach(filepath ${RES_PATHS}) string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" filename ${filepath}) list(APPEND resource_files ${filename}) diff --git a/example/example.qrc b/example/example.qrc index c0cb851a..c0cd9886 100644 --- a/example/example.qrc +++ b/example/example.qrc @@ -198,5 +198,13 @@ qml/window/CrashWindow.qml qml/page/T_SplitLayout.qml qml/window/FluentInitalizrWindow.qml + res/template/CMakeLists.txt.in + res/template/App.qml.in + res/template/logo.ico.in + res/template/main.cpp.in + res/template/main.qml.in + res/template/qml.qrc.in + res/template/en_US.ts.in + res/template/zh_CN.ts.in diff --git a/example/example_en.ts b/example/example_en_US.ts similarity index 99% rename from example/example_en.ts rename to example/example_en_US.ts index dd51edfa..05838b2a 100644 --- a/example/example_en.ts +++ b/example/example_en_US.ts @@ -102,20 +102,25 @@ InitalizrHelper - + The name cannot be empty - + The creation path cannot be empty - + The path does not exist + + + %1 folder already exists + + ItemsFooter @@ -630,9 +635,9 @@ MainWindow - + - + Dark Mode @@ -670,87 +675,87 @@ - + - + Cancel - - + + Open in Separate Window - - + + Click Time - - + + Search + + + + Finish + + - Finish + Next - Next - - - - - Previous - - + + Here you can switch to night mode. - - + + Hide Easter eggs - - + + Try a few more clicks!! + + + + Upgrade Tips + + - Upgrade Tips - - - - - FluentUI is currently up to date - - + + -- The current app version - - + + Now go and download the new version? @@ -759,20 +764,20 @@ Updated content: - - + + OK - - + + The current version is already the latest - - + + The network is abnormal diff --git a/example/example_zh.ts b/example/example_zh_CN.ts similarity index 99% rename from example/example_zh.ts rename to example/example_zh_CN.ts index 5f7ba7f0..ae0df24e 100644 --- a/example/example_zh.ts +++ b/example/example_zh_CN.ts @@ -102,20 +102,25 @@ InitalizrHelper - + The name cannot be empty 名称不能为空 - + The creation path cannot be empty 创建路径不能为空 - + The path does not exist 路径不存在 + + + %1 folder already exists + + ItemsFooter @@ -630,9 +635,9 @@ MainWindow - + - + Dark Mode 夜间模式 @@ -670,87 +675,87 @@ - + - + Cancel 取消 - - + + Open in Separate Window 在独立窗口中打开 - - + + Click Time 点击次数 - - + + Search 搜索 - - + + Finish 完成 - - + + Next 下一步 - - + + Previous 上一步 - - + + Here you can switch to night mode. 在这里,您可以切换到夜间模式。 - - + + Hide Easter eggs 隐藏彩蛋 - - + + Try a few more clicks!! 再试几下!! - - + + Upgrade Tips 升级提示 - - + + FluentUI is currently up to date FluentUI 目前最新版本 - - + + -- The current app version -- 当前应用版本 - - + + Now go and download the new version? @@ -763,20 +768,20 @@ Updated content: - - + + OK 确定 - - + + The current version is already the latest 当前版本已经是最新版本 - - + + The network is abnormal 网络异常 diff --git a/example/qml-Qt6/window/FluentInitalizrWindow.qml b/example/qml-Qt6/window/FluentInitalizrWindow.qml index eb6e624c..5ef64459 100644 --- a/example/qml-Qt6/window/FluentInitalizrWindow.qml +++ b/example/qml-Qt6/window/FluentInitalizrWindow.qml @@ -12,7 +12,7 @@ FluWindow { width: 600 height: 400 fixSize: true - // modality: Qt.ApplicationModal + modality: Qt.ApplicationModal launchMode: FluWindowType.SingleTask showStayTop: false @@ -21,8 +21,9 @@ FluWindow { function onError(message){ showError(message) } - function onSuccess(){ - showSuccess("创建成功") + function onSuccess(path){ + FluTools.showFileInFolder(path+"/CMakeLists.txt") + window.close() } } diff --git a/example/qml/window/FluentInitalizrWindow.qml b/example/qml/window/FluentInitalizrWindow.qml index a3c5c527..f17330d6 100644 --- a/example/qml/window/FluentInitalizrWindow.qml +++ b/example/qml/window/FluentInitalizrWindow.qml @@ -12,7 +12,7 @@ FluWindow { width: 600 height: 400 fixSize: true - // modality: Qt.ApplicationModal + modality: Qt.ApplicationModal launchMode: FluWindowType.SingleTask showStayTop: false @@ -21,8 +21,9 @@ FluWindow { function onError(message){ showError(message) } - function onSuccess(){ - showSuccess("创建成功") + function onSuccess(path){ + FluTools.showFileInFolder(path+"/CMakeLists.txt") + window.close() } } diff --git a/example/res/template/App.qml.in b/example/res/template/App.qml.in new file mode 100644 index 00000000..c4c2b66c --- /dev/null +++ b/example/res/template/App.qml.in @@ -0,0 +1,17 @@ +import QtQuick 2.15 +import QtQuick.Window 2.15 +import QtQuick.Controls 2.15 +import QtQuick.Layouts 1.15 +import FluentUI 1.0 + +Item { + id: app + Component.onCompleted: { + FluApp.init(app) + FluApp.windowIcon = "qrc:/logo.ico" + FluApp.routes = { + "/":"qrc:/main.qml", + } + FluApp.navigate("/") + } +} diff --git a/example/res/template/CMakeLists.txt.in b/example/res/template/CMakeLists.txt.in new file mode 100644 index 00000000..2d0ea5cf --- /dev/null +++ b/example/res/template/CMakeLists.txt.in @@ -0,0 +1,90 @@ +cmake_minimum_required(VERSION 3.20) + +project(%1 VERSION 0.1 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) + +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(APPLICATION_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/debug) +else() + set(APPLICATION_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin/release) +endif() + +if(APPLE) + set(APPLICATION_REAL_PATH ${APPLICATION_OUTPUT_DIRECTORY}/${PROJECT_NAME}.app/Contents/MacOS) +else() + set(APPLICATION_REAL_PATH ${APPLICATION_OUTPUT_DIRECTORY}) +endif() + +find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Quick) +find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick) + +find_program(QT_LUPDATE NAMES lupdate) +find_program(QT_LRELEASE NAMES lrelease) +if (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}_en_US.qm) + execute_process(COMMAND ${QT_LUPDATE} ${CMAKE_CURRENT_LIST_DIR} -ts ${PROJECT_NAME}_en_US.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + execute_process(COMMAND ${QT_LRELEASE} ${PROJECT_NAME}_en_US.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) +endif () +if (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${PROJECT_NAME}_zh_CN.qm) + execute_process(COMMAND ${QT_LUPDATE} ${CMAKE_CURRENT_LIST_DIR} -ts ${PROJECT_NAME}_zh_CN.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) + execute_process(COMMAND ${QT_LRELEASE} ${PROJECT_NAME}_zh_CN.ts WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}) +endif () + +file(GLOB QM_FILE_PATHS ${CMAKE_CURRENT_LIST_DIR}/ *.qm) +file(COPY ${QM_FILE_PATHS} DESTINATION ${APPLICATION_REAL_PATH}/i18n) + + +set(PROJECT_SOURCES + main.cpp + qml.qrc +) + +if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) + qt_add_executable(${PROJECT_NAME} + MANUAL_FINALIZATION + ${PROJECT_SOURCES} + ) +else() + add_executable(${PROJECT_NAME} + ${PROJECT_SOURCES} + ) +endif() + +set_target_properties(${PROJECT_NAME} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_DEBUG "${APPLICATION_OUTPUT_DIRECTORY}" + RUNTIME_OUTPUT_DIRECTORY_RELEASE "${APPLICATION_OUTPUT_DIRECTORY}" +) + +target_link_libraries(${PROJECT_NAME} PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Quick + fluentuiplugin +) + +if(${QT_VERSION} VERSION_LESS 6.1.0) + set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.${PROJECT_NAME}) +endif() +set_target_properties(${PROJECT_NAME} PROPERTIES + ${BUNDLE_ID_OPTION} + MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} + MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} + MACOSX_BUNDLE TRUE + WIN32_EXECUTABLE TRUE +) + +add_subdirectory(FluentUI) + +include(GNUInstallDirs) +install(TARGETS ${PROJECT_NAME} + BUNDLE DESTINATION . + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) + +if(QT_VERSION_MAJOR EQUAL 6) + qt_import_qml_plugins(${PROJECT_NAME}) + qt_finalize_executable(${PROJECT_NAME}) +endif() diff --git a/example/res/template/en_US.ts.in b/example/res/template/en_US.ts.in new file mode 100644 index 00000000..aff54b38 --- /dev/null +++ b/example/res/template/en_US.ts.in @@ -0,0 +1,22 @@ + + + + + main + + + %1 + + + + + Welcome to FluentUI + + + + + Learn FluentUI + + + + diff --git a/example/res/template/logo.ico.in b/example/res/template/logo.ico.in new file mode 100644 index 0000000000000000000000000000000000000000..dcb1c0358d457e08fa1aa7c8469c5a119891d3ca GIT binary patch literal 119074 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ǁV*4#CXG17 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 literal 0 HcmV?d00001 diff --git a/example/res/template/main.cpp.in b/example/res/template/main.cpp.in new file mode 100644 index 00000000..65bb0c63 --- /dev/null +++ b/example/res/template/main.cpp.in @@ -0,0 +1,32 @@ +#include +#include +#include + +int main(int argc, char *argv[]) +{ +#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); +#endif + QGuiApplication app(argc, argv); + + QTranslator translator; + const QStringList uiLanguages = QLocale::system().uiLanguages(); + for (const QString &locale : uiLanguages) { + const QString baseName = "%1_" + QLocale(locale).name(); + if (translator.load("./i18n/"+ baseName)) { + app.installTranslator(&translator); + break; + } + } + + QQmlApplicationEngine engine; + const QUrl url(QStringLiteral("qrc:/App.qml")); + QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, + &app, [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, Qt::QueuedConnection); + engine.load(url); + + return app.exec(); +} diff --git a/example/res/template/main.qml.in b/example/res/template/main.qml.in new file mode 100644 index 00000000..8180a5fd --- /dev/null +++ b/example/res/template/main.qml.in @@ -0,0 +1,35 @@ +import QtQuick 2.15 +import QtQuick.Window 2.15 +import FluentUI 1.0 + +FluWindow { + width: 640 + height: 480 + minimumWidth: 320 + minimumHeight: 240 + title: qsTr("%1") + + Column{ + anchors.centerIn: parent + spacing: 15 + Image{ + width: 60 + height: 60 + source: "qrc:/logo.ico" + anchors.horizontalCenter: parent.horizontalCenter + } + FluText{ + text: qsTr("Welcome to FluentUI") + anchors.horizontalCenter: parent.horizontalCenter + font: FluTextStyle.Title + } + FluFilledButton{ + text: qsTr("Learn FluentUI") + anchors.horizontalCenter: parent.horizontalCenter + onClicked: { + Qt.openUrlExternally("https://space.bilibili.com/275661059") + } + } + } + +} diff --git a/example/res/template/qml.qrc.in b/example/res/template/qml.qrc.in new file mode 100644 index 00000000..3a518c68 --- /dev/null +++ b/example/res/template/qml.qrc.in @@ -0,0 +1,7 @@ + + + main.qml + App.qml + logo.ico + + diff --git a/example/res/template/zh_CN.ts.in b/example/res/template/zh_CN.ts.in new file mode 100644 index 00000000..86475ddd --- /dev/null +++ b/example/res/template/zh_CN.ts.in @@ -0,0 +1,22 @@ + + + + + main + + + %1 + %1 + + + + Welcome to FluentUI + 欢迎使用FluentUI + + + + Learn FluentUI + 学习FluentUI + + + diff --git a/example/src/helper/InitalizrHelper.cpp b/example/src/helper/InitalizrHelper.cpp index a22cdb25..74271b7e 100644 --- a/example/src/helper/InitalizrHelper.cpp +++ b/example/src/helper/InitalizrHelper.cpp @@ -1,6 +1,7 @@ #include "InitalizrHelper.h" #include +#include InitalizrHelper::InitalizrHelper(QObject *parent) : QObject(parent) { @@ -9,6 +10,63 @@ InitalizrHelper::InitalizrHelper(QObject *parent) : QObject(parent) InitalizrHelper::~InitalizrHelper() = default; +bool InitalizrHelper::copyDir(const QDir& fromDir, const QDir& toDir, bool coverIfFileExists){ + QDir _formDir = fromDir; + QDir _toDir = toDir; + if(!_toDir.exists()) + { + if(!_toDir.mkdir(toDir.absolutePath())) + return false; + } + QFileInfoList fileInfoList = _formDir.entryInfoList(); + foreach(QFileInfo fileInfo, fileInfoList) + { + if(fileInfo.fileName() == "." || fileInfo.fileName() == "..") + continue; + if(fileInfo.isDir()) + { + if(!copyDir(fileInfo.filePath(), _toDir.filePath(fileInfo.fileName()),true)) + return false; + } + else + { + if(coverIfFileExists && _toDir.exists(fileInfo.fileName())) + { + _toDir.remove(fileInfo.fileName()); + } + if(!QFile::copy(fileInfo.filePath(), _toDir.filePath(fileInfo.fileName()))) + { + return false; + } + } + } + return true; +} + +template +void InitalizrHelper::templateToFile(const QString& source,const QString& dest,Args &&...args){ + QFile file(source); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QTextStream in(&file); + QString content = in.readAll().arg(std::forward(args)...); + file.close(); + QFile outputFile(dest); + if (outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream out(&outputFile); + out << content; + outputFile.close(); + } else { + qDebug() << "Failed to open output file."; + } + } else { + qDebug() << "Failed to open resource file."; + } +} + +void InitalizrHelper::copyFile(const QString& source,const QString& dest){ + QFile::copy(source,dest); + QFile::setPermissions(dest, QFile::WriteOwner | QFile::WriteUser | QFile::WriteGroup | QFile::WriteOther); +} void InitalizrHelper::generate(const QString& name,const QString& path){ if(name.isEmpty()){ @@ -19,10 +77,27 @@ void InitalizrHelper::generate(const QString& name,const QString& path){ error(tr("The creation path cannot be empty")); return; } - QDir projectDir(path); - if(!projectDir.exists()){ + QDir projectRootDir(path); + if(!projectRootDir.exists()){ error(tr("The path does not exist")); return; } - return success(); + QString projectPath = projectRootDir.filePath(name); + QDir projectDir(projectPath); + if(projectDir.exists()){ + error(tr("%1 folder already exists").arg(name)); + return; + } + projectDir.mkpath(projectPath); + QDir fluentDir(projectDir.filePath("FluentUI")); + copyDir(QDir(QGuiApplication::applicationDirPath()+"/source"),fluentDir); + templateToFile(":/example/res/template/CMakeLists.txt.in",projectDir.filePath("CMakeLists.txt"),name); + templateToFile(":/example/res/template/main.cpp.in",projectDir.filePath("main.cpp"),name); + templateToFile(":/example/res/template/main.qml.in",projectDir.filePath("main.qml"),name); + templateToFile(":/example/res/template/en_US.ts.in",projectDir.filePath(name+"_en_US.ts"),name); + templateToFile(":/example/res/template/zh_CN.ts.in",projectDir.filePath(name+"_zh_CN.ts"),name); + copyFile(":/example/res/template/App.qml.in",projectDir.filePath("App.qml")); + copyFile(":/example/res/template/qml.qrc.in",projectDir.filePath("qml.qrc")); + copyFile(":/example/res/template/logo.ico.in",projectDir.filePath("logo.ico")); + return this->success(projectPath); } diff --git a/example/src/helper/InitalizrHelper.h b/example/src/helper/InitalizrHelper.h index db19d83f..fbd63995 100644 --- a/example/src/helper/InitalizrHelper.h +++ b/example/src/helper/InitalizrHelper.h @@ -3,6 +3,7 @@ #include #include +#include #include "src/singleton.h" class InitalizrHelper : public QObject @@ -10,12 +11,16 @@ class InitalizrHelper : public QObject Q_OBJECT private: explicit InitalizrHelper(QObject* parent = nullptr); + bool copyDir(const QDir& fromDir, const QDir& toDir, bool coverIfFileExists = true); + void copyFile(const QString& source,const QString& dest); + template + void templateToFile(const QString& source,const QString& dest,Args &&...args); public: SINGLETON(InitalizrHelper) ~InitalizrHelper() override; Q_INVOKABLE void generate(const QString& name,const QString& path); Q_SIGNAL void error(const QString& message); - Q_SIGNAL void success(); + Q_SIGNAL void success(const QString& path); }; #endif // INITALIZRHELPER_H diff --git a/example/src/helper/TranslateHelper.cpp b/example/src/helper/TranslateHelper.cpp index 3f62357f..7376bf20 100644 --- a/example/src/helper/TranslateHelper.cpp +++ b/example/src/helper/TranslateHelper.cpp @@ -7,8 +7,8 @@ TranslateHelper::TranslateHelper(QObject *parent) : QObject(parent) { - _languages<<"en"; - _languages<<"zh"; + _languages<<"en_US"; + _languages<<"zh_CN"; _current = SettingsHelper::getInstance()->getLanguage(); } diff --git a/src/.cmake/version_dll.rc.in b/src/.cmake/version_dll.rc.in index ed756918..a84e0db0 100644 --- a/src/.cmake/version_dll.rc.in +++ b/src/.cmake/version_dll.rc.in @@ -1,6 +1,13 @@ -1 VERSIONINFO - FILEVERSION ${GIT_TAG_WITH_COMMA},${GIT_COMMIT_COUNT} - PRODUCTVERSION ${GIT_TAG_WITH_COMMA},${GIT_COMMIT_COUNT} +#include + +#define STR(x) #x +#define VER_JOIN(a,b,c,d) STR(a.b.c.d) +#define VER_JOIN_(x) VER_JOIN x +#define VER_STR VER_JOIN_((FLUENTUI_VERSION)) + +VS_VERSION_INFO VERSIONINFO + FILEVERSION FLUENTUI_VERSION + PRODUCTVERSION FLUENTUI_VERSION FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -16,17 +23,17 @@ BEGIN BLOCK "080404b0" BEGIN VALUE "CompanyName", "ZhuZiChu" - VALUE "FileDescription", "${PROJECT_DESCRIPTION}" - VALUE "FileVersion", "${GIT_SEMVER}.${GIT_COMMIT_COUNT}" + VALUE "FileDescription", "https://github.com/zhuzichu520/FluentUI" + VALUE "FileVersion", VER_STR VALUE "InternalName", "${PROJECT_NAME}.dll" VALUE "LegalCopyright", "Copyright (C) 2023 ZhuZiChu. All rights reserved." VALUE "OriginalFilename", "${PROJECT_NAME}.dll" VALUE "ProductName", "${PROJECT_NAME}" - VALUE "ProductVersion", "${GIT_SEMVER}.0" + VALUE "ProductVersion", VER_STR END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x804, 1200 END -END \ No newline at end of file +END diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b3f31c2b..a80bcc93 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,14 +12,29 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/.cmake/) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +#设置版本号 +add_definitions(-DFLUENTUI_VERSION=1,6,9,0) + if (FLUENTUI_BUILD_STATIC_LIB) add_definitions(-DFLUENTUI_BUILD_STATIC_LIB) endif() +#编译参数设置 +option(FLUENTUI_BUILD_STATIC_LIB "Build static library." OFF) + #导入Qt相关依赖包 find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Quick Qml) find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Quick Qml) +set(QT_SDK_DIR "${Qt${QT_VERSION_MAJOR}_DIR}/../../..") +cmake_path(SET QT_SDK_DIR NORMALIZE ${QT_SDK_DIR}) + +#设置QML插件输出目录,可以通过外部设置,如果外部没有设置就默认到\qml\FluentUI目录下 +set(FLUENTUI_QML_PLUGIN_DIRECTORY "" CACHE PATH "Path to FluentUI plugin") +if(NOT FLUENTUI_QML_PLUGIN_DIRECTORY) + set(FLUENTUI_QML_PLUGIN_DIRECTORY ${QT_SDK_DIR}/qml/FluentUI) +endif() + if(QT_VERSION VERSION_GREATER_EQUAL "6.3") qt_standard_project_setup() else()