mirror of
https://github.com/zoriya/noctalia-shell.git
synced 2026-06-08 12:52:24 +00:00
TaskbarGrouped: add scroll support
TaskbarGroupoedSettings: add colorize, hide when unoccupied, name display settings
This commit is contained in:
@@ -33,14 +33,21 @@ Item {
|
|||||||
}
|
}
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
readonly property bool hideUnoccupied: (widgetSettings.hideUnoccupied !== undefined) ? widgetSettings.hideUnoccupied : false
|
readonly property string labelMode: (widgetSettings.labelMode !== undefined) ? widgetSettings.labelMode : widgetMetadata.labelMode
|
||||||
|
readonly property bool hideUnoccupied: (widgetSettings.hideUnoccupied !== undefined) ? widgetSettings.hideUnoccupied : widgetMetadata.hideUnoccupied
|
||||||
|
readonly property int characterCount: 2
|
||||||
readonly property bool showWorkspaceNumbers: (widgetSettings.showWorkspaceNumbers !== undefined) ? widgetSettings.showWorkspaceNumbers : true
|
readonly property bool showWorkspaceNumbers: (widgetSettings.showWorkspaceNumbers !== undefined) ? widgetSettings.showWorkspaceNumbers : true
|
||||||
readonly property bool showNumbersOnlyWhenOccupied: (widgetSettings.showNumbersOnlyWhenOccupied !== undefined) ? widgetSettings.showNumbersOnlyWhenOccupied : true
|
readonly property bool showNumbersOnlyWhenOccupied: (widgetSettings.showNumbersOnlyWhenOccupied !== undefined) ? widgetSettings.showNumbersOnlyWhenOccupied : true
|
||||||
|
readonly property bool colorizeIcons: (widgetSettings.colorizeIcons !== undefined) ? widgetSettings.colorizeIcons : widgetMetadata.colorizeIcons
|
||||||
property ListModel localWorkspaces: ListModel {}
|
property ListModel localWorkspaces: ListModel {}
|
||||||
property real masterProgress: 0.0
|
property real masterProgress: 0.0
|
||||||
property bool effectsActive: false
|
property bool effectsActive: false
|
||||||
property color effectColor: Color.mPrimary
|
property color effectColor: Color.mPrimary
|
||||||
|
|
||||||
|
// Wheel scroll handling
|
||||||
|
property int wheelAccumulatedDelta: 0
|
||||||
|
property bool wheelCooldown: false
|
||||||
|
|
||||||
function refreshWorkspaces() {
|
function refreshWorkspaces() {
|
||||||
localWorkspaces.clear()
|
localWorkspaces.clear()
|
||||||
if (!screen)
|
if (!screen)
|
||||||
@@ -80,11 +87,34 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getFocusedLocalIndex() {
|
||||||
|
for (var i = 0; i < localWorkspaces.count; i++) {
|
||||||
|
if (localWorkspaces.get(i).isFocused === true)
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
|
||||||
|
function switchByOffset(offset) {
|
||||||
|
if (localWorkspaces.count === 0)
|
||||||
|
return
|
||||||
|
var current = getFocusedLocalIndex()
|
||||||
|
if (current < 0)
|
||||||
|
current = 0
|
||||||
|
var next = (current + offset) % localWorkspaces.count
|
||||||
|
if (next < 0)
|
||||||
|
next = localWorkspaces.count - 1
|
||||||
|
const ws = localWorkspaces.get(next)
|
||||||
|
if (ws && ws.idx !== undefined)
|
||||||
|
CompositorService.switchToWorkspace(ws)
|
||||||
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
refreshWorkspaces()
|
refreshWorkspaces()
|
||||||
}
|
}
|
||||||
|
|
||||||
onScreenChanged: refreshWorkspaces()
|
onScreenChanged: refreshWorkspaces()
|
||||||
|
onHideUnoccupiedChanged: refreshWorkspaces()
|
||||||
|
|
||||||
implicitWidth: isVerticalBar ? taskbarGrid.implicitWidth + Style.marginM * 2 : Math.round(taskbarGrid.implicitWidth + Style.marginM * 2)
|
implicitWidth: isVerticalBar ? taskbarGrid.implicitWidth + Style.marginM * 2 : Math.round(taskbarGrid.implicitWidth + Style.marginM * 2)
|
||||||
implicitHeight: isVerticalBar ? Math.round(taskbarGrid.implicitHeight + Style.marginM * 2) : Style.barHeight
|
implicitHeight: isVerticalBar ? Math.round(taskbarGrid.implicitHeight + Style.marginM * 2) : Style.barHeight
|
||||||
@@ -128,6 +158,46 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Debounce timer for wheel interactions
|
||||||
|
Timer {
|
||||||
|
id: wheelDebounce
|
||||||
|
interval: 150
|
||||||
|
repeat: false
|
||||||
|
onTriggered: {
|
||||||
|
root.wheelCooldown = false
|
||||||
|
root.wheelAccumulatedDelta = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scroll to switch workspaces
|
||||||
|
WheelHandler {
|
||||||
|
id: wheelHandler
|
||||||
|
target: root
|
||||||
|
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
|
||||||
|
onWheel: function (event) {
|
||||||
|
if (root.wheelCooldown)
|
||||||
|
return
|
||||||
|
// Prefer vertical delta, fall back to horizontal if needed
|
||||||
|
var dy = event.angleDelta.y
|
||||||
|
var dx = event.angleDelta.x
|
||||||
|
var useDy = Math.abs(dy) >= Math.abs(dx)
|
||||||
|
var delta = useDy ? dy : dx
|
||||||
|
// One notch is typically 120
|
||||||
|
root.wheelAccumulatedDelta += delta
|
||||||
|
var step = 120
|
||||||
|
if (Math.abs(root.wheelAccumulatedDelta) >= step) {
|
||||||
|
var direction = root.wheelAccumulatedDelta > 0 ? -1 : 1
|
||||||
|
// For vertical layout, natural mapping: wheel up -> previous, down -> next (already handled by sign)
|
||||||
|
// For horizontal layout, same mapping using vertical wheel
|
||||||
|
root.switchByOffset(direction)
|
||||||
|
root.wheelCooldown = true
|
||||||
|
wheelDebounce.restart()
|
||||||
|
root.wheelAccumulatedDelta = 0
|
||||||
|
event.accepted = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Component {
|
Component {
|
||||||
id: workspaceRepeaterDelegate
|
id: workspaceRepeaterDelegate
|
||||||
|
|
||||||
@@ -192,7 +262,7 @@ Item {
|
|||||||
smooth: true
|
smooth: true
|
||||||
asynchronous: true
|
asynchronous: true
|
||||||
opacity: model.isFocused ? Style.opacityFull : 0.6
|
opacity: model.isFocused ? Style.opacityFull : 0.6
|
||||||
layer.enabled: widgetSettings.colorizeIcons === true
|
layer.enabled: root.colorizeIcons && !model.isFocused
|
||||||
|
|
||||||
Behavior on opacity {
|
Behavior on opacity {
|
||||||
NumberAnimation {
|
NumberAnimation {
|
||||||
@@ -252,7 +322,7 @@ Item {
|
|||||||
Item {
|
Item {
|
||||||
id: workspaceNumberContainer
|
id: workspaceNumberContainer
|
||||||
|
|
||||||
visible: root.showWorkspaceNumbers && (!root.showNumbersOnlyWhenOccupied || container.hasWindows)
|
visible: root.labelMode !== "none" && root.showWorkspaceNumbers && (!root.showNumbersOnlyWhenOccupied || container.hasWindows)
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
left: parent.left
|
left: parent.left
|
||||||
@@ -318,7 +388,13 @@ Item {
|
|||||||
|
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
|
|
||||||
text: workspaceModel.idx.toString()
|
text: {
|
||||||
|
if (root.labelMode === "name" && workspaceModel.name && workspaceModel.name.length > 0) {
|
||||||
|
return workspaceModel.name.substring(0, root.characterCount)
|
||||||
|
} else {
|
||||||
|
return workspaceModel.idx.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
family: Settings.data.ui.fontFixed
|
family: Settings.data.ui.fontFixed
|
||||||
font {
|
font {
|
||||||
|
|||||||
@@ -12,16 +12,56 @@ ColumnLayout {
|
|||||||
property var widgetData: null
|
property var widgetData: null
|
||||||
property var widgetMetadata: null
|
property var widgetMetadata: null
|
||||||
|
|
||||||
property bool valueShowWorkspaceNumbers: widgetData.showWorkspaceNumbers !== undefined ? widgetData.showWorkspaceNumbers : widgetMetadata.showWorkspaceNumbers
|
property string valueLabelMode: widgetData.labelMode !== undefined ? widgetData.labelMode : (widgetMetadata ? widgetMetadata.labelMode : "index")
|
||||||
property bool valueShowNumbersOnlyWhenOccupied: widgetData.showNumbersOnlyWhenOccupied !== undefined ? widgetData.showNumbersOnlyWhenOccupied : widgetMetadata.showNumbersOnlyWhenOccupied
|
property bool valueHideUnoccupied: widgetData.hideUnoccupied !== undefined ? widgetData.hideUnoccupied : (widgetMetadata ? widgetMetadata.hideUnoccupied : false)
|
||||||
|
property bool valueShowWorkspaceNumbers: widgetData.showWorkspaceNumbers !== undefined ? widgetData.showWorkspaceNumbers : (widgetMetadata ? widgetMetadata.showWorkspaceNumbers : true)
|
||||||
|
property bool valueShowNumbersOnlyWhenOccupied: widgetData.showNumbersOnlyWhenOccupied !== undefined ? widgetData.showNumbersOnlyWhenOccupied : (widgetMetadata ? widgetMetadata.showNumbersOnlyWhenOccupied : true)
|
||||||
|
property bool valueColorizeIcons: widgetData.colorizeIcons !== undefined ? widgetData.colorizeIcons : (widgetMetadata ? widgetMetadata.colorizeIcons : false)
|
||||||
|
|
||||||
function saveSettings() {
|
function saveSettings() {
|
||||||
var settings = Object.assign({}, widgetData || {})
|
var settings = Object.assign({}, widgetData || {})
|
||||||
|
settings.labelMode = valueLabelMode
|
||||||
|
settings.hideUnoccupied = valueHideUnoccupied
|
||||||
settings.showWorkspaceNumbers = valueShowWorkspaceNumbers
|
settings.showWorkspaceNumbers = valueShowWorkspaceNumbers
|
||||||
settings.showNumbersOnlyWhenOccupied = valueShowNumbersOnlyWhenOccupied
|
settings.showNumbersOnlyWhenOccupied = valueShowNumbersOnlyWhenOccupied
|
||||||
|
settings.colorizeIcons = valueColorizeIcons
|
||||||
return settings
|
return settings
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NComboBox {
|
||||||
|
id: labelModeCombo
|
||||||
|
label: I18n.tr("bar.widget-settings.workspace.label-mode.label")
|
||||||
|
description: I18n.tr("bar.widget-settings.workspace.label-mode.description")
|
||||||
|
model: [{
|
||||||
|
"key": "none",
|
||||||
|
"name": I18n.tr("options.workspace-labels.none")
|
||||||
|
}, {
|
||||||
|
"key": "index",
|
||||||
|
"name": I18n.tr("options.workspace-labels.index")
|
||||||
|
}, {
|
||||||
|
"key": "name",
|
||||||
|
"name": I18n.tr("options.workspace-labels.name")
|
||||||
|
}]
|
||||||
|
currentKey: widgetData.labelMode || widgetMetadata.labelMode
|
||||||
|
onSelected: key => valueLabelMode = key
|
||||||
|
minimumWidth: 200
|
||||||
|
}
|
||||||
|
|
||||||
|
NToggle {
|
||||||
|
label: I18n.tr("bar.widget-settings.workspace.hide-unoccupied.label")
|
||||||
|
description: I18n.tr("bar.widget-settings.workspace.hide-unoccupied.description")
|
||||||
|
checked: valueHideUnoccupied
|
||||||
|
onToggled: checked => valueHideUnoccupied = checked
|
||||||
|
}
|
||||||
|
|
||||||
|
NToggle {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
label: I18n.tr("bar.widget-settings.active-window.colorize-icons.label")
|
||||||
|
description: I18n.tr("bar.widget-settings.active-window.colorize-icons.description")
|
||||||
|
checked: root.valueColorizeIcons
|
||||||
|
onToggled: checked => root.valueColorizeIcons = checked
|
||||||
|
}
|
||||||
|
|
||||||
NToggle {
|
NToggle {
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
label: I18n.tr("bar.widget-settings.taskbar-grouped.show-workspace-numbers.label")
|
label: I18n.tr("bar.widget-settings.taskbar-grouped.show-workspace-numbers.label")
|
||||||
|
|||||||
@@ -260,6 +260,17 @@ SmartPanel {
|
|||||||
"icon": "settings-screen-recorder",
|
"icon": "settings-screen-recorder",
|
||||||
"source": screenRecorderTab
|
"source": screenRecorderTab
|
||||||
}, {
|
}, {
|
||||||
|
"id": SettingsPanel.Tab.SessionMenu,
|
||||||
|
"label": "settings.session-menu.title",
|
||||||
|
"icon": "settings-session-menu",
|
||||||
|
"source": sessionMenuTab
|
||||||
|
}, // {
|
||||||
|
// "id": SettingsPanel.Tab.SystemMonitor,
|
||||||
|
// "label": "settings.system-monitor.title",
|
||||||
|
// "icon": "settings-system-monitor",
|
||||||
|
// "source": systemMonitorTab
|
||||||
|
// },
|
||||||
|
{
|
||||||
"id": SettingsPanel.Tab.Hooks,
|
"id": SettingsPanel.Tab.Hooks,
|
||||||
"label": "settings.hooks.title",
|
"label": "settings.hooks.title",
|
||||||
"icon": "settings-hooks",
|
"icon": "settings-hooks",
|
||||||
|
|||||||
@@ -162,7 +162,11 @@ Singleton {
|
|||||||
"TaskbarGrouped": {
|
"TaskbarGrouped": {
|
||||||
"allowUserSettings": true,
|
"allowUserSettings": true,
|
||||||
"showWorkspaceNumbers": true,
|
"showWorkspaceNumbers": true,
|
||||||
"showNumbersOnlyWhenOccupied": true
|
"showNumbersOnlyWhenOccupied": true,
|
||||||
|
"labelMode": "index",
|
||||||
|
"hideUnoccupied": false,
|
||||||
|
"characterCount": 2,
|
||||||
|
"colorizeIcons": false
|
||||||
},
|
},
|
||||||
"Tray": {
|
"Tray": {
|
||||||
"allowUserSettings": true,
|
"allowUserSettings": true,
|
||||||
|
|||||||
Reference in New Issue
Block a user