Compare commits

...

10 Commits

Author SHA1 Message Date
2d4e61445e Merge pull request #488 from yanhuacuo/path-for-insertRow
Add the functionality to insert new rows into the table
2024-04-28 10:47:28 +08:00
cc79854191 Merge pull request #489 from w-jt/main
FluPagination.qml 添加自定义控件,通过header和footer属性添加控件
2024-04-28 10:46:47 +08:00
500efa6298 添加自定义控件,通过header和footer属性添加控件
添加自定义控件,通过header和footer属性添加控件
2024-04-27 11:54:42 +08:00
355332da96 添加自定义控件,通过header和footer属性添加控件
添加自定义控件,通过header和footer属性添加控件
2024-04-27 11:53:57 +08:00
a0d662a8a5 添加自定义控件,通过header和footer属性添加控件
添加自定义控件,通过header和footer属性添加控件
2024-04-27 11:49:29 +08:00
aecc3fe3b4 添加自定义控件,通过header和footer属性添加控件
添加自定义控件,通过header和footer属性添加控件
2024-04-27 11:48:19 +08:00
3554fb99cd Add the functionality to insert new rows into the table 2024-04-27 09:40:37 +08:00
24fdff7e35 fix bug 2024-04-25 00:08:18 +08:00
d2fdd08604 update 2024-04-24 17:24:31 +08:00
1f5d6ce1aa update 2024-04-24 17:12:00 +08:00
12 changed files with 348 additions and 283 deletions

View File

@ -1968,7 +1968,7 @@ Some contents...</source>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="177"/> <location filename="qml/page/T_TableView.qml" line="177"/>
<location filename="qml/page/T_TableView.qml" line="478"/> <location filename="qml/page/T_TableView.qml" line="513"/>
<source>Name</source> <source>Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1988,57 +1988,67 @@ Some contents...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="337"/> <location filename="qml/page/T_TableView.qml" line="358"/>
<source>Age</source> <source>Age</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="412"/> <location filename="qml/page/T_TableView.qml" line="433"/>
<source>Clear All</source> <source>Clear All</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="473"/> <location filename="qml/page/T_TableView.qml" line="470"/>
<source>Insert a Row</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="qml/page/T_TableView.qml" line="478"/>
<source>Focus not acquired: Please click any item in the form as the target for insertion!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="qml/page/T_TableView.qml" line="508"/>
<source>Avatar</source> <source>Avatar</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="491"/> <location filename="qml/page/T_TableView.qml" line="526"/>
<source>Address</source> <source>Address</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="498"/> <location filename="qml/page/T_TableView.qml" line="534"/>
<source>Nickname</source> <source>Nickname</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="505"/> <location filename="qml/page/T_TableView.qml" line="541"/>
<source>Long String</source> <source>Long String</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="513"/> <location filename="qml/page/T_TableView.qml" line="549"/>
<source>Options</source> <source>Options</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="532"/> <location filename="qml/page/T_TableView.qml" line="568"/>
<source>&lt;Previous</source> <source>&lt;Previous</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="533"/> <location filename="qml/page/T_TableView.qml" line="569"/>
<source>Next&gt;</source> <source>Next&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="419"/> <location filename="qml/page/T_TableView.qml" line="440"/>
<source>Delete Selection</source> <source>Delete Selection</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="443"/> <location filename="qml/page/T_TableView.qml" line="464"/>
<source>Add a row of Data</source> <source>Add a row of Data</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View File

