Compare commits

..

4 Commits

Author SHA1 Message Date
朱子楚\zhuzi
c2b845658d update 2024-04-03 13:24:30 +08:00
朱子楚\zhuzi
eb4ec242b1 update 2024-04-03 11:28:18 +08:00
朱子楚\zhuzi
a95916ab03 update 2024-04-03 11:19:35 +08:00
朱子楚\zhuzi
bf5bedc9ed update 2024-04-03 11:09:35 +08:00
16 changed files with 131 additions and 140 deletions

View File

@ -194,7 +194,6 @@
<file>res/image/ic_crash.png</file> <file>res/image/ic_crash.png</file>
<file>qml/window/CrashWindow.qml</file> <file>qml/window/CrashWindow.qml</file>
<file>qml/page/T_SplitLayout.qml</file> <file>qml/page/T_SplitLayout.qml</file>
<file>qml/window/FluentInitalizrWindow.qml</file>
<file>res/template/CMakeLists.txt.in</file> <file>res/template/CMakeLists.txt.in</file>
<file>res/template/src/App.qml.in</file> <file>res/template/src/App.qml.in</file>
<file>res/template/src/CMakeLists.txt.in</file> <file>res/template/src/CMakeLists.txt.in</file>
@ -209,5 +208,6 @@
<file>qml/page/T_Sheet.qml</file> <file>qml/page/T_Sheet.qml</file>
<file>qml/page/T_GroupBox.qml</file> <file>qml/page/T_GroupBox.qml</file>
<file>res/image/bg_scenic.jpg</file> <file>res/image/bg_scenic.jpg</file>
<file>qml/window/FluentInitializrWindow.qml</file>
</qresource> </qresource>
</RCC> </RCC>

View File

@ -38,35 +38,35 @@
</message> </message>
</context> </context>
<context> <context>
<name>FluentInitalizrWindow</name> <name>FluentInitializrWindow</name>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="11"/> <location filename="qml/window/FluentInitializrWindow.qml" line="11"/>
<location filename="qml/window/FluentInitalizrWindow.qml" line="30"/> <location filename="qml/window/FluentInitializrWindow.qml" line="30"/>
<source>FluentUI Initalizr</source> <source>FluentUI Initializr</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="51"/> <location filename="qml/window/FluentInitializrWindow.qml" line="51"/>
<source>Name</source> <source>Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="59"/> <location filename="qml/window/FluentInitializrWindow.qml" line="59"/>
<source>Create In</source> <source>Create In</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="63"/> <location filename="qml/window/FluentInitializrWindow.qml" line="63"/>
<source>Browse</source> <source>Browse</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="93"/> <location filename="qml/window/FluentInitializrWindow.qml" line="93"/>
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="101"/> <location filename="qml/window/FluentInitializrWindow.qml" line="101"/>
<source>Create</source> <source>Create</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -85,24 +85,24 @@
</message> </message>
</context> </context>
<context> <context>
<name>InitalizrHelper</name> <name>InitializrHelper</name>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="77"/> <location filename="src/helper/InitializrHelper.cpp" line="77"/>
<source>The name cannot be empty</source> <source>The name cannot be empty</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="81"/> <location filename="src/helper/InitializrHelper.cpp" line="81"/>
<source>The creation path cannot be empty</source> <source>The creation path cannot be empty</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="86"/> <location filename="src/helper/InitializrHelper.cpp" line="86"/>
<source>The path does not exist</source> <source>The path does not exist</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="92"/> <location filename="src/helper/InitializrHelper.cpp" line="92"/>
<source>%1 folder already exists</source> <source>%1 folder already exists</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1372,7 +1372,7 @@ My only desire is to be permitted to drive out the traitors and restore the Han.
</message> </message>
<message> <message>
<location filename="qml/page/T_Home.qml" line="32"/> <location filename="qml/page/T_Home.qml" line="32"/>
<source>FluentUI Initalizr</source> <source>FluentUI Initializr</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@ -2386,14 +2386,6 @@ Some contents...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>T_TreeView2</name>
<message>
<location filename="qml/page/T_TreeView2.qml" line="10"/>
<source>TreeView2</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>T_Typography</name> <name>T_Typography</name>
<message> <message>

View File

