Files
alt-illogical-impulse/configs/quickshell/modules/onScreenKeyboard/OskKey.qml
T
Celes Renata ac6d3adeb9 Make flake self-contained - consolidate installer-replication
BREAKING CHANGE: Remove external dots-hyprland dependency

- Imported all essential configs from dots-hyprland/installer-replication
- Added complete configs/ directory with:
  - hypr/ - Hyprland configuration
  - quickshell/ - Quickshell widgets and config
  - applications/ - Application configurations
  - scripts/ - Utility scripts
  - matugen/ - Material You theming
- Updated flake.nix to use local ./configs instead of external repo
- Simplified update-flake script (removed external repo management)
- Updated README to reflect self-contained architecture
- All builds pass with local configurations

Benefits:
- No external repository dependencies
- Faster builds (no network dependencies)
- Version controlled configs in single repo
- Easier maintenance and development
- Complete installer replication in one place
2025-08-08 22:26:47 -07:00

122 lines
4.0 KiB
QML

import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
import QtQuick
import QtQuick.Layouts
RippleButton {
id: root
property var keyData
property string key: keyData.label
property string type: keyData.keytype
property var keycode: keyData.keycode
property string shape: keyData.shape
property bool isShift: Ydotool.shiftKeys.includes(keycode)
property bool isBackspace: (key.toLowerCase() == "backspace")
property bool isEnter: (key.toLowerCase() == "enter" || key.toLowerCase() == "return")
property real baseWidth: 45
property real baseHeight: 45
property var widthMultiplier: ({
"normal": 1,
"fn": 1,
"tab": 1.6,
"caps": 1.9,
"shift": 2.5,
"control": 1.3
})
property var heightMultiplier: ({
"normal": 1,
"fn": 0.7,
"tab": 1,
"caps": 1,
"shift": 1,
"control": 1
})
toggled: isShift ? Ydotool.shiftMode : false
enabled: shape != "empty"
colBackground: shape == "empty" ? ColorUtils.transparentize(Appearance.colors.colLayer1) : Appearance.colors.colLayer1
buttonRadius: Appearance.rounding.small
implicitWidth: baseWidth * widthMultiplier[shape] || baseWidth
implicitHeight: baseHeight * heightMultiplier[shape] || baseHeight
Layout.fillWidth: shape == "space" || shape == "expand"
Connections {
target: Ydotool
enabled: isShift
function onShiftModeChanged() {
if (Ydotool.shiftMode == 0) {
capsLockTimer.hasStarted = false;
}
}
}
Timer {
id: capsLockTimer
property bool hasStarted: false
property bool canCaps: false
interval: 300
function startWaiting() {
hasStarted = true;
canCaps = true;
start();
}
onTriggered: {
canCaps = false;
}
}
downAction: () => {
Ydotool.press(root.keycode);
if (isShift && Ydotool.shiftMode == 0) Ydotool.shiftMode = 1;
}
releaseAction: () => {
if (root.type == "normal") {
Ydotool.release(root.keycode);
if (Ydotool.shiftMode == 1) {
Ydotool.releaseShiftKeys()
}
} else if (isShift) {
if (Ydotool.shiftMode == 1) {
if (!capsLockTimer.hasStarted) {
capsLockTimer.startWaiting();
} else {
if (capsLockTimer.canCaps) {
Ydotool.shiftMode = 2; // Caps lock mode
} else {
Ydotool.releaseShiftKeys()
}
}
} else if (Ydotool.shiftMode == 2) {
Ydotool.releaseShiftKeys();
}
} else if (root.type == "modkey") {
root.toggled = !root.toggled;
if (!root.toggled) {
if (isShift) {
Ydotool.releaseShiftKeys();
} else {
Ydotool.release(root.keycode);
}
}
}
}
contentItem: StyledText {
id: keyText
anchors.fill: parent
font.family: (isBackspace || isEnter) ? Appearance.font.family.iconMaterial : Appearance.font.family.main
font.pixelSize: root.shape == "fn" ? Appearance.font.pixelSize.small :
(isBackspace || isEnter) ? Appearance.font.pixelSize.huge :
Appearance.font.pixelSize.large
horizontalAlignment: Text.AlignHCenter
color: root.toggled ? Appearance.m3colors.m3onPrimary : Appearance.colors.colOnLayer1
text: root.isBackspace ? "backspace" : root.isEnter ? "subdirectory_arrow_left" :
Ydotool.shiftMode == 2 ? (root.keyData.labelCaps || root.keyData.labelShift || root.keyData.label) :
Ydotool.shiftMode == 1 ? (root.keyData.labelShift || root.keyData.label) :
root.keyData.label
}
}