mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-10-18 17:24:01 -04:00
88 lines
2.7 KiB
QML
88 lines
2.7 KiB
QML
import QtQuick
|
|
import qs.Common
|
|
import "../Common/GridLayout.js" as GridUtils
|
|
|
|
QtObject {
|
|
id: root
|
|
|
|
required property var popout
|
|
property real gutter: 0
|
|
property real stepWidth: 0
|
|
property var widthFor: step => 0
|
|
property var currentStep: () => 0
|
|
property var currentRows: () => 0
|
|
property int minStep: 0
|
|
property int maxStep: 0
|
|
property real rowUnit: 0
|
|
property int minRows: 0
|
|
property int maxRows: 0
|
|
readonly property bool resizing: _drag !== null
|
|
property var _drag: null
|
|
|
|
signal preview(int step, int rows)
|
|
signal committed(int step, int rows, bool stepChanged, bool rowsChanged)
|
|
signal canceled
|
|
|
|
function edgeFor(step, side) {
|
|
const width = widthFor(step) + gutter * 2;
|
|
return popout.alignedXFor(width) + (side > 0 ? width : 0);
|
|
}
|
|
|
|
function sideMovable(signX, step) {
|
|
const side = (signX < 0 ? -1 : 1) * (I18n.isRtl ? -1 : 1);
|
|
const width = widthFor(step) + gutter * 2;
|
|
const x = popout.alignedXFor(width);
|
|
const grown = popout.alignedXFor(width + stepWidth);
|
|
return side > 0 ? grown + stepWidth !== x : grown !== x;
|
|
}
|
|
|
|
function begin(px, py, signX) {
|
|
if (_drag)
|
|
return;
|
|
const step = currentStep();
|
|
const rows = currentRows();
|
|
_drag = {
|
|
"step": step,
|
|
"rows": rows,
|
|
"previewStep": step,
|
|
"previewRows": rows,
|
|
"side": (signX < 0 ? -1 : 1) * (I18n.isRtl ? -1 : 1),
|
|
"x": px + popout.renderedAlignedX,
|
|
"y": py + popout.renderedAlignedY
|
|
};
|
|
}
|
|
|
|
function move(px, py) {
|
|
const drag = _drag;
|
|
if (!drag)
|
|
return;
|
|
const wanted = edgeFor(drag.step, drag.side) + px + popout.renderedAlignedX - drag.x;
|
|
const step = GridUtils.nearestStep(step => edgeFor(step, drag.side), drag.step, minStep, maxStep, wanted);
|
|
const rows = rowUnit > 0 ? Math.max(minRows, Math.min(maxRows, drag.rows + Math.round((py + popout.renderedAlignedY - drag.y) / rowUnit))) : drag.rows;
|
|
if (step === drag.previewStep && rows === drag.previewRows)
|
|
return;
|
|
drag.previewStep = step;
|
|
drag.previewRows = rows;
|
|
preview(step, rows);
|
|
}
|
|
|
|
function end() {
|
|
const drag = _drag;
|
|
if (!drag)
|
|
return;
|
|
_drag = null;
|
|
if (drag.previewStep === drag.step && drag.previewRows === drag.rows) {
|
|
canceled();
|
|
return;
|
|
}
|
|
committed(drag.previewStep, drag.previewRows, drag.previewStep !== drag.step, drag.previewRows !== drag.rows);
|
|
}
|
|
|
|
function cancel() {
|
|
if (!_drag)
|
|
return;
|
|
_drag = null;
|
|
canceled();
|
|
}
|
|
}
|