@ -38,35 +38,35 @@
</message> </message>
</context> </context>
<context> <context>
<name>FluentInitalizrWindow</name> <name>FluentInitializrWindow</name>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="11"/> <location filename="qml/window/FluentInitializrWindow.qml" line="11"/>
<location filename="qml/window/FluentInitalizrWindow.qml" line="30"/> <location filename="qml/window/FluentInitializrWindow.qml" line="30"/>
<source>FluentUI Initalizr</source> <source>FluentUI Initializr</source>
<translation type="unfinished">FluentUI脚手架</translation> <translation type="unfinished">FluentUI脚手架</translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="51"/> <location filename="qml/window/FluentInitializrWindow.qml" line="51"/>
<source>Name</source> <source>Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="59"/> <location filename="qml/window/FluentInitializrWindow.qml" line="59"/>
<source>Create In</source> <source>Create In</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="63"/> <location filename="qml/window/FluentInitializrWindow.qml" line="63"/>
<source>Browse</source> <source>Browse</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="93"/> <location filename="qml/window/FluentInitializrWindow.qml" line="93"/>
<source>Cancel</source> <source>Cancel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/window/FluentInitalizrWindow.qml" line="101"/> <location filename="qml/window/FluentInitializrWindow.qml" line="101"/>
<source>Create</source> <source>Create</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -85,26 +85,26 @@
</message> </message>
</context> </context>
<context> <context>
<name>InitalizrHelper</name> <name>InitializrHelper</name>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="77"/> <location filename="src/helper/InitializrHelper.cpp" line="77"/>
<source>The name cannot be empty</source> <source>The name cannot be empty</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="81"/> <location filename="src/helper/InitializrHelper.cpp" line="81"/>
<source>The creation path cannot be empty</source> <source>The creation path cannot be empty</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="86"/> <location filename="src/helper/InitializrHelper.cpp" line="86"/>
<source>The path does not exist</source> <source>The path does not exist</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="src/helper/InitalizrHelper.cpp" line="92"/> <location filename="src/helper/InitializrHelper.cpp" line="92"/>
<source>%1 folder already exists</source> <source>%1 folder already exists</source>
<translation type="unfinished"></translation> <translation type="unfinished">%1 </translation>
</message> </message>
</context> </context>
<context> <context>
@ -1403,7 +1403,7 @@ My only desire is to be permitted to drive out the traitors and restore the Han.
</message> </message>
<message> <message>
<location filename="qml/page/T_Home.qml" line="32"/> <location filename="qml/page/T_Home.qml" line="32"/>
<source>FluentUI Initalizr</source> <source>FluentUI Initializr</source>
<translation type="unfinished">FluentUI脚手架</translation> <translation type="unfinished">FluentUI脚手架</translation>
</message> </message>
<message> <message>
@ -2469,14 +2469,6 @@ Some contents...</source>
<translation type="unfinished">%1</translation> <translation type="unfinished">%1</translation>
</message> </message>
</context> </context>
<context>
<name>T_TreeView2</name>
<message>
<location filename="qml/page/T_TreeView2.qml" line="10"/>
<source>TreeView2</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>T_Typography</name> <name>T_Typography</name>
<message> <message>

View File

@ -12,8 +12,8 @@ FluScrollablePage{
animationEnabled: false animationEnabled: false
header: Item{} header: Item{}
FluentInitalizrWindow{ FluentInitializrWindow{
id:fluent_initalizr id:fluent_Initializr
} }
ListModel{ ListModel{
@ -29,11 +29,11 @@ FluScrollablePage{
} }
ListElement{ ListElement{
icon: "qrc:/example/res/image/favicon.ico" icon: "qrc:/example/res/image/favicon.ico"
title: qsTr("FluentUI Initalizr") title: qsTr("FluentUI Initializr")
desc: qsTr("FluentUI Initializr is a Tool that helps you create and customize Fluent UI projects with various options.") desc: qsTr("FluentUI Initializr is a Tool that helps you create and customize Fluent UI projects with various options.")
url: "https://github.com/zhuzichu520/FluentUI" url: "https://github.com/zhuzichu520/FluentUI"
clicked: function(model){ clicked: function(model){
fluent_initalizr.showDialog() fluent_Initializr.showDialog()
} }
} }
} }

View File

