This commit is contained in:
朱子楚\zhuzi 2023-09-22 00:11:58 +08:00
parent a96191b2af
commit 77d9b4bde9
8 changed files with 263 additions and 262 deletions

View File

@ -5,7 +5,7 @@ import QtQuick.Controls
import FluentUI import FluentUI
import "qrc:///example/qml/component" import "qrc:///example/qml/component"
FluScrollablePage { FluContentPage {
title:"TreeView" title:"TreeView"
@ -28,105 +28,94 @@ FluScrollablePage {
return dig(); return dig();
} }
FluArea{ Column{
Layout.fillWidth: true id:layout_column
Layout.topMargin: 10 spacing: 12
paddings: 10 width: 300
height: 80 anchors{
Column{ topMargin: 20
anchors.verticalCenter: parent.verticalCenter top:parent.top
left: parent.left
leftMargin: 10
bottom:parent.bottom
bottomMargin: 20
}
FluText{
text:"共计%1条数据当前显示的%2条数据".arg(tree_view.count()).arg(tree_view.visibleCount())
}
RowLayout{
spacing: 10 spacing: 10
FluText{ FluText{
text:"高性能树控件新的TreeView用TableView实现" text:"cellHeight:"
Layout.alignment: Qt.AlignVCenter
} }
FluSlider{
id:slider_cell_height
value: 30
from: 30
to:100
}
}
RowLayout{
spacing: 10
FluText{ FluText{
text:"共计:%1条数据当前显示的%2条数据".arg(tree_view.count()).arg(tree_view.visibleCount()) text:"depthPadding:"
Layout.alignment: Qt.AlignVCenter
}
FluSlider{
id:slider_depth_padding
value: 30
from: 30
to:100
}
}
FluToggleSwitch{
id:switch_showline
text:"showLine"
checked: true
}
FluToggleSwitch{
id:switch_draggable
text:"draggable"
checked: true
}
FluButton{
text:"all expand"
onClicked: {
tree_view.allExpand()
}
}
FluButton{
text:"all collapse"
onClicked: {
tree_view.allCollapse()
} }
} }
} }
FluArea{ FluArea{
Layout.fillWidth: true anchors{
Layout.topMargin: 10 left: layout_column.right
paddings: 10 top: parent.top
height: 420 bottom: parent.bottom
Item{ right: parent.right
anchors.fill: tree_view rightMargin: 5
FluShadow{} topMargin: 5
bottomMargin: 5
} }
FluShadow{}
FluTreeView{ FluTreeView{
id:tree_view id:tree_view
width:slider_width.value anchors.fill: parent
anchors{ cellHeight: slider_cell_height.value
top:parent.top
left:parent.left
bottom:parent.bottom
}
draggable:switch_draggable.checked draggable:switch_draggable.checked
showLine: switch_showline.checked showLine: switch_showline.checked
depthPadding: slider_depth_padding.value
Component.onCompleted: { Component.onCompleted: {
var data = treeData() var data = treeData()
dataSource = data dataSource = data
} }
} }
Column{
spacing: 15
anchors{
top:parent.top
topMargin: 10
bottomMargin: 10
rightMargin: 10
bottom:parent.bottom
right: parent.right
}
RowLayout{
spacing: 10
FluText{
text:"width:"
Layout.alignment: Qt.AlignVCenter
}
FluSlider{
id:slider_width
value: 280
from: 160
to:400
}
}
FluToggleSwitch{
id:switch_showline
text:"showLine"
checked: true
}
FluToggleSwitch{
id:switch_draggable
text:"draggable"
checked: true
}
FluButton{
text:"all expand"
onClicked: {
tree_view.allExpand()
}
}
FluButton{
text:"all collapse"
onClicked: {
tree_view.allCollapse()
}
}
}
}
CodeExpander{
Layout.fillWidth: true
Layout.topMargin: -1
code:'FluTreeView{
id:tree_view
width:240
height:600
Component.onCompleted: {
var data = treeData()
dataSource = data
}
}
'
} }
} }

