feat: impl variant launcher action
This commit is contained in:
parent
f14d00d3dc
commit
746f41da16
5 changed files with 183 additions and 7 deletions
|
|
@ -15,11 +15,14 @@ ListView {
|
||||||
|
|
||||||
property bool isAction: search.text.startsWith(Config.launcher.actionPrefix)
|
property bool isAction: search.text.startsWith(Config.launcher.actionPrefix)
|
||||||
property bool isScheme: search.text.startsWith(`${Config.launcher.actionPrefix}scheme `)
|
property bool isScheme: search.text.startsWith(`${Config.launcher.actionPrefix}scheme `)
|
||||||
|
property bool isVariant: search.text.startsWith(`${Config.launcher.actionPrefix}variant `)
|
||||||
|
|
||||||
function getModelValues() {
|
function getModelValues() {
|
||||||
let text = search.text;
|
let text = search.text;
|
||||||
if (isScheme)
|
if (isScheme)
|
||||||
return Schemes.fuzzyQuery(text);
|
return Schemes.fuzzyQuery(text);
|
||||||
|
if (isVariant)
|
||||||
|
return M3Variants.fuzzyQuery(text);
|
||||||
if (isAction)
|
if (isAction)
|
||||||
return Actions.fuzzyQuery(text);
|
return Actions.fuzzyQuery(text);
|
||||||
if (text.startsWith(Config.launcher.actionPrefix))
|
if (text.startsWith(Config.launcher.actionPrefix))
|
||||||
|
|
@ -48,6 +51,8 @@ ListView {
|
||||||
delegate: {
|
delegate: {
|
||||||
if (isScheme)
|
if (isScheme)
|
||||||
return schemeItem;
|
return schemeItem;
|
||||||
|
if (isVariant)
|
||||||
|
return variantItem;
|
||||||
if (isAction)
|
if (isAction)
|
||||||
return actionItem;
|
return actionItem;
|
||||||
return appItem;
|
return appItem;
|
||||||
|
|
@ -122,7 +127,15 @@ ListView {
|
||||||
id: schemeItem
|
id: schemeItem
|
||||||
|
|
||||||
SchemeItem {
|
SchemeItem {
|
||||||
visibilities: root.visibilities
|
list: root
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: variantItem
|
||||||
|
|
||||||
|
VariantItem {
|
||||||
|
list: root
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -134,6 +147,10 @@ ListView {
|
||||||
ChangeAnim {}
|
ChangeAnim {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Behavior on isVariant {
|
||||||
|
ChangeAnim {}
|
||||||
|
}
|
||||||
|
|
||||||
component ChangeAnim: SequentialAnimation {
|
component ChangeAnim: SequentialAnimation {
|
||||||
ParallelAnimation {
|
ParallelAnimation {
|
||||||
Anim {
|
Anim {
|
||||||
|
|
|
||||||
91
modules/launcher/M3Variants.qml
Normal file
91
modules/launcher/M3Variants.qml
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
pragma Singleton
|
||||||
|
|
||||||
|
import "root:/utils/scripts/fuzzysort.js" as Fuzzy
|
||||||
|
import "root:/config"
|
||||||
|
import Quickshell
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Singleton {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
readonly property list<Variant> list: [
|
||||||
|
Variant {
|
||||||
|
variant: "vibrant"
|
||||||
|
icon: "sentiment_very_dissatisfied"
|
||||||
|
name: "Vibrant"
|
||||||
|
description: "A high chroma palette. The primary palette's chroma is at maximum."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "tonalspot"
|
||||||
|
icon: "android"
|
||||||
|
name: "Tonal Spot"
|
||||||
|
description: "Default for Material theme colours. A pastel palette with a low chroma."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "expressive"
|
||||||
|
icon: "compare_arrows"
|
||||||
|
name: "Expressive"
|
||||||
|
description: "A medium chroma palette. The primary palette's hue is different from the seed colour, for variety."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "fidelity"
|
||||||
|
icon: "compare"
|
||||||
|
name: "Fidelity"
|
||||||
|
description: "Matches the seed colour, even if the seed colour is very bright (high chroma)."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "content"
|
||||||
|
icon: "sentiment_calm"
|
||||||
|
name: "Content"
|
||||||
|
description: "Almost identical to fidelity."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "fruitsalad"
|
||||||
|
icon: "nutrition"
|
||||||
|
name: "Fruit Salad"
|
||||||
|
description: "A playful theme - the seed colour's hue does not appear in the theme."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "rainbow"
|
||||||
|
icon: "looks"
|
||||||
|
name: "Rainbow"
|
||||||
|
description: "A playful theme - the seed colour's hue does not appear in the theme."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "neutral"
|
||||||
|
icon: "contrast"
|
||||||
|
name: "Neutral"
|
||||||
|
description: "Close to grayscale, a hint of chroma."
|
||||||
|
},
|
||||||
|
Variant {
|
||||||
|
variant: "monochrome"
|
||||||
|
icon: "filter_b_and_w"
|
||||||
|
name: "Monochrome"
|
||||||
|
description: "All colours are grayscale, no chroma."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
readonly property list<var> preppedVariants: list.map(v => ({
|
||||||
|
name: Fuzzy.prepare(v.variant),
|
||||||
|
variant: v
|
||||||
|
}))
|
||||||
|
|
||||||
|
function fuzzyQuery(search: string): var {
|
||||||
|
return Fuzzy.go(search.slice(`${Config.launcher.actionPrefix}variant `.length), preppedVariants, {
|
||||||
|
all: true,
|
||||||
|
key: "name"
|
||||||
|
}).map(r => r.obj.variant);
|
||||||
|
}
|
||||||
|
|
||||||
|
component Variant: QtObject {
|
||||||
|
required property string variant
|
||||||
|
required property string icon
|
||||||
|
required property string name
|
||||||
|
required property string description
|
||||||
|
|
||||||
|
function onClicked(list: AppList): void {
|
||||||
|
list.visibilities.launcher = false;
|
||||||
|
Quickshell.execDetached(["caelestia", "scheme", "set", "-v", variant]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,8 +8,8 @@ import QtQuick
|
||||||
Item {
|
Item {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
required property var modelData
|
required property Schemes.Scheme modelData
|
||||||
required property PersistentProperties visibilities
|
required property var list
|
||||||
|
|
||||||
implicitHeight: Config.launcher.sizes.itemHeight
|
implicitHeight: Config.launcher.sizes.itemHeight
|
||||||
|
|
||||||
|
|
@ -20,8 +20,7 @@ Item {
|
||||||
radius: Appearance.rounding.full
|
radius: Appearance.rounding.full
|
||||||
|
|
||||||
function onClicked(): void {
|
function onClicked(): void {
|
||||||
Apps.launch(root.modelData);
|
root.modelData?.onClicked(root.list);
|
||||||
root.visibilities.launcher = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,14 +9,14 @@ import QtQuick
|
||||||
Singleton {
|
Singleton {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
readonly property list<var> preppedActions: schemes.instances.map(s => ({
|
readonly property list<var> preppedSchemes: schemes.instances.map(s => ({
|
||||||
name: Fuzzy.prepare(s.name),
|
name: Fuzzy.prepare(s.name),
|
||||||
flavour: Fuzzy.prepare(s.flavour),
|
flavour: Fuzzy.prepare(s.flavour),
|
||||||
scheme: s
|
scheme: s
|
||||||
}))
|
}))
|
||||||
|
|
||||||
function fuzzyQuery(search: string): var {
|
function fuzzyQuery(search: string): var {
|
||||||
return Fuzzy.go(search.slice(`${Config.launcher.actionPrefix}scheme `.length), preppedActions, {
|
return Fuzzy.go(search.slice(`${Config.launcher.actionPrefix}scheme `.length), preppedSchemes, {
|
||||||
all: true,
|
all: true,
|
||||||
keys: ["name", "flavour"],
|
keys: ["name", "flavour"],
|
||||||
scoreFn: r => r[0].score > 0 ? r[0].score * 0.9 + r[1].score * 0.1 : 0
|
scoreFn: r => r[0].score > 0 ? r[0].score * 0.9 + r[1].score * 0.1 : 0
|
||||||
|
|
|
||||||
69
modules/launcher/VariantItem.qml
Normal file
69
modules/launcher/VariantItem.qml
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
import "root:/widgets"
|
||||||
|
import "root:/services"
|
||||||
|
import "root:/config"
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
required property M3Variants.Variant modelData
|
||||||
|
required property var list
|
||||||
|
|
||||||
|
implicitHeight: Config.launcher.sizes.itemHeight
|
||||||
|
|
||||||
|
anchors.left: parent?.left
|
||||||
|
anchors.right: parent?.right
|
||||||
|
|
||||||
|
StateLayer {
|
||||||
|
radius: Appearance.rounding.full
|
||||||
|
|
||||||
|
function onClicked(): void {
|
||||||
|
root.modelData?.onClicked(root.list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
anchors.fill: parent
|
||||||
|
anchors.leftMargin: Appearance.padding.larger
|
||||||
|
anchors.rightMargin: Appearance.padding.larger
|
||||||
|
anchors.margins: Appearance.padding.smaller
|
||||||
|
|
||||||
|
MaterialIcon {
|
||||||
|
id: icon
|
||||||
|
|
||||||
|
text: root.modelData?.icon ?? ""
|
||||||
|
font.pointSize: Appearance.font.size.extraLarge
|
||||||
|
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
anchors.left: icon.right
|
||||||
|
anchors.leftMargin: Appearance.spacing.larger
|
||||||
|
anchors.verticalCenter: icon.verticalCenter
|
||||||
|
|
||||||
|
implicitWidth: parent.width - icon.width
|
||||||
|
implicitHeight: name.implicitHeight + desc.implicitHeight
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: name
|
||||||
|
|
||||||
|
text: root.modelData?.name ?? ""
|
||||||
|
font.pointSize: Appearance.font.size.normal
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: desc
|
||||||
|
|
||||||
|
text: root.modelData?.description ?? ""
|
||||||
|
font.pointSize: Appearance.font.size.small
|
||||||
|
color: Colours.alpha(Colours.palette.m3outline, true)
|
||||||
|
|
||||||
|
elide: Text.ElideRight
|
||||||
|
width: root.width - icon.width - Appearance.rounding.normal * 2
|
||||||
|
|
||||||
|
anchors.top: name.bottom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue