Files
DankMaterialShell/quickshell/Modules/ControlCenter/Components/CcTileGrid.qml
T

84 lines
3.2 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
import qs.Common
import qs.Widgets
import qs.Modules.ControlCenter
import "../utils/widgets.js" as WidgetUtils
import "../../../Common/GridLayout.js" as GridUtils
DankEditableGrid {
id: root
property var model: null
property bool live: true
property string screenName: ""
property int columns: CcMetrics.gridColumns
property real availableHeight: CcMetrics.fallbackScreenHeight - CcMetrics.maxHeightInset
readonly property int maximumRows: CcMetrics.rowCapFor(availableHeight, cellWidth - CcMetrics.gridGap)
signal expandClicked(var widgetData)
signal removeWidget(int index)
signal configRequested(int index, var widgetData, var anchor)
signal colorPickerRequested
signal lockRequested
signal powerRequested
signal settingsRequested
signal accountsRequested
signal closeRequested
property bool tapToClose: false
property var runningToplevels: []
readonly property real gridHeight: layoutHeight
readonly property real cellWidth: (width + CcMetrics.gridGap) / columns
readonly property CcTileSlot draggingSlot: tileRepeater.itemAt(draggingSourceIndex) as CcTileSlot
readonly property var savedWidgets: SettingsData.controlCenterWidgets || []
readonly property var shownIndices: savedWidgets.reduce((indices, widget, i) => !WidgetUtils.inFooter(widget) && WidgetUtils.isShown(widget) && model?.componentForWidget(widget) ? indices.concat([i]) : indices, [])
sourceItems: shownIndices.map(i => Object.assign({}, savedWidgets[i], sizeWithHiddenTwin(i)))
slotLayout: GridUtils.packCards(layoutItems.map(widget => Object.assign({}, widget, WidgetUtils.clampSize(widget, columns, maximumRows))), placementOrder, columns, width, CcMetrics.gridGap, cellWidth - CcMetrics.gridGap, I18n.isRtl, null, CcMetrics.gridStep, true)
swapDrags: true
placeholderRadius: draggingSlot?.small ? Theme.fullRadius(draggingSlot.width, draggingSlot.height) : (draggingSlot?.tileItem?.bodyRadius ?? Theme.fullRadius(width, CcMetrics.tileHeight))
onLayoutCommitted: items => model.setLayout(withHidden(items))
function sizeWithHiddenTwin(index) {
const widget = savedWidgets[index];
const size = WidgetUtils.clampSize(widget, Infinity);
if (!WidgetUtils.isUnplaced(widget))
return size;
for (const neighbor of [index + 1, index - 1]) {
const twin = savedWidgets[neighbor];
if (!twin || WidgetUtils.isShown(twin) || !WidgetUtils.isUnplaced(twin))
continue;
const twinSize = WidgetUtils.clampSize(twin, Infinity);
if (twinSize.w !== size.w || twinSize.h !== size.h)
continue;
size.w += twinSize.w;
return size;
}
return size;
}
function savedIndex(index) {
return shownIndices[index] ?? -1;
}
function withHidden(items) {
const widgets = savedWidgets.slice();
shownIndices.forEach((saved, i) => widgets[saved] = items[i]);
return widgets;
}
Repeater {
id: tileRepeater
model: root.tileModel
CcTileSlot {
grid: root
}
}
}