qtdeclarative/examples/quickcontrols/spreadsheets/Spreadsheets/ColumnHeaderView.qml

185 lines
5.5 KiB
QML

// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Controls
import Spreadsheets
HorizontalHeaderView {
id: root
property alias enableShowHideAction: showHideMenuItem.enabled
required property SpreadSelectionModel spreadSelectionModel
signal resetReorderingRequested()
signal hideRequested(int column)
signal showRequested()
selectionBehavior: HorizontalHeaderView.SelectionDisabled
movableColumns: true
onColumnMoved: (index, old_column, new_column) => SpreadModel.mapColumn(index, new_column)
selectionModel: HeaderSelectionModel {
id: headerSelectionModel
selectionModel: root.spreadSelectionModel
orientation: Qt.Horizontal
}
textRole: "columnName"
delegate: HorizontalHeaderViewDelegate {
id: headerDelegate
required property var index
required property int column
required property bool containsDrag
readonly property bool visibleBorder: ((columnMenu.column === column)
|| containsDrag)
function rightClicked() {
columnMenu.column = index
const menu_pos = mapToItem(root, -anchors.margins, height + anchors.margins)
columnMenu.popup(menu_pos)
}
Binding {
target: headerDelegate.background
property: "color"
value: headerDelegate.palette.highlight
when: headerDelegate.highlighted
}
Binding {
target: headerDelegate.background
property: "border.width"
value: headerDelegate.visibleBorder ? 1 : 0
when: (headerDelegate.background as Rectangle) ?? false
}
Binding {
target: headerDelegate.background
property: "border.color"
value: headerDelegate.palette.highlight
when: (headerDelegate.background as Rectangle) ?? false
}
HeaderViewTapHandler {
anchors.fill: parent
onToggleRequested: {
root.spreadSelectionModel.toggleColumn(headerDelegate.index)
headerSelectionModel.setCurrent()
}
onSelectRequested: {
root.spreadSelectionModel.selectColumn(headerDelegate.index)
headerSelectionModel.setCurrent()
}
onContextMenuRequested: headerDelegate.rightClicked()
}
}
Menu {
id: columnMenu
property int column: -1
onOpened: {
headerSelectionModel.setCurrent(column)
}
onClosed: {
headerSelectionModel.setCurrent()
column = -1
}
MenuItem {
text: qsTr("Insert 1 column left")
icon {
source: "icons/insert_column_left.svg"
color: palette.highlightedText
}
onClicked: {
if (columnMenu.column < 0)
return
SpreadModel.insertColumn(columnMenu.column)
}
}
MenuItem {
text: qsTr("Insert 1 column right")
icon {
source: "icons/insert_column_right.svg"
color: palette.highlightedText
}
onClicked: {
if (columnMenu.column < 0)
return
SpreadModel.insertColumn(columnMenu.column + 1)
}
}
MenuItem {
text: root.selectionModel.hasSelection ? qsTr("Remove selected columns")
: qsTr("Remove column")
icon {
source: "icons/remove_column.svg"
color: palette.text
}
onClicked: {
if (root.selectionModel.hasSelection)
SpreadModel.removeColumns(root.spreadSelectionModel.selectedColumns())
else if (columnMenu.column >= 0)
SpreadModel.removeColumn(columnMenu.column)
}
}
MenuItem {
text: root.selectionModel.hasSelection ? qsTr("Hide selected columns")
: qsTr("Hide column")
icon {
source: "icons/hide.svg"
color: palette.text
}
onClicked: {
if (root.selectionModel.hasSelection) {
let columns = root.spreadSelectionModel.selectedColumns()
columns.sort(function(lhs, rhs){ return rhs.column - lhs.column })
for (let i in columns)
root.hideRequested(columns[i].column)
root.spreadSelectionModel.clearSelection()
} else {
root.hideRequested(columnMenu.column)
}
}
}
MenuItem {
id: showHideMenuItem
text: qsTr("Show hidden column(s)")
icon {
source: "icons/show.svg"
color: palette.text
}
onClicked: {
root.showRequested()
root.spreadSelectionModel.clearSelection()
}
}
MenuItem {
text: qsTr("Reset column reordering")
icon {
source: "icons/reset_reordering.svg"
color: palette.text
}
onClicked: root.resetReorderingRequested()
}
}
}