@ -2110,7 +2110,7 @@ Some contents...</source>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="177"/> <location filename="qml/page/T_TableView.qml" line="177"/>
<location filename="qml/page/T_TableView.qml" line="478"/> <location filename="qml/page/T_TableView.qml" line="513"/>
<source>Name</source> <source>Name</source>
<translation type="unfinished">名称</translation> <translation type="unfinished">名称</translation>
</message> </message>
@ -2130,57 +2130,67 @@ Some contents...</source>
<translation type="unfinished">全选</translation> <translation type="unfinished">全选</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="337"/> <location filename="qml/page/T_TableView.qml" line="358"/>
<source>Age</source> <source>Age</source>
<translation type="unfinished">年龄</translation> <translation type="unfinished">年龄</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="412"/> <location filename="qml/page/T_TableView.qml" line="433"/>
<source>Clear All</source> <source>Clear All</source>
<translation type="unfinished">清除所有</translation> <translation type="unfinished">清除所有</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="473"/> <location filename="qml/page/T_TableView.qml" line="470"/>
<source>Insert a Row</source>
<translation type="unfinished">插入一行</translation>
</message>
<message>
<location filename="qml/page/T_TableView.qml" line="478"/>
<source>Focus not acquired: Please click any item in the form as the target for insertion!</source>
<translation type="unfinished">焦点未获取:请点击表格中的任意一项,作为插入的靶点!</translation>
</message>
<message>
<location filename="qml/page/T_TableView.qml" line="508"/>
<source>Avatar</source> <source>Avatar</source>
<translation type="unfinished">头像</translation> <translation type="unfinished">头像</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="491"/> <location filename="qml/page/T_TableView.qml" line="526"/>
<source>Address</source> <source>Address</source>
<translation type="unfinished">地址</translation> <translation type="unfinished">地址</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="498"/> <location filename="qml/page/T_TableView.qml" line="534"/>
<source>Nickname</source> <source>Nickname</source>
<translation type="unfinished">昵称</translation> <translation type="unfinished">昵称</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="505"/> <location filename="qml/page/T_TableView.qml" line="541"/>
<source>Long String</source> <source>Long String</source>
<translation type="unfinished">长字符串</translation> <translation type="unfinished">长字符串</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="513"/> <location filename="qml/page/T_TableView.qml" line="549"/>
<source>Options</source> <source>Options</source>
<translation type="unfinished">操作</translation> <translation type="unfinished">操作</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="532"/> <location filename="qml/page/T_TableView.qml" line="568"/>
<source>&lt;Previous</source> <source>&lt;Previous</source>
<translation type="unfinished">&lt;上一页</translation> <translation type="unfinished">&lt;上一页</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="533"/> <location filename="qml/page/T_TableView.qml" line="569"/>
<source>Next&gt;</source> <source>Next&gt;</source>
<translation type="unfinished">下一页&gt;</translation> <translation type="unfinished">下一页&gt;</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="419"/> <location filename="qml/page/T_TableView.qml" line="440"/>
<source>Delete Selection</source> <source>Delete Selection</source>
<translation type="unfinished">删除选中</translation> <translation type="unfinished">删除选中</translation>
</message> </message>
<message> <message>
<location filename="qml/page/T_TableView.qml" line="443"/> <location filename="qml/page/T_TableView.qml" line="464"/>
<source>Add a row of Data</source> <source>Add a row of Data</source>
<translation type="unfinished">添加一行数据</translation> <translation type="unfinished">添加一行数据</translation>
</message> </message>

View File

