diff --git a/example/qml/TestWindow.qml b/example/qml/TestWindow.qml
index b8d6535..f75f284 100644
--- a/example/qml/TestWindow.qml
+++ b/example/qml/TestWindow.qml
@@ -18,6 +18,10 @@ FluWindow {
launchMode: FluWindow.SingleTask
visible: true
+ Component.onCompleted: {
+// FluApp.init(window)
+ }
+
FluNavigationView2{
id:nav_view
anchors.fill: parent
diff --git a/example/qml/component/CodeExpander.qml b/example/qml/component/CodeExpander.qml
index 3f673a6..fd98792 100644
--- a/example/qml/component/CodeExpander.qml
+++ b/example/qml/component/CodeExpander.qml
@@ -24,6 +24,11 @@ FluExpander{
color:FluTheme.dark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(247/255,247/255,247/255,1)
border.color: FluTheme.dark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,229/255,234/255,1)
border.width: 1
+ Behavior on color{
+ ColorAnimation {
+ duration: 300
+ }
+ }
}
}
@@ -42,91 +47,91 @@ FluExpander{
}
function htmlEncode(e){
- var i,s;
- for(i in s={
- "&":/&/g,//""//":/"/g,"'":/'/g,
- "<":/":/>/g,"
":/\n/g,
- " ":/ /g," ":/\t/g
- })e=e.replace(s[i],i);
- return e;
+ var i,s;
+ for(i in s={
+ "&":/&/g,//""//":/"/g,"'":/'/g,
+ "<":/":/>/g,"
":/\n/g,
+ " ":/ /g," ":/\t/g
+ })e=e.replace(s[i],i);
+ return e;
}
function highlightQmlCode(code) {
- // 定义 QML 关键字列表
- var qmlKeywords = [
- "FluTextButton",
- "FluAppBar",
- "FluAutoSuggestBox",
- "FluBadge",
- "FluButton",
- "FluCalendarPicker",
- "FluCalendarView",
- "FluCarousel",
- "FluCheckBox",
- "FluColorPicker",
- "FluColorView",
- "FluComboBox",
- "FluContentDialog",
- "FluContentPage",
- "FluDatePicker",
- "FluDivider",
- "FluDropDownButton",
- "FluExpander",
- "FluFilledButton",
- "FluFlipView",
- "FluFocusRectangle",
- "FluIcon",
- "FluIconButton",
- "FluInfoBar",
- "FluItem",
- "FluMediaPlayer",
- "FluMenu",
- "FluMenuItem",
- "FluMultilineTextBox",
- "FluNavigationView",
- "FluObject",
- "FluPaneItem",
- "FluPaneItemExpander",
- "FluPaneItemHeader",
- "FluPaneItemSeparator",
- "FluPivot",
- "FluPivotItem",
- "FluProgressBar",
- "FluProgressRing",
- "FluRadioButton",
- "FluRectangle",
- "FluScrollablePage",
- "FluScrollBar",
- "FluShadow",
- "FluSlider",
- "FluTabView",
- "FluText",
- "FluTextArea",
- "FluTextBox",
- "FluTextBoxBackground",
- "FluTextBoxMenu",
- "FluTextButton",
- "FluTextFiled",
- "FluTimePicker",
- "FluToggleSwitch",
- "FluTooltip",
- "FluTreeView",
- "FluWindow",
- "FluWindowResize",
- "FluToggleButton",
- "FluTableView",
- "FluColors",
- "FluTheme",
- "FluStatusView",
- "FluRatingControl",
- "FluPasswordBox",
- "FluBreadcrumbBar",
- "FluCopyableText",
- "FluAcrylic"
- ];
- code = code.replace(/\n/g, "
");
- code = code.replace(/ /g, " ");
- return code.replace(RegExp("\\b(" + qmlKeywords.join("|") + ")\\b", "g"), "$1");
+ // 定义 QML 关键字列表
+ var qmlKeywords = [
+ "FluTextButton",
+ "FluAppBar",
+ "FluAutoSuggestBox",
+ "FluBadge",
+ "FluButton",
+ "FluCalendarPicker",
+ "FluCalendarView",
+ "FluCarousel",
+ "FluCheckBox",
+ "FluColorPicker",
+ "FluColorView",
+ "FluComboBox",
+ "FluContentDialog",
+ "FluContentPage",
+ "FluDatePicker",
+ "FluDivider",
+ "FluDropDownButton",
+ "FluExpander",
+ "FluFilledButton",
+ "FluFlipView",
+ "FluFocusRectangle",
+ "FluIcon",
+ "FluIconButton",
+ "FluInfoBar",
+ "FluItem",
+ "FluMediaPlayer",
+ "FluMenu",
+ "FluMenuItem",
+ "FluMultilineTextBox",
+ "FluNavigationView",
+ "FluObject",
+ "FluPaneItem",
+ "FluPaneItemExpander",
+ "FluPaneItemHeader",
+ "FluPaneItemSeparator",
+ "FluPivot",
+ "FluPivotItem",
+ "FluProgressBar",
+ "FluProgressRing",
+ "FluRadioButton",
+ "FluRectangle",
+ "FluScrollablePage",
+ "FluScrollBar",
+ "FluShadow",
+ "FluSlider",
+ "FluTabView",
+ "FluText",
+ "FluTextArea",
+ "FluTextBox",
+ "FluTextBoxBackground",
+ "FluTextBoxMenu",
+ "FluTextButton",
+ "FluTextFiled",
+ "FluTimePicker",
+ "FluToggleSwitch",
+ "FluTooltip",
+ "FluTreeView",
+ "FluWindow",
+ "FluWindowResize",
+ "FluToggleButton",
+ "FluTableView",
+ "FluColors",
+ "FluTheme",
+ "FluStatusView",
+ "FluRatingControl",
+ "FluPasswordBox",
+ "FluBreadcrumbBar",
+ "FluCopyableText",
+ "FluAcrylic"
+ ];
+ code = code.replace(/\n/g, "
");
+ code = code.replace(/ /g, " ");
+ return code.replace(RegExp("\\b(" + qmlKeywords.join("|") + ")\\b", "g"), "$1");
}
diff --git a/example/src/AppInfo.cpp b/example/src/AppInfo.cpp
index 91a2d08..734ae20 100644
--- a/example/src/AppInfo.cpp
+++ b/example/src/AppInfo.cpp
@@ -1,7 +1,9 @@
#include "AppInfo.h"
+
+#include
+#include
#include "lang/En.h"
#include "lang/Zh.h"
-#include
#define STR(x) #x
#define VER_JOIN(a,b,c,d) STR(a.b.c.d)
@@ -15,6 +17,16 @@ AppInfo::AppInfo(QObject *parent)
lang(new En());
}
+void AppInfo::init(QQmlApplicationEngine *engine){
+ QQmlContext * context = engine->rootContext();
+ Lang* lang = this->lang();
+ context->setContextProperty("lang",lang);
+ QObject::connect(this,&AppInfo::langChanged,this,[=]{
+ context->setContextProperty("lang",this->lang());
+ });
+ context->setContextProperty("appInfo",this);
+}
+
void AppInfo::changeLang(const QString& locale){
if(_lang){
_lang->deleteLater();
@@ -27,3 +39,18 @@ void AppInfo::changeLang(const QString& locale){
lang(new En());
}
}
+
+bool AppInfo::isOwnerProcess(IPC *ipc){
+ QString activeWindowEvent = "activeWindow";
+ if(!ipc->isCurrentOwner()){
+ ipc->postEvent(activeWindowEvent,QString().toUtf8(),0);
+ return false;
+ }
+ if(ipc->isAttached()){
+ ipc->registerEventHandler(activeWindowEvent,[=](const QByteArray&){
+ Q_EMIT this->activeWindow();
+ return true;
+ });
+ }
+ return true;
+}
diff --git a/example/src/AppInfo.h b/example/src/AppInfo.h
index 828152b..8e3fb9d 100644
--- a/example/src/AppInfo.h
+++ b/example/src/AppInfo.h
@@ -2,6 +2,8 @@
#define APPINFO_H
#include
+#include
+#include "tool/IPC.h"
#include "lang/Lang.h"
#include "stdafx.h"
@@ -12,6 +14,8 @@ class AppInfo : public QObject
Q_PROPERTY_AUTO(Lang*,lang)
public:
explicit AppInfo(QObject *parent = nullptr);
+ void init(QQmlApplicationEngine *engine);
+ bool isOwnerProcess(IPC *ipc);
Q_INVOKABLE void changeLang(const QString& locale);
Q_SIGNAL void activeWindow();
};
diff --git a/example/src/main.cpp b/example/src/main.cpp
index ff36319..15c9371 100644
--- a/example/src/main.cpp
+++ b/example/src/main.cpp
@@ -6,13 +6,11 @@
#include
#include
#include
-#include "lang/Lang.h"
#include "AppInfo.h"
-#include "tool/IPC.h"
FRAMELESSHELPER_USE_NAMESPACE
- int main(int argc, char *argv[])
+int main(int argc, char *argv[])
{
//将样式设置为Basic,不然会导致组件显示异常
qputenv("QT_QUICK_CONTROLS_STYLE","Basic");
@@ -33,28 +31,13 @@ FRAMELESSHELPER_USE_NAMESPACE
#endif
AppInfo* appInfo = new AppInfo();
IPC ipc(0);
- QString activeWindowEvent = "activeWindow";
- if(!ipc.isCurrentOwner()){
- ipc.postEvent(activeWindowEvent,QString().toUtf8(),0);
- delete appInfo;
+ if(!appInfo->isOwnerProcess(&ipc)){
return 0;
}
- if(ipc.isAttached()){
- ipc.registerEventHandler(activeWindowEvent,[&appInfo](const QByteArray&){
- Q_EMIT appInfo->activeWindow();
- return true;
- });
- }
app.setQuitOnLastWindowClosed(false);
QQmlApplicationEngine engine;
FramelessHelper::Quick::registerTypes(&engine);
- QQmlContext * context = engine.rootContext();
- Lang* lang = appInfo->lang();
- context->setContextProperty("lang",lang);
- QObject::connect(appInfo,&AppInfo::langChanged,&app,[context,appInfo]{
- context->setContextProperty("lang",appInfo->lang());
- });
- context->setContextProperty("appInfo",appInfo);
+ appInfo->init(&engine);
const QUrl url(QStringLiteral("qrc:/example/qml/App.qml"));
// const QUrl url(QStringLiteral("qrc:/example/qml/TestWindow.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
diff --git a/src/FluApp.cpp b/src/FluApp.cpp
index 5e4e067..eb6966e 100644
--- a/src/FluApp.cpp
+++ b/src/FluApp.cpp
@@ -23,11 +23,9 @@ FluApp *FluApp::getInstance()
FluApp::FluApp(QObject *parent)
: QObject{parent}
{
- QFontDatabase::addApplicationFont(":/FluentUI/Font/Segoe_Fluent_Icons.ttf");
}
FluApp::~FluApp(){
-
}
void FluApp::init(QQuickWindow *window){
diff --git a/src/FluApp.h b/src/FluApp.h
index ecdbcbf..d116455 100644
--- a/src/FluApp.h
+++ b/src/FluApp.h
@@ -27,6 +27,7 @@ class FluApp : public QObject
*/
Q_PROPERTY_AUTO(QJsonObject,routes);
+ QML_FOREIGN(FluApp)
QML_NAMED_ELEMENT(FluApp)
QML_SINGLETON
private:
diff --git a/src/imports/FluentUI/Controls/FluContentDialog.qml b/src/imports/FluentUI/Controls/FluContentDialog.qml
index 75823d3..171a973 100644
--- a/src/imports/FluentUI/Controls/FluContentDialog.qml
+++ b/src/imports/FluentUI/Controls/FluContentDialog.qml
@@ -4,15 +4,13 @@ import QtQuick.Controls
import QtQuick.Window
import FluentUI
-Popup {
+FluPopup {
id: popup
property string title: "Title"
property string message: "Message"
property string neutralText: "Neutral"
property string negativeText: "Negative"
property string positiveText: "Positive"
- property alias blurSource: blur.sourceItem
- property bool blurBackground: true
signal neutralClicked
signal negativeClicked
signal positiveClicked
@@ -27,53 +25,14 @@ Popup {
return 400
return Math.min(Window.window.width,400)
}
- modal:true
- anchors.centerIn: Overlay.overlay
- closePolicy: Popup.CloseOnEscape
- background:Item{}
- enter: Transition {
- reversible: true
- NumberAnimation {
- properties: "opacity,scale"
- from:0
- to:1
- duration: 167
- easing.type: Easing.BezierSpline
- easing.bezierCurve: [ 0, 0, 0, 1 ]
- }
- }
- exit:Transition {
- NumberAnimation {
- properties: "opacity,scale"
- from:1
- to:0
- duration: 167
- easing.type: Easing.BezierSpline
- easing.bezierCurve: [ 1, 0, 0, 0 ]
- }
- }
- contentItem:
- Rectangle {
+
+ Rectangle {
id:layout_content
anchors.fill: parent
implicitWidth:minWidth
implicitHeight: text_title.height + text_message.height + layout_actions.height
color: 'transparent'
radius:5
- FluAcrylic{
- id:blur
- anchors{
- top:parent.top
- left: parent.left
- right: parent.right
- bottom: layout_actions.bottom
- }
- height: parent.height
- color: FluTheme.dark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(249/255,249/255,249/255,1)
- rectX: popup.x
- rectY: popup.y
- acrylicOpacity:blurBackground ? 0.8 : 1
- }
FluText{
id:text_title
font: FluTextStyle.TitleLarge
@@ -107,7 +66,7 @@ Popup {
id:layout_actions
height: 68
radius: 5
- color: FluTheme.dark ? Qt.rgba(32/255,32/255,32/255, blurBackground ? blur.acrylicOpacity - 0.4 : 1) : Qt.rgba(243/255,243/255,243/255,blurBackground ? blur.acrylicOpacity - 0.4 : 1)
+ color: FluTheme.dark ? Qt.rgba(32/255,32/255,32/255, blurBackground ? blurOpacity - 0.4 : 1) : Qt.rgba(243/255,243/255,243/255,blurBackground ? blurOpacity - 0.4 : 1)
anchors{
top:text_message.bottom
left: parent.left
diff --git a/src/imports/FluentUI/Controls/FluDivider.qml b/src/imports/FluentUI/Controls/FluDivider.qml
index 3efaa46..b41ef1c 100644
--- a/src/imports/FluentUI/Controls/FluDivider.qml
+++ b/src/imports/FluentUI/Controls/FluDivider.qml
@@ -4,9 +4,4 @@ import FluentUI
Rectangle {
color: FluTheme.dark ? Window.active ? Qt.rgba(55/255,55/255,55/255,1):Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,230/255,234/255,1)
- Behavior on color{
- ColorAnimation {
- duration: 300
- }
- }
}
diff --git a/src/imports/FluentUI/Controls/FluIcon.qml b/src/imports/FluentUI/Controls/FluIcon.qml
index 156990a..cade730 100644
--- a/src/imports/FluentUI/Controls/FluIcon.qml
+++ b/src/imports/FluentUI/Controls/FluIcon.qml
@@ -13,4 +13,9 @@ Text {
verticalAlignment: Text.AlignVCenter
color: iconColor
text: (String.fromCharCode(iconSource).toString(16))
+
+ FontLoader{
+ source: "../Font/Segoe_Fluent_Icons.ttf"
+ }
+
}
diff --git a/src/imports/FluentUI/Controls/FluIconButton.qml b/src/imports/FluentUI/Controls/FluIconButton.qml
index cdd28ae..05231ef 100644
--- a/src/imports/FluentUI/Controls/FluIconButton.qml
+++ b/src/imports/FluentUI/Controls/FluIconButton.qml
@@ -51,17 +51,15 @@ Button {
}
}
contentItem: Item{
- Text {
+ FluIcon {
id:text_icon
- font.family: "Segoe Fluent Icons"
font.pixelSize: iconSize
- width: iconSize
- height: iconSize
+ iconSize: control.iconSize
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
anchors.centerIn: parent
- color:control.iconColor
- text: (String.fromCharCode(iconSource).toString(16));
+ iconColor: control.iconColor
+ iconSource: control.iconSource;
}
FluTooltip{
id:tool_tip
diff --git a/src/imports/FluentUI/Controls/FluPopup.qml b/src/imports/FluentUI/Controls/FluPopup.qml
new file mode 100644
index 0000000..b58f0ef
--- /dev/null
+++ b/src/imports/FluentUI/Controls/FluPopup.qml
@@ -0,0 +1,46 @@
+import QtQuick
+import QtQuick.Layouts
+import QtQuick.Controls
+import QtQuick.Window
+import FluentUI
+
+Popup {
+ id: popup
+ padding: 0
+ modal:true
+ anchors.centerIn: Overlay.overlay
+ closePolicy: Popup.CloseOnEscape
+ property alias blurSource: blur.sourceItem
+ property bool blurBackground: true
+ property alias blurOpacity: blur.acrylicOpacity
+
+ enter: Transition {
+ reversible: true
+ NumberAnimation {
+ properties: "opacity,scale"
+ from:0
+ to:1
+ duration: 167
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: [ 0, 0, 0, 1 ]
+ }
+ }
+ exit:Transition {
+ NumberAnimation {
+ properties: "opacity,scale"
+ from:1
+ to:0
+ duration: 167
+ easing.type: Easing.BezierSpline
+ easing.bezierCurve: [ 1, 0, 0, 0 ]
+ }
+ }
+
+ background: FluAcrylic{
+ id:blur
+ color: FluTheme.dark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(249/255,249/255,249/255,1)
+ rectX: popup.x
+ rectY: popup.y
+ acrylicOpacity:blurBackground ? 0.8 : 1
+ }
+}
diff --git a/src/imports/FluentUI/Controls/FluTextBoxBackground.qml b/src/imports/FluentUI/Controls/FluTextBoxBackground.qml
index 41fd95d..032f911 100644
--- a/src/imports/FluentUI/Controls/FluTextBoxBackground.qml
+++ b/src/imports/FluentUI/Controls/FluTextBoxBackground.qml
@@ -48,7 +48,7 @@ Rectangle{
}
Behavior on height{
NumberAnimation{
- duration: 167
+ duration: 83
easing.type: Easing.BezierSpline
easing.bezierCurve: [ 1, 0, 0, 0 ]
}