main
zhuzihcu 2023-03-30 17:16:57 +08:00
parent 9790ae12eb
commit 7720208d17
15 changed files with 387 additions and 370 deletions

View File

@ -2,6 +2,7 @@
import QtQuick.Layouts 1.15 import QtQuick.Layouts 1.15
import QtQuick.Window 2.15 import QtQuick.Window 2.15
import QtQuick.Controls 2.15 import QtQuick.Controls 2.15
import "qrc:///global/"
import FluentUI 1.0 import FluentUI 1.0
FluScrollablePage{ FluScrollablePage{
@ -143,39 +144,15 @@ FluScrollablePage{
ListModel{ ListModel{
id:model_added id:model_added
ListElement{ Component.onCompleted: {
title:"TabView" append(ItemsOriginal.getRecentlyAddedData())
icon:"qrc:/res/image/control/TabView.png"
desc:"A control that displays a collection of tabs thatcan be used to display several documents."
}
ListElement{
title:"MediaPlayer"
icon:"qrc:/res/image/control/MediaPlayerElement.png"
desc:"A control to display video and image content"
} }
} }
ListModel{ ListModel{
id:model_update id:model_update
ListElement{ Component.onCompleted: {
title:"Buttons" append(ItemsOriginal.getRecentlyUpdatedData())
icon:"qrc:/res/image/control/Button.png"
desc:"A control that responds to user input and raisesa Click event."
}
ListElement{
title:"InfoBar"
icon:"qrc:/res/image/control/InfoBar.png"
desc:"An inline message to display app-wide statuschange information."
}
ListElement{
title:"Slider"
icon:"qrc:/res/image/control/Slider.png"
desc:"A control that lets the user select from a rangeof values by moving a Thumb control along atrack."
}
ListElement{
title:"CheckBox"
icon:"qrc:/res/image/control/Checkbox.png"
desc:"A control that a user can select or clear."
} }
} }
@ -210,7 +187,7 @@ FluScrollablePage{
id:item_icon id:item_icon
height: 40 height: 40
width: 40 width: 40
source: model.icon source: model.image
anchors{ anchors{
left: parent.left left: parent.left
leftMargin: 20 leftMargin: 20
@ -251,7 +228,7 @@ FluScrollablePage{
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
onClicked: { onClicked: {
rootwindow.startPageByTitle(model.title) ItemsOriginal.startPageByItem(model)
} }
} }
} }

View File

@ -26,7 +26,7 @@ FluScrollablePage{
} }
FluAutoSuggestBox{ FluAutoSuggestBox{
Layout.topMargin: 20 Layout.topMargin: 20
values:generateRandomNames(100) items:generateRandomNames(100)
placeholderText: "AutoSuggestBox" placeholderText: "AutoSuggestBox"
Layout.preferredWidth: 300 Layout.preferredWidth: 300
disabled:toggle_switch.selected disabled:toggle_switch.selected
@ -52,7 +52,7 @@ FluScrollablePage{
} }
for (let i = 0; i < numNames; i++) { for (let i = 0; i < numNames; i++) {
const name = generateRandomName(); const name = generateRandomName();
names.push(name); names.push({title:name});
} }
return names; return names;
} }

View File

@ -0,0 +1,21 @@
pragma Singleton
import QtQuick 2.15
import FluentUI 1.0
FluObject{
id:footer_items
FluPaneItemSeparator{}
FluPaneItem{
title:"意见反馈"
onTap:{
Qt.openUrlExternally("https://github.com/zhuzichu520/FluentUI/issues/new")
}
}
FluPaneItem{
title:"关于"
onTap:{
FluApp.navigate("/about")
}
}
}

View File

@ -0,0 +1,286 @@
pragma Singleton
import QtQuick 2.15
import FluentUI 1.0
FluObject{
property var navigationView
FluPaneItem{
title:"Home"
icon:FluentIcons.Home
onTap:{
navigationView.push("qrc:/T_Home.qml")
}
}
FluPaneItemHeader{
title:"Inputs"
}
FluPaneItem{
title:"Buttons"
image:"qrc:/res/image/control/Button.png"
recentlyUpdated:true
desc:"A control that responds to user input and raisesa Click event."
onTap:{
navigationView.push("qrc:/T_Buttons.qml")
}
}
FluPaneItem{
title:"Slider"
image:"qrc:/res/image/control/Slider.png"
recentlyUpdated:true
desc:"A control that lets the user select from a rangeof values by moving a Thumb control along atrack."
onTap:{
navigationView.push("qrc:/T_Slider.qml")
}
}
FluPaneItem{
title:"CheckBox"
image:"qrc:/res/image/control/Checkbox.png"
recentlyUpdated:true
desc:"A control that a user can select or clear."
onTap:{
navigationView.push("qrc:/T_CheckBox.qml")
}
}
FluPaneItem{
title:"ToggleSwitch"
onTap:{
navigationView.push("qrc:/T_ToggleSwitch.qml")
}
}
FluPaneItemHeader{
title:"Form"
}
FluPaneItem{
title:"TextBox"
onTap:{
navigationView.push("qrc:/T_TextBox.qml")
}
}
FluPaneItem{
title:"TimePicker"
onTap:{
navigationView.push("qrc:/T_TimePicker.qml")
}
}
FluPaneItem{
title:"DatePicker"
onTap:{
navigationView.push("qrc:/T_DatePicker.qml")
}
}
FluPaneItem{
title:"CalendarPicker"
onTap:{
navigationView.push("qrc:/T_CalendarPicker.qml")
}
}
FluPaneItem{
title:"ColorPicker"
onTap:{
navigationView.push("qrc:/T_ColorPicker.qml")
}
}
FluPaneItemHeader{
title:"Surface"
}
FluPaneItem{
title:"InfoBar"
image:"qrc:/res/image/control/InfoBar.png"
recentlyUpdated:true
desc:"An inline message to display app-wide statuschange information."
onTap:{
navigationView.push("qrc:/T_InfoBar.qml")
}
}
FluPaneItem{
title:"Progress"
onTap:{
navigationView.push("qrc:/T_Progress.qml")
}
}
FluPaneItem{
title:"Badge"
onTap:{
navigationView.push("qrc:/T_Badge.qml")
}
}
FluPaneItem{
title:"Rectangle"
onTap:{
navigationView.push("qrc:/T_Rectangle.qml")
}
}
FluPaneItem{
title:"Carousel"
onTap:{
navigationView.push("qrc:/T_Carousel.qml")
}
}
FluPaneItem{
title:"Expander"
onTap:{
navigationView.push("qrc:/T_Expander.qml")
}
}
FluPaneItemHeader{
title:"Popus"
}
FluPaneItem{
title:"Dialog"
onTap:{
navigationView.push("qrc:/T_Dialog.qml")
}
}
FluPaneItem{
title:"Tooltip"
onTap:{
navigationView.push("qrc:/T_Tooltip.qml")
}
}
FluPaneItem{
title:"Menu"
onTap:{
navigationView.push("qrc:/T_Menu.qml")
}
}
FluPaneItemHeader{
title:"Navigation"
}
FluPaneItem{
title:"TabView"
image:"qrc:/res/image/control/TabView.png"
recentlyAdded:true
desc:"A control that displays a collection of tabs thatcan be used to display several documents."
onTap:{
navigationView.push("qrc:/T_TabView.qml")
}
}
FluPaneItem{
title:"TreeView"
onTap:{
navigationView.push("qrc:/T_TreeView.qml")
}
}
FluPaneItem{
title:"MultiWindow"
onTap:{
navigationView.push("qrc:/T_MultiWindow.qml")
}
}
FluPaneItemHeader{
title:"Theming"
}
FluPaneItem{
title:"Theme"
onTap:{
navigationView.push("qrc:/T_Theme.qml")
}
}
FluPaneItem{
title:"Awesome"
onTap:{
navigationView.push("qrc:/T_Awesome.qml")
}
}
FluPaneItem{
title:"Typography"
onTap:{
navigationView.push("qrc:/T_Typography.qml")
}
}
FluPaneItemHeader{
title:"Media"
}
FluPaneItem{
title:"MediaPlayer"
image:"qrc:/res/image/control/MediaPlayerElement.png"
recentlyAdded:true
desc:"A control to display video and image content."
onTap:{
navigationView.push("qrc:/T_MediaPlayer.qml")
}
}
function getRecentlyAddedData(){
var arr = []
for(var i=0;i<children.length;i++){
var item = children[i]
if(item instanceof FluPaneItem && item.recentlyAdded){
arr.push(item)
}
}
return arr
}
function getRecentlyUpdatedData(){
var arr = []
for(var i=0;i<children.length;i++){
var item = children[i]
if(item instanceof FluPaneItem && item.recentlyUpdated){
arr.push(item)
}
}
return arr
}
function getSearchData(){
var arr = []
for(var i=0;i<children.length;i++){
var item = children[i]
if(item instanceof FluPaneItem){
arr.push({title:item.title,key:item.key})
}
}
return arr
}
function startPageByItem(item){
for(var i=0;i<children.length;i++){
if(children[i].key === item.key){
if(navigationView.getCurrentIndex() === i){
return
}
children[i].tap()
navigationView.setCurrentIndex(i)
return
}
}
}
}

2
example/global/qmldir Normal file
View File

@ -0,0 +1,2 @@
singleton ItemsOriginal 1.0 ItemsOriginal.qml
singleton ItemsFooter 1.0 ItemsFooter.qml

View File

@ -33,7 +33,6 @@ FluWindow {
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
FluAutoSuggestBox{ FluAutoSuggestBox{
id:textbox_uesrname id:textbox_uesrname
values:["Admin","User"] values:["Admin","User"]

View File

@ -2,7 +2,7 @@
import QtQuick.Window 2.15 import QtQuick.Window 2.15
import QtQuick.Controls 2.15 import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15 import QtQuick.Layouts 1.15
import QtGraphicalEffects 1.15 import "qrc:///global/"
import FluentUI 1.0 import FluentUI 1.0
FluWindow { FluWindow {
@ -19,255 +19,31 @@ FluWindow {
showDark: true showDark: true
} }
FluObject{
id:original_items
FluPaneItem{
title:"Home"
icon:FluentIcons.Home
onTap:{
nav_view.push("qrc:/T_Home.qml")
}
}
FluPaneItemHeader{
title:"Inputs"
}
FluPaneItem{
title:"Buttons"
onTap:{
nav_view.push("qrc:/T_Buttons.qml")
}
}
FluPaneItem{
title:"Slider"
onTap:{
nav_view.push("qrc:/T_Slider.qml")
}
}
FluPaneItem{
title:"CheckBox"
onTap:{
nav_view.push("qrc:/T_CheckBox.qml")
}
}
FluPaneItem{
title:"ToggleSwitch"
onTap:{
nav_view.push("qrc:/T_ToggleSwitch.qml")
}
}
FluPaneItemHeader{
title:"Form"
}
FluPaneItem{
title:"TextBox"
onTap:{
nav_view.push("qrc:/T_TextBox.qml")
}
}
FluPaneItem{
title:"TimePicker"
onTap:{
nav_view.push("qrc:/T_TimePicker.qml")
}
}
FluPaneItem{
title:"DatePicker"
onTap:{
nav_view.push("qrc:/T_DatePicker.qml")
}
}
FluPaneItem{
title:"CalendarPicker"
onTap:{
nav_view.push("qrc:/T_CalendarPicker.qml")
}
}
FluPaneItem{
title:"ColorPicker"
onTap:{
nav_view.push("qrc:/T_ColorPicker.qml")
}
}
FluPaneItemHeader{
title:"Surface"
}
FluPaneItem{
title:"InfoBar"
onTap:{
nav_view.push("qrc:/T_InfoBar.qml")
}
}
FluPaneItem{
title:"Progress"
onTap:{
nav_view.push("qrc:/T_Progress.qml")
}
}
FluPaneItem{
title:"Badge"
onTap:{
nav_view.push("qrc:/T_Badge.qml")
}
}
FluPaneItem{
title:"Rectangle"
onTap:{
nav_view.push("qrc:/T_Rectangle.qml")
}
}
FluPaneItem{
title:"Carousel"
onTap:{
nav_view.push("qrc:/T_Carousel.qml")
}
}
FluPaneItem{
title:"Expander"
onTap:{
nav_view.push("qrc:/T_Expander.qml")
}
}
FluPaneItemHeader{
title:"Popus"
}
FluPaneItem{
title:"Dialog"
onTap:{
nav_view.push("qrc:/T_Dialog.qml")
}
}
FluPaneItem{
title:"Tooltip"
onTap:{
nav_view.push("qrc:/T_Tooltip.qml")
}
}
FluPaneItem{
title:"Menu"
onTap:{
nav_view.push("qrc:/T_Menu.qml")
}
}
FluPaneItemHeader{
title:"Navigation"
}
FluPaneItem{
title:"TabView"
onTap:{
nav_view.push("qrc:/T_TabView.qml")
}
}
FluPaneItem{
title:"TreeView"
onTap:{
nav_view.push("qrc:/T_TreeView.qml")
}
}
FluPaneItem{
title:"MultiWindow"
onTap:{
nav_view.push("qrc:/T_MultiWindow.qml")
}
}
FluPaneItemHeader{
title:"Theming"
}
FluPaneItem{
title:"Theme"
onTap:{
nav_view.push("qrc:/T_Theme.qml")
}
}
FluPaneItem{
title:"Awesome"
onTap:{
nav_view.push("qrc:/T_Awesome.qml")
}
}
FluPaneItem{
title:"Typography"
onTap:{
nav_view.push("qrc:/T_Typography.qml")
}
}
FluPaneItemHeader{
title:"Media"
}
FluPaneItem{
title:"MediaPlayer"
onTap:{
nav_view.push("qrc:/T_MediaPlayer.qml")
}
}
}
FluObject{
id:footer_items
FluPaneItemSeparator{}
FluPaneItem{
title:"意见反馈"
onTap:{
Qt.openUrlExternally("https://github.com/zhuzichu520/FluentUI/issues/new")
}
}
FluPaneItem{
title:"关于"
onTap:{
FluApp.navigate("/about")
}
}
}
FluNavigationView{ FluNavigationView{
id:nav_view id:nav_view
anchors.fill: parent anchors.fill: parent
items: original_items items: ItemsOriginal
footerItems:footer_items footerItems:ItemsFooter
logo: "qrc:/res/image/favicon.ico" logo: "qrc:/res/image/favicon.ico"
z: 11 z: 11
title:"FluentUI"
autoSuggestBox:FluAutoSuggestBox{
width: 280
anchors.centerIn: parent
iconSource: FluentIcons.Zoom
items: ItemsOriginal.getSearchData()
placeholderText: "查找"
onItemClicked:
(data)=>{
ItemsOriginal.startPageByItem(data)
}
}
Component.onCompleted: { Component.onCompleted: {
ItemsOriginal.navigationView = nav_view
nav_view.setCurrentIndex(0) nav_view.setCurrentIndex(0)
nav_view.push("qrc:/T_Home.qml") nav_view.push("qrc:/T_Home.qml")
} }
} }
function startPageByTitle(title){
console.debug(title)
nav_view.startPageByTitle(title)
}
} }

View File

@ -149,5 +149,8 @@
<file>res/image/control/WebView.png</file> <file>res/image/control/WebView.png</file>
<file>res/image/control/XamlUICommand.png</file> <file>res/image/control/XamlUICommand.png</file>
<file>T_CheckBox.qml</file> <file>T_CheckBox.qml</file>
<file>global/ItemsOriginal.qml</file>
<file>global/qmldir</file>
<file>global/ItemsFooter.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -5,6 +5,7 @@
#include <QQmlContext> #include <QQmlContext>
#include <QQuickItem> #include <QQuickItem>
#include <QTimer> #include <QTimer>
#include <QUuid>
#include <QClipboard> #include <QClipboard>
#include "Def.h" #include "Def.h"
@ -99,3 +100,7 @@ QJsonArray FluApp::awesomelist(const QString& keyword)
void FluApp::clipText(const QString& text){ void FluApp::clipText(const QString& text){
QGuiApplication::clipboard()->setText(text); QGuiApplication::clipboard()->setText(text);
} }
QString FluApp::uuid(){
return QUuid::createUuid().toString();
}

View File

@ -37,6 +37,8 @@ public:
Q_INVOKABLE void clipText(const QString& text); Q_INVOKABLE void clipText(const QString& text);
Q_INVOKABLE QString uuid();
private: private:
QMap<QString, QVariant> properties; QMap<QString, QVariant> properties;
static FluApp* m_instance; static FluApp* m_instance;

View File

@ -4,12 +4,12 @@ import FluentUI 1.0
TextField{ TextField{
property var values:[] property var items:[]
property int fontStyle: FluText.Body property int fontStyle: FluText.Body
property int pixelSize : FluTheme.textSize property int pixelSize : FluTheme.textSize
property int iconSource: 0 property int iconSource: 0
property bool disabled: false property bool disabled: false
signal itemClicked(string data) signal itemClicked(var data)
signal handleClicked signal handleClicked
id:input id:input
width: 300 width: 300
@ -211,7 +211,7 @@ TextField{
function handleClick(){ function handleClick(){
input_popup.close() input_popup.close()
input.itemClicked(modelData) input.itemClicked(modelData)
input.text = modelData input.text = modelData.title
} }
} }
Rectangle{ Rectangle{
@ -227,37 +227,12 @@ TextField{
} }
} }
contentItem: FluText{ contentItem: FluText{
text:modelData text:modelData.title
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
} }
} }
// Item{
// height: 38
// width: input.width
// Rectangle{
// anchors.fill: parent
// anchors.topMargin: 2
// anchors.bottomMargin: 2
// anchors.leftMargin: 5
// anchors.rightMargin: 5
// radius: 3
// MouseArea{
// id:item_mouse
// anchors.fill: parent
// hoverEnabled: true
// onClicked: {
// input_popup.close()
// input.itemClicked(modelData)
// input.text = modelData
// }
// }
// }
// }
} }
} }
} }
@ -268,12 +243,12 @@ TextField{
function searchData(){ function searchData(){
var result = [] var result = []
if(values==null){ if(items==null){
list_view.model = result list_view.model = result
return return
} }
values.map(function(item){ items.map(function(item){
if(item.indexOf(input.text)!==-1){ if(item.title.indexOf(input.text)!==-1){
result.push(item) result.push(item)
} }
}) })

View File

@ -7,10 +7,12 @@ import FluentUI 1.0
Item { Item {
property alias logo : image_logo.source property alias logo : image_logo.source
property string title: ""
property FluObject items property FluObject items
property FluObject footerItems property FluObject footerItems
property int displayMode: width<=700 ? FluNavigationView.Minimal : FluNavigationView.Open property int displayMode: width<=700 ? FluNavigationView.Minimal : FluNavigationView.Open
property bool displaMinimalMenu : false property bool displaMinimalMenu : false
property Component autoSuggestBox
id:root id:root
@ -214,7 +216,7 @@ Item {
} }
FluText{ FluText{
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
text:"FluentUI" text:root.title
Layout.leftMargin: 12 Layout.leftMargin: 12
fontStyle: FluText.Body fontStyle: FluText.Body
} }
@ -257,6 +259,17 @@ Item {
Rectangle{ Rectangle{
id:layout_list id:layout_list
width: 300 width: 300
border.color: FluTheme.dark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,230/255,234/255,1)
border.width: displayMode === FluNavigationView.Minimal ? 1 : 0
color: {
if(displayMode === FluNavigationView.Minimal){
return FluTheme.dark ? Qt.rgba(61/255,61/255,61/255,1) : Qt.rgba(243/255,243/255,243/255,1)
}
if(window && window.active){
return FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(238/255,244/255,249/255,1)
}
return FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
}
anchors{ anchors{
top: parent.top top: parent.top
bottom: parent.bottom bottom: parent.bottom
@ -273,70 +286,29 @@ Item {
} }
} }
color: {
if(displayMode === FluNavigationView.Minimal){
return FluTheme.dark ? Qt.rgba(61/255,61/255,61/255,1) : Qt.rgba(243/255,243/255,243/255,1)
}
if(window && window.active){
return FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(238/255,244/255,249/255,1)
}
return FluTheme.dark ? Qt.rgba(32/255,32/255,32/255,1) : Qt.rgba(243/255,243/255,243/255,1)
}
Behavior on color{ Behavior on color{
ColorAnimation { ColorAnimation {
duration: 300 duration: 300
} }
} }
border.color: FluTheme.dark ? Qt.rgba(45/255,45/255,45/255,1) : Qt.rgba(226/255,230/255,234/255,1)
border.width: displayMode === FluNavigationView.Minimal ? 1 : 0
Item{ Item{
id:layout_header id:layout_header
width: layout_list.width width: layout_list.width
y:nav_app_bar.height y:nav_app_bar.height
height: textbox_search.height height: {
if(loader_auto_suggest_box.item){
return loader_auto_suggest_box.item.height
}
return 0
}
Loader{
id:loader_auto_suggest_box
anchors.horizontalCenter: parent.horizontalCenter
sourceComponent: autoSuggestBox
}
}
FluAutoSuggestBox{
id:textbox_search
width: 280
anchors.centerIn: parent
iconSource: FluentIcons.Zoom
values: {
var arr = []
if(items==null)
return arr
if(items.children==null)
return arr
for(var i=0;i<items.children.length;i++){
var item = items.children[i]
if(item instanceof FluPaneItem){
arr.push(item.title)
}
}
return arr
}
placeholderText: "查找"
onItemClicked:
(data)=>{
var arr = []
if(items==null)
return arr
if(items.children==null)
return arr
for(var i=0;i<items.children.length;i++){
if(items.children[i].title === data){
if(nav_list.currentIndex === i){
return
}
items.children[i].tap()
nav_list.currentIndex = i
return
}
}
}
}
}
ListView{ ListView{
id:nav_list id:nav_list
property bool enableStack: true property bool enableStack: true
@ -349,6 +321,7 @@ Item {
right: parent.right right: parent.right
bottom: layout_footer.top bottom: layout_footer.top
} }
highlightMoveDuration: 150
currentIndex: -1 currentIndex: -1
onCurrentIndexChanged: { onCurrentIndexChanged: {
if(enableStack){ if(enableStack){
@ -418,17 +391,8 @@ Item {
nav_list.currentIndex = index nav_list.currentIndex = index
} }
function startPageByTitle(title){ function getCurrentIndex(){
for(var i=0;i<items.children.length;i++){ return nav_list.currentIndex
if(items.children[i].title === title){
if(nav_list.currentIndex === i){
return
}
items.children[i].tap()
nav_list.currentIndex = i
return
}
}
} }
} }

View File

@ -1,8 +1,14 @@
import QtQuick 2.15 import QtQuick 2.15
import FluentUI 1.0
QtObject { QtObject {
readonly property string key : FluApp.uuid()
property string title property string title
property var icon property int icon
property bool recentlyAdded: false
property bool recentlyUpdated: false
property string desc
property var image
signal tap signal tap
signal repTap signal repTap
} }

View File

@ -1,5 +1,6 @@
import QtQuick 2.15 import QtQuick 2.15
QtObject { QtObject {
readonly property string key : FluApp.uuid()
property string title property string title
} }

View File

@ -1,5 +1,5 @@
import QtQuick 2.15 import QtQuick 2.15
QtObject { QtObject {
readonly property string key : FluApp.uuid()
} }