This commit is contained in:
朱子楚\zhuzi
2024-03-01 00:19:12 +08:00
parent 38612f0ebc
commit e2d52f55b9
7 changed files with 554 additions and 226 deletions

View File

@ -25,7 +25,7 @@ void FluTools::clipText(const QString& text){
}
QString FluTools::uuid(){
return QUuid::createUuid().toString();
return QUuid::createUuid().toString().remove('-').remove('{').remove('}');
}
QString FluTools::readFile(const QString &fileName){

View File

@ -17,6 +17,7 @@
#include "FluNetwork.h"
#include "FluFramelessHelper.h"
#include "FluQrCodeItem.h"
#include "FluTableSortProxyModel.h"
void FluentUI::registerTypes(QQmlEngine *engine){
initializeEngine(engine,uri);
@ -39,6 +40,7 @@ void FluentUI::registerTypes(const char *uri){
qmlRegisterType<FluNetworkCallable>(uri,major,minor,"FluNetworkCallable");
qmlRegisterType<FluNetworkParams>(uri,major,minor,"FluNetworkParams");
qmlRegisterType<FluFramelessHelper>(uri,major,minor,"FluFramelessHelper");
qmlRegisterType<FluTableSortProxyModel>(uri,major,minor,"FluTableSortProxyModel");
qmlRegisterType(QUrl("qrc:/qt/qml/FluentUI/Controls/ColorPicker/ColorPicker.qml"),uri,major,minor,"ColorPicker");
qmlRegisterType(QUrl("qrc:/qt/qml/FluentUI/Controls/ColorPicker/Content/Checkerboard.qml"),uri,major,minor,"Checkerboard");

View File

@ -8,8 +8,8 @@ Rectangle {
property var columnSource
property var dataSource
property color borderColor: FluTheme.dark ? "#252525" : "#e4e4e4"
property alias tableModel: table_model
property alias tableView: table_view
property alias rows: table_view.rows
property alias columns: table_view.columns
property bool horizonalHeaderVisible: true
property bool verticalHeaderVisible: true
id:control
@ -31,13 +31,13 @@ Rectangle {
}
QtObject{
id:d
property var currentIndex
property var current
property int rowHoverIndex: -1
property int defaultItemWidth: 100
property int defaultItemHeight: 42
property var header_rows:[]
function obtEditDelegate(column,row,cellItem){
var display = table_model.data(table_model.index(row,column),"display")
function obtEditDelegate(column,row,display,cellItem){
var tableModel = table_view.model
var cellPosition = cellItem.mapToItem(scroll_table, 0, 0)
item_loader.column = column
item_loader.row = row
@ -59,17 +59,15 @@ Rectangle {
}
onDataSourceChanged: {
table_model.clear()
var rows = []
for(var i =0;i<dataSource.length;i++){
var row = dataSource[i]
row.__index= i
rows.push(row)
}
table_model.rows = rows
table_model.rows = dataSource
}
TableModel {
id:table_model
}
FluTableSortProxyModel{
id:table_sort_model
model: table_model
}
Component{
id:com_edit
FluTextBox{
@ -82,7 +80,7 @@ Rectangle {
}
onCommit: {
if(!readOnly){
display = text_box.text
editTextChaged(text_box.text)
}
tableView.closeEditor()
}
@ -115,7 +113,7 @@ Rectangle {
rightPadding: 24
onCommit: {
if(!readOnly){
display = text
editTextChaged(text_box.text)
}
tableView.closeEditor()
}
@ -146,7 +144,7 @@ Rectangle {
id:com_text
FluText {
id:item_text
text: modelData
text: String(display)
elide: Text.ElideRight
wrapMode: Text.WrapAnywhere
anchors{
@ -220,12 +218,13 @@ Rectangle {
return w
}
rowHeightProvider: function(row) {
if(row>=table_model.rowCount){
if(row>=table_view.rows){
return 0
}
var h = table_model.getRow(row).height
var rowObject = control.getRow(row)
var h = rowObject.height
if(!h){
h = table_model.getRow(row).minimumHeight
h = rowObject._minimumHeight
}
if(!h){
h = d.defaultItemHeight
@ -243,8 +242,12 @@ Rectangle {
}
model: table_model
clip: true
onRowsChanged: {
closeEditor()
}
delegate: MouseArea{
property var rowObject : table_model.getRow(row)
property var rowObject : control.getRow(row)
property var itemModel: model
hoverEnabled: true
implicitHeight: 40
implicitWidth: {
@ -264,7 +267,14 @@ Rectangle {
id:item_table
anchors.fill: parent
property point position: Qt.point(column,row)
property bool isRowSelected: d.currentIndex === rowObject.__index
property bool isRowSelected: {
if(rowObject === null)
return false
if(d.current){
return rowObject._key === d.current._key
}
return false
}
color:{
if(d.rowHoverIndex === row || item_table.isRowSelected){
return FluTheme.dark ? Qt.rgba(1,1,1,0.06) : Qt.rgba(0,0,0,0.06)
@ -297,23 +307,20 @@ Rectangle {
if(typeof(display) == "object"){
return
}
item_loader.sourceComponent = d.obtEditDelegate(column,row,item_table)
item_loader.sourceComponent = d.obtEditDelegate(column,row,display,item_table)
}
onClicked:
(event)=>{
d.currentIndex = rowObject.__index
d.current = rowObject
item_loader.sourceComponent = undefined
event.accepted = true
}
}
FluLoader{
property var itemModel: model
property var modelData: display
property var tableView: table_view
property var tableModel: table_model
property var position: item_table.position
property int row: position.y
property int column: position.x
property var model: itemModel
property var display: itemModel.display
property int row: item_table.position.y
property int column: item_table.position.x
property var options: {
if(typeof(modelData) == "object"){
return modelData.options
@ -352,13 +359,15 @@ Rectangle {
property int column
property int row
property var tableView: control
signal editTextChaged(string text)
sourceComponent: undefined
anchors.fill: parent
onDisplayChanged: {
var obj = table_model.getRow(row)
obj[columnSource[column].dataIndex] = display
table_model.setRow(row,obj)
}
onEditTextChaged:
(text)=>{
var obj = control.getRow(row)
obj[columnSource[column].dataIndex] = text
control.setRow(row,obj)
}
}
}
}
@ -431,7 +440,7 @@ Rectangle {
height: parent.height
anchors.right: parent.right
color:"#00000000"
visible: column === tableModel.columnCount - 1
visible: column === table_view.columns - 1
}
MouseArea{
id:column_item_control_mouse
@ -538,7 +547,7 @@ Rectangle {
Connections{
target: table_model
function onRowCountChanged(){
model_rows.rows = Array.from({length: table_model.rows.length}, (_, i) => ({rowIndex:i+1}));
model_rows.rows = Array.from({length: table_model.rows.length}, (_, i) => ({rowIndex:i+1}));
}
}
onContentYChanged:{
@ -555,7 +564,7 @@ Rectangle {
id:item_control
readonly property real cellPadding: 8
property bool canceled: false
property var rowObject: table_model.getRow(row)
property var rowObject: control.getRow(row)
implicitWidth: Math.max(30, row_text.implicitWidth + (cellPadding * 2))
implicitHeight: row_text.implicitHeight + (cellPadding * 2)
width: implicitWidth
@ -573,7 +582,7 @@ Rectangle {
width: parent.width
height: 1
anchors.bottom: parent.bottom
visible: row === tableModel.rowCount - 1
visible: row === table_view.rows - 1
color:"#00000000"
}
Rectangle{
@ -620,7 +629,11 @@ Rectangle {
anchors.bottom: parent.bottom
acceptedButtons: Qt.LeftButton
cursorShape: Qt.SplitVCursor
visible: !(rowObject.height === rowObject.minimumHeight && rowObject.height === rowObject.maximumHeight && rowObject.height)
visible: {
if(rowObject === null)
return false
return !(rowObject.height === rowObject._minimumHeight && rowObject.height === rowObject._maximumHeight && rowObject.height)
}
onPressed :
(mouse)=>{
header_vertical.interactive = false
@ -640,9 +653,10 @@ Rectangle {
if(!pressed){
return
}
var rowObject = control.getRow(row)
var delta = Qt.point(mouse.x - clickPos.x, mouse.y - clickPos.y)
var minimumHeight = rowObject.minimumHeight
var maximumHeight = rowObject.maximumHeight
var minimumHeight = rowObject._minimumHeight
var maximumHeight = rowObject._maximumHeight
var h = rowObject.height
if(!h){
h = d.defaultItemHeight
@ -654,7 +668,7 @@ Rectangle {
maximumHeight = 65535
}
rowObject.height = Math.min(Math.max(minimumHeight, h + delta.y),maximumHeight)
table_model.setRow(row,rowObject)
control.setRow(row,rowObject)
table_view.forceLayout()
}
}
@ -673,21 +687,33 @@ Rectangle {
o.options = options
return o
}
function updateRow(row,obj){
table_model.setRow(row,obj)
}
function sort(order){
let sortedArray = []
for(var i =0;i<table_model.rowCount;i++){
let row = table_model.getRow(i)
sortedArray.push(row)
}
if(order === undefined){
sortedArray.sort((a, b) => a.__index - b.__index)
table_view.model = table_model
}else{
sortedArray.sort(order)
table_view.model = table_sort_model
table_sort_model.setSortComparator(function(left,right){
return order(table_model.getRow(left),table_model.getRow(right))
})
}
table_model.clear()
table_model.rows = sortedArray
}
function setRow(rowIndex,obj){
if(rowIndex>=0 && rowIndex<table_view.rows){
table_view.model.setRow(rowIndex,obj)
}
}
function getRow(rowIndex){
if(rowIndex>=0 && rowIndex<table_view.rows){
return table_view.model.getRow(rowIndex)
}
return null
}
function removeRow(rowIndex,rows=1){
if(rowIndex>=0 && rowIndex<table_view.rows){
table_view.model.removeRow(rowIndex,rows)
}
}
function appendRow(obj){
table_model.appendRow(obj)
}
}

View File

@ -81,7 +81,10 @@ Module {
exports: ["FluentUI/FluFramelessHelper 1.0"]
exportMetaObjectRevisions: [0]
Signal { name: "loadCompleted" }
Method { name: "showSystemMenu" }
Method {
name: "showSystemMenu"
Parameter { name: "point"; type: "QPoint" }
}
}
Component {
name: "FluNavigationViewType"
@ -299,6 +302,32 @@ Module {
}
}
}
Component {
name: "FluTableSortProxyModel"
prototype: "QSortFilterProxyModel"
exports: ["FluentUI/FluTableSortProxyModel 1.0"]
exportMetaObjectRevisions: [0]
Property { name: "model"; type: "QAbstractTableModel"; isPointer: true }
Method {
name: "setSortComparator"
Parameter { name: "comparator"; type: "QJSValue" }
}
Method {
name: "getRow"
type: "QVariant"
Parameter { name: "rowIndex"; type: "int" }
}
Method {
name: "setRow"
Parameter { name: "rowIndex"; type: "int" }
Parameter { name: "val"; type: "QVariant" }
}
Method {
name: "removeRow"
Parameter { name: "rowIndex"; type: "int" }
Parameter { name: "rows"; type: "int" }
}
}
Component {
name: "FluThemeType"
exports: ["FluentUI/FluThemeType 1.0"]
@ -346,7 +375,7 @@ Module {
exports: ["FluentUI/FluTreeModel 1.0"]
exportMetaObjectRevisions: [0]
Property { name: "dataSourceSize"; type: "int" }
Property { name: "selectionModel"; type: "QList<Node*>" }
Property { name: "selectionModel"; type: "QList<FluNode*>" }
Method {
name: "removeRows"
Parameter { name: "row"; type: "int" }
@ -355,7 +384,7 @@ Module {
Method {
name: "insertRows"
Parameter { name: "row"; type: "int" }
Parameter { name: "data"; type: "QList<Node*>" }
Parameter { name: "data"; type: "QList<FluNode*>" }
}
Method {
name: "getRow"
@ -364,7 +393,7 @@ Module {
}
Method {
name: "setData"
Parameter { name: "data"; type: "QList<Node*>" }
Parameter { name: "data"; type: "QList<FluNode*>" }
}
Method {
name: "setDataSource"
@ -386,7 +415,7 @@ Module {
}
Method {
name: "getNode"
type: "Node*"
type: "FluNode*"
Parameter { name: "row"; type: "int" }
}
Method {
@ -2177,6 +2206,99 @@ Module {
Parameter { name: "value"; type: "QVariant" }
}
}
Component {
name: "QAbstractProxyModel"
prototype: "QAbstractItemModel"
Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
Method {
name: "mapToSource"
type: "QModelIndex"
Parameter { name: "proxyIndex"; type: "QModelIndex" }
}
Method {
name: "mapFromSource"
type: "QModelIndex"
Parameter { name: "sourceIndex"; type: "QModelIndex" }
}
Method {
name: "mapSelectionToSource"
type: "QItemSelection"
Parameter { name: "selection"; type: "QItemSelection" }
}
Method {
name: "mapSelectionFromSource"
type: "QItemSelection"
Parameter { name: "selection"; type: "QItemSelection" }
}
}
Component {
name: "QSortFilterProxyModel"
prototype: "QAbstractProxyModel"
Property { name: "filterRegExp"; type: "QRegExp" }
Property { name: "filterRegularExpression"; type: "QRegularExpression" }
Property { name: "filterKeyColumn"; type: "int" }
Property { name: "dynamicSortFilter"; type: "bool" }
Property { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
Property { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
Property { name: "isSortLocaleAware"; type: "bool" }
Property { name: "sortRole"; type: "int" }
Property { name: "filterRole"; type: "int" }
Property { name: "recursiveFilteringEnabled"; type: "bool" }
Signal {
name: "dynamicSortFilterChanged"
Parameter { name: "dynamicSortFilter"; type: "bool" }
}
Signal {
name: "filterCaseSensitivityChanged"
Parameter { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
}
Signal {
name: "sortCaseSensitivityChanged"
Parameter { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
}
Signal {
name: "sortLocaleAwareChanged"
Parameter { name: "sortLocaleAware"; type: "bool" }
}
Signal {
name: "sortRoleChanged"
Parameter { name: "sortRole"; type: "int" }
}
Signal {
name: "filterRoleChanged"
Parameter { name: "filterRole"; type: "int" }
}
Signal {
name: "recursiveFilteringEnabledChanged"
Parameter { name: "recursiveFilteringEnabled"; type: "bool" }
}
Method {
name: "setFilterRegExp"
Parameter { name: "pattern"; type: "string" }
}
Method {
name: "setFilterRegExp"
Parameter { name: "regExp"; type: "QRegExp" }
}
Method {
name: "setFilterRegularExpression"
Parameter { name: "pattern"; type: "string" }
}
Method {
name: "setFilterRegularExpression"
Parameter { name: "regularExpression"; type: "QRegularExpression" }
}
Method {
name: "setFilterWildcard"
Parameter { name: "pattern"; type: "string" }
}
Method {
name: "setFilterFixedString"
Parameter { name: "pattern"; type: "string" }
}
Method { name: "clear" }
Method { name: "invalidate" }
}
Component {
prototype: "QQuickGrid"
name: "FluentUI/Checkerboard 1.0"
@ -2302,31 +2424,31 @@ Module {
Property { name: "systemMenuListener"; type: "QVariant" }
Property {
name: "buttonStayTop"
type: "FluIconButton_QMLTYPE_26"
type: "FluIconButton_QMLTYPE_28"
isReadonly: true
isPointer: true
}
Property {
name: "buttonMinimize"
type: "FluIconButton_QMLTYPE_26"
type: "FluIconButton_QMLTYPE_28"
isReadonly: true
isPointer: true
}
Property {
name: "buttonMaximize"
type: "FluIconButton_QMLTYPE_26"
type: "FluIconButton_QMLTYPE_28"
isReadonly: true
isPointer: true
}
Property {
name: "buttonClose"
type: "FluIconButton_QMLTYPE_26"
type: "FluIconButton_QMLTYPE_28"
isReadonly: true
isPointer: true
}
Property {
name: "buttonDark"
type: "FluToggleSwitch_QMLTYPE_31"
type: "FluToggleSwitch_QMLTYPE_22"
isReadonly: true
isPointer: true
}
@ -3004,15 +3126,15 @@ Module {
defaultProperty: "data"
Property { name: "logo"; type: "QUrl" }
Property { name: "title"; type: "string" }
Property { name: "items"; type: "FluObject_QMLTYPE_163"; isPointer: true }
Property { name: "footerItems"; type: "FluObject_QMLTYPE_163"; isPointer: true }
Property { name: "items"; type: "FluObject_QMLTYPE_162"; isPointer: true }
Property { name: "footerItems"; type: "FluObject_QMLTYPE_162"; isPointer: true }
Property { name: "displayMode"; type: "int" }
Property { name: "autoSuggestBox"; type: "QQmlComponent"; isPointer: true }
Property { name: "actionItem"; type: "QQmlComponent"; isPointer: true }
Property { name: "topPadding"; type: "int" }
Property { name: "pageMode"; type: "int" }
Property { name: "navItemRightMenu"; type: "FluMenu_QMLTYPE_51"; isPointer: true }
Property { name: "navItemExpanderRightMenu"; type: "FluMenu_QMLTYPE_51"; isPointer: true }
Property { name: "navItemRightMenu"; type: "FluMenu_QMLTYPE_41"; isPointer: true }
Property { name: "navItemExpanderRightMenu"; type: "FluMenu_QMLTYPE_41"; isPointer: true }
Property { name: "navCompactWidth"; type: "int" }
Property { name: "navTopMargin"; type: "int" }
Property { name: "cellHeight"; type: "int" }
@ -3020,13 +3142,13 @@ Module {
Property { name: "hideNavAppBar"; type: "bool" }
Property {
name: "buttonMenu"
type: "FluIconButton_QMLTYPE_26"
type: "FluIconButton_QMLTYPE_28"
isReadonly: true
isPointer: true
}
Property {
name: "buttonBack"
type: "FluIconButton_QMLTYPE_26"
type: "FluIconButton_QMLTYPE_28"
isReadonly: true
isPointer: true
}
@ -3569,8 +3691,8 @@ Module {
Property { name: "borderColor"; type: "QColor" }
Property { name: "horizonalHeaderVisible"; type: "bool" }
Property { name: "verticalHeaderVisible"; type: "bool" }
Property { name: "tableModel"; type: "QQmlTableModel"; isReadonly: true; isPointer: true }
Property { name: "tableView"; type: "QQuickTableView"; isReadonly: true; isPointer: true }
Property { name: "rows"; type: "int"; isReadonly: true }
Property { name: "columns"; type: "int"; isReadonly: true }
Method { name: "closeEditor"; type: "QVariant" }
Method { name: "resetPosition"; type: "QVariant" }
Method {
@ -3579,17 +3701,33 @@ Module {
Parameter { name: "comId"; type: "QVariant" }
Parameter { name: "options"; type: "QVariant" }
}
Method {
name: "updateRow"
type: "QVariant"
Parameter { name: "row"; type: "QVariant" }
Parameter { name: "obj"; type: "QVariant" }
}
Method {
name: "sort"
type: "QVariant"
Parameter { name: "order"; type: "QVariant" }
}
Method {
name: "setRow"
type: "QVariant"
Parameter { name: "rowIndex"; type: "QVariant" }
Parameter { name: "obj"; type: "QVariant" }
}
Method {
name: "getRow"
type: "QVariant"
Parameter { name: "rowIndex"; type: "QVariant" }
}
Method {
name: "removeRow"
type: "QVariant"
Parameter { name: "rowIndex"; type: "QVariant" }
Parameter { name: "rows"; type: "QVariant" }
}
Method {
name: "appendRow"
type: "QVariant"
Parameter { name: "obj"; type: "QVariant" }
}
}
Component {
prototype: "QQuickText"
@ -3814,13 +3952,13 @@ Module {
Property { name: "showStayTop"; type: "bool" }
Property { name: "autoMaximize"; type: "bool" }
Property { name: "autoVisible"; type: "bool" }
Property { name: "autoCenter"; type: "bool" }
Property { name: "useSystemAppBar"; type: "bool" }
Property { name: "resizeBorderColor"; type: "QColor" }
Property { name: "resizeBorderWidth"; type: "int" }
Property { name: "closeListener"; type: "QVariant" }
Property { name: "_offsetXY"; type: "QPointF" }
Property { name: "_originalPos"; type: "QVariant" }
Property { name: "_accentColor"; type: "QColor" }
Property { name: "_realHeight"; type: "int" }
Property { name: "_realWidth"; type: "int" }
Property { name: "_appBarHeight"; type: "int" }

View File

@ -9,8 +9,8 @@ Rectangle {
property var columnSource
property var dataSource
property color borderColor: FluTheme.dark ? "#252525" : "#e4e4e4"
property alias tableModel: table_model
property alias tableView: table_view
property alias rows: table_view.rows
property alias columns: table_view.columns
property bool horizonalHeaderVisible: true
property bool verticalHeaderVisible: true
id:control
@ -32,13 +32,13 @@ Rectangle {
}
QtObject{
id:d
property var currentIndex
property var current
property int rowHoverIndex: -1
property int defaultItemWidth: 100
property int defaultItemHeight: 42
property var header_rows:[]
function obtEditDelegate(column,row,cellItem){
var display = table_model.data(table_model.index(row,column),"display")
function obtEditDelegate(column,row,display,cellItem){
var tableModel = table_view.model
var cellPosition = cellItem.mapToItem(scroll_table, 0, 0)
item_loader.column = column
item_loader.row = row
@ -60,17 +60,15 @@ Rectangle {
}
onDataSourceChanged: {
table_model.clear()
var rows = []
for(var i =0;i<dataSource.length;i++){
var row = dataSource[i]
row.__index= i
rows.push(row)
}
table_model.rows = rows
table_model.rows = dataSource
}
TableModel {
id:table_model
}
FluTableSortProxyModel{
id:table_sort_model
model: table_model
}
Component{
id:com_edit
FluTextBox{
@ -83,7 +81,7 @@ Rectangle {
}
onCommit: {
if(!readOnly){
display = text_box.text
editTextChaged(text_box.text)
}
tableView.closeEditor()
}
@ -116,7 +114,7 @@ Rectangle {
rightPadding: 24
onCommit: {
if(!readOnly){
display = text
editTextChaged(text_box.text)
}
tableView.closeEditor()
}
@ -147,7 +145,7 @@ Rectangle {
id:com_text
FluText {
id:item_text
text: modelData
text: String(display)
elide: Text.ElideRight
wrapMode: Text.WrapAnywhere
anchors{
@ -221,12 +219,13 @@ Rectangle {
return w
}
rowHeightProvider: function(row) {
if(row>=table_model.rowCount){
if(row>=table_view.rows){
return 0
}
var h = table_model.getRow(row).height
var rowObject = control.getRow(row)
var h = rowObject.height
if(!h){
h = table_model.getRow(row).minimumHeight
h = rowObject._minimumHeight
}
if(!h){
h = d.defaultItemHeight
@ -244,8 +243,12 @@ Rectangle {
}
model: table_model
clip: true
onRowsChanged: {
closeEditor()
}
delegate: MouseArea{
property var rowObject : table_model.getRow(row)
property var rowObject : control.getRow(row)
property var itemModel: model
hoverEnabled: true
implicitHeight: 40
implicitWidth: {
@ -265,7 +268,14 @@ Rectangle {
id:item_table
anchors.fill: parent
property point position: Qt.point(column,row)
property bool isRowSelected: d.currentIndex === rowObject.__index
property bool isRowSelected: {
if(rowObject === null)
return false
if(d.current){
return rowObject._key === d.current._key
}
return false
}
color:{
if(d.rowHoverIndex === row || item_table.isRowSelected){
return FluTheme.dark ? Qt.rgba(1,1,1,0.06) : Qt.rgba(0,0,0,0.06)
@ -298,23 +308,20 @@ Rectangle {
if(typeof(display) == "object"){
return
}
item_loader.sourceComponent = d.obtEditDelegate(column,row,item_table)
item_loader.sourceComponent = d.obtEditDelegate(column,row,display,item_table)
}
onClicked:
(event)=>{
d.currentIndex = rowObject.__index
d.current = rowObject
item_loader.sourceComponent = undefined
event.accepted = true
}
}
FluLoader{
property var itemModel: model
property var modelData: display
property var tableView: table_view
property var tableModel: table_model
property var position: item_table.position
property int row: position.y
property int column: position.x
property var model: itemModel
property var display: itemModel.display
property int row: item_table.position.y
property int column: item_table.position.x
property var options: {
if(typeof(modelData) == "object"){
return modelData.options
@ -353,13 +360,15 @@ Rectangle {
property int column
property int row
property var tableView: control
signal editTextChaged(string text)
sourceComponent: undefined
anchors.fill: parent
onDisplayChanged: {
var obj = table_model.getRow(row)
obj[columnSource[column].dataIndex] = display
table_model.setRow(row,obj)
}
onEditTextChaged:
(text)=>{
var obj = control.getRow(row)
obj[columnSource[column].dataIndex] = text
control.setRow(row,obj)
}
}
}
}
@ -432,7 +441,7 @@ Rectangle {
height: parent.height
anchors.right: parent.right
color:"#00000000"
visible: column === tableModel.columnCount - 1
visible: column === table_view.columns - 1
}
MouseArea{
id:column_item_control_mouse
@ -539,7 +548,7 @@ Rectangle {
Connections{
target: table_model
function onRowCountChanged(){
model_rows.rows = Array.from({length: table_model.rows.length}, (_, i) => ({rowIndex:i+1}));
model_rows.rows = Array.from({length: table_model.rows.length}, (_, i) => ({rowIndex:i+1}));
}
}
onContentYChanged:{
@ -556,7 +565,7 @@ Rectangle {
id:item_control
readonly property real cellPadding: 8
property bool canceled: false
property var rowObject: table_model.getRow(row)
property var rowObject: control.getRow(row)
implicitWidth: Math.max(30, row_text.implicitWidth + (cellPadding * 2))
implicitHeight: row_text.implicitHeight + (cellPadding * 2)
width: implicitWidth
@ -574,7 +583,7 @@ Rectangle {
width: parent.width
height: 1
anchors.bottom: parent.bottom
visible: row === tableModel.rowCount - 1
visible: row === table_view.rows - 1
color:"#00000000"
}
Rectangle{
@ -621,7 +630,11 @@ Rectangle {
anchors.bottom: parent.bottom
acceptedButtons: Qt.LeftButton
cursorShape: Qt.SplitVCursor
visible: !(rowObject.height === rowObject.minimumHeight && rowObject.height === rowObject.maximumHeight && rowObject.height)
visible: {
if(rowObject === null)
return false
return !(rowObject.height === rowObject._minimumHeight && rowObject.height === rowObject._maximumHeight && rowObject.height)
}
onPressed :
(mouse)=>{
header_vertical.interactive = false
@ -641,9 +654,10 @@ Rectangle {
if(!pressed){
return
}
var rowObject = control.getRow(row)
var delta = Qt.point(mouse.x - clickPos.x, mouse.y - clickPos.y)
var minimumHeight = rowObject.minimumHeight
var maximumHeight = rowObject.maximumHeight
var minimumHeight = rowObject._minimumHeight
var maximumHeight = rowObject._maximumHeight
var h = rowObject.height
if(!h){
h = d.defaultItemHeight
@ -655,7 +669,7 @@ Rectangle {
maximumHeight = 65535
}
rowObject.height = Math.min(Math.max(minimumHeight, h + delta.y),maximumHeight)
table_model.setRow(row,rowObject)
control.setRow(row,rowObject)
table_view.forceLayout()
}
}
@ -674,21 +688,33 @@ Rectangle {
o.options = options
return o
}
function updateRow(row,obj){
table_model.setRow(row,obj)
}
function sort(order){
let sortedArray = []
for(var i =0;i<table_model.rowCount;i++){
let row = table_model.getRow(i)
sortedArray.push(row)
}
if(order === undefined){
sortedArray.sort((a, b) => a.__index - b.__index)
table_view.model = table_model
}else{
sortedArray.sort(order)
table_view.model = table_sort_model
table_sort_model.setSortComparator(function(left,right){
return order(table_model.getRow(left),table_model.getRow(right))
})
}
table_model.clear()
table_model.rows = sortedArray
}
function setRow(rowIndex,obj){
if(rowIndex>=0 && rowIndex<table_view.rows){
table_view.model.setRow(rowIndex,obj)
}
}
function getRow(rowIndex){
if(rowIndex>=0 && rowIndex<table_view.rows){
return table_view.model.getRow(rowIndex)
}
return null
}
function removeRow(rowIndex,rows=1){
if(rowIndex>=0 && rowIndex<table_view.rows){
table_view.model.removeRow(rowIndex,rows)
}
}
function appendRow(obj){
table_model.appendRow(obj)
}
}