forked from Shinonome/dots-hyprland
Merge remote-tracking branch 'origin/main' into addon-i18n
This commit is contained in:
@@ -1,13 +0,0 @@
|
|||||||
Config(
|
|
||||||
x: Fraction(0.500000),
|
|
||||||
y: Absolute(15),
|
|
||||||
width: Fraction(0.300000),
|
|
||||||
height: Absolute(0),
|
|
||||||
hide_icons: false,
|
|
||||||
ignore_exclusive_zones: false,
|
|
||||||
layer: Overlay,
|
|
||||||
hide_plugin_info: true,
|
|
||||||
close_on_click: true,
|
|
||||||
show_results_immediately: false,
|
|
||||||
max_entries: None,
|
|
||||||
)
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
* {
|
|
||||||
all: unset;
|
|
||||||
font-size: 1.3rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#window,
|
|
||||||
#match,
|
|
||||||
#entry,
|
|
||||||
#plugin,
|
|
||||||
#main {
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
#match.activatable {
|
|
||||||
border-radius: 16px;
|
|
||||||
padding: 0.3rem 0.9rem;
|
|
||||||
margin-top: 0.01rem;
|
|
||||||
}
|
|
||||||
#match.activatable:first-child {
|
|
||||||
margin-top: 0.7rem;
|
|
||||||
}
|
|
||||||
#match.activatable:last-child {
|
|
||||||
margin-bottom: 0.6rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
#plugin:hover #match.activatable {
|
|
||||||
border-radius: 10px;
|
|
||||||
padding: 0.3rem;
|
|
||||||
margin-top: 0.01rem;
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#match:selected,
|
|
||||||
#match:hover,
|
|
||||||
#plugin:hover {
|
|
||||||
background: #2e3131;
|
|
||||||
}
|
|
||||||
|
|
||||||
#entry {
|
|
||||||
background: #0b0f10;
|
|
||||||
border: 1px solid #0b0f10;
|
|
||||||
border-radius: 16px;
|
|
||||||
margin: 0.5rem;
|
|
||||||
padding: 0.3rem 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
list > #plugin {
|
|
||||||
border-radius: 16px;
|
|
||||||
margin: 0 0.3rem;
|
|
||||||
}
|
|
||||||
list > #plugin:first-child {
|
|
||||||
margin-top: 0.3rem;
|
|
||||||
}
|
|
||||||
list > #plugin:last-child {
|
|
||||||
margin-bottom: 0.3rem;
|
|
||||||
}
|
|
||||||
list > #plugin:hover {
|
|
||||||
padding: 0.6rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
box#main {
|
|
||||||
background: #0b0f10;
|
|
||||||
box-shadow: inset 0 0 0 1px #0b0f10, 0 0 0 1px #0b0f10;
|
|
||||||
border-radius: 24px;
|
|
||||||
padding: 0.3rem;
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,5 @@
|
|||||||
# Bar, wallpaper
|
# Bar, wallpaper
|
||||||
exec-once = ~/.config/hypr/hyprland/scripts/start_geoclue_agent.sh & gammastep
|
exec-once = ~/.config/hypr/hyprland/scripts/start_geoclue_agent.sh & gammastep
|
||||||
exec-once = sleep 0.7; [ "$(hyprctl monitors -j | jq 'length')" -eq 1 ] && swww-daemon --format xrgb --no-cache || swww-daemon --format xrgb
|
|
||||||
exec-once = sleep 0.7; swww img "$(cat ~/.local/state/quickshell/user/generated/wallpaper/path.txt)" --transition-step 100 --transition-fps 120 --transition-type grow --transition-angle 30 --transition-duration 1
|
|
||||||
exec-once = qs -c $qsConfig &
|
exec-once = qs -c $qsConfig &
|
||||||
|
|
||||||
# Input method
|
# Input method
|
||||||
|
|||||||
@@ -58,6 +58,8 @@ windowrulev2 = center, title:^(Open Folder)(.*)$
|
|||||||
windowrulev2 = center, title:^(Save As)(.*)$
|
windowrulev2 = center, title:^(Save As)(.*)$
|
||||||
windowrulev2 = center, title:^(Library)(.*)$
|
windowrulev2 = center, title:^(Library)(.*)$
|
||||||
windowrulev2 = center, title:^(File Upload)(.*)$
|
windowrulev2 = center, title:^(File Upload)(.*)$
|
||||||
|
windowrulev2 = center, title:^(.*)(wants to save)$
|
||||||
|
windowrulev2 = center, title:^(.*)(wants to open)$
|
||||||
windowrulev2 = float, title:^(Open File)(.*)$
|
windowrulev2 = float, title:^(Open File)(.*)$
|
||||||
windowrulev2 = float, title:^(Select a File)(.*)$
|
windowrulev2 = float, title:^(Select a File)(.*)$
|
||||||
windowrulev2 = float, title:^(Choose wallpaper)(.*)$
|
windowrulev2 = float, title:^(Choose wallpaper)(.*)$
|
||||||
@@ -65,6 +67,8 @@ windowrulev2 = float, title:^(Open Folder)(.*)$
|
|||||||
windowrulev2 = float, title:^(Save As)(.*)$
|
windowrulev2 = float, title:^(Save As)(.*)$
|
||||||
windowrulev2 = float, title:^(Library)(.*)$
|
windowrulev2 = float, title:^(Library)(.*)$
|
||||||
windowrulev2 = float, title:^(File Upload)(.*)$
|
windowrulev2 = float, title:^(File Upload)(.*)$
|
||||||
|
windowrulev2 = float, title:^(.*)(wants to save)$
|
||||||
|
windowrulev2 = float, title:^(.*)(wants to open)$
|
||||||
|
|
||||||
|
|
||||||
# --- Tearing ---
|
# --- Tearing ---
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ label { # Date
|
|||||||
text = cmd[update:5000] date +"%A, %B %d"
|
text = cmd[update:5000] date +"%A, %B %d"
|
||||||
color = $text_color
|
color = $text_color
|
||||||
font_size = 17
|
font_size = 17
|
||||||
font_family = $font_family
|
font_family = $font_family_clock
|
||||||
|
|
||||||
position = 0, 240
|
position = 0, 240
|
||||||
halign = center
|
halign = center
|
||||||
|
|||||||
@@ -2,8 +2,8 @@ $text_color = rgba({{colors.primary_fixed.default.hex_stripped}}FF)
|
|||||||
$entry_background_color = rgba({{colors.on_primary_fixed.default.hex_stripped}}11)
|
$entry_background_color = rgba({{colors.on_primary_fixed.default.hex_stripped}}11)
|
||||||
$entry_border_color = rgba({{colors.outline.default.hex_stripped}}55)
|
$entry_border_color = rgba({{colors.outline.default.hex_stripped}}55)
|
||||||
$entry_color = rgba({{colors.primary_fixed.default.hex_stripped}}FF)
|
$entry_color = rgba({{colors.primary_fixed.default.hex_stripped}}FF)
|
||||||
$font_family = Rubik Light
|
$font_family = Rubik
|
||||||
$font_family_clock = Rubik Light
|
$font_family_clock = Space Grotesk
|
||||||
$font_material_symbols = Material Symbols Rounded
|
$font_material_symbols = Material Symbols Rounded
|
||||||
|
|
||||||
background {
|
background {
|
||||||
@@ -58,7 +58,7 @@ label { # Date
|
|||||||
text = cmd[update:5000] date +"%A, %B %d"
|
text = cmd[update:5000] date +"%A, %B %d"
|
||||||
color = $text_color
|
color = $text_color
|
||||||
font_size = 17
|
font_size = 17
|
||||||
font_family = $font_family
|
font_family = $font_family_clock
|
||||||
|
|
||||||
position = 0, 240
|
position = 0, 240
|
||||||
halign = center
|
halign = center
|
||||||
|
|||||||
@@ -0,0 +1,223 @@
|
|||||||
|
pragma ComponentBehavior: Bound
|
||||||
|
|
||||||
|
import "root:/"
|
||||||
|
import "root:/modules/common"
|
||||||
|
import "root:/modules/common/widgets"
|
||||||
|
import "root:/services"
|
||||||
|
import "root:/modules/common/functions/color_utils.js" as ColorUtils
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls
|
||||||
|
import QtQuick.Layouts
|
||||||
|
import Quickshell
|
||||||
|
import Quickshell.Io
|
||||||
|
import Quickshell.Wayland
|
||||||
|
import Quickshell.Hyprland
|
||||||
|
|
||||||
|
Scope {
|
||||||
|
id: root
|
||||||
|
readonly property bool fixedClockPosition: Config.options.background.fixedClockPosition
|
||||||
|
readonly property real fixedClockX: Config.options.background.clockX
|
||||||
|
readonly property real fixedClockY: Config.options.background.clockY
|
||||||
|
|
||||||
|
Variants {
|
||||||
|
// For each monitor
|
||||||
|
model: Quickshell.screens
|
||||||
|
|
||||||
|
PanelWindow {
|
||||||
|
id: bgRoot
|
||||||
|
|
||||||
|
required property var modelData
|
||||||
|
// Workspaces
|
||||||
|
property HyprlandMonitor monitor: Hyprland.monitorFor(modelData)
|
||||||
|
property list<var> relevantWindows: HyprlandData.windowList.filter(win => win.monitor == monitor.id && win.workspace.id >= 0).sort((a, b) => a.workspace.id - b.workspace.id)
|
||||||
|
property int firstWorkspaceId: relevantWindows[0]?.workspace.id || 1
|
||||||
|
property int lastWorkspaceId: relevantWindows[relevantWindows.length - 1]?.workspace.id || 10
|
||||||
|
// Wallpaper
|
||||||
|
property string wallpaperPath: Config.options.background.wallpaperPath
|
||||||
|
property real preferredWallpaperScale: Config.options.background.parallax.workspaceZoom
|
||||||
|
property real effectiveWallpaperScale: 1 // Some reasonable init value, to be updated
|
||||||
|
property int wallpaperWidth: modelData.width // Some reasonable init value, to be updated
|
||||||
|
property int wallpaperHeight: modelData.height // Some reasonable init value, to be updated
|
||||||
|
property real movableXSpace: (effectiveWallpaperScale - 1) / 2 * screen.width
|
||||||
|
property real movableYSpace: (effectiveWallpaperScale - 1) / 2 * screen.height
|
||||||
|
// Position
|
||||||
|
property real clockX: (modelData.width / 2) + ((Math.random() < 0.5 ? -1 : 1) * modelData.width)
|
||||||
|
property real clockY: (modelData.height / 2) + ((Math.random() < 0.5 ? -1 : 1) * modelData.height)
|
||||||
|
property var textHorizontalAlignment: clockX < screen.width / 3 ? Text.AlignLeft :
|
||||||
|
(clockX > screen.width * 2 / 3 ? Text.AlignRight : Text.AlignHCenter)
|
||||||
|
// Colors
|
||||||
|
property color dominantColor: Appearance.colors.colPrimary
|
||||||
|
property bool dominantColorIsDark: dominantColor.hslLightness < 0.5
|
||||||
|
property color colText: ColorUtils.colorWithLightness(Appearance.colors.colPrimary, (dominantColorIsDark ? 0.8 : 0.12))
|
||||||
|
|
||||||
|
// Layer props
|
||||||
|
screen: modelData
|
||||||
|
exclusionMode: ExclusionMode.Ignore
|
||||||
|
WlrLayershell.layer: WlrLayer.Bottom
|
||||||
|
WlrLayershell.namespace: "quickshell:background"
|
||||||
|
anchors {
|
||||||
|
top: true
|
||||||
|
bottom: true
|
||||||
|
left: true
|
||||||
|
right: true
|
||||||
|
}
|
||||||
|
color: "transparent"
|
||||||
|
|
||||||
|
onWallpaperPathChanged: {
|
||||||
|
bgRoot.updateZoomScale()
|
||||||
|
// Clock position gets updated after zoom scale is updated
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wallpaper zoom scale
|
||||||
|
function updateZoomScale() {
|
||||||
|
getWallpaperSizeProc.path = bgRoot.wallpaperPath
|
||||||
|
getWallpaperSizeProc.running = true;
|
||||||
|
}
|
||||||
|
Process {
|
||||||
|
id: getWallpaperSizeProc
|
||||||
|
property string path: bgRoot.wallpaperPath
|
||||||
|
command: [ "magick", "identify", "-format", "%w %h", path ]
|
||||||
|
stdout: StdioCollector {
|
||||||
|
id: wallpaperSizeOutputCollector
|
||||||
|
onStreamFinished: {
|
||||||
|
const output = wallpaperSizeOutputCollector.text
|
||||||
|
const [width, height] = output.split(" ").map(Number);
|
||||||
|
bgRoot.wallpaperWidth = width
|
||||||
|
bgRoot.wallpaperHeight = height
|
||||||
|
bgRoot.effectiveWallpaperScale = Math.max(1, Math.min(
|
||||||
|
bgRoot.preferredWallpaperScale,
|
||||||
|
width / bgRoot.screen.width,
|
||||||
|
height / bgRoot.screen.height
|
||||||
|
));
|
||||||
|
|
||||||
|
bgRoot.updateClockPosition()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clock positioning
|
||||||
|
function updateClockPosition() {
|
||||||
|
// Somehow all this manual setting is needed to make the proc correctly use the new values
|
||||||
|
leastBusyRegionProc.path = bgRoot.wallpaperPath
|
||||||
|
leastBusyRegionProc.contentWidth = clock.implicitWidth
|
||||||
|
leastBusyRegionProc.contentHeight = clock.implicitHeight
|
||||||
|
leastBusyRegionProc.horizontalPadding = (effectiveWallpaperScale - 1) / 2 * screen.width + 100
|
||||||
|
leastBusyRegionProc.verticalPadding = (effectiveWallpaperScale - 1) / 2 * screen.height + 100
|
||||||
|
leastBusyRegionProc.running = false;
|
||||||
|
leastBusyRegionProc.running = true;
|
||||||
|
}
|
||||||
|
Process {
|
||||||
|
id: leastBusyRegionProc
|
||||||
|
property string path: bgRoot.wallpaperPath
|
||||||
|
property int contentWidth: 300
|
||||||
|
property int contentHeight: 300
|
||||||
|
property int horizontalPadding: bgRoot.movableXSpace
|
||||||
|
property int verticalPadding: bgRoot.movableYSpace
|
||||||
|
command: [Quickshell.configPath("scripts/images/least_busy_region.py"),
|
||||||
|
"--screen-width", bgRoot.screen.width,
|
||||||
|
"--screen-height", bgRoot.screen.height,
|
||||||
|
"--width", contentWidth,
|
||||||
|
"--height", contentHeight,
|
||||||
|
"--horizontal-padding", horizontalPadding,
|
||||||
|
"--vertical-padding", verticalPadding,
|
||||||
|
path
|
||||||
|
]
|
||||||
|
stdout: StdioCollector {
|
||||||
|
id: leastBusyRegionOutputCollector
|
||||||
|
onStreamFinished: {
|
||||||
|
const output = leastBusyRegionOutputCollector.text
|
||||||
|
// console.log("[Background] Least busy region output:", output)
|
||||||
|
if (output.length === 0) return;
|
||||||
|
const parsedContent = JSON.parse(output)
|
||||||
|
bgRoot.clockX = parsedContent.center_x
|
||||||
|
bgRoot.clockY = parsedContent.center_y
|
||||||
|
bgRoot.dominantColor = parsedContent.dominant_color || Appearance.colors.colPrimary
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wallpaper
|
||||||
|
Image {
|
||||||
|
property real value // 0 to 1, for offset
|
||||||
|
value: {
|
||||||
|
// Range = half-groups that workspaces span on
|
||||||
|
const chunkSize = 5;
|
||||||
|
const lower = Math.floor(bgRoot.firstWorkspaceId / chunkSize) * chunkSize;
|
||||||
|
const upper = Math.ceil(bgRoot.lastWorkspaceId / chunkSize) * chunkSize;
|
||||||
|
const range = upper - lower;
|
||||||
|
return (bgRoot.monitor.activeWorkspace.id - lower) / range
|
||||||
|
+ (0.15 * GlobalStates.sidebarRightOpen * Config.options.background.parallax.enableSidebar)
|
||||||
|
- (0.15 * GlobalStates.sidebarLeftOpen * Config.options.background.parallax.enableSidebar)
|
||||||
|
}
|
||||||
|
property real effectiveValue: Math.max(0, Math.min(1, value))
|
||||||
|
x: -(bgRoot.movableXSpace) - (effectiveValue - 0.5) * 2 * bgRoot.movableXSpace
|
||||||
|
y: -(bgRoot.movableYSpace)
|
||||||
|
source: bgRoot.wallpaperPath
|
||||||
|
fillMode: Image.PreserveAspectCrop
|
||||||
|
Behavior on x {
|
||||||
|
NumberAnimation {
|
||||||
|
duration: 600
|
||||||
|
easing.type: Easing.OutCubic
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sourceSize {
|
||||||
|
width: bgRoot.screen.width * bgRoot.effectiveWallpaperScale
|
||||||
|
height: bgRoot.screen.height * bgRoot.effectiveWallpaperScale
|
||||||
|
}
|
||||||
|
|
||||||
|
// The clock
|
||||||
|
Item {
|
||||||
|
id: clock
|
||||||
|
anchors {
|
||||||
|
left: parent.left
|
||||||
|
top: parent.top
|
||||||
|
leftMargin: ((root.fixedClockPosition ? root.fixedClockX : bgRoot.clockX * bgRoot.effectiveWallpaperScale) - implicitWidth / 2)
|
||||||
|
topMargin: ((root.fixedClockPosition ? root.fixedClockY : bgRoot.clockY * bgRoot.effectiveWallpaperScale) - implicitHeight / 2)
|
||||||
|
Behavior on leftMargin {
|
||||||
|
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
|
||||||
|
}
|
||||||
|
Behavior on topMargin {
|
||||||
|
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
implicitWidth: clockColumn.implicitWidth
|
||||||
|
implicitHeight: clockColumn.implicitHeight
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
id: clockColumn
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: -5
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: bgRoot.textHorizontalAlignment
|
||||||
|
font {
|
||||||
|
family: Appearance.font.family.expressive
|
||||||
|
pixelSize: 85
|
||||||
|
weight: Font.Medium
|
||||||
|
}
|
||||||
|
color: bgRoot.colText
|
||||||
|
style: Text.Raised
|
||||||
|
styleColor: Appearance.colors.colShadow
|
||||||
|
text: DateTime.time
|
||||||
|
}
|
||||||
|
StyledText {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
horizontalAlignment: bgRoot.textHorizontalAlignment
|
||||||
|
font {
|
||||||
|
family: Appearance.font.family.expressive
|
||||||
|
pixelSize: 20
|
||||||
|
weight: Font.Medium
|
||||||
|
}
|
||||||
|
color: bgRoot.colText
|
||||||
|
style: Text.Raised
|
||||||
|
styleColor: Appearance.colors.colShadow
|
||||||
|
text: DateTime.date
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,139 +0,0 @@
|
|||||||
import "root:/"
|
|
||||||
import "root:/modules/common"
|
|
||||||
import "root:/modules/common/widgets"
|
|
||||||
import "root:/services"
|
|
||||||
import "root:/modules/common/functions/color_utils.js" as ColorUtils
|
|
||||||
import QtQuick
|
|
||||||
import QtQuick.Controls
|
|
||||||
import QtQuick.Layouts
|
|
||||||
import Quickshell
|
|
||||||
import Quickshell.Io
|
|
||||||
import Quickshell.Wayland
|
|
||||||
import Quickshell.Hyprland
|
|
||||||
import Quickshell.Services.UPower
|
|
||||||
|
|
||||||
Scope {
|
|
||||||
id: root
|
|
||||||
property string filePath: `${Directories.state}/user/generated/wallpaper/least_busy_region.json`
|
|
||||||
property real defaultX: (Config.options?.background.clockX ?? -500)
|
|
||||||
property real defaultY: (Config.options?.background.clockY ?? -500)
|
|
||||||
property real centerX: defaultX
|
|
||||||
property real centerY: defaultY
|
|
||||||
property real effectiveCenterX: Config.options?.background.fixedClockPosition ? defaultX : centerX
|
|
||||||
property real effectiveCenterY: Config.options?.background.fixedClockPosition ? defaultY : centerY
|
|
||||||
property color dominantColor: Appearance.colors.colPrimary
|
|
||||||
property bool dominantColorIsDark: dominantColor.hslLightness < 0.5
|
|
||||||
property color colBackground: ColorUtils.transparentize(ColorUtils.mix(Appearance.colors.colPrimary, Appearance.colors.colSecondaryContainer), 1)
|
|
||||||
property color colText: ColorUtils.colorWithLightness(Appearance.colors.colPrimary, (root.dominantColorIsDark ? 0.8 : 0.12))
|
|
||||||
|
|
||||||
function updateWidgetPosition(fileContent) {
|
|
||||||
// console.log("[BackgroundWidgets] Updating widget position with content:", fileContent)
|
|
||||||
const parsedContent = JSON.parse(fileContent)
|
|
||||||
root.centerX = parsedContent.center_x
|
|
||||||
root.centerY = parsedContent.center_y
|
|
||||||
root.dominantColor = parsedContent.dominant_color || Appearance.colors.colPrimary
|
|
||||||
}
|
|
||||||
|
|
||||||
Timer {
|
|
||||||
id: delayedFileRead
|
|
||||||
interval: Config.options.hacks.arbitraryRaceConditionDelay
|
|
||||||
running: false
|
|
||||||
onTriggered: {
|
|
||||||
root.updateWidgetPosition(leastBusyRegionFileView.text())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FileView {
|
|
||||||
id: leastBusyRegionFileView
|
|
||||||
path: Qt.resolvedUrl(root.filePath)
|
|
||||||
watchChanges: !Config.options?.background.fixedClockPosition
|
|
||||||
onFileChanged: {
|
|
||||||
this.reload()
|
|
||||||
delayedFileRead.start()
|
|
||||||
}
|
|
||||||
onLoadedChanged: {
|
|
||||||
const fileContent = leastBusyRegionFileView.text()
|
|
||||||
root.updateWidgetPosition(fileContent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Variants { // For each monitor
|
|
||||||
model: Quickshell.screens
|
|
||||||
|
|
||||||
LazyLoader {
|
|
||||||
required property var modelData
|
|
||||||
readonly property HyprlandMonitor monitor: Hyprland.monitorFor(modelData)
|
|
||||||
activeAsync: !ToplevelManager.activeToplevel?.activated
|
|
||||||
component: PanelWindow { // Window
|
|
||||||
id: windowRoot
|
|
||||||
screen: modelData
|
|
||||||
property var textHorizontalAlignment: root.effectiveCenterX / monitor.scale < windowRoot.width / 3 ? Text.AlignLeft :
|
|
||||||
(root.effectiveCenterX / monitor.scale > windowRoot.width * 2 / 3 ? Text.AlignRight : Text.AlignHCenter)
|
|
||||||
|
|
||||||
WlrLayershell.layer: WlrLayer.Bottom
|
|
||||||
WlrLayershell.namespace: "quickshell:backgroundWidgets"
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: true
|
|
||||||
bottom:true
|
|
||||||
left: true
|
|
||||||
right: true
|
|
||||||
}
|
|
||||||
color: "transparent"
|
|
||||||
// HyprlandWindow.visibleMask: Region { // Buggy with scaled monitors
|
|
||||||
// item: widgetBackground
|
|
||||||
// }
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: widgetBackground
|
|
||||||
property real verticalPadding: 20
|
|
||||||
property real horizontalPadding: 30
|
|
||||||
radius: 40
|
|
||||||
color: root.colBackground
|
|
||||||
implicitHeight: columnLayout.implicitHeight + verticalPadding * 2
|
|
||||||
implicitWidth: columnLayout.implicitWidth + horizontalPadding * 2
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
top: parent.top
|
|
||||||
leftMargin: (root.effectiveCenterX / monitor.scale - implicitWidth / 2)
|
|
||||||
topMargin: (root.effectiveCenterY / monitor.scale - implicitHeight / 2)
|
|
||||||
Behavior on leftMargin {
|
|
||||||
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
|
|
||||||
}
|
|
||||||
Behavior on topMargin {
|
|
||||||
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ColumnLayout {
|
|
||||||
id: columnLayout
|
|
||||||
anchors.centerIn: parent
|
|
||||||
spacing: -5
|
|
||||||
|
|
||||||
StyledText {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
horizontalAlignment: windowRoot.textHorizontalAlignment
|
|
||||||
font.pixelSize: 95
|
|
||||||
color: root.colText
|
|
||||||
style: Text.Raised
|
|
||||||
styleColor: Appearance.colors.colShadow
|
|
||||||
text: DateTime.time
|
|
||||||
}
|
|
||||||
StyledText {
|
|
||||||
Layout.fillWidth: true
|
|
||||||
horizontalAlignment: windowRoot.textHorizontalAlignment
|
|
||||||
font.pixelSize: 25
|
|
||||||
color: root.colText
|
|
||||||
style: Text.Raised
|
|
||||||
styleColor: Appearance.colors.colShadow
|
|
||||||
text: DateTime.date
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -3,7 +3,7 @@ import "root:/services"
|
|||||||
import "root:/modules/common/"
|
import "root:/modules/common/"
|
||||||
import "root:/modules/common/widgets"
|
import "root:/modules/common/widgets"
|
||||||
import "root:/modules/common/functions/color_utils.js" as ColorUtils
|
import "root:/modules/common/functions/color_utils.js" as ColorUtils
|
||||||
import "root:/modules/bar/weather"
|
import "./weather"
|
||||||
import QtQuick
|
import QtQuick
|
||||||
import QtQuick.Controls
|
import QtQuick.Controls
|
||||||
import QtQuick.Layouts
|
import QtQuick.Layouts
|
||||||
|
|||||||
@@ -158,14 +158,20 @@ Scope { // Scope
|
|||||||
spacing: 10
|
spacing: 10
|
||||||
|
|
||||||
Behavior on implicitWidth {
|
Behavior on implicitWidth {
|
||||||
|
id: contentWidthBehavior
|
||||||
|
enabled: false
|
||||||
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||||
}
|
}
|
||||||
Behavior on implicitHeight {
|
Behavior on implicitHeight {
|
||||||
|
id: contentHeightBehavior
|
||||||
|
enabled: false
|
||||||
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
currentIndex: tabBar.externalTrackedTab
|
currentIndex: tabBar.externalTrackedTab
|
||||||
onCurrentIndexChanged: {
|
onCurrentIndexChanged: {
|
||||||
|
contentWidthBehavior.enabled = true;
|
||||||
|
contentHeightBehavior.enabled = true;
|
||||||
tabBar.enableIndicatorAnimation = true;
|
tabBar.enableIndicatorAnimation = true;
|
||||||
root.selectedTab = currentIndex;
|
root.selectedTab = currentIndex;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -168,6 +168,7 @@ Singleton {
|
|||||||
property string iconNerd: "SpaceMono NF"
|
property string iconNerd: "SpaceMono NF"
|
||||||
property string monospace: "JetBrains Mono NF"
|
property string monospace: "JetBrains Mono NF"
|
||||||
property string reading: "Readex Pro"
|
property string reading: "Readex Pro"
|
||||||
|
property string expressive: "Space Grotesk"
|
||||||
}
|
}
|
||||||
property QtObject pixelSize: QtObject {
|
property QtObject pixelSize: QtObject {
|
||||||
property int smallest: 10
|
property int smallest: 10
|
||||||
|
|||||||
@@ -98,6 +98,12 @@ Singleton {
|
|||||||
property bool fixedClockPosition: false
|
property bool fixedClockPosition: false
|
||||||
property real clockX: -500
|
property real clockX: -500
|
||||||
property real clockY: -500
|
property real clockY: -500
|
||||||
|
property string wallpaperPath: Quickshell.configPath("assets/images/default_wallpaper.png")
|
||||||
|
property JsonObject parallax: JsonObject {
|
||||||
|
property bool enableWorkspace: true
|
||||||
|
property real workspaceZoom: 1.07 // Relative to your screen, not wallpaper size
|
||||||
|
property bool enableSidebar: true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property JsonObject bar: JsonObject {
|
property JsonObject bar: JsonObject {
|
||||||
|
|||||||
@@ -19,131 +19,128 @@ Scope { // Scope
|
|||||||
Variants { // For each monitor
|
Variants { // For each monitor
|
||||||
model: Quickshell.screens
|
model: Quickshell.screens
|
||||||
|
|
||||||
LazyLoader {
|
PanelWindow { // Window
|
||||||
id: dockLoader
|
|
||||||
required property var modelData
|
required property var modelData
|
||||||
activeAsync: Config.options?.dock.hoverToReveal || (!ToplevelManager.activeToplevel?.activated)
|
id: dockRoot
|
||||||
|
screen: modelData
|
||||||
|
|
||||||
component: PanelWindow { // Window
|
property bool reveal: root.pinned
|
||||||
id: dockRoot
|
|| (Config.options?.dock.hoverToReveal && dockMouseArea.containsMouse)
|
||||||
screen: dockLoader.modelData
|
|| dockApps.requestDockShow
|
||||||
|
|| (!ToplevelManager.activeToplevel?.activated)
|
||||||
|
|
||||||
property bool reveal: root.pinned
|
anchors {
|
||||||
|| (Config.options?.dock.hoverToReveal && dockMouseArea.containsMouse)
|
bottom: true
|
||||||
|| dockApps.requestDockShow
|
left: true
|
||||||
|| (!ToplevelManager.activeToplevel?.activated)
|
right: true
|
||||||
|
}
|
||||||
|
|
||||||
|
exclusiveZone: root.pinned ? implicitHeight
|
||||||
|
- (Appearance.sizes.hyprlandGapsOut)
|
||||||
|
- (Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut) : 0
|
||||||
|
|
||||||
|
implicitWidth: dockBackground.implicitWidth
|
||||||
|
WlrLayershell.namespace: "quickshell:dock"
|
||||||
|
color: "transparent"
|
||||||
|
|
||||||
|
implicitHeight: (Config.options?.dock.height ?? 70) + Appearance.sizes.elevationMargin + Appearance.sizes.hyprlandGapsOut
|
||||||
|
|
||||||
|
mask: Region {
|
||||||
|
item: dockMouseArea
|
||||||
|
}
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: dockMouseArea
|
||||||
|
height: parent.height
|
||||||
anchors {
|
anchors {
|
||||||
bottom: true
|
top: parent.top
|
||||||
left: true
|
topMargin: dockRoot.reveal ? 0 :
|
||||||
right: true
|
|
||||||
}
|
|
||||||
|
|
||||||
exclusiveZone: root.pinned ? implicitHeight
|
|
||||||
- (Appearance.sizes.hyprlandGapsOut)
|
|
||||||
- (Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut) : 0
|
|
||||||
|
|
||||||
implicitWidth: dockBackground.implicitWidth
|
|
||||||
WlrLayershell.namespace: "quickshell:dock"
|
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
implicitHeight: (Config.options?.dock.height ?? 70) + Appearance.sizes.elevationMargin + Appearance.sizes.hyprlandGapsOut
|
|
||||||
|
|
||||||
mask: Region {
|
|
||||||
item: dockMouseArea
|
|
||||||
}
|
|
||||||
|
|
||||||
MouseArea {
|
|
||||||
id: dockMouseArea
|
|
||||||
anchors.top: parent.top
|
|
||||||
height: parent.height
|
|
||||||
anchors.topMargin: dockRoot.reveal ? 0 :
|
|
||||||
Config.options?.dock.hoverToReveal ? (dockRoot.implicitHeight - Config.options.dock.hoverRegionHeight) :
|
Config.options?.dock.hoverToReveal ? (dockRoot.implicitHeight - Config.options.dock.hoverRegionHeight) :
|
||||||
(dockRoot.implicitHeight + 1)
|
(dockRoot.implicitHeight + 1)
|
||||||
|
horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
implicitWidth: dockHoverRegion.implicitWidth + Appearance.sizes.elevationMargin * 2
|
||||||
|
hoverEnabled: true
|
||||||
|
|
||||||
anchors.left: parent.left
|
Behavior on anchors.topMargin {
|
||||||
anchors.right: parent.right
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
||||||
hoverEnabled: true
|
}
|
||||||
|
|
||||||
Behavior on anchors.topMargin {
|
Item {
|
||||||
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
id: dockHoverRegion
|
||||||
}
|
anchors.fill: parent
|
||||||
|
implicitWidth: dockBackground.implicitWidth
|
||||||
|
|
||||||
Item {
|
Item { // Wrapper for the dock background
|
||||||
id: dockHoverRegion
|
id: dockBackground
|
||||||
anchors.fill: parent
|
anchors {
|
||||||
|
top: parent.top
|
||||||
|
bottom: parent.bottom
|
||||||
|
horizontalCenter: parent.horizontalCenter
|
||||||
|
}
|
||||||
|
|
||||||
Item { // Wrapper for the dock background
|
implicitWidth: dockRow.implicitWidth + 5 * 2
|
||||||
id: dockBackground
|
height: parent.height - Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
bottom: parent.bottom
|
|
||||||
horizontalCenter: parent.horizontalCenter
|
|
||||||
}
|
|
||||||
|
|
||||||
implicitWidth: dockRow.implicitWidth + 5 * 2
|
StyledRectangularShadow {
|
||||||
height: parent.height - Appearance.sizes.elevationMargin - Appearance.sizes.hyprlandGapsOut
|
target: dockVisualBackground
|
||||||
|
}
|
||||||
|
Rectangle { // The real rectangle that is visible
|
||||||
|
id: dockVisualBackground
|
||||||
|
property real margin: Appearance.sizes.elevationMargin
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.topMargin: Appearance.sizes.elevationMargin
|
||||||
|
anchors.bottomMargin: Appearance.sizes.hyprlandGapsOut
|
||||||
|
color: Appearance.colors.colLayer0
|
||||||
|
border.width: 1
|
||||||
|
border.color: Appearance.m3colors.m3outlineVariant
|
||||||
|
radius: Appearance.rounding.large
|
||||||
|
}
|
||||||
|
|
||||||
StyledRectangularShadow {
|
RowLayout {
|
||||||
target: dockVisualBackground
|
id: dockRow
|
||||||
}
|
anchors.top: parent.top
|
||||||
Rectangle { // The real rectangle that is visible
|
anchors.bottom: parent.bottom
|
||||||
id: dockVisualBackground
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
property real margin: Appearance.sizes.elevationMargin
|
spacing: 3
|
||||||
anchors.fill: parent
|
property real padding: 5
|
||||||
anchors.topMargin: Appearance.sizes.elevationMargin
|
|
||||||
anchors.bottomMargin: Appearance.sizes.hyprlandGapsOut
|
|
||||||
color: Appearance.colors.colLayer0
|
|
||||||
border.width: 1
|
|
||||||
border.color: Appearance.m3colors.m3outlineVariant
|
|
||||||
radius: Appearance.rounding.large
|
|
||||||
}
|
|
||||||
|
|
||||||
RowLayout {
|
VerticalButtonGroup {
|
||||||
id: dockRow
|
Layout.topMargin: Appearance.sizes.hyprlandGapsOut // why does this work
|
||||||
anchors.top: parent.top
|
GroupButton { // Pin button
|
||||||
anchors.bottom: parent.bottom
|
baseWidth: 35
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
baseHeight: 35
|
||||||
spacing: 3
|
clickedWidth: baseWidth
|
||||||
property real padding: 5
|
clickedHeight: baseHeight + 20
|
||||||
|
buttonRadius: Appearance.rounding.normal
|
||||||
VerticalButtonGroup {
|
toggled: root.pinned
|
||||||
Layout.topMargin: Appearance.sizes.hyprlandGapsOut // why does this work
|
onClicked: root.pinned = !root.pinned
|
||||||
GroupButton { // Pin button
|
contentItem: MaterialSymbol {
|
||||||
baseWidth: 35
|
text: "keep"
|
||||||
baseHeight: 35
|
horizontalAlignment: Text.AlignHCenter
|
||||||
clickedWidth: baseWidth
|
iconSize: Appearance.font.pixelSize.larger
|
||||||
clickedHeight: baseHeight + 20
|
color: root.pinned ? Appearance.m3colors.m3onPrimary : Appearance.colors.colOnLayer0
|
||||||
buttonRadius: Appearance.rounding.normal
|
|
||||||
toggled: root.pinned
|
|
||||||
onClicked: root.pinned = !root.pinned
|
|
||||||
contentItem: MaterialSymbol {
|
|
||||||
text: "keep"
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
|
||||||
iconSize: Appearance.font.pixelSize.larger
|
|
||||||
color: root.pinned ? Appearance.m3colors.m3onPrimary : Appearance.colors.colOnLayer0
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DockSeparator {}
|
}
|
||||||
DockApps { id: dockApps; }
|
DockSeparator {}
|
||||||
DockSeparator {}
|
DockApps { id: dockApps; }
|
||||||
DockButton {
|
DockSeparator {}
|
||||||
Layout.fillHeight: true
|
DockButton {
|
||||||
onClicked: Hyprland.dispatch("global quickshell:overviewToggle")
|
Layout.fillHeight: true
|
||||||
contentItem: MaterialSymbol {
|
onClicked: Hyprland.dispatch("global quickshell:overviewToggle")
|
||||||
anchors.fill: parent
|
contentItem: MaterialSymbol {
|
||||||
horizontalAlignment: Text.AlignHCenter
|
anchors.fill: parent
|
||||||
font.pixelSize: parent.width / 2
|
horizontalAlignment: Text.AlignHCenter
|
||||||
text: "apps"
|
font.pixelSize: parent.width / 2
|
||||||
color: Appearance.colors.colOnLayer0
|
text: "apps"
|
||||||
}
|
color: Appearance.colors.colOnLayer0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ Item { // Player instance
|
|||||||
|
|
||||||
Rectangle {
|
Rectangle {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
color: ColorUtils.transparentize(blendedColors.colLayer0, 0.25)
|
color: ColorUtils.transparentize(blendedColors.colLayer0, 0.3)
|
||||||
radius: root.popupRounding
|
radius: root.popupRounding
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,11 +37,8 @@ Scope {
|
|||||||
// item: GlobalStates.overviewOpen ? columnLayout : null
|
// item: GlobalStates.overviewOpen ? columnLayout : null
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
anchors {
|
anchors {
|
||||||
top: true
|
top: true
|
||||||
left: true
|
|
||||||
right: true
|
|
||||||
bottom: true
|
bottom: true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,6 +82,7 @@ Scope {
|
|||||||
|
|
||||||
function setSearchingText(text) {
|
function setSearchingText(text) {
|
||||||
searchWidget.setSearchingText(text);
|
searchWidget.setSearchingText(text);
|
||||||
|
searchWidget.focusFirstItemIfNeeded();
|
||||||
}
|
}
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
|
|||||||
@@ -396,6 +396,8 @@ Item { // Wrapper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onModelChanged: root.focusFirstItemIfNeeded()
|
||||||
|
|
||||||
delegate: SearchItem {
|
delegate: SearchItem {
|
||||||
// The selectable item for each search result
|
// The selectable item for each search result
|
||||||
required property var modelData
|
required property var modelData
|
||||||
|
|||||||
@@ -11,77 +11,56 @@ Scope {
|
|||||||
id: screenCorners
|
id: screenCorners
|
||||||
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
|
readonly property Toplevel activeWindow: ToplevelManager.activeToplevel
|
||||||
|
|
||||||
|
component CornerPanelWindow: PanelWindow {
|
||||||
|
id: cornerPanelWindow
|
||||||
|
visible: (Config.options.appearance.fakeScreenRounding === 1 || (Config.options.appearance.fakeScreenRounding === 2 && !activeWindow?.fullscreen))
|
||||||
|
property var corner
|
||||||
|
|
||||||
|
exclusionMode: ExclusionMode.Ignore
|
||||||
|
mask: Region {
|
||||||
|
item: null
|
||||||
|
}
|
||||||
|
WlrLayershell.namespace: "quickshell:screenCorners"
|
||||||
|
WlrLayershell.layer: WlrLayer.Overlay
|
||||||
|
color: "transparent"
|
||||||
|
|
||||||
|
anchors {
|
||||||
|
top: cornerPanelWindow.corner === RoundCorner.CornerEnum.TopLeft || cornerPanelWindow.corner === RoundCorner.CornerEnum.TopRight
|
||||||
|
left: cornerPanelWindow.corner === RoundCorner.CornerEnum.TopLeft || cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomLeft
|
||||||
|
bottom: cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomLeft || cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomRight
|
||||||
|
right: cornerPanelWindow.corner === RoundCorner.CornerEnum.TopRight || cornerPanelWindow.corner === RoundCorner.CornerEnum.BottomRight
|
||||||
|
}
|
||||||
|
|
||||||
|
implicitWidth: cornerWidget.implicitWidth
|
||||||
|
implicitHeight: cornerWidget.implicitHeight
|
||||||
|
RoundCorner {
|
||||||
|
id: cornerWidget
|
||||||
|
size: Appearance.rounding.screenRounding
|
||||||
|
corner: cornerPanelWindow.corner
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Variants {
|
Variants {
|
||||||
model: Quickshell.screens
|
model: Quickshell.screens
|
||||||
|
|
||||||
PanelWindow {
|
Scope {
|
||||||
visible: (Config.options.appearance.fakeScreenRounding === 1
|
required property var modelData
|
||||||
|| (Config.options.appearance.fakeScreenRounding === 2
|
CornerPanelWindow {
|
||||||
&& !activeWindow?.fullscreen))
|
screen: modelData
|
||||||
|
|
||||||
property var modelData
|
|
||||||
|
|
||||||
screen: modelData
|
|
||||||
exclusionMode: ExclusionMode.Ignore
|
|
||||||
mask: Region {
|
|
||||||
item: null
|
|
||||||
}
|
|
||||||
// HyprlandWindow.visibleMask: Region {
|
|
||||||
// Region {
|
|
||||||
// item: topLeftCorner
|
|
||||||
// }
|
|
||||||
// Region {
|
|
||||||
// item: topRightCorner
|
|
||||||
// }
|
|
||||||
// Region {
|
|
||||||
// item: bottomLeftCorner
|
|
||||||
// }
|
|
||||||
// Region {
|
|
||||||
// item: bottomRightCorner
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
WlrLayershell.namespace: "quickshell:screenCorners"
|
|
||||||
WlrLayershell.layer: WlrLayer.Overlay
|
|
||||||
color: "transparent"
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: true
|
|
||||||
left: true
|
|
||||||
right: true
|
|
||||||
bottom: true
|
|
||||||
}
|
|
||||||
|
|
||||||
RoundCorner {
|
|
||||||
id: topLeftCorner
|
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.left: parent.left
|
|
||||||
size: Appearance.rounding.screenRounding
|
|
||||||
corner: RoundCorner.CornerEnum.TopLeft
|
corner: RoundCorner.CornerEnum.TopLeft
|
||||||
}
|
}
|
||||||
RoundCorner {
|
CornerPanelWindow {
|
||||||
id: topRightCorner
|
screen: modelData
|
||||||
anchors.top: parent.top
|
|
||||||
anchors.right: parent.right
|
|
||||||
size: Appearance.rounding.screenRounding
|
|
||||||
corner: RoundCorner.CornerEnum.TopRight
|
corner: RoundCorner.CornerEnum.TopRight
|
||||||
}
|
}
|
||||||
RoundCorner {
|
CornerPanelWindow {
|
||||||
id: bottomLeftCorner
|
screen: modelData
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.left: parent.left
|
|
||||||
size: Appearance.rounding.screenRounding
|
|
||||||
corner: RoundCorner.CornerEnum.BottomLeft
|
corner: RoundCorner.CornerEnum.BottomLeft
|
||||||
}
|
}
|
||||||
RoundCorner {
|
CornerPanelWindow {
|
||||||
id: bottomRightCorner
|
screen: modelData
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
size: Appearance.rounding.screenRounding
|
|
||||||
corner: RoundCorner.CornerEnum.BottomRight
|
corner: RoundCorner.CornerEnum.BottomRight
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,6 @@ Scope {
|
|||||||
StyledText { // Small instruction
|
StyledText { // Small instruction
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
font.family: Appearance.font.family.title
|
|
||||||
font.pixelSize: Appearance.font.pixelSize.normal
|
font.pixelSize: Appearance.font.pixelSize.normal
|
||||||
text: Translation.tr("Arrow keys to navigate, Enter to select\nEsc or click anywhere to cancel")
|
text: Translation.tr("Arrow keys to navigate, Enter to select\nEsc or click anywhere to cancel")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -438,7 +438,7 @@ Inline w/ backslash and round brackets \\(e^{i\\pi} + 1 = 0\\)
|
|||||||
return {
|
return {
|
||||||
name: `${messageInputField.text.trim().split(" ").length == 1 ? (root.commandPrefix + "save ") : ""}${chatName}`,
|
name: `${messageInputField.text.trim().split(" ").length == 1 ? (root.commandPrefix + "save ") : ""}${chatName}`,
|
||||||
displayName: `${chatName}`,
|
displayName: `${chatName}`,
|
||||||
description: Translation.tr("Save chat from %1").arg(chatName),
|
description: Translation.tr("Save chat to %1").arg(chatName),
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else if (messageInputField.text.startsWith(`${root.commandPrefix}load`)) {
|
} else if (messageInputField.text.startsWith(`${root.commandPrefix}load`)) {
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ CONFIG_DIR="$XDG_CONFIG_HOME/quickshell/$QUICKSHELL_CONFIG_NAME"
|
|||||||
CACHE_DIR="$XDG_CACHE_HOME/quickshell"
|
CACHE_DIR="$XDG_CACHE_HOME/quickshell"
|
||||||
STATE_DIR="$XDG_STATE_HOME/quickshell"
|
STATE_DIR="$XDG_STATE_HOME/quickshell"
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
SHELL_CONFIG_FILE="$XDG_CONFIG_HOME/illogical-impulse/config.json"
|
||||||
MATUGEN_DIR="$XDG_CONFIG_HOME/matugen"
|
MATUGEN_DIR="$XDG_CONFIG_HOME/matugen"
|
||||||
terminalscheme="$SCRIPT_DIR/terminal/scheme-base.json"
|
terminalscheme="$SCRIPT_DIR/terminal/scheme-base.json"
|
||||||
|
|
||||||
@@ -59,14 +60,14 @@ post_process() {
|
|||||||
handle_kde_material_you_colors &
|
handle_kde_material_you_colors &
|
||||||
|
|
||||||
# Determine the largest region on the wallpaper that's sufficiently un-busy to put widgets in
|
# Determine the largest region on the wallpaper that's sufficiently un-busy to put widgets in
|
||||||
if [ ! -f "$MATUGEN_DIR/scripts/least_busy_region.py" ]; then
|
# if [ ! -f "$MATUGEN_DIR/scripts/least_busy_region.py" ]; then
|
||||||
echo "Error: least_busy_region.py script not found in $MATUGEN_DIR/scripts/"
|
# echo "Error: least_busy_region.py script not found in $MATUGEN_DIR/scripts/"
|
||||||
else
|
# else
|
||||||
"$MATUGEN_DIR/scripts/least_busy_region.py" \
|
# "$MATUGEN_DIR/scripts/least_busy_region.py" \
|
||||||
--screen-width "$screen_width" --screen-height "$screen_height" \
|
# --screen-width "$screen_width" --screen-height "$screen_height" \
|
||||||
--width 300 --height 200 \
|
# --width 300 --height 200 \
|
||||||
"$wallpaper_path" > "$STATE_DIR"/user/generated/wallpaper/least_busy_region.json
|
# "$wallpaper_path" > "$STATE_DIR"/user/generated/wallpaper/least_busy_region.json
|
||||||
fi
|
# fi
|
||||||
}
|
}
|
||||||
|
|
||||||
check_and_prompt_upscale() {
|
check_and_prompt_upscale() {
|
||||||
@@ -227,10 +228,10 @@ switch() {
|
|||||||
else
|
else
|
||||||
matugen_args=(image "$imgpath")
|
matugen_args=(image "$imgpath")
|
||||||
generate_colors_material_args=(--path "$imgpath")
|
generate_colors_material_args=(--path "$imgpath")
|
||||||
# Set wallpaper with swww
|
# Update wallpaper path in config
|
||||||
swww img "$imgpath" --transition-step 100 --transition-fps 120 \
|
if [ -f "$SHELL_CONFIG_FILE" ]; then
|
||||||
--transition-type grow --transition-angle 30 --transition-duration 1 \
|
jq --arg path "$imgpath" '.background.wallpaperPath = $path' "$SHELL_CONFIG_FILE" > "$SHELL_CONFIG_FILE.tmp" && mv "$SHELL_CONFIG_FILE.tmp" "$SHELL_CONFIG_FILE"
|
||||||
--transition-pos "$cursorposx, $cursorposy_inverted" &
|
fi
|
||||||
remove_restore
|
remove_restore
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -318,7 +319,7 @@ main() {
|
|||||||
;;
|
;;
|
||||||
--noswitch)
|
--noswitch)
|
||||||
noswitch_flag="1"
|
noswitch_flag="1"
|
||||||
imgpath=$(swww query | head -1 | awk -F 'image: ' '{print $2}')
|
imgpath=$(jq -r '.background.wallpaperPath' "$SHELL_CONFIG_FILE" 2>/dev/null || echo "")
|
||||||
shift
|
shift
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
|||||||
+17
-14
@@ -18,7 +18,7 @@ def center_crop(img, target_w, target_h):
|
|||||||
y2 = y1 + target_h
|
y2 = y1 + target_h
|
||||||
return img[y1:y2, x1:x2]
|
return img[y1:y2, x1:x2]
|
||||||
|
|
||||||
def find_least_busy_region(image_path, region_width=300, region_height=200, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", padding=50):
|
def find_least_busy_region(image_path, region_width=300, region_height=200, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", horizontal_padding=50, vertical_padding=50):
|
||||||
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
|
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
|
||||||
if img is None:
|
if img is None:
|
||||||
raise FileNotFoundError(f"Image not found: {image_path}")
|
raise FileNotFoundError(f"Image not found: {image_path}")
|
||||||
@@ -59,10 +59,10 @@ def find_least_busy_region(image_path, region_width=300, region_height=200, scre
|
|||||||
min_var = None
|
min_var = None
|
||||||
min_coords = (0, 0)
|
min_coords = (0, 0)
|
||||||
area = region_width * region_height
|
area = region_width * region_height
|
||||||
x_start = padding
|
x_start = horizontal_padding
|
||||||
y_start = padding
|
y_start = vertical_padding
|
||||||
x_end = w - region_width - padding + 1
|
x_end = w - region_width - horizontal_padding + 1
|
||||||
y_end = h - region_height - padding + 1
|
y_end = h - region_height - vertical_padding + 1
|
||||||
for y in range(y_start, max(y_end, y_start+1), stride):
|
for y in range(y_start, max(y_end, y_start+1), stride):
|
||||||
for x in range(x_start, max(x_end, x_start+1), stride):
|
for x in range(x_start, max(x_end, x_start+1), stride):
|
||||||
x1, y1 = x, y
|
x1, y1 = x, y
|
||||||
@@ -76,7 +76,7 @@ def find_least_busy_region(image_path, region_width=300, region_height=200, scre
|
|||||||
min_coords = (x, y)
|
min_coords = (x, y)
|
||||||
return min_coords, min_var
|
return min_coords, min_var
|
||||||
|
|
||||||
def find_largest_region(image_path, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", threshold=100.0, aspect_ratio=1.0, padding=50):
|
def find_largest_region(image_path, screen_width=None, screen_height=None, verbose=False, stride=2, screen_mode="fill", threshold=100.0, aspect_ratio=1.0, horizontal_padding=50, vertical_padding=50):
|
||||||
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
|
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
|
||||||
if img is None:
|
if img is None:
|
||||||
raise FileNotFoundError(f"Image not found: {image_path}")
|
raise FileNotFoundError(f"Image not found: {image_path}")
|
||||||
@@ -130,10 +130,10 @@ def find_largest_region(image_path, screen_width=None, screen_height=None, verbo
|
|||||||
max_size = mid - 1
|
max_size = mid - 1
|
||||||
continue
|
continue
|
||||||
found = False
|
found = False
|
||||||
x_start = padding
|
x_start = horizontal_padding
|
||||||
y_start = padding
|
y_start = vertical_padding
|
||||||
x_end = w - region_w - padding + 1
|
x_end = w - region_w - horizontal_padding + 1
|
||||||
y_end = h - region_h - padding + 1
|
y_end = h - region_h - vertical_padding + 1
|
||||||
for y in range(y_start, max(y_end, y_start+1), stride):
|
for y in range(y_start, max(y_end, y_start+1), stride):
|
||||||
for x in range(x_start, max(x_end, x_start+1), stride):
|
for x in range(x_start, max(x_end, x_start+1), stride):
|
||||||
x1, y1 = x, y
|
x1, y1 = x, y
|
||||||
@@ -257,13 +257,14 @@ def main():
|
|||||||
parser.add_argument("-v", "--visual-output", action="store_true", help="Output image with rectangle")
|
parser.add_argument("-v", "--visual-output", action="store_true", help="Output image with rectangle")
|
||||||
parser.add_argument("--screen-width", type=int, default=1920, help="Screen width for wallpaper scaling")
|
parser.add_argument("--screen-width", type=int, default=1920, help="Screen width for wallpaper scaling")
|
||||||
parser.add_argument("--screen-height", type=int, default=1080, help="Screen height for wallpaper scaling")
|
parser.add_argument("--screen-height", type=int, default=1080, help="Screen height for wallpaper scaling")
|
||||||
parser.add_argument("--stride", type=int, default=4, help="Step size for sliding window (higher is faster, less precise)")
|
parser.add_argument("--stride", type=int, default=10, help="Step size for sliding window (higher is faster, less precise)")
|
||||||
parser.add_argument("--screen-mode", choices=["fill", "fit"], default="fill", help="Wallpaper scaling mode: 'fill' (default) or 'fit'")
|
parser.add_argument("--screen-mode", choices=["fill", "fit"], default="fill", help="Wallpaper scaling mode: 'fill' (default) or 'fit'")
|
||||||
parser.add_argument("--verbose", action="store_true", help="Print verbose output")
|
parser.add_argument("--verbose", action="store_true", help="Print verbose output")
|
||||||
parser.add_argument("-l", "--largest-region", action="store_true", help="Find the largest region under the variance threshold and output its center")
|
parser.add_argument("-l", "--largest-region", action="store_true", help="Find the largest region under the variance threshold and output its center")
|
||||||
parser.add_argument("-t", "--variance-threshold", type=float, default=1000.0, help="Variance threshold for largest region mode")
|
parser.add_argument("-t", "--variance-threshold", type=float, default=1000.0, help="Variance threshold for largest region mode")
|
||||||
parser.add_argument("--aspect-ratio", type=float, default=1.78, help="Aspect ratio (width/height) for largest region mode")
|
parser.add_argument("--aspect-ratio", type=float, default=1.78, help="Aspect ratio (width/height) for largest region mode")
|
||||||
parser.add_argument("--padding", type=int, default=50, help="Minimum distance from region to image edge (default: 50)")
|
parser.add_argument("--horizontal-padding", "-hp", type=int, default=50, help="Minimum horizontal distance from region to image edge")
|
||||||
|
parser.add_argument("--vertical-padding", "-vp", type=int, default=50, help="Minimum vertical distance from region to image edge")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
if args.largest_region:
|
if args.largest_region:
|
||||||
@@ -276,7 +277,8 @@ def main():
|
|||||||
screen_mode=args.screen_mode,
|
screen_mode=args.screen_mode,
|
||||||
threshold=args.variance_threshold,
|
threshold=args.variance_threshold,
|
||||||
aspect_ratio=args.aspect_ratio,
|
aspect_ratio=args.aspect_ratio,
|
||||||
padding=args.padding
|
horizontal_padding=args.horizontal_padding,
|
||||||
|
vertical_padding=args.vertical_padding
|
||||||
)
|
)
|
||||||
if center:
|
if center:
|
||||||
if args.visual_output:
|
if args.visual_output:
|
||||||
@@ -312,7 +314,8 @@ def main():
|
|||||||
verbose=args.verbose,
|
verbose=args.verbose,
|
||||||
stride=args.stride,
|
stride=args.stride,
|
||||||
screen_mode=args.screen_mode,
|
screen_mode=args.screen_mode,
|
||||||
padding=args.padding
|
horizontal_padding=args.horizontal_padding,
|
||||||
|
vertical_padding=args.vertical_padding
|
||||||
)
|
)
|
||||||
if args.visual_output:
|
if args.visual_output:
|
||||||
draw_region(args.image_path, coords, region_width=args.width, region_height=args.height, screen_width=args.screen_width, screen_height=args.screen_height, screen_mode=args.screen_mode)
|
draw_region(args.image_path, coords, region_width=args.width, region_height=args.height, screen_width=args.screen_width, screen_height=args.screen_height, screen_mode=args.screen_mode)
|
||||||
@@ -27,7 +27,7 @@ Singleton {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function handleFirstRun() {
|
function handleFirstRun() {
|
||||||
Quickshell.execDetached(["bash", "-c", `swww query | grep 'image' || '${Directories.wallpaperSwitchScriptPath}' '${root.defaultWallpaperPath}'`])
|
Quickshell.execDetached([Directories.wallpaperSwitchScriptPath, root.defaultWallpaperPath])
|
||||||
Quickshell.execDetached(["bash", "-c", `qs -p '${root.welcomeQmlPath}'`])
|
Quickshell.execDetached(["bash", "-c", `qs -p '${root.welcomeQmlPath}'`])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Singleton {
|
|||||||
Process {
|
Process {
|
||||||
id: getDefaultKeybinds
|
id: getDefaultKeybinds
|
||||||
running: true
|
running: true
|
||||||
command: [root.keybindParserPath, "--path", root.defaultKeybindConfigPath,]
|
command: [root.keybindParserPath, "--path", root.defaultKeybindConfigPath]
|
||||||
|
|
||||||
stdout: SplitParser {
|
stdout: SplitParser {
|
||||||
onRead: data => {
|
onRead: data => {
|
||||||
|
|||||||
@@ -36,9 +36,9 @@ Singleton {
|
|||||||
const nameMatch = textOsRelease.match(/^NAME="(.+?)"/m)
|
const nameMatch = textOsRelease.match(/^NAME="(.+?)"/m)
|
||||||
distroName = prettyNameMatch ? prettyNameMatch[1] : (nameMatch ? nameMatch[1].replace(/Linux/i, "").trim() : "Unknown")
|
distroName = prettyNameMatch ? prettyNameMatch[1] : (nameMatch ? nameMatch[1].replace(/Linux/i, "").trim() : "Unknown")
|
||||||
|
|
||||||
// Extract the ID (LOGO field, fallback to "unknown")
|
// Extract the ID
|
||||||
const logoMatch = textOsRelease.match(/^LOGO=(.+)$/m)
|
const idMatch = textOsRelease.match(/^ID="?(.+?)"?$/m)
|
||||||
distroId = logoMatch ? logoMatch[1].replace(/"/g, "") : "unknown"
|
distroId = idMatch ? idMatch[1] : "unknown"
|
||||||
|
|
||||||
// Extract additional URLs and logo
|
// Extract additional URLs and logo
|
||||||
const homeUrlMatch = textOsRelease.match(/^HOME_URL="(.+?)"/m)
|
const homeUrlMatch = textOsRelease.match(/^HOME_URL="(.+?)"/m)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
//@ pragma Env QT_SCALE_FACTOR=1
|
//@ pragma Env QT_SCALE_FACTOR=1
|
||||||
|
|
||||||
import "./modules/common/"
|
import "./modules/common/"
|
||||||
import "./modules/backgroundWidgets/"
|
import "./modules/background/"
|
||||||
import "./modules/bar/"
|
import "./modules/bar/"
|
||||||
import "./modules/cheatsheet/"
|
import "./modules/cheatsheet/"
|
||||||
import "./modules/dock/"
|
import "./modules/dock/"
|
||||||
@@ -30,7 +30,7 @@ ShellRoot {
|
|||||||
// Enable/disable modules here. False = not loaded at all, so rest assured
|
// Enable/disable modules here. False = not loaded at all, so rest assured
|
||||||
// no unnecessary stuff will take up memory if you decide to only use, say, the overview.
|
// no unnecessary stuff will take up memory if you decide to only use, say, the overview.
|
||||||
property bool enableBar: true
|
property bool enableBar: true
|
||||||
property bool enableBackgroundWidgets: true
|
property bool enableBackground: true
|
||||||
property bool enableCheatsheet: true
|
property bool enableCheatsheet: true
|
||||||
property bool enableDock: true
|
property bool enableDock: true
|
||||||
property bool enableMediaControls: true
|
property bool enableMediaControls: true
|
||||||
@@ -53,7 +53,7 @@ ShellRoot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
LazyLoader { active: enableBar; component: Bar {} }
|
LazyLoader { active: enableBar; component: Bar {} }
|
||||||
LazyLoader { active: enableBackgroundWidgets; component: BackgroundWidgets {} }
|
LazyLoader { active: enableBackground; component: Background {} }
|
||||||
LazyLoader { active: enableCheatsheet; component: Cheatsheet {} }
|
LazyLoader { active: enableCheatsheet; component: Cheatsheet {} }
|
||||||
LazyLoader { active: enableDock && Config.options.dock.enable; component: Dock {} }
|
LazyLoader { active: enableDock && Config.options.dock.enable; component: Dock {} }
|
||||||
LazyLoader { active: enableMediaControls; component: MediaControls {} }
|
LazyLoader { active: enableMediaControls; component: MediaControls {} }
|
||||||
|
|||||||
+3
-3
@@ -1,4 +1,4 @@
|
|||||||
# Contributing
|
# Contributing
|
||||||
- Please understand that dotfiles are personal
|
- Please understand that dotfiles are after all personal. I can accept features I do not personally want, but in that case I will ask you to make it configurable/optionally loaded
|
||||||
- If you make new stuff, I'll probably nitpick as I want quality
|
- If you add new stuff, it's a good idea to ask me first to not waste your work
|
||||||
- FFS pls make multiple PRs if you have many features 😭🙏
|
- Please make multiple PRs if you have many features
|
||||||
|
|||||||
@@ -74,11 +74,17 @@
|
|||||||
<h3></h3>
|
<h3></h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div align="center">
|
<table style="border-collapse: collapse;">
|
||||||
<img src=".github/assets/illogical-impulse.svg" alt="illogical-impulse logo">
|
<tr>
|
||||||
</div>
|
<td width="25%">
|
||||||
|
<img src=".github/assets/illogical-impulse.svg" alt="illogical-impulse logo" style="float:left; width:100%;">
|
||||||
|
</td>
|
||||||
|
<td width="75%">
|
||||||
|
<i>latest and only style that I actively use. Other past styles are still there for your viewing pleasure and not actual use, but code is still available, see below.</i>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
_latest and only style that I actively use. Other past styles are still there for your viewing pleasure and not actual use, but code is still available, see below._
|
|
||||||
|
|
||||||
### illogical-impulse<sup>Quickshell</sup>
|
### illogical-impulse<sup>Quickshell</sup>
|
||||||
|
|
||||||
@@ -152,6 +158,8 @@ Widget system: AGS | Support: Limited, no new features
|
|||||||
- EWW: [fufexan's config](https://github.com/fufexan/dotfiles) (he thanks more people there btw)
|
- EWW: [fufexan's config](https://github.com/fufexan/dotfiles) (he thanks more people there btw)
|
||||||
- AI bots for providing useful examples
|
- 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>
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ depends=(
|
|||||||
kde-material-you-colors
|
kde-material-you-colors
|
||||||
kitty
|
kitty
|
||||||
matugen-bin
|
matugen-bin
|
||||||
|
otf-space-grotesk
|
||||||
starship
|
starship
|
||||||
ttf-gabarito-git
|
ttf-gabarito-git
|
||||||
ttf-jetbrains-mono-nerd
|
ttf-jetbrains-mono-nerd
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ depends=(
|
|||||||
hyprpicker
|
hyprpicker
|
||||||
nm-connection-editor
|
nm-connection-editor
|
||||||
quickshell-git
|
quickshell-git
|
||||||
swww
|
|
||||||
translate-shell
|
translate-shell
|
||||||
wlogout
|
wlogout
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user