This commit is contained in:
zhuzichu 2023-10-17 12:26:17 +08:00
parent 3a775a8bb2
commit 9b5167d92e
2 changed files with 113 additions and 78 deletions

View File

@ -32,10 +32,11 @@ Rectangle {
} }
QtObject{ QtObject{
id:d id:d
property var currentRow
property int rowHoverIndex: -1
property int defaultItemWidth: 100 property int defaultItemWidth: 100
property int defaultItemHeight: 42 property int defaultItemHeight: 42
property var header_rows:[] property var header_rows:[]
property bool selectionFlag: true
function obtEditDelegate(column,row,cellItem){ function obtEditDelegate(column,row,cellItem){
var display = table_model.data(table_model.index(row,column),"display") var display = table_model.data(table_model.index(row,column),"display")
var cellPosition = cellItem.mapToItem(scroll_table, 0, 0) var cellPosition = cellItem.mapToItem(scroll_table, 0, 0)
@ -232,7 +233,12 @@ Rectangle {
delegate: Rectangle { delegate: Rectangle {
id:item_table id:item_table
property point position: Qt.point(column,row) property point position: Qt.point(column,row)
color: (row%2!==0) ? control.color : (FluTheme.dark ? Qt.rgba(1,1,1,0.06) : Qt.rgba(0,0,0,0.06)) color:{
if(d.rowHoverIndex === row || d.currentRow === table_model.getRow(row).__index){
return FluTheme.dark ? Qt.rgba(1,1,1,0.06) : Qt.rgba(0,0,0,0.06)
}
return (row%2!==0) ? control.color : (FluTheme.dark ? Qt.rgba(1,1,1,0.015) : Qt.rgba(0,0,0,0.015))
}
implicitHeight: 40 implicitHeight: 40
implicitWidth: { implicitWidth: {
var w = columnSource[column].width var w = columnSource[column].width
@ -249,6 +255,18 @@ Rectangle {
visible: !item_loader.sourceComponent visible: !item_loader.sourceComponent
color: "#00000000" color: "#00000000"
} }
Rectangle{
height: 18
radius: 1.5
color: FluTheme.primaryColor.dark
width: 3
visible: d.currentRow === table_model.getRow(row).__index && column === 0
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: 3
}
}
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
acceptedButtons: Qt.LeftButton acceptedButtons: Qt.LeftButton
@ -267,8 +285,8 @@ Rectangle {
} }
onClicked: onClicked:
(event)=>{ (event)=>{
d.currentRow = table_model.getRow(row).__index
item_loader.sourceComponent = undefined item_loader.sourceComponent = undefined
d.selectionFlag = !d.selectionFlag
event.accepted = true event.accepted = true
} }
} }
@ -294,6 +312,19 @@ Rectangle {
return com_text return com_text
} }
} }
MouseArea{
acceptedButtons: Qt.NoButton
anchors.fill: parent
hoverEnabled: true
z:99
onContainsMouseChanged: {
if(containsMouse){
d.rowHoverIndex = row
}else{
d.rowHoverIndex = -1
}
}
}
} }
} }
Loader{ Loader{
@ -310,6 +341,20 @@ Rectangle {
table_model.setRow(row,obj) table_model.setRow(row,obj)
} }
} }
MouseArea{
acceptedButtons: Qt.NoButton
anchors.fill: item_loader
enabled: item_loader.sourceComponent
hoverEnabled: true
z:10
onContainsMouseChanged: {
if(containsMouse){
d.rowHoverIndex = item_loader.row
}else{
d.rowHoverIndex = -1
}
}
}
} }
Component{ Component{
id:com_handle id:com_handle
@ -350,7 +395,6 @@ Rectangle {
implicitWidth: item_column_loader.item.implicitWidth + (cellPadding * 2) implicitWidth: item_column_loader.item.implicitWidth + (cellPadding * 2)
implicitHeight: Math.max(36, item_column_loader.item.implicitHeight + (cellPadding * 2)) implicitHeight: Math.max(36, item_column_loader.item.implicitHeight + (cellPadding * 2))
color:{ color:{
d.selectionFlag
if(column_item_control_mouse.pressed){ if(column_item_control_mouse.pressed){
return control.pressedButtonColor return control.pressedButtonColor
} }
@ -373,7 +417,6 @@ Rectangle {
onClicked: onClicked:
(event)=>{ (event)=>{
closeEditor() closeEditor()
d.selectionFlag = !d.selectionFlag
} }
} }
Loader{ Loader{
@ -473,7 +516,6 @@ Rectangle {
implicitWidth: Math.max(30, row_text.implicitWidth + (cellPadding * 2)) implicitWidth: Math.max(30, row_text.implicitWidth + (cellPadding * 2))
implicitHeight: row_text.implicitHeight + (cellPadding * 2) implicitHeight: row_text.implicitHeight + (cellPadding * 2)
color: { color: {
d.selectionFlag
if(item_control_mouse.pressed){ if(item_control_mouse.pressed){
return control.pressedButtonColor return control.pressedButtonColor
} }
@ -501,7 +543,6 @@ Rectangle {
onClicked: onClicked:
(event)=>{ (event)=>{
closeEditor() closeEditor()
d.selectionFlag = !d.selectionFlag
} }
} }
MouseArea{ MouseArea{

View File

@ -8,9 +8,9 @@ import FluentUI
Rectangle { Rectangle {
property var columnSource property var columnSource
property var dataSource property var dataSource
property color selectionColor: Qt.alpha(FluTheme.primaryColor.lightest,0.6) property color selectionColor: FluTools.colorAlpha(FluTheme.primaryColor.lightest,0.6)
property color hoverButtonColor: Qt.alpha(selectionColor,0.2) property color hoverButtonColor: FluTools.colorAlpha(selectionColor,0.2)
property color pressedButtonColor: Qt.alpha(selectionColor,0.4) property color pressedButtonColor: FluTools.colorAlpha(selectionColor,0.4)
property alias tableModel: table_model property alias tableModel: 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)
@ -33,13 +33,13 @@ Rectangle {
} }
QtObject{ QtObject{
id:d id:d
property var currentRow
property int rowHoverIndex: -1
property int defaultItemWidth: 100 property int defaultItemWidth: 100
property int defaultItemHeight: 42 property int defaultItemHeight: 42
property var header_rows:[] property var header_rows:[]
property bool selectionFlag: true function obtEditDelegate(column,row,cellItem){
function obtEditDelegate(column,row){
var display = table_model.data(table_model.index(row,column),"display") var display = table_model.data(table_model.index(row,column),"display")
var cellItem = table_view.itemAtCell(column, row)
var cellPosition = cellItem.mapToItem(scroll_table, 0, 0) var cellPosition = cellItem.mapToItem(scroll_table, 0, 0)
item_loader.column = column item_loader.column = column
item_loader.row = row item_loader.row = row
@ -180,16 +180,11 @@ Rectangle {
id:model_columns id:model_columns
} }
boundsBehavior: Flickable.StopAtBounds boundsBehavior: Flickable.StopAtBounds
ScrollBar.horizontal: FluScrollBar{} ScrollBar.horizontal: FluScrollBar{
ScrollBar.vertical: FluScrollBar{} id:scroll_bar_h
selectionModel: ItemSelectionModel { }
id:selection_model ScrollBar.vertical: FluScrollBar{
model: table_model id:scroll_bar_v
onSelectionChanged: {
if(selection_rect.dragging){
d.selectionFlag = !d.selectionFlag
}
}
} }
columnWidthProvider: function(column) { columnWidthProvider: function(column) {
var w = columnSource[column].width var w = columnSource[column].width
@ -239,8 +234,12 @@ Rectangle {
delegate: Rectangle { delegate: Rectangle {
id:item_table id:item_table
property point position: Qt.point(column,row) property point position: Qt.point(column,row)
required property bool selected color:{
color: (row%2!==0) ? control.color : (FluTheme.dark ? Qt.rgba(1,1,1,0.06) : Qt.rgba(0,0,0,0.06)) if(d.rowHoverIndex === row || d.currentRow === table_model.getRow(row).__index){
return FluTheme.dark ? Qt.rgba(1,1,1,0.06) : Qt.rgba(0,0,0,0.06)
}
return (row%2!==0) ? control.color : (FluTheme.dark ? Qt.rgba(1,1,1,0.015) : Qt.rgba(0,0,0,0.015))
}
implicitHeight: 40 implicitHeight: 40
implicitWidth: { implicitWidth: {
var w = columnSource[column].width var w = columnSource[column].width
@ -255,35 +254,40 @@ Rectangle {
Rectangle{ Rectangle{
anchors.fill: parent anchors.fill: parent
visible: !item_loader.sourceComponent visible: !item_loader.sourceComponent
color: selected ? control.selectionColor : "#00000000" color: "#00000000"
}
Rectangle{
height: 18
radius: 1.5
color: FluTheme.primaryColor.dark
width: 3
visible: d.currentRow === table_model.getRow(row).__index && column === 0
anchors{
verticalCenter: parent.verticalCenter
left: parent.left
leftMargin: 3
}
} }
MouseArea{ MouseArea{
anchors.fill: parent anchors.fill: parent
acceptedButtons: Qt.LeftButton acceptedButtons: Qt.LeftButton
onPressed:{ onPressed:{
closeEditor() closeEditor()
table_view.interactive = false
} }
onCanceled: { onCanceled: {
table_view.interactive = true
} }
onReleased: { onReleased: {
table_view.interactive = true
} }
onDoubleClicked:{ onDoubleClicked:{
if(typeof(display) == "object"){ if(typeof(display) == "object"){
return return
} }
item_loader.sourceComponent = d.obtEditDelegate(column,row) item_loader.sourceComponent = d.obtEditDelegate(column,row,item_table)
} }
onClicked: onClicked:
(event)=>{ (event)=>{
d.currentRow = table_model.getRow(row).__index
item_loader.sourceComponent = undefined item_loader.sourceComponent = undefined
if(!(event.modifiers & Qt.ControlModifier)){
selection_model.clear()
}
selection_model.select(table_model.index(row,column),ItemSelectionModel.Select)
d.selectionFlag = !d.selectionFlag
event.accepted = true event.accepted = true
} }
} }
@ -292,7 +296,7 @@ Rectangle {
property var modelData: display property var modelData: display
property var tableView: table_view property var tableView: table_view
property var tableModel: table_model property var tableModel: table_model
property point position: item_table.position property var position: item_table.position
property int row: position.y property int row: position.y
property int column: position.x property int column: position.x
property var options: { property var options: {
@ -309,6 +313,19 @@ Rectangle {
return com_text return com_text
} }
} }
MouseArea{
acceptedButtons: Qt.NoButton
anchors.fill: parent
hoverEnabled: true
z:99
onContainsMouseChanged: {
if(containsMouse){
d.rowHoverIndex = row
}else{
d.rowHoverIndex = -1
}
}
}
} }
} }
Loader{ Loader{
@ -325,22 +342,25 @@ Rectangle {
table_model.setRow(row,obj) table_model.setRow(row,obj)
} }
} }
MouseArea{
acceptedButtons: Qt.NoButton
anchors.fill: item_loader
enabled: item_loader.sourceComponent
hoverEnabled: true
z:10
onContainsMouseChanged: {
if(containsMouse){
d.rowHoverIndex = item_loader.row
}else{
d.rowHoverIndex = -1
}
}
}
} }
Component{ Component{
id:com_handle id:com_handle
Item {} Item {}
} }
SelectionRectangle {
id:selection_rect
target: table_view
bottomRightHandle:com_handle
topLeftHandle: com_handle
onDraggingChanged: {
if(!dragging){
table_view.interactive = true
}
}
}
Component{ Component{
id:com_column_text id:com_column_text
@ -348,10 +368,6 @@ Rectangle {
id: column_text id: column_text
text: modelData text: modelData
anchors.fill: parent anchors.fill: parent
font.bold:{
d.selectionFlag
return selection_model.columnIntersectsSelection(column)
}
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter verticalAlignment: Text.AlignVCenter
} }
@ -380,13 +396,9 @@ Rectangle {
implicitWidth: item_column_loader.item.implicitWidth + (cellPadding * 2) implicitWidth: item_column_loader.item.implicitWidth + (cellPadding * 2)
implicitHeight: Math.max(36, item_column_loader.item.implicitHeight + (cellPadding * 2)) implicitHeight: Math.max(36, item_column_loader.item.implicitHeight + (cellPadding * 2))
color:{ color:{
d.selectionFlag
if(column_item_control_mouse.pressed){ if(column_item_control_mouse.pressed){
return control.pressedButtonColor return control.pressedButtonColor
} }
if(selection_model.isColumnSelected(column)){
return control.hoverButtonColor
}
return column_item_control_mouse.containsMouse&&!canceled ? control.hoverButtonColor : FluTheme.dark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(247/255,247/255,247/255,1) return column_item_control_mouse.containsMouse&&!canceled ? control.hoverButtonColor : FluTheme.dark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(247/255,247/255,247/255,1)
} }
border.color: FluTheme.dark ? "#252525" : "#e4e4e4" border.color: FluTheme.dark ? "#252525" : "#e4e4e4"
@ -406,13 +418,6 @@ Rectangle {
onClicked: onClicked:
(event)=>{ (event)=>{
closeEditor() closeEditor()
if(!(event.modifiers & Qt.ControlModifier)){
selection_model.clear()
}
for(var i=0;i<=table_view.rows;i++){
selection_model.select(table_model.index(i,column),ItemSelectionModel.Select)
}
d.selectionFlag = !d.selectionFlag
} }
} }
Loader{ Loader{
@ -502,6 +507,9 @@ Rectangle {
return [] return []
} }
} }
onContentYChanged: {
forceLayout()
}
delegate: Rectangle{ delegate: Rectangle{
id:item_control id:item_control
readonly property real cellPadding: 8 readonly property real cellPadding: 8
@ -509,13 +517,9 @@ Rectangle {
implicitWidth: Math.max(30, row_text.implicitWidth + (cellPadding * 2)) implicitWidth: Math.max(30, row_text.implicitWidth + (cellPadding * 2))
implicitHeight: row_text.implicitHeight + (cellPadding * 2) implicitHeight: row_text.implicitHeight + (cellPadding * 2)
color: { color: {
d.selectionFlag
if(item_control_mouse.pressed){ if(item_control_mouse.pressed){
return control.pressedButtonColor return control.pressedButtonColor
} }
if(selection_model.isRowSelected(row)){
return control.hoverButtonColor
}
return item_control_mouse.containsMouse&&!canceled ? control.hoverButtonColor : FluTheme.dark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(247/255,247/255,247/255,1) return item_control_mouse.containsMouse&&!canceled ? control.hoverButtonColor : FluTheme.dark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(247/255,247/255,247/255,1)
} }
border.color: FluTheme.dark ? "#252525" : "#e4e4e4" border.color: FluTheme.dark ? "#252525" : "#e4e4e4"
@ -523,10 +527,6 @@ Rectangle {
id:row_text id:row_text
anchors.centerIn: parent anchors.centerIn: parent
text: row + 1 text: row + 1
font.bold:{
d.selectionFlag
return selection_model.rowIntersectsSelection(row)
}
} }
MouseArea{ MouseArea{
id:item_control_mouse id:item_control_mouse
@ -544,13 +544,6 @@ Rectangle {
onClicked: onClicked:
(event)=>{ (event)=>{
closeEditor() closeEditor()
if(!(event.modifiers & Qt.ControlModifier)){
selection_model.clear()
}
for(var i=0;i<=columnSource.length;i++){
selection_model.select(table_model.index(row,i),ItemSelectionModel.Select)
}
d.selectionFlag = !d.selectionFlag
} }
} }
MouseArea{ MouseArea{
@ -608,7 +601,8 @@ Rectangle {
item_loader.sourceComponent = null item_loader.sourceComponent = null
} }
function resetPosition(){ function resetPosition(){
table_view.positionViewAtCell(Qt.point(0, 0),Qt.AlignTop|Qt.AlignLeft) scroll_bar_h.position = 0
scroll_bar_v.position = 0
} }
function customItem(comId,options={}){ function customItem(comId,options={}){
var o = {} var o = {}