Files
dots-hyprland/dots/.config/quickshell/ii/modules/settings/GeneralConfig.qml
T
2025-11-14 00:51:07 +03:00

360 lines
12 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Io
import QtQuick.Layouts
import qs.services
import qs.modules.common
import qs.modules.common.functions
import qs.modules.common.widgets
ContentPage {
forceWidth: true
Process {
id: translationProc
property string locale: ""
command: [Directories.aiTranslationScriptPath, translationProc.locale]
}
ContentSection {
icon: "volume_up"
title: Translation.tr("Audio")
ConfigSwitch {
buttonIcon: "hearing"
text: Translation.tr("Earbang protection")
checked: Config.options.audio.protection.enable
onCheckedChanged: {
Config.options.audio.protection.enable = checked;
}
StyledToolTip {
text: Translation.tr("Prevents abrupt increments and restricts volume limit")
}
}
ConfigRow {
enabled: Config.options.audio.protection.enable
ConfigSpinBox {
icon: "arrow_warm_up"
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 {
icon: "vertical_align_top"
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 {
icon: "warning"
text: Translation.tr("Low warning")
value: Config.options.battery.low
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.low = value;
}
}
ConfigSpinBox {
icon: "dangerous"
text: Translation.tr("Critical warning")
value: Config.options.battery.critical
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.critical = value;
}
}
}
ConfigRow {
uniform: false
Layout.fillWidth: false
ConfigSwitch {
buttonIcon: "pause"
text: Translation.tr("Automatic suspend")
checked: Config.options.battery.automaticSuspend
onCheckedChanged: {
Config.options.battery.automaticSuspend = checked;
}
StyledToolTip {
text: Translation.tr("Automatically suspends the system when battery is low")
}
}
ConfigSpinBox {
enabled: Config.options.battery.automaticSuspend
text: Translation.tr("at")
value: Config.options.battery.suspend
from: 0
to: 100
stepSize: 5
onValueChanged: {
Config.options.battery.suspend = value;
}
}
}
ConfigRow {
uniform: true
ConfigSpinBox {
icon: "charger"
text: Translation.tr("Full warning")
value: Config.options.battery.full
from: 0
to: 101
stepSize: 5
onValueChanged: {
Config.options.battery.full = 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.")
StyledComboBox {
id: languageSelector
buttonIcon: "language"
textRole: "displayName"
model: [
{
displayName: Translation.tr("Auto (System)"),
value: "auto"
},
...Translation.allAvailableLanguages.map(lang => {
return {
displayName: lang,
value: lang
};
})]
currentIndex: {
const index = model.findIndex(item => item.value === Config.options.language.ui);
return index !== -1 ? index : 0;
}
onActivated: index => {
Config.options.language.ui = model[index].value;
}
}
}
ContentSubsection {
title: Translation.tr("Generate translation with Gemini")
tooltip: Translation.tr("You'll need to enter your Gemini API key first.\nType /key on the sidebar for instructions.")
ConfigRow {
MaterialTextArea {
id: localeInput
Layout.fillWidth: true
placeholderText: Translation.tr("Locale code, e.g. fr_FR, de_DE, zh_CN...")
text: Config.options.language.ui === "auto" ? Qt.locale().name : Config.options.language.ui
}
RippleButtonWithIcon {
id: generateTranslationBtn
Layout.fillHeight: true
nerdIcon: ""
enabled: !translationProc.running || (translationProc.locale !== localeInput.text.trim())
mainText: enabled ? Translation.tr("Generate\nTypically takes 2 minutes") : Translation.tr("Generating...\nDon't close this window!")
onClicked: {
translationProc.locale = localeInput.text.trim();
translationProc.running = false;
translationProc.running = true;
}
}
}
}
}
ContentSection {
icon: "rule"
title: Translation.tr("Policies")
ConfigRow {
// AI policy
ColumnLayout {
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
}
]
}
}
// Weeb policy
ColumnLayout {
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
}
]
}
}
}
}
ContentSection {
icon: "notification_sound"
title: Translation.tr("Sounds")
ConfigRow {
uniform: true
ConfigSwitch {
buttonIcon: "battery_android_full"
text: Translation.tr("Battery")
checked: Config.options.sounds.battery
onCheckedChanged: {
Config.options.sounds.battery = checked;
}
}
ConfigSwitch {
buttonIcon: "av_timer"
text: Translation.tr("Pomodoro")
checked: Config.options.sounds.pomodoro
onCheckedChanged: {
Config.options.sounds.pomodoro = checked;
}
}
}
}
ContentSection {
icon: "nest_clock_farsight_analog"
title: Translation.tr("Time")
ConfigSwitch {
buttonIcon: "pace"
text: Translation.tr("Second precision")
checked: Config.options.time.secondPrecision
onCheckedChanged: {
Config.options.time.secondPrecision = checked;
}
StyledToolTip {
text: Translation.tr("Enable if you want clocks to show seconds accurately")
}
}
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"
},
]
}
}
}
ContentSection {
icon: "work_alert"
title: Translation.tr("Work safety")
ConfigSwitch {
buttonIcon: "assignment"
text: Translation.tr("Hide clipboard images copied from sussy sources")
checked: Config.options.workSafety.enable.clipboard
onCheckedChanged: {
Config.options.workSafety.enable.clipboard = checked;
}
}
ConfigSwitch {
buttonIcon: "wallpaper"
text: Translation.tr("Hide sussy/anime wallpapers")
checked: Config.options.workSafety.enable.wallpaper
onCheckedChanged: {
Config.options.workSafety.enable.wallpaper = checked;
}
}
}
}