@ -8,14 +8,14 @@ import "../component"
FluWindowDialog { FluWindowDialog {
id:window id:window
title:qsTr("FluentUI Initalizr") title:qsTr("FluentUI Initializr")
width: 600 width: 600
height: 400 height: 400
contentDelegate:Component{ contentDelegate:Component{
Item{ Item{
Connections{ Connections{
target: InitalizrHelper target: InitializrHelper
function onError(message){ function onError(message){
showError(message) showError(message)
} }
@ -27,7 +27,7 @@ FluWindowDialog {
FluText{ FluText{
id:text_title id:text_title
text:qsTr("FluentUI Initalizr") text:qsTr("FluentUI Initializr")
font: FluTextStyle.Title font: FluTextStyle.Title
anchors{ anchors{
left: parent.left left: parent.left
@ -102,7 +102,7 @@ FluWindowDialog {
width: 120 width: 120
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
onClicked: { onClicked: {
InitalizrHelper.generate(text_box_name.text,text_box_path.text) InitializrHelper.generate(text_box_name.text,text_box_path.text)
} }
} }
} }

View File

@ -1,16 +1,16 @@
#include "InitalizrHelper.h" #include "InitializrHelper.h"
#include <QDir> #include <QDir>
#include <QGuiApplication> #include <QGuiApplication>
InitalizrHelper::InitalizrHelper(QObject *parent) : QObject(parent) InitializrHelper::InitializrHelper(QObject *parent) : QObject(parent)
{ {
} }
InitalizrHelper::~InitalizrHelper() = default; InitializrHelper::~InitializrHelper() = default;
bool InitalizrHelper::copyDir(const QDir& fromDir, const QDir& toDir, bool coverIfFileExists){ bool InitializrHelper::copyDir(const QDir& fromDir, const QDir& toDir, bool coverIfFileExists){
QDir _formDir = fromDir; QDir _formDir = fromDir;
QDir _toDir = toDir; QDir _toDir = toDir;
if(!_toDir.exists()) if(!_toDir.exists())
@ -44,7 +44,7 @@ bool InitalizrHelper::copyDir(const QDir& fromDir, const QDir& toDir, bool cover
} }
template <typename...Args> template <typename...Args>
void InitalizrHelper::templateToFile(const QString& source,const QString& dest,Args &&...args){ void InitializrHelper::templateToFile(const QString& source,const QString& dest,Args &&...args){
QFile file(source); QFile file(source);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file); QTextStream in(&file);
@ -67,12 +67,12 @@ void InitalizrHelper::templateToFile(const QString& source,const QString& dest,A
} }
} }
void InitalizrHelper::copyFile(const QString& source,const QString& dest){ void InitializrHelper::copyFile(const QString& source,const QString& dest){
QFile::copy(source,dest); QFile::copy(source,dest);
QFile::setPermissions(dest, QFile::WriteOwner | QFile::WriteUser | QFile::WriteGroup | QFile::WriteOther); QFile::setPermissions(dest, QFile::WriteOwner | QFile::WriteUser | QFile::WriteGroup | QFile::WriteOther);
} }
void InitalizrHelper::generate(const QString& name,const QString& path){ void InitializrHelper::generate(const QString& name,const QString& path){
if(name.isEmpty()){ if(name.isEmpty()){
error(tr("The name cannot be empty")); error(tr("The name cannot be empty"));
return; return;

View File

@ -1,26 +1,26 @@
#ifndef INITALIZRHELPER_H #ifndef INITIALIZRHELPER_H
#define INITALIZRHELPER_H #define INITIALIZRHELPER_H
#include <QObject> #include <QObject>
#include <QtQml/qqml.h> #include <QtQml/qqml.h>
#include <QDir> #include <QDir>
#include "src/singleton.h" #include "src/singleton.h"
class InitalizrHelper : public QObject class InitializrHelper : public QObject
{ {
Q_OBJECT Q_OBJECT
private: private:
explicit InitalizrHelper(QObject* parent = nullptr); explicit InitializrHelper(QObject* parent = nullptr);
bool copyDir(const QDir& fromDir, const QDir& toDir, bool coverIfFileExists = true); bool copyDir(const QDir& fromDir, const QDir& toDir, bool coverIfFileExists = true);
void copyFile(const QString& source,const QString& dest); void copyFile(const QString& source,const QString& dest);
template <typename...Args> template <typename...Args>
void templateToFile(const QString& source,const QString& dest,Args &&...args); void templateToFile(const QString& source,const QString& dest,Args &&...args);
public: public:
SINGLETON(InitalizrHelper) SINGLETON(InitializrHelper)
~InitalizrHelper() override; ~InitializrHelper() override;
Q_INVOKABLE void generate(const QString& name,const QString& path); Q_INVOKABLE void generate(const QString& name,const QString& path);
Q_SIGNAL void error(const QString& message); Q_SIGNAL void error(const QString& message);
Q_SIGNAL void success(const QString& path); Q_SIGNAL void success(const QString& path);
}; };
#endif // INITALIZRHELPER_H #endif // INITIALIZRHELPER_H

View File

@ -15,7 +15,7 @@
#include "src/component/FileWatcher.h" #include "src/component/FileWatcher.h"
#include "src/component/FpsItem.h" #include "src/component/FpsItem.h"
#include "src/helper/SettingsHelper.h" #include "src/helper/SettingsHelper.h"
#include "src/helper/InitalizrHelper.h" #include "src/helper/InitializrHelper.h"
#include "src/helper/TranslateHelper.h" #include "src/helper/TranslateHelper.h"
#include "src/helper/Network.h" #include "src/helper/Network.h"
@ -79,7 +79,7 @@ int main(int argc, char *argv[])
TranslateHelper::getInstance()->init(&engine); TranslateHelper::getInstance()->init(&engine);
engine.rootContext()->setContextProperty("AppInfo",AppInfo::getInstance()); engine.rootContext()->setContextProperty("AppInfo",AppInfo::getInstance());
engine.rootContext()->setContextProperty("SettingsHelper",SettingsHelper::getInstance()); engine.rootContext()->setContextProperty("SettingsHelper",SettingsHelper::getInstance());
engine.rootContext()->setContextProperty("InitalizrHelper",InitalizrHelper::getInstance()); engine.rootContext()->setContextProperty("InitializrHelper",InitializrHelper::getInstance());
engine.rootContext()->setContextProperty("TranslateHelper",TranslateHelper::getInstance()); engine.rootContext()->setContextProperty("TranslateHelper",TranslateHelper::getInstance());
engine.rootContext()->setContextProperty("Network",Network::getInstance()); engine.rootContext()->setContextProperty("Network",Network::getInstance());
#ifdef FLUENTUI_BUILD_STATIC_LIB #ifdef FLUENTUI_BUILD_STATIC_LIB

View File

@ -3,6 +3,7 @@
#include <QQuickWindow> #include <QQuickWindow>
#include <QGuiApplication> #include <QGuiApplication>
#include <QScreen> #include <QScreen>
#include <QDateTime>
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
#pragma comment (lib,"user32.lib") #pragma comment (lib,"user32.lib")
@ -62,9 +63,6 @@ void FluFrameless::componentComplete(){
} }
window()->installEventFilter(this); window()->installEventFilter(this);
qApp->installNativeEventFilter(this); qApp->installNativeEventFilter(this);
if(_appbar){
_appbar->installEventFilter(this);
}
if(_maximizeButton){ if(_maximizeButton){
setHitTestVisible(_maximizeButton); setHitTestVisible(_maximizeButton);
} }
@ -425,9 +423,20 @@ bool FluFrameless::eventFilter(QObject *obj, QEvent *ev){
} }
}else{ }else{
if(_hitAppBar()){ if(_hitAppBar()){
qint64 clickTimer = QDateTime::currentMSecsSinceEpoch();
qint64 offset = clickTimer - this->_clickTimer;
this->_clickTimer = clickTimer;
if(offset<300){
if(_isMaximized()){
showNormal();
}else{
showMaximized();
}
}else{
window()->startSystemMove(); window()->startSystemMove();
} }
} }
}
break; break;
case QEvent::MouseButtonRelease: case QEvent::MouseButtonRelease:
_edges = 0; _edges = 0;

View File

@ -54,6 +54,7 @@ private:
qint64 _current; qint64 _current;
int _edges = 0; int _edges = 0;
int _margins = 8; int _margins = 8;
qint64 _clickTimer = 0;
QList<QPointer<QQuickItem>> _hitTestList; QList<QPointer<QQuickItem>> _hitTestList;
}; };

View File

@ -2,7 +2,7 @@
#include <QMetaEnum> #include <QMetaEnum>
FluNode::FluNode(QObject *parent): QObject{parent}{ FluTreeNode::FluTreeNode(QObject *parent): QObject{parent}{
} }
FluTreeModel::FluTreeModel(QObject *parent): QAbstractItemModel{parent}{ FluTreeModel::FluTreeModel(QObject *parent): QAbstractItemModel{parent}{
@ -41,7 +41,7 @@ QHash<int, QByteArray> FluTreeModel::roleNames() const {
return { {Qt::DisplayRole, "dataModel"} }; return { {Qt::DisplayRole, "dataModel"} };
}; };
void FluTreeModel::setData(QList<FluNode*> data){ void FluTreeModel::setData(QList<FluTreeNode*> data){
beginResetModel(); beginResetModel();
_rows = data; _rows = data;
endResetModel(); endResetModel();
@ -51,20 +51,20 @@ void FluTreeModel::removeRows(int row,int count){
if (row < 0 || row + count > _rows.size() || count==0) if (row < 0 || row + count > _rows.size() || count==0)
return; return;
beginRemoveRows(QModelIndex(),row, row + count - 1); beginRemoveRows(QModelIndex(),row, row + count - 1);
QList<FluNode*> firstPart = _rows.mid(0,row); QList<FluTreeNode*> firstPart = _rows.mid(0,row);
QList<FluNode*> secondPart = _rows.mid(row + count); QList<FluTreeNode*> secondPart = _rows.mid(row + count);
_rows.clear(); _rows.clear();
_rows.append(firstPart); _rows.append(firstPart);
_rows.append(secondPart); _rows.append(secondPart);
endRemoveRows(); endRemoveRows();
} }
void FluTreeModel::insertRows(int row,QList<FluNode*> data){ void FluTreeModel::insertRows(int row,QList<FluTreeNode*> data){
if (row < 0 || row > _rows.size() || data.size() == 0) if (row < 0 || row > _rows.size() || data.size() == 0)
return;; return;;
beginInsertRows(QModelIndex(), row, row + data.size() - 1); beginInsertRows(QModelIndex(), row, row + data.size() - 1);
QList<FluNode*> firstPart = _rows.mid(0, row); QList<FluTreeNode*> firstPart = _rows.mid(0, row);
QList<FluNode*> secondPart = _rows.mid(row); QList<FluTreeNode*> secondPart = _rows.mid(row);
_rows.clear(); _rows.clear();
_rows.append(firstPart); _rows.append(firstPart);
_rows.append(data); _rows.append(data);
@ -79,7 +79,7 @@ QObject* FluTreeModel::getRow(int row){
void FluTreeModel::checkRow(int row,bool checked){ void FluTreeModel::checkRow(int row,bool checked){
auto itemData = _rows.at(row); auto itemData = _rows.at(row);
if(itemData->hasChildren()){ if(itemData->hasChildren()){
QList<FluNode*> stack = itemData->_children; QList<FluTreeNode*> stack = itemData->_children;
std::reverse(stack.begin(), stack.end()); std::reverse(stack.begin(), stack.end());
while (stack.count() > 0) { while (stack.count() > 0) {
auto item = stack.at(stack.count()-1); auto item = stack.at(stack.count()-1);
@ -87,7 +87,7 @@ void FluTreeModel::checkRow(int row,bool checked){
if(!item->hasChildren()){ if(!item->hasChildren()){
item->_checked = checked; item->_checked = checked;
} }
QList<FluNode*> children = item->_children; QList<FluTreeNode*> children = item->_children;
if(!children.isEmpty()){ if(!children.isEmpty()){
std::reverse(children.begin(), children.end()); std::reverse(children.begin(), children.end());
foreach (auto c, children) { foreach (auto c, children) {
@ -101,8 +101,8 @@ void FluTreeModel::checkRow(int row,bool checked){
} }
itemData->_checked = checked; itemData->_checked = checked;
} }
Q_EMIT layoutChanged(QList<QPersistentModelIndex>(),QAbstractItemModel::VerticalSortHint); Q_EMIT dataChanged(index(0,0),index(rowCount()-1,0));
QList<FluNode*> data; QList<FluTreeNode*> data;
foreach (auto item, _dataSource) { foreach (auto item, _dataSource) {
if(!item->hasChildren()){ if(!item->hasChildren()){
if(item->_checked){ if(item->_checked){
@ -119,16 +119,16 @@ void FluTreeModel::setDataSource(QList<QMap<QString,QVariant>> data){
delete _root; delete _root;
_root = nullptr; _root = nullptr;
} }
_root = new FluNode(this); _root = new FluTreeNode(this);
std::reverse(data.begin(), data.end()); std::reverse(data.begin(), data.end());
while (data.count() > 0) { while (data.count() > 0) {
auto item = data.at(data.count()-1); auto item = data.at(data.count()-1);
data.pop_back(); data.pop_back();
FluNode* node = new FluNode(this); FluTreeNode* node = new FluTreeNode(this);
node->_title = item.value("title").toString(); node->_title = item.value("title").toString();
node->_key = item.value("key").toString(); node->_key = item.value("key").toString();
node->_depth = item.value("__depth").toInt(); node->_depth = item.value("__depth").toInt();
node->_parent = item.value("__parent").value<FluNode*>(); node->_parent = item.value("__parent").value<FluTreeNode*>();
node->_isExpanded = true; node->_isExpanded = true;
if(node->_parent){ if(node->_parent){
node->_parent->_children.append(node); node->_parent->_children.append(node);
@ -181,8 +181,8 @@ void FluTreeModel::expand(int row){
_rows.at(row)->_isExpanded = true; _rows.at(row)->_isExpanded = true;
Q_EMIT dataChanged(index(row,0),index(row,0)); Q_EMIT dataChanged(index(row,0),index(row,0));
auto modelData = _rows.at(row); auto modelData = _rows.at(row);
QList<FluNode*> insertData; QList<FluTreeNode*> insertData;
QList<FluNode*> stack = modelData->_children; QList<FluTreeNode*> stack = modelData->_children;
std::reverse(stack.begin(), stack.end()); std::reverse(stack.begin(), stack.end());
while (stack.count() > 0) { while (stack.count() > 0) {
auto item = stack.at(stack.count()-1); auto item = stack.at(stack.count()-1);
@ -190,7 +190,7 @@ void FluTreeModel::expand(int row){
if(item->isShown()){ if(item->isShown()){
insertData.append(item); insertData.append(item);
} }
QList<FluNode*> children = item->_children; QList<FluTreeNode*> children = item->_children;
if(!children.isEmpty()){ if(!children.isEmpty()){
std::reverse(children.begin(), children.end()); std::reverse(children.begin(), children.end());
foreach (auto c, children) { foreach (auto c, children) {
@ -242,7 +242,7 @@ void FluTreeModel::dragAndDrop(int dragIndex,int dropIndex,bool isDropTopArea){
Q_EMIT layoutAboutToBeChanged(); Q_EMIT layoutAboutToBeChanged();
if(dragItem->_parent == dropItem->_parent){ if(dragItem->_parent == dropItem->_parent){
QList<FluNode*>* children = &(dragItem->_parent->_children); QList<FluTreeNode*>* children = &(dragItem->_parent->_children);
int srcIndex = children->indexOf(dragItem); int srcIndex = children->indexOf(dragItem);
int destIndex = children->indexOf(dropItem); int destIndex = children->indexOf(dropItem);
if(dropIndex > dragIndex){ if(dropIndex > dragIndex){
@ -260,14 +260,14 @@ void FluTreeModel::dragAndDrop(int dragIndex,int dropIndex,bool isDropTopArea){
} }
children->move(srcIndex,targetIndex); children->move(srcIndex,targetIndex);
}else{ }else{
QList<FluNode*>* srcChildren = &(dragItem->_parent->_children); QList<FluTreeNode*>* srcChildren = &(dragItem->_parent->_children);
QList<FluNode*>* destChildren = &(dropItem->_parent->_children); QList<FluTreeNode*>* destChildren = &(dropItem->_parent->_children);
int srcIndex = srcChildren->indexOf(dragItem); int srcIndex = srcChildren->indexOf(dragItem);
int destIndex = destChildren->indexOf(dropItem); int destIndex = destChildren->indexOf(dropItem);
dragItem->_depth = dropItem->_depth; dragItem->_depth = dropItem->_depth;
dragItem->_parent = dropItem->_parent; dragItem->_parent = dropItem->_parent;
if(dragItem->hasChildren()){ if(dragItem->hasChildren()){
QList<FluNode*> stack = dragItem->_children; QList<FluTreeNode*> stack = dragItem->_children;
foreach (auto node, stack) { foreach (auto node, stack) {
node->_depth = dragItem->_depth+1; node->_depth = dragItem->_depth+1;
} }
@ -275,7 +275,7 @@ void FluTreeModel::dragAndDrop(int dragIndex,int dropIndex,bool isDropTopArea){
while (stack.count() > 0) { while (stack.count() > 0) {
auto item = stack.at(stack.count()-1); auto item = stack.at(stack.count()-1);
stack.pop_back(); stack.pop_back();
QList<FluNode*> children = item->_children; QList<FluTreeNode*> children = item->_children;
if(!children.isEmpty()){ if(!children.isEmpty()){
std::reverse(children.begin(), children.end()); std::reverse(children.begin(), children.end());
foreach (auto c, children) { foreach (auto c, children) {
@ -302,8 +302,7 @@ void FluTreeModel::dragAndDrop(int dragIndex,int dropIndex,bool isDropTopArea){
destChildren->insert(targetIndex,dragItem); destChildren->insert(targetIndex,dragItem);
} }
changePersistentIndex(index(qMin(dragIndex,dropIndex),0),index(qMax(dragIndex,dropIndex),0)); changePersistentIndex(index(qMin(dragIndex,dropIndex),0),index(qMax(dragIndex,dropIndex),0));
Q_EMIT layoutChanged(QList<QPersistentModelIndex>(),QAbstractItemModel::VerticalSortHint); Q_EMIT dataChanged(index(0,0),index(rowCount()-1,0));
} }
bool FluTreeModel::hitHasChildrenExpanded(int row){ bool FluTreeModel::hitHasChildrenExpanded(int row){
@ -318,14 +317,14 @@ void FluTreeModel::refreshNode(int row){
Q_EMIT dataChanged(index(row,0),index(row,0)); Q_EMIT dataChanged(index(row,0),index(row,0));
}; };
FluNode* FluTreeModel::getNode(int row){ FluTreeNode* FluTreeModel::getNode(int row){
return _rows.at(row); return _rows.at(row);
} }
void FluTreeModel::allExpand(){ void FluTreeModel::allExpand(){
beginResetModel(); beginResetModel();
QList<FluNode*> data; QList<FluTreeNode*> data;
QList<FluNode*> stack = _root->_children; QList<FluTreeNode*> stack = _root->_children;
std::reverse(stack.begin(), stack.end()); std::reverse(stack.begin(), stack.end());
while (stack.count() > 0) { while (stack.count() > 0) {
auto item = stack.at(stack.count()-1); auto item = stack.at(stack.count()-1);
@ -334,7 +333,7 @@ void FluTreeModel::allExpand(){
item->_isExpanded = true; item->_isExpanded = true;
} }
data.append(item); data.append(item);
QList<FluNode*> children = item->_children; QList<FluTreeNode*> children = item->_children;
if(!children.isEmpty()){ if(!children.isEmpty()){
std::reverse(children.begin(), children.end()); std::reverse(children.begin(), children.end());
foreach (auto c, children) { foreach (auto c, children) {
@ -347,7 +346,7 @@ void FluTreeModel::allExpand(){
} }
void FluTreeModel::allCollapse(){ void FluTreeModel::allCollapse(){
beginResetModel(); beginResetModel();
QList<FluNode*> stack = _root->_children; QList<FluTreeNode*> stack = _root->_children;
std::reverse(stack.begin(), stack.end()); std::reverse(stack.begin(), stack.end());
while (stack.count() > 0) { while (stack.count() > 0) {
auto item = stack.at(stack.count()-1); auto item = stack.at(stack.count()-1);
@ -355,7 +354,7 @@ void FluTreeModel::allCollapse(){
if(item->hasChildren()){ if(item->hasChildren()){
item->_isExpanded = false; item->_isExpanded = false;
} }
QList<FluNode*> children = item->_children; QList<FluTreeNode*> children = item->_children;
if(!children.isEmpty()){ if(!children.isEmpty()){
std::reverse(children.begin(), children.end()); std::reverse(children.begin(), children.end());
foreach (auto c, children) { foreach (auto c, children) {

View File

@ -8,9 +8,9 @@
#include "stdafx.h" #include "stdafx.h"
/** /**
* @brief The FluNode class * @brief The FluTreeNode class
*/ */
class FluNode : public QObject{ class FluTreeNode : public QObject{
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString key READ key CONSTANT) Q_PROPERTY(QString key READ key CONSTANT)
Q_PROPERTY(QString title READ title CONSTANT) Q_PROPERTY(QString title READ title CONSTANT)
@ -18,14 +18,14 @@ class FluNode : public QObject{
Q_PROPERTY(bool isExpanded READ isExpanded CONSTANT) Q_PROPERTY(bool isExpanded READ isExpanded CONSTANT)
Q_PROPERTY(bool checked READ checked CONSTANT) Q_PROPERTY(bool checked READ checked CONSTANT)
public: public:
explicit FluNode(QObject *parent = nullptr); explicit FluTreeNode(QObject *parent = nullptr);
Q_INVOKABLE QString key(){return _key;}; Q_INVOKABLE QString key(){return _key;};
Q_INVOKABLE QString title(){return _title;}; Q_INVOKABLE QString title(){return _title;};
Q_INVOKABLE int depth(){return _depth;}; Q_INVOKABLE int depth(){return _depth;};
Q_INVOKABLE bool isExpanded(){return _isExpanded;}; Q_INVOKABLE bool isExpanded(){return _isExpanded;};
Q_INVOKABLE bool hasChildren(){ return !_children.isEmpty();}; Q_INVOKABLE bool hasChildren(){ return !_children.isEmpty();};
Q_INVOKABLE bool hasNextNodeByIndex(int index){ Q_INVOKABLE bool hasNextNodeByIndex(int index){
FluNode* p = this; FluTreeNode* p = this;
for(int i=0;i<(_depth - index -1);i++){ for(int i=0;i<(_depth - index -1);i++){
p = p->_parent; p = p->_parent;
} }
@ -75,15 +75,15 @@ public:
int _depth=0; int _depth=0;
bool _checked = false; bool _checked = false;
bool _isExpanded=true; bool _isExpanded=true;
QList<FluNode*> _children; QList<FluTreeNode*> _children;
FluNode* _parent = nullptr; FluTreeNode* _parent = nullptr;
}; };
class FluTreeModel : public QAbstractItemModel class FluTreeModel : public QAbstractItemModel
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY_AUTO(int,dataSourceSize) Q_PROPERTY_AUTO(int,dataSourceSize)
Q_PROPERTY_AUTO(QList<FluNode*>,selectionModel) Q_PROPERTY_AUTO(QList<FluTreeNode*>,selectionModel)
QML_NAMED_ELEMENT(FluTreeModel) QML_NAMED_ELEMENT(FluTreeModel)
QML_ADDED_IN_MINOR_VERSION(1) QML_ADDED_IN_MINOR_VERSION(1)
public: public:
@ -96,23 +96,23 @@ public:
QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const override; QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const override;
Q_INVOKABLE void removeRows(int row,int count); Q_INVOKABLE void removeRows(int row,int count);
Q_INVOKABLE void insertRows(int row,QList<FluNode*> data); Q_INVOKABLE void insertRows(int row,QList<FluTreeNode*> data);
Q_INVOKABLE QObject* getRow(int row); Q_INVOKABLE QObject* getRow(int row);
Q_INVOKABLE void setData(QList<FluNode*> data); Q_INVOKABLE void setData(QList<FluTreeNode*> data);
Q_INVOKABLE void setDataSource(QList<QMap<QString,QVariant>> data); Q_INVOKABLE void setDataSource(QList<QMap<QString,QVariant>> data);
Q_INVOKABLE void collapse(int row); Q_INVOKABLE void collapse(int row);
Q_INVOKABLE void expand(int row); Q_INVOKABLE void expand(int row);
Q_INVOKABLE void dragAndDrop(int dragIndex,int dropIndex,bool isDropTopArea); Q_INVOKABLE void dragAndDrop(int dragIndex,int dropIndex,bool isDropTopArea);
Q_INVOKABLE FluNode* getNode(int row); Q_INVOKABLE FluTreeNode* getNode(int row);
Q_INVOKABLE void refreshNode(int row); Q_INVOKABLE void refreshNode(int row);
Q_INVOKABLE void checkRow(int row,bool checked); Q_INVOKABLE void checkRow(int row,bool checked);
Q_INVOKABLE bool hitHasChildrenExpanded(int row); Q_INVOKABLE bool hitHasChildrenExpanded(int row);
Q_INVOKABLE void allExpand(); Q_INVOKABLE void allExpand();
Q_INVOKABLE void allCollapse(); Q_INVOKABLE void allCollapse();
private: private:
QList<FluNode*> _rows; QList<FluTreeNode*> _rows;
QList<FluNode*> _dataSource; QList<FluTreeNode*> _dataSource;
FluNode* _root = nullptr; FluTreeNode* _root = nullptr;
}; };
#endif // FLUTREEMODEL_H #endif // FLUTREEMODEL_H

View File

@ -5,16 +5,17 @@ import Qt.labs.qmlmodels 1.0
import FluentUI 1.0 import FluentUI 1.0
Rectangle { Rectangle {
readonly property alias rows: table_view.rows
readonly property alias columns: table_view.columns
readonly property alias current: d.current
readonly property alias sourceModel: table_model
property var columnSource property var columnSource
property var dataSource property var dataSource
property color borderColor: FluTheme.dark ? "#252525" : "#e4e4e4" property color borderColor: FluTheme.dark ? Qt.rgba(37/255,37/255,37/255,1) : Qt.rgba(228/255,228/255,228/255,1)
property alias rows: table_view.rows
property alias columns: table_view.columns
property bool horizonalHeaderVisible: true property bool horizonalHeaderVisible: true
property bool verticalHeaderVisible: true property bool verticalHeaderVisible: true
property color selectedBorderColor: FluTheme.primaryColor property color selectedBorderColor: FluTheme.primaryColor
property color selectedColor: FluTools.colorAlpha(FluTheme.primaryColor,0.3) property color selectedColor: FluTools.colorAlpha(FluTheme.primaryColor,0.3)
property alias sourceModel: table_model
id:control id:control
color: FluTheme.dark ? Qt.rgba(39/255,39/255,39/255,1) : Qt.rgba(251/255,251/255,253/255,1) color: FluTheme.dark ? Qt.rgba(39/255,39/255,39/255,1) : Qt.rgba(251/255,251/255,253/255,1)
onColumnSourceChanged: { onColumnSourceChanged: {
@ -379,7 +380,7 @@ Rectangle {
model: table_sort_model model: table_sort_model
clip: true clip: true
onRowsChanged: { onRowsChanged: {
closeEditor() control.closeEditor()
} }
delegate: com_table_delegate delegate: com_table_delegate
FluLoader{ FluLoader{
@ -492,7 +493,7 @@ Rectangle {
} }
onClicked: onClicked:
(event)=>{ (event)=>{
closeEditor() control.closeEditor()
} }
} }
FluLoader{ FluLoader{
@ -623,7 +624,7 @@ Rectangle {
} }
onClicked: onClicked:
(event)=>{ (event)=>{
closeEditor() control.closeEditor()
} }
} }
MouseArea{ MouseArea{

View File

@ -6,16 +6,17 @@ import Qt.labs.qmlmodels
import FluentUI import FluentUI
Rectangle { Rectangle {
readonly property alias rows: table_view.rows
readonly property alias columns: table_view.columns
readonly property alias current: d.current
readonly property alias sourceModel: table_model
property var columnSource property var columnSource
property var dataSource property var dataSource
property color borderColor: FluTheme.dark ? "#252525" : "#e4e4e4" property color borderColor: FluTheme.dark ? Qt.rgba(37/255,37/255,37/255,1) : Qt.rgba(228/255,228/255,228/255,1)
property alias rows: table_view.rows
property alias columns: table_view.columns
property bool horizonalHeaderVisible: true property bool horizonalHeaderVisible: true
property bool verticalHeaderVisible: true property bool verticalHeaderVisible: true
property color selectedBorderColor: FluTheme.primaryColor property color selectedBorderColor: FluTheme.primaryColor
property color selectedColor: FluTools.colorAlpha(FluTheme.primaryColor,0.3) property color selectedColor: FluTools.colorAlpha(FluTheme.primaryColor,0.3)
property alias sourceModel: table_model
id:control id:control
color: FluTheme.dark ? Qt.rgba(39/255,39/255,39/255,1) : Qt.rgba(251/255,251/255,253/255,1) color: FluTheme.dark ? Qt.rgba(39/255,39/255,39/255,1) : Qt.rgba(251/255,251/255,253/255,1)
onColumnSourceChanged: { onColumnSourceChanged: {

View File

@ -8,12 +8,12 @@ FluButton {
property int hourFormat: FluTimePickerType.H property int hourFormat: FluTimePickerType.H
property int isH: hourFormat === FluTimePickerType.H property int isH: hourFormat === FluTimePickerType.H
property var current property var current
property string amText: "上午" property string amText: qsTr("AM")
property string pmText: "下午" property string pmText: qsTr("PM")
property string hourText: "时" property string hourText: qsTr("Hour")
property string minuteText: "分" property string minuteText: qsTr("Minute")
property string cancelText: "取消" property string cancelText: qsTr("Cancel")
property string okText: "确定" property string okText: qsTr("OK")
signal accepted() signal accepted()
id:control id:control
implicitHeight: 30 implicitHeight: 30

View File

@ -63,10 +63,6 @@
</context> </context>
<context> <context>
<name>FluCalendarPicker</name> <name>FluCalendarPicker</name>
<message>
<source>Please select a date</source>
<translation type="obsolete"></translation>
</message>
<message> <message>
<location filename="Qt5/imports/FluentUI/Controls/FluCalendarPicker.qml" line="13"/> <location filename="Qt5/imports/FluentUI/Controls/FluCalendarPicker.qml" line="13"/>
<location filename="Qt6/imports/FluentUI/Controls/FluCalendarPicker.qml" line="12"/> <location filename="Qt6/imports/FluentUI/Controls/FluCalendarPicker.qml" line="12"/>