View File

@ -183,7 +183,7 @@ CustomWindow {
z:999 z:999
//StackpopFluPagelaunchMode //StackpopFluPagelaunchMode
// pageMode: FluNavigationViewType.Stack // pageMode: FluNavigationViewType.Stack
//NoStack //NoStackFluViewModel
pageMode: FluNavigationViewType.NoStack pageMode: FluNavigationViewType.NoStack
items: ItemsOriginal items: ItemsOriginal
footerItems:ItemsFooter footerItems:ItemsFooter

View File

@ -6,7 +6,7 @@ import FluentUI 1.0
import "qrc:///example/qml/component" import "qrc:///example/qml/component"
import "../component" import "../component"
FluScrollablePage { FluContentPage {
title:"TreeView" title:"TreeView"
@ -29,105 +29,94 @@ FluScrollablePage {
return dig(); return dig();
} }
FluArea{ Column{
Layout.fillWidth: true id:layout_column
Layout.topMargin: 10 spacing: 12
paddings: 10 width: 300
height: 80 anchors{
Column{ topMargin: 20
anchors.verticalCenter: parent.verticalCenter top:parent.top
left: parent.left
leftMargin: 10
bottom:parent.bottom
bottomMargin: 20
}
FluText{
text:"共计%1条数据当前显示的%2条数据".arg(tree_view.count()).arg(tree_view.visibleCount())
}
RowLayout{
spacing: 10 spacing: 10
FluText{ FluText{
text:"高性能树控件新的TreeView用TableView实现" text:"cellHeight:"
Layout.alignment: Qt.AlignVCenter
} }
FluSlider{
id:slider_cell_height
value: 30
from: 30
to:100
}
}
RowLayout{
spacing: 10
FluText{ FluText{
text:"共计:%1条数据当前显示的%2条数据".arg(tree_view.count()).arg(tree_view.visibleCount()) text:"depthPadding:"
Layout.alignment: Qt.AlignVCenter
}
FluSlider{
id:slider_depth_padding
value: 30
from: 30
to:100
}
}
FluToggleSwitch{
id:switch_showline
text:"showLine"
checked: true
}
FluToggleSwitch{
id:switch_draggable
text:"draggable"
checked: true
}
FluButton{
text:"all expand"
onClicked: {
tree_view.allExpand()
}
}
FluButton{
text:"all collapse"
onClicked: {
tree_view.allCollapse()
} }
} }
} }
FluArea{ FluArea{
Layout.fillWidth: true anchors{
Layout.topMargin: 10 left: layout_column.right
paddings: 10 top: parent.top
height: 420 bottom: parent.bottom
Item{ right: parent.right
anchors.fill: tree_view rightMargin: 5
FluShadow{} topMargin: 5
bottomMargin: 5
} }
FluShadow{}
FluTreeView{ FluTreeView{
id:tree_view id:tree_view
width:slider_width.value anchors.fill: parent
anchors{ cellHeight: slider_cell_height.value
top:parent.top
left:parent.left
bottom:parent.bottom
}
draggable:switch_draggable.checked draggable:switch_draggable.checked
showLine: switch_showline.checked showLine: switch_showline.checked
depthPadding: slider_depth_padding.value
Component.onCompleted: { Component.onCompleted: {
var data = treeData() var data = treeData()
dataSource = data dataSource = data
} }
} }
Column{
spacing: 15
anchors{
top:parent.top
topMargin: 10
bottomMargin: 10
rightMargin: 10
bottom:parent.bottom
right: parent.right
}
RowLayout{
spacing: 10
FluText{
text:"width:"
Layout.alignment: Qt.AlignVCenter
}
FluSlider{
id:slider_width
value: 280
from: 160
to:400
}
}
FluToggleSwitch{
id:switch_showline
text:"showLine"
checked: true
}
FluToggleSwitch{
id:switch_draggable
text:"draggable"
checked: true
}
FluButton{
text:"all expand"
onClicked: {
tree_view.allExpand()
}
}
FluButton{
text:"all collapse"
onClicked: {
tree_view.allCollapse()
}
}
}
}
CodeExpander{
Layout.fillWidth: true
Layout.topMargin: -1
code:'FluTreeView{
id:tree_view
width:240
height:600
Component.onCompleted: {
var data = treeData()
dataSource = data
}
}
'
} }
} }

View File

@ -186,7 +186,7 @@ CustomWindow {
z:999 z:999
//StackpopFluPagelaunchMode //StackpopFluPagelaunchMode
// pageMode: FluNavigationViewType.Stack // pageMode: FluNavigationViewType.Stack
//NoStack //NoStackFluViewModel
pageMode: FluNavigationViewType.NoStack pageMode: FluNavigationViewType.NoStack
items: ItemsOriginal items: ItemsOriginal
footerItems:ItemsFooter footerItems:ItemsFooter

View File

@ -119,7 +119,8 @@ void FluHttp::post(HttpRequest* r,HttpCallable* c){
QString result = QString::fromUtf8(reply->readAll()); QString result = QString::fromUtf8(reply->readAll());
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString errorString = reply->errorString(); QString errorString = reply->errorString();
bool isSuccess = reply->error() == QNetworkReply::NoError; QNetworkReply::NetworkError error = reply->error();
bool isSuccess = error == QNetworkReply::NoError;
reply->deleteLater(); reply->deleteLater();
reply = nullptr; reply = nullptr;
if (isSuccess) { if (isSuccess) {
@ -134,6 +135,9 @@ void FluHttp::post(HttpRequest* r,HttpCallable* c){
onError(callable,status,errorString,result); onError(callable,status,errorString,result);
} }
} }
if(error == QNetworkReply::OperationCanceledError){
break;
}
} }
onFinish(callable,request); onFinish(callable,request);
}); });
@ -174,7 +178,8 @@ void FluHttp::postString(HttpRequest* r,HttpCallable* c){
QString result = QString::fromUtf8(reply->readAll()); QString result = QString::fromUtf8(reply->readAll());
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString errorString = reply->errorString(); QString errorString = reply->errorString();
bool isSuccess = reply->error() == QNetworkReply::NoError; QNetworkReply::NetworkError error = reply->error();
bool isSuccess = error == QNetworkReply::NoError;
reply->deleteLater(); reply->deleteLater();
reply = nullptr; reply = nullptr;
if (isSuccess) { if (isSuccess) {
@ -189,6 +194,9 @@ void FluHttp::postString(HttpRequest* r,HttpCallable* c){
onError(callable,status,errorString,result); onError(callable,status,errorString,result);
} }
} }
if(error == QNetworkReply::OperationCanceledError){
break;
}
} }
onFinish(callable,request); onFinish(callable,request);
}); });
@ -228,7 +236,8 @@ void FluHttp::postJson(HttpRequest* r,HttpCallable* c){
QString result = QString::fromUtf8(reply->readAll()); QString result = QString::fromUtf8(reply->readAll());
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString errorString = reply->errorString(); QString errorString = reply->errorString();
bool isSuccess = reply->error() == QNetworkReply::NoError; QNetworkReply::NetworkError error = reply->error();
bool isSuccess = error == QNetworkReply::NoError;
reply->deleteLater(); reply->deleteLater();
reply = nullptr; reply = nullptr;
if (isSuccess) { if (isSuccess) {
@ -243,6 +252,9 @@ void FluHttp::postJson(HttpRequest* r,HttpCallable* c){
onError(callable,status,errorString,result); onError(callable,status,errorString,result);
} }
} }
if(error == QNetworkReply::OperationCanceledError){
break;
}
} }
onFinish(callable,request); onFinish(callable,request);
}); });
@ -273,14 +285,15 @@ void FluHttp::get(HttpRequest* r,HttpCallable* c){
QNetworkRequest req(url); QNetworkRequest req(url);
addHeaders(&req,data["headers"].toMap()); addHeaders(&req,data["headers"].toMap());
QEventLoop loop; QEventLoop loop;
QNetworkReply* reply = manager.get(req); auto reply = QPointer(manager.get(req));
_cacheReply.append(reply); _cacheReply.append(reply);
connect(&manager,&QNetworkAccessManager::finished,&manager,[&loop](QNetworkReply *reply){loop.quit();}); connect(&manager,&QNetworkAccessManager::finished,&manager,[&loop](QNetworkReply *reply){loop.quit();});
connect(qApp,&QGuiApplication::aboutToQuit,&manager, [&loop](){loop.quit();}); connect(qApp,&QGuiApplication::aboutToQuit,&manager, [&loop](){loop.quit();});
loop.exec(); loop.exec();
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
QString errorString = reply->errorString(); QString errorString = reply->errorString();
bool isSuccess = reply->error() == QNetworkReply::NoError; QNetworkReply::NetworkError error = reply->error();
bool isSuccess = error == QNetworkReply::NoError;
QString result = QString::fromUtf8(reply->readAll()); QString result = QString::fromUtf8(reply->readAll());
if (isSuccess) { if (isSuccess) {
handleCache(httpId,result); handleCache(httpId,result);
@ -296,6 +309,9 @@ void FluHttp::get(HttpRequest* r,HttpCallable* c){
} }
reply->deleteLater(); reply->deleteLater();
reply = nullptr; reply = nullptr;
if(error == QNetworkReply::OperationCanceledError){
break;
}
} }
onFinish(callable,request); onFinish(callable,request);
}); });

View File

@ -2,15 +2,10 @@
#include <QMetaEnum> #include <QMetaEnum>
Node::Node(QObject *parent) Node::Node(QObject *parent): QObject{parent}{
: QObject{parent}
{
} }
FluTreeModel::FluTreeModel(QObject *parent) FluTreeModel::FluTreeModel(QObject *parent): QAbstractItemModel{parent}{
: QAbstractItemModel{parent}
{
dataSourceSize(0); dataSourceSize(0);
} }
@ -209,7 +204,6 @@ void FluTreeModel::dragAnddrop(int dragIndex,int dropIndex,bool isDropTopArea){
} }
_rows.move(dragIndex,targetIndex); _rows.move(dragIndex,targetIndex);
endMoveRows(); endMoveRows();
Q_EMIT layoutAboutToBeChanged(); Q_EMIT layoutAboutToBeChanged();
if(dragItem->_parent == dropItem->_parent){ if(dragItem->_parent == dropItem->_parent){
QList<Node*>* children = &(dragItem->_parent->_children); QList<Node*>* children = &(dragItem->_parent->_children);
@ -256,7 +250,6 @@ void FluTreeModel::dragAnddrop(int dragIndex,int dropIndex,bool isDropTopArea){
} }
} }
srcChildren->removeAt(srcIndex); srcChildren->removeAt(srcIndex);
if(dropIndex > dragIndex){ if(dropIndex > dragIndex){
if(isDropTopArea){ if(isDropTopArea){
targetIndex = destIndex; targetIndex = destIndex;
@ -270,26 +263,18 @@ void FluTreeModel::dragAnddrop(int dragIndex,int dropIndex,bool isDropTopArea){
targetIndex = destIndex + 1; targetIndex = destIndex + 1;
} }
} }
destChildren->insert(targetIndex,dragItem); destChildren->insert(targetIndex,dragItem);
foreach (auto item,*destChildren) {
qDebug()<<item->title();
}
} }
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 layoutChanged(QList<QPersistentModelIndex>(),QAbstractItemModel::VerticalSortHint);
} }
bool FluTreeModel::hitHasChildrenExpanded(int row){ bool FluTreeModel::hitHasChildrenExpanded(int row){
// auto itemData = _rows.at(row); auto itemData = _rows.at(row);
// if(itemData->hasChildren() && itemData->_isExpanded){ if(itemData->hasChildren() && itemData->_isExpanded){
// return true; return true;
// } }
return false; return false;
} }

View File

@ -10,6 +10,8 @@ Item {
property var dataSource property var dataSource
property bool showLine: true property bool showLine: true
property bool draggable: false property bool draggable: false
property int cellHeight: 30
property int depthPadding: 30
property color lineColor: FluTheme.dark ? Qt.rgba(111/255,111/255,111/255,1) : Qt.rgba(217/255,217/255,217/255,1) property color lineColor: FluTheme.dark ? Qt.rgba(111/255,111/255,111/255,1) : Qt.rgba(217/255,217/255,217/255,1)
id:control id:control
QtObject { QtObject {
@ -112,13 +114,13 @@ Item {
property bool isCurrent: d.current === itemModel property bool isCurrent: d.current === itemModel
id:item_container id:item_container
width: { width: {
var w = 46 + item_layout_text.width + 30*itemModel.depth var w = 46 + item_loader_cell.width + control.depthPadding*itemModel.depth
if(control.width>w){ if(control.width>w){
return control.width return control.width
} }
return w return w
} }
height: 30 height: control.cellHeight
implicitWidth: width implicitWidth: width
implicitHeight: height implicitHeight: height
function toggle(){ function toggle(){
@ -194,13 +196,13 @@ Item {
var pos = FluTools.cursorPos() var pos = FluTools.cursorPos()
var viewPos = table_view.mapToGlobal(0,0) var viewPos = table_view.mapToGlobal(0,0)
var y = table_view.contentY + pos.y-viewPos.y var y = table_view.contentY + pos.y-viewPos.y
var index = Math.floor(y/30) var index = Math.floor(y/control.cellHeight)
if(tree_model.hitHasChildrenExpanded(index) && y>index*30+15){ if(tree_model.hitHasChildrenExpanded(index) && y>index*control.cellHeight+control.cellHeight/2){
d.dropIndex = index + 1 d.dropIndex = index + 1
d.isDropTopArea = true d.isDropTopArea = true
}else{ }else{
d.dropIndex = index d.dropIndex = index
if(y>index*30+15){ if(y>index*control.cellHeight+control.cellHeight/2){
d.isDropTopArea = false d.isDropTopArea = false
}else{ }else{
d.isDropTopArea = true d.isDropTopArea = true
@ -229,14 +231,8 @@ Item {
Rectangle{ Rectangle{
id:item_line_drop_tip id:item_line_drop_tip
anchors{ anchors{
left: parent.left left: layout_row.left
leftMargin: { leftMargin: 26
var count = itemModel.depth+1
if(itemModel.hasChildren()){
return 30*count - 8
}
return 30*count + 18
}
right: parent.right right: parent.right
rightMargin: 10 rightMargin: 10
bottom: parent.bottom bottom: parent.bottom
@ -283,18 +279,18 @@ Item {
height: itemModel.hideLineFooter() ? parent.height/2 : parent.height height: itemModel.hideLineFooter() ? parent.height/2 : parent.height
anchors{ anchors{
top: parent.top top: parent.top
right: layout_row.left left: item_line_h.left
rightMargin: -9
} }
} }
FluRectangle{ FluRectangle{
id:item_line_h
height: 1 height: 1
color: control.lineColor color: control.lineColor
visible: control.showLine && isItemLoader && itemModel.depth !== 0 && !itemModel.hasChildren() visible: control.showLine && isItemLoader && itemModel.depth !== 0 && !itemModel.hasChildren()
width: 18 width: depthPadding - 10
anchors{ anchors{
right: layout_row.left right: layout_row.left
rightMargin: -27 rightMargin: -24
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
} }
@ -309,7 +305,7 @@ Item {
top:parent.top top:parent.top
bottom: parent.bottom bottom: parent.bottom
left: parent.left left: parent.left
leftMargin: 30*(index+2) - 8 leftMargin: control.depthPadding*(index+1) + 24
} }
} }
} }
@ -342,9 +338,10 @@ Item {
} }
RowLayout{ RowLayout{
id:layout_row id:layout_row
height: parent.height
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 14 + 30*itemModel.depth anchors.leftMargin: 14 + control.depthPadding*itemModel.depth
Component{ Component{
id:com_icon_btn id:com_icon_btn
FluIconButton{ FluIconButton{
@ -364,23 +361,38 @@ Item {
Layout.preferredWidth: 20 Layout.preferredWidth: 20
Layout.preferredHeight: 20 Layout.preferredHeight: 20
sourceComponent: itemModel.hasChildren() ? com_icon_btn : undefined sourceComponent: itemModel.hasChildren() ? com_icon_btn : undefined
}
Item{
id:item_layout_text
Layout.preferredWidth: item_text.implicitWidth+14
Layout.preferredHeight:item_text.implicitHeight+14
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
FluText { }
id:item_text Loader{
text: itemModel.title property var modelData: itemModel
anchors.centerIn: parent property var itemMouse: item_mouse
color:{ id:item_loader_cell
if(item_mouse.pressed){ Layout.preferredWidth: {
return FluTheme.dark ? FluColors.Grey80 : FluColors.Grey120 if(item){
} return item.width
return FluTheme.dark ? FluColors.White : FluColors.Grey220
} }
return 0
} }
Layout.fillHeight: true
sourceComponent:com_item_text
}
}
}
}
Component{
id:com_item_text
Item{
width: item_text.width
FluText {
id:item_text
text: modelData.title
rightPadding: 14
anchors.centerIn: parent
color:{
if(itemMouse.pressed){
return FluTheme.dark ? FluColors.Grey80 : FluColors.Grey120
}
return FluTheme.dark ? FluColors.White : FluColors.Grey220
} }
} }
} }
@ -403,5 +415,4 @@ Item {
function allCollapse(){ function allCollapse(){
tree_model.allCollapse() tree_model.allCollapse()
} }
} }

View File

@ -10,6 +10,8 @@ Item {
property var dataSource property var dataSource
property bool showLine: true property bool showLine: true
property bool draggable: false property bool draggable: false
property int cellHeight: 30
property int depthPadding: 30
property color lineColor: FluTheme.dark ? Qt.rgba(111/255,111/255,111/255,1) : Qt.rgba(217/255,217/255,217/255,1) property color lineColor: FluTheme.dark ? Qt.rgba(111/255,111/255,111/255,1) : Qt.rgba(217/255,217/255,217/255,1)
id:control id:control
QtObject { QtObject {
@ -112,13 +114,13 @@ Item {
property bool isCurrent: d.current === itemModel property bool isCurrent: d.current === itemModel
id:item_container id:item_container
width: { width: {
var w = 46 + item_layout_text.width + 30*itemModel.depth var w = 46 + item_loader_cell.width + control.depthPadding*itemModel.depth
if(control.width>w){ if(control.width>w){
return control.width return control.width
} }
return w return w
} }
height: 30 height: control.cellHeight
implicitWidth: width implicitWidth: width
implicitHeight: height implicitHeight: height
function toggle(){ function toggle(){
@ -194,13 +196,13 @@ Item {
var pos = FluTools.cursorPos() var pos = FluTools.cursorPos()
var viewPos = table_view.mapToGlobal(0,0) var viewPos = table_view.mapToGlobal(0,0)
var y = table_view.contentY + pos.y-viewPos.y var y = table_view.contentY + pos.y-viewPos.y
var index = Math.floor(y/30) var index = Math.floor(y/control.cellHeight)
if(tree_model.hitHasChildrenExpanded(index) && y>index*30+15){ if(tree_model.hitHasChildrenExpanded(index) && y>index*control.cellHeight+control.cellHeight/2){
d.dropIndex = index + 1 d.dropIndex = index + 1
d.isDropTopArea = true d.isDropTopArea = true
}else{ }else{
d.dropIndex = index d.dropIndex = index
if(y>index*30+15){ if(y>index*control.cellHeight+control.cellHeight/2){
d.isDropTopArea = false d.isDropTopArea = false
}else{ }else{
d.isDropTopArea = true d.isDropTopArea = true
@ -229,14 +231,8 @@ Item {
Rectangle{ Rectangle{
id:item_line_drop_tip id:item_line_drop_tip
anchors{ anchors{
left: parent.left left: layout_row.left
leftMargin: { leftMargin: 26
var count = itemModel.depth+1
if(itemModel.hasChildren()){
return 30*count - 8
}
return 30*count + 18
}
right: parent.right right: parent.right
rightMargin: 10 rightMargin: 10
bottom: parent.bottom bottom: parent.bottom
@ -283,18 +279,18 @@ Item {
height: itemModel.hideLineFooter() ? parent.height/2 : parent.height height: itemModel.hideLineFooter() ? parent.height/2 : parent.height
anchors{ anchors{
top: parent.top top: parent.top
right: layout_row.left left: item_line_h.left
rightMargin: -9
} }
} }
FluRectangle{ FluRectangle{
id:item_line_h
height: 1 height: 1
color: control.lineColor color: control.lineColor
visible: control.showLine && isItemLoader && itemModel.depth !== 0 && !itemModel.hasChildren() visible: control.showLine && isItemLoader && itemModel.depth !== 0 && !itemModel.hasChildren()
width: 18 width: depthPadding - 10
anchors{ anchors{
right: layout_row.left right: layout_row.left
rightMargin: -27 rightMargin: -24
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
} }
@ -309,7 +305,7 @@ Item {
top:parent.top top:parent.top
bottom: parent.bottom bottom: parent.bottom
left: parent.left left: parent.left
leftMargin: 30*(index+2) - 8 leftMargin: control.depthPadding*(index+1) + 24
} }
} }
} }
@ -342,9 +338,10 @@ Item {
} }
RowLayout{ RowLayout{
id:layout_row id:layout_row
height: parent.height
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 14 + 30*itemModel.depth anchors.leftMargin: 14 + control.depthPadding*itemModel.depth
Component{ Component{
id:com_icon_btn id:com_icon_btn
FluIconButton{ FluIconButton{
@ -364,23 +361,38 @@ Item {
Layout.preferredWidth: 20 Layout.preferredWidth: 20
Layout.preferredHeight: 20 Layout.preferredHeight: 20
sourceComponent: itemModel.hasChildren() ? com_icon_btn : undefined sourceComponent: itemModel.hasChildren() ? com_icon_btn : undefined
}
Item{
id:item_layout_text
Layout.preferredWidth: item_text.implicitWidth+14
Layout.preferredHeight:item_text.implicitHeight+14
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
FluText { }
id:item_text Loader{
text: itemModel.title property var modelData: itemModel
anchors.centerIn: parent property var itemMouse: item_mouse
color:{ id:item_loader_cell
if(item_mouse.pressed){ Layout.preferredWidth: {
return FluTheme.dark ? FluColors.Grey80 : FluColors.Grey120 if(item){
} return item.width
return FluTheme.dark ? FluColors.White : FluColors.Grey220
} }
return 0
} }
Layout.fillHeight: true
sourceComponent:com_item_text
}
}
}
}
Component{
id:com_item_text
Item{
width: item_text.width
FluText {
id:item_text
text: modelData.title
rightPadding: 14
anchors.centerIn: parent
color:{
if(itemMouse.pressed){
return FluTheme.dark ? FluColors.Grey80 : FluColors.Grey120
}
return FluTheme.dark ? FluColors.White : FluColors.Grey220
} }
} }
} }
@ -403,5 +415,4 @@ Item {
function allCollapse(){ function allCollapse(){
tree_model.allCollapse() tree_model.allCollapse()
} }
} }