mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2026-04-03 20:32:07 -04:00
dankbar/controlcenter: add VPN, mic, brightness, battery, and printer
options for widget
This commit is contained in:
@@ -1144,6 +1144,8 @@ Item {
|
||||
return controlCenterLoader.item;
|
||||
}
|
||||
parentScreen: barWindow.screen
|
||||
screenName: barWindow.screen?.name || ""
|
||||
screenModel: barWindow.screen?.model || ""
|
||||
widgetData: parent.widgetData
|
||||
|
||||
Component.onCompleted: {
|
||||
|
||||
@@ -10,9 +10,138 @@ BasePill {
|
||||
property bool isActive: false
|
||||
property var popoutTarget: null
|
||||
property var widgetData: null
|
||||
property string screenName: ""
|
||||
property string screenModel: ""
|
||||
property bool showNetworkIcon: SettingsData.controlCenterShowNetworkIcon
|
||||
property bool showBluetoothIcon: SettingsData.controlCenterShowBluetoothIcon
|
||||
property bool showAudioIcon: SettingsData.controlCenterShowAudioIcon
|
||||
property bool showVpnIcon: SettingsData.controlCenterShowVpnIcon
|
||||
property bool showBrightnessIcon: SettingsData.controlCenterShowBrightnessIcon
|
||||
property bool showMicIcon: SettingsData.controlCenterShowMicIcon
|
||||
property bool showBatteryIcon: SettingsData.controlCenterShowBatteryIcon
|
||||
property bool showPrinterIcon: SettingsData.controlCenterShowPrinterIcon
|
||||
|
||||
function getNetworkIconName() {
|
||||
if (NetworkService.wifiToggling)
|
||||
return "sync";
|
||||
switch (NetworkService.networkStatus) {
|
||||
case "ethernet":
|
||||
return "lan";
|
||||
case "vpn":
|
||||
return NetworkService.ethernetConnected ? "lan" : NetworkService.wifiSignalIcon;
|
||||
default:
|
||||
return NetworkService.wifiSignalIcon;
|
||||
}
|
||||
}
|
||||
|
||||
function getNetworkIconColor() {
|
||||
if (NetworkService.wifiToggling)
|
||||
return Theme.primary;
|
||||
return NetworkService.networkStatus !== "disconnected" ? Theme.primary : Theme.outlineButton;
|
||||
}
|
||||
|
||||
function getVolumeIconName() {
|
||||
if (!AudioService.sink?.audio)
|
||||
return "volume_up";
|
||||
if (AudioService.sink.audio.muted || AudioService.sink.audio.volume === 0)
|
||||
return "volume_off";
|
||||
if (AudioService.sink.audio.volume * 100 < 33)
|
||||
return "volume_down";
|
||||
return "volume_up";
|
||||
}
|
||||
|
||||
function getMicIconName() {
|
||||
if (!AudioService.source?.audio)
|
||||
return "mic";
|
||||
if (AudioService.source.audio.muted || AudioService.source.audio.volume === 0)
|
||||
return "mic_off";
|
||||
return "mic";
|
||||
}
|
||||
|
||||
function getMicIconColor() {
|
||||
if (!AudioService.source?.audio)
|
||||
return Theme.outlineButton;
|
||||
if (AudioService.source.audio.muted || AudioService.source.audio.volume === 0)
|
||||
return Theme.outlineButton;
|
||||
return Theme.widgetIconColor;
|
||||
}
|
||||
|
||||
function getBrightnessIconName() {
|
||||
const deviceName = getPinnedBrightnessDevice();
|
||||
if (!deviceName)
|
||||
return "brightness_medium";
|
||||
const level = DisplayService.getDeviceBrightness(deviceName);
|
||||
if (level <= 33)
|
||||
return "brightness_low";
|
||||
if (level <= 66)
|
||||
return "brightness_medium";
|
||||
return "brightness_high";
|
||||
}
|
||||
|
||||
function getScreenPinKey() {
|
||||
if (SettingsData.displayNameMode === "model" && root.screenModel && root.screenModel.length > 0) {
|
||||
return root.screenModel;
|
||||
}
|
||||
return root.screenName || "";
|
||||
}
|
||||
|
||||
function getPinnedBrightnessDevice() {
|
||||
const pinKey = getScreenPinKey();
|
||||
if (!pinKey)
|
||||
return "";
|
||||
const pins = SettingsData.brightnessDevicePins || {};
|
||||
return pins[pinKey] || "";
|
||||
}
|
||||
|
||||
function hasPinnedBrightnessDevice() {
|
||||
return getPinnedBrightnessDevice().length > 0;
|
||||
}
|
||||
|
||||
function handleVolumeWheel(delta) {
|
||||
if (!AudioService.sink?.audio)
|
||||
return;
|
||||
const currentVolume = AudioService.sink.audio.volume * 100;
|
||||
const newVolume = delta > 0 ? Math.min(100, currentVolume + 5) : Math.max(0, currentVolume - 5);
|
||||
AudioService.sink.audio.muted = false;
|
||||
AudioService.sink.audio.volume = newVolume / 100;
|
||||
AudioService.playVolumeChangeSoundIfEnabled();
|
||||
}
|
||||
|
||||
function handleMicWheel(delta) {
|
||||
if (!AudioService.source?.audio)
|
||||
return;
|
||||
const currentVolume = AudioService.source.audio.volume * 100;
|
||||
const newVolume = delta > 0 ? Math.min(100, currentVolume + 5) : Math.max(0, currentVolume - 5);
|
||||
AudioService.source.audio.muted = false;
|
||||
AudioService.source.audio.volume = newVolume / 100;
|
||||
}
|
||||
|
||||
function handleBrightnessWheel(delta) {
|
||||
const deviceName = getPinnedBrightnessDevice();
|
||||
if (!deviceName)
|
||||
return;
|
||||
const currentBrightness = DisplayService.getDeviceBrightness(deviceName);
|
||||
const newBrightness = delta > 0 ? Math.min(100, currentBrightness + 5) : Math.max(1, currentBrightness - 5);
|
||||
DisplayService.setBrightness(newBrightness, deviceName, false);
|
||||
}
|
||||
|
||||
function getBatteryIconColor() {
|
||||
if (!BatteryService.batteryAvailable)
|
||||
return Theme.widgetIconColor;
|
||||
if (BatteryService.isLowBattery && !BatteryService.isCharging)
|
||||
return Theme.error;
|
||||
if (BatteryService.isCharging || BatteryService.isPluggedIn)
|
||||
return Theme.primary;
|
||||
return Theme.widgetIconColor;
|
||||
}
|
||||
|
||||
function hasPrintJobs() {
|
||||
return CupsService.getTotalJobsNum() > 0;
|
||||
}
|
||||
|
||||
function hasNoVisibleIcons() {
|
||||
return !root.showNetworkIcon && !root.showBluetoothIcon && !root.showAudioIcon && !root.showVpnIcon && !root.showBrightnessIcon && !root.showMicIcon && !root.showBatteryIcon && !root.showPrinterIcon;
|
||||
}
|
||||
|
||||
content: Component {
|
||||
Item {
|
||||
@@ -26,34 +155,21 @@ BasePill {
|
||||
spacing: Theme.spacingXS
|
||||
|
||||
DankIcon {
|
||||
name: {
|
||||
if (NetworkService.wifiToggling) {
|
||||
return "sync"
|
||||
}
|
||||
|
||||
const status = NetworkService.networkStatus
|
||||
if (status === "ethernet") {
|
||||
return "lan"
|
||||
}
|
||||
|
||||
if (status === "vpn") {
|
||||
return NetworkService.ethernetConnected ? "lan" : NetworkService.wifiSignalIcon
|
||||
}
|
||||
|
||||
return NetworkService.wifiSignalIcon
|
||||
}
|
||||
name: root.getNetworkIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: {
|
||||
if (NetworkService.wifiToggling) {
|
||||
return Theme.primary
|
||||
}
|
||||
|
||||
return NetworkService.networkStatus !== "disconnected" ? Theme.primary : Theme.outlineButton
|
||||
}
|
||||
color: root.getNetworkIconColor()
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: root.showNetworkIcon && NetworkService.networkAvailable
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
name: "vpn_lock"
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: NetworkService.vpnConnected ? Theme.primary : Theme.outlineButton
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: root.showVpnIcon && NetworkService.vpnAvailable && NetworkService.vpnConnected
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
name: "bluetooth"
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
@@ -71,19 +187,7 @@ BasePill {
|
||||
|
||||
DankIcon {
|
||||
id: audioIconV
|
||||
|
||||
name: {
|
||||
if (AudioService.sink && AudioService.sink.audio) {
|
||||
if (AudioService.sink.audio.muted || AudioService.sink.audio.volume === 0) {
|
||||
return "volume_off"
|
||||
} else if (AudioService.sink.audio.volume * 100 < 33) {
|
||||
return "volume_down"
|
||||
} else {
|
||||
return "volume_up"
|
||||
}
|
||||
}
|
||||
return "volume_up"
|
||||
}
|
||||
name: root.getVolumeIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: Theme.widgetIconColor
|
||||
anchors.centerIn: parent
|
||||
@@ -92,31 +196,85 @@ BasePill {
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
onWheel: function(wheelEvent) {
|
||||
let delta = wheelEvent.angleDelta.y
|
||||
let currentVolume = (AudioService.sink && AudioService.sink.audio && AudioService.sink.audio.volume * 100) || 0
|
||||
let newVolume
|
||||
if (delta > 0) {
|
||||
newVolume = Math.min(100, currentVolume + 5)
|
||||
} else {
|
||||
newVolume = Math.max(0, currentVolume - 5)
|
||||
}
|
||||
if (AudioService.sink && AudioService.sink.audio) {
|
||||
AudioService.sink.audio.muted = false
|
||||
AudioService.sink.audio.volume = newVolume / 100
|
||||
AudioService.playVolumeChangeSoundIfEnabled()
|
||||
}
|
||||
wheelEvent.accepted = true
|
||||
onWheel: function (wheelEvent) {
|
||||
root.handleVolumeWheel(wheelEvent.angleDelta.y);
|
||||
wheelEvent.accepted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: micIconV.implicitWidth + 4
|
||||
height: micIconV.implicitHeight + 4
|
||||
color: "transparent"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: root.showMicIcon
|
||||
|
||||
DankIcon {
|
||||
id: micIconV
|
||||
name: root.getMicIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: root.getMicIconColor()
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
onWheel: function (wheelEvent) {
|
||||
root.handleMicWheel(wheelEvent.angleDelta.y);
|
||||
wheelEvent.accepted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: brightnessIconV.implicitWidth + 4
|
||||
height: brightnessIconV.implicitHeight + 4
|
||||
color: "transparent"
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: root.showBrightnessIcon && DisplayService.brightnessAvailable && root.hasPinnedBrightnessDevice()
|
||||
|
||||
DankIcon {
|
||||
id: brightnessIconV
|
||||
name: root.getBrightnessIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: Theme.widgetIconColor
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
onWheel: function (wheelEvent) {
|
||||
root.handleBrightnessWheel(wheelEvent.angleDelta.y);
|
||||
wheelEvent.accepted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
name: Theme.getBatteryIcon(BatteryService.batteryLevel, BatteryService.isCharging, BatteryService.batteryAvailable)
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: root.getBatteryIconColor()
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: root.showBatteryIcon && BatteryService.batteryAvailable
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
name: "print"
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: Theme.primary
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: root.showPrinterIcon && CupsService.cupsAvailable && root.hasPrintJobs()
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
name: "settings"
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: root.isActive ? Theme.primary : Theme.widgetIconColor
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
visible: !root.showNetworkIcon && !root.showBluetoothIcon && !root.showAudioIcon
|
||||
visible: root.hasNoVisibleIcons()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,38 +286,24 @@ BasePill {
|
||||
|
||||
DankIcon {
|
||||
id: networkIcon
|
||||
|
||||
name: {
|
||||
if (NetworkService.wifiToggling) {
|
||||
return "sync"
|
||||
}
|
||||
|
||||
const status = NetworkService.networkStatus
|
||||
if (status === "ethernet") {
|
||||
return "lan"
|
||||
}
|
||||
|
||||
if (status === "vpn") {
|
||||
return NetworkService.ethernetConnected ? "lan" : NetworkService.wifiSignalIcon
|
||||
}
|
||||
|
||||
return NetworkService.wifiSignalIcon
|
||||
}
|
||||
name: root.getNetworkIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: {
|
||||
if (NetworkService.wifiToggling) {
|
||||
return Theme.primary
|
||||
}
|
||||
|
||||
return NetworkService.networkStatus !== "disconnected" ? Theme.primary : Theme.outlineButton
|
||||
}
|
||||
color: root.getNetworkIconColor()
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
visible: root.showNetworkIcon && NetworkService.networkAvailable
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
id: bluetoothIcon
|
||||
id: vpnIcon
|
||||
name: "vpn_lock"
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: NetworkService.vpnConnected ? Theme.primary : Theme.outlineButton
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
visible: root.showVpnIcon && NetworkService.vpnAvailable && NetworkService.vpnConnected
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
id: bluetoothIcon
|
||||
name: "bluetooth"
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: BluetoothService.connected ? Theme.primary : Theme.outlineButton
|
||||
@@ -176,19 +320,7 @@ BasePill {
|
||||
|
||||
DankIcon {
|
||||
id: audioIcon
|
||||
|
||||
name: {
|
||||
if (AudioService.sink && AudioService.sink.audio) {
|
||||
if (AudioService.sink.audio.muted || AudioService.sink.audio.volume === 0) {
|
||||
return "volume_off";
|
||||
} else if (AudioService.sink.audio.volume * 100 < 33) {
|
||||
return "volume_down";
|
||||
} else {
|
||||
return "volume_up";
|
||||
}
|
||||
}
|
||||
return "volume_up";
|
||||
}
|
||||
name: root.getVolumeIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: Theme.widgetIconColor
|
||||
anchors.centerIn: parent
|
||||
@@ -196,34 +328,83 @@ BasePill {
|
||||
|
||||
MouseArea {
|
||||
id: audioWheelArea
|
||||
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
onWheel: function(wheelEvent) {
|
||||
let delta = wheelEvent.angleDelta.y;
|
||||
let currentVolume = (AudioService.sink && AudioService.sink.audio && AudioService.sink.audio.volume * 100) || 0;
|
||||
let newVolume;
|
||||
if (delta > 0) {
|
||||
newVolume = Math.min(100, currentVolume + 5);
|
||||
} else {
|
||||
newVolume = Math.max(0, currentVolume - 5);
|
||||
}
|
||||
if (AudioService.sink && AudioService.sink.audio) {
|
||||
AudioService.sink.audio.muted = false;
|
||||
AudioService.sink.audio.volume = newVolume / 100;
|
||||
AudioService.playVolumeChangeSoundIfEnabled();
|
||||
}
|
||||
onWheel: function (wheelEvent) {
|
||||
root.handleVolumeWheel(wheelEvent.angleDelta.y);
|
||||
wheelEvent.accepted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: micIcon.implicitWidth + 4
|
||||
height: micIcon.implicitHeight + 4
|
||||
color: "transparent"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
visible: root.showMicIcon
|
||||
|
||||
DankIcon {
|
||||
id: micIcon
|
||||
name: root.getMicIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: root.getMicIconColor()
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: micWheelArea
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
onWheel: function (wheelEvent) {
|
||||
root.handleMicWheel(wheelEvent.angleDelta.y);
|
||||
wheelEvent.accepted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Rectangle {
|
||||
width: brightnessIcon.implicitWidth + 4
|
||||
height: brightnessIcon.implicitHeight + 4
|
||||
color: "transparent"
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
visible: root.showBrightnessIcon && DisplayService.brightnessAvailable && root.hasPinnedBrightnessDevice()
|
||||
|
||||
DankIcon {
|
||||
id: brightnessIcon
|
||||
name: root.getBrightnessIconName()
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: Theme.widgetIconColor
|
||||
anchors.centerIn: parent
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: brightnessWheelArea
|
||||
anchors.fill: parent
|
||||
acceptedButtons: Qt.NoButton
|
||||
onWheel: function (wheelEvent) {
|
||||
root.handleBrightnessWheel(wheelEvent.angleDelta.y);
|
||||
wheelEvent.accepted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
name: "mic"
|
||||
id: batteryIcon
|
||||
name: Theme.getBatteryIcon(BatteryService.batteryLevel, BatteryService.isCharging, BatteryService.batteryAvailable)
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: root.getBatteryIconColor()
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
visible: root.showBatteryIcon && BatteryService.batteryAvailable
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
id: printerIcon
|
||||
name: "print"
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: Theme.primary
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
visible: false
|
||||
visible: root.showPrinterIcon && CupsService.cupsAvailable && root.hasPrintJobs()
|
||||
}
|
||||
|
||||
DankIcon {
|
||||
@@ -231,9 +412,15 @@ BasePill {
|
||||
size: Theme.barIconSize(root.barThickness)
|
||||
color: root.isActive ? Theme.primary : Theme.widgetIconColor
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
visible: !root.showNetworkIcon && !root.showBluetoothIcon && !root.showAudioIcon
|
||||
visible: root.hasNoVisibleIcons()
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
anchors.fill: parent
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
acceptedButtons: Qt.NoButton
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user