Merge remote changes 703697e1

This commit is contained in:
cupcat121
2025-09-08 18:01:59 +08:00
21 changed files with 448 additions and 704 deletions
+5 -2
View File
@@ -34,6 +34,9 @@ general {
snap { snap {
enabled = true enabled = true
window_gap = 4
monitor_gap = 5
respect_gaps = true
} }
} }
@@ -46,7 +49,7 @@ dwindle {
decoration { decoration {
rounding = 18 rounding = 18
blur { blur {
enabled = true enabled = true
xray = true xray = true
@@ -55,7 +58,7 @@ decoration {
size = 14 size = 14
passes = 3 passes = 3
brightness = 1 brightness = 1
noise = 0.01 noise = 0.04
contrast = 1 contrast = 1
popups = true popups = true
popups_ignorealpha = 0.6 popups_ignorealpha = 0.6
@@ -29,6 +29,12 @@ MouseArea {
} }
event.accepted = true; event.accepted = true;
} }
onEntered: {
tooltip.content = item.tooltipTitle.length > 0 ? item.tooltipTitle
: (item.title.length > 0 ? item.title : item.id);
if (item.tooltipDescription.length > 0) tooltip.content += " • " + item.tooltipDescription;
if (Config.options.bar.tray.showItemId) tooltip.content += "\n[" + item.id + "]";
}
QsMenuAnchor { QsMenuAnchor {
id: menu id: menu
@@ -71,11 +77,7 @@ MouseArea {
} }
StyledToolTip { StyledToolTip {
content: { id: tooltip
let c = root.item.id
if (root.item.tooltipDescription.length > 0) c += " • " + root.item.tooltipDescription
return c;
}
extraVisibleCondition: root.containsMouse extraVisibleCondition: root.containsMouse
alternativeVisibleCondition: extraVisibleCondition alternativeVisibleCondition: extraVisibleCondition
} }
@@ -14,6 +14,7 @@ import Qt5Compat.GraphicalEffects
Item { Item {
id: root id: root
property bool vertical: false
property bool borderless: Config.options.bar.borderless property bool borderless: Config.options.bar.borderless
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.QsWindow.window?.screen) readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.QsWindow.window?.screen)
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
@@ -22,6 +23,7 @@ Item {
property list<bool> workspaceOccupied: [] property list<bool> workspaceOccupied: []
property int widgetPadding: 4 property int widgetPadding: 4
property int workspaceButtonWidth: 26 property int workspaceButtonWidth: 26
property real activeWorkspaceMargin: 2
property real workspaceIconSize: workspaceButtonWidth * 0.69 property real workspaceIconSize: workspaceButtonWidth * 0.69
property real workspaceIconSizeShrinked: workspaceButtonWidth * 0.55 property real workspaceIconSizeShrinked: workspaceButtonWidth * 0.55
property real workspaceIconOpacityShrinked: 1 property real workspaceIconOpacityShrinked: 1
@@ -77,8 +79,8 @@ Item {
updateWorkspaceOccupied(); updateWorkspaceOccupied();
} }
implicitWidth: rowLayout.implicitWidth + rowLayout.spacing * 2 implicitWidth: root.vertical ? Appearance.sizes.verticalBarWidth : backgroundLayout.implicitWidth
implicitHeight: Appearance.sizes.barHeight implicitHeight: root.vertical ? backgroundLayout.implicitHeight : Appearance.sizes.barHeight
// Scroll to switch workspaces // Scroll to switch workspaces
WheelHandler { WheelHandler {
@@ -102,31 +104,36 @@ Item {
} }
// Workspaces - background // Workspaces - background
RowLayout { GridLayout {
id: rowLayout id: backgroundLayout
z: 1 z: 1
spacing: 0
anchors.fill: parent anchors.fill: parent
implicitHeight: Appearance.sizes.barHeight implicitHeight: root.vertical ? root.workspaceButtonWidth : Appearance.sizes.barHeight
implicitWidth: root.vertical ? Appearance.sizes.verticalBarWidth : root.workspaceButtonWidth
rowSpacing: 0
columnSpacing: 0
columns: root.vertical ? 1 : -1
Repeater { Repeater {
model: Config.options.bar.workspaces.shown model: Config.options.bar.workspaces.shown
Rectangle { Rectangle {
z: 1 z: 1
Layout.alignment: root.vertical ? Qt.AlignHCenter : Qt.AlignVCenter
implicitWidth: workspaceButtonWidth implicitWidth: workspaceButtonWidth
implicitHeight: workspaceButtonWidth implicitHeight: workspaceButtonWidth
radius: (width / 2) radius: (width / 2)
property var previousOccupied: (workspaceOccupied[index-1] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index)) property var previousOccupied: (workspaceOccupied[index-1] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index))
property var rightOccupied: (workspaceOccupied[index+1] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index+2)) property var rightOccupied: (workspaceOccupied[index+1] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index+2))
property var radiusLeft: previousOccupied ? 0 : (width / 2) property var radiusPrev: previousOccupied ? 0 : (width / 2)
property var radiusRight: rightOccupied ? 0 : (width / 2) property var radiusNext: rightOccupied ? 0 : (width / 2)
topLeftRadius: radiusLeft topLeftRadius: radiusPrev
bottomLeftRadius: radiusLeft bottomLeftRadius: root.vertical ? radiusNext : radiusPrev
topRightRadius: radiusRight topRightRadius: root.vertical ? radiusPrev : radiusNext
bottomRightRadius: radiusRight bottomRightRadius: radiusNext
color: ColorUtils.transparentize(Appearance.m3colors.m3secondaryContainer, 0.4) color: ColorUtils.transparentize(Appearance.m3colors.m3secondaryContainer, 0.4)
opacity: (workspaceOccupied[index] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index+1)) ? 1 : 0 opacity: (workspaceOccupied[index] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index+1)) ? 1 : 0
@@ -134,11 +141,11 @@ Item {
Behavior on opacity { Behavior on opacity {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this) animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
} }
Behavior on radiusLeft { Behavior on radiusPrev {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this) animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
} }
Behavior on radiusRight { Behavior on radiusNext {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this) animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
} }
@@ -152,27 +159,34 @@ Item {
Rectangle { Rectangle {
z: 2 z: 2
// Make active ws indicator, which has a brighter color, smaller to look like it is of the same size as ws occupied highlight // Make active ws indicator, which has a brighter color, smaller to look like it is of the same size as ws occupied highlight
property real activeWorkspaceMargin: 2
implicitHeight: workspaceButtonWidth - activeWorkspaceMargin * 2
radius: Appearance.rounding.full radius: Appearance.rounding.full
color: Appearance.colors.colPrimary color: Appearance.colors.colPrimary
anchors.verticalCenter: parent.verticalCenter
anchors {
verticalCenter: vertical ? undefined : parent.verticalCenter
horizontalCenter: vertical ? parent.horizontalCenter : undefined
}
// idx1 is the "leading" indicator position, idx2 is the "following" one
// The former animates faster than the latter, see the NumberAnimations below
property real idx1: workspaceIndexInGroup property real idx1: workspaceIndexInGroup
property real idx2: workspaceIndexInGroup property real idx2: workspaceIndexInGroup
x: Math.min(idx1, idx2) * workspaceButtonWidth + activeWorkspaceMargin property real indicatorPosition: Math.min(idx1, idx2) * workspaceButtonWidth + root.activeWorkspaceMargin
implicitWidth: Math.abs(idx1 - idx2) * workspaceButtonWidth + workspaceButtonWidth - activeWorkspaceMargin * 2 property real indicatorLength: Math.abs(idx1 - idx2) * workspaceButtonWidth + workspaceButtonWidth - root.activeWorkspaceMargin * 2
property real indicatorThickness: workspaceButtonWidth - root.activeWorkspaceMargin * 2
Behavior on activeWorkspaceMargin { x: root.vertical ? null : indicatorPosition
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) implicitWidth: root.vertical ? indicatorThickness : indicatorLength
} y: root.vertical ? indicatorPosition : null
Behavior on idx1 { // Leading anim implicitHeight: root.vertical ? indicatorLength : indicatorThickness
Behavior on idx1 {
NumberAnimation { NumberAnimation {
duration: 100 duration: 100
easing.type: Easing.OutSine easing.type: Easing.OutSine
} }
} }
Behavior on idx2 { // Following anim Behavior on idx2 {
NumberAnimation { NumberAnimation {
duration: 300 duration: 300
easing.type: Easing.OutSine easing.type: Easing.OutSine
@@ -181,13 +195,17 @@ Item {
} }
// Workspaces - numbers // Workspaces - numbers
RowLayout { GridLayout {
id: rowLayoutNumbers id: rowLayoutNumbers
z: 3 z: 3
spacing: 0 columns: vertical ? 1 : -1
columnSpacing: 0
rowSpacing: 0
anchors.fill: parent anchors.fill: parent
implicitHeight: Appearance.sizes.barHeight implicitHeight: vertical ? Appearance.sizes.barWidth : Appearance.sizes.barHeight
implicitWidth: vertical ? Appearance.sizes.verticalBarWidth : Appearance.sizes.verticalBarWidth
Repeater { Repeater {
model: Config.options.bar.workspaces.shown model: Config.options.bar.workspaces.shown
@@ -195,10 +213,12 @@ Item {
Button { Button {
id: button id: button
property int workspaceValue: workspaceGroup * Config.options.bar.workspaces.shown + index + 1 property int workspaceValue: workspaceGroup * Config.options.bar.workspaces.shown + index + 1
Layout.fillHeight: true Layout.fillHeight: !root.vertical
Layout.fillWidth: root.vertical
onPressed: Hyprland.dispatch(`workspace ${workspaceValue}`) onPressed: Hyprland.dispatch(`workspace ${workspaceValue}`)
width: workspaceButtonWidth width: vertical ? undefined : workspaceButtonWidth
height: vertical ? workspaceButtonWidth : undefined
background: Item { background: Item {
id: workspaceButtonBackground id: workspaceButtonBackground
implicitWidth: workspaceButtonWidth implicitWidth: workspaceButtonWidth
@@ -91,7 +91,11 @@ Singleton {
property bool enableAppsAndShell: true property bool enableAppsAndShell: true
property bool enableQtApps: true property bool enableQtApps: true
property bool enableTerminal: true property bool enableTerminal: true
property bool forceTerminalDarkMode: false property JsonObject terminalGenerationProps: JsonObject {
property real harmony: 0.8
property real harmonizeThreshold: 100
property real termFgBoost: 0.35
}
} }
property JsonObject palette: JsonObject { property JsonObject palette: JsonObject {
property string type: "auto" // Allowed: auto, scheme-content, scheme-expressive, scheme-fidelity, scheme-fruit-salad, scheme-monochrome, scheme-neutral, scheme-rainbow, scheme-tonal-spot property string type: "auto" // Allowed: auto, scheme-content, scheme-expressive, scheme-fidelity, scheme-fruit-salad, scheme-monochrome, scheme-neutral, scheme-rainbow, scheme-tonal-spot
@@ -168,6 +172,7 @@ Singleton {
} }
property JsonObject tray: JsonObject { property JsonObject tray: JsonObject {
property bool monochromeIcons: true property bool monochromeIcons: true
property bool showItemId: false
property bool invertPinnedItems: false // Makes the below a whitelist for the tray and blacklist for the pinned area property bool invertPinnedItems: false // Makes the below a whitelist for the tray and blacklist for the pinned area
property list<string> pinnedItems: [ "Fcitx" ] property list<string> pinnedItems: [ "Fcitx" ]
} }
@@ -46,7 +46,6 @@ Singleton {
Quickshell.execDetached(["mkdir", "-p", `${favicons}`]) Quickshell.execDetached(["mkdir", "-p", `${favicons}`])
Quickshell.execDetached(["bash", "-c", `rm -rf '${coverArt}'; mkdir -p '${coverArt}'`]) Quickshell.execDetached(["bash", "-c", `rm -rf '${coverArt}'; mkdir -p '${coverArt}'`])
Quickshell.execDetached(["bash", "-c", `rm -rf '${booruPreviews}'; mkdir -p '${booruPreviews}'`]) Quickshell.execDetached(["bash", "-c", `rm -rf '${booruPreviews}'; mkdir -p '${booruPreviews}'`])
Quickshell.execDetached(["bash", "-c", `mkdir -p '${booruDownloads}' && mkdir -p '${booruDownloadsNsfw}'`])
Quickshell.execDetached(["bash", "-c", `rm -rf '${latexOutput}'; mkdir -p '${latexOutput}'`]) Quickshell.execDetached(["bash", "-c", `rm -rf '${latexOutput}'; mkdir -p '${latexOutput}'`])
Quickshell.execDetached(["bash", "-c", `rm -rf '${cliphistDecode}'; mkdir -p '${cliphistDecode}'`]) Quickshell.execDetached(["bash", "-c", `rm -rf '${cliphistDecode}'; mkdir -p '${cliphistDecode}'`])
Quickshell.execDetached(["mkdir", "-p", `${aiChats}`]) Quickshell.execDetached(["mkdir", "-p", `${aiChats}`])
@@ -16,6 +16,7 @@ RowLayout {
Layout.rightMargin: 8 Layout.rightMargin: 8
RowLayout { RowLayout {
spacing: 10
OptionalMaterialSymbol { OptionalMaterialSymbol {
icon: root.icon icon: root.icon
} }
@@ -15,6 +15,10 @@ Scope {
property bool unlockInProgress: false property bool unlockInProgress: false
property bool showFailure: false property bool showFailure: false
function resetClearTimer() {
passwordClearTimer.restart();
}
Timer { Timer {
id: passwordClearTimer id: passwordClearTimer
interval: 10000 interval: 10000
@@ -14,17 +14,26 @@ MouseArea {
property bool active: false property bool active: false
property bool showInputField: active || context.currentText.length > 0 property bool showInputField: active || context.currentText.length > 0
// Force focus on entry
function forceFieldFocus() { function forceFieldFocus() {
passwordBox.forceActiveFocus(); passwordBox.forceActiveFocus();
} }
Connections { Connections {
target: context target: context
function onShouldReFocus() { function onShouldReFocus() {
forceFieldFocus(); forceFieldFocus();
} }
} }
hoverEnabled: true
acceptedButtons: Qt.LeftButton
onPressed: mouse => {
forceFieldFocus();
}
onPositionChanged: mouse => {
forceFieldFocus();
}
// Toolbar appearing animation
property real toolbarScale: 0.9 property real toolbarScale: 0.9
property real toolbarOpacity: 0 property real toolbarOpacity: 0
Behavior on toolbarScale { Behavior on toolbarScale {
@@ -38,30 +47,22 @@ MouseArea {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this) animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
} }
// Init
Component.onCompleted: { Component.onCompleted: {
forceFieldFocus(); forceFieldFocus();
toolbarScale = 1; toolbarScale = 1;
toolbarOpacity = 1; toolbarOpacity = 1;
} }
Keys.onPressed: event => { // Esc to clear // Key presses
if (event.key === Qt.Key_Escape) { Keys.onPressed: event => {
root.context.resetClearTimer();
if (event.key === Qt.Key_Escape) { // Esc to clear
root.context.currentText = ""; root.context.currentText = "";
} }
forceFieldFocus(); forceFieldFocus();
} }
hoverEnabled: true
acceptedButtons: Qt.LeftButton
onPressed: mouse => {
forceFieldFocus();
}
onPositionChanged: mouse => {
forceFieldFocus();
}
anchors.fill: parent
// RippleButton { // RippleButton {
// anchors { // anchors {
// top: parent.top // top: parent.top
@@ -77,7 +78,7 @@ MouseArea {
// } // }
// } // }
// Controls // Main toolbar: password box
Toolbar { Toolbar {
id: mainIsland id: mainIsland
anchors { anchors {
@@ -114,6 +115,10 @@ MouseArea {
passwordBox.text = root.context.currentText; passwordBox.text = root.context.currentText;
} }
} }
Keys.onPressed: event => {
root.context.resetClearTimer();
}
} }
ToolbarButton { ToolbarButton {
@@ -136,6 +141,7 @@ MouseArea {
} }
} }
// Left toolbar
Toolbar { Toolbar {
id: leftIsland id: leftIsland
anchors { anchors {
@@ -207,6 +213,7 @@ MouseArea {
} }
} }
// Right toolbar
Toolbar { Toolbar {
id: rightIsland id: rightIsland
anchors { anchors {
@@ -11,48 +11,70 @@ ContentPage {
icon: "colors" icon: "colors"
title: Translation.tr("Color generation") title: Translation.tr("Color generation")
ConfigRow { ConfigSwitch {
uniform: true buttonIcon: "hardware"
ConfigSwitch { text: Translation.tr("Shell & utilities")
text: Translation.tr("Shell & utilities") checked: Config.options.appearance.wallpaperTheming.enableAppsAndShell
checked: Config.options.appearance.wallpaperTheming.enableAppsAndShell onCheckedChanged: {
onCheckedChanged: { Config.options.appearance.wallpaperTheming.enableAppsAndShell = checked;
Config.options.appearance.wallpaperTheming.enableAppsAndShell = checked;
}
}
ConfigSwitch {
text: Translation.tr("Qt apps")
checked: Config.options.appearance.wallpaperTheming.enableQtApps
onCheckedChanged: {
Config.options.appearance.wallpaperTheming.enableQtApps = checked;
}
StyledToolTip {
content: Translation.tr("Shell & utilities theming must also be enabled")
}
}
ConfigSwitch {
text: Translation.tr("Terminal")
checked: Config.options.appearance.wallpaperTheming.enableTerminal
onCheckedChanged: {
Config.options.appearance.wallpaperTheming.enableTerminal = checked;
}
StyledToolTip {
content: Translation.tr("Shell & utilities theming must also be enabled")
}
} }
} }
ConfigRow { ConfigSwitch {
uniform: true buttonIcon: "tv_options_input_settings"
ConfigSwitch { text: Translation.tr("Qt apps")
text: Translation.tr("Force dark mode in terminal") checked: Config.options.appearance.wallpaperTheming.enableQtApps
checked: Config.options.appearance.wallpaperTheming.forceTerminalDarkMode onCheckedChanged: {
onCheckedChanged: { Config.options.appearance.wallpaperTheming.enableQtApps = checked;
Config.options.appearance.wallpaperTheming.forceTerminalDarkMode = checked; }
} StyledToolTip {
StyledToolTip { content: Translation.tr("Shell & utilities theming must also be enabled")
content: Translation.tr("Ignored if terminal theming is not enabled") }
} }
ConfigSwitch {
buttonIcon: "terminal"
text: Translation.tr("Terminal")
checked: Config.options.appearance.wallpaperTheming.enableTerminal
onCheckedChanged: {
Config.options.appearance.wallpaperTheming.enableTerminal = checked;
}
StyledToolTip {
content: Translation.tr("Shell & utilities theming must also be enabled")
}
}
ConfigSpinBox {
icon: "invert_colors"
text: Translation.tr("Terminal: Harmony (%)")
value: Config.options.appearance.wallpaperTheming.terminalGenerationProps.harmony * 100
from: 0
to: 100
stepSize: 10
onValueChanged: {
Config.options.appearance.wallpaperTheming.terminalGenerationProps.harmony = value / 100;
}
}
ConfigSpinBox {
icon: "gradient"
text: Translation.tr("Terminal: Harmonize threshold")
value: Config.options.appearance.wallpaperTheming.terminalGenerationProps.harmonizeThreshold
from: 0
to: 100
stepSize: 10
onValueChanged: {
Config.options.appearance.wallpaperTheming.terminalGenerationProps.harmonizeThreshold = value;
}
}
ConfigSpinBox {
icon: "format_color_text"
text: Translation.tr("Terminal: Foreground boost (%)")
value: Config.options.appearance.wallpaperTheming.terminalGenerationProps.termFgBoost * 100
from: 0
to: 100
stepSize: 10
onValueChanged: {
Config.options.appearance.wallpaperTheming.terminalGenerationProps.termFgBoost = value / 100;
} }
} }
} }
} }
@@ -0,0 +1,238 @@
import QtQuick
import Quickshell
import QtQuick.Layouts
import qs
import qs.services
import qs.modules.common
import qs.modules.common.functions
import qs.modules.common.widgets
ContentPage {
forceWidth: true
ContentSection {
icon: "volume_up"
title: Translation.tr("Audio")
ConfigSwitch {
text: Translation.tr("Earbang protection")
checked: Config.options.audio.protection.enable
onCheckedChanged: {
Config.options.audio.protection.enable = checked;
}
StyledToolTip {
content: Translation.tr("Prevents abrupt increments and restricts volume limit")
}
}
ConfigRow {
// uniform: true
ConfigSpinBox {
text: Translation.tr("Max allowed increase")
value: Config.options.audio.protection.maxAllowedIncrease
from: 0
to: 100
stepSize: 2
onValueChanged: {
Config.options.audio.protection.maxAllowedIncrease = value;
}
}
ConfigSpinBox {
text: Translation.tr("Volume limit")
value: Config.options.audio.protection.maxAllowed
from: 0
to: 154 // pavucontrol allows up to 153%
stepSize: 2
onValueChanged: {
Config.options.audio.protection.maxAllowed = value;
}
}
}
}
ContentSection {
icon: "battery_android_full"
title: Translation.tr("Battery")
ConfigRow {
uniform: true
ConfigSpinBox {
text: Translation.tr("Low warning")
value: Config.options.battery.low
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.low = value;
}
}
ConfigSpinBox {
text: Translation.tr("Critical warning")
value: Config.options.battery.critical
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.critical = value;
}
}
}
ConfigRow {
uniform: true
ConfigSwitch {
text: Translation.tr("Automatic suspend")
checked: Config.options.battery.automaticSuspend
onCheckedChanged: {
Config.options.battery.automaticSuspend = checked;
}
StyledToolTip {
content: Translation.tr("Automatically suspends the system when battery is low")
}
}
ConfigSpinBox {
text: Translation.tr("Suspend at")
value: Config.options.battery.suspend
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.suspend = value;
}
}
}
}
ContentSection {
icon: "language"
title: Translation.tr("Language")
ContentSubsection {
title: Translation.tr("Interface Language")
tooltip: Translation.tr("Select the language for the user interface.\n\"Auto\" will use your system's locale.")
ConfigSelectionArray {
id: languageSelector
currentValue: Config.options.language.ui
onSelected: newValue => {
Config.options.language.ui = newValue;
}
options: [
{
displayName: Translation.tr("Auto (System)"),
value: "auto"
},
...Translation.availableLanguages.map(lang => {
return {
displayName: lang.replace('_', '-'),
value: lang
};
})
]
}
}
}
ContentSection {
icon: "rule"
title: Translation.tr("Policies")
ConfigRow {
ColumnLayout {
// Weeb policy
ContentSubsectionLabel {
text: Translation.tr("Weeb")
}
ConfigSelectionArray {
currentValue: Config.options.policies.weeb
onSelected: newValue => {
Config.options.policies.weeb = newValue;
}
options: [
{
displayName: Translation.tr("No"),
icon: "close",
value: 0
},
{
displayName: Translation.tr("Yes"),
icon: "check",
value: 1
},
{
displayName: Translation.tr("Closet"),
icon: "ev_shadow",
value: 2
}
]
}
}
ColumnLayout {
// AI policy
ContentSubsectionLabel {
text: Translation.tr("AI")
}
ConfigSelectionArray {
currentValue: Config.options.policies.ai
onSelected: newValue => {
Config.options.policies.ai = newValue;
}
options: [
{
displayName: Translation.tr("No"),
icon: "close",
value: 0
},
{
displayName: Translation.tr("Yes"),
icon: "check",
value: 1
},
{
displayName: Translation.tr("Local only"),
icon: "sync_saved_locally",
value: 2
}
]
}
}
}
}
ContentSection {
icon: "nest_clock_farsight_analog"
title: Translation.tr("Time")
ContentSubsection {
title: Translation.tr("Format")
tooltip: ""
ConfigSelectionArray {
currentValue: Config.options.time.format
onSelected: newValue => {
if (newValue === "hh:mm") {
Quickshell.execDetached(["bash", "-c", `sed -i 's/\\TIME12\\b/TIME/' '${FileUtils.trimFileProtocol(Directories.config)}/hypr/hyprlock.conf'`]);
} else {
Quickshell.execDetached(["bash", "-c", `sed -i 's/\\TIME\\b/TIME12/' '${FileUtils.trimFileProtocol(Directories.config)}/hypr/hyprlock.conf'`]);
}
Config.options.time.format = newValue;
}
options: [
{
displayName: Translation.tr("24h"),
value: "hh:mm"
},
{
displayName: Translation.tr("12h am/pm"),
value: "h:mm ap"
},
{
displayName: Translation.tr("12h AM/PM"),
value: "h:mm AP"
},
]
}
}
}
}
@@ -7,66 +7,6 @@ import qs.modules.common.widgets
ContentPage { ContentPage {
forceWidth: true forceWidth: true
ContentSection {
icon: "rule"
title: Translation.tr("Policies")
ConfigRow {
ColumnLayout {
// Weeb policy
ContentSubsectionLabel {
text: Translation.tr("Weeb")
}
ConfigSelectionArray {
currentValue: Config.options.policies.weeb
onSelected: newValue => {
Config.options.policies.weeb = newValue;
}
options: [
{
displayName: Translation.tr("No"),
value: 0
},
{
displayName: Translation.tr("Yes"),
value: 1
},
{
displayName: Translation.tr("Closet"),
value: 2
}
]
}
}
ColumnLayout {
// AI policy
ContentSubsectionLabel {
text: Translation.tr("AI")
}
ConfigSelectionArray {
currentValue: Config.options.policies.ai
onSelected: newValue => {
Config.options.policies.ai = newValue;
}
options: [
{
displayName: Translation.tr("No"),
value: 0
},
{
displayName: Translation.tr("Yes"),
value: 1
},
{
displayName: Translation.tr("Local only"),
value: 2
}
]
}
}
}
}
ContentSection { ContentSection {
icon: "wallpaper" icon: "wallpaper"
@@ -121,58 +61,6 @@ ContentPage {
} }
} }
ContentSection {
icon: "battery_android_full"
title: Translation.tr("Battery")
ConfigRow {
uniform: true
ConfigSpinBox {
text: Translation.tr("Low warning")
value: Config.options.battery.low
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.low = value;
}
}
ConfigSpinBox {
text: Translation.tr("Critical warning")
value: Config.options.battery.critical
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.critical = value;
}
}
}
ConfigRow {
uniform: true
ConfigSwitch {
text: Translation.tr("Automatic suspend")
checked: Config.options.battery.automaticSuspend
onCheckedChanged: {
Config.options.battery.automaticSuspend = checked;
}
StyledToolTip {
content: Translation.tr("Automatically suspends the system when battery is low")
}
}
ConfigSpinBox {
text: Translation.tr("Suspend at")
value: Config.options.battery.suspend
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.suspend = value;
}
}
}
}
ContentSection { ContentSection {
icon: "call_to_action" icon: "call_to_action"
title: Translation.tr("Dock") title: Translation.tr("Dock")
@@ -281,10 +169,6 @@ ContentPage {
onCheckedChanged: { onCheckedChanged: {
Config.options.sidebar.cornerOpen.visualize = checked; Config.options.sidebar.cornerOpen.visualize = checked;
} }
StyledToolTip {
content: "When this is off you'll have to click"
}
} }
ConfigRow { ConfigRow {
ConfigSpinBox { ConfigSpinBox {
@@ -389,33 +273,4 @@ ContentPage {
} }
} }
ContentSection {
icon: "language"
title: Translation.tr("Language")
ContentSubsection {
title: Translation.tr("Interface Language")
tooltip: Translation.tr("Select the language for the user interface.\n\"Auto\" will use your system's locale.")
ConfigSelectionArray {
id: languageSelector
currentValue: Config.options.language.ui
onSelected: newValue => {
Config.options.language.ui = newValue;
}
options: [
{
displayName: Translation.tr("Auto (System)"),
value: "auto"
},
...Translation.availableLanguages.map(lang => {
return {
displayName: lang.replace('_', '-'),
value: lang
};
})
]
}
}
}
} }
@@ -90,6 +90,7 @@ ContentPage {
ColumnLayout { ColumnLayout {
RippleButtonWithIcon { RippleButtonWithIcon {
id: rndWallBtn id: rndWallBtn
visible: Config.options.policies.weeb === 1
Layout.fillWidth: true Layout.fillWidth: true
buttonRadius: Appearance.rounding.small buttonRadius: Appearance.rounding.small
materialIcon: "wallpaper" materialIcon: "wallpaper"
@@ -10,45 +10,6 @@ import Quickshell
ContentPage { ContentPage {
forceWidth: true forceWidth: true
ContentSection {
icon: "volume_up"
title: Translation.tr("Audio")
ConfigSwitch {
text: Translation.tr("Earbang protection")
checked: Config.options.audio.protection.enable
onCheckedChanged: {
Config.options.audio.protection.enable = checked;
}
StyledToolTip {
content: Translation.tr("Prevents abrupt increments and restricts volume limit")
}
}
ConfigRow {
// uniform: true
ConfigSpinBox {
text: Translation.tr("Max allowed increase")
value: Config.options.audio.protection.maxAllowedIncrease
from: 0
to: 100
stepSize: 2
onValueChanged: {
Config.options.audio.protection.maxAllowedIncrease = value;
}
}
ConfigSpinBox {
text: Translation.tr("Volume limit")
value: Config.options.audio.protection.maxAllowed
from: 0
to: 154 // pavucontrol allows up to 153%
stepSize: 2
onValueChanged: {
Config.options.audio.protection.maxAllowed = value;
}
}
}
}
ContentSection { ContentSection {
icon: "neurology" icon: "neurology"
title: Translation.tr("AI") title: Translation.tr("AI")
@@ -66,58 +27,6 @@ ContentPage {
} }
} }
ContentSection {
icon: "battery_android_full"
title: Translation.tr("Battery")
ConfigRow {
uniform: true
ConfigSpinBox {
text: Translation.tr("Low warning")
value: Config.options.battery.low
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.low = value;
}
}
ConfigSpinBox {
text: Translation.tr("Critical warning")
value: Config.options.battery.critical
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.critical = value;
}
}
}
ConfigRow {
uniform: true
ConfigSwitch {
text: Translation.tr("Automatic suspend")
checked: Config.options.battery.automaticSuspend
onCheckedChanged: {
Config.options.battery.automaticSuspend = checked;
}
StyledToolTip {
content: Translation.tr("Automatically suspends the system when battery is low")
}
}
ConfigSpinBox {
text: Translation.tr("Suspend at")
value: Config.options.battery.suspend
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.suspend = value;
}
}
}
}
ContentSection { ContentSection {
icon: "cell_tower" icon: "cell_tower"
title: Translation.tr("Networking") title: Translation.tr("Networking")
@@ -241,42 +150,4 @@ ContentPage {
} }
} }
} }
ContentSection {
icon: "nest_clock_farsight_analog"
title: Translation.tr("Time")
ContentSubsection {
title: Translation.tr("Format")
tooltip: ""
ConfigSelectionArray {
currentValue: Config.options.time.format
onSelected: newValue => {
if (newValue === "hh:mm") {
Quickshell.execDetached(["bash", "-c", `sed -i 's/\\TIME12\\b/TIME/' '${FileUtils.trimFileProtocol(Directories.config)}/hypr/hyprlock.conf'`]);
} else {
Quickshell.execDetached(["bash", "-c", `sed -i 's/\\TIME\\b/TIME12/' '${FileUtils.trimFileProtocol(Directories.config)}/hypr/hyprlock.conf'`]);
}
Config.options.time.format = newValue;
}
options: [
{
displayName: Translation.tr("24h"),
value: "hh:mm"
},
{
displayName: Translation.tr("12h am/pm"),
value: "h:mm ap"
},
{
displayName: Translation.tr("12h AM/PM"),
value: "h:mm AP"
},
]
}
}
}
} }
@@ -23,6 +23,15 @@ Item {
property var suggestionQuery: "" property var suggestionQuery: ""
property var suggestionList: [] property var suggestionList: []
Connections {
target: Config
function onReadyChanged() {
if (Config.options.policies.weeb !== 0) {
Quickshell.execDetached(["bash", "-c", `mkdir -p '${root.downloadPath}' && mkdir -p '${root.nsfwPath}'`])
}
}
}
Connections { Connections {
target: Booru target: Booru
function onTagSuggestion(query, suggestions) { function onTagSuggestion(query, suggestions) {
@@ -110,8 +110,9 @@ Item { // Bar content region
vertical: true vertical: true
padding: 6 padding: 6
Workspaces { Bar.Workspaces {
id: workspacesWidget id: workspacesWidget
vertical: true
MouseArea { MouseArea {
// Right-click to toggle overview // Right-click to toggle overview
anchors.fill: parent anchors.fill: parent
@@ -1,308 +0,0 @@
import qs
import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
import Quickshell.Widgets
import Qt5Compat.GraphicalEffects
Item {
id: root
property bool borderless: Config.options.bar.borderless
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(root.QsWindow.window?.screen)
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
readonly property int workspaceGroup: Math.floor((monitor?.activeWorkspace?.id - 1) / Config.options.bar.workspaces.shown)
property list<bool> workspaceOccupied: []
property real workspaceButtonWidth: 26
property real activeWorkspaceMargin: 2
property real workspaceIconSize: workspaceButtonWidth * 0.69
property real workspaceIconSizeShrinked: workspaceButtonWidth * 0.55
property real workspaceIconOpacityShrinked: 1
property real workspaceIconMarginShrinked: -4
property int workspaceIndexInGroup: (monitor?.activeWorkspace?.id - 1) % Config.options.bar.workspaces.shown
implicitHeight: columnLayout.implicitHeight + columnLayout.spacing * 2
implicitWidth: Appearance.sizes.verticalBarWidth
property bool showNumbers: false
Timer {
id: showNumbersTimer
interval: (Config?.options.bar.autoHide.showWhenPressingSuper.delay ?? 100)
repeat: false
onTriggered: {
root.showNumbers = true
}
}
Connections {
target: GlobalStates
function onSuperDownChanged() {
if (!Config?.options.bar.autoHide.showWhenPressingSuper.enable) return;
if (GlobalStates.superDown) showNumbersTimer.restart();
else {
showNumbersTimer.stop();
root.showNumbers = false;
}
}
function onSuperReleaseMightTriggerChanged() {
showNumbersTimer.stop()
}
}
// Function to update workspaceOccupied
function updateWorkspaceOccupied() {
workspaceOccupied = Array.from({ length: Config.options.bar.workspaces.shown }, (_, i) => {
return Hyprland.workspaces.values.some(ws => ws.id === workspaceGroup * Config.options.bar.workspaces.shown + i + 1);
})
}
// Occupied workspace updates
Component.onCompleted: updateWorkspaceOccupied()
Connections {
target: Hyprland.workspaces
function onValuesChanged() {
updateWorkspaceOccupied();
}
}
Connections {
target: Hyprland
function onFocusedWorkspaceChanged() {
updateWorkspaceOccupied();
}
}
onWorkspaceGroupChanged: {
updateWorkspaceOccupied();
}
// Scroll to switch workspaces
WheelHandler {
onWheel: (event) => {
if (event.angleDelta.y < 0)
Hyprland.dispatch(`workspace r+1`);
else if (event.angleDelta.y > 0)
Hyprland.dispatch(`workspace r-1`);
}
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.BackButton
onPressed: (event) => {
if (event.button === Qt.BackButton) {
Hyprland.dispatch(`togglespecialworkspace`);
}
}
}
// Workspaces - background
ColumnLayout {
id: columnLayout
z: 1
spacing: 0
anchors.fill: parent
implicitWidth: Appearance.sizes.verticalBarWidth
Repeater {
model: Config.options.bar.workspaces.shown
Rectangle {
z: 1
implicitWidth: workspaceButtonWidth
implicitHeight: workspaceButtonWidth
radius: (width / 2)
property var previousOccupied: (workspaceOccupied[index-1] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index))
property var nextOccupied: (workspaceOccupied[index+1] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index+2))
property var radiusTop: previousOccupied ? 0 : (width / 2)
property var radiusBottom: nextOccupied ? 0 : (width / 2)
Layout.alignment: Qt.AlignHCenter
topLeftRadius: radiusTop
topRightRadius: radiusTop
bottomLeftRadius: radiusBottom
bottomRightRadius: radiusBottom
color: ColorUtils.transparentize(Appearance.m3colors.m3secondaryContainer, 0.4)
opacity: (workspaceOccupied[index] && !(!activeWindow?.activated && monitor?.activeWorkspace?.id === index+1)) ? 1 : 0
Behavior on opacity {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
Behavior on radiusTop {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
Behavior on radiusBottom {
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
}
}
}
// Active workspace
Rectangle {
z: 2
// Make active ws indicator, which has a brighter color, smaller to look like it is of the same size as ws occupied highlight
implicitWidth: workspaceButtonWidth - root.activeWorkspaceMargin * 2
radius: Appearance.rounding.full
color: Appearance.colors.colPrimary
anchors.horizontalCenter: parent.horizontalCenter
property real idx1: workspaceIndexInGroup
property real idx2: workspaceIndexInGroup
y: Math.min(idx1, idx2) * workspaceButtonWidth + root.activeWorkspaceMargin
implicitHeight: Math.abs(idx1 - idx2) * workspaceButtonWidth + workspaceButtonWidth - root.activeWorkspaceMargin * 2
Behavior on idx1 { // Leading anim
NumberAnimation {
duration: 100
easing.type: Easing.OutSine
}
}
Behavior on idx2 { // Following anim
NumberAnimation {
duration: 300
easing.type: Easing.OutSine
}
}
}
// Workspaces - numbers
ColumnLayout {
id: columnLayoutNumbers
z: 3
spacing: 0
anchors.fill: parent
implicitWidth: Appearance.sizes.verticalBarWidth
Repeater {
model: Config.options.bar.workspaces.shown
Button {
id: button
property int workspaceValue: workspaceGroup * Config.options.bar.workspaces.shown + index + 1
Layout.fillWidth: true
onPressed: Hyprland.dispatch(`workspace ${workspaceValue}`)
height: workspaceButtonWidth
background: Item {
id: workspaceButtonBackground
implicitWidth: workspaceButtonWidth
implicitHeight: workspaceButtonWidth
property var biggestWindow: HyprlandData.biggestWindowForWorkspace(button.workspaceValue)
property var mainAppIconSource: Quickshell.iconPath(AppSearch.guessIcon(biggestWindow?.class), "image-missing")
StyledText { // Workspace number text
opacity: root.showNumbers
|| ((Config.options?.bar.workspaces.alwaysShowNumbers && (!Config.options?.bar.workspaces.showAppIcons || !workspaceButtonBackground.biggestWindow || root.showNumbers))
|| (root.showNumbers && !Config.options?.bar.workspaces.showAppIcons)
) ? 1 : 0
z: 3
anchors.centerIn: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
font.pixelSize: Appearance.font.pixelSize.small - ((text.length - 1) * (text !== "10") * 2)
text: `${button.workspaceValue}`
elide: Text.ElideRight
color: (monitor?.activeWorkspace?.id == button.workspaceValue) ?
Appearance.m3colors.m3onPrimary :
(workspaceOccupied[index] ? Appearance.m3colors.m3onSecondaryContainer :
Appearance.colors.colOnLayer1Inactive)
Behavior on opacity {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
}
Rectangle { // Dot instead of ws number
id: wsDot
opacity: (Config.options?.bar.workspaces.alwaysShowNumbers
|| root.showNumbers
|| (Config.options?.bar.workspaces.showAppIcons && workspaceButtonBackground.biggestWindow)
) ? 0 : 1
visible: opacity > 0
anchors.centerIn: parent
width: workspaceButtonWidth * 0.18
height: width
radius: width / 2
color: (monitor?.activeWorkspace?.id == button.workspaceValue) ?
Appearance.m3colors.m3onPrimary :
(workspaceOccupied[index] ? Appearance.m3colors.m3onSecondaryContainer :
Appearance.colors.colOnLayer1Inactive)
Behavior on opacity {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
}
Item { // Main app icon
anchors.centerIn: parent
width: workspaceButtonWidth
height: workspaceButtonWidth
opacity: !Config.options?.bar.workspaces.showAppIcons ? 0 :
(workspaceButtonBackground.biggestWindow && !root.showNumbers && Config.options?.bar.workspaces.showAppIcons) ?
1 : workspaceButtonBackground.biggestWindow ? workspaceIconOpacityShrinked : 0
visible: opacity > 0
IconImage {
id: mainAppIcon
anchors.bottom: parent.bottom
anchors.right: parent.right
anchors.bottomMargin: (!root.showNumbers && Config.options?.bar.workspaces.showAppIcons) ?
(workspaceButtonWidth - workspaceIconSize) / 2 : workspaceIconMarginShrinked
anchors.rightMargin: (!root.showNumbers && Config.options?.bar.workspaces.showAppIcons) ?
(workspaceButtonWidth - workspaceIconSize) / 2 : workspaceIconMarginShrinked
source: workspaceButtonBackground.mainAppIconSource
implicitSize: (!root.showNumbers && Config.options?.bar.workspaces.showAppIcons) ? workspaceIconSize : workspaceIconSizeShrinked
Behavior on opacity {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
Behavior on anchors.bottomMargin {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
Behavior on anchors.rightMargin {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
Behavior on implicitSize {
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
}
}
Loader {
active: Config.options.bar.workspaces.monochromeIcons
anchors.fill: mainAppIcon
sourceComponent: Item {
Desaturate {
id: desaturatedIcon
visible: false // There's already color overlay
anchors.fill: parent
source: mainAppIcon
desaturation: 0.8
}
ColorOverlay {
anchors.fill: desaturatedIcon
source: desaturatedIcon
color: ColorUtils.transparentize(wsDot.color, 0.9)
}
}
}
}
}
}
}
}
}
@@ -284,6 +284,16 @@ switch() {
fi fi
fi fi
# Set harmony and related properties
if [ -f "$SHELL_CONFIG_FILE" ]; then
harmony=$(jq -r '.appearance.wallpaperTheming.terminalGenerationProps.harmony' "$SHELL_CONFIG_FILE")
harmonize_threshold=$(jq -r '.appearance.wallpaperTheming.terminalGenerationProps.harmonizeThreshold' "$SHELL_CONFIG_FILE")
term_fg_boost=$(jq -r '.appearance.wallpaperTheming.terminalGenerationProps.termFgBoost' "$SHELL_CONFIG_FILE")
[[ "$harmony" != "null" && -n "$harmony" ]] && generate_colors_material_args+=(--harmony "$harmony")
[[ "$harmonize_threshold" != "null" && -n "$harmonize_threshold" ]] && generate_colors_material_args+=(--harmonize_threshold "$harmonize_threshold")
[[ "$term_fg_boost" != "null" && -n "$term_fg_boost" ]] && generate_colors_material_args+=(--term_fg_boost "$term_fg_boost")
fi
matugen "${matugen_args[@]}" matugen "${matugen_args[@]}"
source "$(eval echo $ILLOGICAL_IMPULSE_VIRTUAL_ENV)/bin/activate" source "$(eval echo $ILLOGICAL_IMPULSE_VIRTUAL_ENV)/bin/activate"
python3 "$SCRIPT_DIR/generate_colors_material.py" "${generate_colors_material_args[@]}" \ python3 "$SCRIPT_DIR/generate_colors_material.py" "${generate_colors_material_args[@]}" \
+1 -1
View File
@@ -255,7 +255,7 @@ Singleton {
// - key_get_description: Description of pricing and how to get an API key // - key_get_description: Description of pricing and how to get an API key
// - api_format: The API format of the model. Can be "openai" or "gemini". Default is "openai". // - api_format: The API format of the model. Can be "openai" or "gemini". Default is "openai".
// - extraParams: Extra parameters to be passed to the model. This is a JSON object. // - extraParams: Extra parameters to be passed to the model. This is a JSON object.
property var models: { property var models: Config.options.policies.ai === 2 ? {} : {
"gemini-2.0-flash": aiModelComponent.createObject(this, { "gemini-2.0-flash": aiModelComponent.createObject(this, {
"name": "Gemini 2.0 Flash", "name": "Gemini 2.0 Flash",
"icon": "google-gemini-symbolic", "icon": "google-gemini-symbolic",
+7 -1
View File
@@ -28,6 +28,12 @@ ApplicationWindow {
icon: "instant_mix", icon: "instant_mix",
component: "modules/settings/QuickConfig.qml" component: "modules/settings/QuickConfig.qml"
}, },
{
name: Translation.tr("General"),
icon: "browse",
iconRotation: 180,
component: "modules/settings/GeneralConfig.qml"
},
{ {
name: Translation.tr("Bar"), name: Translation.tr("Bar"),
icon: "toast", icon: "toast",
@@ -36,7 +42,7 @@ ApplicationWindow {
}, },
{ {
name: Translation.tr("Interface"), name: Translation.tr("Interface"),
icon: "cards", icon: "bottom_app_bar",
component: "modules/settings/InterfaceConfig.qml" component: "modules/settings/InterfaceConfig.qml"
}, },
{ {
+7
View File
@@ -236,6 +236,7 @@ ApplicationWindow {
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
RippleButtonWithIcon { RippleButtonWithIcon {
id: rndWallBtn id: rndWallBtn
visible: Config.options.policies.weeb === 1
Layout.alignment: Qt.AlignHCenter Layout.alignment: Qt.AlignHCenter
buttonRadius: Appearance.rounding.small buttonRadius: Appearance.rounding.small
materialIcon: "wallpaper" materialIcon: "wallpaper"
@@ -309,14 +310,17 @@ ApplicationWindow {
options: [ options: [
{ {
displayName: Translation.tr("No"), displayName: Translation.tr("No"),
icon: "close",
value: 0 value: 0
}, },
{ {
displayName: Translation.tr("Yes"), displayName: Translation.tr("Yes"),
icon: "check",
value: 1 value: 1
}, },
{ {
displayName: Translation.tr("Closet"), displayName: Translation.tr("Closet"),
icon: "ev_shadow",
value: 2 value: 2
} }
] ]
@@ -334,14 +338,17 @@ ApplicationWindow {
options: [ options: [
{ {
displayName: Translation.tr("No"), displayName: Translation.tr("No"),
icon: "close",
value: 0 value: 0
}, },
{ {
displayName: Translation.tr("Yes"), displayName: Translation.tr("Yes"),
icon: "check",
value: 1 value: 1
}, },
{ {
displayName: Translation.tr("Local only"), displayName: Translation.tr("Local only"),
icon: "sync_saved_locally",
value: 2 value: 2
} }
] ]
+16 -25
View File
@@ -26,10 +26,10 @@
- **Transparent installation**: Every command is shown before it's run - **Transparent installation**: Every command is shown before it's run
</details> </details>
<details> <details>
<summary>Installation (illogical-impulse<sup>Quickshell</sup>)</summary> <summary>Installation (illogical-impulse Quickshell)</summary>
- See the [Wiki](https://end-4.github.io/dots-hyprland-wiki/en/ii-qs/01setup/) - See the [Wiki](https://end-4.github.io/dots-hyprland-wiki/en/ii-qs/01setup/) <sub>(both install script and manual installation available)</sub>
- **Default keybinds**: Should be somewhat familiar to Windows or GNOME users. - **Default keybinds**: Should be somewhat familiar to Windows or GNOME users. Important ones:
- `Super`+`/` = keybind list - `Super`+`/` = keybind list
- `Super`+`Enter` = terminal - `Super`+`Enter` = terminal
- If for whatever reason the keybind list widget does not work, here's an image: - If for whatever reason the keybind list widget does not work, here's an image:
@@ -44,12 +44,11 @@
| Software | Purpose | | Software | Purpose |
| ------------- | ------------- | | ------------- | ------------- |
| [Hyprland](https://github.com/hyprwm/hyprland) | The compositor (for noobs, you can just call it a window manager) | | [Hyprland](https://github.com/hyprwm/hyprland) | The compositor (manages and renders windows) |
| [Quickshell](https://quickshell.outfoxxed.me/) | A QtQuick-based widget system, responsible for the status bar, sidebars, etc. | | [Quickshell](https://quickshell.outfoxxed.me/) | A QtQuick-based widget system, used for the status bar, sidebars, etc. |
- THERE IS NO WAYBAR
- For the full list of dependencies, see the [arch-packages folder](https://github.com/end-4/dots-hyprland/tree/main/arch-packages)
- For a more comprehensive list of dependencies, see [scriptdata/dependencies.conf](https://github.com/end-4/dots-hyprland/blob/main/scriptdata/dependencies.conf)
</details> </details>
<details> <details>
@@ -58,9 +57,6 @@
</details> </details>
_Note: **THERE IS NO FUCKING WAYBAR**_
<div align="center"> <div align="center">
<h2>• screenshots •</h2> <h2>• screenshots •</h2>
<h3></h3> <h3></h3>
@@ -86,9 +82,9 @@ Widget system: Quickshell | Support: Yes
| AI, settings app | Some widgets | | AI, settings app | Some widgets |
|:---|:---------------| |:---|:---------------|
| ![image](https://github.com/user-attachments/assets/4d45e860-ae60-418a-a564-309b4939f5c4) | ![image](https://github.com/user-attachments/assets/4fcd63d9-0943-4b21-8737-4bed97b71961) | | <img width="1920" height="1080" alt="image" src="https://github.com/user-attachments/assets/22aa335a-0a23-4789-8ce9-c601b9f95858" /> | <img width="1920" height="1080" alt="image" src="https://github.com/user-attachments/assets/50009d7f-e456-4200-bc41-49b29abbafe3" /> |
| Window management | Weeb power | | Window management | Weeb power |
| ![image](https://github.com/user-attachments/assets/86cc511b-0d33-4c78-bcc0-3037d02a17da) | ![image](https://github.com/user-attachments/assets/292259fc-57d3-4663-a583-2ce2faad13fb) | | <img width="1920" height="1080" alt="image" src="https://github.com/user-attachments/assets/e77a7c96-1905-4126-a2a0-434f818825a2" /> | <img width="1920" height="1080" alt="image" src="https://github.com/user-attachments/assets/c8544e99-8881-477f-b83a-d6e35c0184a1" /> |
### illogical-impulse<sup>AGS</sup> <sub>(Deprecated)</sub> ### illogical-impulse<sup>AGS</sup> <sub>(Deprecated)</sub>
@@ -102,7 +98,7 @@ Widget system: AGS | Support: No
### Very old stuff ### Very old stuff
- Source code not likely to work but still available in the [`archive`](https://github.com/end-4/dots-hyprland/tree/archive) branch. Extremely spaghetti. - Not likely to work, but the source is still available in the [`archive`](https://github.com/end-4/dots-hyprland/tree/archive) branch. Extremely spaghetti.
- Click image for a presentation video - Click image for a presentation video
#### m3ww #### m3ww
@@ -142,28 +138,23 @@ Widget system: AGS | Support: No
<h3></h3> <h3></h3>
</div> </div>
- [@clsty](https://github.com/clsty) for making my work accessible by taking care of the install script and many other things - [@clsty](https://github.com/clsty) for making the dotfiles accessible by taking care of the install script and many other things
- [@midn8hustlr](https://github.com/midn8hustlr) for greatly improving the color generation system - [@midn8hustlr](https://github.com/midn8hustlr) for greatly improving the color generation system
- [@outfoxxed](https://github.com/outfoxxed/) for being extremely supportive in my Quickshell journey - [@outfoxxed](https://github.com/outfoxxed/) for being extremely supportive in my Quickshell journey
- Quickshell: [Soramane](https://github.com/caelestia-dots/shell/), [FridayFaerie](https://github.com/FridayFaerie/quickshell), [nydragon](https://github.com/nydragon/nysh) - Quickshell: [Soramane](https://github.com/caelestia-dots/shell/), [FridayFaerie](https://github.com/FridayFaerie/quickshell), [nydragon](https://github.com/nydragon/nysh)
- AGS: [Aylur's config](https://github.com/Aylur/dotfiles/tree/ags-pre-ts), [kotontrion's config](https://github.com/kotontrion/dotfiles) - AGS: [Aylur](https://github.com/Aylur/dotfiles/tree/ags-pre-ts), [kotontrion](https://github.com/kotontrion/dotfiles)
- EWW: [fufexan's config](https://github.com/fufexan/dotfiles) (he thanks more people there btw) - EWW: [fufexan](https://github.com/fufexan/dotfiles)
- AI bots for providing useful examples
<sup><sup><sup><sup><sup>[@tokyobot](https://github.com/tokyob0t) for saying hi</sup></sup></sup></sup></sup>
<div align="center"> <div align="center">
<h2>• stonks •</h2> <h2>• stonks •</h2>
<h3></h3> <h3></h3>
</div> </div>
- Funny useful number: https://github.com/sponsors/end-4 - If you would like to give me some milk😳 (i dont drink coffee): https://github.com/sponsors/end-4
- Funny useless number: - Virtual tentacle cat website points chart
[![Stargazers over time](https://starchart.cc/end-4/dots-hyprland.svg?variant=adaptive)](https://starchart.cc/end-4/dots-hyprland) [![Stargazers over time](https://starchart.cc/end-4/dots-hyprland.svg?variant=adaptive)](https://starchart.cc/end-4/dots-hyprland)
- *Jokes aside i do appreciate both*
<div align="center"> <div align="center">
<h2>• inspirations/copying •</h2> <h2>• inspirations/copying •</h2>
@@ -171,4 +162,4 @@ Widget system: AGS | Support: No
</div> </div>
- Inspiration: osu!lazer, Windows 11, Material Design 3, AvdanOS (concept) - Inspiration: osu!lazer, Windows 11, Material Design 3, AvdanOS (concept)
- Copying: The license allows you to. Personally I have absolutely no problem with others redistributing/recreating my work. There's no "stealing" (unless you do weird stuff and violate the license). (this note is here because some people actually asked) - Copying: The license allows you to. Personally I have absolutely no problem with others redistributing/recreating my work. There's no "stealing" (unless you do weird stuff and violate the license). <sub>(this note is here because some people actually asked)</sub>