@ -13,7 +13,7 @@ FluContentPage{
property var dataSource : [] property var dataSource : []
property int sortType: 0 property int sortType: 0
property bool seletedAll: true property bool selectedAll: true
property string nameKeyword: "" property string nameKeyword: ""
onNameKeywordChanged: { onNameKeywordChanged: {
@ -32,11 +32,11 @@ FluContentPage{
onCheckBoxChanged: { onCheckBoxChanged: {
for(var i =0;i< table_view.rows ;i++){ for(var i =0;i< table_view.rows ;i++){
if(false === table_view.getRow(i).checkbox.options.checked){ if(false === table_view.getRow(i).checkbox.options.checked){
root.seletedAll = false root.selectedAll = false
return return
} }
} }
root.seletedAll = true root.selectedAll = true
} }
onSortTypeChanged: { onSortTypeChanged: {
@ -238,12 +238,12 @@ FluContentPage{
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
} }
FluCheckBox{ FluCheckBox{
checked: true === root.seletedAll checked: true === root.selectedAll
animationEnabled: false animationEnabled: false
Layout.alignment: Qt.AlignVCenter Layout.alignment: Qt.AlignVCenter
clickListener: function(){ clickListener: function(){
root.seletedAll = !root.seletedAll root.selectedAll = !root.selectedAll
var checked = root.seletedAll var checked = root.selectedAll
itemModel.display = table_view.customItem(com_column_checbox,{"checked":checked}) itemModel.display = table_view.customItem(com_column_checbox,{"checked":checked})
for(var i =0;i< table_view.rows ;i++){ for(var i =0;i< table_view.rows ;i++){
var rowData = table_view.getRow(i) var rowData = table_view.getRow(i)
@ -280,6 +280,27 @@ FluContentPage{
} }
} }
Component{
id:com_auto_suggestbox
FluAutoSuggestBox {
id: textbox
anchors.fill: parent
focus: true
Component.onCompleted: {
var data = ["傲来国界花果山水帘洞","傲来国界坎源山脏水洞","大唐国界黑风山黑风洞","大唐国界黄风岭黄风洞","大唐国界骷髅山白骨洞","宝象国界碗子山波月洞","宝象国界平顶山莲花洞","宝象国界压龙山压龙洞","乌鸡国界号山枯松涧火云洞","乌鸡国界衡阳峪黑水河河神府"]
var result = data.map(function(item) {
return {title: item};
});
items = result
textbox.text= String(display)
}
onCommit: {
editTextChaged(textbox.text)
tableView.closeEditor()
}
}
}
Component{ Component{
id:com_avatar id:com_avatar
Item{ Item{
@ -445,6 +466,20 @@ FluContentPage{
table_view.appendRow(genTestObject()) table_view.appendRow(genTestObject())
} }
} }
FluButton{
text: qsTr("Insert a Row")
onClicked: {
if(typeof table_view.current !== 'undefined'){
var newLine = genTestObject()
var currentLine = dataSource.findIndex(obj => obj._key === table_view.current._key)
root.dataSource.splice(currentLine, 0, newLine);
table_view.dataSource = root.dataSource
}else{
showWarning(qsTr("Focus not acquired: Please click any item in the form as the target for insertion!"))
}
}
}
} }
} }
@ -490,6 +525,7 @@ FluContentPage{
{ {
title: qsTr("Address"), title: qsTr("Address"),
dataIndex: 'address', dataIndex: 'address',
editDelegate: com_auto_suggestbox,
width:200, width:200,
minimumWidth:100, minimumWidth:100,
maximumWidth:250 maximumWidth:250
@ -566,7 +602,7 @@ FluContentPage{
return avatars[randomIndex]; return avatars[randomIndex];
} }
return { return {
checkbox: table_view.customItem(com_checbox,{checked:root.seletedAll}), checkbox: table_view.customItem(com_checbox,{checked:root.selectedAll}),
avatar:table_view.customItem(com_avatar,{avatar:getAvatar()}), avatar:table_view.customItem(com_avatar,{avatar:getAvatar()}),
name: getRandomName(), name: getRandomName(),
age:getRandomAge(), age:getRandomAge(),
@ -579,7 +615,7 @@ FluContentPage{
} }
} }
function loadData(page,count){ function loadData(page,count){
root.seletedAll = true root.selectedAll = true
const dataSource = [] const dataSource = []
for(var i=0;i<count;i++){ for(var i=0;i<count;i++){
dataSource.push(genTestObject()) dataSource.push(genTestObject())

View File

@ -15,7 +15,7 @@ FluWindow {
title: "FluentUI" title: "FluentUI"
width: 1000 width: 1000
height: 680 height: 680
minimumWidth: 1000 minimumWidth: 680
minimumHeight: 200 minimumHeight: 200
launchMode: FluWindowType.SingleTask launchMode: FluWindowType.SingleTask
fitsAppBarWindows: true fitsAppBarWindows: true

View File

@ -141,7 +141,6 @@ void FluFrameless::componentComplete() {
const auto uMsg = msg->message; const auto uMsg = msg->message;
const auto wParam = msg->wParam; const auto wParam = msg->wParam;
const auto lParam = msg->lParam; const auto lParam = msg->lParam;
static QPoint offsetXY;
if (uMsg == WM_WINDOWPOSCHANGING) { if (uMsg == WM_WINDOWPOSCHANGING) {
auto *wp = reinterpret_cast<WINDOWPOS *>(lParam); auto *wp = reinterpret_cast<WINDOWPOS *>(lParam);
if (wp != nullptr && (wp->flags & SWP_NOSIZE) == 0) { if (wp != nullptr && (wp->flags & SWP_NOSIZE) == 0) {
@ -163,10 +162,6 @@ void FluFrameless::componentComplete() {
} }
int offsetSize; int offsetSize;
bool isMaximum = ::IsZoomed(hwnd); bool isMaximum = ::IsZoomed(hwnd);
auto _offsetXY = QPoint(abs(clientRect->left - originalLeft), abs(clientRect->top - originalTop));
if (_offsetXY.x() != 0) {
offsetXY = _offsetXY;
}
if (isMaximum || _isFullScreen()) { if (isMaximum || _isFullScreen()) {
offsetSize = 0; offsetSize = 0;
} else { } else {
@ -175,19 +170,10 @@ void FluFrameless::componentComplete() {
if (!isCompositionEnabled()) { if (!isCompositionEnabled()) {
offsetSize = 0; offsetSize = 0;
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
clientRect->top = originalTop + offsetSize; clientRect->top = originalTop + offsetSize;
clientRect->bottom = originalBottom - offsetSize; clientRect->bottom = originalBottom - offsetSize;
clientRect->left = originalLeft + offsetSize; clientRect->left = originalLeft + offsetSize;
clientRect->right = originalRight - offsetSize; clientRect->right = originalRight - offsetSize;
#else
if (!isMaximum) {
clientRect->top = originalTop + offsetSize;
clientRect->bottom = originalBottom - offsetSize;
clientRect->left = originalLeft + offsetSize;
clientRect->right = originalRight - offsetSize;
}
#endif
_setMaximizeHovered(false); _setMaximizeHovered(false);
*result = WVR_REDRAW; *result = WVR_REDRAW;
return true; return true;
@ -266,27 +252,15 @@ void FluFrameless::componentComplete() {
return true; return true;
} else if (uMsg == WM_GETMINMAXINFO) { } else if (uMsg == WM_GETMINMAXINFO) {
auto *minmaxInfo = reinterpret_cast<MINMAXINFO *>(lParam); auto *minmaxInfo = reinterpret_cast<MINMAXINFO *>(lParam);
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
minmaxInfo->ptMaxPosition.x = 0;
minmaxInfo->ptMaxPosition.y = 0;
minmaxInfo->ptMaxSize.x = 0;
minmaxInfo->ptMaxSize.y = 0;
return false;
#else
auto pixelRatio = window()->devicePixelRatio(); auto pixelRatio = window()->devicePixelRatio();
auto geometry = window()->screen()->availableGeometry(); auto geometry = window()->screen()->availableGeometry();
RECT rect; RECT rect;
SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0); SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
if (!_fixSize) { minmaxInfo->ptMaxPosition.x = rect.left;
minmaxInfo->ptMinTrackSize.x = qRound(window()->minimumWidth() * pixelRatio + offsetXY.x()); minmaxInfo->ptMaxPosition.y = rect.top;
minmaxInfo->ptMinTrackSize.y = qRound(window()->minimumHeight() * pixelRatio + offsetXY.y() + _appbar->height() * pixelRatio); minmaxInfo->ptMaxSize.x = qRound(geometry.width() * pixelRatio);
} minmaxInfo->ptMaxSize.y = qRound(geometry.height() * pixelRatio);
minmaxInfo->ptMaxPosition.x = rect.left - offsetXY.x(); return false;
minmaxInfo->ptMaxPosition.y = rect.top - offsetXY.x();
minmaxInfo->ptMaxSize.x = qRound(geometry.width() * pixelRatio) + offsetXY.x() * 2;
minmaxInfo->ptMaxSize.y = qRound(geometry.height() * pixelRatio) + offsetXY.y() * 2;
return true;
#endif
} else if (uMsg == WM_NCRBUTTONDOWN) { } else if (uMsg == WM_NCRBUTTONDOWN) {
if (wParam == HTCAPTION) { if (wParam == HTCAPTION) {
_showSystemMenu(QCursor::pos()); _showSystemMenu(QCursor::pos());

View File

@ -7,6 +7,7 @@ FluTextBox{
property var items:[] property var items:[]
property string emptyText: qsTr("No results found") property string emptyText: qsTr("No results found")
property int autoSuggestBoxReplacement: FluentIcons.Search property int autoSuggestBoxReplacement: FluentIcons.Search
property string textRole: "title"
property var filter: function(item){ property var filter: function(item){
if(item.title.indexOf(control.text)!==-1){ if(item.title.indexOf(control.text)!==-1){
return true return true
@ -25,7 +26,7 @@ FluTextBox{
function handleClick(modelData){ function handleClick(modelData){
control_popup.visible = false control_popup.visible = false
control.itemClicked(modelData) control.itemClicked(modelData)
control.updateText(modelData.title) control.updateText(modelData[textRole])
} }
function loadData(){ function loadData(){
var result = [] var result = []
@ -48,7 +49,6 @@ FluTextBox{
} }
Popup{ Popup{
id:control_popup id:control_popup
y:control.height
focus: false focus: false
padding: 0 padding: 0
enter: Transition { enter: Transition {
@ -62,7 +62,7 @@ FluTextBox{
contentItem: FluClip{ contentItem: FluClip{
radius: [5,5,5,5] radius: [5,5,5,5]
ListView{ ListView{
id:list_view id: list_view
anchors.fill: parent anchors.fill: parent
clip: true clip: true
boundsBehavior: ListView.StopAtBounds boundsBehavior: ListView.StopAtBounds
@ -72,7 +72,7 @@ FluTextBox{
height: visible ? 38 : 0 height: visible ? 38 : 0
visible: list_view.count === 0 visible: list_view.count === 0
FluText{ FluText{
text:emptyText text: emptyText
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
@ -81,10 +81,10 @@ FluTextBox{
} }
} }
delegate:FluControl{ delegate:FluControl{
id:item_control id: item_control
height: 38 height: 38
width: control.width width: control.width
onClicked:{ onClicked: {
d.handleClick(modelData) d.handleClick(modelData)
} }
background: Rectangle{ background: Rectangle{
@ -103,7 +103,7 @@ FluTextBox{
} }
} }
contentItem: FluText{ contentItem: FluText{
text:modelData.title text: modelData[textRole]
leftPadding: 10 leftPadding: 10
rightPadding: 10 rightPadding: 10
verticalAlignment : Qt.AlignVCenter verticalAlignment : Qt.AlignVCenter
@ -128,7 +128,7 @@ FluTextBox{
if(d.flagVisible){ if(d.flagVisible){
var pos = control.mapToItem(null, 0, 0) var pos = control.mapToItem(null, 0, 0)
if(d.window.height>pos.y+control.height+rect_background.implicitHeight){ if(d.window.height>pos.y+control.height+rect_background.implicitHeight){
control_popup.y = control.height control_popup.y = Qt.binding(function(){return control.height})
} else if(pos.y>rect_background.implicitHeight){ } else if(pos.y>rect_background.implicitHeight){
control_popup.y = -rect_background.implicitHeight control_popup.y = -rect_background.implicitHeight
} else { } else {

View File

@ -1,100 +1,112 @@
import QtQuick 2.15 import QtQuick 2.15
import QtQuick.Controls 2.15 import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15 import QtQuick.Layouts 1.15
import FluentUI 1.0 import FluentUI 1.0
Item {
signal requestPage(int page,int count) Item {
property string previousText: qsTr("<Previous") signal requestPage(int page, int count)
property string nextText: qsTr("Next>")
property int pageCurrent: 0 property string previousText: qsTr("<Previous")
property int itemCount: 0 property string nextText: qsTr("Next>")
property int pageButtonCount: 5 property int pageCurrent: 0
property int pageCount: itemCount>0?Math.ceil(itemCount/__itemPerPage):0 property int itemCount: 0
property int __itemPerPage: 10 property int pageButtonCount: 5
property int __pageButtonHalf: Math.floor(pageButtonCount/2)+1 property int pageCount: itemCount > 0 ? Math.ceil(itemCount / __itemPerPage) : 0
id: control property int __itemPerPage: 10
implicitHeight: 40 property int __pageButtonHalf: Math.floor(pageButtonCount / 2) + 1
implicitWidth: content.width property Component header: null
Row{ property Component footer: null
id: content id: control
height: control.height implicitHeight: 40
spacing: 10 implicitWidth: content.width
padding: 10 Row {
FluToggleButton{ id: content
visible: control.pageCount>1 height: control.height
disabled: control.pageCurrent<=1 spacing: 10
text:control.previousText padding: 10
clickListener:function() { Loader {
control.calcNewPage(control.pageCurrent-1); sourceComponent: header
} }
} FluToggleButton {
Row{ visible: control.pageCount > 1
spacing: 5 disabled: control.pageCurrent <= 1
FluToggleButton{ text: control.previousText
property int pageNumber:1 clickListener: function () {
visible: control.pageCount>0 control.calcNewPage(control.pageCurrent - 1);
checked: pageNumber === control.pageCurrent }
text:String(pageNumber) }
clickListener:function() { Row {
control.calcNewPage(pageNumber); spacing: 5
}
} FluToggleButton {
FluText{ property int pageNumber: 1
visible: (control.pageCount>control.pageButtonCount&& visible: control.pageCount > 0
control.pageCurrent>control.__pageButtonHalf) checked: pageNumber === control.pageCurrent
text: "..." text: String(pageNumber)
} clickListener: function () {
Repeater{ control.calcNewPage(pageNumber);
id: button_repeator }
model: (control.pageCount<2)?0:(control.pageCount>=control.pageButtonCount)?(control.pageButtonCount-2):(control.pageCount-2) }
delegate:FluToggleButton{ FluText {
property int pageNumber: { visible: (control.pageCount > control.pageButtonCount &&
return (control.pageCurrent<=control.__pageButtonHalf) control.pageCurrent > control.__pageButtonHalf)
?(2+index) text: "..."
:(control.pageCount-control.pageCurrent<=control.pageButtonCount-control.__pageButtonHalf) }
?(control.pageCount-button_repeator.count+index) Repeater {
:(control.pageCurrent+2+index-control.__pageButtonHalf) id: button_repeator
} model: (control.pageCount < 2) ? 0 : (control.pageCount >= control.pageButtonCount) ? (control.pageButtonCount - 2) : (control.pageCount - 2)
text:String(pageNumber) delegate: FluToggleButton {
checked: pageNumber === control.pageCurrent property int pageNumber: {
clickListener:function(){ return (control.pageCurrent <= control.__pageButtonHalf)
control.calcNewPage(pageNumber); ? (2 + index)
} : (control.pageCount - control.pageCurrent <= control.pageButtonCount - control.__pageButtonHalf)
} ? (control.pageCount - button_repeator.count + index)
} : (control.pageCurrent + 2 + index - control.__pageButtonHalf)
FluText{ }
visible: (control.pageCount>control.pageButtonCount&& text: String(pageNumber)
control.pageCount-control.pageCurrent>control.pageButtonCount-control.__pageButtonHalf) checked: pageNumber === control.pageCurrent
text: "..." clickListener: function () {
} control.calcNewPage(pageNumber);
FluToggleButton{ }
property int pageNumber:control.pageCount }
visible: control.pageCount>1 }
checked: pageNumber === control.pageCurrent FluText {
text:String(pageNumber) visible: (control.pageCount > control.pageButtonCount &&
clickListener:function(){ control.pageCount - control.pageCurrent > control.pageButtonCount - control.__pageButtonHalf)
control.calcNewPage(pageNumber); text: "..."
} }
} FluToggleButton {
} property int pageNumber: control.pageCount
FluToggleButton{ visible: control.pageCount > 1
visible: control.pageCount>1 checked: pageNumber === control.pageCurrent
disabled: control.pageCurrent>=control.pageCount text: String(pageNumber)
text:control.nextText clickListener: function () {
clickListener:function() { control.calcNewPage(pageNumber);
control.calcNewPage(control.pageCurrent+1); }
} }
} }
} FluToggleButton {
function calcNewPage(page) visible: control.pageCount > 1
{ disabled: control.pageCurrent >= control.pageCount
if(!page) text: control.nextText
return clickListener: function () {
let page_num=Number(page) control.calcNewPage(control.pageCurrent + 1);
if(page_num<1||page_num>control.pageCount||page_num===control.pageCurrent) }
return }
control.pageCurrent=page_num Loader {
control.requestPage(page_num,control.__itemPerPage) sourceComponent: footer
} }
} }
function calcNewPage(page) {
if (!page)
return
let page_num = Number(page)
if (page_num < 1 || page_num > control.pageCount || page_num === control.pageCurrent)
return
control.pageCurrent = page_num
control.requestPage(page_num, control.__itemPerPage)
}
}

View File

@ -196,6 +196,11 @@ Rectangle {
id:com_table_delegate id:com_table_delegate
MouseArea{ MouseArea{
id:item_table_mouse id:item_table_mouse
TableView.onPooled: {
if(d.editPosition && d.editPosition.row === row && d.editPosition.column === column){
control.closeEditor()
}
}
property var rowObject : control.getRow(row) property var rowObject : control.getRow(row)
property var itemModel: model property var itemModel: model
property bool editVisible: { property bool editVisible: {
@ -274,9 +279,9 @@ Rectangle {
if(typeof(display) == "object"){ if(typeof(display) == "object"){
return return
} }
loader_edit.display = display
d.editDelegate = d.getEditDelegate(column) d.editDelegate = d.getEditDelegate(column)
updateEditPosition() updateEditPosition()
loader_edit.display = display
} }
onClicked: onClicked:
(event)=>{ (event)=>{

View File

@ -6,6 +6,7 @@ FluTextBox{
property var items:[] property var items:[]
property string emptyText: qsTr("No results found") property string emptyText: qsTr("No results found")
property int autoSuggestBoxReplacement: FluentIcons.Search property int autoSuggestBoxReplacement: FluentIcons.Search
property string textRole: "title"
property var filter: function(item){ property var filter: function(item){
if(item.title.indexOf(control.text)!==-1){ if(item.title.indexOf(control.text)!==-1){
return true return true
@ -24,7 +25,7 @@ FluTextBox{
function handleClick(modelData){ function handleClick(modelData){
control_popup.visible = false control_popup.visible = false
control.itemClicked(modelData) control.itemClicked(modelData)
control.updateText(modelData.title) control.updateText(modelData[textRole])
} }
function loadData(){ function loadData(){
var result = [] var result = []
@ -47,7 +48,6 @@ FluTextBox{
} }
Popup{ Popup{
id:control_popup id:control_popup
y:control.height
focus: false focus: false
padding: 0 padding: 0
enter: Transition { enter: Transition {
@ -61,7 +61,7 @@ FluTextBox{
contentItem: FluClip{ contentItem: FluClip{
radius: [5,5,5,5] radius: [5,5,5,5]
ListView{ ListView{
id:list_view id: list_view
anchors.fill: parent anchors.fill: parent
clip: true clip: true
boundsBehavior: ListView.StopAtBounds boundsBehavior: ListView.StopAtBounds
@ -71,7 +71,7 @@ FluTextBox{
height: visible ? 38 : 0 height: visible ? 38 : 0
visible: list_view.count === 0 visible: list_view.count === 0
FluText{ FluText{
text:emptyText text: emptyText
anchors{ anchors{
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
left: parent.left left: parent.left
@ -80,10 +80,10 @@ FluTextBox{
} }
} }
delegate:FluControl{ delegate:FluControl{
id:item_control id: item_control
height: 38 height: 38
width: control.width width: control.width
onClicked:{ onClicked: {
d.handleClick(modelData) d.handleClick(modelData)
} }
background: Rectangle{ background: Rectangle{
@ -102,7 +102,7 @@ FluTextBox{
} }
} }
contentItem: FluText{ contentItem: FluText{
text:modelData.title text: modelData[textRole]
leftPadding: 10 leftPadding: 10
rightPadding: 10 rightPadding: 10
verticalAlignment : Qt.AlignVCenter verticalAlignment : Qt.AlignVCenter
@ -127,7 +127,7 @@ FluTextBox{
if(d.flagVisible){ if(d.flagVisible){
var pos = control.mapToItem(null, 0, 0) var pos = control.mapToItem(null, 0, 0)
if(d.window.height>pos.y+control.height+rect_background.implicitHeight){ if(d.window.height>pos.y+control.height+rect_background.implicitHeight){
control_popup.y = control.height control_popup.y = Qt.binding(function(){return control.height})
} else if(pos.y>rect_background.implicitHeight){ } else if(pos.y>rect_background.implicitHeight){
control_popup.y = -rect_background.implicitHeight control_popup.y = -rect_background.implicitHeight
} else { } else {

View File

@ -1,100 +1,111 @@
import QtQuick import QtQuick 2.15
import QtQuick.Controls import QtQuick.Controls 2.15
import QtQuick.Layouts import QtQuick.Layouts 1.15
import FluentUI import FluentUI 1.0
Item { Item {
signal requestPage(int page,int count) signal requestPage(int page, int count)
property string previousText: qsTr("<Previous")
property string nextText: qsTr("Next>") property string previousText: qsTr("<Previous")
property int pageCurrent: 0 property string nextText: qsTr("Next>")
property int itemCount: 0 property int pageCurrent: 0
property int pageButtonCount: 5 property int itemCount: 0
property int pageCount: itemCount>0?Math.ceil(itemCount/__itemPerPage):0 property int pageButtonCount: 5
property int __itemPerPage: 10 property int pageCount: itemCount > 0 ? Math.ceil(itemCount / __itemPerPage) : 0
property int __pageButtonHalf: Math.floor(pageButtonCount/2)+1 property int __itemPerPage: 10
id: control property int __pageButtonHalf: Math.floor(pageButtonCount / 2) + 1
implicitHeight: 40 property Component header: null
implicitWidth: content.width property Component footer: null
Row{ id: control
id: content implicitHeight: 40
height: control.height implicitWidth: content.width
spacing: 10 Row {
padding: 10 id: content
FluToggleButton{ height: control.height
visible: control.pageCount>1 spacing: 10
disabled: control.pageCurrent<=1 padding: 10
text:control.previousText Loader {
clickListener:function() { sourceComponent: header
control.calcNewPage(control.pageCurrent-1); }
} FluToggleButton {
} visible: control.pageCount > 1
Row{ disabled: control.pageCurrent <= 1
spacing: 5 text: control.previousText
FluToggleButton{ clickListener: function () {
property int pageNumber:1 control.calcNewPage(control.pageCurrent - 1);
visible: control.pageCount>0 }
checked: pageNumber === control.pageCurrent }
text:String(pageNumber) Row {
clickListener:function() { spacing: 5
control.calcNewPage(pageNumber);
} FluToggleButton {
} property int pageNumber: 1
FluText{ visible: control.pageCount > 0
visible: (control.pageCount>control.pageButtonCount&& checked: pageNumber === control.pageCurrent
control.pageCurrent>control.__pageButtonHalf) text: String(pageNumber)
text: "..." clickListener: function () {
} control.calcNewPage(pageNumber);
Repeater{ }
id: button_repeator }
model: (control.pageCount<2)?0:(control.pageCount>=control.pageButtonCount)?(control.pageButtonCount-2):(control.pageCount-2) FluText {
delegate:FluToggleButton{ visible: (control.pageCount > control.pageButtonCount &&
property int pageNumber: { control.pageCurrent > control.__pageButtonHalf)
return (control.pageCurrent<=control.__pageButtonHalf) text: "..."
?(2+index) }
:(control.pageCount-control.pageCurrent<=control.pageButtonCount-control.__pageButtonHalf) Repeater {
?(control.pageCount-button_repeator.count+index) id: button_repeator
:(control.pageCurrent+2+index-control.__pageButtonHalf) model: (control.pageCount < 2) ? 0 : (control.pageCount >= control.pageButtonCount) ? (control.pageButtonCount - 2) : (control.pageCount - 2)
} delegate: FluToggleButton {
text:String(pageNumber) property int pageNumber: {
checked: pageNumber === control.pageCurrent return (control.pageCurrent <= control.__pageButtonHalf)
clickListener:function(){ ? (2 + index)
control.calcNewPage(pageNumber); : (control.pageCount - control.pageCurrent <= control.pageButtonCount - control.__pageButtonHalf)
} ? (control.pageCount - button_repeator.count + index)
} : (control.pageCurrent + 2 + index - control.__pageButtonHalf)
} }
FluText{ text: String(pageNumber)
visible: (control.pageCount>control.pageButtonCount&& checked: pageNumber === control.pageCurrent
control.pageCount-control.pageCurrent>control.pageButtonCount-control.__pageButtonHalf) clickListener: function () {
text: "..." control.calcNewPage(pageNumber);
} }
FluToggleButton{ }
property int pageNumber:control.pageCount }
visible: control.pageCount>1 FluText {
checked: pageNumber === control.pageCurrent visible: (control.pageCount > control.pageButtonCount &&
text:String(pageNumber) control.pageCount - control.pageCurrent > control.pageButtonCount - control.__pageButtonHalf)
clickListener:function(){ text: "..."
control.calcNewPage(pageNumber); }
} FluToggleButton {
} property int pageNumber: control.pageCount
} visible: control.pageCount > 1
FluToggleButton{ checked: pageNumber === control.pageCurrent
visible: control.pageCount>1 text: String(pageNumber)
disabled: control.pageCurrent>=control.pageCount clickListener: function () {
text:control.nextText control.calcNewPage(pageNumber);
clickListener:function() { }
control.calcNewPage(control.pageCurrent+1); }
} }
} FluToggleButton {
} visible: control.pageCount > 1
function calcNewPage(page) disabled: control.pageCurrent >= control.pageCount
{ text: control.nextText
if(!page) clickListener: function () {
return control.calcNewPage(control.pageCurrent + 1);
let page_num=Number(page) }
if(page_num<1||page_num>control.pageCount||page_num===control.pageCurrent) }
return Loader {
control.pageCurrent=page_num sourceComponent: footer
control.requestPage(page_num,control.__itemPerPage) }
} }
}
function calcNewPage(page) {
if (!page)
return
let page_num = Number(page)
if (page_num < 1 || page_num > control.pageCount || page_num === control.pageCurrent)
return
control.pageCurrent = page_num
control.requestPage(page_num, control.__itemPerPage)
}
}

View File

@ -56,7 +56,9 @@ QtObject {
var launchMode = win.launchMode var launchMode = win.launchMode
if(launchMode === 1){ if(launchMode === 1){
win.argument = argument win.argument = argument
win.show() if(!win.visible){
win.visible = true
}
win.raise() win.raise()
win.requestActivate() win.requestActivate()
return return

View File

@ -196,6 +196,11 @@ Rectangle {
id:com_table_delegate id:com_table_delegate
MouseArea{ MouseArea{
id:item_table_mouse id:item_table_mouse
TableView.onPooled: {
if(d.editPosition && d.editPosition.row === row && d.editPosition.column === column){
control.closeEditor()
}
}
property var rowObject : control.getRow(row) property var rowObject : control.getRow(row)
property var itemModel: model property var itemModel: model
property bool editVisible: { property bool editVisible: {
@ -274,9 +279,9 @@ Rectangle {
if(typeof(display) == "object"){ if(typeof(display) == "object"){
return return
} }
loader_edit.display = display
d.editDelegate = d.getEditDelegate(column) d.editDelegate = d.getEditDelegate(column)
updateEditPosition() updateEditPosition()
loader_edit.display = display
} }
onClicked: onClicked:
(event)=>{ (event)=>{