mirror of
https://github.com/noctalia-dev/noctalia-shell.git
synced 2026-05-11 17:08:27 +08:00
Merge branch 'main' into feat/diskdetails
This commit is contained in:
@@ -1 +1,2 @@
|
||||
buy_me_a_coffee: noctalia
|
||||
ko_fi: noctaliadev
|
||||
|
||||
@@ -205,16 +205,16 @@ body {
|
||||
|
||||
[class*="checkboxOption"]:hover [class*="checkboxIndicator"] {
|
||||
background-color: color-mix(in srgb, var(--accent-1) 20%, transparent) !important;
|
||||
border-color: var(--accent-1) !important;
|
||||
border-color: var(--accent-3) !important;
|
||||
}
|
||||
|
||||
[class*="checkboxOption"][data-selected] [class*="checkboxIndicator"] {
|
||||
background-color: var(--accent-1) !important;
|
||||
border-color: var(--accent-1) !important;
|
||||
border-color: var(--accent-3) !important;
|
||||
}
|
||||
|
||||
[class*="checkboxOption"][data-selected]:hover [class*="checkboxIndicator"] {
|
||||
background-color: var(--accent-3) !important;
|
||||
background-color: var(--accent-1) !important;
|
||||
border-color: var(--accent-3) !important;
|
||||
}
|
||||
|
||||
@@ -247,7 +247,7 @@ body {
|
||||
|
||||
/* Inner dot (selected) */
|
||||
[class*="innerDotRadio"] {
|
||||
fill: var(--accent-1) !important; /* contrast dot */
|
||||
fill: var(--accent-3) !important; /* contrast dot */
|
||||
opacity: 0; /* hidden by default */
|
||||
transition: opacity 0.2s ease;
|
||||
}
|
||||
@@ -281,7 +281,7 @@ body {
|
||||
|
||||
[class*="checkboxOption"][data-selected="true"] [class*="checkStroke"],
|
||||
[class*="checkboxOption"][data-selected="true"] [class*="dot"] {
|
||||
color: var(--accent-1) !important; /* checkmark/dot color */
|
||||
color: var(--accent-3) !important; /* checkmark color */
|
||||
}
|
||||
|
||||
/* Hover effect for selected checkbox */
|
||||
@@ -322,3 +322,49 @@ body {
|
||||
color: var(--text-1) !important;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
/* Fix polls visibility */
|
||||
[class*="pollContainer_"] [class*="selected__"] [class*="radioForeground_"] {
|
||||
fill: var(--accent-3) !important;
|
||||
}
|
||||
|
||||
[class*="pollContainer_"] [class*="selected__"] {
|
||||
border: 2px solid var(--active) !important;
|
||||
}
|
||||
|
||||
[class*="votedStyles_"] [class*="votePercentageBar_"] {
|
||||
background-color: var(--active-2) !important;
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
[class*="pollContainer_"] [class*="answerSelectionIcon_"] circle {
|
||||
fill: var(--accent-3) !important;
|
||||
}
|
||||
|
||||
[class*="pollContainer_"] [class*="votedStyles_"] [class*="answerSelectionIcon_"] path {
|
||||
fill: var(--bg-1) !important;
|
||||
}
|
||||
|
||||
[class*="pollContainer_"] [class*="answer__"]:not([class*="votedStyles_"]) [class*="answerSelectionIcon_"] path {
|
||||
fill: var(--accent-1) !important;
|
||||
}
|
||||
|
||||
[class*="pollContainer_"] [class*="votesData_"] {
|
||||
color: var(--text-2) !important;
|
||||
}
|
||||
|
||||
[class*="pollContainer_"] [class*="votedStyles_"] [class*="answerInner_"] {
|
||||
border: 2px solid var(--active) !important;
|
||||
}
|
||||
|
||||
/* Invite to server button override*/
|
||||
[class*="inviteButton_"] svg path,
|
||||
[class*="actionIcon_"] path[d^="M14.5 8a3 3 0"] {
|
||||
fill: var(--accent-1) !important;
|
||||
color: var(--accent-1) !important;
|
||||
}
|
||||
|
||||
[class*="inviteButton_"]:hover svg path {
|
||||
fill: var(--accent-3) !important;
|
||||
color: var(--accent-3) !important;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
## Colours - Based on Material Design 3 Palette
|
||||
set $primary #{{colors.primary.default.hex_stripped}}
|
||||
set $on_primary #{{colors.on_primary.default.hex_stripped}}
|
||||
set $secondary #{{colors.secondary.default.hex_stripped}}
|
||||
set $tertiary #{{colors.tertiary.default.hex_stripped}}
|
||||
set $error #{{colors.error.default.hex_stripped}}
|
||||
set $surface #{{colors.surface.default.hex_stripped}}
|
||||
set $on_surface #{{colors.on_surface.default.hex_stripped}}
|
||||
set $on_surface_variant #{{colors.on_surface_variant.default.hex_stripped}}
|
||||
set $outline #{{colors.outline.default.hex_stripped}}
|
||||
|
||||
## Window Colours
|
||||
# class border backgr. text indicator child_border
|
||||
client.focused $primary $surface $on_surface $secondary $primary
|
||||
client.focused_inactive $outline $surface $on_surface_variant $outline $outline
|
||||
client.unfocused $outline $surface $on_surface_variant $outline $outline
|
||||
client.urgent $error $surface $on_surface $error $error
|
||||
client.placeholder $surface $surface $on_surface_variant $surface $surface
|
||||
client.background $surface
|
||||
@@ -21,4 +21,6 @@ background {{colors.surface.default.hex}}
|
||||
foreground {{colors.on_surface.default.hex}}
|
||||
selection_foreground {{colors.on_surface_variant.default.hex}}
|
||||
selection_background {{colors.surface_variant.default.hex}}
|
||||
active_border_color {{colors.primary.default.hex}}
|
||||
inactive_border_color {{colors.surface_variant.default.hex}}
|
||||
url_color {{colors.primary.default.hex}}
|
||||
|
||||
+47
-23
@@ -181,10 +181,10 @@
|
||||
"hide-widget-when-zero-label": "Symbol bei keinen Benachrichtigungen ausblenden",
|
||||
"hide-widget-when-zero-unread-description": "Benachrichtigungssymbol ausblenden, wenn keine ungelesenen Benachrichtigungen vorhanden sind.",
|
||||
"hide-widget-when-zero-unread-label": "Symbol bei keinen ungelesenen Benachrichtigungen ausblenden",
|
||||
"show-unread-badge-description": "Badge mit der Anzahl ungelesener Benachrichtigungen anzeigen.",
|
||||
"show-unread-badge-label": "Badge für ungelesene Nachrichten anzeigen",
|
||||
"show-unread-badge-description": "Abzeichen mit der Anzahl ungelesener Benachrichtigungen anzeigen.",
|
||||
"show-unread-badge-label": "Ungelesen-Abzeichen anzeigen",
|
||||
"unread-badge-color-description": "Wähle die Farbe für das Abzeichen ungelesener Benachrichtigungen.",
|
||||
"unread-badge-color-label": "Farbe des ungelesenen Abzeichens"
|
||||
"unread-badge-color-label": "Farbe des Ungelesen-Abzeichens"
|
||||
},
|
||||
"section-editor": {
|
||||
"placeholder": "Widget auswählen...",
|
||||
@@ -230,8 +230,8 @@
|
||||
"icon-scale-label": "Symbolskalierung",
|
||||
"max-width-description": "Maximale Breite der Taskleiste als Prozentsatz der Bildschirmbreite.",
|
||||
"max-width-label": "Maximale Breite",
|
||||
"only-active-workspaces-description": "Zeige nur Apps von aktiven Arbeitsbereichen.",
|
||||
"only-active-workspaces-label": "Nur von aktiven Arbeitsbereichen",
|
||||
"only-active-workspaces-description": "Zeige nur Apps von aktiven Arbeitsflächen.",
|
||||
"only-active-workspaces-label": "Nur von aktiven Arbeitsflächen",
|
||||
"only-same-monitor-description": "Zeige nur Apps von dem Monitor an, auf dem sich die Leiste befindet.",
|
||||
"only-same-monitor-label": "Nur vom selben Monitor",
|
||||
"show-pinned-apps-description": "Angeheftete Apps aus dem Dock in der Taskleiste anzeigen.",
|
||||
@@ -258,31 +258,31 @@
|
||||
"display-mode-label": "Anzeigemodus"
|
||||
},
|
||||
"workspace": {
|
||||
"character-count-description": "Anzahl der Zeichen, die von Arbeitsbereichsnamen angezeigt werden (1-10).",
|
||||
"character-count-description": "Anzahl der Zeichen, die von Arbeitsflächennamen angezeigt werden (1-10).",
|
||||
"character-count-label": "Zeichenanzahl",
|
||||
"empty-color-description": "Lege die Hintergrundfarbe für leere Workspaces fest.",
|
||||
"empty-color-label": "Farbe für leere Workspace",
|
||||
"enable-scrollwheel-description": "Zwischen Arbeitsbereichen mit dem Mausrad wechseln.",
|
||||
"enable-scrollwheel-label": "Zum Wechseln der Arbeitsbereiche scrollen",
|
||||
"focused-color-description": "Lege die Hintergrundfarbe für den fokussierten Workspace fest.",
|
||||
"focused-color-label": "Farbe des fokussierten Workspace",
|
||||
"follow-focused-screen-description": "Zeige Arbeitsbereiche vom aktuell fokussierten Bildschirm an, statt vom Bildschirm, auf dem sich die Leiste befindet.",
|
||||
"empty-color-description": "Lege die Hintergrundfarbe für leere Arbeitsflächen fest.",
|
||||
"empty-color-label": "Farbe für leere Arbeitsflächen",
|
||||
"enable-scrollwheel-description": "Zwischen Arbeitsflächen mit dem Mausrad wechseln.",
|
||||
"enable-scrollwheel-label": "Zum Wechseln der Arbeitsflächen scrollen",
|
||||
"focused-color-description": "Lege die Hintergrundfarbe für die fokussierte Arbeitsfläche fest.",
|
||||
"focused-color-label": "Farbe der fokussierten Arbeitsfläche",
|
||||
"follow-focused-screen-description": "Zeige Arbeitsflächen vom aktuell fokussierten Bildschirm an, statt vom Bildschirm, auf dem sich die Leiste befindet.",
|
||||
"follow-focused-screen-label": "Fokussiertem Bildschirm folgen",
|
||||
"grouped-border-opacity-description": "Legen Sie die Deckkraft für Workspace-Container-Rahmen fest.",
|
||||
"grouped-border-opacity-description": "Legen Sie die Deckkraft für Arbeitsflächen-Container-Rahmen fest.",
|
||||
"grouped-border-opacity-label": "Rahmen-Deckkraft",
|
||||
"hide-unoccupied-description": "Arbeitsbereiche ohne Fenster nicht anzeigen.",
|
||||
"hide-unoccupied-description": "Arbeitsflächen ohne Fenster nicht anzeigen.",
|
||||
"hide-unoccupied-label": "Unbesetzte ausblenden",
|
||||
"label-mode-description": "Wählen Sie, wie Arbeitsbereichs-Beschriftungen angezeigt werden.",
|
||||
"label-mode-description": "Wählen Sie, wie Arbeitsflächen-Beschriftungen angezeigt werden.",
|
||||
"label-mode-label": "Beschriftungsmodus",
|
||||
"occupied-color-description": "Lege die Hintergrundfarbe für belegte Workspaces fest.",
|
||||
"occupied-color-description": "Lege die Hintergrundfarbe für belegte Arbeitsflächen fest.",
|
||||
"occupied-color-label": "Farbe für belegte Arbeitsfläche",
|
||||
"reverse-scrolling-description": "Die Richtung des Arbeitsbereichswechsels beim Scrollen umkehren.",
|
||||
"reverse-scrolling-description": "Die Richtung des Arbeitsflächenwechsels beim Scrollen umkehren.",
|
||||
"reverse-scrolling-label": "Scrollen umkehren",
|
||||
"show-applications-description": "Anwendungssymbole in jedem Arbeitsbereich anzeigen.",
|
||||
"show-applications-description": "Anwendungssymbole in jeder Arbeitsfläche anzeigen.",
|
||||
"show-applications-label": "Anwendungen anzeigen",
|
||||
"show-badge-description": "Zeige die Arbeitsbereichsnummern-Plakette im gruppierten Modus an.",
|
||||
"show-badge-label": "Workspace-Badge anzeigen",
|
||||
"show-labels-only-when-occupied-description": "Arbeitsbereichsbezeichnungen nur anzeigen, wenn sie Fenster enthalten.",
|
||||
"show-badge-description": "Zeige die Arbeitsflächennummer als Abzeichen im gruppierten Modus an.",
|
||||
"show-badge-label": "Arbeitsflächen-Abzeichen anzeigen",
|
||||
"show-labels-only-when-occupied-description": "Arbeitsflächenbezeichnungen nur anzeigen, wenn sie Fenster enthalten.",
|
||||
"show-labels-only-when-occupied-label": "Beschriftungen nur anzeigen, wenn belegt",
|
||||
"unfocused-icons-opacity-description": "Transparenzgrad für nicht fokussierte App-Symbole festlegen.",
|
||||
"unfocused-icons-opacity-label": "Deckkraft unscharfer Symbole"
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Woche",
|
||||
"widgets": "Widgets",
|
||||
"width": "Breite",
|
||||
"windows": "Fenster",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Beim Hover"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Automatisch ausblenden",
|
||||
"hidden": "Ausblenden, wenn leer",
|
||||
"idle": "Ausblenden, wenn inaktiv",
|
||||
"transparent": "Transparent, wenn leer",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Lade Emojis...",
|
||||
"emoji-loading-description": "Bitte warten",
|
||||
"emoji-no-recent": "Noch keine kürzlich verwendeten Emojis",
|
||||
"emoji-search-description": "Emojis suchen und kopieren"
|
||||
"emoji-search-description": "Emojis suchen und kopieren",
|
||||
"settings-search-description": "Suchen und zu den Einstellungen navigieren",
|
||||
"windows-search-description": "Offene Fenster suchen und fokussieren"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Standard",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Geräumig",
|
||||
"display-mode-always-visible": "Immer sichtbar",
|
||||
"type-floating": "Schwebend",
|
||||
"type-framed": "Gerahmt",
|
||||
"type-simple": "Einfach"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Lautstärke-Übersteuerung erlauben"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Zeit, bis die Bar ausgeblendet wird, nachdem die Maus sie verlassen hat.",
|
||||
"appearance-auto-hide-delay-label": "Ausblende-Verzögerung",
|
||||
"appearance-auto-hide-exclusive-note": "Hinweis: Die exklusive Zone wird automatisch deaktiviert, wenn Auto-Hide aktiv ist.",
|
||||
"appearance-auto-show-delay-description": "Zeit, bevor die Bar angezeigt wird, wenn die Maus den Rand betritt.",
|
||||
"appearance-auto-show-delay-label": "Anzeigeverzögerung",
|
||||
"appearance-background-opacity-description": "Legen Sie die Hintergrundtransparenz speziell für die Leiste fest.",
|
||||
"appearance-background-opacity-label": "Leisten-Hintergrundtransparenz",
|
||||
"appearance-capsule-opacity-description": "Deckkraft der Widget-Hintergründe festlegen, wenn Kapsel angezeigt wird.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Innenabstand der Statusleiste für kompaktes oder geräumiges Aussehen anpassen.",
|
||||
"appearance-density-label": "Statusleistendichte",
|
||||
"appearance-desc": "Erscheinungsbild und Position der Statusleiste anpassen.",
|
||||
"appearance-display-mode-description": "Wählen Sie, wann die Leiste sichtbar ist",
|
||||
"appearance-display-mode-label": "Anzeigemodus",
|
||||
"appearance-floating-description": "Statusleiste als schwebende 'Pille' anzeigen.",
|
||||
"appearance-floating-label": "Schwebende Statusleiste",
|
||||
"appearance-frame-radius": "Innenradius",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Tasten anzeigen",
|
||||
"media-player-show-visualizer-description": "Audiovisualisierungs-Overlay anzeigen.",
|
||||
"media-player-visualizer-type-description": "Wählen Sie einen Visualisierungstyp für den Hintergrund des Desktop-Medienplayers.",
|
||||
"system-stat-layout-bottom": "Unten",
|
||||
"system-stat-layout-description": "Wählen Sie, wie die Legende relativ zum Diagramm angezeigt wird.",
|
||||
"system-stat-layout-label": "Layout",
|
||||
"system-stat-layout-side": "Seite",
|
||||
"system-stat-rounded-corners-description": "Abgerundete Ecken für den Widget-Hintergrund verwenden.",
|
||||
"system-stat-rounded-corners-label": "Abgerundete Ecken",
|
||||
"system-stat-show-background-description": "Zeige den Hintergrundbehälter für das Systemstatistik-Widget.",
|
||||
"system-stat-show-background-label": "Hintergrund anzeigen",
|
||||
"system-stat-stat-type-description": "Wähle, welche Systemstatistik angezeigt werden soll.",
|
||||
"system-stat-stat-type-label": "Statistiktyp",
|
||||
"title": "Desktop-Widgets",
|
||||
"weather-enabled-description": "Zeige ein Wetter-Widget auf dem Desktop an.",
|
||||
"weather-enabled-label": "Wetter-Widget aktivieren",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Verhalten und Erscheinungsbild des Starters anpassen.",
|
||||
"settings-enable-settings-search-description": "Einstellungen in den Suchergebnissen des Launchers anzeigen.",
|
||||
"settings-enable-settings-search-label": "Einstellungen-Suche aktivieren",
|
||||
"settings-enable-windows-search-description": "Aktive Fenster suchen und fokussieren.",
|
||||
"settings-enable-windows-search-label": "Fenstersuche aktivieren",
|
||||
"settings-grid-view-description": "Elemente in einem Raster statt in einer Liste anzeigen.",
|
||||
"settings-icon-mode-description": "Verwende native System-Icons anstelle von Tabler-Icons.",
|
||||
"settings-icon-mode-label": "Native Icons verwenden",
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Week",
|
||||
"widgets": "Widgets",
|
||||
"width": "Width",
|
||||
"windows": "Windows",
|
||||
"yes": "Yes"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "On hover"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Auto-hide",
|
||||
"hidden": "Hide when empty",
|
||||
"idle": "Hide when idle",
|
||||
"transparent": "Transparent when empty",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Loading emojis...",
|
||||
"emoji-loading-description": "Please wait",
|
||||
"emoji-no-recent": "No recent emojis yet",
|
||||
"emoji-search-description": "Search and copy emojis"
|
||||
"emoji-search-description": "Search and copy emojis",
|
||||
"settings-search-description": "Search and navigate to settings",
|
||||
"windows-search-description": "Search and focus open windows"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Default",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Spacious",
|
||||
"display-mode-always-visible": "Always Visible",
|
||||
"type-floating": "Floating",
|
||||
"type-framed": "Framed",
|
||||
"type-simple": "Simple"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Allow volume overdrive"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Time before bar hides after mouse leaves",
|
||||
"appearance-auto-hide-delay-label": "Hide Delay",
|
||||
"appearance-auto-hide-exclusive-note": "Note: Exclusive zone is automatically disabled when auto-hide is active",
|
||||
"appearance-auto-show-delay-description": "Time before bar shows when mouse enters edge",
|
||||
"appearance-auto-show-delay-label": "Show Delay",
|
||||
"appearance-background-opacity-description": "Set the background opacity specifically for the bar.",
|
||||
"appearance-background-opacity-label": "Bar background opacity",
|
||||
"appearance-capsule-opacity-description": "Set the opacity level for widget backgrounds when capsule is shown.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Adjust the bar's padding for a compact or spacious look.",
|
||||
"appearance-density-label": "Bar density",
|
||||
"appearance-desc": "Customize the bar's appearance and position.",
|
||||
"appearance-display-mode-description": "Choose when the bar is visible",
|
||||
"appearance-display-mode-label": "Display Mode",
|
||||
"appearance-floating-description": "Display the bar as a floating 'pill'.",
|
||||
"appearance-floating-label": "Floating bar",
|
||||
"appearance-frame-radius": "Inner Radius",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Show buttons",
|
||||
"media-player-show-visualizer-description": "Show the audio visualizer overlay.",
|
||||
"media-player-visualizer-type-description": "Choose a visualization type.",
|
||||
"system-stat-layout-bottom": "Bottom",
|
||||
"system-stat-layout-description": "Choose how the legend is displayed relative to the graph.",
|
||||
"system-stat-layout-label": "Layout",
|
||||
"system-stat-layout-side": "Side",
|
||||
"system-stat-rounded-corners-description": "Use rounded corners for the widget background.",
|
||||
"system-stat-rounded-corners-label": "Rounded corners",
|
||||
"system-stat-show-background-description": "Show the background container for the system stat widget.",
|
||||
"system-stat-show-background-label": "Show background",
|
||||
"system-stat-stat-type-description": "Choose which system statistic to display.",
|
||||
"system-stat-stat-type-label": "Statistic Type",
|
||||
"title": "Desktop Widgets",
|
||||
"weather-enabled-description": "Show a weather widget on the desktop.",
|
||||
"weather-enabled-label": "Enable weather widget",
|
||||
@@ -1045,7 +1067,7 @@
|
||||
"clipboard-desc": "Access and manage your clipboard history from the launcher.",
|
||||
"execute-desc": "Configure how applications are launched.",
|
||||
"execute-title": "Execution",
|
||||
"settings-annotation-tool-description": "Command to run when clicking the annotate button in clipboard history, The image will be piped to this command.",
|
||||
"settings-annotation-tool-description": "Command to run when clicking the annotate button in clipboard history. The image will be piped to this command.",
|
||||
"settings-annotation-tool-label": "Annotation tool",
|
||||
"settings-annotation-tool-placeholder": "e.g. 'gradia', 'satty -f -'",
|
||||
"settings-auto-paste-description": "Automatically paste the selected clipboard item. Requires wtype.",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Customize the launcher's behavior and appearance.",
|
||||
"settings-enable-settings-search-description": "Show settings results when searching in the launcher.",
|
||||
"settings-enable-settings-search-label": "Enable settings search",
|
||||
"settings-enable-windows-search-description": "Search and focus active windows.",
|
||||
"settings-enable-windows-search-label": "Enable windows search",
|
||||
"settings-grid-view-description": "Display items in a grid layout instead of a list.",
|
||||
"settings-icon-mode-description": "Use native system icons instead of Tabler icons.",
|
||||
"settings-icon-mode-label": "Use native icons",
|
||||
@@ -1253,6 +1277,7 @@
|
||||
"hot-reload-description": "Automatically reload plugins when their files change. Useful for plugin development.",
|
||||
"hot-reload-label": "Hot reload (dev mode)",
|
||||
"hot-reloaded": "Reloaded plugin: {name}",
|
||||
"translations-reloaded": "Reloaded translations: {name}",
|
||||
"install-error": "Failed to install: {error}",
|
||||
"install-incompatible": "{plugin} requires Noctalia v{version} or higher",
|
||||
"install-success": "Successfully installed {plugin}",
|
||||
|
||||
+78
-54
@@ -493,6 +493,7 @@
|
||||
"week": "Semana",
|
||||
"widgets": "Widgets",
|
||||
"width": "Ancho",
|
||||
"windows": "Ventanas",
|
||||
"yes": "Sí"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Al pasar por encima"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Ocultación Automática",
|
||||
"hidden": "Ocultar cuando esté vacío",
|
||||
"idle": "Ocultar cuando esté inactivo",
|
||||
"transparent": "Transparente cuando esté vacío",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Cargando emojis...",
|
||||
"emoji-loading-description": "Por favor espera",
|
||||
"emoji-no-recent": "No hay emojis recientes",
|
||||
"emoji-search-description": "Buscar y copiar emojis"
|
||||
"emoji-search-description": "Buscar y copiar emojis",
|
||||
"settings-search-description": "Buscar en los ajustes",
|
||||
"windows-search-description": "Buscar y enfocar ventanas abiertas"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Predeterminada",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Espaciosa",
|
||||
"display-mode-always-visible": "Siempre visible",
|
||||
"type-floating": "Flotante",
|
||||
"type-framed": "Con marco",
|
||||
"type-simple": "Simple"
|
||||
@@ -611,7 +616,7 @@
|
||||
"frame-rates-fps": "{fps} FPS",
|
||||
"scrolling-modes": {
|
||||
"always": "Desplazar siempre",
|
||||
"hover": "Desplazar al pasar",
|
||||
"hover": "Desplazar al posar el puntero",
|
||||
"never": "No desplazar nunca"
|
||||
},
|
||||
"session-menu-grid-layout": {
|
||||
@@ -654,9 +659,9 @@
|
||||
"system-cpu": "CPU:",
|
||||
"system-disk": "Disco:",
|
||||
"system-gpu": "GPU:",
|
||||
"system-host": "Anfitrión:",
|
||||
"system-host": "Host:",
|
||||
"system-install-hint": "Instala fastfetch para ver la información del sistema",
|
||||
"system-kernel": "Núcleo:",
|
||||
"system-kernel": "Kernel:",
|
||||
"system-loading": "Cargando información del sistema...",
|
||||
"system-memory": "Memoria:",
|
||||
"system-monitor": "Monitor:",
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Permitir sobreamplificación de volumen"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Tiempo que tarda la barra en ocultarse cuando se aparta el ratón",
|
||||
"appearance-auto-hide-delay-label": "Demora de Ocultación",
|
||||
"appearance-auto-hide-exclusive-note": "Nota: La zona exclusiva se desactiva automáticamente cuando la ocultación automática está activa",
|
||||
"appearance-auto-show-delay-description": "Tiempo que tarda la barra en mostrarse cuando el ratón llega al borde",
|
||||
"appearance-auto-show-delay-label": "Demora de Despliegue",
|
||||
"appearance-background-opacity-description": "Establece la opacidad del fondo específicamente para la barra.",
|
||||
"appearance-background-opacity-label": "Opacidad del fondo de la barra",
|
||||
"appearance-capsule-opacity-description": "Establecer el nivel de opacidad para los fondos de los widgets cuando se muestra la cápsula.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Ajusta el relleno de la barra para un aspecto compacto o espacioso.",
|
||||
"appearance-density-label": "Densidad de la barra",
|
||||
"appearance-desc": "Personaliza la apariencia y posición de la barra.",
|
||||
"appearance-display-mode-description": "Elige cuando será visible la barra",
|
||||
"appearance-display-mode-label": "Modo de Visualización",
|
||||
"appearance-floating-description": "Muestra la barra como una 'píldora' flotante.",
|
||||
"appearance-floating-label": "Barra flotante",
|
||||
"appearance-frame-radius": "Radio interno",
|
||||
@@ -777,7 +789,7 @@
|
||||
"dark-mode-mode-label": "Programación del modo oscuro",
|
||||
"dark-mode-mode-manual": "Manual",
|
||||
"dark-mode-mode-off": "Apagado",
|
||||
"dark-mode-switch-description": "Cambia a un tema más oscuro para una visualización más fácil por la noche.",
|
||||
"dark-mode-switch-description": "Cambia a un tema más oscuro para una visualización más cómoda por la noche.",
|
||||
"delete-error-description": "Error al eliminar {scheme}",
|
||||
"delete-error-title": "Error al eliminar",
|
||||
"delete-success-description": "{scheme} eliminado correctamente",
|
||||
@@ -796,7 +808,7 @@
|
||||
"download-fetching": "Obteniendo esquemas de colores disponibles...",
|
||||
"download-success-description": "{scheme} descargado correctamente",
|
||||
"download-success-title": "Esquema de colores descargado",
|
||||
"download-title": "Descargar esquemas de colores",
|
||||
"download-title": "Descargar Esquemas de Color",
|
||||
"method-description": {
|
||||
"content": "Esquema de Material Design con extracción de color de alta fidelidad que coincide estrechamente con los colores reales del contenido de origen.",
|
||||
"faithful": "Intenta mantenerse cerca del color original mientras genera una paleta armoniosa.",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Mostrar botones",
|
||||
"media-player-show-visualizer-description": "Mostrar la superposición del visualizador de audio.",
|
||||
"media-player-visualizer-type-description": "Elige un tipo de visualización para el fondo del reproductor multimedia de escritorio.",
|
||||
"system-stat-layout-bottom": "Abajo",
|
||||
"system-stat-layout-description": "Elige cómo se muestra la leyenda en relación con el gráfico.",
|
||||
"system-stat-layout-label": "Diseño",
|
||||
"system-stat-layout-side": "Lado",
|
||||
"system-stat-rounded-corners-description": "Usar esquinas redondeadas para el fondo del widget.",
|
||||
"system-stat-rounded-corners-label": "Esquinas Redondeadas",
|
||||
"system-stat-show-background-description": "Mostrar el contenedor de fondo para el widget de estadísticas del sistema.",
|
||||
"system-stat-show-background-label": "Mostrar fondo",
|
||||
"system-stat-stat-type-description": "Elige qué estadística del sistema mostrar.",
|
||||
"system-stat-stat-type-label": "Tipo de Estadística",
|
||||
"title": "Widgets de escritorio",
|
||||
"weather-enabled-description": "Mostrar un widget del clima en el escritorio.",
|
||||
"weather-enabled-label": "Activar widget del clima",
|
||||
@@ -923,7 +945,7 @@
|
||||
"night-light-manual-schedule-select-start": "Seleccionar hora de inicio",
|
||||
"night-light-manual-schedule-select-stop": "Seleccionar hora de finalización",
|
||||
"night-light-manual-schedule-sunrise": "Hora del amanecer",
|
||||
"night-light-manual-schedule-sunset": "Hora del atardecer",
|
||||
"night-light-manual-schedule-sunset": "Hora del anochecer",
|
||||
"night-light-temperature-day": "Día",
|
||||
"night-light-temperature-day-description": "Controla la temperatura durante el día.",
|
||||
"night-light-temperature-description": "Establece la calidez del color para la noche y el día.",
|
||||
@@ -939,9 +961,9 @@
|
||||
"appearance-colorize-icons-description": "Aplicar colores del tema a los iconos de aplicaciones del dock (solo aplicaciones no enfocadas).",
|
||||
"appearance-colorize-icons-label": "Colorear iconos",
|
||||
"appearance-dead-opacity-description": "Ajustar la opacidad de los iconos de las aplicaciones que no están en ejecución.",
|
||||
"appearance-dead-opacity-label": "Opacidad muerta",
|
||||
"appearance-dead-opacity-label": "Opacidad inactivas",
|
||||
"appearance-desc": "Personaliza el comportamiento y la apariencia del dock.",
|
||||
"appearance-display-auto-hide": "Ocultar automáticamente",
|
||||
"appearance-display-auto-hide": "Ocultar autom.",
|
||||
"appearance-display-description": "Elige cómo se comporta el dock.",
|
||||
"appearance-display-exclusive": "Exclusivo",
|
||||
"appearance-floating-distance-description": "Ajusta la distancia de flotación desde el borde de la pantalla.",
|
||||
@@ -1026,9 +1048,9 @@
|
||||
"session-label": "Fin de la sesión",
|
||||
"session-placeholder": "p. ej., notify-send \"Session\" \"$1\"",
|
||||
"system-hooks-desc": "Configura comandos para que se ejecuten cuando ocurran eventos del sistema.",
|
||||
"system-hooks-enable-description": "Activa o desactiva todos los comandos de hooks.",
|
||||
"system-hooks-enable-description": "Activa o desactiva todos los comandos hook.",
|
||||
"system-hooks-enable-label": "Activar hooks",
|
||||
"system-hooks-title": "Ganchos del sistema",
|
||||
"system-hooks-title": "Hooks del sistema",
|
||||
"theme-changed-description": "Comando a ejecutar cuando el tema cambia entre modo oscuro y claro.",
|
||||
"theme-changed-label": "Tema cambiado",
|
||||
"theme-changed-placeholder": "ej., notify-send \"Tema\" \"Cambiado\"",
|
||||
@@ -1057,7 +1079,7 @@
|
||||
"settings-clipboard-history-description": "Accede a los elementos copiados anteriormente desde el lanzador.",
|
||||
"settings-clipboard-history-label": "Activar historial del portapapeles",
|
||||
"settings-clipboard-watch-image-description": "Cadena de comando completa pasada a wl-paste para cambios de imagen. (requiere reinicio)",
|
||||
"settings-clipboard-watch-image-label": "Comando de Vigilancia de Imágenes",
|
||||
"settings-clipboard-watch-image-label": "Comando de vigilancia de imágenes",
|
||||
"settings-clipboard-watch-text-description": "Cadena de comando completa pasada a wl-paste para cambios de texto. (requiere reinicio)",
|
||||
"settings-clipboard-watch-text-label": "Comando de vigilancia de texto",
|
||||
"settings-custom-launch-prefix-description": "Prefijar comandos con un lanzador personalizado (ej. 'runapp' para integración con systemd).",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Personaliza el comportamiento y la apariencia del lanzador.",
|
||||
"settings-enable-settings-search-description": "Mostrar los resultados de configuración al buscar en el Launcher.",
|
||||
"settings-enable-settings-search-label": "Activar la búsqueda en la configuración",
|
||||
"settings-enable-windows-search-description": "Buscar y enfocar ventanas activas.",
|
||||
"settings-enable-windows-search-label": "Habilitar búsqueda de ventanas",
|
||||
"settings-grid-view-description": "Mostrar elementos en una cuadrícula en lugar de una lista.",
|
||||
"settings-icon-mode-description": "Usa iconos nativos del sistema en lugar de iconos Tabler.",
|
||||
"settings-icon-mode-label": "Usar iconos nativos",
|
||||
@@ -1079,7 +1103,7 @@
|
||||
"settings-show-icon-background-label": "Mostrar fondo del icono",
|
||||
"settings-sort-by-usage-description": "Cuando está activado, las aplicaciones más utilizadas aparecen primero en la lista.",
|
||||
"settings-sort-by-usage-label": "Ordenar por más usados",
|
||||
"settings-terminal-command-description": "Comando para iniciar un terminal. Por ejemplo, 'kitty -e' o 'gnome-terminal --'.",
|
||||
"settings-terminal-command-description": "Comando para iniciar el terminal. Por ejemplo, 'kitty -e' o 'gnome-terminal --'.",
|
||||
"settings-terminal-command-label": "Comando de terminal",
|
||||
"settings-use-app2unit-description": "Usa un método de lanzamiento alternativo para gestionar mejor los procesos de las aplicaciones y prevenir problemas.",
|
||||
"settings-use-app2unit-label": "Usar App2Unit para lanzar aplicaciones",
|
||||
@@ -1091,7 +1115,7 @@
|
||||
"calendar-header-label": "Encabezado del calendario",
|
||||
"calendar-month-label": "Mes del calendario",
|
||||
"date-time-12hour-format-description": "Muestra la hora en formato de 12 horas en la pantalla de bloqueo y el calendario. El reloj de la barra tiene su propia configuración.",
|
||||
"date-time-12hour-format-label": "Utilice el formato de hora de 12 horas",
|
||||
"date-time-12hour-format-label": "Utiliza el formato de 12 horas",
|
||||
"date-time-desc": "Personaliza cómo aparecen la fecha y la hora.",
|
||||
"date-time-first-day-of-week-automatic": "Automático (usar la configuración regional del sistema)",
|
||||
"date-time-first-day-of-week-description": "Elige qué día empieza la semana en el calendario.",
|
||||
@@ -1133,8 +1157,8 @@
|
||||
"lock-on-suspend-label": "Bloquear al suspender",
|
||||
"show-hibernate-description": "Mostrar la opción 'hibernar' en los controles de energía.",
|
||||
"show-hibernate-label": "Mostrar hibernar",
|
||||
"show-session-buttons-description": "Permitir el acceso a la configuración de energía desde la pantalla de bloqueo.",
|
||||
"show-session-buttons-label": "Controles de energía",
|
||||
"show-session-buttons-description": "Permitir el acceso a las opciones de sesión desde la pantalla de bloqueo.",
|
||||
"show-session-buttons-label": "Opciones de sesión",
|
||||
"title": "Pantalla de bloqueo"
|
||||
},
|
||||
"network": {
|
||||
@@ -1210,7 +1234,7 @@
|
||||
"always-on-top-description": "Mostrar OSD por encima de ventanas de pantalla completa y otras capas.",
|
||||
"always-on-top-label": "Siempre encima",
|
||||
"background-opacity-description": "Controls the transparency of the OSD background.",
|
||||
"background-opacity-label": "Background opacity",
|
||||
"background-opacity-label": "Opacidad del fondo",
|
||||
"description": "Configura indicadores superpuestos como volumen y brillo.",
|
||||
"duration-auto-hide-description": "Ajusta el tiempo antes de que el OSD desaparezca.",
|
||||
"duration-auto-hide-label": "Ocultar después de",
|
||||
@@ -1308,7 +1332,7 @@
|
||||
"entries-desc": "Personalizar qué acciones de energía aparecen en el menú de sesión y en qué orden.",
|
||||
"entries-title": "Acciones de energía",
|
||||
"entry-settings-command-description": "Comando personalizado para ejecutar para esta acción. Dejar vacío para usar el comando del sistema predeterminado.",
|
||||
"entry-settings-command-placeholder": "systemctl poweroff",
|
||||
"entry-settings-command-placeholder": "p.ej., systemctl poweroff",
|
||||
"entry-settings-default-command-lock": "Pantalla de bloqueo interna (sin comando)",
|
||||
"entry-settings-default-command-logout": "Cierre de sesión interno (sin comando)",
|
||||
"entry-settings-default-info-description": "Si no se especifica un comando personalizado, se utilizará el comando predeterminado del sistema.",
|
||||
@@ -1368,13 +1392,13 @@
|
||||
"control-border-radius-reset": "Restablecer el radio de entrada",
|
||||
"desc": "Personaliza la apariencia, el ambiente y el comportamiento de la interfaz.",
|
||||
"dim-desktop-description": "Atenuar el escritorio cuando los paneles o menús estén abiertos.",
|
||||
"dim-desktop-label": "Dim escritorio",
|
||||
"dim-desktop-label": "Atenuar escritorio",
|
||||
"dimmer-opacity-description": "Define el nivel de opacidad para el atenuado del escritorio.",
|
||||
"dimmer-opacity-label": "Opacidad del escritorio atenuado",
|
||||
"dimmer-opacity-reset": "Restablecer la opacidad del escritorio atenuado",
|
||||
"panel-background-opacity-description": "Establecer la opacidad del fondo para todos los paneles (barra, lanzador, ajustes, etc...).",
|
||||
"panel-background-opacity-label": "Opacidad de fondo del panel",
|
||||
"panels-attached-to-bar-description": "Los paneles se fijan a la barra y a los bordes de la pantalla, creando una apariencia impecable con elegantes esquinas invertidas.",
|
||||
"panel-background-opacity-label": "Opacidad del fondo del panel",
|
||||
"panels-attached-to-bar-description": "Los paneles se fijan a la barra y a los bordes de la pantalla, creando una apariencia integrada con elegantes esquinas invertidas.",
|
||||
"panels-attached-to-bar-label": "Ajustar paneles a los bordes",
|
||||
"panels-overlay-description": "Garantiza que los paneles y la barra permanezcan visibles, incluso sobre aplicaciones en pantalla completa.",
|
||||
"panels-overlay-label": "Mantener paneles y barra en la parte superior",
|
||||
@@ -1395,11 +1419,11 @@
|
||||
"automation-change-mode-alphabetical": "Alfabético",
|
||||
"automation-change-mode-description": "Elija cómo se seleccionan los fondos de pantalla al cambiar automáticamente.",
|
||||
"automation-change-mode-label": "Modo de cambio",
|
||||
"automation-custom-interval-description": "Ingresa el tiempo como HH:MM (ej., 01:30).",
|
||||
"automation-custom-interval-description": "Introduce el tiempo en formato HH:MM (p.ej., 01:30).",
|
||||
"automation-custom-interval-label": "Intervalo personalizado",
|
||||
"automation-interval-description": "Con qué frecuencia cambiar los fondos de pantalla automáticamente.",
|
||||
"automation-interval-label": "Intervalo del fondo de pantalla",
|
||||
"automation-random-wallpaper-description": "Programa cambios aleatorios de fondo de pantalla a intervalos regulares.",
|
||||
"automation-random-wallpaper-description": "Programa cambios aleatorios del fondo de pantalla a intervalos regulares.",
|
||||
"automation-scheduled-change-description": "Cambiar automáticamente los fondos de pantalla a intervalos regulares.",
|
||||
"automation-scheduled-change-label": "Cambio programado",
|
||||
"look-feel-edge-smoothness-description": "Aplica un efecto suave y difuminado al borde de las transiciones.",
|
||||
@@ -1436,18 +1460,18 @@
|
||||
"settings-view-mode-label": "Modo de visualización",
|
||||
"view-mode-browse": "Explorar directorios",
|
||||
"view-mode-cycle-tooltip": "Modo de visualización: {mode} (clic para cambiar)",
|
||||
"view-mode-recursive": "Subdirectorios aplanados",
|
||||
"view-mode-recursive": "Incluir subdirectorios",
|
||||
"view-mode-single": "Directorio raíz"
|
||||
}
|
||||
},
|
||||
"placeholders": {
|
||||
"command-example": "echo \"Hola, mundo\"",
|
||||
"enter-command": "Ingresa el comando a ejecutar (aplicación o script personalizado)",
|
||||
"enter-ipc-identifier": "Introduzca un identificador único para los comandos IPC",
|
||||
"enter-path": "Ingrese la ruta...",
|
||||
"enter-text-to-collapse": "por ejemplo, 'no se está reproduciendo nada'. Usa /regex/ para patrones.",
|
||||
"enter-tooltip": "Introducir información sobre herramientas",
|
||||
"enter-width-pixels": "Ingresa el ancho en píxeles",
|
||||
"enter-command": "Introduce el comando a ejecutar (aplicación o script personalizado)",
|
||||
"enter-ipc-identifier": "Introduce un identificador único para los comandos IPC",
|
||||
"enter-path": "Introduce la ruta...",
|
||||
"enter-text-to-collapse": "p.ej., 'no se está reproduciendo nada'. Usa /regex/ para patrones.",
|
||||
"enter-tooltip": "Introduce tooltip",
|
||||
"enter-width-pixels": "Introduce el ancho en píxeles",
|
||||
"search": "Buscar...",
|
||||
"search-icons": "ej., noctalia, niri, battery, cloud",
|
||||
"search-launcher": "Buscar entradas... o usa > para comandos",
|
||||
@@ -1479,7 +1503,7 @@
|
||||
"setup": {
|
||||
"all-done": "¡Listo!",
|
||||
"appearance": {
|
||||
"subheader": "Elige el Dark Mode y las fuentes de color (Wallpaper o predefinidas)."
|
||||
"subheader": "Elige el Modo Oscuro y las fuentes de color (Wallpaper o predefinidas)."
|
||||
},
|
||||
"customize": {
|
||||
"header": "Personaliza tu experiencia",
|
||||
@@ -1487,14 +1511,14 @@
|
||||
},
|
||||
"skip-setup": "Omitir la configuración",
|
||||
"telemetry-wizard-done": "¡Entendido!",
|
||||
"telemetry-wizard-note": "Tienes el control: activa o desactiva esto cuando quieras en los Ajustes",
|
||||
"telemetry-wizard-note": "Tienes el control — activa o desactiva esto cuando quieras en los Ajustes",
|
||||
"telemetry-wizard-subtitle": "Hemos añadido analíticas anónimas para ayudar a mejorar Noctalia",
|
||||
"telemetry-wizard-title": "Actualización de privacidad",
|
||||
"wallpaper": {
|
||||
"choose-dir": "Elige un directorio que contenga tus fondos",
|
||||
"choose-dir": "Elige un directorio que contenga tus fondos de pantalla",
|
||||
"dir-browse": "Seleccionar carpeta",
|
||||
"dir-description": "Elige la carpeta que contiene tus fondos.",
|
||||
"dir-label": "Directorio de fondos",
|
||||
"dir-description": "Elige la carpeta que contiene tus fondos de pantalla.",
|
||||
"dir-label": "Directorio de fondos de pantalla",
|
||||
"dir-select-title": "Seleccionar carpeta de fondos",
|
||||
"header": "Elige tu fondo",
|
||||
"no-dir": "No se seleccionó un directorio de fondos",
|
||||
@@ -1504,7 +1528,7 @@
|
||||
"select-prompt": "Selecciona un fondo abajo",
|
||||
"subheader": "Define el ambiente con un bonito fondo."
|
||||
},
|
||||
"welcome-note": "Solo algunos conceptos básicos para empezar: todas las opciones están en configuración",
|
||||
"welcome-note": "Solo algunos ajustes básicos para empezar — las opciones al completo están en configuración",
|
||||
"welcome-subtitle": "Hagamos que tu escritorio sea único",
|
||||
"welcome-title": "¡Bienvenido a Noctalia!"
|
||||
},
|
||||
@@ -1528,7 +1552,7 @@
|
||||
"disk": "Disco",
|
||||
"download-speed": "Velocidad de descarga",
|
||||
"gpu-temp": "Temperatura de GPU",
|
||||
"load-average": "Carga prom.",
|
||||
"load-average": "Carga media",
|
||||
"title": "Monitor del sistema",
|
||||
"upload-speed": "Velocidad de subida"
|
||||
},
|
||||
@@ -1551,8 +1575,8 @@
|
||||
"display-code": "Introduce el código {value} en el otro dispositivo.",
|
||||
"forget-failed": "Error al olvidar el dispositivo",
|
||||
"pair-failed": "Error al emparejar el dispositivo",
|
||||
"passkey-required": "Se requiere una clave de acceso del dispositivo.",
|
||||
"pincode-required": "Se requiere el código PIN del dispositivo.",
|
||||
"passkey-required": "El dispositivo requiere una clave de acceso.",
|
||||
"pincode-required": "El dispositivo requiere código PIN.",
|
||||
"state-change-failed": "Error al cambiar el estado de Bluetooth"
|
||||
},
|
||||
"clipboard": {
|
||||
@@ -1588,7 +1612,7 @@
|
||||
},
|
||||
"power-profile": {
|
||||
"changed": "Perfil de energía cambiado",
|
||||
"profile-name": "{profile"
|
||||
"profile-name": "{profile}"
|
||||
},
|
||||
"theming-processor-failed": {
|
||||
"desc-generic": "Se encontró un error al procesar las plantillas",
|
||||
@@ -1648,7 +1672,7 @@
|
||||
"open-settings": "Configuración",
|
||||
"open-tray-dropdown": "Bandeja del sistema",
|
||||
"output-muted": "Alternar silencio de salida",
|
||||
"power-profile": "{profile} perfil de energía",
|
||||
"power-profile": "Perfil de energía {profile}",
|
||||
"previous-media": "Pista anterior",
|
||||
"previous-month": "Mes anterior",
|
||||
"refresh-devices": "Actualizar dispositivos",
|
||||
@@ -1658,8 +1682,8 @@
|
||||
"search-close": "Cerrar búsqueda",
|
||||
"session-menu": "Menú de sesión",
|
||||
"show-all-devices": "Mostrar todos los dispositivos",
|
||||
"switch-to-dark-mode": "Modo oscuro",
|
||||
"switch-to-light-mode": "Modo claro",
|
||||
"switch-to-dark-mode": "Modo Oscuro",
|
||||
"switch-to-light-mode": "Modo Claro",
|
||||
"unmute": "Activar el audio",
|
||||
"up": "Directorio superior",
|
||||
"volume-at": "Volumen de salida: {volume}%",
|
||||
@@ -1668,7 +1692,7 @@
|
||||
"wallpaper": {
|
||||
"browse": {
|
||||
"empty-directory": "Este directorio está vacío.",
|
||||
"go-root": "Ir a la raíz del fondo de pantalla",
|
||||
"go-root": "Ir a la carpeta raíz de fondos de pantalla",
|
||||
"go-up": "Ir a la carpeta superior",
|
||||
"go-up-hint": "Usa el botón de atrás para navegar hacia arriba."
|
||||
},
|
||||
@@ -1711,7 +1735,7 @@
|
||||
"sorting-favorites": "Favoritos",
|
||||
"sorting-label": "Ordenar por",
|
||||
"sorting-relevance": "Relevancia",
|
||||
"sorting-toplist": "Lista superior",
|
||||
"sorting-toplist": "Mejores",
|
||||
"sorting-views": "Visualizaciones",
|
||||
"source-label": "Fuente",
|
||||
"source-wallhaven": "Wallhaven",
|
||||
@@ -1769,7 +1793,7 @@
|
||||
"minute-leading-zero": "Minuto con cero inicial (00-59)",
|
||||
"minute-no-leading-zero": "Minuto sin cero inicial (0-59)",
|
||||
"month-abbreviated": "Nombre del mes abreviado",
|
||||
"month-full": "Nombre completo del mes",
|
||||
"month-full": "Nombre del mes completo",
|
||||
"month-number-leading-zero": "Mes como número con cero inicial (01-12)",
|
||||
"month-number-no-zero": "Mes como número sin cero inicial (1-12)",
|
||||
"second-leading-zero": "Segundo con cero inicial (00-59)",
|
||||
@@ -1782,15 +1806,15 @@
|
||||
"item": "elemento",
|
||||
"items": "elementos",
|
||||
"search-placeholder": "Buscar archivos y carpetas...",
|
||||
"select-current": "Seleccionar actual",
|
||||
"select-file": "Seleccionar archivo",
|
||||
"select-folder": "Seleccionar carpeta",
|
||||
"select-current": "Seleccionar Actual",
|
||||
"select-file": "Seleccionar Archivo",
|
||||
"select-folder": "Seleccionar Carpeta",
|
||||
"selected": "Seleccionado:",
|
||||
"title": "Selector de archivos"
|
||||
"title": "Selector de Archivos"
|
||||
},
|
||||
"file-picker-title": "Seleccionar un archivo",
|
||||
"icon-picker": {
|
||||
"title": "Selector de iconos"
|
||||
"title": "Selector de Iconos"
|
||||
},
|
||||
"tooltip-placeholder": "Marcador de posición"
|
||||
},
|
||||
@@ -1815,7 +1839,7 @@
|
||||
"known-networks": "Redes conocidas",
|
||||
"link-speed": "Velocidad de enlace",
|
||||
"no-ethernet-devices": "No se detectaron dispositivos Ethernet",
|
||||
"no-networks": "No se encontraron redes",
|
||||
"no-networks": "No se encontraron redes Wi-Fi",
|
||||
"saved": "Guardado",
|
||||
"scan-again": "Escanear de nuevo",
|
||||
"searching": "Buscando redes cercanas...",
|
||||
@@ -1823,9 +1847,9 @@
|
||||
},
|
||||
"signal": {
|
||||
"excellent": "Excelente",
|
||||
"fair": "Regular",
|
||||
"fair": "Razonable",
|
||||
"good": "Bueno",
|
||||
"poor": "Débil"
|
||||
"poor": "Pobre"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -354,7 +354,7 @@
|
||||
"actions": "Actions",
|
||||
"add": "Ajouter",
|
||||
"appearance": "Apparence",
|
||||
"apply": "Postuler",
|
||||
"apply": "Appliquer",
|
||||
"automation": "Automatisation",
|
||||
"available": "Disponible",
|
||||
"back": "Retour",
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Semaine",
|
||||
"widgets": "Widgets",
|
||||
"width": "Largeur",
|
||||
"windows": "Fenêtres",
|
||||
"yes": "Oui"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Au survol"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Masquer automatiquement ",
|
||||
"hidden": "Masquer quand vide",
|
||||
"idle": "Masquer quand inactif",
|
||||
"transparent": "Transparent quand vide",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Chargement des émojis...",
|
||||
"emoji-loading-description": "Veuillez patienter",
|
||||
"emoji-no-recent": "Aucun emoji récent pour le moment",
|
||||
"emoji-search-description": "Rechercher et copier des émojis"
|
||||
"emoji-search-description": "Rechercher et copier des émojis",
|
||||
"settings-search-description": "Trouvez et explorez les paramètres",
|
||||
"windows-search-description": "Rechercher et focaliser les fenêtres ouvertes"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Défaut",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Spacieux",
|
||||
"display-mode-always-visible": "Toujours Visible",
|
||||
"type-floating": "Flottante",
|
||||
"type-framed": "Encadrée",
|
||||
"type-simple": "Simple"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Autoriser le dépassement du volume"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Délai avant que la barre ne se masque après le départ de la souris",
|
||||
"appearance-auto-hide-delay-label": "Délai de masquage ",
|
||||
"appearance-auto-hide-exclusive-note": "Remarque : La zone exclusive est automatiquement désactivée lorsque le masquage automatique est actif",
|
||||
"appearance-auto-show-delay-description": "Délai avant que la barre ne s’affiche lorsque la souris entre en bordure",
|
||||
"appearance-auto-show-delay-label": "Délai d’apparition ",
|
||||
"appearance-background-opacity-description": "Définir l'opacité de l'arrière-plan spécifiquement pour la barre.",
|
||||
"appearance-background-opacity-label": "Opacité de l'arrière-plan de la barre",
|
||||
"appearance-capsule-opacity-description": "Définir le niveau d'opacité des arrière-plans des widgets quand la capsule est affichée.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Ajustez le remplissage de la barre pour un aspect compact ou spacieux.",
|
||||
"appearance-density-label": "Densité de la barre",
|
||||
"appearance-desc": "Personnalisez l'apparence et la position de la barre.",
|
||||
"appearance-display-mode-description": "Choisir quand la barre est visible ",
|
||||
"appearance-display-mode-label": "Mode d’affichage ",
|
||||
"appearance-floating-description": "Afficher la barre sous forme de 'pilule' flottante.",
|
||||
"appearance-floating-label": "Barre flottante",
|
||||
"appearance-frame-radius": "Rayon interne",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Afficher les boutons",
|
||||
"media-player-show-visualizer-description": "Afficher la superposition de l'visualiseur audio.",
|
||||
"media-player-visualizer-type-description": "Choisissez un type de visualisation pour l'arrière-plan du lecteur multimédia de bureau.",
|
||||
"system-stat-layout-bottom": "Bas",
|
||||
"system-stat-layout-description": "Choisissez comment la légende est affichée par rapport au graphique.",
|
||||
"system-stat-layout-label": "Disposition",
|
||||
"system-stat-layout-side": "Côté",
|
||||
"system-stat-rounded-corners-description": "Utiliser des coins arrondis pour l'arrière-plan du widget.",
|
||||
"system-stat-rounded-corners-label": "Coins Arrondis",
|
||||
"system-stat-show-background-description": "Afficher le conteneur d'arrière-plan pour le widget de statistiques système.",
|
||||
"system-stat-show-background-label": "Afficher l'arrière-plan",
|
||||
"system-stat-stat-type-description": "Choisis quelle statistique système afficher.",
|
||||
"system-stat-stat-type-label": "Type de Statistique",
|
||||
"title": "Widgets de bureau",
|
||||
"weather-enabled-description": "Afficher un widget météo sur le bureau.",
|
||||
"weather-enabled-label": "Activer le widget météo",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Personnalisez le comportement et l'apparence du lanceur.",
|
||||
"settings-enable-settings-search-description": "Afficher les résultats des paramètres lors de la recherche dans le lanceur.",
|
||||
"settings-enable-settings-search-label": "Activer la recherche dans les paramètres",
|
||||
"settings-enable-windows-search-description": "Rechercher et focaliser les fenêtres actives.",
|
||||
"settings-enable-windows-search-label": "Activer la recherche de fenêtres",
|
||||
"settings-grid-view-description": "Afficher les éléments dans une grille au lieu d'une liste.",
|
||||
"settings-icon-mode-description": "Utiliser les icônes natives du système au lieu des icônes Tabler.",
|
||||
"settings-icon-mode-label": "Utiliser les icônes natives",
|
||||
|
||||
@@ -1,29 +1,5 @@
|
||||
{
|
||||
"bar": {
|
||||
"workspace": {
|
||||
"empty-color-description": "खाली कार्यस्थानों के लिए पृष्ठभूमि रंग सेट करें।",
|
||||
"empty-color-label": "खाली कार्यस्थान रंग",
|
||||
"focused-color-description": "फोकस गरिएको कार्यक्षेत्रको लागि पृष्ठभूमि रङ सेट गर्नुहोस्।",
|
||||
"focused-color-label": "फोकस किए गए कार्यक्षेत्र का रंग",
|
||||
"occupied-color-description": "काम में लिए गए कार्यस्थानों के लिए पृष्ठभूमि रंग सेट करें।",
|
||||
"occupied-color-label": "अधिकृत कार्यक्षेत्र रंग",
|
||||
"show-badge-description": "समूहीकृत मोड में कार्यस्थान संख्या बैज दिखाएँ।",
|
||||
"show-badge-label": "कार्यस्थान बैज देखाउनुहोस्"
|
||||
}
|
||||
},
|
||||
"common": {
|
||||
"on-surface": "सतह पर",
|
||||
"primary": "प्राइमरी",
|
||||
"secondary": "माध्यमिक",
|
||||
"tertiary": "तृतीयक"
|
||||
},
|
||||
"panels": {
|
||||
"lock-screen": {
|
||||
"auto-start-auth-description": "उदाहरण के लिए, बिना किसी कुंजी प्रेस या बटन क्लिक की आवश्यकता के स्वचालित रूप से फिंगरप्रिंट प्रमाणीकरण शुरू करता है।",
|
||||
"auto-start-auth-label": "स्वतः प्रमाणन शुरू करें"
|
||||
}
|
||||
},
|
||||
"toast": {
|
||||
"donation-opened": "दान पृष्ठ आपके ब्राउज़र में खुला"
|
||||
"donation-opened": ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Hét",
|
||||
"widgets": "Widgetek",
|
||||
"width": "Szélesség",
|
||||
"windows": "Ablakok",
|
||||
"yes": "Igen"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Rámutatáskor"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Automatikus elrejtés",
|
||||
"hidden": "Elrejtés, ha üres",
|
||||
"idle": "Elrejtés, ha tétlen",
|
||||
"transparent": "Átlátszó, ha üres",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Emojik betöltése...",
|
||||
"emoji-loading-description": "Kis türelmet",
|
||||
"emoji-no-recent": "Nincsenek még legutóbbi emojik",
|
||||
"emoji-search-description": "Emojik keresése és másolása"
|
||||
"emoji-search-description": "Emojik keresése és másolása",
|
||||
"settings-search-description": "Keresés és navigálás a beállításokhoz",
|
||||
"windows-search-description": "Nyitott ablakok keresése és fókuszálása"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Alapértelmezett",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Tágas",
|
||||
"display-mode-always-visible": "Mindig látható",
|
||||
"type-floating": "Lebegő",
|
||||
"type-framed": "Keretes",
|
||||
"type-simple": "Egyszerű"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Hangerő túllépésének engedélyezése"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Idő, amíg a Bar elrejtőzik, miután az egér elhagyja.",
|
||||
"appearance-auto-hide-delay-label": "Elrejtési késleltetés",
|
||||
"appearance-auto-hide-exclusive-note": "Megjegyzés: Az exkluzív zóna automatikusan letiltásra kerül, ha az automatikus elrejtés aktív.",
|
||||
"appearance-auto-show-delay-description": "Idő, mielőtt a sáv megjelenik, ha az egér a szélre kerül.",
|
||||
"appearance-auto-show-delay-label": "Megjelenítési Késleltetés",
|
||||
"appearance-background-opacity-description": "Állítsa be a sáv háttér átlátszóságát.",
|
||||
"appearance-background-opacity-label": "Sáv háttér átlátszósága",
|
||||
"appearance-capsule-opacity-description": "Beállítja a widget hátterének átlátszósági szintjét, amikor a kapszula megjelenik.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Beállítja a sáv belső margóit a kompakt vagy tágas megjelenés érdekében.",
|
||||
"appearance-density-label": "Sáv sűrűsége",
|
||||
"appearance-desc": "A sáv megjelenésének és pozíciójának testreszabása.",
|
||||
"appearance-display-mode-description": "Válassza ki, mikor látható a sáv.",
|
||||
"appearance-display-mode-label": "Kijelző mód",
|
||||
"appearance-floating-description": "Megjeleníti a sávot lebegő „pirulaként”.",
|
||||
"appearance-floating-label": "Lebegő sáv",
|
||||
"appearance-frame-radius": "Belső sugár",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Gombok megjelenítése",
|
||||
"media-player-show-visualizer-description": "Audiovizuális megjelenítő fedvény megjelenítése.",
|
||||
"media-player-visualizer-type-description": "Válasszon vizualizációs típust az asztali média lejátszó hátteréhez.",
|
||||
"system-stat-layout-bottom": "Lent",
|
||||
"system-stat-layout-description": "Válassza ki, hogyan jelenjen meg a jelmagyarázat a grafikonhoz képest.",
|
||||
"system-stat-layout-label": "Elrendezés",
|
||||
"system-stat-layout-side": "Oldal",
|
||||
"system-stat-rounded-corners-description": "Lekerekített sarkok használata a widget hátteréhez.",
|
||||
"system-stat-rounded-corners-label": "Lekerekített Sarkok",
|
||||
"system-stat-show-background-description": "Mutassa a háttérkonténert a rendszerstatisztika Widgethez.",
|
||||
"system-stat-show-background-label": "Háttér megjelenítése",
|
||||
"system-stat-stat-type-description": "Válaszd ki, melyik rendszerstatisztikát jelenítsd meg.",
|
||||
"system-stat-stat-type-label": "Statisztika Típusa",
|
||||
"title": "Asztali Widgetek",
|
||||
"weather-enabled-description": "Időjárás widget megjelenítése az asztalon.",
|
||||
"weather-enabled-label": "Időjárás widget engedélyezése",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Az indító viselkedésének és megjelenésének testreszabása.",
|
||||
"settings-enable-settings-search-description": "Beállítások megjelenítése a találatok között az indítón belül.",
|
||||
"settings-enable-settings-search-label": "Beállítások keresésének engedélyezése",
|
||||
"settings-enable-windows-search-description": "Aktív ablakok keresése és fókuszálása.",
|
||||
"settings-enable-windows-search-label": "Ablakkeresés engedélyezése",
|
||||
"settings-grid-view-description": "Elemek megjelenítése rács elrendezésben lista helyett.",
|
||||
"settings-icon-mode-description": "Használjon natív rendszerikonokat a Tabler ikonok helyett.",
|
||||
"settings-icon-mode-label": "Natív ikonok használata",
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "週",
|
||||
"widgets": "ウィジェット",
|
||||
"width": "幅",
|
||||
"windows": "ウィンドウ",
|
||||
"yes": "はい"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "マウスオーバー時"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "自動非表示",
|
||||
"hidden": "空の場合に非表示",
|
||||
"idle": "アイドル時に非表示",
|
||||
"transparent": "空の時は透明",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "絵文字を読み込み中...",
|
||||
"emoji-loading-description": "お待ちください",
|
||||
"emoji-no-recent": "まだ最近使った絵文字はありません",
|
||||
"emoji-search-description": "絵文字を検索してコピー"
|
||||
"emoji-search-description": "絵文字を検索してコピー",
|
||||
"settings-search-description": "設定を検索して移動",
|
||||
"windows-search-description": "開いているウィンドウを検索してフォーカスする"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "標準",
|
||||
"density-mini": "ミニ",
|
||||
"density-spacious": "広々とした",
|
||||
"display-mode-always-visible": "常に表示",
|
||||
"type-floating": "フローティング",
|
||||
"type-framed": "フレーム",
|
||||
"type-simple": "シンプル"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "100%以上の音量を許可"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "マウスカーソルがBarから離れた後、Barが非表示になるまでの時間",
|
||||
"appearance-auto-hide-delay-label": "非表示遅延",
|
||||
"appearance-auto-hide-exclusive-note": "注: 自動非表示が有効な場合、排他ゾーンは自動的に無効になります。",
|
||||
"appearance-auto-show-delay-description": "マウスが端に到達したときにバーが表示されるまでの時間。",
|
||||
"appearance-auto-show-delay-label": "表示遅延",
|
||||
"appearance-background-opacity-description": "バーの背景の不透明度を特に設定します。",
|
||||
"appearance-background-opacity-label": "バーの背景の不透明度",
|
||||
"appearance-capsule-opacity-description": "カプセル表示時のウィジェット背景の不透明度を設定します。",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "バーの余白を調整し、コンパクトまたはゆったりとした外観にします。",
|
||||
"appearance-density-label": "バーの密度",
|
||||
"appearance-desc": "バーの外観や位置をカスタマイズします。",
|
||||
"appearance-display-mode-description": "バーの表示タイミングを選択してください",
|
||||
"appearance-display-mode-label": "表示モード",
|
||||
"appearance-floating-description": "バーを浮かせて、カプセル型で表示します。",
|
||||
"appearance-floating-label": "フローティングバー",
|
||||
"appearance-frame-radius": "内側の半径",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "ボタンを表示",
|
||||
"media-player-show-visualizer-description": "オーディオビジュアライザーのオーバーレイを表示する。",
|
||||
"media-player-visualizer-type-description": "デスクトップメディアプレーヤーの背景に使用するビジュアライザーの種類を選択します。",
|
||||
"system-stat-layout-bottom": "下",
|
||||
"system-stat-layout-description": "凡例がグラフに対してどのように表示されるかを選択します。",
|
||||
"system-stat-layout-label": "レイアウト",
|
||||
"system-stat-layout-side": "側",
|
||||
"system-stat-rounded-corners-description": "ウィジェットの背景に丸い角を使用する。",
|
||||
"system-stat-rounded-corners-label": "角丸",
|
||||
"system-stat-show-background-description": "システム統計ウィジェットの背景コンテナを表示します。",
|
||||
"system-stat-show-background-label": "背景を表示",
|
||||
"system-stat-stat-type-description": "表示するシステム統計を選択してください。",
|
||||
"system-stat-stat-type-label": "統計の種類",
|
||||
"title": "デスクトップウィジェット",
|
||||
"weather-enabled-description": "デスクトップに天気ウィジェットを表示します。",
|
||||
"weather-enabled-label": "天気ウィジェットを有効化",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "ランチャーの挙動と外観をカスタマイズします。",
|
||||
"settings-enable-settings-search-description": "ランチャーで検索する際に設定結果を表示する。",
|
||||
"settings-enable-settings-search-label": "設定検索を有効にする",
|
||||
"settings-enable-windows-search-description": "アクティブなウィンドウを検索してフォーカスします。",
|
||||
"settings-enable-windows-search-label": "ウィンドウ検索を有効にする",
|
||||
"settings-grid-view-description": "リスト形式の代わりに、グリッド(格子状)レイアウトで項目を表示します。",
|
||||
"settings-icon-mode-description": "Tablerアイコンではなく、ネイティブのシステムアイコンを使用します。",
|
||||
"settings-icon-mode-label": "ネイティブアイコンを使用",
|
||||
|
||||
@@ -370,7 +370,7 @@
|
||||
"clear": "지우기",
|
||||
"clipboard": "클립보드",
|
||||
"close": "닫기",
|
||||
"color-muted": "음소거",
|
||||
"color-muted": "차분하게",
|
||||
"colors": "색상",
|
||||
"command": "명령",
|
||||
"connect": "연결",
|
||||
@@ -395,7 +395,7 @@
|
||||
"enabled": "활성화됨",
|
||||
"events": "일정",
|
||||
"execute": "실행",
|
||||
"faithful": "Faithful",
|
||||
"faithful": "충실하게",
|
||||
"focus": "포커스",
|
||||
"frequency": "빈도",
|
||||
"gateway": "게이트웨이",
|
||||
@@ -483,7 +483,7 @@
|
||||
"update": "업데이트",
|
||||
"upload": "업로드",
|
||||
"version": "버전",
|
||||
"vibrant": "생기 있게",
|
||||
"vibrant": "선명하게",
|
||||
"visualizer": "비주얼라이저",
|
||||
"volume": "볼륨",
|
||||
"volumes": "볼륨",
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "주",
|
||||
"widgets": "위젯",
|
||||
"width": "너비",
|
||||
"windows": "창",
|
||||
"yes": "예"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "마우스 오버 시"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "자동 숨기기",
|
||||
"hidden": "비어 있을 때 숨기기",
|
||||
"idle": "유휴 상태일 때 숨기기",
|
||||
"transparent": "비어 있을 때 투명하게",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "이모티콘 로딩 중...",
|
||||
"emoji-loading-description": "잠시만 기다려 주세요",
|
||||
"emoji-no-recent": "최근 이모티콘이 없습니다",
|
||||
"emoji-search-description": "이모티콘 검색 및 복사"
|
||||
"emoji-search-description": "이모티콘 검색 및 복사",
|
||||
"settings-search-description": "설정 검색 및 이동",
|
||||
"windows-search-description": "열려 있는 창 검색 및 포커스"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "기본",
|
||||
"density-mini": "미니",
|
||||
"density-spacious": "넓게",
|
||||
"display-mode-always-visible": "항상 표시",
|
||||
"type-floating": "플로팅",
|
||||
"type-framed": "프레임",
|
||||
"type-simple": "심플"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "볼륨 오버드라이브 허용"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "마우스가 Bar를 벗어난 후 Bar가 숨겨지기까지의 시간",
|
||||
"appearance-auto-hide-delay-label": "숨기기 지연",
|
||||
"appearance-auto-hide-exclusive-note": "참고: 자동 숨기기가 활성화되면 전용 영역이 자동으로 비활성화됩니다.",
|
||||
"appearance-auto-show-delay-description": "마우스가 가장자리에 진입할 때 바가 표시되기까지의 시간.",
|
||||
"appearance-auto-show-delay-label": "표시 지연",
|
||||
"appearance-background-opacity-description": "바에 대해서만 별도로 배경 불투명도를 설정합니다.",
|
||||
"appearance-background-opacity-label": "바 배경 불투명도",
|
||||
"appearance-capsule-opacity-description": "캡슐이 표시될 때 위젯 배경의 불투명도 수준을 설정합니다.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "컴팩트하거나 넓은 모양을 위해 바의 패딩을 조정합니다.",
|
||||
"appearance-density-label": "바 밀도",
|
||||
"appearance-desc": "바의 모양과 위치를 사용자 지정합니다.",
|
||||
"appearance-display-mode-description": "바가 언제 표시될지 선택하세요.",
|
||||
"appearance-display-mode-label": "디스플레이 모드",
|
||||
"appearance-floating-description": "바를 플로팅 '알약' 형태로 표시합니다.",
|
||||
"appearance-floating-label": "플로팅 바",
|
||||
"appearance-frame-radius": "내부 반경",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "버튼 표시",
|
||||
"media-player-show-visualizer-description": "오디오 비주얼라이저 오버레이를 표시합니다.",
|
||||
"media-player-visualizer-type-description": "비주얼라이저 유형을 선택하세요.",
|
||||
"system-stat-layout-bottom": "아래",
|
||||
"system-stat-layout-description": "범례가 그래프에 상대적으로 어떻게 표시되는지 선택합니다.",
|
||||
"system-stat-layout-label": "레이아웃",
|
||||
"system-stat-layout-side": "측면",
|
||||
"system-stat-rounded-corners-description": "위젯 배경에 둥근 모서리를 사용합니다.",
|
||||
"system-stat-rounded-corners-label": "둥근 모서리",
|
||||
"system-stat-show-background-description": "시스템 통계 위젯의 배경 컨테이너를 표시합니다.",
|
||||
"system-stat-show-background-label": "배경 표시",
|
||||
"system-stat-stat-type-description": "표시할 시스템 통계를 선택하세요.",
|
||||
"system-stat-stat-type-label": "통계 유형",
|
||||
"title": "바탕 화면 위젯",
|
||||
"weather-enabled-description": "바탕 화면에 날씨 위젯을 표시합니다.",
|
||||
"weather-enabled-label": "날씨 위젯 활성화",
|
||||
@@ -913,8 +935,8 @@
|
||||
"monitors-title": "모니터별 설정",
|
||||
"night-light-auto-schedule-description": "<i>{location}</i>의 일몰 및 일출 시간을 기준으로 함 — 권장됨.",
|
||||
"night-light-auto-schedule-label": "자동 일정",
|
||||
"night-light-desc": "청색광 방출을 줄여 수면을 돕고 눈의 피로를 줄입니다.",
|
||||
"night-light-enable-description": "청색광 방출을 줄이기 위해 따뜻한 색상 필터를 적용합니다.",
|
||||
"night-light-desc": "청색광(블루 라이트) 방출을 줄여 수면을 돕고 눈의 피로를 줄입니다.",
|
||||
"night-light-enable-description": "청색광(블루 라이트) 방출을 줄이기 위해 따뜻한 색상 필터를 적용합니다.",
|
||||
"night-light-enable-label": "야간 조명 활성화",
|
||||
"night-light-force-activation-description": "일정을 무시하고 야간 필터를 즉시 적용합니다.",
|
||||
"night-light-force-activation-label": "강제 활성화",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "런처의 동작과 모양을 사용자 지정합니다.",
|
||||
"settings-enable-settings-search-description": "런처에서 검색할 때 설정 결과를 표시합니다.",
|
||||
"settings-enable-settings-search-label": "설정 검색 활성화",
|
||||
"settings-enable-windows-search-description": "활성 창을 검색하고 포커스합니다.",
|
||||
"settings-enable-windows-search-label": "창 검색 활성화",
|
||||
"settings-grid-view-description": "항목을 목록 대신 그리드 레이아웃으로 표시합니다.",
|
||||
"settings-icon-mode-description": "Tabler 아이콘 대신 기본 시스템 아이콘을 사용합니다.",
|
||||
"settings-icon-mode-label": "기본 아이콘 사용",
|
||||
@@ -1145,24 +1169,24 @@
|
||||
"wifi-description": "무선 네트워크를 관리합니다 (NetworkManager 필요)."
|
||||
},
|
||||
"notifications": {
|
||||
"duration-critical-urgency-description": "긴급 중요도 알림이 표시되는 시간입니다.",
|
||||
"duration-critical-urgency-label": "긴급 중요도",
|
||||
"duration-desc": "중요도 수준에 따라 알림이 표시되는 시간을 구성합니다.",
|
||||
"duration-low-urgency-description": "낮음 중요도 알림이 표시되는 시간입니다.",
|
||||
"duration-low-urgency-label": "낮음 중요도",
|
||||
"duration-normal-urgency-description": "보통 중요도 알림이 표시되는 시간입니다.",
|
||||
"duration-normal-urgency-label": "보통 중요도",
|
||||
"duration-critical-urgency-description": "긴급 레벨의 알림이 표시되는 시간입니다.",
|
||||
"duration-critical-urgency-label": "중요도 긴급",
|
||||
"duration-desc": "중요도에 따라 알림이 표시되는 시간을 구성합니다.",
|
||||
"duration-low-urgency-description": "낮은 레벨의 알림이 표시되는 시간입니다.",
|
||||
"duration-low-urgency-label": "중요도 낮음",
|
||||
"duration-normal-urgency-description": "보통 레벨의 알림이 표시되는 시간입니다.",
|
||||
"duration-normal-urgency-label": "중요도 보통",
|
||||
"duration-reset": "시간 제한 초기화",
|
||||
"duration-respect-expire-description": "알림에 설정된 만료 시간을 사용합니다.",
|
||||
"duration-respect-expire-label": "만료 시간 준수",
|
||||
"duration-title": "알림 지속 시간",
|
||||
"history-critical-urgency-description": "긴급 중요도 알림을 기록에 저장합니다.",
|
||||
"history-critical-urgency-label": "긴급 중요도 기록 저장",
|
||||
"history-desc": "중요도 수준에 따라 기록에 저장할 알림을 제어합니다.",
|
||||
"history-low-urgency-description": "낮음 중요도 알림을 기록에 저장합니다.",
|
||||
"history-low-urgency-label": "낮음 중요도 기록 저장",
|
||||
"history-normal-urgency-description": "보통 중요도 알림을 기록에 저장합니다.",
|
||||
"history-normal-urgency-label": "보통 중요도 기록 저장",
|
||||
"history-critical-urgency-description": "긴급 레벨의 알림을 기록에 저장합니다.",
|
||||
"history-critical-urgency-label": "중요도 긴급 기록 저장",
|
||||
"history-desc": "레벨 수준에 따라 기록에 저장할 알림을 제어합니다.",
|
||||
"history-low-urgency-description": "낮은 레벨의 알림을 기록에 저장합니다.",
|
||||
"history-low-urgency-label": "중요도 낮음 기록 저장",
|
||||
"history-normal-urgency-description": "보통 레벨의 알림을 기록에 저장합니다.",
|
||||
"history-normal-urgency-label": "중요도 보통 기록 저장",
|
||||
"media-toast-description": "미디어 재생 상태가 변경될 때 토스트를 표시합니다.",
|
||||
"media-toast-label": "미디어",
|
||||
"monitors-desc": "특정 모니터에 알림을 표시합니다. 선택하지 않으면 모든 모니터에 표시됩니다.",
|
||||
@@ -1180,23 +1204,23 @@
|
||||
"sounds-excluded-apps-label": "제외된 애플리케이션",
|
||||
"sounds-excluded-apps-placeholder": "discord,firefox,chrome,chromium,edge",
|
||||
"sounds-files-critical-description": "긴급 레벨의 알림에 재생할 소리 파일 경로입니다.",
|
||||
"sounds-files-critical-label": "긴급 레벨 소리",
|
||||
"sounds-files-critical-select-title": "긴급 레벨 소리 파일 선택",
|
||||
"sounds-files-desc": "다양한 알림 레벨 수준에 대해 사용자 지정 소리 파일을 구성합니다.",
|
||||
"sounds-files-critical-label": "긴급 레벨의 알림 소리",
|
||||
"sounds-files-critical-select-title": "긴급 레벨의 알림 소리 파일 선택",
|
||||
"sounds-files-desc": "다양한 알림 수준에 대해 사용자 지정 소리 파일을 구성합니다.",
|
||||
"sounds-files-low-description": "낮은 레벨의 알림에 재생할 소리 파일 경로입니다.",
|
||||
"sounds-files-low-label": "낮음 레벨 소리",
|
||||
"sounds-files-low-select-title": "낮음 레벨 소리 파일 선택",
|
||||
"sounds-files-low-label": "낮은 레벨의 알림 소리",
|
||||
"sounds-files-low-select-title": "낮은 레벨의 알림 소리 파일 선택",
|
||||
"sounds-files-normal-description": "보통 레벨의 알림에 재생할 소리 파일 경로입니다.",
|
||||
"sounds-files-normal-label": "보통 레벨 소리",
|
||||
"sounds-files-normal-select-title": "보통 레벨 소리 파일 선택",
|
||||
"sounds-files-normal-label": "보통 레벨의 알림 소리",
|
||||
"sounds-files-normal-select-title": "보통 레벨의 알림 소리 파일 선택",
|
||||
"sounds-files-placeholder": "소리 파일 경로 입력",
|
||||
"sounds-files-select-file": "소리 파일 선택",
|
||||
"sounds-files-title": "소리 파일",
|
||||
"sounds-files-unified-description": "알림에 재생할 소리 파일 경로입니다.",
|
||||
"sounds-files-unified-label": "알림 소리",
|
||||
"sounds-files-unified-select-title": "알림 소리 파일 선택",
|
||||
"sounds-separate-description": "낮음, 보통, 긴급 레벨 알림에 대해 서로 다른 소리 파일을 사용합니다.",
|
||||
"sounds-separate-label": "레벨별 다른 소리 사용",
|
||||
"sounds-separate-description": "중요도 낮음, 보통, 긴급의 알림에 대해 서로 다른 소리 파일을 사용합니다.",
|
||||
"sounds-separate-label": "중요도 별로 다른 소리를 사용",
|
||||
"sounds-title": "소리 설정",
|
||||
"sounds-unavailable-description": "알림 소리를 활성화하려면 Qt6 Multimedia를 설치하세요.",
|
||||
"sounds-unavailable-label": "알림 소리 사용 불가",
|
||||
@@ -1401,7 +1425,7 @@
|
||||
"automation-interval-label": "배경화면 간격",
|
||||
"automation-random-wallpaper-description": "정기적인 간격으로 랜덤 배경화면 변경을 예약합니다.",
|
||||
"automation-scheduled-change-description": "정기적인 간격으로 배경화면을 자동으로 변경합니다.",
|
||||
"automation-scheduled-change-label": "예약된 변경",
|
||||
"automation-scheduled-change-label": "자동 변경",
|
||||
"look-feel-edge-smoothness-description": "전환 가장자리에 부드러운 페더링 효과를 적용합니다.",
|
||||
"look-feel-edge-smoothness-label": "전환 가장자리 부드럽게",
|
||||
"look-feel-fill-color-description": "배경화면 뒤에 나타날 수 있는 채우기 색상을 선택하세요.",
|
||||
|
||||
+201
-177
@@ -4,26 +4,26 @@
|
||||
"close-app": "{app} bigire",
|
||||
"connect-vpn": "Bi {name} ve girê bide",
|
||||
"cycle-visualizer": "Dîmenkerê çerxê",
|
||||
"disable-bluetooth": "Bluetooth neçalak bike",
|
||||
"disable-bluetooth": "Bluetooth çalak neke",
|
||||
"disable-dnd": "'Dengê dernexîne' çalak neke",
|
||||
"disable-wifi": "Wi-Fi çalak neke",
|
||||
"disconnect-vpn": "Girêdanê bi {name} re qut bike",
|
||||
"enable-bluetooth": "Bluetooth çalak bike",
|
||||
"enable-dnd": "'Dengê dernexîne' çalak bike",
|
||||
"enable-wifi": "Wi-Fi çalak bike",
|
||||
"launcher-settings": "Mîhengên destpêkerê",
|
||||
"lower-to-bottom": "Daxistin bo binî",
|
||||
"launcher-settings": "Sazkariyên destpêkarê",
|
||||
"lower-to-bottom": "Bo jêr daxîne",
|
||||
"open-calendar": "Salnameyê veke",
|
||||
"open-display-settings": "Sazkariyên dîmenderê",
|
||||
"open-launcher": "Destpêkarê veke",
|
||||
"open-settings": "Sazkariyan veke",
|
||||
"raise-to-top": "Serê jorîn bilind bike",
|
||||
"random-wallpaper": "Wêneyê dîwarê rasthatî",
|
||||
"run-custom-command": "Fermana xwerû bimeşîne",
|
||||
"raise-to-top": "Bo jor bilind bike",
|
||||
"random-wallpaper": "Wêneyê dîwêrê rastehatî",
|
||||
"run-custom-command": "Fermana kesane bixebtîne",
|
||||
"show-active-only": "Tenê yên çalak nîşan bide",
|
||||
"show-all": "Hemûyan nîşan bide",
|
||||
"toggle-mute": "Guherandin bêdeng bike",
|
||||
"widget-settings": "Sazkariyên alavê"
|
||||
"toggle-mute": "Guhertîna bêdengkirinê",
|
||||
"widget-settings": "Sazkariyên sepanokê"
|
||||
},
|
||||
"authentication": {
|
||||
"error": "Şaşetiya rastkirinê",
|
||||
@@ -32,7 +32,7 @@
|
||||
"bar": {
|
||||
"active-window": {
|
||||
"colorize-icons-description": "Rengên rûkarê li ser îkona çarçoveya çalak bisepîne.",
|
||||
"hide-mode-description": "Dema ku çarçove neçalak be, kontrol dike ka alav çawa tev digere.",
|
||||
"hide-mode-description": "Dema ku çarçove neçalak be, kontrol dike ka sepanok çawa tev digere.",
|
||||
"scrolling-mode-description": "Dema ku şemitandina nivîsê ji bo sernavên çarçoveyên ên dirêj çalak e, kontrol bike.",
|
||||
"show-app-icon-description": "Îkona sepanê li kêleka sernavê çarçoveyê nîşan bide.",
|
||||
"show-app-icon-label": "Îkona sepanê nîşan bide"
|
||||
@@ -45,17 +45,17 @@
|
||||
"width-description": "Ferehiya pêkhateya kesane."
|
||||
},
|
||||
"battery": {
|
||||
"device-default": "Kesane (Amûra nîşandanê)",
|
||||
"device-default": "Berdest (Amûra dîmenderê)",
|
||||
"device-description": "Ka kîjan amûrê betarî hilbijêre ku were nîşandan.",
|
||||
"device-label": "Amûrê betarî",
|
||||
"hide-if-idle-description": "Dema ku pîl ne tê barkirin an valakirin, widgetê veşêre.",
|
||||
"hide-if-idle-description": "Dema ku betarî neyê tijîkirin an valakirin, sepanokê veşêre.",
|
||||
"hide-if-idle-label": "Dema de bêkar veşêre",
|
||||
"hide-if-not-detected-description": "Dema pîl li ser pergalê neyê dîtin, widgetê veşêre.",
|
||||
"hide-if-not-detected-label": "Veşêre eger nehat dîtin",
|
||||
"hide-if-not-detected-description": "Dema betarî li ser pergalê neyê dîtin, sepanokê veşêre.",
|
||||
"hide-if-not-detected-label": "Veşêre ku bêkar be",
|
||||
"low-battery-threshold-description": "Dema ku betarî ji vê rêjeyê kêmtir bibe, hişyariyekê nîşan bide.",
|
||||
"low-battery-threshold-label": "Asta hişyariya betarî ya kêm",
|
||||
"show-noctalia-performance-description": "Guhêrbarê awaya performansê ya Noctalia di hundirê destgeha betariyê de nîşan bide.<br>Sî û anîmasyonan di Noctalia de vedike da ku karanîna çavkaniyan kêm bike.",
|
||||
"show-noctalia-performance-label": "Guhbarê performansa Noctalia nîşan bide",
|
||||
"show-noctalia-performance-description": "Guhêrbarê awaya performansê ya Noctalia di hundirê destgeha betariyê de nîşan bide.<br>Sî û anîmasyonan di Noctalia de neçalak dike da ku bikaranîna çavkaniyan kêm bike.",
|
||||
"show-noctalia-performance-label": "Guhêrbarê performansa Noctalia nîşan bide",
|
||||
"show-power-profile-description": "Hilbijartina profîla hêzê di hundirê destgeha betariyê de nîşan bide.",
|
||||
"show-power-profile-label": "Kontrolên profîla hêzê nîşan bide"
|
||||
},
|
||||
@@ -102,7 +102,7 @@
|
||||
"enable-colorization-description": "Rengînkirinê ji bo îkona bişkoka xwerû û nivîsê çalak bike, rengên temayê bi kar bîne.",
|
||||
"enable-colorization-label": "Rengînkirin çalak bike",
|
||||
"hide-mode-always-expanded": "Her tim berfireh kirin",
|
||||
"hide-mode-description": "Kontrola xuyabûna widgetê dema ku ferman encamek tune.",
|
||||
"hide-mode-description": "Dema ku ferman tune be, dîtina sepanokê kontrol dike.",
|
||||
"hide-mode-expand-with-output": "Berfireh bike dema ku derket hebe",
|
||||
"hide-mode-label": "Hêşartin modê",
|
||||
"hide-mode-max-transparent": "Herî zêde berfirehkirî lê şefaf",
|
||||
@@ -157,7 +157,7 @@
|
||||
"compact-mode-description": "Çalak bike sêwirandinek ku cih digire ji bo panelê lîstikvanê medyayê.",
|
||||
"compact-mode-label": "ڕێگای کورتکراوە",
|
||||
"hide-mode-description": "Kontrola ku widget çawa tevdigere dema ku tu medya nayê lîstin.",
|
||||
"max-width-description": "Mezinahiya herî zêde ya horizontî ya widgetê diyar dike. Widget dê bi naveroka kurt re were kurtkirin.",
|
||||
"max-width-description": "Mezinahiya herî mezin a asoyî ya sepanokê saz dike. Sepanok wê bi naveroka kurt re were biçûkkirin.",
|
||||
"no-active-player": "Bê lîstikvanê çalak",
|
||||
"panel-section-description": "Xuyakirina xuyabûn û reftarên panelê lîstikvanê medyayê.",
|
||||
"panel-section-label": "Panelê lîstikvanê medyayê",
|
||||
@@ -188,7 +188,7 @@
|
||||
},
|
||||
"section-editor": {
|
||||
"placeholder": "Widgetekek hilbijêre ku lê zêde bike...",
|
||||
"search-placeholder": "Amûra lêgerînê..."
|
||||
"search-placeholder": "Sepanokê bigere..."
|
||||
},
|
||||
"spacer": {
|
||||
"width-description": "Firehiya firehiyê bi pîkselan."
|
||||
@@ -196,13 +196,13 @@
|
||||
"system-monitor": {
|
||||
"compact-mode-description": "Statîstîkan wekî şîroveya barên piçûk nîşan bide li şûna nirxên nivîskî. Pêşî li guhertina layoutê digire.",
|
||||
"compact-mode-label": "Rewşa Kompakt",
|
||||
"cpu-temperature-description": "Germahiya CPUyê heke hebe nîşan bide.",
|
||||
"cpu-temperature-label": "Germa CPUyê",
|
||||
"cpu-temperature-description": "Germahiya YKN ku hebe nîşan bide.",
|
||||
"cpu-temperature-label": "Germahiya YKN",
|
||||
"cpu-usage-description": "Rêjeya bikaranîna CPU ya niha nîşan bide.",
|
||||
"cpu-usage-label": "Bikaranîna CPUyê",
|
||||
"cpu-usage-label": "Bikaranîna YKN",
|
||||
"disk-path-description": "Hilbijêre kîjan xala çiyayê dîskê were şopandin.",
|
||||
"disk-path-label": "Rêya dîskê",
|
||||
"gpu-temperature-description": "Germahiya GPUyê, eger hebe, nîşan bide.",
|
||||
"gpu-temperature-description": "Germahiya YKG ku hebe, nîşan bide.",
|
||||
"load-average-description": "Barkirina navîn a pergalê nîşan bide.",
|
||||
"load-average-label": "Barkirina navîn",
|
||||
"memory-percentage-description": "Bîranînê wekî rêjeyekê nîşan bide, ne wekî nirxên mutleq.",
|
||||
@@ -224,7 +224,7 @@
|
||||
},
|
||||
"taskbar": {
|
||||
"colorize-icons-description": "Rengên temayê li îkonên taskbarê bicîh bike.",
|
||||
"hide-mode-description": "Kontrol dike ka widget çawa tevdigere dema ku pencereyên lihevhatî tune ne.",
|
||||
"hide-mode-description": "Dema ku çarçoveyên lihevhatî tune bin, sepanok çawa tev digere kontrol dike",
|
||||
"hide-mode-label": "Moda veşartinê",
|
||||
"icon-scale-description": "Pîvana îkonên taskbarê destnîşan dike.",
|
||||
"icon-scale-label": "Pîvandina îkonan",
|
||||
@@ -237,7 +237,7 @@
|
||||
"show-pinned-apps-description": "Nîşandana sepanên pêçandî yên ji dockê di taskbarê de.",
|
||||
"show-pinned-apps-label": "Nîşandan sepanên pêçandî",
|
||||
"show-title-description": "Sernavên pencereyê di taskbarê de nîşan bide.",
|
||||
"show-title-description-disabled": "ئەرکبارێ ستوونی پشتەڤانییا نیشاندان تایتڵان ناکەت.",
|
||||
"show-title-description-disabled": "Darika erkê ya stûnî nîşandana sernavan piştgirî nake.",
|
||||
"show-title-label": "Navê pêşandanê",
|
||||
"smart-width-description": "Bi awayekî otomatîkî firehiya têketinê li gorî hejmara têketinan eyar bike.",
|
||||
"smart-width-label": "Firehiya berz",
|
||||
@@ -246,7 +246,7 @@
|
||||
"title-width-reset-tooltip": "Firehiya firehiya sernavê"
|
||||
},
|
||||
"tray": {
|
||||
"colorize-icons-description": "رەنگێن تەڤنێ ب نیشانێن ترەیێ بکار بینە.",
|
||||
"colorize-icons-description": "Rengên rûkarê li ser îkonên devera agahiyê bisepîne.",
|
||||
"colorize-icons-label": "Îkonan rengîn bike",
|
||||
"drawer-enabled-description": "Dema ku çalak be, hêmanên trayê yên nehatine pin kirin di panelek dolabê de têne xuyang kirin.<br>Dema ku neçalak be, hemî hêmanên trayê inline têne xuyang kirin.",
|
||||
"drawer-enabled-label": "Çalak bike dolabê",
|
||||
@@ -277,7 +277,7 @@
|
||||
"occupied-color-description": "Rengê paşxaneyê ji bo Workspaceên dagirkirî destnîşan bike.",
|
||||
"occupied-color-label": "Rengê qada xebatê ya dagirkirî",
|
||||
"reverse-scrolling-description": "Dema ku hûn digerînin, rêgeha guhertina cîhê kar berevajî bike.",
|
||||
"reverse-scrolling-label": "گەڕاندنەوەی گەڕان",
|
||||
"reverse-scrolling-label": "Şemitandinê berevajî bike",
|
||||
"show-applications-description": "Nîşaneyên sepanan di hundirê her cîhê xebatê de nîşan bide.",
|
||||
"show-applications-label": "Nîşan sepanan bide",
|
||||
"show-badge-description": "Di moda komkirî de nîşana jimareya cîhê kar nîşan bide.",
|
||||
@@ -289,7 +289,7 @@
|
||||
}
|
||||
},
|
||||
"battery": {
|
||||
"battery-health": "Rewşa Pîlê",
|
||||
"battery-health": "Rewşa betariyê",
|
||||
"battery-level": "Asta bataryayê",
|
||||
"capacity-level": "Kapasîte: {level}",
|
||||
"charging-rate": "Rêjeya barkirinê: {rate} W",
|
||||
@@ -313,21 +313,21 @@
|
||||
"enable-message": "Bo dîtina amûrên heyî Bluetooth çalak bike.",
|
||||
"known-devices": "Amûrên naskirî",
|
||||
"no-devices": "Amûr tune ne",
|
||||
"paired-devices": "ghhdhd",
|
||||
"paired-devices": "Amûrên hevgirtî",
|
||||
"pairing-mode": "Piştrast bike ku cîhaza te di moda cotbûnê de ye.",
|
||||
"scanning": "Lêgerîna cîhazan...",
|
||||
"signal-text-excellent": "Nîşan: Baş e gelek",
|
||||
"signal-text-fair": "Nîşan: Adil",
|
||||
"signal-text-fair": "Nîşan: Bihêz e",
|
||||
"signal-text-good": "Nîşan: Baş e",
|
||||
"signal-text-poor": "Nîşan: Qels",
|
||||
"signal-text-poor": "Nîşan: Lawaz e",
|
||||
"signal-text-unknown": "Nîşan: Nenas",
|
||||
"signal-text-very-poor": "Nîşan: Gelekî qels"
|
||||
"signal-text-very-poor": "Nîşan: Gelekî lawaz e"
|
||||
}
|
||||
},
|
||||
"changelog": {
|
||||
"error": {
|
||||
"fetch-failed": "Agahiyên guhertinê barkirin pêkan nebû. Ji kerema xwe re paşê dîsa biceribîne.",
|
||||
"rate-limit": "Rêjeya GitHubê derbas bû. Ji kerema xwe di nav çend deqîqeyan de dîsa biceribîne."
|
||||
"fetch-failed": "Nikare daneyên têketinê guhertinê bar bike. Paşê dîsa biceribîne.",
|
||||
"rate-limit": "Rêjeya GitHub derbas bû. Di nav çend xulekanan de dîsa biceribîne."
|
||||
},
|
||||
"panel": {
|
||||
"buttons-discord": "Têkeve Discorda me",
|
||||
@@ -346,7 +346,7 @@
|
||||
"colors": {
|
||||
"error": "Çewtî",
|
||||
"on-surface": "Li ser rûyê",
|
||||
"primary": "Seretayî",
|
||||
"primary": "Sereke",
|
||||
"secondary": "Duyemîn",
|
||||
"tertiary": "Sêyemîn"
|
||||
},
|
||||
@@ -358,16 +358,16 @@
|
||||
"automation": "Xweserî",
|
||||
"available": "Berdest",
|
||||
"back": "Paş",
|
||||
"battery": "Bataryayî",
|
||||
"battery": "Betarî",
|
||||
"bluetooth": "Bluetooth",
|
||||
"brightness": "Ronahî",
|
||||
"browse": "Gerîn",
|
||||
"browse": "Bigere",
|
||||
"calendar": "Salname",
|
||||
"calendar-panel": "Panelê salnameyê",
|
||||
"calendar-panel": "Destgeha salnameyê",
|
||||
"cancel": "Têk bibe",
|
||||
"cards": "Kartên",
|
||||
"charging": "Barkirin",
|
||||
"clear": "Paqqij bike",
|
||||
"clear": "Pak bike",
|
||||
"clipboard": "Klîpbir",
|
||||
"close": "Bigire",
|
||||
"color-muted": "Bêdengkirî",
|
||||
@@ -401,28 +401,28 @@
|
||||
"gateway": "Dergeh",
|
||||
"general": "Giştî",
|
||||
"height": "Bilindî",
|
||||
"hibernate": "Xewnê",
|
||||
"hibernate": "Bicemdîne",
|
||||
"history": "Dîrok",
|
||||
"icon": "Îkon",
|
||||
"idle": "Betal",
|
||||
"info": "Agahî",
|
||||
"input": "Têkevin",
|
||||
"info": "Zanyarî",
|
||||
"input": "Têketin",
|
||||
"install": "Sazkirin",
|
||||
"installed": "Sazkirî",
|
||||
"interface": "Navrû",
|
||||
"internet": "Înternet",
|
||||
"language": "Ziman",
|
||||
"loading": "بارکردن...",
|
||||
"loading": "Tê barkirin...",
|
||||
"local": "Herêmî",
|
||||
"location": "Cih",
|
||||
"lock": "Giredan",
|
||||
"lock": "Kilît bike",
|
||||
"logout": "Derkeve",
|
||||
"look": "Xuyanî",
|
||||
"media": "Medya",
|
||||
"media-player": "Lîstikvanê medyayê",
|
||||
"memory": "Bîr",
|
||||
"monitors": "Çavdêr",
|
||||
"network": "Torağ",
|
||||
"monitors": "Dîmender",
|
||||
"network": "Tor",
|
||||
"next": "Dûmahî",
|
||||
"night-light": "Ronahiya şevê",
|
||||
"no": "Na",
|
||||
@@ -433,7 +433,7 @@
|
||||
"notifications": "Agahdarî",
|
||||
"official": "Fermî",
|
||||
"on-surface": "Li ser rûyê erdê",
|
||||
"output": "Derket",
|
||||
"output": "Deran",
|
||||
"pair": "Hevpar",
|
||||
"paired": "Hevpar bûyî",
|
||||
"pairing": "Hevberkirin...",
|
||||
@@ -447,7 +447,7 @@
|
||||
"previous": "Berê",
|
||||
"primary": "Serekî",
|
||||
"random": "Bêserûber",
|
||||
"reboot": "Restart",
|
||||
"reboot": "Ji nû dest pê bike",
|
||||
"refresh": "Nûkirin",
|
||||
"required": "(pêwîst)",
|
||||
"reset": "Vegerandin",
|
||||
@@ -486,13 +486,14 @@
|
||||
"vibrant": "Geş",
|
||||
"visualizer": "Dîmender",
|
||||
"volume": "Hêjmar",
|
||||
"volumes": "Cild",
|
||||
"volumes": "Deng",
|
||||
"wallpaper": "Dîwarê xuyanî",
|
||||
"weather": "Hewa",
|
||||
"weather-loading": "Rewşa bayê tê barkirin...",
|
||||
"week": "Hefte",
|
||||
"widgets": "Amûr",
|
||||
"widgets": "Sepanok",
|
||||
"width": "Firehî",
|
||||
"windows": "Çarçove",
|
||||
"yes": "Erê"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Li ser mişkê"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Xweber veşêre",
|
||||
"hidden": "Veşêre dema vala be",
|
||||
"idle": "Dema bêkar veşêre",
|
||||
"transparent": "Dema vala zelal e",
|
||||
@@ -543,8 +545,8 @@
|
||||
"webbrowser": "Geroka tevnê"
|
||||
},
|
||||
"providers": {
|
||||
"applications": "Serlêdan",
|
||||
"calculator": "Hesabker",
|
||||
"applications": "Sepan",
|
||||
"calculator": "Jimarkar",
|
||||
"calculator-deprecated": "Fermana >calc hatiye betalkirin û dê di demeke nêz de were rakirin. Ji kerema xwe rasterast di lêgerînê de îfadeyên matematîkê binivîse.",
|
||||
"calculator-description": "Hesabker — nirxandina îfadeyên matematîkî",
|
||||
"calculator-enter-expression": "Têketineke matematîkî binivîse",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Îmojî tên barkriin...",
|
||||
"emoji-loading-description": "Tika raweste",
|
||||
"emoji-no-recent": "Hîna emojiyên dawî tune ne",
|
||||
"emoji-search-description": "Lêgerîn û kopîkirina emojiyan"
|
||||
"emoji-search-description": "Lêgerîn û kopîkirina emojiyan",
|
||||
"settings-search-description": "Li sazkariyan bigere",
|
||||
"windows-search-description": "Pencereyên vekirî bigere û bîne pêş"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Berdest",
|
||||
"density-mini": "Piçûk",
|
||||
"density-spacious": "Berfireh",
|
||||
"display-mode-always-visible": "Her dem dîtbar",
|
||||
"type-floating": "Herikbar",
|
||||
"type-framed": "Çarçovekirî",
|
||||
"type-simple": "Sade"
|
||||
@@ -642,7 +647,7 @@
|
||||
"changelog": "Dîroka guhertinan bibîne",
|
||||
"contributors-desc": "Silav ji {count} beşkdarên me yên <b>gewre</b> re!",
|
||||
"contributors-description-plural": "Spas ji {count} beşdarên me yên <b>ecêb</b>!",
|
||||
"copy-info": "Agahî kopî bike",
|
||||
"copy-info": "Zanyariyan jê bigire",
|
||||
"info-copied": "Agahî li clipboardê hat kopîkirin",
|
||||
"noctalia-desc": "Şêlekek sermaseyê ya spehî û mînîmal ku bi baldarî ji bo Waylandê hatiye çêkirin, bi Quickshellê hatiye avakirin.",
|
||||
"noctalia-git-commit": "Pêşkêşkirina Git:",
|
||||
@@ -651,30 +656,30 @@
|
||||
"noctalia-title": "Noctalia qalik",
|
||||
"privacy-policy": "Siyaseta nepenîtiyê",
|
||||
"support": "Piştgiriya me bike",
|
||||
"system-cpu": "CPU:",
|
||||
"system-cpu": "YKN:",
|
||||
"system-disk": "Dîsk:",
|
||||
"system-gpu": "GPU:",
|
||||
"system-gpu": "YKG:",
|
||||
"system-host": "Mêvan:",
|
||||
"system-install-hint": "Fastfetch saz bike da ku agahiyên pergalê bibîne",
|
||||
"system-kernel": "Kernel:",
|
||||
"system-loading": "Agahiyên pergalê bar dikin...",
|
||||
"system-memory": "Bîr:",
|
||||
"system-monitor": "Çavdêr:",
|
||||
"system-monitor": "Dîmender:",
|
||||
"system-not-installed": "fastfetch nehatiye sazkirin",
|
||||
"system-os": "OS: OS",
|
||||
"system-packages": "Pakkêtan:",
|
||||
"system-os": "PX:",
|
||||
"system-packages": "Pakêt:",
|
||||
"system-product": "Berhem:",
|
||||
"system-title": "Agahiyên Sîstemê",
|
||||
"system-uptime": "Demdirêjî:",
|
||||
"system-wm": "WM: WM:",
|
||||
"system-title": "Zanyariyên pergalê",
|
||||
"system-uptime": "Dema xebitandinê:",
|
||||
"system-wm": "RÇ:",
|
||||
"telemetry-data-copied": "Daneyên telemetriyê hatin kopîkirin bo clipboardê",
|
||||
"telemetry-desc": "Bi parvekirina agahdariya sîstema anonîm (çareseriya ekranê, berhevkar, belavkirin) alîkariya pêşxistina Noctalia bikin. Carekê di destpêkê de tê şandin, şopandin tune, dane piştî 30 rojan bixweber têne jêbirin.",
|
||||
"telemetry-enabled": "Agahiyên pergalê yên nenas bişîne",
|
||||
"telemetry-show-data": "Dîtina daneyan",
|
||||
"telemetry-title": "Nepênî",
|
||||
"telemetry-title": "Taybetî",
|
||||
"title": "Derbar",
|
||||
"up-to-date": "Tu nû ye!",
|
||||
"update-available": "Nûvekirin heye",
|
||||
"up-to-date": "Tu rojane ye!",
|
||||
"update-available": "Rojanekirin heye",
|
||||
"view-commit": "Li ser GitHubê guhertinê bibîne"
|
||||
},
|
||||
"audio": {
|
||||
@@ -721,19 +726,26 @@
|
||||
"volumes-volume-overdrive-label": "Destûra zêdekirina deng"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Demê ku berî darik were veşartin piştî mişîk diçe",
|
||||
"appearance-auto-hide-delay-label": "Derengbûnê veşêre",
|
||||
"appearance-auto-hide-exclusive-note": "Nîşe: Dema ku Veşartina xweber çalak be qada taybet tê neçalakkirin",
|
||||
"appearance-auto-show-delay-description": "Demê berî ku darik tê nîşandan dema mîşk dikeve qiraxê",
|
||||
"appearance-auto-show-delay-label": "Derengbûnê nîşan bide",
|
||||
"appearance-background-opacity-description": "Şeffafiya paşxanê bi taybetî ji bo barî destnîşan bike.",
|
||||
"appearance-background-opacity-label": "ڕوونیی پاشبنەمای بارەکە",
|
||||
"appearance-capsule-opacity-description": "Dema kapsul xuya dibe, asta zelalbûna paşxaneyên widgetê diyar bike.",
|
||||
"appearance-capsule-opacity-label": "Ronahiya kapsulê",
|
||||
"appearance-background-opacity-label": "Zelaliya paşrûyê darikê",
|
||||
"appearance-capsule-opacity-description": "Dema kapsul xuya dibe, asta zelalbûna paşrûyên sepanokê saz dike.",
|
||||
"appearance-capsule-opacity-label": "Zelaliya kapsulê",
|
||||
"appearance-density-description": "Pêdivî ye ku pêlava barê were sererast kirin ji bo xuyangek berbiçav an fireh.",
|
||||
"appearance-density-label": "Çalyî bar",
|
||||
"appearance-desc": "Xuyakirina xuyabûn û pozîsyona bar.",
|
||||
"appearance-display-mode-description": "Hilbijêre ka kengî bila darik were xuyakirin",
|
||||
"appearance-display-mode-label": "Awaya nîşandanê",
|
||||
"appearance-floating-description": "Bariş wekî 'heb'eke herikbar nîşan bide.",
|
||||
"appearance-floating-label": "Barê avjen",
|
||||
"appearance-frame-radius": "Nîvçapa Hundirîn",
|
||||
"appearance-frame-settings-description": "Stûrahiya çarçoveyê û nîvçapa goşeyê hundirîn sererast bike",
|
||||
"appearance-frame-settings-label": "Mîhengên Çarçoveyê",
|
||||
"appearance-frame-thickness": "Stûrahî",
|
||||
"appearance-frame-settings-label": "Sazkariyên Çarçoveyê",
|
||||
"appearance-frame-thickness": "Qalindî",
|
||||
"appearance-hide-on-overview-description": "Dema ku pêşdîtina berhevker çalak be, bar veşêre û panelan bigire.",
|
||||
"appearance-hide-on-overview-label": "Li ser dîtinê bar veşêre",
|
||||
"appearance-margins-description": "Marginên dora bara herikbar eyar bike.",
|
||||
@@ -744,19 +756,19 @@
|
||||
"appearance-outer-corners-label": "Goşeyên derve",
|
||||
"appearance-position-description": "Cihê ku bar li ser ekranê deyne hilbijêre.",
|
||||
"appearance-position-label": "Cihê darikê",
|
||||
"appearance-show-capsule-description": "Paşxaneyên widgetê nîşan bide.",
|
||||
"appearance-show-capsule-description": "paşrûyên sepanokê nîşan bide.",
|
||||
"appearance-show-capsule-label": "Pêşkêşkirina kapsulê",
|
||||
"appearance-show-outline-description": "Dîwarê xuya li dora her widgetê nîşan dide.",
|
||||
"appearance-show-outline-label": "Nîşandan xêzên widgetê",
|
||||
"appearance-show-outline-label": "Xêzên sepanokê nîşan bide",
|
||||
"appearance-type-description": "Stîla darikê hilbijêre: Sade, Herikbar an Çarçovekirî",
|
||||
"appearance-type-label": "Cureyê Darikê",
|
||||
"appearance-type-label": "Cûreya darikê",
|
||||
"appearance-use-separate-opacity-description": "Destûrê bide ku ji bo paşxaneya bar nirxek opakbûna cuda were bikaranîn.",
|
||||
"appearance-use-separate-opacity-label": "Şefafiya bara cuda bikar bîne",
|
||||
"monitor-configure-widgets": "Widgetan saz bike",
|
||||
"monitor-configure-widgets": "Sepanokan saz bike",
|
||||
"monitor-override-settings": "Mîhengên gerdûnî betal bike",
|
||||
"monitor-override-settings-description": "Ji bo vî monitorê mîhengên xwerû bikar bîne.",
|
||||
"monitor-reset-all": "Hemûyan vegerîne",
|
||||
"monitor-widgets-title": "Konfigurasyona Widgetê - {monitor}",
|
||||
"monitor-widgets-title": "Rêkxistina sepanokê- {monitor}",
|
||||
"monitors-desc": "Nîşan bide bar li ser monitorên taybet. Eger tu kes neyê hilbijartin, ew ê bi awayekî xwerû hemûyan nîşan bide.",
|
||||
"monitors-desc-new": "Mîheng bike ka kîjan çavdêr Barê nîşan didin û mîhengên ji bo her çavdêrekê xwerû bike.",
|
||||
"monitors-title": "Dîmender",
|
||||
@@ -766,9 +778,9 @@
|
||||
"tray-blacklist-placeholder": "nm-applet, Fcitx*",
|
||||
"tray-pin-application": "Sepanê bi dar bixe",
|
||||
"tray-unpin-application": "Sepanê bi dar nexe",
|
||||
"use-global-widgets": "Widgetên gerdûnî bikar bîne",
|
||||
"widgets-desc": "Pêçikên amûran kaş bike da ku rêza wan biguherî. Ji bo veguhestina amûran di navbera beşan de an jî rakirina wan, menuya rast-klîk bikar bîne.",
|
||||
"widgets-title": "Cihkirina widgetan"
|
||||
"use-global-widgets": "Sepanokên gerdûnî bi kar bîne",
|
||||
"widgets-desc": "sepanokan kaş bike da ku rêza wan biguherînî. Ji bo livandinê sepanokan di navbera beşan de yan rakirina wan, menuya rast-tikandin bi kar bîne.",
|
||||
"widgets-title": "Bicihkirina sepanokan"
|
||||
},
|
||||
"color-scheme": {
|
||||
"color-source-use-wallpaper-colors-description": "Ji dîwarê xwe şemayên rengan çêbike. Rengan bixweber derdixe da ku temayek hevgirtî biafirîne.",
|
||||
@@ -810,7 +822,7 @@
|
||||
"predefined-desc": "Ji berhevokek şemayên rengan ên pêşdiyarkirî hilbijêrin.",
|
||||
"predefined-generate-templates-label": "Şablonan ji bo şemayên pêşdiyarkirî çêbike",
|
||||
"predefined-title": "Şemayên rengan ên pêşdiyarkirî",
|
||||
"templates-desc": "ڕەنگان بخە سەر ئەپڵیکەیشنێن دەرەکی.",
|
||||
"templates-desc": "Rengan li ser sepanên derveyî bisepîne.",
|
||||
"templates-filter-description": "Şablonên ji kategoriyek taybet nîşan bide.",
|
||||
"templates-filter-label": "Li gorî kategoriyê parzûn bike",
|
||||
"templates-misc-description": "Şablonên xwe biafirîne.",
|
||||
@@ -847,22 +859,22 @@
|
||||
"shortcuts-custom-button-state-checks-remove": "Rake",
|
||||
"shortcuts-custom-button-tooltip-description": "Serişteya ku dema mişk li ser bişkokê be tê nîşandan.",
|
||||
"shortcuts-custom-button-tooltip-label": "Serpêhatî",
|
||||
"shortcuts-title": "Kurtebirên widgetê",
|
||||
"shortcuts-title": "Kurteriyên sepanokan",
|
||||
"system-monitor-disk-path-description": "Hilbijêre kîjan xala çiyayê dîskê karta çavdêriya pergalê ya di navenda kontrolê de divê çavdêriyê bike.",
|
||||
"system-monitor-disk-path-label": "Rêya dîska çavdêriya pergalê",
|
||||
"title": "Navenda kontrolê"
|
||||
},
|
||||
"desktop-widgets": {
|
||||
"clock-enabled-description": "Widêgetek demjimêrê li ser sermaseyê nîşan bide.",
|
||||
"clock-enabled-label": "Widgetê demjimêrê çalak bike",
|
||||
"clock-enabled-description": "Sepanokeke demjimêrê li ser sermaseyê nîşan bide.",
|
||||
"clock-enabled-label": "Sepanoka demjimêrê çalak bike",
|
||||
"clock-format-label": "Format",
|
||||
"clock-height-description": "Bilindahiya widgeta demjimêrê bi pixelan.",
|
||||
"clock-height-description": "Bilindahiya sepanokê demjimêrê bi pixelan.",
|
||||
"clock-height-label": "Bilindî",
|
||||
"clock-minimal-mode-description": "Dîmeneke demjimêrê ya herî kêm bi dem û dîrokê.",
|
||||
"clock-minimal-mode-description": "Dîmendereke demjimêrê ya herî kêm bi dem û dîrokê bi kar bîne.",
|
||||
"clock-minimal-mode-label": "Moda herî kêm",
|
||||
"clock-rounded-corners-description": "Goşeyên dor ji bo paşxaneya widgetê bikar bîne.",
|
||||
"clock-rounded-corners-label": "Goşeyên giloverkirî",
|
||||
"clock-show-background-description": "Paşxaneya konteynera widgeta demjimêrê nîşan bide.",
|
||||
"clock-rounded-corners-description": "Quncikên gilover ji bo paşrûyê sepanokê bi kar bîne.",
|
||||
"clock-rounded-corners-label": "Quncikên gilover",
|
||||
"clock-show-background-description": "Paşrûya konteynera sepanoka demjimêrê nîşan bide.",
|
||||
"clock-show-background-label": "Paşrûyê nîşan bide",
|
||||
"clock-show-date-description": "Dîroka îro li jêr demjimêrê nîşan bide.",
|
||||
"clock-show-date-label": "Dîrokê nîşan bide",
|
||||
@@ -874,31 +886,41 @@
|
||||
"clock-style-digital": "Jimarî",
|
||||
"clock-style-label": "Şêwaza demjimêrê",
|
||||
"clock-style-minimal": "Kêmtirîn",
|
||||
"clock-width-description": "Ferehiya alava demjimêrê bi pîkselan.",
|
||||
"edit-mode-button-label": "Bike rewşena sererastkirinê",
|
||||
"edit-mode-controls-explanation": "Klîka çepê & kaş bike: Wîdgetê biguhezîne an mezinahîya wê biguherîne.\nKlîka rastê: Vebijarkên menuya kontekstê veke.",
|
||||
"edit-mode-description": "Moda guhertinê çalak bike da ku alavên sermaseyê bilivînî û ji nû ve bicih bikî . Dema ku çalak be, alav xêzek kaşkirinê nîşan dide û dikare ji nû ve were bicihkirin.",
|
||||
"clock-width-description": "Ferehiya sepanoka demjimêrê bi pîkselan.",
|
||||
"edit-mode-button-label": "Têkeve awaya guhertinê",
|
||||
"edit-mode-controls-explanation": "Çep-bitikîne & kaş bike: Sepanokê bilivîne yan mezinahiya wê biguherîne. Rast-bitikîne: Vebijêrkên menuya naverokê veke.",
|
||||
"edit-mode-description": "Awaya guhertinê çalak bike da ku sepanokên sermaseyê bilivînî û ji nû ve bicih bikî . Dema ku çalak be, sepanok xêzek kaşkirinê nîşan dide û dikare ji nû ve were bicihkirin.",
|
||||
"edit-mode-exit-button": "Ji awaya guhertinê derkeve",
|
||||
"edit-mode-grid-snap-label": "Girêdana torê",
|
||||
"edit-mode-label": "ڕێگای دەستکاریکردن",
|
||||
"enabled-description": "Alavên sermaseyê bi tevahî çalak an neçalak bike.",
|
||||
"enabled-label": "Alavên sermaseyê çalak bike",
|
||||
"general-desc": "Widgetên ku li ser sermaseya te xuya dibin saz bike.",
|
||||
"general-title": "Alavên sermaseyê",
|
||||
"media-player-enabled-description": "Pêşangeha widgetek lîstikvanê medyayê li ser sermaseyê.",
|
||||
"media-player-enabled-label": "Widgeta lîstikvanê medyayê çalak bike",
|
||||
"media-player-rounded-corners-description": "Goşeyên çargoşeyî li keviyên widgetê çalak bike.",
|
||||
"media-player-show-album-art-description": "Wêneyê bergê albûmê û agahiyên stranê (nav û hunermend) nîşan bide.",
|
||||
"edit-mode-label": "Awaya guhertinê",
|
||||
"enabled-description": "Sepanokên sermaseyê bi tevahî çalak an neçalak bike.",
|
||||
"enabled-label": "Sepanokên sermaseyê çalak bike",
|
||||
"general-desc": "Sepanokên ku li ser sermaseya te xuya dibin birêkxistin bike.",
|
||||
"general-title": "Sepanokên sermaseyê",
|
||||
"media-player-enabled-description": "Sepanokê lîstikvanê medyayê li ser sermaseyê nîşan bide.",
|
||||
"media-player-enabled-label": "Sepanokê lîstikvanê medyayê çalak bike",
|
||||
"media-player-rounded-corners-description": "Quncikê giolver li ser qiraxên sepanokê çalak bike.",
|
||||
"media-player-show-album-art-description": "Wêneyê bergê elbumê û zanyariyên stranê (nav û hunermend) nîşan bide.",
|
||||
"media-player-show-album-art-label": "Wêneyê bergê û sernavê nîşan bide",
|
||||
"media-player-show-background-description": "Show the background container for the media player widget.",
|
||||
"media-player-show-buttons-description": "Bişkokên kontrola medyayê (lîstin/rawestandin, pêş, paş) li ser alavê lîstikvana medyayê nîşan bide.",
|
||||
"media-player-show-background-description": "Konteynerê paşrûyê nîşan bide.",
|
||||
"media-player-show-buttons-description": "Bişkokên kontrola medyayê (lîstin/rawestandin, pêş, paş) nîşan bide.",
|
||||
"media-player-show-buttons-label": "Bişkokan nîşan bide",
|
||||
"media-player-show-visualizer-description": "Vîdyoyê dîtbarîkerê dengî nîşan bide.",
|
||||
"media-player-visualizer-type-description": "Choose a visualization type for the desktop media player background.",
|
||||
"title": "Alavên sermaseyê",
|
||||
"weather-enabled-description": "Widjeyekî hewayê li ser sermaseyê nîşan bide.",
|
||||
"weather-enabled-label": "Widgeta hewayê çalak bike",
|
||||
"weather-show-background-description": "Konteynera paşxanê ya widgeta hewayê nîşan bide."
|
||||
"media-player-show-visualizer-description": "overlayê dîtbarîkarê dengî nîşan bide.",
|
||||
"media-player-visualizer-type-description": "Cûreyeke dîtbariyê hilbijêre.",
|
||||
"system-stat-layout-bottom": "Bişkok",
|
||||
"system-stat-layout-description": "Choose how the legend is displayed relative to the graph.",
|
||||
"system-stat-layout-label": "Şêwaz",
|
||||
"system-stat-layout-side": "Kêlek",
|
||||
"system-stat-rounded-corners-description": "Quncikên girover ji bo paşrûya sepanokê bi kar bîne.",
|
||||
"system-stat-rounded-corners-label": "Quncikên gilover",
|
||||
"system-stat-show-background-description": "Ji bo sepanokê amara pergalê konteynerê paşrûyê nîşan bide.",
|
||||
"system-stat-show-background-label": "Paşrûyê nîşan bide",
|
||||
"system-stat-stat-type-description": "Hilbijêre kîjan amara pergalê bila were nîşandan.",
|
||||
"system-stat-stat-type-label": "Cûreya amarî",
|
||||
"title": "Sepanokên sermaseyê",
|
||||
"weather-enabled-description": "Sepanokê rewşa bayê li ser sermaseyê nîşan bide.",
|
||||
"weather-enabled-label": "Sepanokê rewşa bayê çalak bike",
|
||||
"weather-show-background-description": "Konteynera paşrûyê ya sepanokê rewşa bayê nîşan bide."
|
||||
},
|
||||
"display": {
|
||||
"monitors-brightness-step-description": "Pîvana gava guhertinên ronahiyê (tekerê mişkê û kurteriyên klavyeyê) eyar bike.",
|
||||
@@ -907,11 +929,11 @@
|
||||
"monitors-brightness-unavailable-generic": "Kontrola ronahiyê ji bo vê dîmêrê berdest nîne.",
|
||||
"monitors-desc": "Guherandinên ronahiya mîhengên ji bo her dîmenderê.",
|
||||
"monitors-enforce-minimum-description": "Çareseriya pirsgirêka ku ronahiya paş di hin dîmendêran de di ronahiya %0 de bi temamî dimire.",
|
||||
"monitors-enforce-minimum-label": "Bi zor ronahiyê (1%) ferz bike",
|
||||
"monitors-external-brightness-description": "DDCUtil پشتگیری چالاک بکە بۆ کۆنتڕۆڵکردنی ڕووناکی لەسەر شاشەی دەرەکی لە ڕێگەی پڕۆتۆکۆڵی DDC/CI.",
|
||||
"monitors-enforce-minimum-label": "Bi zorê ronahiyê (1%) bide sepandin",
|
||||
"monitors-external-brightness-description": "Piştgiriya DDCUtil ji bo kontrolkirina ronîbûnê li ser dîmenderên derveyî bi riya protokola DDC/CI çalak bike.",
|
||||
"monitors-external-brightness-label": "Piştgiriya ronahiya derve",
|
||||
"monitors-title": "Pêşdîtinên per-monitor",
|
||||
"night-light-auto-schedule-description": "بهپێی کاتی خۆرئاوابوون و خۆرههڵاتن له <i>{location}</i> — پێشنیارکراوه.",
|
||||
"monitors-title": "Sazkariyê bo her dîmender",
|
||||
"night-light-auto-schedule-description": "Li gorî dema rojavabûn û rohilatbûna rojê li <i>{cih}</i> — pêşniyarkirî.",
|
||||
"night-light-auto-schedule-label": "Bernamekirina otomatîk",
|
||||
"night-light-desc": "Kêmkirina belavbûna ronahiya şîn ji bo ku hûn çêtir razên û zexta çavan kêm bikin.",
|
||||
"night-light-enable-description": "Fîltreyeke rengê germ bikar bîne da ku belavbûna ronahiya şîn kêm bike.",
|
||||
@@ -945,8 +967,8 @@
|
||||
"appearance-display-description": "Hilbijêre ka bender çawa tev digere.",
|
||||
"appearance-display-exclusive": "Taybet",
|
||||
"appearance-floating-distance-description": "Dûrahiya di navbera benderê û qiraxa dîmenderê de saz bike.",
|
||||
"appearance-floating-distance-label": "Dûriya herikînê ya dokê",
|
||||
"appearance-hide-show-speed-description": "Lezgehîna bileziya anîmasyona veşartin/derxistina dokê sererast bike.",
|
||||
"appearance-floating-distance-label": "Dûrahiya herikînê ya benderê",
|
||||
"appearance-hide-show-speed-description": "Lezbûna anîmasyona veşartin/nîşandan a benderê biguherîne.",
|
||||
"appearance-hide-show-speed-label": "Lezê nîşan bide/veşêre",
|
||||
"appearance-icon-size-description": "Mezinahiya giştî ya dockê sererast bike.",
|
||||
"appearance-icon-size-label": "Mezinahiya benderê",
|
||||
@@ -954,7 +976,7 @@
|
||||
"appearance-inactive-indicators-label": "Nîşaneyên xebatê",
|
||||
"appearance-pinned-static-description": "Her gav îkonên sepanên pêvekirî bi rêza statîk ber bi çepê ve bikişîne.",
|
||||
"appearance-pinned-static-label": "Serîlêdanên sabîtkirî yên statîk",
|
||||
"appearance-position-description": "Cihê ku dok li ser ekranê xuya dike hilbijêre.",
|
||||
"appearance-position-description": "Cihê ku bender li ser dîmenderêê xuya dibe hilbijêre.",
|
||||
"appearance-position-label": "Rewş",
|
||||
"enabled-description": "Nîşan bide an jî bi tevahî dokê veşêre.",
|
||||
"enabled-label": "Dock çalak bike",
|
||||
@@ -962,7 +984,7 @@
|
||||
"monitors-only-same-monitor-description": "Tenê sepanên ji çavdêriya ku dock lê ye nîşan bide.",
|
||||
"monitors-only-same-monitor-label": "Tenê sepanên ji heman monitorê",
|
||||
"monitors-title": "Pêşangeha çavdêriyê",
|
||||
"title": "Dok"
|
||||
"title": "Bender"
|
||||
},
|
||||
"general": {
|
||||
"copy-settings": "Mîhengan kopî bike",
|
||||
@@ -1045,7 +1067,7 @@
|
||||
"clipboard-desc": "Gihîştin û dîroka clipboardê xwe ji destpêkerê birêve bibin.",
|
||||
"execute-desc": "Vê vesaz bike ka sepan çawa tên destpêkirin.",
|
||||
"execute-title": "Cîbicîkirin",
|
||||
"settings-annotation-tool-description": "Fermana ku dema tikandina bişkoka şîrovekirinê di dîroka clipboardê de were xebitandin, Wêne dê ji vê fermanê re were şandin.",
|
||||
"settings-annotation-tool-description": "Fermana ku dema tikandina bişkoka şîrovekirinê de di dîroka clipboardê de were xebitandin. Wêne dê bi rêya pipe’ê were şandin nav vê fermanê.",
|
||||
"settings-annotation-tool-label": "Amûra şîrovekirinê",
|
||||
"settings-annotation-tool-placeholder": "nîş. 'gradia', 'satty -f -'",
|
||||
"settings-auto-paste-description": "Bi otomatîkî tişta clipboardê ya hilbijartî bişîne. Wtype hewce dike.",
|
||||
@@ -1056,17 +1078,19 @@
|
||||
"settings-clip-wrap-text-label": "Pêça nivîsa clipboardê",
|
||||
"settings-clipboard-history-description": "Gihîştina tiştên ku berê hatine kopîkirin ji destpêkerê.",
|
||||
"settings-clipboard-history-label": "Dîroka clipboardê çalak bike",
|
||||
"settings-clipboard-watch-image-description": "ڕستەی فەرمانی تەواو کە بۆ wl-paste تێدەپەڕێنرێت بۆ گۆڕانکارییەکانی وێنە. (پێویستی بە دووبارە دەستپێکردنەوە هەیە)",
|
||||
"settings-clipboard-watch-image-label": "فەرمانی چاودێریکردنی وێنە",
|
||||
"settings-clipboard-watch-text-description": "تەواوی زنجیرەی فەرمان کە بۆ wl-paste تێپەڕێنراوە بۆ گۆڕانکارییەکانی دەق. (پێویستی بە دووبارە دەستپێکردنەوە هەیە)",
|
||||
"settings-clipboard-watch-text-label": "فەرمانی چاودێری دەق",
|
||||
"settings-clipboard-watch-image-description": "Ji bo guhertinên wêneyê, rêza fermanê ya tevahî ji wl-paste re hat şandin. (ji nû ve destpêkirinê pêwist dike)",
|
||||
"settings-clipboard-watch-image-label": "Fermana temaşekirina wêneyê",
|
||||
"settings-clipboard-watch-text-description": "Ji bo guhertinên nivîsê, rêza fermanê ya tevahî ji wl-paste re hat şandin. (ji nû ve destpêkirinê pêwist dike)",
|
||||
"settings-clipboard-watch-text-label": "Fermana çavdêriya nivîsê",
|
||||
"settings-custom-launch-prefix-description": "Fermanên pêşgiran bi destpêkerek xwerû pêşda bikin (mînak, 'runapp' ji bo entegrasyona systemd).",
|
||||
"settings-custom-launch-prefix-enabled-description": "Bi awayekî xwerû destpêkê ji bo destpêkirina sepanan bikar bîne li şûna rêbaza standard.",
|
||||
"settings-custom-launch-prefix-enabled-label": "Pêşgira destpêkirinê ya xwerû çalak bike",
|
||||
"settings-custom-launch-prefix-label": "Pêşgira destpêkirinê ya xwerû",
|
||||
"settings-custom-launch-prefix-label": "Pêşgira destpêkirinê ya kesane",
|
||||
"settings-desc": "Xweşikbûn û xuyabûna destpêkerê xweş bike.",
|
||||
"settings-enable-settings-search-description": "Dema ku di nav destpêker de digerî, encamên mîhengan nîşan bide.",
|
||||
"settings-enable-settings-search-label": "Lêgerîna mîhengan çalak bike",
|
||||
"settings-enable-windows-search-description": "Li çarçoveyên çalak bigere û balê bide ser.",
|
||||
"settings-enable-windows-search-label": "Lêgerînê çarçoveyê çalak bike",
|
||||
"settings-grid-view-description": "Tiştan di şêweya grîdê de nîşan bide, ne di lîsteyê de.",
|
||||
"settings-icon-mode-description": "Îkonên pergalê yên xwemalî li şûna îkonên Tabler bikar bîne.",
|
||||
"settings-icon-mode-label": "Îkonên xwecihî bikar bîne",
|
||||
@@ -1103,12 +1127,12 @@
|
||||
"date-time-use-analog-label": "Demjimêrê bi şêwaza analog bi kar bîne",
|
||||
"date-time-week-numbers-description": "Hefteya salê (mînak, hefteya 38) di salnameyê de nîşan bide.",
|
||||
"date-time-week-numbers-label": "Jimarên hefteyê nîşan bide",
|
||||
"location-desc": "Ji bo wergirtina hewayeke rast û bernameya Ronahiya Şevê, cîhê xwe diyar bike.",
|
||||
"location-desc": "Ji bo wergirtina rewşa bayê û bernamekirina ronahiya şevê ya rast, cihê xwe saz bike.",
|
||||
"location-search-description": "b.m., Toronto, ",
|
||||
"location-search-label": "Ji bo cihekî bigere",
|
||||
"location-search-placeholder": "Navê cihê têxîne",
|
||||
"location-title": "Cihê te",
|
||||
"weather-desc": "Yekîneya germahiya xweya bijarte hilbijêrin.",
|
||||
"weather-desc": "Yekîneya germahiya xwe ya bijarte hilbijêre.",
|
||||
"weather-enabled-description": "Agahiyên hewayê li seranserê navbeynê nîşan bide û daneyên hewayê bîne. Dema ku neçalak be, dê hemû hêmanên hewayê werin veşartin û dê tu daxwazên torê neyên kirin.",
|
||||
"weather-enabled-label": "Çalak bike hewayê",
|
||||
"weather-fahrenheit-description": "Germahiya bi Fahrenheit nîşan bide, ne bi Celsius.",
|
||||
@@ -1127,7 +1151,7 @@
|
||||
"allow-password-with-fprintd-label": "Rêdan bi têketina şîfreyê bi fprintd",
|
||||
"auto-start-auth-description": "mînak, otomatîkî dest bi rastkirina tiliyê dike bêyî ku pêdivî bi pêlkeyek an klîkek hebe.",
|
||||
"auto-start-auth-label": "Destpêkirina otomatîkî ya rastkirinê",
|
||||
"compact-lockscreen-description": "Tenê inputa têketinê û kontrolên pergalê nîşan bide, widgetên hewayê û medyayê veşêre.",
|
||||
"compact-lockscreen-description": "Tenê têketina ketanê û kontrolên pergalê nîşan bide, sepanokên rewşa bayê û medyayê veşêre.",
|
||||
"compact-lockscreen-label": "Kilîta ekrana berhevkirî",
|
||||
"lock-on-suspend-description": "Dema ku pergal tê rawestandin, ekranê bixweber kilît bike.",
|
||||
"lock-on-suspend-label": "Li ser rawestandinê kilît bike",
|
||||
@@ -1159,9 +1183,9 @@
|
||||
"history-critical-urgency-description": "Agahiyên girîng ên pêşîn li dîrokê tomar bike.",
|
||||
"history-critical-urgency-label": "Dema awarte ya krîtîk tomar bike",
|
||||
"history-desc": "Kontrol bike kaîdî notîfîkasyonên ku li gorî asta lezgîniya wan di dîrokê de têne hilanîn.",
|
||||
"history-low-urgency-description": "ڕاگەیاندنە گرنگی نزمەکان بۆ مێژوو هەڵبگرە.",
|
||||
"history-low-urgency-description": "Agahdariyên bi girîngiya nizm di dîrokê de tomar bike.",
|
||||
"history-low-urgency-label": "Dîroka lezgîniya kêm tomar bike",
|
||||
"history-normal-urgency-description": "Agahiyên pêşîniya normal di dîrokê de tomar bike.",
|
||||
"history-normal-urgency-description": "Agahdariyên pêşîniya normal di dîrokê de tomar bike.",
|
||||
"history-normal-urgency-label": "Dîroka lezgîniya normal tomar bike",
|
||||
"media-toast-description": "Dema rewşa lêdana medyayê biguhere, toastekê nîşan bide.",
|
||||
"media-toast-label": "Medya",
|
||||
@@ -1210,7 +1234,7 @@
|
||||
"always-on-top-description": "OSD li ser pencereyên tev-ekran û qatên din nîşan bide.",
|
||||
"always-on-top-label": "Her tim li ser",
|
||||
"background-opacity-description": "Kontrola zelalbûna paşxaneya OSD.",
|
||||
"background-opacity-label": "ڕوونیی پاشبنەما",
|
||||
"background-opacity-label": "Zelaliya paşrûya destgehê",
|
||||
"description": "Mîhengên nîşanderên ser-ekranê yên wekî pêşandanên deng û ronahiyê saz bike.",
|
||||
"duration-auto-hide-description": "Dema berî windabûna OSD biguherîne.",
|
||||
"duration-auto-hide-label": "Piştî otomatîk veşêre",
|
||||
@@ -1239,7 +1263,7 @@
|
||||
"types-volume-label": "Hêjmara derketinê"
|
||||
},
|
||||
"plugins": {
|
||||
"available-description": "گەڕان بکە و پڵەگینەکان لە سەرچاوە ڕێکخراوەکان دابمەزرێنە.",
|
||||
"available-description": "Pêvekên ji çavkaniyên rêkxistî bigere û saz bike",
|
||||
"available-label": "Pêvekên berdest",
|
||||
"available-no-plugins-description": "Çavkaniyên pêvekê xwe kontrol bikin an lîsteyê nû bikin.",
|
||||
"available-no-plugins-label": "Tiştên pêvek tune ne",
|
||||
@@ -1247,7 +1271,7 @@
|
||||
"collision-custom-version-exists": "Guhertoyeke taybet a ji \"{source}\" berê hatiye sazkirin",
|
||||
"collision-official-version-exists": "Guhertoya fermî ya vê pêvekê berê hatiye sazkirin",
|
||||
"filter-downloaded": "Daxistî",
|
||||
"filter-not-downloaded": "Nehatiye Dakêşandin",
|
||||
"filter-not-downloaded": "Nehatiye daxistin",
|
||||
"filter-tags-description": "Parzûna pêvekên bi kategoriya an rewşa daxistinê",
|
||||
"filter-tags-label": "Tagan",
|
||||
"hot-reload-description": "Bi guhertina pelên wan, bixweber pêvekên xwe ji nû ve bar bike. Ji bo pêşxistina pêvekan bikêr e.",
|
||||
@@ -1312,7 +1336,7 @@
|
||||
"entry-settings-default-command-lock": "Kilîta hundirîn a ekranê (bê ferman)",
|
||||
"entry-settings-default-command-logout": "Derketina navxweyî (bê ferman)",
|
||||
"entry-settings-default-info-description": "Heke fermana xwerû neyê diyarkirin, fermana pergalê ya xwerû dê were bikar anîn.",
|
||||
"entry-settings-default-info-label": "Fermana xwerû",
|
||||
"entry-settings-default-info-label": "Fermana berdest",
|
||||
"entry-settings-title": "Vexîne {entry}",
|
||||
"entry-settings-tooltip": "Fermanê vesazkirinê",
|
||||
"general-desc": "Maneja reftar û xuyabûna panelê menûya rûniştinê.",
|
||||
@@ -1331,13 +1355,13 @@
|
||||
"custom-highlight-colors-title-label": "Rengên ronîkirina xwerû",
|
||||
"disk-section-label": "Bikaranîna dîskê",
|
||||
"disk-available-label": "Dîsk berdest e",
|
||||
"enable-dgpu-monitoring-description": "Hişyarî: Ev dê GPUya weya veqetandî (NVIDIA/AMD) hişyar bike, ku dibe ku bandorek girîng li ser jiyana pîlê li ser laptopên bi grafîkên hîbrîd bike.",
|
||||
"enable-dgpu-monitoring-label": "Çavdêriya GPU'ya veqetandî çalak bike",
|
||||
"enable-dgpu-monitoring-description": "Hişyarî: Ev dê YKG a te ya veqetandî (NVIDIA/AMD) hişyar bike, ku dibe ku bandorek girîng li ser jiyana pîlê li ser laptopên bi grafîkên hîbrîd bike.",
|
||||
"enable-dgpu-monitoring-label": "Çavdêriya YKG veqetandî çalak bike",
|
||||
"external-monitor-description": "Fermanî an rêya sepanê binivîse ku dema sepana monitora pergala derveyî çalak dike were xebitandin.",
|
||||
"external-monitor-label": "Fermana monitora pergala derveyî",
|
||||
"external-monitor-placeholder": "çavkanî || navendamisyonê || jdsîstemonîtor || statîstîkênbingehîn || navenda-çavdêriya-sîstemê || gnome-sîstem-monitor || plasma-sîstemmonitor || mate-sîstem-monitor || ukui-sîstem-monitor || deepin-sîstem-monitor || pantheon-sîstem-monitor",
|
||||
"general-desc": "Sazkirina reftar û xuyabûna çavdêriya pergalê.",
|
||||
"gpu-section-label": "Germahiya GPU",
|
||||
"gpu-section-label": "Germahiya YKG",
|
||||
"highlight-colors-section-label": "Rengên ronîkirinê",
|
||||
"polling-interval-label": "Navbera anketê",
|
||||
"polling-section-description": "Mîheng bike ku her pîvana pergalê çiqas caran were nûkirin.",
|
||||
@@ -1373,7 +1397,7 @@
|
||||
"dimmer-opacity-label": "Şefafiya sermaseyê sermaseyê kêmkirî",
|
||||
"dimmer-opacity-reset": "Vekirina zelalbûna sermaseya tarîkirî",
|
||||
"panel-background-opacity-description": "Zelalbûna paşrûyê ji bo hemû destgehan (darik, destpêker, sazkarî, hwd...) saz bike.",
|
||||
"panel-background-opacity-label": "Şeffafiya paşxaneya panelê",
|
||||
"panel-background-opacity-label": "Zelaliya paşrûyê destgehê",
|
||||
"panels-attached-to-bar-description": "Panelên bi qiraxên bar û ekranê ve têne kilît kirin, bi goşeyên berevajîkirî yên şêwekar xuyangek bêkêmasî diafirînin.",
|
||||
"panels-attached-to-bar-label": "Panêlan bi kêlekê ve bişkînin",
|
||||
"panels-overlay-description": "Pişkin dike ku panel û bar, heta ser sepanên tev-ekran jî, xuya bimînin.",
|
||||
@@ -1404,7 +1428,7 @@
|
||||
"automation-scheduled-change-label": "Guherîna plansazkirî",
|
||||
"look-feel-edge-smoothness-description": "Bandora bo bandorê perîşan û nerm li keviya veguherînan dike.",
|
||||
"look-feel-edge-smoothness-label": "Nermkirina keviya derbasbûnê",
|
||||
"look-feel-fill-color-description": "ڕەنگێکی پڕ بکەرەوە هەڵبژێرە کە ڕەنگە لە پشت وێنەی سەر دیوارەوە دەربکەوێت.",
|
||||
"look-feel-fill-color-description": "Rengê dagirtinê hilbijêre ku dibe ku li pişt wêneyê dîwêr xuya bibe",
|
||||
"look-feel-fill-mode-description": "Hilbijêre ka divê wêne çawa were pîvandin da ku bi çareseriya çavdêriya te re têkildar be.",
|
||||
"look-feel-fill-mode-label": "Moda dagirtinê",
|
||||
"look-feel-title": "Binêre û hîs bike",
|
||||
@@ -1441,7 +1465,7 @@
|
||||
}
|
||||
},
|
||||
"placeholders": {
|
||||
"command-example": "echo \"Silav cîhan\"",
|
||||
"command-example": "echo \"Silav cihan\"",
|
||||
"enter-command": "Fermana ku bê tetbîqkirin binivîse (sepan an nivîsara taybet)",
|
||||
"enter-ipc-identifier": "Ji bo fermanên IPC nasnameyek yekta binivîse",
|
||||
"enter-path": "Rêya binivîse...",
|
||||
@@ -1450,15 +1474,15 @@
|
||||
"enter-width-pixels": "Firehiya bi pîxel binivîse",
|
||||
"search": "Bigere...",
|
||||
"search-icons": "b.m., noctalia, niri, betarî, ewr",
|
||||
"search-launcher": "Li navnîşan bigere... an jî ji bo fermanan > bikar bîne",
|
||||
"search-launcher": "Li navan bigere... an ji bo fermanan > bi kar bîne",
|
||||
"search-wallhaven": "Lêgerîn li Wallhaven...",
|
||||
"search-wallpapers": "Binivîse da ku dîwêran parzûn bikî..."
|
||||
},
|
||||
"positions": {
|
||||
"bottom": "Jêr",
|
||||
"bottom-center": "Jêr navend",
|
||||
"bottom-left": "Binê çepê",
|
||||
"bottom-right": "ڕاستی خوارەوە",
|
||||
"bottom-left": "Jêr çepê",
|
||||
"bottom-right": "Jêr rastê",
|
||||
"center": "Navend",
|
||||
"center-left": "Navend çep",
|
||||
"center-right": "Navend rast",
|
||||
@@ -1472,12 +1496,12 @@
|
||||
"top-right": "Rastê jor"
|
||||
},
|
||||
"session-menu": {
|
||||
"action-in-seconds": "{action} di {seconds} çirke de...",
|
||||
"action-in-seconds": "di {seconds} çirke de {action} ...",
|
||||
"cancel-timer": "Demjimêr betal bike",
|
||||
"title": "Menuya danişînê"
|
||||
},
|
||||
"setup": {
|
||||
"all-done": "Hemû Temam!",
|
||||
"all-done": "Qediya!",
|
||||
"appearance": {
|
||||
"subheader": "Dark Mode û çavkaniyên rengan hilbijêre (Wallpaper an pêşdiyarkirî)."
|
||||
},
|
||||
@@ -1513,9 +1537,9 @@
|
||||
"disk-usage": "%{percent}",
|
||||
"location-display": "{nav} ({koordinat})",
|
||||
"monitor-description": "{model} ({width}x{height} @ {scale}x)",
|
||||
"no-media-player-detected": "ئامێرێکی میدیایی نەدۆزرایەوە",
|
||||
"no-media-player-detected": "Tu lîstikvanen medyayê nehatin dîtin",
|
||||
"scaling-percentage": "%{percentage}",
|
||||
"signal-strength": "%{nîşan}",
|
||||
"signal-strength": "%{signal}",
|
||||
"unknown-app": "Sepanek nenas",
|
||||
"uptime": "Dema xebitandinê: {uptime}",
|
||||
"user-requested": "Daxwaza bikarhêner",
|
||||
@@ -1523,37 +1547,37 @@
|
||||
"widget-settings-title": "Sazkariyên {widget}"
|
||||
},
|
||||
"system-monitor": {
|
||||
"cpu-temp": "Germa CPU",
|
||||
"cpu-usage": "Bikaranîna CPU",
|
||||
"cpu-temp": "Germahiya YKN",
|
||||
"cpu-usage": "Bikaranîna YKN",
|
||||
"disk": "Dîsk",
|
||||
"download-speed": "Leza daxistinê",
|
||||
"gpu-temp": "Germa GPU",
|
||||
"gpu-temp": "Germahiya YKG",
|
||||
"load-average": "Bar navîn",
|
||||
"title": "Çavdêriya sîstemê",
|
||||
"title": "Çavdêriya pergalê",
|
||||
"upload-speed": "Leza barkirinê"
|
||||
},
|
||||
"toast": {
|
||||
"airplane-mode": {
|
||||
"title": "Rewşa balafirê"
|
||||
"title": "Awaya balafirê"
|
||||
},
|
||||
"battery": {
|
||||
"low": "Pîl kêm e",
|
||||
"low-desc": "Pîl li ser %{percent} e. Ji kerema xwe şarjê girêde"
|
||||
"low-desc": "Betarî li ser %{percent} e. Tijîkarê girê bide"
|
||||
},
|
||||
"bluetooth": {
|
||||
"address-copied": "Navnîşan li clipboardê hate kopîkirin",
|
||||
"confirm-code": "Koda {value} li ser amûra din piştrast bike.",
|
||||
"connect-failed": "Têk çû girêdan bi cîhazê re",
|
||||
"disconnect-failed": "Têkçûn di qutkirina ji cîhazê de",
|
||||
"discoverable-change-failed": "ڕا گۆڕینی باری دۆزراوە نەکرا",
|
||||
"discoverable-disabled": "Dîtbar neçalak kirin",
|
||||
"discoverable-enabled": "Hêzdar kirin",
|
||||
"discoverable-change-failed": "Guhertina rewşa dîtşbar têk çû",
|
||||
"discoverable-disabled": "Dîtbarî hat neçalakkirin",
|
||||
"discoverable-enabled": "Dîtbarî hat neçalakkirin",
|
||||
"display-code": "Koda {value} li ser amûra din binivîse.",
|
||||
"forget-failed": "Têk çû ku amûr were jibîrkirin",
|
||||
"pair-failed": "Cîhaz bi hev ve nehat girêdan",
|
||||
"passkey-required": "Pêdivî bi şîfreya amûrê heye.",
|
||||
"passkey-required": "Pêdivî bi borînpeyvê amûrê heye.",
|
||||
"pincode-required": "Koda PIN ji hêla cîhazê ve tê xwestin.",
|
||||
"state-change-failed": "فشل گوهارتنا حالهتا بلوتوثێ"
|
||||
"state-change-failed": "Guhertina rewşa Bluetooth têk çû"
|
||||
},
|
||||
"clipboard": {
|
||||
"long-text": "Teksta dirêj",
|
||||
@@ -1570,7 +1594,7 @@
|
||||
"internet-limited": "Pêwendîdar bê înternetê",
|
||||
"keyboard-layout": {
|
||||
"changed": "Şêwaza kilîtdankê bo {layout} hat guhertin",
|
||||
"title": "Klavyeya"
|
||||
"title": "Kilîtdank"
|
||||
},
|
||||
"missing-control-center": {
|
||||
"description": "Kurteya kontrolê ji barê hatiye rakirin. Ji bo ku hûn dîsa ji barê bigihîjinê, hûn ê hewce ne ku kurteyê ji nû ve zêde bikin. Her weha hûn dikarin bi rast-klîkkirina li ser barê jî vekin",
|
||||
@@ -1591,7 +1615,7 @@
|
||||
"profile-name": "{profîl}"
|
||||
},
|
||||
"theming-processor-failed": {
|
||||
"desc-generic": "Çewtiyek di dema pêvajoykirina şablonan de rû da",
|
||||
"desc-generic": "Şaşetiyek di dema pêvajoykirina şablonan de rû da",
|
||||
"title": "Pêvajoya şablonê têk çû"
|
||||
},
|
||||
"vpn": {
|
||||
@@ -1606,14 +1630,14 @@
|
||||
"wifi": {
|
||||
"connected": "Bi '{ssid}' ve hat girêdan",
|
||||
"connection-failed": "Girêdan têk çû",
|
||||
"connection-timeout": "Demja girêdanê bi dawî bû",
|
||||
"connection-timeout": "Dema girêdanê qediya",
|
||||
"disconnected": "Ji '{ssid}' qut bû",
|
||||
"incorrect-password": "Borînpeyva şaş",
|
||||
"incorrect-password": "Borînpeyva şaş e",
|
||||
"network-not-found": "Tor nehat dîtin"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"add-widget": "Widget zêde bike",
|
||||
"add-widget": "Sepanokê tevlî bike",
|
||||
"bluetooth-devices": "Amûrên Bluetooth",
|
||||
"brightness-at": "Ronahî: {brightness}%",
|
||||
"click-to-start-recording": "Tomarkarê dîmenderê (dest bi tomarkirinê bike)",
|
||||
@@ -1634,8 +1658,8 @@
|
||||
"list-view": "Dîtina lîsteyê",
|
||||
"manage-vpn": "Girêdanên VPN",
|
||||
"manage-wifi": "Wi-Fi",
|
||||
"max-widgets-reached": "Hejmara herî zêde ya widgetan hate bidestxistin",
|
||||
"microphone-volume-at": "Hêjmara mîkrofonê: {volume}%",
|
||||
"max-widgets-reached": "Jimara herî pir a sepanokan hat gihîştin",
|
||||
"microphone-volume-at": "Dengê mîkrofonê: {volume}%",
|
||||
"move-to-section": "Here'ke {section} here",
|
||||
"mute": "Bêdeng bike",
|
||||
"next-media": "Strana pêş",
|
||||
@@ -1688,7 +1712,7 @@
|
||||
"apikey-placeholder": "API Key-a Wallhavenê xwe binivîse",
|
||||
"apply-all-monitors-description": "Wêneyê dîwêrê ya hilbijartî li ser hemû dîmenderan bisepîne.",
|
||||
"apply-all-monitors-label": "Li ser hemû dîmenderan bisepîne",
|
||||
"categories-anime": "ئەنیمێ",
|
||||
"categories-anime": "Anîme",
|
||||
"categories-label": "Beş",
|
||||
"categories-people": "Mirov",
|
||||
"order-asc": "Berjor",
|
||||
@@ -1699,7 +1723,7 @@
|
||||
"purity-sfw": "SFW",
|
||||
"purity-sketchy": "Sketchy",
|
||||
"ratios-all-portrait": "Hemû portre",
|
||||
"ratios-all-wide": "Hemû fireh",
|
||||
"ratios-all-wide": "Hemû fereh",
|
||||
"ratios-any": "Her",
|
||||
"ratios-label": "Rêjeya aliyê",
|
||||
"resolution-atleast": "Herî kêm",
|
||||
@@ -1760,8 +1784,8 @@
|
||||
"common-us-date": "Awaya demê ya DYE",
|
||||
"common-weekday-date": "Roja hefteyê bi demê",
|
||||
"common-weekday-month-day": "Rojên hefteyê, meh û roj",
|
||||
"day-abbreviated": "Navê rojê yê kurtkirî",
|
||||
"day-full": "Navê rojê yê tevahî",
|
||||
"day-abbreviated": "Navê rojê ya kurtkirî",
|
||||
"day-full": "Navê rojê ya tevahî",
|
||||
"day-leading-zero": "Roj bi sifira destpêkê (01-31)",
|
||||
"day-no-leading-zero": "Roj bê sifira destpêkê (1-31)",
|
||||
"hour-leading-zero": "Demjimêr bi sifira destpêkê (00-23) — 24-awaya demjimêrê",
|
||||
@@ -1774,21 +1798,21 @@
|
||||
"month-number-no-zero": "Meh wekî jimarek bê sifira destpêkê (1-12)",
|
||||
"second-leading-zero": "Çirke bi sifira destpêkê (00-59)",
|
||||
"second-no-leading-zero": "Çirke bê sifira destpêkê (0-59)",
|
||||
"timezone-abbreviation": "Kurteya herêma demjimêrê",
|
||||
"timezone-abbreviation": "Kurteriya herêma demê",
|
||||
"year-four-digit": "Sal wekî çar-jimar",
|
||||
"year-two-digit": "Sal wekî du-jimar (00-99)"
|
||||
},
|
||||
"file-picker": {
|
||||
"item": "babet",
|
||||
"items": "babetên",
|
||||
"item": "hêman",
|
||||
"items": "hêman",
|
||||
"search-placeholder": "Li pel û peldankan bigere...",
|
||||
"select-current": "A heyî hilbijêre",
|
||||
"select-file": "Pelê hilbijêre",
|
||||
"select-folder": "Peldankê hilbijêre",
|
||||
"selected": "Hûn bijartî:",
|
||||
"selected": "Hilbijartî:",
|
||||
"title": "Hilbijêrê pelê"
|
||||
},
|
||||
"file-picker-title": "Pelê hilbijêre",
|
||||
"file-picker-title": "Pelekê hilbijêre",
|
||||
"icon-picker": {
|
||||
"title": "Hilbijêrê îkonê"
|
||||
},
|
||||
@@ -1797,17 +1821,17 @@
|
||||
"wifi": {
|
||||
"panel": {
|
||||
"action-required": "Çalakî pêwîst e",
|
||||
"available-interfaces": "Navên berdest",
|
||||
"available-interfaces": "Navrûyên heyî",
|
||||
"available-networks": "Torên heyî",
|
||||
"disabled": "Wi‑Fi neçalak e",
|
||||
"disconnecting": "Tê qutkirin...",
|
||||
"dns": "DNS",
|
||||
"enable-message": "Wi‑Fi çalak bike da ku torên heyî bibîne.",
|
||||
"enable-message": "Wi‑Fi çalak bike da ku torên heyî bibînî.",
|
||||
"enter-password": "Borînpeyva Wi‑Fi têxîne...",
|
||||
"forget": "Ji bîr bike",
|
||||
"forget-network": "Vê torê ji bîr bike",
|
||||
"forgetting": "Tê jibîrkirin...",
|
||||
"interface": "Dîmendera torê",
|
||||
"interface": "Navrûya torê",
|
||||
"internet-connected": "Înternet hat girêdan",
|
||||
"internet-limited": "Înternet tune ye",
|
||||
"internet-status": "Rewşa înternetê",
|
||||
@@ -1822,10 +1846,10 @@
|
||||
"title": "Wi-Fi"
|
||||
},
|
||||
"signal": {
|
||||
"excellent": "Bawer be",
|
||||
"fair": "Adil",
|
||||
"good": "Baş",
|
||||
"poor": "Zəif"
|
||||
"excellent": "Bihêz e",
|
||||
"fair": "Navîn e",
|
||||
"good": "Baş e",
|
||||
"poor": "Lawaz e"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Week",
|
||||
"widgets": "Widgets",
|
||||
"width": "Breedte",
|
||||
"windows": "Vensters",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Bij hover"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Automatisch verbergen",
|
||||
"hidden": "Verbergen indien leeg",
|
||||
"idle": "Verbergen indien inactief",
|
||||
"transparent": "Transparant wanneer leeg",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Emoji's laden...",
|
||||
"emoji-loading-description": "Even geduld",
|
||||
"emoji-no-recent": "Nog geen recente emoji's",
|
||||
"emoji-search-description": "Zoek en kopieer emoji's"
|
||||
"emoji-search-description": "Zoek en kopieer emoji's",
|
||||
"settings-search-description": "Zoeken en navigeren naar instellingen",
|
||||
"windows-search-description": "Zoek en focus open vensters"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Standaard",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Ruim",
|
||||
"display-mode-always-visible": "Altijd zichtbaar",
|
||||
"type-floating": "Zwevend",
|
||||
"type-framed": "Omkaderd",
|
||||
"type-simple": "Eenvoudig"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Volume-overdrive toestaan"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Tijd voordat de Bar verdwijnt nadat de muis deze verlaat.",
|
||||
"appearance-auto-hide-delay-label": "Verbergvertraging",
|
||||
"appearance-auto-hide-exclusive-note": "Opmerking: De exclusieve zone wordt automatisch uitgeschakeld wanneer automatisch verbergen actief is.",
|
||||
"appearance-auto-show-delay-description": "Tijd voordat de balk verschijnt wanneer de muis de rand bereikt.",
|
||||
"appearance-auto-show-delay-label": "Toonvertraging",
|
||||
"appearance-background-opacity-description": "Stel de achtergronddoorzichtigheid specifiek in voor de balk.",
|
||||
"appearance-background-opacity-label": "Balk achtergronddoorzichtigheid",
|
||||
"appearance-capsule-opacity-description": "Stel het doorzichtigheidsniveau in voor widget-achtergronden wanneer capsule wordt getoond.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Pas de opvulling van de balk aan voor een compacte of ruime uitstraling.",
|
||||
"appearance-density-label": "Balkdichtheid",
|
||||
"appearance-desc": "Pas de uitstraling en positie van de balk aan.",
|
||||
"appearance-display-mode-description": "Kies wanneer de balk zichtbaar is",
|
||||
"appearance-display-mode-label": "Weergavemodus",
|
||||
"appearance-floating-description": "Toon de balk weer als een zwevende 'pil'.",
|
||||
"appearance-floating-label": "Zwevende balk",
|
||||
"appearance-frame-radius": "Binnenradius",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Knoppen weergeven",
|
||||
"media-player-show-visualizer-description": "Toon de audio-visualisatie overlay.",
|
||||
"media-player-visualizer-type-description": "Kies een visualisatietype voor de achtergrond van de desktop mediaplayer.",
|
||||
"system-stat-layout-bottom": "Onder",
|
||||
"system-stat-layout-description": "Kies hoe de legenda wordt weergegeven ten opzichte van de grafiek.",
|
||||
"system-stat-layout-label": "Indeling",
|
||||
"system-stat-layout-side": "Zijde",
|
||||
"system-stat-rounded-corners-description": "Afgeronde hoeken gebruiken voor de widget-achtergrond.",
|
||||
"system-stat-rounded-corners-label": "Afgeronde Hoeken",
|
||||
"system-stat-show-background-description": "Toon de achtergrondcontainer voor de systeemstatistieken-widget.",
|
||||
"system-stat-show-background-label": "Achtergrond weergeven",
|
||||
"system-stat-stat-type-description": "Kies welke systeemstatistiek weer te geven.",
|
||||
"system-stat-stat-type-label": "Statistiektype",
|
||||
"title": "Desktopwidgets",
|
||||
"weather-enabled-description": "Toon een weerwidget op het bureaublad.",
|
||||
"weather-enabled-label": "Weerwidget inschakelen",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Pas het gedrag en uiterlijk van de launcher aan.",
|
||||
"settings-enable-settings-search-description": "Toon instellingen in de zoekresultaten van de Launcher.",
|
||||
"settings-enable-settings-search-label": "Instellingen zoeken inschakelen",
|
||||
"settings-enable-windows-search-description": "Actieve vensters zoeken en focussen.",
|
||||
"settings-enable-windows-search-label": "Vensterzoekfunctie inschakelen",
|
||||
"settings-grid-view-description": "Items in een raster weergeven in plaats van een lijst.",
|
||||
"settings-icon-mode-description": "Gebruik native systeemiconen in plaats van Tabler-iconen.",
|
||||
"settings-icon-mode-label": "Gebruik native iconen",
|
||||
|
||||
+670
-10
@@ -489,6 +489,7 @@
|
||||
"week": "Veke",
|
||||
"widgets": "Miniprogram",
|
||||
"width": "Breidde",
|
||||
"windows": "Vindauge",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -508,6 +509,7 @@
|
||||
"on-hover": "Ved sviv"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Automatisk gøyming",
|
||||
"hidden": "Gøym når tom",
|
||||
"idle": "Gøym når inaktiv",
|
||||
"transparent": "Gjennomsynleg når tom",
|
||||
@@ -559,7 +561,9 @@
|
||||
"emoji-loading": "Lastar inn emojiar...",
|
||||
"emoji-loading-description": "Vent litt",
|
||||
"emoji-no-recent": "Ingen nylege emojiar enno",
|
||||
"emoji-search-description": "Leita i og kopiera emojiar"
|
||||
"emoji-search-description": "Leita i og kopiera emojiar",
|
||||
"settings-search-description": "Søk og naviger til innstillingar",
|
||||
"windows-search-description": "Søk og fokuser opne vindauge"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -595,7 +599,11 @@
|
||||
"density-compact": "Tett",
|
||||
"density-default": "Standard",
|
||||
"density-mini": "Ørliten",
|
||||
"density-spacious": "Romsleg"
|
||||
"density-spacious": "Romsleg",
|
||||
"display-mode-always-visible": "Alltid synleg",
|
||||
"type-floating": "Flytande",
|
||||
"type-framed": "I ramme",
|
||||
"type-simple": "Endefram"
|
||||
},
|
||||
"control-center": {
|
||||
"quick-settings-style-classic": "Klassisk",
|
||||
@@ -694,7 +702,7 @@
|
||||
"media-scrolling-title-description": "Slå på varig blading for lange mediatitlar.",
|
||||
"media-scrolling-title-label": "Bladande tittel",
|
||||
"media-title": "Mediaavspelarar",
|
||||
"on-middle-clicked-description": "Kommando som køyr når knappen er midtklikka.",
|
||||
"on-middle-clicked-description": "Kommando som køyrer når knappen er midtklikka.",
|
||||
"panel-applications-empty": "Ingen applikasjonar spelar av ljod no",
|
||||
"title": "Ljod",
|
||||
"visualizer-type-description": "Vel visualiseringstypen når ein spelar av media.",
|
||||
@@ -713,25 +721,611 @@
|
||||
"volumes-volume-overdrive-description": "Tillèt at ljodstyrke kan gå over 100%. Ikkje alltid støtta av maskinvare.",
|
||||
"volumes-volume-overdrive-label": "Tillat overdrift på ljodstyrke"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Tid før Bar-en skjuler seg etter at musa forlèt den.",
|
||||
"appearance-auto-hide-delay-label": "Skjulingsforsinking",
|
||||
"appearance-auto-hide-exclusive-note": "Merk: Eksklusiv sone blir automatisk deaktivert når auto-skjul er aktivt.",
|
||||
"appearance-auto-show-delay-description": "Tid før baren viser seg når musa kjem til kanten.",
|
||||
"appearance-auto-show-delay-label": "Visingsforsinking",
|
||||
"appearance-capsule-opacity-description": "Set kor ugjennomsynlege bakgrunnen er for miniprogram når ilåta er på skjermen.",
|
||||
"appearance-density-description": "Fastset utfylling på lina for å gjera henne tett eller romsleg.",
|
||||
"appearance-display-mode-description": "Vel når baren er synleg",
|
||||
"appearance-display-mode-label": "Visningsmodus",
|
||||
"appearance-show-capsule-description": "Vis bakgrunn for miniprogram.",
|
||||
"appearance-show-outline-label": "Vis grenser på miniprogram",
|
||||
"monitor-configure-widgets": "Set opp miniprogram",
|
||||
"monitor-widgets-title": "Miniprogramoppsett - {monitor}",
|
||||
"use-global-widgets": "Bruk globale miniprogram",
|
||||
"widgets-desc": "Drag miniprogram for å endra på rekkjefylgjd. Bruk høgreklikksmenyen for å senda miniprogram andre stader eller sletta dei.",
|
||||
"widgets-title": "Miniprogramplassering"
|
||||
},
|
||||
"color-scheme": {
|
||||
"color-source-use-wallpaper-colors-description": "Lagar fargeskala frå bakgrunnsbiletet ditt. Vel fargar automatisk for å skapa ein samanhengande skala.",
|
||||
"color-source-use-wallpaper-colors-label": "Bruk bakgrunnsfargar",
|
||||
"wallpaper-method-description": "Vel måten Noctalia lagar fargeskala på.",
|
||||
"wallpaper-method-label": "Fargeskala lagingsmåte",
|
||||
"wallpaper-monitor-source-description": "Vel kva for skjerm Noctalia ser på for å velja bakgrunnsfargar.",
|
||||
"wallpaper-monitor-source-label": "Kjelde for fargeval"
|
||||
},
|
||||
"control-center": {
|
||||
"shortcuts-title": "Miniprogramsnarvegar",
|
||||
"system-monitor-disk-path-description": "Vel kva for diskmonteringspunkt systemvaktskortet i kontrollsenteret skal vakta.",
|
||||
"system-monitor-disk-path-label": "Systemvakt filbane"
|
||||
},
|
||||
"desktop-widgets": {
|
||||
"clock-enabled-description": "Vis ei klokkeminiprogram på skrivebordet.",
|
||||
"clock-enabled-label": "Slå på klokka",
|
||||
"clock-format-label": "Format",
|
||||
"clock-height-description": "Høgd på klokkeprogrammet i piksel",
|
||||
"clock-height-label": "Høgd",
|
||||
"clock-minimal-mode-description": "Bruk endefram klokkevisning med tid og dato.",
|
||||
"clock-minimal-mode-label": "Endefram-modus",
|
||||
"clock-rounded-corners-description": "Bruk avrunda hyrne for bakgrunnen til miniprogrammet.",
|
||||
"clock-rounded-corners-label": "Avrunda hyrne",
|
||||
"clock-show-background-description": "Vis bakgrunnsilåta for klokkeprogrammet.",
|
||||
"clock-show-background-label": "Vis bakgrunn",
|
||||
"clock-show-date-description": "Vis datoen i dag under tida.",
|
||||
"clock-show-date-label": "Vis dato",
|
||||
"clock-show-seconds-description": "Vis sekund i tida.",
|
||||
"clock-show-seconds-label": "Vis sekund",
|
||||
"clock-style-analog": "Analog",
|
||||
"clock-style-binary": "Binær",
|
||||
"clock-style-description": "Vel klokkevisning.",
|
||||
"clock-style-digital": "Digital",
|
||||
"clock-style-label": "Klokkestil",
|
||||
"clock-style-minimal": "Endefram",
|
||||
"clock-width-description": "Breidde på klokkeprogrammet i piksel",
|
||||
"edit-mode-button-label": "Endringsmodus",
|
||||
"edit-mode-controls-explanation": "Venstreklikk & drag: Flytt eller endra storleik. Høgreklikk: opna val for samanhengsmenyen.",
|
||||
"edit-mode-description": "Slå på endringsmodus for å flytta på skrivebordsminiprogram. Når dette er på, viser miniprogram ei grense og dei kan flyttast på.",
|
||||
"edit-mode-exit-button": "Kom ut av endringsmodus",
|
||||
"edit-mode-grid-snap-label": "Snap til rutenett",
|
||||
"edit-mode-label": "Endringsmodus",
|
||||
"enabled-description": "Slå av/på skrivebordsminiprogram heilt.",
|
||||
"enabled-label": "Slå på skrivebordsminiprogram",
|
||||
"general-desc": "Styr miniprogram som står på skrivebordet ditt.",
|
||||
"general-title": "Skrivebordsminiprogram",
|
||||
"media-player-enabled-description": "Vis mediaavspelar på skrivebordet.",
|
||||
"media-player-enabled-label": "Slå på mediaminiprogram",
|
||||
"media-player-rounded-corners-description": "Slå på avrunda hyrne på miniprogramsrendene.",
|
||||
"media-player-show-album-art-description": "Vis albumkunst og spordata (tittel og artist).",
|
||||
"media-player-show-album-art-label": "Vis albumkunst og tittel",
|
||||
"media-player-show-background-description": "Vis bakgrunnsilåta.",
|
||||
"media-player-show-buttons-description": "Vis mediakontrollane (spel/pause, førre, neste).",
|
||||
"media-player-show-buttons-label": "Vis knappar",
|
||||
"media-player-show-visualizer-description": "Vis overlegg for ljodvisualiseraren.",
|
||||
"media-player-visualizer-type-description": "Vel visualiseringstype.",
|
||||
"system-stat-rounded-corners-description": "Bruk avrunda hyrne for bakgrunnsbilete til miniprogrammet.",
|
||||
"system-stat-rounded-corners-label": "Avrunda Hjørne",
|
||||
"system-stat-show-background-description": "Viser bakgrunnsilåt til miniprogrammet for systemstatistikk.",
|
||||
"system-stat-show-background-label": "Vis bakgrunn",
|
||||
"system-stat-stat-type-description": "Vel kva for systemstatistikk som skal visast.",
|
||||
"system-stat-stat-type-label": "Statistikktype",
|
||||
"title": "Skrivebordsminiprogram",
|
||||
"weather-enabled-description": "Viser miniprogram for vêr på skrivebordet.",
|
||||
"weather-enabled-label": "Slå på miniprogram for vêr",
|
||||
"weather-show-background-description": "Viser bakgrunnsilåt for miniprogrammet for vêr."
|
||||
},
|
||||
"general": {
|
||||
"launch-setup-wizard": "Oppsetthjelpar"
|
||||
},
|
||||
"hooks": {
|
||||
"info-parameters-description": "Bakgrunnskrok: $1 = bakgrunnsbane, $2 = skjermnamn<br>• Tema brytarkrok: $1 = sann/usann (Mørkemodus-status)<br>• Skjermopplåsings-/ulåsingskrokar: Ingen parametrar<br>• Ytingsmoduskrokar: Ingen parametrar<br>• Øktskrok: $1 = handling (Slå av/starta å nyo)",
|
||||
"system-hooks-desc": "Set opp kommandoar som køyrer når systemhendingar skjer.",
|
||||
"system-hooks-enable-description": "Slår av eller på krokkommandoar.",
|
||||
"system-hooks-enable-label": "Slå på krokar",
|
||||
"system-hooks-title": "Systemkrokar",
|
||||
"wallpaper-changed-description": "Kommando som køyrer når bakgrunnsbiletet endrar.",
|
||||
"wallpaper-changed-label": "Bakgrunnsbiletet endra",
|
||||
"wallpaper-changed-placeholder": "t.d. notify-send \"Bakgrunnsbilete\" \"Endra\""
|
||||
},
|
||||
"indicator": {
|
||||
"system-default": "Systemstandard"
|
||||
},
|
||||
"launcher": {
|
||||
"clipboard-desc": "Sjå og styra utklippsboka di frå programveljaren.",
|
||||
"settings-clipboard-watch-image-description": "Heil kommandostreng sendt til wl-paste for bildeendringar. (krev omstart)",
|
||||
"settings-clipboard-watch-image-label": "Biletovervakingskommando",
|
||||
"settings-clipboard-watch-text-description": "Fullstendig kommandostreng sendt til wl-paste for tekstendringer. (krever omstart)",
|
||||
"settings-clipboard-watch-text-label": "Tekstovervakingskommando"
|
||||
"execute-desc": "Styrer korleis applikasjonar er køyrde",
|
||||
"execute-title": "Køyring",
|
||||
"settings-annotation-tool-description": "Kommando som køyrer når ein klikkar på merknadsknappen i utklippsboka. Biletet vert sendt med røyr til denne kommandoen.",
|
||||
"settings-annotation-tool-label": "Merknadsverktøy",
|
||||
"settings-annotation-tool-placeholder": "t.d. 'gradia', 'satty -f -'",
|
||||
"settings-auto-paste-description": "Limar inn det valde utklippet automatisk. Krev wtype.",
|
||||
"settings-auto-paste-label": "Automatisk liming",
|
||||
"settings-clip-preview-description": "Viser førebilete av utklippsinnhaldet når ein nyttar >clip kommandoen.",
|
||||
"settings-clip-preview-label": "Slå på klippførebilete",
|
||||
"settings-clip-wrap-text-description": "Bryt tekst i utklippsboka heller enn å korta han av.",
|
||||
"settings-clip-wrap-text-label": "Tekstbryting i utklipp",
|
||||
"settings-clipboard-history-description": "Sjå ting som var kopiert tidlegare i programveljaren.",
|
||||
"settings-clipboard-history-label": "Slå på utklippsboka",
|
||||
"settings-clipboard-watch-image-description": "Heile kommandostreng send til wl-paste for bileteendringar. (krev omstart)",
|
||||
"settings-clipboard-watch-image-label": "Biletvaktskommando",
|
||||
"settings-clipboard-watch-text-description": "Heile kommandostreng send til wl-paste for tekstendringar. (krev omstart)",
|
||||
"settings-clipboard-watch-text-label": "Tekstvaktskommando",
|
||||
"settings-custom-launch-prefix-description": "Førefester kommandoar med eigendefinert programveljar (t.d. 'runapp' for systemd-integrering).",
|
||||
"settings-custom-launch-prefix-enabled-description": "Brukar eigendefinert førefeste for å starta applikasjonar heller enn standardmåten.",
|
||||
"settings-custom-launch-prefix-enabled-label": "Slå på eigendefinert startførefeste",
|
||||
"settings-custom-launch-prefix-label": "Eigendefinert startførefeste",
|
||||
"settings-desc": "Vel korleis programveljaren ser ut og kva det gjer.",
|
||||
"settings-enable-settings-search-description": "Viser innstillingar når ein leitar i programveljaren.",
|
||||
"settings-enable-settings-search-label": "Søk i innstillingar",
|
||||
"settings-enable-windows-search-description": "Søk og fokuser aktive vindauge.",
|
||||
"settings-enable-windows-search-label": "Aktiver vindaugssøk",
|
||||
"settings-grid-view-description": "Viser utfall i rutenett heller enn som liste.",
|
||||
"settings-icon-mode-description": "Brukar heimlege systemikon heller enn Tabler-ikon.",
|
||||
"settings-icon-mode-label": "Bruk heimlege ikon",
|
||||
"settings-ignore-mouse-input-description": "Slå av musekontakt og rullehjul i programveljaren.",
|
||||
"settings-ignore-mouse-input-label": "Ikkje vyrd musekontakt",
|
||||
"settings-position-description": "Vel kvar programveljarpanelet opnar seg.",
|
||||
"settings-show-categories-description": "Viser kategorifanar for å granska applikasjonar",
|
||||
"settings-show-categories-label": "Vis kategori",
|
||||
"settings-show-icon-background-description": "Viser ein avrunda firkant som bakgrunn bak ikon.",
|
||||
"settings-show-icon-background-label": "Vis ikonbakgrunn",
|
||||
"settings-sort-by-usage-description": "Når dette er på, står dei appane du brukar mest fyrst på lista.",
|
||||
"settings-sort-by-usage-label": "Sortera ved bruk",
|
||||
"settings-terminal-command-description": "Kommando som køyrer frå terminal. T.d. 'kitty -e' eller 'gnome-terminal --'.",
|
||||
"settings-terminal-command-label": "Terminalkommando",
|
||||
"settings-use-app2unit-description": "Brukar annan oppstartsmåte for å betre kunna ordna app-prosessar og for å hindra feil.",
|
||||
"settings-use-app2unit-label": "Bruk App2Unit for å køyra applikasjonar",
|
||||
"title": "Programveljar"
|
||||
},
|
||||
"location": {
|
||||
"date-time-first-day-of-week-automatic": "Automatisk (bruk systemlokal)",
|
||||
"location-desc": "Få vêr og natteljosplanleggjing ved å segja kvar du er.",
|
||||
"weather-desc": "Vel temperatureininga du vil sjå.",
|
||||
"weather-enabled-description": "Vis vêrdata gjennom grensesnittet og henta vêrdata. Når dette er avslege, gøymer alle vêrobjekt seg og Noctalia skal ikkje spørja etter dei på nettverket.",
|
||||
"weather-enabled-label": "Slå på vêr",
|
||||
"weather-fahrenheit-description": "Vis temperatur i Fahrenheit heller enn Celsius.",
|
||||
"weather-fahrenheit-label": "Vis temperatur i Fahrenheit (°F)",
|
||||
"weather-hide-city-description": "Gøym bynamnet på vêrvisningar gjennom grensesnittet.",
|
||||
"weather-hide-city-label": "Gøym bynamn",
|
||||
"weather-hide-timezone-description": "Gøym tidssone på vêrvisningar gjennom grensesnittet.",
|
||||
"weather-hide-timezone-label": "Gøym tidssone",
|
||||
"weather-show-effects-description": "Vis fleire synlege effektar (som regn, snø, lyn) på vêrkortet.",
|
||||
"weather-show-effects-label": "Vis vêreffektar",
|
||||
"weather-show-in-calendar-description": "Vis det daglege vêrvarselet rett i kalenderen.",
|
||||
"weather-show-in-calendar-label": "Vis vêr i kalenderen"
|
||||
},
|
||||
"lock-screen": {
|
||||
"allow-password-with-fprintd-description": "Når fprintd (fingeravtrykkautentisering) er aktiv, lar dette alternativet deg framleis logge inn med passordet ditt i staden for eit fingeravtrykk.",
|
||||
"allow-password-with-fprintd-label": "Tillat passordpålogging med fprintd",
|
||||
"auto-start-auth-description": "t.d. startar automatisk fingeravtrykksautentisering utan å krevje eit tastetrykk eller eit knappetrykk.",
|
||||
"auto-start-auth-label": "Autostart autentisering"
|
||||
"auto-start-auth-label": "Autostart autentisering",
|
||||
"compact-lockscreen-description": "Viser berre inndata for å logga inn og systemkontrollar, gøymer miniprogramma for vêr og media.",
|
||||
"compact-lockscreen-label": "Endefram låseskjerm",
|
||||
"lock-on-suspend-description": "Låser skjermen automatisk når ein suspenderer systemet.",
|
||||
"lock-on-suspend-label": "Lås på suspendering",
|
||||
"show-hibernate-description": "Viser 'Set i full dvale' i straumkontrollane.",
|
||||
"show-hibernate-label": "Vis full dvale",
|
||||
"show-session-buttons-description": "Tillèt at ein kann bruka straumkontrollane frå låseskjermen.",
|
||||
"show-session-buttons-label": "Straumkontrollar",
|
||||
"title": "Låseskjerm"
|
||||
},
|
||||
"network": {
|
||||
"wifi-description": "Styr trådlause nettverk (krev NetworkManager)."
|
||||
},
|
||||
"notifications": {
|
||||
"media-toast-description": "Viser skjermvarsel når det er ei endring i mediaavspelingsstatus.",
|
||||
"media-toast-label": "Media",
|
||||
"sounds-excluded-apps-description": "Ikkje spel av varselljoden for visse applikasjonar som har eigne ljodar.",
|
||||
"toast-desc": "Vel varseloppførsel og utsjånad.",
|
||||
"toast-keyboard-description": "Viser skjermvarsel når knappefjøloppsett er endra.",
|
||||
"toast-keyboard-label": "Knappefjøloppsett"
|
||||
},
|
||||
"session-menu": {
|
||||
"countdown-duration-description": "Fastset kor lenge nedteljinga varar før straumhandlingar køyrer.",
|
||||
"countdown-duration-label": "Nedteljing",
|
||||
"enable-countdown-description": "Viser nedteljing før straumhandlingar køyrer.",
|
||||
"enable-countdown-label": "Slå på nedteljing",
|
||||
"entries-desc": "Vel kva for straumhandlingar står i øktsmenyen og rekkjefylgja dei står i.",
|
||||
"entries-title": "Straumhandlingar",
|
||||
"entry-settings-command-description": "Eigendefinert kommando som køyrer med denne handlinga. Haldt tom for å bruka systemstandarden.",
|
||||
"entry-settings-command-placeholder": "t.d. systemctl poweroff",
|
||||
"entry-settings-default-command-lock": "Intern låseskjerm (ingen kommando)",
|
||||
"entry-settings-default-command-logout": "Intern utlogging (ingen kommando)",
|
||||
"entry-settings-default-info-description": "Dersom du ikkje ha definert ein kommando, køyrer systemstandarden.",
|
||||
"entry-settings-default-info-label": "Standardkommando",
|
||||
"entry-settings-title": "Set opp {entry}",
|
||||
"entry-settings-tooltip": "Set opp kommando",
|
||||
"general-desc": "Set opp korleis øktsmenyen ser ut og kva det gjer.",
|
||||
"large-buttons-layout-description": "Vel korleis knappar viser seg på øktsmenyen.",
|
||||
"large-buttons-layout-label": "Oppsett med store knappar",
|
||||
"large-buttons-style-description": "Viser øktsmenyen med store knappar i rutenett.",
|
||||
"large-buttons-style-label": "Stil med store knappar",
|
||||
"position-description": "Vel kvar øktsmenyen opnar seg på skjermen når du opnar han.",
|
||||
"show-header-description": "Viser tittel og stengeknapp øvst på øktsmenyen.",
|
||||
"show-header-label": "Vis topptekst",
|
||||
"show-number-labels-description": "Viser taletikettar (1-2-3-4...) på knappar og slår på talsnarvegar for å velja fort.",
|
||||
"show-number-labels-label": "Vis taletikettar"
|
||||
},
|
||||
"system-monitor": {
|
||||
"critical-color-label": "Kritisk farge",
|
||||
"custom-highlight-colors-title-label": "Eigendefinerte uthevingsfargar",
|
||||
"disk-section-label": "Diskbruk",
|
||||
"enable-dgpu-monitoring-description": "Åtvaring: Dette vekkjer det diskrete skjermkortet ditt (NVIDIA/AMD), som kan ha stor påverknad på batterilivet på berande datamaskiner med hypridgrafikk.",
|
||||
"enable-dgpu-monitoring-label": "Slå på vakt for diskret skjermkort",
|
||||
"external-monitor-description": "Skriv inn kommandoen eller applikasjonbanen som køyrer når du slår på eksterne systemvaktapplikasjonar",
|
||||
"external-monitor-label": "Ekstern systemvaktkommando",
|
||||
"external-monitor-placeholder": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor",
|
||||
"general-desc": "Set opp korleis systemvakta ser ut og oppfører seg.",
|
||||
"gpu-section-label": "Skjermkorttemperatur",
|
||||
"highlight-colors-section-label": "Uthevingsfargar",
|
||||
"polling-interval-label": "Spørjingsintervall",
|
||||
"polling-section-description": "Set opp kor ofte kvart systemmål vert oppdatert",
|
||||
"polling-section-label": "Spørjingsintervall",
|
||||
"threshold-critical": "Kritisk terskel",
|
||||
"threshold-warning": "Åtvaringsterskel",
|
||||
"thresholds-section-description": "Endra åtvarings-/kritiske tersklar for kvart systemmål.",
|
||||
"use-custom-highlight-colors-description": "Når dette er avslege, brukar systemvakta uthevingsfargen frå temaet.",
|
||||
"use-custom-highlight-colors-label": "Bruk eigendefinerte uthevingsfargar",
|
||||
"warning-color-label": "Åtvaringsfarge"
|
||||
},
|
||||
"user-interface": {
|
||||
"appearance-desc": "Måta til synlege objekt som hjelpetekst, grenser og skuggar.",
|
||||
"panel-background-opacity-description": "Set kor ugjennomsynleg bakgrunnen er for alle panel (oppgåvelina, programveljar, innstillingar osb.).",
|
||||
"tooltips-description": "Slå på eller av hjelpetekst gjennom brukargrensesnittet",
|
||||
"tooltips-label": "Vis hjelpetekst"
|
||||
},
|
||||
"wallpaper": {
|
||||
"automation-change-mode-alphabetical": "Alfabetisk",
|
||||
"automation-change-mode-description": "Vel korleis Noctalia vel bakgrunnsbilete når dei endrar automatisk.",
|
||||
"automation-change-mode-label": "Endringsmodus",
|
||||
"automation-custom-interval-description": "Skriv inn tid som TT:MM (t.d. 01:30).",
|
||||
"automation-custom-interval-label": "Eigendefinert tidsrom",
|
||||
"automation-interval-description": "Kor ofte bakgrunnsbiletet endrar seg automatisk.",
|
||||
"automation-interval-label": "Endringstidsrom",
|
||||
"automation-random-wallpaper-description": "Planlegg tilfellelege endringar på bakgrunnsbilete jamleg.",
|
||||
"automation-scheduled-change-description": "Endrar bakgrunnsbilete automatisk og jamleg.",
|
||||
"automation-scheduled-change-label": "Planlagd endring",
|
||||
"look-feel-edge-smoothness-description": "Når biletet endrar seg får rendene ein mjuk, fjørvoren effekt.",
|
||||
"look-feel-edge-smoothness-label": "Mykna endringsrand",
|
||||
"look-feel-fill-color-description": "Vel fyllfarge som kan visast bak bakgrunnsbiletet.",
|
||||
"look-feel-fill-mode-description": "Vel korleis biletet skal skalerast for å høva skjermoppløysinga di.",
|
||||
"look-feel-fill-mode-label": "Fyllmodus",
|
||||
"look-feel-title": "Utsjånad",
|
||||
"look-feel-transition-duration-description": "Kor lenge endringsanimasjonane tek i sekund.",
|
||||
"look-feel-transition-duration-label": "Endringstid",
|
||||
"look-feel-transition-type-description": "Animasjonstype når bakgrunnsbiletet endrar seg.",
|
||||
"look-feel-transition-type-label": "Endringstype",
|
||||
"settings-desc": "Styr korleis bakgrunnsbiletet vert handsama og viste.",
|
||||
"settings-enable-management-description": "Styr bakgrunnsbilete med Noctalia. Slå av dersom du vil heller bruka eit anna program.",
|
||||
"settings-enable-management-label": "Slå på bakgrunnshandsaming",
|
||||
"settings-enable-overview-description": "Gjev oversynsskjermen eit uskarpt og dempa bakgrunnsbilete.",
|
||||
"settings-enable-overview-label": "Slå på oversynsbilete",
|
||||
"settings-folder-description": "Filbane til mappa der du har bakgrunnsbileta dine.",
|
||||
"settings-folder-label": "Bakgrunnsbiletemappe",
|
||||
"settings-hide-wallpaper-filenames-tooltip-hide": "Gøym filnamn",
|
||||
"settings-hide-wallpaper-filenames-tooltip-show": "Vis filnamn",
|
||||
"settings-monitor-specific-description": "Fastset ulike biletemapper for kvar skjerm.",
|
||||
"settings-monitor-specific-label": "Skjermvise mapper",
|
||||
"settings-monitor-specific-tooltip": "Vakta bakgrunnsbiletemappa",
|
||||
"settings-recursive-search-description": "Leit etter bakgrunnsbilete i underordna mapper i biletemappa òg.",
|
||||
"settings-recursive-search-label": "Leit i underordna mapper",
|
||||
"settings-select-monitor-folder": "Vel bakgrunnsbiletemappe for skjerm",
|
||||
"settings-selector-description": "Vel bakgrunnsbilete.",
|
||||
"settings-selector-position-description": "Vel kvar bileteveljarpanelet skal visast.",
|
||||
"settings-show-hidden-files-tooltip-hide": "Gøym gøymde filer",
|
||||
"settings-show-hidden-files-tooltip-show": "Vis gøymde filer",
|
||||
"settings-title": "Innstillingar for bakgrunnsbilete",
|
||||
"settings-view-mode-description": "Vel korleis bakgrunnsbilete skal visast frå mappa di.",
|
||||
"settings-view-mode-label": "Visningsmodus",
|
||||
"view-mode-browse": "Søk i mapper",
|
||||
"view-mode-cycle-tooltip": "Visningsmodus: {mode} (klikk for å endra)",
|
||||
"view-mode-recursive": "Flate undermapper",
|
||||
"view-mode-single": "Rotmappe"
|
||||
}
|
||||
},
|
||||
"placeholders": {
|
||||
"command-example": "echo \"Hei, verd\"",
|
||||
"enter-command": "Skriv inn kommando som skal køyra (app eller eigendefinert skript)",
|
||||
"enter-ipc-identifier": "Skriv inn unik identifikator for IPC kommandoar",
|
||||
"enter-path": "Skriv inn filbane...",
|
||||
"enter-text-to-collapse": "t.d. 'ingenting spelar av. Bruk /regex/ til mønster.",
|
||||
"enter-tooltip": "Skriv inn hjelpetekst",
|
||||
"enter-width-pixels": "Skriv inn breidde i piksel",
|
||||
"search": "Søk...",
|
||||
"search-icons": "t.d. noctalia, niri, battery, cloud",
|
||||
"search-launcher": "Søk i treff... eller bruk > for kommandoar",
|
||||
"search-wallhaven": "Leit på Wallhaven...",
|
||||
"search-wallpapers": "Skriv for å filtrera bakgrunnsbilete..."
|
||||
},
|
||||
"positions": {
|
||||
"bottom": "Nedst",
|
||||
"bottom-center": "Nede i midten",
|
||||
"bottom-left": "Nede til venstre",
|
||||
"bottom-right": "Nede til høgre",
|
||||
"center": "I midten",
|
||||
"center-left": "I midten til venstre",
|
||||
"center-right": "I midten til høgre",
|
||||
"close-to-bar": "Attmed lineknappen",
|
||||
"follow-bar": "Fylg oppgåvelina",
|
||||
"left": "Venstre",
|
||||
"right": "Høgre",
|
||||
"top": "Øvst",
|
||||
"top-center": "Øvst i midten",
|
||||
"top-left": "Øvst til venstre",
|
||||
"top-right": "Øvst til høgre"
|
||||
},
|
||||
"session-menu": {
|
||||
"action-in-seconds": "{action} i {seconds} sekund...",
|
||||
"cancel-timer": "Avbryt nedteljing",
|
||||
"title": "Øktsmeny"
|
||||
},
|
||||
"setup": {
|
||||
"all-done": "Ferdig!",
|
||||
"appearance": {
|
||||
"subheader": "Vel Mørkmodus og fargekjelder (Bakgrunnsbilete eller eigendefinert)."
|
||||
},
|
||||
"customize": {
|
||||
"header": "Skreddersy opplevinga di",
|
||||
"subheader": "Endra kvar oppgåvelina er, tettleik, skalering og meir."
|
||||
},
|
||||
"skip-setup": "Hopp over oppsett",
|
||||
"telemetry-wizard-done": "Skjønar!",
|
||||
"telemetry-wizard-note": "Du har kontroll - slå dette av eller på når som helst i Innstillingar",
|
||||
"telemetry-wizard-subtitle": "Vi har lagt til anonyme analytikk for å hjelpa gjera Noctalia betre.",
|
||||
"telemetry-wizard-title": "Oppdatering om personvern",
|
||||
"wallpaper": {
|
||||
"choose-dir": "Vel ei mappe som har bakgrunnsbileta dine i seg",
|
||||
"dir-browse": "Søk etter bakgrunnsmappe",
|
||||
"dir-description": "Vel mappa som har bakgrunnsbileta dine i seg.",
|
||||
"dir-label": "Bakgrunnsmappe",
|
||||
"dir-select-title": "Vel bakgrunnsmappe",
|
||||
"header": "Vel bakgrunnsbiletet ditt",
|
||||
"no-dir": "Inga bakgrunnsmappe vald",
|
||||
"no-valid": "Fann ikkje gilde biletefiler i: {dir}",
|
||||
"none-in-dir": "Fann ikkje bakgrunnsbilete i mappa",
|
||||
"preview-error": "Kunne ikkje lasta inn biletet",
|
||||
"select-prompt": "Vel bakgrunnsbilete under",
|
||||
"subheader": "Måta til stemninga med eit fagert bakgrunnsbilete."
|
||||
},
|
||||
"welcome-note": "Berre nokre lette ting for å få deg opp og gåande - alle vala finn du i innstillingane.",
|
||||
"welcome-subtitle": "Lat oss gjera skrivebordet ditt",
|
||||
"welcome-title": "Velkomen åt Noctalia!"
|
||||
},
|
||||
"system": {
|
||||
"cpu-temperature": "{temp} °C",
|
||||
"disk-usage": "{percent} %",
|
||||
"location-display": "{name} ({coordinates})",
|
||||
"monitor-description": "{model} ({width}x{height} @ {scale}x)",
|
||||
"no-media-player-detected": "Ingen mediaavspelar funnen",
|
||||
"scaling-percentage": "{percentage} %",
|
||||
"signal-strength": "{signal} %",
|
||||
"unknown-app": "Ukjend app",
|
||||
"uptime": "Oppetid: {uptime}",
|
||||
"user-requested": "Brukaretterspurd",
|
||||
"welcome-back": "Velkomen attende,",
|
||||
"widget-settings-title": "{widget}innstillingar"
|
||||
},
|
||||
"system-monitor": {
|
||||
"cpu-temp": "Prosessortemperatur",
|
||||
"cpu-usage": "Prosessorbruk",
|
||||
"disk": "Disk",
|
||||
"download-speed": "Nedlastingsfart",
|
||||
"gpu-temp": "Skjermkorttemperatur",
|
||||
"load-average": "Lastingssnitt",
|
||||
"title": "Systemvakt",
|
||||
"upload-speed": "Opplastingsfart"
|
||||
},
|
||||
"toast": {
|
||||
"donation-opened": "Donasjonsside opna i nettlesaren din"
|
||||
"airplane-mode": {
|
||||
"title": "Flymodus"
|
||||
},
|
||||
"battery": {
|
||||
"low": "Lågt batteri",
|
||||
"low-desc": "Batterinivået er {percent} %. Du bør kopla til ladaren."
|
||||
},
|
||||
"bluetooth": {
|
||||
"address-copied": "Adresse kopiert til utklippstavla",
|
||||
"confirm-code": "Stadfest koden {value} på hi eininga.",
|
||||
"connect-failed": "Mislukka tilkopling",
|
||||
"disconnect-failed": "Mislukka fråkopling",
|
||||
"discoverable-change-failed": "Kunne ikkje endra oppdagingstilstand",
|
||||
"discoverable-disabled": "Ikkje finnande",
|
||||
"discoverable-enabled": "Finnande",
|
||||
"display-code": "Skriv inn koden {value} på hi eininga.",
|
||||
"forget-failed": "Kunne ikkje gløyma eininga",
|
||||
"pair-failed": "Kunne ikkje kopla til eininga",
|
||||
"passkey-required": "Eininga krev passord.",
|
||||
"pincode-required": "Eininga krev PIN-kode.",
|
||||
"state-change-failed": "Kunne ikkje endra Bluetoothstatus"
|
||||
},
|
||||
"clipboard": {
|
||||
"long-text": "Lang tekst",
|
||||
"unavailable": "Utklippsboka ikkje tilgjengeleg",
|
||||
"unavailable-desc": "'cliphist' er ikkje installert. Du må installera han for å kunne bruka utklippsboka."
|
||||
},
|
||||
"do-not-disturb": {
|
||||
"disabled": "\"Ikkje forstyrr\" av",
|
||||
"disabled-desc": "Viser alle varsel",
|
||||
"enabled": "\"Ikkje forstyrr\" på",
|
||||
"enabled-desc": "Du finn desse varsla i historikken din"
|
||||
},
|
||||
"donation-opened": "Donasjonsside opna i nettlesaren din",
|
||||
"internet-limited": "Kopla til utan internett",
|
||||
"keyboard-layout": {
|
||||
"changed": "Oppsett endra til {layout}",
|
||||
"title": "Knappefjøl"
|
||||
},
|
||||
"missing-control-center": {
|
||||
"description": "Miniprogrammet for kontrollsenteret er ikkje lenger på oppgåvelina. For å få tilgang frå oppgåvelina, må du leggja det til att. Du kan opna det ved å høgreklikka på oppgåvelina òg.",
|
||||
"label": "Siste miniprogram for kontrollsenter sletta"
|
||||
},
|
||||
"night-light": {
|
||||
"forced": "Tvinga aktivering",
|
||||
"normal": "Vanleg modus",
|
||||
"not-installed": "wlsunset ikkje installert"
|
||||
},
|
||||
"noctalia-performance": {
|
||||
"disabled": "Ytingsmodus av",
|
||||
"enabled": "Ytingsmodus på",
|
||||
"label": "Noctalia Yting"
|
||||
},
|
||||
"power-profile": {
|
||||
"changed": "Straumprofil endra",
|
||||
"profile-name": "{profile}"
|
||||
},
|
||||
"theming-processor-failed": {
|
||||
"desc-generic": "Noctalia støytte på ein feil medan det handsama malar",
|
||||
"title": "Malhandsaming mislukka"
|
||||
},
|
||||
"vpn": {
|
||||
"connected": "Kopla til '{name}'",
|
||||
"disconnected": "Kopla frå '{name}'"
|
||||
},
|
||||
"wallpaper-colors": {
|
||||
"disabled": "Bakgrunnsfargar av",
|
||||
"enabled": "Bakgrunnsfargar på",
|
||||
"label": "Bakgrunnsfargar"
|
||||
},
|
||||
"wifi": {
|
||||
"connected": "Kopla til '{ssid}'",
|
||||
"connection-failed": "Kopling mislukka",
|
||||
"connection-timeout": "Tidsavbrot med kopling",
|
||||
"disconnected": "Kopla frå '{ssid}'",
|
||||
"incorrect-password": "Gale passord",
|
||||
"network-not-found": "Nettverk ikkje funne"
|
||||
}
|
||||
},
|
||||
"tooltips": {
|
||||
"add-widget": "Legg til miniprogram",
|
||||
"bluetooth-devices": "Bluetooth-einingar",
|
||||
"brightness-at": "Ljosstyrke: {brightness} %",
|
||||
"click-to-start-recording": "Skjermopptak (start opptak)",
|
||||
"click-to-stop-recording": "Skjermopptak (stogg opptak)",
|
||||
"collapse": "Gøym sidestolpen",
|
||||
"copy-address": "Kopier adresse",
|
||||
"delete-notification": "Slett varsel",
|
||||
"do-not-disturb-enabled": "Ikkje forstyrr",
|
||||
"expand": "Brett ut sidestolpen",
|
||||
"forget-network": "Gløym nettverk",
|
||||
"grid-view": "Rutenett",
|
||||
"hidden-files-hide": "Gøymde filer",
|
||||
"hide-unnamed-devices": "Gøym einingar utan namn",
|
||||
"home": "Heimemappe",
|
||||
"input-muted": "Slå av/på ljod i inngang",
|
||||
"keep-awake": "Haldt vaken",
|
||||
"keyboard-layout": "{layout} knappefjøloppsett",
|
||||
"list-view": "Liste",
|
||||
"manage-vpn": "VPN-tilkoplingar",
|
||||
"manage-wifi": "Wi-Fi",
|
||||
"max-widgets-reached": "Øvre grense på miniprogramm nådd",
|
||||
"microphone-volume-at": "Ljodstyrke på mikrofon: {volume} %",
|
||||
"move-to-section": "Flytt til {section}",
|
||||
"mute": "Slå av ljod",
|
||||
"next-media": "Neste song",
|
||||
"next-month": "Neste månad",
|
||||
"night-light-not-installed": "Natteljos (ikkje tilgjengeleg)",
|
||||
"noctalia-performance-enabled": "Noctalia Ytingsmodus",
|
||||
"open-annotation-tool": "Opna med merknadsverktøyet",
|
||||
"open-control-center": "Kontrollsenter",
|
||||
"open-notification-history-enable-dnd": "Varselhistorikk",
|
||||
"open-settings": "Innstillingar",
|
||||
"open-tray-dropdown": "Systemkorg",
|
||||
"output-muted": "Slå av/på ljod i utgang",
|
||||
"power-profile": "{profile} straumprofil",
|
||||
"previous-media": "Førre song",
|
||||
"previous-month": "Førre månad",
|
||||
"refresh-devices": "Last inn einingar å nyo",
|
||||
"refresh-wallhaven": "Last inn Wallhaven-utfall å nyo",
|
||||
"refresh-wallpaper-list": "Last inn bakgrunnslista å nyo",
|
||||
"remove-widget": "Slett miniprogram",
|
||||
"search-close": "Steng søk",
|
||||
"session-menu": "Øktsmeny",
|
||||
"show-all-devices": "Vis alle einingar",
|
||||
"switch-to-dark-mode": "Mørkmodus",
|
||||
"switch-to-light-mode": "Ljosmodus",
|
||||
"unmute": "Slå på ljod",
|
||||
"up": "Overordna mappe",
|
||||
"volume-at": "Ljod i utgang: {volume} %",
|
||||
"wallpaper-selector": "Bakgrunnsveljar"
|
||||
},
|
||||
"wallpaper": {
|
||||
"browse": {
|
||||
"empty-directory": "Denne mappa er tom.",
|
||||
"go-root": "Gå til bakgrunnsbileterota",
|
||||
"go-up": "Gå til overordna mappe",
|
||||
"go-up-hint": "Bruk \"attende\"-knappen for å gå opp eitt nivå."
|
||||
},
|
||||
"configure-directory": "Styr bakgrunnsbiletemappa med bilete.",
|
||||
"fill-modes": {
|
||||
"crop": "Skjer av (Fyll)",
|
||||
"fit": "Måta til (Haldt)",
|
||||
"repeat": "Tak opp att (Flislegg)",
|
||||
"stretch": "Tøyg"
|
||||
},
|
||||
"no-match": "Ingen treff.",
|
||||
"no-wallpaper": "Ingen bakgrunnsbilete funne.",
|
||||
"panel": {
|
||||
"apikey-help": "Ein API-lykel krevst for å få tilgang til NSFW-innhald",
|
||||
"apikey-label": "API-lykel",
|
||||
"apikey-managed-by-env": "Styrt med NOCTALIA_WALLHAVEN_API_KEY miljøvariabel.",
|
||||
"apikey-placeholder": "Skriv inn API-lyklen din for Wallhaven",
|
||||
"apply-all-monitors-description": "Gjev det valde bakgrunnsbiletet til alle skjermar.",
|
||||
"apply-all-monitors-label": "Gjev til alle skjermar.",
|
||||
"categories-anime": "Anime",
|
||||
"categories-label": "Kategoriar",
|
||||
"categories-people": "Folk",
|
||||
"order-asc": "Oppover",
|
||||
"order-desc": "Nedover",
|
||||
"order-label": "Rekkjefylgd",
|
||||
"purity-label": "Innhaldsfilter",
|
||||
"purity-nsfw": "NSFW",
|
||||
"purity-sfw": "SFW",
|
||||
"purity-sketchy": "På randa",
|
||||
"ratios-all-portrait": "Alle ståande",
|
||||
"ratios-all-wide": "Alle breide",
|
||||
"ratios-any": "Kva som helst",
|
||||
"ratios-label": "Sidetilhøve",
|
||||
"resolution-atleast": "I minsto",
|
||||
"resolution-exact": "Nøye",
|
||||
"resolution-label": "Oppløysing",
|
||||
"resolution-mode-label": "Modus",
|
||||
"solid-color-tooltip": "Einsfarga bakgrunn",
|
||||
"sorting-date-added": "Dato lagt til",
|
||||
"sorting-favorites": "Favorittar",
|
||||
"sorting-label": "Sorter ved",
|
||||
"sorting-relevance": "Relevans",
|
||||
"sorting-toplist": "Toppliste",
|
||||
"sorting-views": "Visningar",
|
||||
"source-label": "Kjelde",
|
||||
"source-wallhaven": "Wallhaven",
|
||||
"title": "Wallhaven-veljar",
|
||||
"wallhaven-settings-title": "Wallhaven-innstillingar"
|
||||
},
|
||||
"transitions": {
|
||||
"disc": "Disk",
|
||||
"fade": "Bleikna",
|
||||
"stripes": "Striper",
|
||||
"wipe": "Viska"
|
||||
},
|
||||
"try-different-search": "Prøv å søkja noko anna.",
|
||||
"wallhaven": {
|
||||
"loading": "Lastar inn bakgrunnsbilete...",
|
||||
"no-results": "Fann ingen bakgrunnsbilete. Prøv å søkja noko anna.",
|
||||
"page": "{current} av {total}"
|
||||
}
|
||||
},
|
||||
"weather": {
|
||||
"clear-sky": "Klår himmel",
|
||||
"drizzle": "Yr",
|
||||
"fog": "Skodde",
|
||||
"mainly-clear": "For det meste klår",
|
||||
"overcast": "Skyete",
|
||||
"partly-cloudy": "Nokre fåe skyer",
|
||||
"rain-showers": "Regnskurer",
|
||||
"snow": "Snø",
|
||||
"thunderstorm": "Storm"
|
||||
},
|
||||
"widgets": {
|
||||
"color-picker": {
|
||||
"palette-description": "Vel frå mange ulike fargar.",
|
||||
"palette-label": "Palett",
|
||||
"palette-theme-colors": "Kjapp tilgang til fargeskalaen for temaet ditt.",
|
||||
"title": "Fargeveljar"
|
||||
},
|
||||
"datetime-tokens": {
|
||||
"ampm-lowercase": "am/pm med småe bokstavar",
|
||||
"ampm-uppercase": "AM/PM med store bokstavar",
|
||||
"common-12hour-time-minutes": "Tid i 12-timar med minutt",
|
||||
"common-24hour-time-minutes": "Tid i 24-timar med minutt",
|
||||
"common-24hour-time-seconds": "Tid i 24-timar med sekund",
|
||||
@@ -739,7 +1333,73 @@
|
||||
"common-iso-date": "ISO datoformat",
|
||||
"common-us-date": "Amerikansk datoformat",
|
||||
"common-weekday-date": "Vekedag med dato",
|
||||
"common-weekday-month-day": "Vekedag, månad og dag"
|
||||
"common-weekday-month-day": "Vekedag, månad og dag",
|
||||
"day-abbreviated": "Forkorta dagsnamn",
|
||||
"day-full": "Fullt dagsnamn",
|
||||
"day-leading-zero": "Dag med null føre (01-31)",
|
||||
"day-no-leading-zero": "Dag utan null føre (1-31)",
|
||||
"hour-leading-zero": "Time med null føre (00-23) — 24t-format",
|
||||
"hour-no-leading-zero": "Time utan null føre (0-23) — 24t-format",
|
||||
"minute-leading-zero": "Minutt med null føre (00-59)",
|
||||
"minute-no-leading-zero": "Minutt utan null føre (0-59)",
|
||||
"month-abbreviated": "Forkorta månadsnamn",
|
||||
"month-full": "Fullt månadsnamn",
|
||||
"month-number-leading-zero": "Månad som tal med null føre (01-12)",
|
||||
"month-number-no-zero": "Månad som tal utan null føre (1-12)",
|
||||
"second-leading-zero": "Sekund med null føre (00-59)",
|
||||
"second-no-leading-zero": "Sekund utan null føre (0-59)",
|
||||
"timezone-abbreviation": "Forkorta tidssone",
|
||||
"year-four-digit": "År som tal med fire siffer",
|
||||
"year-two-digit": "År som tal med to siffer (00-99)"
|
||||
},
|
||||
"file-picker": {
|
||||
"item": "objekt",
|
||||
"items": "objekt",
|
||||
"search-placeholder": "Leita i filer og mapper...",
|
||||
"select-current": "Vel noverande",
|
||||
"select-file": "Vel fil",
|
||||
"select-folder": "Vel mappe",
|
||||
"selected": "Valt:",
|
||||
"title": "Filveljar"
|
||||
},
|
||||
"file-picker-title": "Vel ei fil",
|
||||
"icon-picker": {
|
||||
"title": "Ikonveljar"
|
||||
},
|
||||
"tooltip-placeholder": "Plasshaldar"
|
||||
},
|
||||
"wifi": {
|
||||
"panel": {
|
||||
"action-required": "Krev handling",
|
||||
"available-interfaces": "Tilgjengelege grensesnitt",
|
||||
"available-networks": "Tilgjengelege nettverk",
|
||||
"disabled": "Wi-Fi er slege av",
|
||||
"disconnecting": "Koplar frå...",
|
||||
"dns": "DNS",
|
||||
"enable-message": "Slå på Wi-Fi for å sjå tilgjengelege nettverk.",
|
||||
"enter-password": "Skriv inn Wi-Fi-passord...",
|
||||
"forget": "Gløym",
|
||||
"forget-network": "Gløym dette nettverket",
|
||||
"forgetting": "Gløymer...",
|
||||
"interface": "Nettverkgrensesnitt",
|
||||
"internet-connected": "Kopla til internettet",
|
||||
"internet-limited": "Ikkje kopla til internettet",
|
||||
"internet-status": "Internettstatus",
|
||||
"ipv4": "IPv4",
|
||||
"known-networks": "Kjende nettverk",
|
||||
"link-speed": "Lenkjefart",
|
||||
"no-ethernet-devices": "Ingen etherneteiningar funne",
|
||||
"no-networks": "Ingen Wi-Fi-nettverk funne",
|
||||
"saved": "Lagra",
|
||||
"scan-again": "Leit atter",
|
||||
"searching": "Søkjer etter nettverk...",
|
||||
"title": "Wi-Fi"
|
||||
},
|
||||
"signal": {
|
||||
"excellent": "Framifrå",
|
||||
"fair": "Grei",
|
||||
"good": "God",
|
||||
"poor": "Dåleg"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Tydzień",
|
||||
"widgets": "Widżety",
|
||||
"width": "Szerokość",
|
||||
"windows": "Okna",
|
||||
"yes": "Tak"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Po najechaniu kursorem"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Automatyczne ukrywanie",
|
||||
"hidden": "Ukryj, gdy puste",
|
||||
"idle": "Ukryj, gdy bezczynny",
|
||||
"transparent": "Przezroczysty, gdy pusty",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Ładowanie emoji...",
|
||||
"emoji-loading-description": "Proszę czekać",
|
||||
"emoji-no-recent": "Brak ostatnich emoji",
|
||||
"emoji-search-description": "Szukaj i kopiuj emoji"
|
||||
"emoji-search-description": "Szukaj i kopiuj emoji",
|
||||
"settings-search-description": "Szukaj i przejdź do ustawień",
|
||||
"windows-search-description": "Wyszukaj i aktywuj otwarte okna"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Domyślny",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Przestronny",
|
||||
"display-mode-always-visible": "Zawsze widoczne",
|
||||
"type-floating": "Pływający",
|
||||
"type-framed": "Obramowany",
|
||||
"type-simple": "Prosty"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Zezwalaj na wzmocnienie głośności (overdrive)"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Czas, po którym Bar zniknie po opuszczeniu go przez mysz.",
|
||||
"appearance-auto-hide-delay-label": "Opóźnienie ukrywania",
|
||||
"appearance-auto-hide-exclusive-note": "Uwaga: Strefa wyłączna jest automatycznie wyłączana, gdy autoukrywanie jest aktywne.",
|
||||
"appearance-auto-show-delay-description": "Czas, zanim pasek pojawi się, gdy mysz wejdzie na krawędź.",
|
||||
"appearance-auto-show-delay-label": "Opóźnienie Wyświetlania",
|
||||
"appearance-background-opacity-description": "Ustaw przezroczystość tła konkretnie dla paska.",
|
||||
"appearance-background-opacity-label": "Krycie tła paska",
|
||||
"appearance-capsule-opacity-description": "Ustaw poziom przezroczystości tła widżetów, gdy kapsuła jest widoczna.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Dostosuj odstępy paska dla kompaktowego lub przestronnego wyglądu.",
|
||||
"appearance-density-label": "Zagęszczenie paska",
|
||||
"appearance-desc": "Dostosuj wygląd i pozycję paska.",
|
||||
"appearance-display-mode-description": "Wybierz, kiedy pasek jest widoczny",
|
||||
"appearance-display-mode-label": "Tryb Wyświetlania",
|
||||
"appearance-floating-description": "Wyświetl pasek jako pływającą 'pigułkę'.",
|
||||
"appearance-floating-label": "Pływający pasek",
|
||||
"appearance-frame-radius": "Promień wewnętrzny",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Pokaż przyciski",
|
||||
"media-player-show-visualizer-description": "Pokaż nakładkę wizualizatora audio.",
|
||||
"media-player-visualizer-type-description": "Wybierz typ wizualizacji dla tła odtwarzacza pulpitu.",
|
||||
"system-stat-layout-bottom": "Dół",
|
||||
"system-stat-layout-description": "Wybierz, jak legenda jest wyświetlana względem wykresu.",
|
||||
"system-stat-layout-label": "Układ",
|
||||
"system-stat-layout-side": "Strona",
|
||||
"system-stat-rounded-corners-description": "Użyj zaokrąglonych rogów dla tła widżetu.",
|
||||
"system-stat-rounded-corners-label": "Zaokrąglone Narożniki",
|
||||
"system-stat-show-background-description": "Pokaż kontener tła dla widżetu statystyk systemowych.",
|
||||
"system-stat-show-background-label": "Pokaż tło",
|
||||
"system-stat-stat-type-description": "Wybierz, którą statystykę systemową wyświetlić.",
|
||||
"system-stat-stat-type-label": "Typ Statystyki",
|
||||
"title": "Widżety pulpitu",
|
||||
"weather-enabled-description": "Pokaż widżet pogody na pulpicie.",
|
||||
"weather-enabled-label": "Włącz widżet pogody",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Dostosuj zachowanie i wygląd launchera.",
|
||||
"settings-enable-settings-search-description": "Wyświetlaj wyniki ustawień podczas wyszukiwania w Launcherze.",
|
||||
"settings-enable-settings-search-label": "Włącz wyszukiwanie w ustawieniach",
|
||||
"settings-enable-windows-search-description": "Wyszukaj i skup aktywne okna.",
|
||||
"settings-enable-windows-search-label": "Włącz wyszukiwanie okien",
|
||||
"settings-grid-view-description": "Wyświetlaj elementy w układzie siatki zamiast listy.",
|
||||
"settings-icon-mode-description": "Używaj natywnych ikon systemowych zamiast ikon Tabler.",
|
||||
"settings-icon-mode-label": "Używaj natywnych ikon",
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Semana",
|
||||
"widgets": "Widgets",
|
||||
"width": "Largura",
|
||||
"windows": "Janelas",
|
||||
"yes": "Sim"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Ao passar"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Ocultar automaticamente",
|
||||
"hidden": "Ocultar quando vazio",
|
||||
"idle": "Ocultar quando inativo",
|
||||
"transparent": "Transparente quando vazio",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Carregando emojis...",
|
||||
"emoji-loading-description": "Por favor, aguarde",
|
||||
"emoji-no-recent": "Ainda não há emojis recentes",
|
||||
"emoji-search-description": "Buscar e copiar emojis"
|
||||
"emoji-search-description": "Buscar e copiar emojis",
|
||||
"settings-search-description": "Pesquisar e navegar para as configurações",
|
||||
"windows-search-description": "Pesquisar e focar janelas abertas"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Padrão",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Espaçoso(a)",
|
||||
"display-mode-always-visible": "Sempre Visível",
|
||||
"type-floating": "Flutuante",
|
||||
"type-framed": "Emoldurada",
|
||||
"type-simple": "Simples"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Permitir volume acima de 100%"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Tempo até a Bar se ocultar depois que o rato a deixa.",
|
||||
"appearance-auto-hide-delay-label": "Atraso para Ocultar",
|
||||
"appearance-auto-hide-exclusive-note": "Nota: A zona exclusiva é automaticamente desativada quando o auto-ocultar está ativo.",
|
||||
"appearance-auto-show-delay-description": "Tempo até a barra aparecer quando o mouse entra na borda.",
|
||||
"appearance-auto-show-delay-label": "Atraso de Exibição",
|
||||
"appearance-background-opacity-description": "Defina a opacidade do fundo especificamente para a barra.",
|
||||
"appearance-background-opacity-label": "Opacidade do fundo da barra",
|
||||
"appearance-capsule-opacity-description": "Define o nível de opacidade para fundos dos widgets quando a cápsula é mostrada.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Ajuste o preenchimento da barra para um visual compacto ou espaçoso.",
|
||||
"appearance-density-label": "Densidade da barra",
|
||||
"appearance-desc": "Personalize a aparência e a posição da barra.",
|
||||
"appearance-display-mode-description": "Escolha quando a barra está visível",
|
||||
"appearance-display-mode-label": "Modo de Exibição",
|
||||
"appearance-floating-description": "Exibe a barra como uma 'pílula' flutuante.",
|
||||
"appearance-floating-label": "Barra flutuante",
|
||||
"appearance-frame-radius": "Raio Interno",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Mostrar botões",
|
||||
"media-player-show-visualizer-description": "Mostrar a sobreposição do visualizador de áudio.",
|
||||
"media-player-visualizer-type-description": "Escolha um tipo de visualização para o fundo do reprodutor de mídia na área de trabalho.",
|
||||
"system-stat-layout-bottom": "Inferior",
|
||||
"system-stat-layout-description": "Escolha como a legenda é exibida em relação ao gráfico.",
|
||||
"system-stat-layout-label": "Layout",
|
||||
"system-stat-layout-side": "Lado",
|
||||
"system-stat-rounded-corners-description": "Usar cantos arredondados para o fundo do widget.",
|
||||
"system-stat-rounded-corners-label": "Cantos Arredondados",
|
||||
"system-stat-show-background-description": "Mostrar o contêiner de fundo para o widget de estatísticas do sistema.",
|
||||
"system-stat-show-background-label": "Mostrar plano de fundo",
|
||||
"system-stat-stat-type-description": "Escolhe qual estatística do sistema exibir.",
|
||||
"system-stat-stat-type-label": "Tipo de Estatística",
|
||||
"title": "Widgets da área de trabalho",
|
||||
"weather-enabled-description": "Mostrar um widget de clima na área de trabalho.",
|
||||
"weather-enabled-label": "Ativar widget de clima",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Personalize o comportamento e a aparência do lançador.",
|
||||
"settings-enable-settings-search-description": "Mostrar os resultados das configurações ao pesquisar no Launcher.",
|
||||
"settings-enable-settings-search-label": "Ativar pesquisa nas configurações",
|
||||
"settings-enable-windows-search-description": "Pesquisar e focar janelas ativas.",
|
||||
"settings-enable-windows-search-label": "Ativar pesquisa de janelas",
|
||||
"settings-grid-view-description": "Exibir itens em uma grade em vez de uma lista.",
|
||||
"settings-icon-mode-description": "Use ícones nativos do sistema em vez de ícones Tabler.",
|
||||
"settings-icon-mode-label": "Usar ícones nativos",
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Неделя",
|
||||
"widgets": "Виджеты",
|
||||
"width": "Ширина",
|
||||
"windows": "Окна ",
|
||||
"yes": "Да"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "При наведении"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Автоматическое скрытие",
|
||||
"hidden": "Скрывать, когда пусто",
|
||||
"idle": "Скрывать в режиме простоя",
|
||||
"transparent": "Прозрачный, когда пустой",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Загрузка эмодзи...",
|
||||
"emoji-loading-description": "Пожалуйста, подождите",
|
||||
"emoji-no-recent": "Недавних эмодзи пока нет",
|
||||
"emoji-search-description": "Поиск и копирование эмодзи"
|
||||
"emoji-search-description": "Поиск и копирование эмодзи",
|
||||
"settings-search-description": "Поиск и переход к настройкам",
|
||||
"windows-search-description": "Поиск и фокусировка открытых окон"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "По умолчанию",
|
||||
"density-mini": "Мини",
|
||||
"density-spacious": "Просторный",
|
||||
"display-mode-always-visible": "Всегда видны",
|
||||
"type-floating": "Плавающий",
|
||||
"type-framed": "В рамке",
|
||||
"type-simple": "Простой"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Разрешить перегрузку громкости"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Время, через которое Bar скроется после того, как курсор мыши покинет его.",
|
||||
"appearance-auto-hide-delay-label": "Задержка скрытия",
|
||||
"appearance-auto-hide-exclusive-note": "Примечание: Эксклюзивная зона автоматически отключается, когда автоскрытие активно.",
|
||||
"appearance-auto-show-delay-description": "Время до появления панели, когда мышь входит в край.",
|
||||
"appearance-auto-show-delay-label": "Задержка отображения",
|
||||
"appearance-background-opacity-description": "Установите прозрачность фона специально для панели.",
|
||||
"appearance-background-opacity-label": "Прозрачность фона бара",
|
||||
"appearance-capsule-opacity-description": "Установить уровень непрозрачности для фона виджетов, когда капсула отображается.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Настройка отступов панели для компактного или просторного вида.",
|
||||
"appearance-density-label": "Плотность панели",
|
||||
"appearance-desc": "Настройка внешнего вида и положения панели.",
|
||||
"appearance-display-mode-description": "Выберите, когда панель видна",
|
||||
"appearance-display-mode-label": "Режим Отображение",
|
||||
"appearance-floating-description": "Отображает панель как плавающую 'таблетку'.",
|
||||
"appearance-floating-label": "Плавающая панель",
|
||||
"appearance-frame-radius": "Внутренний радиус",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Показать кнопки",
|
||||
"media-player-show-visualizer-description": "Показать наложение аудиовизуализатора.",
|
||||
"media-player-visualizer-type-description": "Выберите тип визуализации для фона медиаплеера.",
|
||||
"system-stat-layout-bottom": "Низ",
|
||||
"system-stat-layout-description": "Выберите, как отображается легенда относительно графика.",
|
||||
"system-stat-layout-label": "Макет",
|
||||
"system-stat-layout-side": "Сторона",
|
||||
"system-stat-rounded-corners-description": "Использовать скругленные углы для фона виджета.",
|
||||
"system-stat-rounded-corners-label": "Скругленные Углы",
|
||||
"system-stat-show-background-description": "Показать фоновый контейнер для виджета системной статистики.",
|
||||
"system-stat-show-background-label": "Показать фон",
|
||||
"system-stat-stat-type-description": "Выберите, какую системную статистику отображать.",
|
||||
"system-stat-stat-type-label": "Тип Статистики",
|
||||
"title": "Настольные виджеты",
|
||||
"weather-enabled-description": "Показать погодный виджет на рабочем столе.",
|
||||
"weather-enabled-label": "Включить виджет погоды",
|
||||
@@ -1042,7 +1064,7 @@
|
||||
"system-default": "По умолчанию"
|
||||
},
|
||||
"launcher": {
|
||||
"clipboard-desc": "Получайте доступ к истории буфера обмена и управляйте ею из панели запуска.",
|
||||
"clipboard-desc": "Получайте доступ к истории буфера обмена и управляйте ею из лаунчера.",
|
||||
"execute-desc": "Настройте способ запуска приложений.",
|
||||
"execute-title": "Исполнение",
|
||||
"settings-annotation-tool-description": "Команда для запуска при нажатии кнопки аннотирования в истории буфера обмена. Изображение будет передано в эту команду.",
|
||||
@@ -1065,14 +1087,16 @@
|
||||
"settings-custom-launch-prefix-enabled-label": "Включить пользовательский префикс запуска",
|
||||
"settings-custom-launch-prefix-label": "Пользовательский префикс запуска",
|
||||
"settings-desc": "Настройка поведения и внешнего вида запуска.",
|
||||
"settings-enable-settings-search-description": "Показывать результаты настроек при поиске в Launcher.",
|
||||
"settings-enable-settings-search-description": "Показывать результаты настроек при поиске в лаунчере.",
|
||||
"settings-enable-settings-search-label": "Включить поиск в настройках",
|
||||
"settings-enable-windows-search-description": "Поиск и фокусировка активных окон.",
|
||||
"settings-enable-windows-search-label": "Включить поиск окон",
|
||||
"settings-grid-view-description": "Показывать элементы в виде сетки вместо списка.",
|
||||
"settings-icon-mode-description": "Использовать нативные системные иконки вместо иконок Tabler.",
|
||||
"settings-icon-mode-label": "Использовать нативные иконки",
|
||||
"settings-ignore-mouse-input-description": "Отключить взаимодействие с мышью и колесом прокрутки в лаунчере.",
|
||||
"settings-ignore-mouse-input-label": "Игнорировать ввод мыши",
|
||||
"settings-position-description": "Выберите, где появляется панель запуска.",
|
||||
"settings-position-description": "Выберите, где появляется панель лаунчера.",
|
||||
"settings-show-categories-description": "Показывать вкладки категорий для фильтрации приложений.",
|
||||
"settings-show-categories-label": "Показывать категории",
|
||||
"settings-show-icon-background-description": "Показывать закруглённый прямоугольник в качестве фона для иконок.",
|
||||
@@ -1083,7 +1107,7 @@
|
||||
"settings-terminal-command-label": "Команда терминала",
|
||||
"settings-use-app2unit-description": "Использует альтернативный метод запуска для лучшего управления процессами приложений и предотвращения проблем.",
|
||||
"settings-use-app2unit-label": "Использовать App2Unit для запуска приложений",
|
||||
"title": "Запуск"
|
||||
"title": "Лаунчер"
|
||||
},
|
||||
"location": {
|
||||
"calendar-cards-desc": "Организуйте и включайте/выключайте карточки в панели календаря.",
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Vecka",
|
||||
"widgets": "Widgetar",
|
||||
"width": "Bredd",
|
||||
"windows": "Fönster",
|
||||
"yes": "Ja"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Vid muspekning"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Dölj automatiskt",
|
||||
"hidden": "Dölj när tom",
|
||||
"idle": "Dölj när inaktiv",
|
||||
"transparent": "Transparent när tom",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Läser in emojis...",
|
||||
"emoji-loading-description": "Vänta",
|
||||
"emoji-no-recent": "Inga nya emojis ännu",
|
||||
"emoji-search-description": "Sök och kopiera emojis"
|
||||
"emoji-search-description": "Sök och kopiera emojis",
|
||||
"settings-search-description": "Sök och navigera till inställningar",
|
||||
"windows-search-description": "Sök och fokusera öppna fönster"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Standard",
|
||||
"density-mini": "Mini",
|
||||
"density-spacious": "Rymlig",
|
||||
"display-mode-always-visible": "Alltid synlig",
|
||||
"type-floating": "Flytande",
|
||||
"type-framed": "Inramad",
|
||||
"type-simple": "Enkel"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Tillåt volymöverstyrning"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Tid innan Bar döljs efter att musen lämnar den.",
|
||||
"appearance-auto-hide-delay-label": "Dölj fördröjning",
|
||||
"appearance-auto-hide-exclusive-note": "Obs: Exklusiv zon inaktiveras automatiskt när automatisk döljning är aktiv.",
|
||||
"appearance-auto-show-delay-description": "Tid innan fältet visas när musen når kanten.",
|
||||
"appearance-auto-show-delay-label": "Visningsfördröjning",
|
||||
"appearance-background-opacity-description": "Ställ in bakgrundens opacitet specifikt för fältet.",
|
||||
"appearance-background-opacity-label": "Fältets bakgrundsopacitet",
|
||||
"appearance-capsule-opacity-description": "Ställ in opacitetsnivån för widgetbakgrunder när kapseln visas.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Justera stapelns avstånd för ett kompakt eller rymligt utseende.",
|
||||
"appearance-density-label": "Stapeldensitet",
|
||||
"appearance-desc": "Anpassa stapelns utseende och position.",
|
||||
"appearance-display-mode-description": "Välj när listen är synlig",
|
||||
"appearance-display-mode-label": "Visningsläge",
|
||||
"appearance-floating-description": "Visa stapeln som en flytande \"piller\".",
|
||||
"appearance-floating-label": "Flytande stapel",
|
||||
"appearance-frame-radius": "Inre radie",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Visa knappar",
|
||||
"media-player-show-visualizer-description": "Visa ljudvisualiseringsöverlägget.",
|
||||
"media-player-visualizer-type-description": "Välj en visualiseringstyp.",
|
||||
"system-stat-layout-bottom": "Botten",
|
||||
"system-stat-layout-description": "Välj hur förklaringen visas i förhållande till diagrammet.",
|
||||
"system-stat-layout-label": "Layout",
|
||||
"system-stat-layout-side": "Sida",
|
||||
"system-stat-rounded-corners-description": "Använd rundade hörn för widgetbakgrunden.",
|
||||
"system-stat-rounded-corners-label": "Rundade Hörn",
|
||||
"system-stat-show-background-description": "Visa bakgrundsbehållaren för systemstatistik-widgeten.",
|
||||
"system-stat-show-background-label": "Visa bakgrund",
|
||||
"system-stat-stat-type-description": "Välj vilken systemstatistik som ska visas.",
|
||||
"system-stat-stat-type-label": "Statistiktyp",
|
||||
"title": "Skrivbordswidgetar",
|
||||
"weather-enabled-description": "Visa en väderwidget på skrivbordet.",
|
||||
"weather-enabled-label": "Aktivera väderwidget",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Anpassa startprogrammets beteende och utseende.",
|
||||
"settings-enable-settings-search-description": "Visa inställningsresultat vid sökning i startprogrammet.",
|
||||
"settings-enable-settings-search-label": "Aktivera inställningssökning",
|
||||
"settings-enable-windows-search-description": "Sök och fokusera aktiva fönster.",
|
||||
"settings-enable-windows-search-label": "Aktivera fönstersökning",
|
||||
"settings-grid-view-description": "Visa objekt i ett rutnät istället för en lista.",
|
||||
"settings-icon-mode-description": "Använd inbyggda systemikoner istället för Tabler-ikoner.",
|
||||
"settings-icon-mode-label": "Använd inbyggda ikoner",
|
||||
|
||||
@@ -493,6 +493,7 @@
|
||||
"week": "Hafta",
|
||||
"widgets": "Araçlar",
|
||||
"width": "Genişlik",
|
||||
"windows": "Pencereler",
|
||||
"yes": "Evet"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -512,6 +513,7 @@
|
||||
"on-hover": "Üzerine gelindiğinde"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Otomatik gizleme",
|
||||
"hidden": "Boş olduğunda gizle",
|
||||
"idle": "Boşta kalınca gizle",
|
||||
"transparent": "Boşken şeffaf",
|
||||
@@ -563,7 +565,9 @@
|
||||
"emoji-loading": "Emojiler yükleniyor...",
|
||||
"emoji-loading-description": "Lütfen bekleyin",
|
||||
"emoji-no-recent": "Henüz yeni emoji yok",
|
||||
"emoji-search-description": "Emoji arama ve kopyalama"
|
||||
"emoji-search-description": "Emoji arama ve kopyalama",
|
||||
"settings-search-description": "Ayarları ara ve git",
|
||||
"windows-search-description": "Açık pencereleri ara ve odakla"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -600,6 +604,7 @@
|
||||
"density-default": "Varsayılan",
|
||||
"density-mini": "Ufak",
|
||||
"density-spacious": "Geniş",
|
||||
"display-mode-always-visible": "Her Zaman Görünür",
|
||||
"type-floating": "Yüzen",
|
||||
"type-framed": "Çerçeveli",
|
||||
"type-simple": "Basit"
|
||||
@@ -721,6 +726,11 @@
|
||||
"volumes-volume-overdrive-label": "Ses aşımına izin ver"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Fare ayrıldıktan sonra Bar'ın gizlenmeden önceki süre.",
|
||||
"appearance-auto-hide-delay-label": "Gizleme Gecikmesi",
|
||||
"appearance-auto-hide-exclusive-note": "Not: Otomatik gizleme etkin olduğunda özel bölge otomatik olarak devre dışı bırakılır.",
|
||||
"appearance-auto-show-delay-description": "Fare kenara girdiğinde çubuğun görünmesinden önceki süre.",
|
||||
"appearance-auto-show-delay-label": "Gösterme Gecikmesi",
|
||||
"appearance-background-opacity-description": "Çubuğun arka plan opaklığını özel olarak ayarlayın.",
|
||||
"appearance-background-opacity-label": "Çubuk arka plan opaklığı",
|
||||
"appearance-capsule-opacity-description": "Kapsül gösterildiğinde araç takımı arka planlarının saydamlık seviyesini ayarla.",
|
||||
@@ -728,6 +738,8 @@
|
||||
"appearance-density-description": "Sıkı veya geniş bir görünüm için araç çubuğu dolgusunu ayarlayın.",
|
||||
"appearance-density-label": "Araç Çubuğu yoğunluğu",
|
||||
"appearance-desc": "Araç çubuğunun görünümünü ve konumunu özelleştirin.",
|
||||
"appearance-display-mode-description": "Çubuğun ne zaman görünür olacağını seçin",
|
||||
"appearance-display-mode-label": "Görüntü Modu",
|
||||
"appearance-floating-description": "Araç çubuğunu yüzen bir 'kapsül' olarak görüntüler. Not: Bu, ekran köşelerini kenarlara taşıyacaktır.",
|
||||
"appearance-floating-label": "Yüzen araç çubuğu",
|
||||
"appearance-frame-radius": "İç Yarıçap",
|
||||
@@ -895,6 +907,16 @@
|
||||
"media-player-show-buttons-label": "Düğmeleri göster",
|
||||
"media-player-show-visualizer-description": "Ses görselleştirici katmanını göster.",
|
||||
"media-player-visualizer-type-description": "Masaüstü medya oynatıcı arka planı için bir görselleştirme türü seçin.",
|
||||
"system-stat-layout-bottom": "Alt",
|
||||
"system-stat-layout-description": "Efsanenin grafiğe göre nasıl görüntüleneceğini seçin.",
|
||||
"system-stat-layout-label": "Düzen",
|
||||
"system-stat-layout-side": "Taraf",
|
||||
"system-stat-rounded-corners-description": "Widget arka planı için yuvarlatılmış köşeler kullan.",
|
||||
"system-stat-rounded-corners-label": "Yuvarlatılmış Köşeler",
|
||||
"system-stat-show-background-description": "Sistem istatistik Widget'ı için arka plan kapsayıcısını göster.",
|
||||
"system-stat-show-background-label": "Arka planı göster",
|
||||
"system-stat-stat-type-description": "Hangi sistem istatistiğini görüntüleyeceğini seç.",
|
||||
"system-stat-stat-type-label": "İstatistik Türü",
|
||||
"title": "Masaüstü araçları",
|
||||
"weather-enabled-description": "Masaüstünde bir hava durumu aracı göster.",
|
||||
"weather-enabled-label": "Hava durumu araç kutusunu etkinleştir",
|
||||
@@ -1067,6 +1089,8 @@
|
||||
"settings-desc": "Başlatıcının davranışını ve görünümünü özelleştirin.",
|
||||
"settings-enable-settings-search-description": "Başlatıcıda arama yaparken ayarlar sonuçlarını göster.",
|
||||
"settings-enable-settings-search-label": "Ayarlar aramasını etkinleştir",
|
||||
"settings-enable-windows-search-description": "Etkin pencereleri ara ve odakla.",
|
||||
"settings-enable-windows-search-label": "Pencere aramasını etkinleştir",
|
||||
"settings-grid-view-description": "Öğeleri liste yerine ızgara düzeninde görüntüle.",
|
||||
"settings-icon-mode-description": "Tabler simgeleri yerine yerel sistem simgelerini kullanın.",
|
||||
"settings-icon-mode-label": "Yerel simgeleri kullan",
|
||||
|
||||
@@ -489,6 +489,7 @@
|
||||
"week": "Тиждень",
|
||||
"widgets": "Віджети",
|
||||
"width": "Ширина",
|
||||
"windows": "Вікна",
|
||||
"yes": "Так"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -508,6 +509,7 @@
|
||||
"on-hover": "При наведенні"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "Автоматичне приховування",
|
||||
"hidden": "Приховувати, коли порожньо",
|
||||
"idle": "Приховувати, коли неактивний",
|
||||
"transparent": "Прозорий, коли порожній",
|
||||
@@ -559,7 +561,9 @@
|
||||
"emoji-loading": "Завантаження емодзі...",
|
||||
"emoji-loading-description": "Зачекайте, будь ласка",
|
||||
"emoji-no-recent": "Немає нещодавніх емодзі",
|
||||
"emoji-search-description": "Пошук і копіювання емодзі"
|
||||
"emoji-search-description": "Пошук і копіювання емодзі",
|
||||
"settings-search-description": "Пошук та перехід до налаштувань",
|
||||
"windows-search-description": "Пошук і фокусування відкритих вікон"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -596,6 +600,7 @@
|
||||
"density-default": "Стандартний",
|
||||
"density-mini": "Міні",
|
||||
"density-spacious": "Просторий",
|
||||
"display-mode-always-visible": "Завжди видимий",
|
||||
"type-floating": "Плаваючий",
|
||||
"type-framed": "У рамці",
|
||||
"type-simple": "Простий"
|
||||
@@ -717,6 +722,11 @@
|
||||
"volumes-volume-overdrive-label": "Гучність понад 100%"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "Час, через який Bar сховається після того, як курсор миші залишить його.",
|
||||
"appearance-auto-hide-delay-label": "Затримка приховування",
|
||||
"appearance-auto-hide-exclusive-note": "Примітка: Ексклюзивна зона автоматично вимикається, коли автоприховування активне.",
|
||||
"appearance-auto-show-delay-description": "Час до появи панелі, коли миша входить у край.",
|
||||
"appearance-auto-show-delay-label": "Затримка відображення",
|
||||
"appearance-background-opacity-description": "Встановити прозорість фону спеціально для панелі.",
|
||||
"appearance-background-opacity-label": "Прозорість фону панелі",
|
||||
"appearance-capsule-opacity-description": "Встановити рівень непрозорості для фону віджетів, коли показано капсулу.",
|
||||
@@ -724,6 +734,8 @@
|
||||
"appearance-density-description": "Налаштуйте відступи панелі для компактного або просторого вигляду.",
|
||||
"appearance-density-label": "Щільність панелі",
|
||||
"appearance-desc": "Налаштуйте зовнішній вигляд та положення панелі.",
|
||||
"appearance-display-mode-description": "Виберіть, коли панель видима",
|
||||
"appearance-display-mode-label": "Режим відображення",
|
||||
"appearance-floating-description": "Відображати панель як плаваючу 'капсулу'. Примітка: Це перемістить кути екрана до країв.",
|
||||
"appearance-floating-label": "Плаваюча панель (Острівець)",
|
||||
"appearance-frame-radius": "Внутрішній радіус",
|
||||
@@ -891,6 +903,16 @@
|
||||
"media-player-show-buttons-label": "Показати кнопки",
|
||||
"media-player-show-visualizer-description": "Показати накладання аудіовізуалізатора.",
|
||||
"media-player-visualizer-type-description": "Оберіть тип візуалізації для фону медіаплеєра на робочому столі.",
|
||||
"system-stat-layout-bottom": "Низ",
|
||||
"system-stat-layout-description": "Виберіть, як відображається легенда відносно графіка.",
|
||||
"system-stat-layout-label": "Макет",
|
||||
"system-stat-layout-side": "Сторона",
|
||||
"system-stat-rounded-corners-description": "Використовувати заокруглені кути для фону віджета.",
|
||||
"system-stat-rounded-corners-label": "Закруглені Кути",
|
||||
"system-stat-show-background-description": "Показати фоновий контейнер для віджета системної статистики.",
|
||||
"system-stat-show-background-label": "Показати фон",
|
||||
"system-stat-stat-type-description": "Виберіть, яку системну статистику відображати.",
|
||||
"system-stat-stat-type-label": "Тип Статистики",
|
||||
"title": "Настільні віджети",
|
||||
"weather-enabled-description": "Показувати погодний віджет на робочому столі.",
|
||||
"weather-enabled-label": "Увімкнути віджет погоди",
|
||||
@@ -1041,7 +1063,7 @@
|
||||
"clipboard-desc": "Отримуйте доступ до історії буфера обміну та керуйте нею з панелі запуску.",
|
||||
"execute-desc": "Налаштуйте спосіб запуску програм.",
|
||||
"execute-title": "Виконання",
|
||||
"settings-annotation-tool-description": "Команда для запуску при натисканні кнопки анотування в історії буфера обміну, зображення буде передано в цю команду.",
|
||||
"settings-annotation-tool-description": "Команда для запуску при натисканні кнопки анотування в історії буфера обміну. Зображення буде передано в цю команду.",
|
||||
"settings-annotation-tool-label": "Інструмент анотацій",
|
||||
"settings-annotation-tool-placeholder": "напр. 'gradia', 'satty -f -'",
|
||||
"settings-auto-paste-description": "Автоматично вставити вибраний елемент з буфера обміну. Потребує wtype.",
|
||||
@@ -1063,6 +1085,8 @@
|
||||
"settings-desc": "Налаштуйте поведінку та зовнішній вигляд лаунчера.",
|
||||
"settings-enable-settings-search-description": "Показувати результати налаштувань під час пошуку в Launcher.",
|
||||
"settings-enable-settings-search-label": "Увімкнути пошук у налаштуваннях",
|
||||
"settings-enable-windows-search-description": "Шукати та фокусувати активні вікна.",
|
||||
"settings-enable-windows-search-label": "Увімкнути пошук вікон",
|
||||
"settings-grid-view-description": "Показувати елементи у вигляді сітки замість списку.",
|
||||
"settings-icon-mode-description": "Використовувати нативні системні іконки замість іконок Tabler.",
|
||||
"settings-icon-mode-label": "Використовувати нативні іконки",
|
||||
|
||||
@@ -48,19 +48,19 @@
|
||||
"device-default": "默认(显示设备)",
|
||||
"device-description": "选择要显示的电池设备。",
|
||||
"device-label": "电池设备",
|
||||
"hide-if-idle-description": "当电池未充电或放电时,隐藏小部件。",
|
||||
"hide-if-idle-description": "当电池空闲时(没有充电或者放电电流时),隐藏小部件。",
|
||||
"hide-if-idle-label": "空闲时隐藏",
|
||||
"hide-if-not-detected-description": "当系统未检测到电池时,隐藏该小部件。",
|
||||
"hide-if-not-detected-label": "未检测到电池时隐藏",
|
||||
"hide-if-not-detected-label": "未检测到电池时,隐藏该小部件",
|
||||
"low-battery-threshold-description": "当电量低于此百分比时显示警告。",
|
||||
"low-battery-threshold-label": "低电量警告阈值",
|
||||
"show-noctalia-performance-description": "在电池面板中显示 Noctalia 性能模式切换。<br>禁用 Noctalia 中的阴影和动画以减少资源使用。",
|
||||
"show-noctalia-performance-label": "显示 Noctalia 性能模式切换",
|
||||
"show-noctalia-performance-description": "在电池面板中显示 Noctalia 性能模式开关。<br>该模式通过禁用 Noctalia 中的阴影和动画减少性能开销。",
|
||||
"show-noctalia-performance-label": "显示 Noctalia 性能模式开关",
|
||||
"show-power-profile-description": "在电池面板中显示电源配置文件选项。",
|
||||
"show-power-profile-label": "显示电源配置文件控件"
|
||||
},
|
||||
"clock": {
|
||||
"clock-display-description": "通过从下面的列表添加标记来自定义时钟显示。要使用 12 小时制,必须包含 'AP' 标记。",
|
||||
"clock-display-description": "通过从下面的列表添加标记来自定义时钟样式。要使用 12 小时制,则必须包含 'AP' 标记。",
|
||||
"clock-display-label": "时钟显示",
|
||||
"custom-font-description": "自定义时钟使用的字体。",
|
||||
"custom-font-label": "自定义字体",
|
||||
@@ -489,6 +489,7 @@
|
||||
"week": "周",
|
||||
"widgets": "小部件",
|
||||
"width": "宽度",
|
||||
"windows": "窗口",
|
||||
"yes": "是"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -508,6 +509,7 @@
|
||||
"on-hover": "悬停时"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "自动隐藏",
|
||||
"hidden": "当为空时隐藏",
|
||||
"idle": "空闲时隐藏",
|
||||
"transparent": "空时透明",
|
||||
@@ -559,7 +561,9 @@
|
||||
"emoji-loading": "正在加载表情符号...",
|
||||
"emoji-loading-description": "请稍候",
|
||||
"emoji-no-recent": "尚无最近使用的表情符号",
|
||||
"emoji-search-description": "搜索和复制表情符号"
|
||||
"emoji-search-description": "搜索和复制表情符号",
|
||||
"settings-search-description": "搜索并前往设置",
|
||||
"windows-search-description": "搜索并聚焦打开的窗口"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -596,6 +600,7 @@
|
||||
"density-default": "默认",
|
||||
"density-mini": "迷你",
|
||||
"density-spacious": "宽敞",
|
||||
"display-mode-always-visible": "始终可见",
|
||||
"type-floating": "悬浮",
|
||||
"type-framed": "边框",
|
||||
"type-simple": "简约"
|
||||
@@ -717,6 +722,11 @@
|
||||
"volumes-volume-overdrive-label": "允许音量过载"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "鼠标离开后Bar隐藏所需时间",
|
||||
"appearance-auto-hide-delay-label": "隐藏延迟",
|
||||
"appearance-auto-hide-exclusive-note": "注意: 当自动隐藏处于活动状态时,专属区域会自动禁用。",
|
||||
"appearance-auto-show-delay-description": "鼠标进入边缘时,栏显示前的延迟时间。",
|
||||
"appearance-auto-show-delay-label": "显示延迟",
|
||||
"appearance-background-opacity-description": "为状态栏设置背景不透明度。",
|
||||
"appearance-background-opacity-label": "状态栏背景不透明度",
|
||||
"appearance-capsule-opacity-description": "设置显示胶囊时小部件背景的不透明度。",
|
||||
@@ -724,6 +734,8 @@
|
||||
"appearance-density-description": "调整状态栏的内边距以获得紧凑或宽松的外观。",
|
||||
"appearance-density-label": "状态栏密度",
|
||||
"appearance-desc": "自定义状态栏的外观和位置。",
|
||||
"appearance-display-mode-description": "选择栏何时可见",
|
||||
"appearance-display-mode-label": "显示模式",
|
||||
"appearance-floating-description": "将状态栏显示为浮动的“药丸”形状。",
|
||||
"appearance-floating-label": "浮动状态栏",
|
||||
"appearance-frame-radius": "内圆角",
|
||||
@@ -891,6 +903,16 @@
|
||||
"media-player-show-buttons-label": "显示按钮",
|
||||
"media-player-show-visualizer-description": "显示音频可视化叠加层。",
|
||||
"media-player-visualizer-type-description": "选择桌面媒体播放器的背景可视化类型。",
|
||||
"system-stat-layout-bottom": "底部",
|
||||
"system-stat-layout-description": "选择图例相对于图表的显示方式。",
|
||||
"system-stat-layout-label": "布局",
|
||||
"system-stat-layout-side": "边",
|
||||
"system-stat-rounded-corners-description": "小组件背景使用圆角。",
|
||||
"system-stat-rounded-corners-label": "圆角",
|
||||
"system-stat-show-background-description": "显示系统统计小部件的背景容器。",
|
||||
"system-stat-show-background-label": "显示背景",
|
||||
"system-stat-stat-type-description": "选择要显示的系统统计信息。",
|
||||
"system-stat-stat-type-label": "统计类型",
|
||||
"title": "桌面小部件",
|
||||
"weather-enabled-description": "在桌面上显示天气小部件。",
|
||||
"weather-enabled-label": "启用天气小部件",
|
||||
@@ -1063,6 +1085,8 @@
|
||||
"settings-desc": "自定义启动器的行为和外观。",
|
||||
"settings-enable-settings-search-description": "在启动器中搜索时显示设置结果。",
|
||||
"settings-enable-settings-search-label": "启用设置搜索",
|
||||
"settings-enable-windows-search-description": "搜索并聚焦活动窗口。",
|
||||
"settings-enable-windows-search-label": "启用窗口搜索",
|
||||
"settings-grid-view-description": "以网格布局而非列表显示项目。",
|
||||
"settings-icon-mode-description": "使用本地系统图标而不是 Tabler 图标。",
|
||||
"settings-icon-mode-label": "使用本地图标",
|
||||
|
||||
@@ -489,6 +489,7 @@
|
||||
"week": "週",
|
||||
"widgets": "小工具",
|
||||
"width": "寬度",
|
||||
"windows": "視窗",
|
||||
"yes": "是"
|
||||
},
|
||||
"control-center": {
|
||||
@@ -508,6 +509,7 @@
|
||||
"on-hover": "游標移過時"
|
||||
},
|
||||
"hide-modes": {
|
||||
"auto-hide": "自動隱藏",
|
||||
"hidden": "空白時隱藏",
|
||||
"idle": "閒置時隱藏",
|
||||
"transparent": "空白時變透明",
|
||||
@@ -559,7 +561,9 @@
|
||||
"emoji-loading": "載入表情符號...",
|
||||
"emoji-loading-description": "請稍候",
|
||||
"emoji-no-recent": "還沒有最近使用的表情符號",
|
||||
"emoji-search-description": "搜尋和複製表情符號"
|
||||
"emoji-search-description": "搜尋和複製表情符號",
|
||||
"settings-search-description": "搜尋並前往設定",
|
||||
"windows-search-description": "搜尋並聚焦開啟的視窗"
|
||||
}
|
||||
},
|
||||
"lock-screen": {
|
||||
@@ -596,6 +600,7 @@
|
||||
"density-default": "預設",
|
||||
"density-mini": "迷你",
|
||||
"density-spacious": "寬敞",
|
||||
"display-mode-always-visible": "永遠可見",
|
||||
"type-floating": "懸浮",
|
||||
"type-framed": "邊框",
|
||||
"type-simple": "簡約"
|
||||
@@ -717,6 +722,11 @@
|
||||
"volumes-volume-overdrive-label": "允許音量過載"
|
||||
},
|
||||
"bar": {
|
||||
"appearance-auto-hide-delay-description": "滑鼠離開後Bar隱藏所需時間",
|
||||
"appearance-auto-hide-delay-label": "隱藏延遲",
|
||||
"appearance-auto-hide-exclusive-note": "注意: 當自動隱藏處於活動狀態時,專屬區域會自動禁用。",
|
||||
"appearance-auto-show-delay-description": "滑鼠進入邊緣時,欄顯示前的延遲時間。",
|
||||
"appearance-auto-show-delay-label": "顯示延遲",
|
||||
"appearance-background-opacity-description": "設定工具列背景的不透明度",
|
||||
"appearance-background-opacity-label": "工具列背景不透明度",
|
||||
"appearance-capsule-opacity-description": "設定當啟用顯示小容器時小工具的背景不透明度",
|
||||
@@ -724,6 +734,8 @@
|
||||
"appearance-density-description": "調整工具列的內部間距來做出緊湊或寬敞的外觀",
|
||||
"appearance-density-label": "工具列密度",
|
||||
"appearance-desc": "自訂工具列的外觀及位置",
|
||||
"appearance-display-mode-description": "選擇列何時可見",
|
||||
"appearance-display-mode-label": "顯示模式",
|
||||
"appearance-floating-description": "將工具列以懸浮的圓弧長條狀顯示",
|
||||
"appearance-floating-label": "懸浮工具列",
|
||||
"appearance-frame-radius": "內圓角",
|
||||
@@ -891,6 +903,16 @@
|
||||
"media-player-show-buttons-label": "顯示按鈕",
|
||||
"media-player-show-visualizer-description": "顯示視覺效果",
|
||||
"media-player-visualizer-type-description": "選擇視覺效果的樣式",
|
||||
"system-stat-layout-bottom": "底部",
|
||||
"system-stat-layout-description": "選擇圖例相對於圖表的顯示方式。",
|
||||
"system-stat-layout-label": "佈局",
|
||||
"system-stat-layout-side": "邊",
|
||||
"system-stat-rounded-corners-description": "小工具背景使用圓角。",
|
||||
"system-stat-rounded-corners-label": "圓角",
|
||||
"system-stat-show-background-description": "顯示系統統計小工具的背景容器。",
|
||||
"system-stat-show-background-label": "顯示背景",
|
||||
"system-stat-stat-type-description": "選擇要顯示的系統統計資訊。",
|
||||
"system-stat-stat-type-label": "統計類型",
|
||||
"title": "桌面小工具",
|
||||
"weather-enabled-description": "在桌面顯示一個天氣小工具",
|
||||
"weather-enabled-label": "啟用天氣小工具",
|
||||
@@ -1041,7 +1063,7 @@
|
||||
"clipboard-desc": "在啟動器存取及整理你的剪貼簿歷史",
|
||||
"execute-desc": "設定應用程式該如何啟動",
|
||||
"execute-title": "執行",
|
||||
"settings-annotation-tool-description": "點擊剪貼簿歷史記錄中的註記按鈕時要執行的命令,圖片將會透過管線傳送至此命令。",
|
||||
"settings-annotation-tool-description": "點擊剪貼簿歷史記錄中的註記按鈕時要執行的命令。圖片將會透過管線傳送至此命令。",
|
||||
"settings-annotation-tool-label": "註記工具",
|
||||
"settings-annotation-tool-placeholder": "例如: gradia', 'satty -f -'",
|
||||
"settings-auto-paste-description": "自動貼上選取的剪貼簿項目, 需要 wtype 套件",
|
||||
@@ -1063,6 +1085,8 @@
|
||||
"settings-desc": "自訂啟動器的外觀及行為",
|
||||
"settings-enable-settings-search-description": "在啟動器中搜尋時顯示設定結果。",
|
||||
"settings-enable-settings-search-label": "啟用設定搜尋",
|
||||
"settings-enable-windows-search-description": "搜尋並聚焦作用中視窗。",
|
||||
"settings-enable-windows-search-label": "啟用視窗搜尋",
|
||||
"settings-grid-view-description": "將項目以方格排列而不是列表顯示",
|
||||
"settings-icon-mode-description": "使用系統原生的圖示而不是自 Tabler 圖示包帶入",
|
||||
"settings-icon-mode-label": "使用原生圖示",
|
||||
|
||||
@@ -16,8 +16,10 @@
|
||||
"frameThickness": 8,
|
||||
"frameRadius": 12,
|
||||
"outerCorners": true,
|
||||
"exclusive": true,
|
||||
"hideOnOverview": false,
|
||||
"displayMode": "always_visible",
|
||||
"autoHideDelay": 500,
|
||||
"autoShowDelay": 150,
|
||||
"widgets": {
|
||||
"left": [
|
||||
{
|
||||
@@ -169,7 +171,8 @@
|
||||
"wallhavenApiKey": "",
|
||||
"wallhavenResolutionMode": "atleast",
|
||||
"wallhavenResolutionWidth": "",
|
||||
"wallhavenResolutionHeight": ""
|
||||
"wallhavenResolutionHeight": "",
|
||||
"sortOrder": "name"
|
||||
},
|
||||
"appLauncher": {
|
||||
"enableClipboardHistory": false,
|
||||
@@ -190,6 +193,7 @@
|
||||
"iconMode": "tabler",
|
||||
"showIconBackground": false,
|
||||
"enableSettingsSearch": true,
|
||||
"enableWindowsSearch": true,
|
||||
"ignoreMouseInput": false,
|
||||
"screenshotAnnotationTool": ""
|
||||
},
|
||||
@@ -268,13 +272,12 @@
|
||||
"diskCriticalThreshold": 90,
|
||||
"diskAvailWarningThreshold": 20,
|
||||
"diskAvailCriticalThreshold": 10,
|
||||
"cpuPollingInterval": 3000,
|
||||
"tempPollingInterval": 3000,
|
||||
"cpuPollingInterval": 1000,
|
||||
"gpuPollingInterval": 3000,
|
||||
"enableDgpuMonitoring": false,
|
||||
"memPollingInterval": 3000,
|
||||
"memPollingInterval": 1000,
|
||||
"diskPollingInterval": 30000,
|
||||
"networkPollingInterval": 3000,
|
||||
"networkPollingInterval": 1000,
|
||||
"loadAvgPollingInterval": 3000,
|
||||
"useCustomColors": false,
|
||||
"warningColor": "",
|
||||
@@ -310,8 +313,8 @@
|
||||
"countdownDuration": 10000,
|
||||
"position": "center",
|
||||
"showHeader": true,
|
||||
"largeButtonsStyle": false,
|
||||
"largeButtonsLayout": "grid",
|
||||
"largeButtonsStyle": true,
|
||||
"largeButtonsLayout": "single-row",
|
||||
"showNumberLabels": true,
|
||||
"powerOptions": [
|
||||
{
|
||||
|
||||
@@ -143,6 +143,24 @@
|
||||
"subTab": 0,
|
||||
"subTabLabel": "common.appearance"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.bar.appearance-type-label",
|
||||
"descriptionKey": "panels.bar.appearance-type-description",
|
||||
"widget": "NComboBox",
|
||||
"tab": 4,
|
||||
"tabLabel": "panels.bar.title",
|
||||
"subTab": 0,
|
||||
"subTabLabel": "common.appearance"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.bar.appearance-display-mode-label",
|
||||
"descriptionKey": "panels.bar.appearance-display-mode-description",
|
||||
"widget": "NComboBox",
|
||||
"tab": 4,
|
||||
"tabLabel": "panels.bar.title",
|
||||
"subTab": 0,
|
||||
"subTabLabel": "common.appearance"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.bar.appearance-use-separate-opacity-label",
|
||||
"descriptionKey": "panels.bar.appearance-use-separate-opacity-description",
|
||||
@@ -189,9 +207,9 @@
|
||||
"subTabLabel": "common.appearance"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.bar.appearance-type-label",
|
||||
"descriptionKey": "panels.bar.appearance-type-description",
|
||||
"widget": "NComboBox",
|
||||
"labelKey": "panels.bar.appearance-hide-on-overview-label",
|
||||
"descriptionKey": "panels.bar.appearance-hide-on-overview-description",
|
||||
"widget": "NToggle",
|
||||
"tab": 4,
|
||||
"tabLabel": "panels.bar.title",
|
||||
"subTab": 0,
|
||||
@@ -261,9 +279,18 @@
|
||||
"subTabLabel": "common.appearance"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.bar.appearance-hide-on-overview-label",
|
||||
"descriptionKey": "panels.bar.appearance-hide-on-overview-description",
|
||||
"widget": "NToggle",
|
||||
"labelKey": "panels.bar.appearance-auto-hide-delay-label",
|
||||
"descriptionKey": "panels.bar.appearance-auto-hide-delay-description",
|
||||
"widget": "NValueSlider",
|
||||
"tab": 4,
|
||||
"tabLabel": "panels.bar.title",
|
||||
"subTab": 0,
|
||||
"subTabLabel": "common.appearance"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.bar.appearance-auto-show-delay-label",
|
||||
"descriptionKey": "panels.bar.appearance-auto-show-delay-description",
|
||||
"widget": "NValueSlider",
|
||||
"tab": 4,
|
||||
"tabLabel": "panels.bar.title",
|
||||
"subTab": 0,
|
||||
@@ -830,6 +857,15 @@
|
||||
"subTab": 0,
|
||||
"subTabLabel": "common.general"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.launcher.settings-enable-windows-search-label",
|
||||
"descriptionKey": "panels.launcher.settings-enable-windows-search-description",
|
||||
"widget": "NToggle",
|
||||
"tab": 8,
|
||||
"tabLabel": "panels.launcher.title",
|
||||
"subTab": 0,
|
||||
"subTabLabel": "common.general"
|
||||
},
|
||||
{
|
||||
"labelKey": "panels.launcher.settings-ignore-mouse-input-label",
|
||||
"descriptionKey": "panels.launcher.settings-ignore-mouse-input-description",
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"Battery": {
|
||||
"displayMode": "onhover",
|
||||
"warningThreshold": 30,
|
||||
"deviceNativePath": "",
|
||||
"deviceNativePath": "__default__",
|
||||
"showPowerProfiles": false,
|
||||
"showNoctaliaPerformance": false,
|
||||
"hideIfNotDetected": true,
|
||||
@@ -115,7 +115,8 @@
|
||||
"NotificationHistory": {
|
||||
"showUnreadBadge": true,
|
||||
"hideWhenZero": false,
|
||||
"hideWhenZeroUnread": false
|
||||
"hideWhenZeroUnread": false,
|
||||
"unreadBadgeColor": "primary"
|
||||
},
|
||||
"SessionMenu": {
|
||||
"colorName": "error"
|
||||
@@ -128,6 +129,7 @@
|
||||
"usePrimaryColor": false,
|
||||
"useMonospaceFont": true,
|
||||
"showCpuUsage": true,
|
||||
"showCpuFreq": false,
|
||||
"showCpuTemp": true,
|
||||
"showGpuTemp": false,
|
||||
"showLoadAverage": false,
|
||||
@@ -179,7 +181,12 @@
|
||||
"unfocusedIconsOpacity": 1,
|
||||
"groupedBorderOpacity": 1,
|
||||
"enableScrollWheel": true,
|
||||
"iconScale": 0.8
|
||||
"iconScale": 0.8,
|
||||
"focusedColor": "primary",
|
||||
"occupiedColor": "secondary",
|
||||
"emptyColor": "secondary",
|
||||
"showBadge": true,
|
||||
"reverseScroll": false
|
||||
},
|
||||
"Volume": {
|
||||
"displayMode": "onhover",
|
||||
@@ -216,6 +223,13 @@
|
||||
},
|
||||
"Weather": {
|
||||
"showBackground": true
|
||||
},
|
||||
"SystemStat": {
|
||||
"showBackground": true,
|
||||
"statType": "CPU",
|
||||
"diskPath": "/",
|
||||
"roundedCorners": true,
|
||||
"layout": "bottom"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
|
||||
QtObject {
|
||||
id: root
|
||||
|
||||
function migrate(adapter, logger, rawJson) {
|
||||
logger.i("Migration47", "Removing network_stats.json cache and updating polling intervals");
|
||||
|
||||
// Remove the network_stats.json cache file (no longer used - autoscaling from history now)
|
||||
const shellName = "noctalia";
|
||||
const cacheDir = Quickshell.env("NOCTALIA_CACHE_DIR") || (Quickshell.env("XDG_CACHE_HOME") || Quickshell.env("HOME") + "/.cache") + "/" + shellName + "/";
|
||||
const networkStatsFile = cacheDir + "network_stats.json";
|
||||
Quickshell.execDetached(["rm", "-f", networkStatsFile]);
|
||||
|
||||
// Update polling intervals to 1000ms for smoother graphs (only if currently slower)
|
||||
if (adapter.systemMonitor.cpuPollingInterval > 1000)
|
||||
adapter.systemMonitor.cpuPollingInterval = 1000;
|
||||
if (adapter.systemMonitor.memPollingInterval > 1000)
|
||||
adapter.systemMonitor.memPollingInterval = 1000;
|
||||
if (adapter.systemMonitor.networkPollingInterval > 1000)
|
||||
adapter.systemMonitor.networkPollingInterval = 1000;
|
||||
|
||||
logger.d("Migration47", "Removed network_stats.json and adjusted polling intervals");
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -20,7 +20,8 @@ QtObject {
|
||||
43: migration43Component,
|
||||
44: migration44Component,
|
||||
45: migration45Component,
|
||||
46: migration46Component
|
||||
46: migration46Component,
|
||||
47: migration47Component
|
||||
})
|
||||
|
||||
// Migration components
|
||||
@@ -38,4 +39,5 @@ QtObject {
|
||||
property Component migration44Component: Migration44 {}
|
||||
property Component migration45Component: Migration45 {}
|
||||
property Component migration46Component: Migration46 {}
|
||||
property Component migration47Component: Migration47 {}
|
||||
}
|
||||
|
||||
+16
-12
@@ -25,7 +25,7 @@ Singleton {
|
||||
- Default cache directory: ~/.cache/noctalia
|
||||
*/
|
||||
readonly property alias data: adapter // Used to access via Settings.data.xxx.yyy
|
||||
readonly property int settingsVersion: 46
|
||||
readonly property int settingsVersion: 47
|
||||
readonly property bool isDebug: Quickshell.env("NOCTALIA_DEBUG") === "1"
|
||||
readonly property string shellName: "noctalia"
|
||||
readonly property string configDir: Quickshell.env("NOCTALIA_CONFIG_DIR") || (Quickshell.env("XDG_CONFIG_HOME") || Quickshell.env("HOME") + "/.config") + "/" + shellName + "/"
|
||||
@@ -194,12 +194,14 @@ Singleton {
|
||||
// Bar outer corners (inverted/concave corners at bar edges when not floating)
|
||||
property bool outerCorners: true
|
||||
|
||||
// Reserves space with compositor
|
||||
property bool exclusive: true
|
||||
|
||||
// Hide bar/panels when compositor overview is active
|
||||
property bool hideOnOverview: false
|
||||
|
||||
// Auto-hide settings
|
||||
property string displayMode: "always_visible" // "always_visible", "auto_hide"
|
||||
property int autoHideDelay: 500 // ms before hiding after mouse leaves
|
||||
property int autoShowDelay: 150 // ms before showing when mouse enters
|
||||
|
||||
// Widget configuration for modular bar system
|
||||
property JsonObject widgets
|
||||
widgets: JsonObject {
|
||||
@@ -370,7 +372,9 @@ Singleton {
|
||||
property string wallhavenApiKey: ""
|
||||
property string wallhavenResolutionMode: "atleast" // "atleast" or "exact"
|
||||
property string wallhavenResolutionWidth: ""
|
||||
|
||||
property string wallhavenResolutionHeight: ""
|
||||
property string sortOrder: "name" // "name", "name_desc", "date", "date_desc"
|
||||
}
|
||||
|
||||
// applauncher
|
||||
@@ -395,6 +399,7 @@ Singleton {
|
||||
property string iconMode: "tabler"
|
||||
property bool showIconBackground: false
|
||||
property bool enableSettingsSearch: true
|
||||
property bool enableWindowsSearch: true
|
||||
property bool ignoreMouseInput: false
|
||||
property string screenshotAnnotationTool: ""
|
||||
}
|
||||
@@ -479,13 +484,12 @@ Singleton {
|
||||
property int diskCriticalThreshold: 90
|
||||
property int diskAvailWarningThreshold: 20
|
||||
property int diskAvailCriticalThreshold: 10
|
||||
property int cpuPollingInterval: 3000
|
||||
property int tempPollingInterval: 3000
|
||||
property int cpuPollingInterval: 1000
|
||||
property int gpuPollingInterval: 3000
|
||||
property bool enableDgpuMonitoring: false // Opt-in: reading dGPU sysfs/nvidia-smi wakes it from D3cold, draining battery
|
||||
property int memPollingInterval: 3000
|
||||
property int memPollingInterval: 1000
|
||||
property int diskPollingInterval: 30000
|
||||
property int networkPollingInterval: 3000
|
||||
property int networkPollingInterval: 1000
|
||||
property int loadAvgPollingInterval: 3000
|
||||
property bool useCustomColors: false
|
||||
property string warningColor: ""
|
||||
@@ -528,8 +532,8 @@ Singleton {
|
||||
property int countdownDuration: 10000
|
||||
property string position: "center"
|
||||
property bool showHeader: true
|
||||
property bool largeButtonsStyle: false
|
||||
property string largeButtonsLayout: "grid"
|
||||
property bool largeButtonsStyle: true
|
||||
property string largeButtonsLayout: "single-row"
|
||||
property bool showNumberLabels: true
|
||||
property list<var> powerOptions: [
|
||||
{
|
||||
@@ -1113,7 +1117,7 @@ Singleton {
|
||||
|
||||
// Delete deprecated user settings from the wiget
|
||||
for (const k of Object.keys(widget)) {
|
||||
if (k === "id" || k === "allowUserSettings") {
|
||||
if (k === "id") {
|
||||
continue;
|
||||
}
|
||||
if (!keys.includes(k)) {
|
||||
@@ -1124,7 +1128,7 @@ Singleton {
|
||||
// Inject missing default setting (metaData) from BarWidgetRegistry
|
||||
for (var i = 0; i < keys.length; i++) {
|
||||
const k = keys[i];
|
||||
if (k === "id" || k === "allowUserSettings") {
|
||||
if (k === "id") {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,12 @@ Singleton {
|
||||
// Current date
|
||||
property var now: new Date()
|
||||
|
||||
// Unix timestamp of the last update
|
||||
property real _lastUpdateTs: Date.now()
|
||||
|
||||
// Signal emitted when a significant time jump is detected (e.g. system resume)
|
||||
signal resumed
|
||||
|
||||
// Returns a Unix Timestamp (in seconds)
|
||||
readonly property int timestamp: {
|
||||
return Math.floor(root.now / 1000);
|
||||
@@ -34,6 +40,15 @@ Singleton {
|
||||
triggeredOnStart: false
|
||||
onTriggered: {
|
||||
var newTime = new Date();
|
||||
var currentTs = newTime.getTime();
|
||||
|
||||
// Detect time jump (e.g. system resume) - threshold: 5 seconds
|
||||
if (currentTs - root._lastUpdateTs > 5000) {
|
||||
Logger.i("Time", "Time jump detected (" + Math.round((currentTs - root._lastUpdateTs) / 1000) + "s) - likely system resume");
|
||||
root.resumed();
|
||||
}
|
||||
root._lastUpdateTs = currentTs;
|
||||
|
||||
root.now = newTime;
|
||||
|
||||
// Update timer if running
|
||||
|
||||
+111
-35
@@ -74,9 +74,79 @@ Item {
|
||||
readonly property real capsuleHeight: Style.getCapsuleHeightForDensity(barDensity, barHeight)
|
||||
readonly property real barFontSize: Style.getBarFontSizeForDensity(barHeight, capsuleHeight, barIsVertical)
|
||||
|
||||
// Bar widgets (per-screen)
|
||||
// Bar widgets (per-screen) - initial configuration
|
||||
// Note: Updates are handled via Connections to BarService.widgetsRevisionChanged
|
||||
readonly property var barWidgets: Settings.getBarWidgetsForScreen(screen?.name)
|
||||
|
||||
// Stable ListModels for each section - prevents Repeater recreation on settings changes
|
||||
property ListModel leftWidgetsModel: ListModel {}
|
||||
property ListModel centerWidgetsModel: ListModel {}
|
||||
property ListModel rightWidgetsModel: ListModel {}
|
||||
|
||||
// Sync a ListModel with widget data, preserving delegates when only settings change
|
||||
function syncWidgetModel(model, newWidgets) {
|
||||
var validWidgets = filterValidWidgets(newWidgets);
|
||||
|
||||
// Build list of current IDs in model
|
||||
var currentIds = [];
|
||||
for (var i = 0; i < model.count; i++) {
|
||||
currentIds.push(model.get(i).id);
|
||||
}
|
||||
|
||||
// Build list of new IDs
|
||||
var newIds = validWidgets.map(w => w.id);
|
||||
|
||||
// Check if structure changed (different IDs or order)
|
||||
var structureChanged = currentIds.length !== newIds.length;
|
||||
if (!structureChanged) {
|
||||
for (var i = 0; i < currentIds.length; i++) {
|
||||
if (currentIds[i] !== newIds[i]) {
|
||||
structureChanged = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Logger.d("Bar", "syncWidgetModel:", currentIds.join("|"), "→", newIds.join("|"), "changed:", structureChanged);
|
||||
|
||||
if (structureChanged) {
|
||||
// Rebuild model - IDs changed
|
||||
model.clear();
|
||||
for (var i = 0; i < validWidgets.length; i++) {
|
||||
model.append(validWidgets[i]);
|
||||
}
|
||||
}
|
||||
// If structure didn't change, delegates are preserved and will read fresh settings
|
||||
}
|
||||
|
||||
// Sync models when widget revision changes
|
||||
// Note: We use Connections instead of onBarWidgetsChanged because getBarWidgetsForScreen
|
||||
// returns the same object reference (Settings.data.bar.widgets) even when content changes,
|
||||
// so QML won't detect the change via property binding.
|
||||
Connections {
|
||||
target: BarService
|
||||
function onWidgetsRevisionChanged() {
|
||||
Logger.d("Bar", "onWidgetsRevisionChanged, revision:", BarService.widgetsRevision, "screen:", root.screen?.name);
|
||||
var widgets = Settings.getBarWidgetsForScreen(root.screen?.name);
|
||||
if (widgets) {
|
||||
root.syncWidgetModel(root.leftWidgetsModel, widgets.left);
|
||||
root.syncWidgetModel(root.centerWidgetsModel, widgets.center);
|
||||
root.syncWidgetModel(root.rightWidgetsModel, widgets.right);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize models
|
||||
Component.onCompleted: {
|
||||
Logger.d("Bar", "Bar Component.onCompleted for screen:", screen?.name);
|
||||
var widgets = Settings.getBarWidgetsForScreen(screen?.name);
|
||||
if (widgets) {
|
||||
syncWidgetModel(leftWidgetsModel, widgets.left);
|
||||
syncWidgetModel(centerWidgetsModel, widgets.center);
|
||||
syncWidgetModel(rightWidgetsModel, widgets.right);
|
||||
}
|
||||
}
|
||||
|
||||
// Fill the parent (the Loader)
|
||||
anchors.fill: parent
|
||||
|
||||
@@ -266,26 +336,29 @@ Item {
|
||||
onClicked: root.triggerLastWidgetInSection("right")
|
||||
}
|
||||
|
||||
// Calculate margin to center widgets vertically within the bar height
|
||||
readonly property real verticalBarMargin: Math.round((root.barHeight - root.capsuleHeight) / 2)
|
||||
|
||||
// Top section (left widgets)
|
||||
ColumnLayout {
|
||||
x: Style.pixelAlignCenter(parent.width, width)
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: Style.marginS
|
||||
anchors.topMargin: verticalBarMargin
|
||||
spacing: Style.marginS
|
||||
|
||||
Repeater {
|
||||
model: root.filterValidWidgets(root.barWidgets.left)
|
||||
model: root.leftWidgetsModel
|
||||
delegate: BarWidgetLoader {
|
||||
required property var modelData
|
||||
required property var model
|
||||
required property int index
|
||||
|
||||
widgetId: modelData.id || ""
|
||||
widgetId: model.id || ""
|
||||
widgetScreen: root.screen
|
||||
widgetProps: ({
|
||||
"widgetId": modelData.id,
|
||||
"widgetId": model.id,
|
||||
"section": "left",
|
||||
"sectionWidgetIndex": index,
|
||||
"sectionWidgetsCount": root.barWidgets.left.length
|
||||
"sectionWidgetsCount": root.leftWidgetsModel.count
|
||||
})
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
@@ -299,18 +372,18 @@ Item {
|
||||
spacing: Style.marginS
|
||||
|
||||
Repeater {
|
||||
model: root.filterValidWidgets(root.barWidgets.center)
|
||||
model: root.centerWidgetsModel
|
||||
delegate: BarWidgetLoader {
|
||||
required property var modelData
|
||||
required property var model
|
||||
required property int index
|
||||
|
||||
widgetId: modelData.id || ""
|
||||
widgetId: model.id || ""
|
||||
widgetScreen: root.screen
|
||||
widgetProps: ({
|
||||
"widgetId": modelData.id,
|
||||
"widgetId": model.id,
|
||||
"section": "center",
|
||||
"sectionWidgetIndex": index,
|
||||
"sectionWidgetsCount": root.barWidgets.center.length
|
||||
"sectionWidgetsCount": root.centerWidgetsModel.count
|
||||
})
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
@@ -321,22 +394,22 @@ Item {
|
||||
ColumnLayout {
|
||||
x: Style.pixelAlignCenter(parent.width, width)
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.bottomMargin: Style.marginS
|
||||
anchors.bottomMargin: verticalBarMargin
|
||||
spacing: Style.marginS
|
||||
|
||||
Repeater {
|
||||
model: root.filterValidWidgets(root.barWidgets.right)
|
||||
model: root.rightWidgetsModel
|
||||
delegate: BarWidgetLoader {
|
||||
required property var modelData
|
||||
required property var model
|
||||
required property int index
|
||||
|
||||
widgetId: modelData.id || ""
|
||||
widgetId: model.id || ""
|
||||
widgetScreen: root.screen
|
||||
widgetProps: ({
|
||||
"widgetId": modelData.id,
|
||||
"widgetId": model.id,
|
||||
"section": "right",
|
||||
"sectionWidgetIndex": index,
|
||||
"sectionWidgetsCount": root.barWidgets.right.length
|
||||
"sectionWidgetsCount": root.rightWidgetsModel.count
|
||||
})
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
@@ -370,28 +443,31 @@ Item {
|
||||
onClicked: root.triggerLastWidgetInSection("right")
|
||||
}
|
||||
|
||||
// Calculate margin to center widgets horizontally within the bar height
|
||||
readonly property real horizontalBarMargin: Math.round((root.barHeight - root.capsuleHeight) / 2)
|
||||
|
||||
// Left Section
|
||||
RowLayout {
|
||||
id: leftSection
|
||||
objectName: "leftSection"
|
||||
anchors.left: parent.left
|
||||
anchors.leftMargin: Style.marginS
|
||||
anchors.leftMargin: horizontalBarMargin
|
||||
y: Style.pixelAlignCenter(parent.height, height)
|
||||
spacing: Style.marginS
|
||||
|
||||
Repeater {
|
||||
model: root.filterValidWidgets(root.barWidgets.left)
|
||||
model: root.leftWidgetsModel
|
||||
delegate: BarWidgetLoader {
|
||||
required property var modelData
|
||||
required property var model
|
||||
required property int index
|
||||
|
||||
widgetId: modelData.id || ""
|
||||
widgetId: model.id || ""
|
||||
widgetScreen: root.screen
|
||||
widgetProps: ({
|
||||
"widgetId": modelData.id,
|
||||
"widgetId": model.id,
|
||||
"section": "left",
|
||||
"sectionWidgetIndex": index,
|
||||
"sectionWidgetsCount": root.barWidgets.left.length
|
||||
"sectionWidgetsCount": root.leftWidgetsModel.count
|
||||
})
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
}
|
||||
@@ -407,18 +483,18 @@ Item {
|
||||
spacing: Style.marginS
|
||||
|
||||
Repeater {
|
||||
model: root.filterValidWidgets(root.barWidgets.center)
|
||||
model: root.centerWidgetsModel
|
||||
delegate: BarWidgetLoader {
|
||||
required property var modelData
|
||||
required property var model
|
||||
required property int index
|
||||
|
||||
widgetId: modelData.id || ""
|
||||
widgetId: model.id || ""
|
||||
widgetScreen: root.screen
|
||||
widgetProps: ({
|
||||
"widgetId": modelData.id,
|
||||
"widgetId": model.id,
|
||||
"section": "center",
|
||||
"sectionWidgetIndex": index,
|
||||
"sectionWidgetsCount": root.barWidgets.center.length
|
||||
"sectionWidgetsCount": root.centerWidgetsModel.count
|
||||
})
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
}
|
||||
@@ -430,23 +506,23 @@ Item {
|
||||
id: rightSection
|
||||
objectName: "rightSection"
|
||||
anchors.right: parent.right
|
||||
anchors.rightMargin: Style.marginS
|
||||
anchors.rightMargin: horizontalBarMargin
|
||||
y: Style.pixelAlignCenter(parent.height, height)
|
||||
spacing: Style.marginS
|
||||
|
||||
Repeater {
|
||||
model: root.filterValidWidgets(root.barWidgets.right)
|
||||
model: root.rightWidgetsModel
|
||||
delegate: BarWidgetLoader {
|
||||
required property var modelData
|
||||
required property var model
|
||||
required property int index
|
||||
|
||||
widgetId: modelData.id || ""
|
||||
widgetId: model.id || ""
|
||||
widgetScreen: root.screen
|
||||
widgetProps: ({
|
||||
"widgetId": modelData.id,
|
||||
"widgetId": model.id,
|
||||
"section": "right",
|
||||
"sectionWidgetIndex": index,
|
||||
"sectionWidgetsCount": root.barWidgets.right.length
|
||||
"sectionWidgetsCount": root.rightWidgetsModel.count
|
||||
})
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
}
|
||||
|
||||
@@ -12,8 +12,6 @@ import qs.Commons
|
||||
PanelWindow {
|
||||
id: root
|
||||
|
||||
property bool exclusive: Settings.data.bar.exclusive !== undefined ? Settings.data.bar.exclusive : false
|
||||
|
||||
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
|
||||
readonly property bool barIsVertical: barPosition === "left" || barPosition === "right"
|
||||
readonly property bool barFloating: Settings.data.bar.floating || false
|
||||
@@ -29,7 +27,7 @@ PanelWindow {
|
||||
// Wayland layer shell configuration
|
||||
WlrLayershell.layer: WlrLayer.Top
|
||||
WlrLayershell.namespace: "noctalia-bar-exclusion-" + (screen?.name || "unknown")
|
||||
WlrLayershell.exclusionMode: exclusive ? ExclusionMode.Auto : ExclusionMode.Ignore
|
||||
WlrLayershell.exclusionMode: ExclusionMode.Auto
|
||||
|
||||
// Anchor based on bar position
|
||||
anchors {
|
||||
@@ -67,7 +65,7 @@ PanelWindow {
|
||||
|
||||
Component.onCompleted: {
|
||||
Logger.d("BarExclusionZone", "Created for screen:", screen?.name);
|
||||
Logger.d("BarExclusionZone", " Position:", barPosition, "Exclusive:", exclusive, "Floating:", barFloating);
|
||||
Logger.d("BarExclusionZone", " Position:", barPosition, "Floating:", barFloating);
|
||||
Logger.d("BarExclusionZone", " Anchors - top:", anchors.top, "bottom:", anchors.bottom, "left:", anchors.left, "right:", anchors.right);
|
||||
Logger.d("BarExclusionZone", " Size:", width, "x", height, "implicitWidth:", implicitWidth, "implicitHeight:", implicitHeight);
|
||||
}
|
||||
|
||||
@@ -86,10 +86,10 @@ PopupWindow {
|
||||
if (menuRight > screenRight && menuLeft < screenRight) {
|
||||
// Clipping on right edge - shift left
|
||||
const overflow = menuRight - screenRight;
|
||||
return baseX - overflow - Style.marginM;
|
||||
return baseX - overflow - Style.marginS;
|
||||
} else if (menuLeft < 0 && menuRight > 0) {
|
||||
// Clipping on left edge - shift right
|
||||
return baseX - menuLeft + Style.marginM;
|
||||
return baseX - menuLeft + Style.marginS;
|
||||
}
|
||||
|
||||
return baseX;
|
||||
@@ -110,7 +110,11 @@ PopupWindow {
|
||||
|
||||
if (shouldApplyBottomBarLogic) {
|
||||
// For bottom bar from the bar itself, position menu above the anchor with margin
|
||||
baseY = -(implicitHeight + Style.marginL + 2);
|
||||
baseY = -(implicitHeight + Style.marginS);
|
||||
} else if (barPosition === "top" && !isSubMenu && anchorY >= 0) {
|
||||
// For top bar: position menu below bar with margin
|
||||
const barHeight = Style.getBarHeightForScreen(root.screen?.name);
|
||||
baseY = barHeight + Style.marginS;
|
||||
}
|
||||
|
||||
// Use a robust way to get screen coordinates
|
||||
@@ -128,25 +132,25 @@ PopupWindow {
|
||||
// Calculate the screen Y of the menu top
|
||||
// Use a small guess for height if implicitHeight is 0 to avoid covering the bar on the first frame
|
||||
const effectiveHeight = implicitHeight > 0 ? implicitHeight : 200;
|
||||
const effectiveBaseY = shouldApplyBottomBarLogic ? -(effectiveHeight + Style.marginL + 2) : baseY;
|
||||
const effectiveBaseY = shouldApplyBottomBarLogic ? -(effectiveHeight + Style.marginS) : baseY;
|
||||
|
||||
const menuScreenY = windowYOnScreen + posInWindow.y + effectiveBaseY;
|
||||
const menuBottom = menuScreenY + (implicitHeight > 0 ? implicitHeight : effectiveHeight);
|
||||
const screenHeight = screen ? screen.height : 1080;
|
||||
|
||||
// Adjust the final baseY (the actual value returned to anchor.rect.y)
|
||||
let finalBaseY = shouldApplyBottomBarLogic ? -(implicitHeight + Style.marginL + 2) : baseY;
|
||||
let finalBaseY = shouldApplyBottomBarLogic ? -(implicitHeight + Style.marginS) : baseY;
|
||||
|
||||
// Adjust if menu would clip off the bottom
|
||||
if (menuBottom > screenHeight) {
|
||||
const overflow = menuBottom - screenHeight;
|
||||
finalBaseY -= (overflow + Style.marginM);
|
||||
finalBaseY -= (overflow + Style.marginS);
|
||||
}
|
||||
|
||||
// Adjust if menu would clip off the top
|
||||
// menuScreenY < 0 means it's above the screen edge
|
||||
if (menuScreenY < 0) {
|
||||
finalBaseY -= (menuScreenY - Style.marginM);
|
||||
finalBaseY -= (menuScreenY - Style.marginS);
|
||||
}
|
||||
|
||||
return finalBaseY;
|
||||
|
||||
@@ -112,7 +112,7 @@ Item {
|
||||
|
||||
Loader {
|
||||
active: (labelMode !== "none") && (!showLabelsOnlyWhenOccupied || workspace.isOccupied || workspace.isFocused)
|
||||
anchors.centerIn: parent
|
||||
anchors.fill: parent
|
||||
sourceComponent: Component {
|
||||
NText {
|
||||
text: {
|
||||
@@ -137,6 +137,8 @@ Item {
|
||||
applyUiScale: false
|
||||
font.capitalization: Font.AllUppercase
|
||||
font.weight: Style.fontWeightBold
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
wrapMode: Text.Wrap
|
||||
color: {
|
||||
if (pillMouseArea.containsMouse)
|
||||
|
||||
@@ -195,7 +195,7 @@ Item {
|
||||
x: isVerticalBar ? Style.pixelAlignCenter(parent.width, width) : 0
|
||||
y: isVerticalBar ? 0 : Style.pixelAlignCenter(parent.height, height)
|
||||
width: isVerticalBar ? ((!hasFocusedWindow) && hideMode === "hidden" ? 0 : verticalSize) : ((!hasFocusedWindow) && (hideMode === "hidden") ? 0 : dynamicWidth)
|
||||
height: isVerticalBar ? ((!hasFocusedWindow) && hideMode === "hidden" ? 0 : verticalSize) : barHeight
|
||||
height: isVerticalBar ? ((!hasFocusedWindow) && hideMode === "hidden" ? 0 : verticalSize) : capsuleHeight
|
||||
radius: Style.radiusM
|
||||
color: Style.capsuleColor
|
||||
border.color: Style.capsuleBorderColor
|
||||
|
||||
@@ -40,10 +40,9 @@ Item {
|
||||
readonly property real warningThreshold: widgetSettings.warningThreshold !== undefined ? widgetSettings.warningThreshold : widgetMetadata.warningThreshold
|
||||
readonly property bool hideIfNotDetected: widgetSettings.hideIfNotDetected !== undefined ? widgetSettings.hideIfNotDetected : widgetMetadata.hideIfNotDetected
|
||||
readonly property bool hideIfIdle: widgetSettings.hideIfIdle !== undefined ? widgetSettings.hideIfIdle : widgetMetadata.hideIfIdle
|
||||
// Only show low battery warning if device is ready (prevents false positive during initialization)
|
||||
readonly property bool isLowBattery: isReady && (!isCharging && !isPluggedIn) && percent <= warningThreshold
|
||||
|
||||
// Visibility: show if hideIfNotDetected is false, or if battery is ready (after initialization)
|
||||
// Visibility: show if hideIfNotDetected is false, or if battery is ready
|
||||
readonly property bool shouldShow: !hideIfNotDetected || (isReady && (hideIfIdle ? (!isCharging && !isPluggedIn) : true))
|
||||
|
||||
// Test mode
|
||||
@@ -51,29 +50,33 @@ Item {
|
||||
readonly property int testPercent: 35
|
||||
readonly property bool testCharging: false
|
||||
readonly property bool testPluggedIn: false
|
||||
readonly property string deviceNativePath: widgetSettings.deviceNativePath || ""
|
||||
|
||||
readonly property var device: BatteryService.resolveDevice(deviceNativePath)
|
||||
readonly property var battery: device && !BatteryService.isBluetoothDevice(device) ? device : null
|
||||
readonly property var bluetoothDevice: device && BatteryService.isBluetoothDevice(device) ? device : null
|
||||
readonly property bool hasBluetoothBattery: BatteryService.isBluetoothDevice(device)
|
||||
readonly property string deviceNativePath: widgetSettings.deviceNativePath !== undefined ? widgetSettings.deviceNativePath : widgetMetadata.deviceNativePath
|
||||
readonly property var selectedBattery: BatteryService.findUPowerDevice(deviceNativePath)
|
||||
readonly property var selectedBluetoothDevice: BatteryService.findBluetoothDevice(deviceNativePath)
|
||||
readonly property var selectedDevice: {
|
||||
if (BatteryService.isDevicePresent(selectedBluetoothDevice)) {
|
||||
return selectedBluetoothDevice;
|
||||
}
|
||||
if (BatteryService.isDevicePresent(selectedBattery)) {
|
||||
return selectedBattery;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
readonly property bool isReady: testMode ? true : (BatteryService.ready && BatteryService.isDeviceReady(device))
|
||||
readonly property real percent: testMode ? testPercent : (isReady ? BatteryService.getPercentage(device) : 0)
|
||||
readonly property bool isCharging: testMode ? testCharging : (isReady ? BatteryService.isCharging(device) : false)
|
||||
readonly property bool isPluggedIn: testMode ? testPluggedIn : (isReady ? BatteryService.isPluggedIn(device) : false)
|
||||
// Check if selected device is actually present/connected
|
||||
readonly property bool isPresent: testMode ? true : BatteryService.isDevicePresent(selectedDevice)
|
||||
readonly property bool isReady: testMode ? true : BatteryService.isDeviceReady(selectedDevice)
|
||||
|
||||
readonly property real percent: testMode ? testPercent : (isReady ? Math.round(BatteryService.getPercentage(selectedDevice)) : -1)
|
||||
readonly property bool isCharging: testMode ? testCharging : (isReady ? BatteryService.isCharging(selectedDevice) : false)
|
||||
readonly property bool isPluggedIn: testMode ? testPluggedIn : (isReady ? BatteryService.isPluggedIn(selectedDevice) : false)
|
||||
|
||||
property bool hasNotifiedLowBattery: false
|
||||
|
||||
visible: shouldShow
|
||||
opacity: shouldShow ? 1.0 : 0.0
|
||||
|
||||
readonly property bool isDevicePresent: {
|
||||
if (testMode)
|
||||
return true;
|
||||
return BatteryService.isDevicePresent(device);
|
||||
}
|
||||
|
||||
implicitWidth: pill.width
|
||||
implicitHeight: pill.height
|
||||
|
||||
@@ -82,39 +85,31 @@ Item {
|
||||
hasNotifiedLowBattery = true;
|
||||
ToastService.showWarning(I18n.tr("toast.battery.low"), I18n.tr("toast.battery.low-desc", {
|
||||
"percent": Math.round(currentPercent)
|
||||
}));
|
||||
}), "battery-exclamation");
|
||||
} else if (hasNotifiedLowBattery && (charging || pluggedIn || currentPercent > warningThreshold + 5)) {
|
||||
hasNotifiedLowBattery = false;
|
||||
}
|
||||
}
|
||||
|
||||
function getCurrentPercent() {
|
||||
return BatteryService.getPercentage(device);
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: battery
|
||||
target: selectedDevice?.type === UPowerDeviceType.Battery ? selectedDevice : null
|
||||
|
||||
function onPercentageChanged() {
|
||||
if (battery) {
|
||||
maybeNotify(getCurrentPercent(), isCharging, isPluggedIn, isReady);
|
||||
}
|
||||
maybeNotify(BatteryService.getPercentage(selectedDevice), isCharging, isPluggedIn, isReady);
|
||||
}
|
||||
function onStateChanged() {
|
||||
if (battery) {
|
||||
if (isCharging || isPluggedIn) {
|
||||
hasNotifiedLowBattery = false;
|
||||
}
|
||||
maybeNotify(getCurrentPercent(), isCharging, isPluggedIn, isReady);
|
||||
if (isCharging || isPluggedIn) {
|
||||
hasNotifiedLowBattery = false;
|
||||
}
|
||||
maybeNotify(BatteryService.getPercentage(selectedDevice), isCharging, isPluggedIn, isReady);
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: bluetoothDevice
|
||||
target: selectedDevice?.batteryAvailable ? selectedDevice : null
|
||||
|
||||
function onBatteryChanged() {
|
||||
if (BatteryService.isDeviceReady(bluetoothDevice)) {
|
||||
maybeNotify(BatteryService.getPercentage(bluetoothDevice), BatteryService.isCharging(bluetoothDevice), BatteryService.isPluggedIn(bluetoothDevice), true);
|
||||
}
|
||||
maybeNotify(BatteryService.getPercentage(selectedDevice), isCharging, isPluggedIn, isReady);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,7 +136,6 @@ Item {
|
||||
|
||||
BarPill {
|
||||
id: pill
|
||||
|
||||
screen: root.screen
|
||||
oppositeDirection: BarService.getPillDirection(root)
|
||||
icon: testMode ? BatteryService.getIcon(testPercent, testCharging, testPluggedIn, true) : BatteryService.getIcon(percent, isCharging, isPluggedIn, isReady)
|
||||
@@ -149,47 +143,55 @@ Item {
|
||||
suffix: "%"
|
||||
autoHide: false
|
||||
forceOpen: isReady && displayMode === "alwaysShow"
|
||||
forceClose: displayMode === "alwaysHide" || (BatteryService.ready && !isReady)
|
||||
customBackgroundColor: !BatteryService.ready ? "transparent" : (isCharging ? Color.mPrimary : (isLowBattery ? Color.mError : "transparent"))
|
||||
customTextIconColor: !BatteryService.ready ? "transparent" : (isCharging ? Color.mOnPrimary : (isLowBattery ? Color.mOnError : "transparent"))
|
||||
forceClose: displayMode === "alwaysHide" || !isReady
|
||||
customBackgroundColor: isCharging ? Color.mPrimary : (isLowBattery ? Color.mError : "transparent")
|
||||
customTextIconColor: isCharging ? Color.mOnPrimary : (isLowBattery ? Color.mOnError : "transparent")
|
||||
|
||||
tooltipText: {
|
||||
let lines = [];
|
||||
if (testMode) {
|
||||
lines.push(`Time left: ${Time.formatVagueHumanReadableDuration(12345)}.`);
|
||||
lines.push("Time left: " + Time.formatVagueHumanReadableDuration(12345));
|
||||
return lines.join("\n");
|
||||
}
|
||||
if (!isReady || !isDevicePresent) {
|
||||
if (!isReady || !isPresent) {
|
||||
return I18n.tr("battery.no-battery-detected");
|
||||
}
|
||||
if (battery) {
|
||||
if (!isPluggedIn && battery.timeToEmpty > 0) {
|
||||
lines.push(I18n.tr("battery.time-left", {
|
||||
"time": Time.formatVagueHumanReadableDuration(battery.timeToEmpty)
|
||||
}));
|
||||
const isInternal = selectedDevice.type === UPowerDeviceType.Battery && BatteryService.isLaptopBattery;
|
||||
|
||||
if (isInternal) {
|
||||
let timeText = BatteryService.getTimeRemainingText(selectedDevice);
|
||||
if (timeText && timeText !== I18n.tr("common.idle") && timeText !== I18n.tr("battery.no-battery-detected") && timeText !== I18n.tr("battery.plugged-in")) {
|
||||
lines.push(timeText);
|
||||
}
|
||||
if (!isPluggedIn && battery.timeToFull > 0) {
|
||||
lines.push(I18n.tr("battery.time-until-full", {
|
||||
"time": Time.formatVagueHumanReadableDuration(battery.timeToFull)
|
||||
}));
|
||||
|
||||
let rateText = BatteryService.getRateText(selectedDevice);
|
||||
if (rateText) {
|
||||
lines.push(rateText);
|
||||
}
|
||||
if (battery.changeRate !== undefined) {
|
||||
const rate = Math.abs(battery.changeRate);
|
||||
if (isPluggedIn) {
|
||||
lines.push(I18n.tr("battery.plugged-in"));
|
||||
} else if (isCharging) {
|
||||
lines.push(I18n.tr("battery.charging-rate", {
|
||||
"rate": rate.toFixed(2)
|
||||
}));
|
||||
} else {
|
||||
lines.push(I18n.tr("battery.discharging-rate", {
|
||||
"rate": rate.toFixed(2)
|
||||
}));
|
||||
} else if (selectedDevice) {
|
||||
// External / Peripheral Device (Phone, Keyboard, Mouse, Gamepad, Headphone etc.)
|
||||
let name = BatteryService.getDeviceName(selectedDevice);
|
||||
let pct = Math.round(percent);
|
||||
lines.push(name + ": " + pct + suffix);
|
||||
}
|
||||
|
||||
// If we are showing the main laptop battery, append external devices
|
||||
if (isInternal) {
|
||||
var external = BatteryService.externalBatteries;
|
||||
if (external.length > 0) {
|
||||
if (lines.length > 0)
|
||||
lines.push(""); // Separator
|
||||
for (var j = 0; j < external.length; j++) {
|
||||
var dev = external[j];
|
||||
var dName = BatteryService.getDeviceName(dev);
|
||||
var dPct = Math.round(BatteryService.getPercentage(dev));
|
||||
lines.push(dName + ": " + dPct + suffix);
|
||||
}
|
||||
}
|
||||
}
|
||||
return lines.join("\n");
|
||||
}
|
||||
|
||||
onClicked: PanelService.getPanel("batteryPanel", screen)?.toggle(this)
|
||||
onRightClicked: {
|
||||
PanelService.showContextMenu(contextMenu, pill, screen);
|
||||
|
||||
@@ -37,11 +37,19 @@ NIconButton {
|
||||
readonly property bool hideWhenZeroUnread: (widgetSettings.hideWhenZeroUnread !== undefined) ? widgetSettings.hideWhenZeroUnread : widgetMetadata.hideWhenZeroUnread
|
||||
readonly property string unreadBadgeColor: (widgetSettings.unreadBadgeColor !== undefined) ? widgetSettings.unreadBadgeColor : (widgetMetadata.unreadBadgeColor || "primary")
|
||||
|
||||
readonly property var colorMap: {
|
||||
"primary": Color.mPrimary,
|
||||
"secondary": Color.mSecondary,
|
||||
"tertiary": Color.mTertiary,
|
||||
"onSurface": Color.mOnSurface
|
||||
function getColor(colorKey) {
|
||||
switch (colorKey) {
|
||||
case "primary":
|
||||
return Color.mPrimary;
|
||||
case "secondary":
|
||||
return Color.mSecondary;
|
||||
case "tertiary":
|
||||
return Color.mTertiary;
|
||||
case "onSurface":
|
||||
return Color.mOnSurface;
|
||||
default:
|
||||
return Color.mPrimary;
|
||||
}
|
||||
}
|
||||
|
||||
function computeUnreadCount() {
|
||||
@@ -130,7 +138,7 @@ NIconButton {
|
||||
height: 7
|
||||
width: height
|
||||
radius: Style.radiusXS
|
||||
color: root.colorMap[root.unreadBadgeColor] || Color.mError
|
||||
color: root.hovering ? Color.mOnHover : (root.getColor(root.unreadBadgeColor) || Color.mError)
|
||||
border.color: Color.mSurface
|
||||
border.width: Style.borderS
|
||||
visible: count > 0
|
||||
|
||||
@@ -43,6 +43,7 @@ Item {
|
||||
readonly property bool usePrimaryColor: widgetSettings.usePrimaryColor !== undefined ? widgetSettings.usePrimaryColor : widgetMetadata.usePrimaryColor
|
||||
readonly property bool useMonospaceFont: widgetSettings.useMonospaceFont !== undefined ? widgetSettings.useMonospaceFont : widgetMetadata.useMonospaceFont
|
||||
readonly property bool showCpuUsage: (widgetSettings.showCpuUsage !== undefined) ? widgetSettings.showCpuUsage : widgetMetadata.showCpuUsage
|
||||
readonly property bool showCpuFreq: (widgetSettings.showCpuFreq !== undefined) ? widgetSettings.showCpuFreq : widgetMetadata.showCpuFreq
|
||||
readonly property bool showCpuTemp: (widgetSettings.showCpuTemp !== undefined) ? widgetSettings.showCpuTemp : widgetMetadata.showCpuTemp
|
||||
readonly property bool showGpuTemp: (widgetSettings.showGpuTemp !== undefined) ? widgetSettings.showGpuTemp : widgetMetadata.showGpuTemp
|
||||
readonly property bool showMemoryUsage: (widgetSettings.showMemoryUsage !== undefined) ? widgetSettings.showMemoryUsage : widgetMetadata.showMemoryUsage
|
||||
@@ -74,46 +75,49 @@ Item {
|
||||
}
|
||||
|
||||
// Build comprehensive tooltip text with all stats
|
||||
function buildTooltipText() {
|
||||
let lines = [];
|
||||
function buildTooltipContent() {
|
||||
let rows = [];
|
||||
|
||||
// CPU
|
||||
lines.push(`${I18n.tr("system-monitor.cpu-usage")}: ${Math.round(SystemStatService.cpuUsage)}%`);
|
||||
rows.push([I18n.tr("system-monitor.cpu-usage"), `${Math.round(SystemStatService.cpuUsage)}% (${SystemStatService.cpuFreq})`]);
|
||||
|
||||
if (SystemStatService.cpuTemp > 0) {
|
||||
lines.push(`${I18n.tr("system-monitor.cpu-temp")}: ${Math.round(SystemStatService.cpuTemp)}°C`);
|
||||
rows.push([I18n.tr("system-monitor.cpu-temp"), `${Math.round(SystemStatService.cpuTemp)}°C`]);
|
||||
}
|
||||
|
||||
// GPU (if available)
|
||||
if (SystemStatService.gpuAvailable) {
|
||||
lines.push(`${I18n.tr("system-monitor.gpu-temp")}: ${Math.round(SystemStatService.gpuTemp)}°C`);
|
||||
rows.push([I18n.tr("system-monitor.gpu-temp"), `${Math.round(SystemStatService.gpuTemp)}°C`]);
|
||||
}
|
||||
|
||||
// Load Average
|
||||
if (SystemStatService.loadAvg1 >= 0) {
|
||||
lines.push(`${I18n.tr("system-monitor.load-average")}: ${SystemStatService.loadAvg1.toFixed(2)} · ${SystemStatService.loadAvg5.toFixed(2)} · ${SystemStatService.loadAvg15.toFixed(2)}`);
|
||||
rows.push([I18n.tr("system-monitor.load-average"), `${SystemStatService.loadAvg1.toFixed(2)} · ${SystemStatService.loadAvg5.toFixed(2)} · ${SystemStatService.loadAvg15.toFixed(2)}`]);
|
||||
}
|
||||
|
||||
// Memory
|
||||
lines.push(`${I18n.tr("common.memory")}: ${Math.round(SystemStatService.memPercent)}% (${SystemStatService.formatGigabytes(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"})`);
|
||||
rows.push([I18n.tr("common.memory"), `${Math.round(SystemStatService.memPercent)}% (${SystemStatService.formatMemoryGb(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"})`]);
|
||||
|
||||
// Swap (if available)
|
||||
if (SystemStatService.swapTotalGb > 0) {
|
||||
lines.push(`${I18n.tr("bar.system-monitor.swap-usage-label")}: ${Math.round(SystemStatService.swapPercent)}% (${SystemStatService.formatGigabytes(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"})`);
|
||||
rows.push([I18n.tr("bar.system-monitor.swap-usage-label"), `${Math.round(SystemStatService.swapPercent)}% (${SystemStatService.formatMemoryGb(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"})`]);
|
||||
}
|
||||
|
||||
// Network
|
||||
lines.push(`${I18n.tr("system-monitor.download-speed")}: ${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
|
||||
lines.push(`${I18n.tr("system-monitor.upload-speed")}: ${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
|
||||
rows.push([I18n.tr("system-monitor.download-speed"), `${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"]);
|
||||
rows.push([I18n.tr("system-monitor.upload-speed"), `${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"]);
|
||||
|
||||
// Disk
|
||||
const diskPercent = SystemStatService.diskPercents[diskPath];
|
||||
if (diskPercent !== undefined) {
|
||||
const usedGb = SystemStatService.diskUsedGb[diskPath] || 0;
|
||||
const sizeGb = SystemStatService.diskSizeGb[diskPath] || 0;
|
||||
lines.push(`${I18n.tr("system-monitor.disk")}: ${usedGb.toFixed(1)} GB / ${sizeGb.toFixed(1)} GB (${diskPercent}%)`);
|
||||
const availGb = SystemStatService.diskAvailGb[diskPath] || 0;
|
||||
rows.push([I18n.tr("system-monitor.disk"), `${diskPercent}% (${usedGb.toFixed(1)} / ${sizeGb.toFixed(1)} GB)`]);
|
||||
rows.push([I18n.tr("common.available"), `${availGb.toFixed(1)} GB`]);
|
||||
}
|
||||
|
||||
return lines.join("\n");
|
||||
return rows;
|
||||
}
|
||||
|
||||
readonly property color textColor: usePrimaryColor ? Color.mPrimary : Color.mOnSurface
|
||||
@@ -282,6 +286,74 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
// CPU Frequency Component
|
||||
Item {
|
||||
id: cpuFreqContainer
|
||||
implicitWidth: cpuFreqContent.implicitWidth
|
||||
implicitHeight: cpuFreqContent.implicitHeight
|
||||
Layout.preferredWidth: isVertical ? root.width : implicitWidth
|
||||
Layout.preferredHeight: compactMode ? implicitHeight : capsuleHeight
|
||||
Layout.alignment: isVertical ? Qt.AlignHCenter : Qt.AlignVCenter
|
||||
visible: showCpuFreq && (!isVertical || compactMode)
|
||||
|
||||
GridLayout {
|
||||
id: cpuFreqContent
|
||||
anchors.centerIn: parent
|
||||
flow: (isVertical && !compactMode) ? GridLayout.TopToBottom : GridLayout.LeftToRight
|
||||
rows: (isVertical && !compactMode) ? 2 : 1
|
||||
columns: (isVertical && !compactMode) ? 1 : 2
|
||||
rowSpacing: Style.marginXXS
|
||||
columnSpacing: compactMode ? 3 : Style.marginXS
|
||||
|
||||
Item {
|
||||
Layout.preferredWidth: iconSize
|
||||
Layout.preferredHeight: (compactMode || isVertical) ? iconSize : capsuleHeight
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.row: (isVertical && !compactMode) ? 1 : 0
|
||||
Layout.column: 0
|
||||
|
||||
NIcon {
|
||||
icon: "cpu-usage"
|
||||
pointSize: iconSize
|
||||
applyUiScale: false
|
||||
x: Style.pixelAlignCenter(parent.width, width)
|
||||
y: Style.pixelAlignCenter(parent.height, contentHeight)
|
||||
color: Color.mOnSurface
|
||||
}
|
||||
}
|
||||
|
||||
// Text mode
|
||||
NText {
|
||||
visible: !compactMode
|
||||
text: SystemStatService.cpuFreq.replace(" ", "")
|
||||
family: fontFamily
|
||||
pointSize: barFontSize
|
||||
applyUiScale: false
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
color: textColor
|
||||
Layout.row: isVertical ? 0 : 0
|
||||
Layout.column: isVertical ? 0 : 1
|
||||
}
|
||||
|
||||
// Compact mode
|
||||
Loader {
|
||||
active: compactMode
|
||||
visible: compactMode
|
||||
sourceComponent: miniGaugeComponent
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
Layout.row: 0
|
||||
Layout.column: 1
|
||||
|
||||
onLoaded: {
|
||||
item.ratio = Qt.binding(() => SystemStatService.cpuFreqRatio);
|
||||
item.statColor = Qt.binding(() => Color.mPrimary);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CPU Temperature Component
|
||||
Item {
|
||||
id: cpuTempContainer
|
||||
@@ -845,7 +917,7 @@ Item {
|
||||
}
|
||||
}
|
||||
onEntered: {
|
||||
TooltipService.show(root, buildTooltipText(), BarService.getTooltipDirection(root.screen?.name));
|
||||
TooltipService.show(root, buildTooltipContent(), BarService.getTooltipDirection(root.screen?.name));
|
||||
tooltipRefreshTimer.start();
|
||||
}
|
||||
onExited: {
|
||||
@@ -860,7 +932,7 @@ Item {
|
||||
repeat: true
|
||||
onTriggered: {
|
||||
if (tooltipArea.containsMouse) {
|
||||
TooltipService.updateText(buildTooltipText());
|
||||
TooltipService.updateText(buildTooltipContent());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -395,9 +395,9 @@ Item {
|
||||
Logger.d("Taskbar", "Executing terminal app manually: " + app.name);
|
||||
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
|
||||
const command = terminal.concat(app.command);
|
||||
Quickshell.execDetached(command);
|
||||
CompositorService.spawn(command);
|
||||
} else if (app.command && app.command.length > 0) {
|
||||
Quickshell.execDetached(app.command);
|
||||
CompositorService.spawn(app.command);
|
||||
} else if (app.execute) {
|
||||
app.execute();
|
||||
} else {
|
||||
@@ -607,7 +607,7 @@ Item {
|
||||
|
||||
return Math.round(calculatedWidth);
|
||||
}
|
||||
readonly property real contentHeight: visible ? (isVerticalBar ? Math.round(taskbarLayout.implicitHeight + Style.marginS * 2) : barHeight) : 0
|
||||
readonly property real contentHeight: visible ? (isVerticalBar ? Math.round(taskbarLayout.implicitHeight + Style.marginS * 2) : capsuleHeight) : 0
|
||||
|
||||
implicitWidth: contentWidth
|
||||
implicitHeight: contentHeight
|
||||
@@ -786,7 +786,7 @@ Item {
|
||||
visible: shouldShowTitle
|
||||
anchors.centerIn: parent
|
||||
width: parent.width
|
||||
height: root.barHeight
|
||||
height: root.capsuleHeight
|
||||
color: titleBgColor
|
||||
radius: Style.radiusM
|
||||
|
||||
@@ -985,6 +985,7 @@ Item {
|
||||
// Set the model directly
|
||||
contextMenu.model = items;
|
||||
|
||||
PanelService.showContextMenu(contextMenu, item, screen);
|
||||
// Anchor to root (stable) but center horizontally on the clicked item
|
||||
PanelService.showContextMenu(contextMenu, root, screen, item);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -289,11 +289,13 @@ Item {
|
||||
}
|
||||
|
||||
// Content dimensions for implicit sizing
|
||||
readonly property real capsuleWidth: isVertical ? capsuleHeight : Math.round(trayFlow.implicitWidth)
|
||||
readonly property real capsuleContentHeight: isVertical ? Math.round(trayFlow.implicitHeight) : capsuleHeight
|
||||
readonly property int visibleItemCount: (root.drawerEnabled && dropdownItems.length > 0 ? 1 : 0) + filteredItems.length
|
||||
readonly property real capsulePadding: 0
|
||||
readonly property real capsuleWidth: isVertical ? capsuleHeight : Math.round(trayFlow.implicitWidth + capsulePadding * 2)
|
||||
readonly property real capsuleContentHeight: isVertical ? Math.round(trayFlow.implicitHeight + capsulePadding * 2) : capsuleHeight
|
||||
|
||||
implicitWidth: isVertical ? barHeight : Math.round(trayFlow.implicitWidth)
|
||||
implicitHeight: isVertical ? Math.round(trayFlow.implicitHeight) : barHeight
|
||||
implicitWidth: isVertical ? barHeight : Math.round(trayFlow.implicitWidth + capsulePadding * 2)
|
||||
implicitHeight: isVertical ? Math.round(trayFlow.implicitHeight + capsulePadding * 2) : barHeight
|
||||
visible: filteredItems.length > 0 || dropdownItems.length > 0
|
||||
opacity: (filteredItems.length > 0 || dropdownItems.length > 0) ? 1.0 : 0.0
|
||||
|
||||
@@ -312,12 +314,11 @@ Item {
|
||||
|
||||
Flow {
|
||||
id: trayFlow
|
||||
spacing: Style.marginXS
|
||||
spacing: 0
|
||||
flow: isVertical ? Flow.TopToBottom : Flow.LeftToRight
|
||||
|
||||
// Position at edge for full click area
|
||||
x: isVertical ? 0 : 0
|
||||
y: isVertical ? 0 : 0
|
||||
// Position centered in capsule
|
||||
anchors.centerIn: visualCapsule
|
||||
|
||||
// Drawer opener (before items if opposite direction)
|
||||
NIconButton {
|
||||
@@ -429,10 +430,23 @@ Item {
|
||||
}
|
||||
|
||||
MouseArea {
|
||||
id: itemMouseArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
|
||||
onContainsMouseChanged: {
|
||||
if (containsMouse) {
|
||||
if (popupMenuWindow) {
|
||||
popupMenuWindow.close();
|
||||
}
|
||||
root.hoveredItemIndex = trayDelegate.index;
|
||||
TooltipService.show(tooltipAnchor, modelData.tooltipTitle || modelData.name || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name));
|
||||
} else if (root.hoveredItemIndex === trayDelegate.index) {
|
||||
root.hoveredItemIndex = -1;
|
||||
TooltipService.hide(tooltipAnchor);
|
||||
}
|
||||
}
|
||||
onClicked: mouse => {
|
||||
if (!modelData) {
|
||||
return;
|
||||
@@ -485,7 +499,7 @@ Item {
|
||||
} else {
|
||||
// For horizontal bars: center horizontally and position below visual area
|
||||
menuX = (tooltipAnchor.width / 2) - (trayMenu.item.implicitWidth / 2);
|
||||
menuY = tooltipAnchor.height + Style.marginL;
|
||||
menuY = tooltipAnchor.height + Style.marginS;
|
||||
}
|
||||
|
||||
PanelService.showTrayMenu(root.screen, modelData, trayMenu.item, tooltipAnchor, menuX, menuY, root.section, root.sectionWidgetIndex);
|
||||
@@ -498,17 +512,6 @@ Item {
|
||||
}
|
||||
}
|
||||
}
|
||||
onEntered: {
|
||||
if (popupMenuWindow) {
|
||||
popupMenuWindow.close();
|
||||
}
|
||||
root.hoveredItemIndex = trayDelegate.index;
|
||||
TooltipService.show(tooltipAnchor, modelData.tooltipTitle || modelData.name || modelData.id || "Tray Item", BarService.getTooltipDirection(root.screen?.name));
|
||||
}
|
||||
onExited: {
|
||||
root.hoveredItemIndex = -1;
|
||||
TooltipService.hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,7 +297,8 @@ Item {
|
||||
const screenName = screen.name.toLowerCase();
|
||||
for (var i = 0; i < CompositorService.workspaces.count; i++) {
|
||||
const ws = CompositorService.workspaces.get(i);
|
||||
const matchesScreen = (followFocusedScreen && ws.output.toLowerCase() == focusedOutput) || (!followFocusedScreen && ws.output.toLowerCase() == screenName);
|
||||
// For global workspaces (e.g., LabWC), show all workspaces on all screens
|
||||
const matchesScreen = CompositorService.globalWorkspaces || (followFocusedScreen && ws.output.toLowerCase() == focusedOutput) || (!followFocusedScreen && ws.output.toLowerCase() == screenName);
|
||||
|
||||
if (!matchesScreen)
|
||||
continue;
|
||||
@@ -913,6 +914,7 @@ Item {
|
||||
}
|
||||
|
||||
function openGroupedContextMenu(item) {
|
||||
PanelService.showContextMenu(contextMenu, item, screen);
|
||||
// Anchor to root (stable) but center horizontally on the clicked item
|
||||
PanelService.showContextMenu(contextMenu, root, screen, item);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -294,6 +294,7 @@ NBox {
|
||||
shadowOpacity: 0.9
|
||||
shadowHorizontalOffset: 0
|
||||
shadowVerticalOffset: 0
|
||||
shadowColor: Settings.data.colorSchemes.darkMode ? "black" : "white"
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
|
||||
@@ -83,9 +83,7 @@ Variants {
|
||||
var metadata = DesktopWidgetRegistry.widgetMetadata[widgetId];
|
||||
if (metadata) {
|
||||
Object.keys(metadata).forEach(function (key) {
|
||||
if (key !== "allowUserSettings") {
|
||||
newWidget[key] = metadata[key];
|
||||
}
|
||||
newWidget[key] = metadata[key];
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -117,23 +117,7 @@ Item {
|
||||
if (widgetIndex < 0 || !screen || !screen.name) {
|
||||
return;
|
||||
}
|
||||
|
||||
var monitorWidgets = Settings.data.desktopWidgets.monitorWidgets || [];
|
||||
var newMonitorWidgets = monitorWidgets.slice();
|
||||
|
||||
for (var i = 0; i < newMonitorWidgets.length; i++) {
|
||||
if (newMonitorWidgets[i].name === screen.name) {
|
||||
var widgets = (newMonitorWidgets[i].widgets || []).slice();
|
||||
if (widgetIndex < widgets.length) {
|
||||
widgets[widgetIndex] = Object.assign({}, widgets[widgetIndex], properties);
|
||||
newMonitorWidgets[i] = Object.assign({}, newMonitorWidgets[i], {
|
||||
"widgets": widgets
|
||||
});
|
||||
Settings.data.desktopWidgets.monitorWidgets = newMonitorWidgets;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
DesktopWidgetRegistry.updateWidgetData(screen.name, widgetIndex, properties);
|
||||
}
|
||||
|
||||
function removeWidget() {
|
||||
@@ -208,79 +192,7 @@ Item {
|
||||
}
|
||||
|
||||
function openWidgetSettings() {
|
||||
if (!widgetData || !widgetData.id || !screen) {
|
||||
return;
|
||||
}
|
||||
|
||||
var widgetId = widgetData.id;
|
||||
var hasSettings = false;
|
||||
|
||||
// Check if widget has settings
|
||||
if (DesktopWidgetRegistry.isPluginWidget(widgetId)) {
|
||||
var pluginId = widgetId.replace("plugin:", "");
|
||||
var manifest = PluginRegistry.getPluginManifest(pluginId);
|
||||
if (manifest && manifest.entryPoints && manifest.entryPoints.settings) {
|
||||
hasSettings = true;
|
||||
}
|
||||
} else {
|
||||
hasSettings = DesktopWidgetRegistry.widgetSettingsMap[widgetId] !== undefined;
|
||||
}
|
||||
|
||||
if (!hasSettings) {
|
||||
Logger.w("DraggableDesktopWidget", "Widget does not have settings:", widgetId);
|
||||
return;
|
||||
}
|
||||
|
||||
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
|
||||
if (!popupMenuWindow) {
|
||||
Logger.e("DraggableDesktopWidget", "No popup menu window found for screen");
|
||||
return;
|
||||
}
|
||||
|
||||
// Hide the dynamic context menu (popup window stays open for the dialog)
|
||||
if (popupMenuWindow.hideDynamicMenu) {
|
||||
popupMenuWindow.hideDynamicMenu();
|
||||
}
|
||||
|
||||
var component = Qt.createComponent(Quickshell.shellDir + "/Modules/Panels/Settings/DesktopWidgets/DesktopWidgetSettingsDialog.qml");
|
||||
|
||||
function instantiateAndOpen() {
|
||||
var dialog = component.createObject(popupMenuWindow.dialogParent, {
|
||||
"widgetIndex": widgetIndex,
|
||||
"widgetData": widgetData,
|
||||
"widgetId": widgetId,
|
||||
"sectionId": screen.name
|
||||
});
|
||||
|
||||
if (dialog) {
|
||||
dialog.updateWidgetSettings.connect((sec, idx, settings) => {
|
||||
root.updateWidgetData(settings);
|
||||
});
|
||||
popupMenuWindow.hasDialog = true;
|
||||
dialog.closed.connect(() => {
|
||||
popupMenuWindow.hasDialog = false;
|
||||
popupMenuWindow.close();
|
||||
dialog.destroy();
|
||||
});
|
||||
dialog.open();
|
||||
} else {
|
||||
Logger.e("DraggableDesktopWidget", "Failed to create widget settings dialog");
|
||||
}
|
||||
}
|
||||
|
||||
if (component.status === Component.Ready) {
|
||||
instantiateAndOpen();
|
||||
} else if (component.status === Component.Error) {
|
||||
Logger.e("DraggableDesktopWidget", "Error loading settings dialog component:", component.errorString());
|
||||
} else {
|
||||
component.statusChanged.connect(() => {
|
||||
if (component.status === Component.Ready) {
|
||||
instantiateAndOpen();
|
||||
} else if (component.status === Component.Error) {
|
||||
Logger.e("DraggableDesktopWidget", "Error loading settings dialog component:", component.errorString());
|
||||
}
|
||||
});
|
||||
}
|
||||
DesktopWidgetRegistry.openWidgetSettings(screen, widgetIndex, widgetData.id, widgetData);
|
||||
}
|
||||
|
||||
function handleContextMenuAction(action) {
|
||||
|
||||
@@ -82,12 +82,10 @@ DraggableDesktopWidget {
|
||||
z: 0
|
||||
clip: true
|
||||
active: shouldShowVisualizer
|
||||
layer.enabled: root.roundedCorners
|
||||
layer.enabled: true
|
||||
layer.smooth: true
|
||||
layer.effect: MultiEffect {
|
||||
maskEnabled: true
|
||||
maskThresholdMin: 0.95
|
||||
maskSpreadAtMin: 0.15
|
||||
maskEnabled: root.roundedCorners
|
||||
maskSource: ShaderEffectSource {
|
||||
sourceItem: Rectangle {
|
||||
width: root.width - Math.round(Style.marginXS * widgetScale) * 2
|
||||
@@ -117,7 +115,7 @@ DraggableDesktopWidget {
|
||||
anchors.fill: parent
|
||||
values: CavaService.values
|
||||
fillColor: Color.mPrimary
|
||||
opacity: 1.0
|
||||
opacity: 0.5
|
||||
}
|
||||
}
|
||||
|
||||
@@ -127,7 +125,7 @@ DraggableDesktopWidget {
|
||||
anchors.fill: parent
|
||||
values: CavaService.values
|
||||
fillColor: Color.mPrimary
|
||||
opacity: 1.0
|
||||
opacity: 0.5
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,7 +135,7 @@ DraggableDesktopWidget {
|
||||
anchors.fill: parent
|
||||
values: CavaService.values
|
||||
fillColor: Color.mPrimary
|
||||
opacity: 1.0
|
||||
opacity: 0.5
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,276 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import Quickshell
|
||||
import qs.Commons
|
||||
import qs.Modules.DesktopWidgets
|
||||
import qs.Services.System
|
||||
import qs.Services.UI
|
||||
import qs.Widgets
|
||||
|
||||
DraggableDesktopWidget {
|
||||
id: root
|
||||
|
||||
// Widget settings
|
||||
readonly property var widgetMetadata: DesktopWidgetRegistry.widgetMetadata["SystemStat"]
|
||||
readonly property string statType: (widgetData && widgetData.statType !== undefined) ? widgetData.statType : (widgetMetadata.statType !== undefined ? widgetMetadata.statType : "CPU")
|
||||
readonly property string diskPath: (widgetData && widgetData.diskPath !== undefined) ? widgetData.diskPath : "/"
|
||||
readonly property color color: (widgetData && widgetData.color !== undefined) ? widgetData.color : Color.mPrimary
|
||||
readonly property string layout: (widgetData && widgetData.layout !== undefined) ? widgetData.layout : (widgetMetadata.layout !== undefined ? widgetMetadata.layout : "side")
|
||||
|
||||
// Legend items model - each item has: text, color, icon (optional), bold (optional), opacity (optional), elide (optional)
|
||||
readonly property var legendItems: {
|
||||
switch (root.statType) {
|
||||
case "CPU":
|
||||
return [
|
||||
{
|
||||
icon: "cpu-usage",
|
||||
text: Math.round(SystemStatService.cpuUsage) + "%",
|
||||
color: root.color
|
||||
},
|
||||
{
|
||||
text: "cpu-usage",
|
||||
text: SystemStatService.cpuFreq,
|
||||
color: root.color,
|
||||
opacity: 0.8
|
||||
},
|
||||
{
|
||||
icon: "cpu-temperature",
|
||||
text: SystemStatService.cpuTemp + "°C",
|
||||
color: Color.mError
|
||||
}
|
||||
];
|
||||
case "GPU":
|
||||
return [
|
||||
{
|
||||
icon: "gpu-temperature",
|
||||
text: Math.round(SystemStatService.gpuTemp) + "°C",
|
||||
color: root.color
|
||||
}
|
||||
];
|
||||
case "Memory":
|
||||
return [
|
||||
{
|
||||
icon: "memory",
|
||||
text: Math.round(SystemStatService.memPercent) + "%",
|
||||
color: root.color
|
||||
}
|
||||
];
|
||||
case "Disk":
|
||||
var items = [
|
||||
{
|
||||
icon: "storage",
|
||||
text: Math.round(SystemStatService.diskPercents[root.diskPath] || 0) + "%",
|
||||
color: root.color
|
||||
}
|
||||
];
|
||||
if (root.diskPath !== "/") {
|
||||
items.push({
|
||||
text: root.diskPath,
|
||||
color: root.color,
|
||||
opacity: 0.8,
|
||||
elide: true
|
||||
});
|
||||
}
|
||||
return items;
|
||||
case "Network":
|
||||
return [
|
||||
{
|
||||
icon: "download-speed",
|
||||
text: SystemStatService.formatSpeed(SystemStatService.rxSpeed),
|
||||
color: root.color
|
||||
},
|
||||
{
|
||||
icon: "upload-speed",
|
||||
text: SystemStatService.formatSpeed(SystemStatService.txSpeed),
|
||||
color: Color.mError
|
||||
}
|
||||
];
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
// History from service
|
||||
readonly property var history: {
|
||||
switch (root.statType) {
|
||||
case "CPU":
|
||||
return SystemStatService.cpuHistory;
|
||||
case "GPU":
|
||||
return SystemStatService.gpuTempHistory;
|
||||
case "Memory":
|
||||
return SystemStatService.memHistory;
|
||||
case "Disk":
|
||||
return SystemStatService.diskHistories[root.diskPath] || [];
|
||||
case "Network":
|
||||
return SystemStatService.rxSpeedHistory;
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
// Secondary history (CPU temp for CPU, Tx for Network)
|
||||
readonly property var history2: {
|
||||
switch (root.statType) {
|
||||
case "CPU":
|
||||
return SystemStatService.cpuTempHistory;
|
||||
case "Network":
|
||||
return SystemStatService.txSpeedHistory;
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
// Graph min/max values
|
||||
readonly property real graphMinValue: root.statType === "GPU" ? SystemStatService.gpuTempHistoryMin : 0
|
||||
readonly property real graphMaxValue: {
|
||||
switch (root.statType) {
|
||||
case "CPU":
|
||||
return Math.max(SystemStatService.cpuHistoryMax, 1);
|
||||
case "GPU":
|
||||
return Math.max(SystemStatService.gpuTempHistoryMax, 1);
|
||||
case "Memory":
|
||||
return Math.max(SystemStatService.memHistoryMax, 1);
|
||||
case "Network":
|
||||
return Math.max(SystemStatService.rxMaxSpeed, 1);
|
||||
default:
|
||||
return 100;
|
||||
}
|
||||
}
|
||||
readonly property real graphMinValue2: {
|
||||
switch (root.statType) {
|
||||
case "CPU":
|
||||
return SystemStatService.cpuTempHistoryMin;
|
||||
default:
|
||||
return graphMinValue;
|
||||
}
|
||||
}
|
||||
readonly property real graphMaxValue2: {
|
||||
switch (root.statType) {
|
||||
case "CPU":
|
||||
return Math.max(SystemStatService.cpuTempHistoryMax, 1);
|
||||
case "Network":
|
||||
return Math.max(SystemStatService.txMaxSpeed, 1);
|
||||
default:
|
||||
return graphMaxValue;
|
||||
}
|
||||
}
|
||||
|
||||
implicitWidth: Math.round(240 * widgetScale)
|
||||
implicitHeight: Math.round(120 * widgetScale)
|
||||
width: implicitWidth
|
||||
height: implicitHeight
|
||||
|
||||
// Graph component (shared between layouts)
|
||||
Component {
|
||||
id: graphComponent
|
||||
NGraph {
|
||||
values: root.history
|
||||
values2: root.history2
|
||||
minValue: root.graphMinValue
|
||||
maxValue: root.graphMaxValue
|
||||
minValue2: root.graphMinValue2
|
||||
maxValue2: root.graphMaxValue2
|
||||
color: root.color
|
||||
color2: Color.mError
|
||||
fill: true
|
||||
}
|
||||
}
|
||||
|
||||
// Side layout: icon + legend on left, graph on right
|
||||
RowLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: Math.round(Style.marginL * widgetScale)
|
||||
spacing: Math.round(Style.marginL * widgetScale)
|
||||
visible: root.layout === "side"
|
||||
|
||||
ColumnLayout {
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
Layout.fillHeight: true
|
||||
Layout.preferredWidth: Math.round(64 * widgetScale)
|
||||
spacing: Style.marginXS * root.widgetScale
|
||||
|
||||
Repeater {
|
||||
model: root.legendItems
|
||||
delegate: RowLayout {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
spacing: Math.round(Style.marginXXS * root.widgetScale)
|
||||
|
||||
NIcon {
|
||||
visible: !!modelData.icon
|
||||
icon: modelData.icon || ""
|
||||
color: modelData.color
|
||||
pointSize: Style.fontSizeS * root.widgetScale
|
||||
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
|
||||
}
|
||||
|
||||
NText {
|
||||
text: modelData.text
|
||||
color: modelData.color
|
||||
pointSize: Style.fontSizeS * root.widgetScale
|
||||
font.family: Settings.data.ui.fontFixed
|
||||
font.weight: modelData.bold ? Style.fontWeightBold : Style.fontWeightRegular
|
||||
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
|
||||
elide: modelData.elide ? Text.ElideMiddle : Text.ElideNone
|
||||
Layout.maximumWidth: modelData.elide ? Math.round(56 * root.widgetScale) : -1
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loader {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
sourceComponent: graphComponent
|
||||
}
|
||||
}
|
||||
|
||||
// Bottom layout: full-width graph, horizontal legend at bottom
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: Math.round(Style.marginL * widgetScale)
|
||||
spacing: Math.round(Style.marginS * widgetScale)
|
||||
visible: root.layout === "bottom"
|
||||
|
||||
Loader {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
sourceComponent: graphComponent
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
spacing: Math.round(Style.marginM * widgetScale)
|
||||
|
||||
Repeater {
|
||||
model: root.legendItems
|
||||
delegate: RowLayout {
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
spacing: Math.round(Style.marginXXS * root.widgetScale)
|
||||
|
||||
NIcon {
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
visible: !!modelData.icon
|
||||
icon: modelData.icon || ""
|
||||
color: modelData.color
|
||||
pointSize: Style.fontSizeS * root.widgetScale
|
||||
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
|
||||
}
|
||||
|
||||
NText {
|
||||
Layout.alignment: Qt.AlignVCenter
|
||||
text: modelData.text
|
||||
color: modelData.color
|
||||
pointSize: Style.fontSizeS * root.widgetScale
|
||||
font.family: Settings.data.ui.fontFixed
|
||||
font.weight: modelData.bold ? Style.fontWeightBold : Style.fontWeightRegular
|
||||
opacity: modelData.opacity !== undefined ? modelData.opacity : 1.0
|
||||
elide: modelData.elide ? Text.ElideMiddle : Text.ElideNone
|
||||
Layout.maximumWidth: modelData.elide ? Math.round(56 * root.widgetScale) : -1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+74
-20
@@ -6,6 +6,7 @@ import Quickshell
|
||||
import Quickshell.Wayland
|
||||
import Quickshell.Widgets
|
||||
import qs.Commons
|
||||
import qs.Services.Compositor
|
||||
import qs.Services.System
|
||||
import qs.Services.UI
|
||||
import qs.Widgets
|
||||
@@ -77,6 +78,8 @@ Loader {
|
||||
readonly property int peekHeight: 1
|
||||
readonly property int iconSize: Math.round(12 + 24 * (Settings.data.dock.size ?? 1))
|
||||
readonly property int floatingMargin: Settings.data.dock.floatingRatio * Style.marginL
|
||||
readonly property int maxWidth: modelData ? modelData.width * 0.8 : 1000
|
||||
readonly property int maxHeight: modelData ? modelData.height * 0.8 : 1000
|
||||
|
||||
// Dock position properties
|
||||
readonly property string dockPosition: Settings.data.dock.position
|
||||
@@ -531,8 +534,8 @@ Loader {
|
||||
WlrLayershell.namespace: "noctalia-dock-" + (screen?.name || "unknown")
|
||||
WlrLayershell.exclusionMode: exclusive ? ExclusionMode.Auto : ExclusionMode.Ignore
|
||||
|
||||
implicitWidth: Math.round(dockContainerWrapper.width + (root.isVertical ? 0 : Style.marginXL * 6))
|
||||
implicitHeight: Math.round(dockContainerWrapper.height)
|
||||
implicitWidth: dockContainerWrapper.width
|
||||
implicitHeight: dockContainerWrapper.height
|
||||
|
||||
// Position based on dock setting
|
||||
anchors.top: dockPosition === "top"
|
||||
@@ -595,8 +598,8 @@ Loader {
|
||||
Rectangle {
|
||||
id: dockContainer
|
||||
// For vertical dock, swap width and height logic
|
||||
width: isVertical ? Math.round(iconSize * 1.5) : dockLayout.implicitWidth + Style.marginXL
|
||||
height: isVertical ? dockLayout.implicitHeight + Style.marginXL : Math.round(iconSize * 1.5)
|
||||
width: isVertical ? Math.round(iconSize * 1.5) : Math.min(dockLayout.implicitWidth + Style.marginXL, root.maxWidth)
|
||||
height: isVertical ? Math.min(dockLayout.implicitHeight + Style.marginXL, root.maxHeight) : Math.round(iconSize * 1.5)
|
||||
color: Qt.alpha(Color.mSurface, Settings.data.dock.backgroundOpacity)
|
||||
|
||||
// Anchor based on padding to achieve centering shift
|
||||
@@ -643,12 +646,48 @@ Loader {
|
||||
}
|
||||
}
|
||||
|
||||
Item {
|
||||
Flickable {
|
||||
id: dock
|
||||
// Swap dimensions based on orientation
|
||||
width: isVertical ? parent.width - (Style.marginXL) : dockLayout.implicitWidth
|
||||
height: isVertical ? dockLayout.implicitHeight : parent.height - (Style.marginXL)
|
||||
// Use parent dimensions more directly to avoid clipping
|
||||
width: isVertical ? parent.width : Math.min(dockLayout.implicitWidth, parent.width - Style.marginXL)
|
||||
height: !isVertical ? parent.height : Math.min(dockLayout.implicitHeight, parent.height - Style.marginXL)
|
||||
contentWidth: dockLayout.implicitWidth
|
||||
contentHeight: dockLayout.implicitHeight
|
||||
anchors.centerIn: parent
|
||||
clip: true
|
||||
|
||||
flickableDirection: isVertical ? Flickable.VerticalFlick : Flickable.HorizontalFlick
|
||||
|
||||
// Keep interactive dependent on overflow
|
||||
interactive: isVertical ? contentHeight > height : contentWidth > width
|
||||
|
||||
// Centering margins
|
||||
contentX: isVertical && contentWidth < width ? (contentWidth - width) / 2 : 0
|
||||
contentY: !isVertical && contentHeight < height ? (contentHeight - height) / 2 : 0
|
||||
|
||||
WheelHandler {
|
||||
acceptedDevices: PointerDevice.Mouse | PointerDevice.TouchPad
|
||||
onWheel: event => {
|
||||
var delta = (event.angleDelta.y !== 0) ? event.angleDelta.y : event.angleDelta.x;
|
||||
if (root.isVertical) {
|
||||
dock.contentY = Math.max(-dock.topMargin, Math.min(dock.contentHeight - dock.height + dock.bottomMargin, dock.contentY - delta));
|
||||
} else {
|
||||
// For horizontal dock, we want to scroll contentX with BOTH x and y wheels
|
||||
var hDelta = (event.angleDelta.x !== 0) ? event.angleDelta.x : event.angleDelta.y;
|
||||
dock.contentX = Math.max(-dock.leftMargin, Math.min(dock.contentWidth - dock.width + dock.rightMargin, dock.contentX - hDelta));
|
||||
}
|
||||
event.accepted = true;
|
||||
}
|
||||
}
|
||||
|
||||
ScrollBar.horizontal: ScrollBar {
|
||||
visible: !isVertical && dock.interactive
|
||||
policy: ScrollBar.AsNeeded
|
||||
}
|
||||
ScrollBar.vertical: ScrollBar {
|
||||
visible: isVertical && dock.interactive
|
||||
policy: ScrollBar.AsNeeded
|
||||
}
|
||||
|
||||
function getAppIcon(appData): string {
|
||||
if (!appData || !appData.appId)
|
||||
@@ -663,15 +702,19 @@ Loader {
|
||||
rows: isVertical ? -1 : 1
|
||||
rowSpacing: Style.marginS
|
||||
columnSpacing: Style.marginS
|
||||
anchors.centerIn: parent
|
||||
|
||||
// Ensure the layout takes its full implicit size
|
||||
width: implicitWidth
|
||||
height: implicitHeight
|
||||
|
||||
Repeater {
|
||||
model: dockApps
|
||||
|
||||
delegate: Item {
|
||||
id: appButton
|
||||
Layout.preferredWidth: iconSize
|
||||
Layout.preferredHeight: iconSize
|
||||
readonly property real indicatorMargin: Math.max(3, Math.round(iconSize * 0.18))
|
||||
Layout.preferredWidth: isVertical ? iconSize + indicatorMargin * 2 : iconSize
|
||||
Layout.preferredHeight: isVertical ? iconSize : iconSize + indicatorMargin * 2
|
||||
Layout.alignment: Qt.AlignCenter
|
||||
|
||||
property bool isActive: modelData.toplevel && ToplevelManager.activeToplevel && ToplevelManager.activeToplevel === modelData.toplevel
|
||||
@@ -909,7 +952,6 @@ Loader {
|
||||
// Only allow left-click dragging via axis control
|
||||
drag.target: iconContainer
|
||||
drag.axis: (pressedButtons & Qt.LeftButton) ? (root.isVertical ? Drag.YAxis : Drag.XAxis) : Drag.None
|
||||
preventStealing: true
|
||||
|
||||
onPressed: {
|
||||
var p1 = appButton.mapFromItem(dockContainer, 0, 0);
|
||||
@@ -1012,13 +1054,12 @@ Loader {
|
||||
} else {
|
||||
// Fallback logic when app2unit is not used
|
||||
if (app.runInTerminal) {
|
||||
// If app.execute() fails for terminal apps, we handle it manually.
|
||||
Logger.d("Dock", "Executing terminal app manually: " + app.name);
|
||||
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
|
||||
const command = terminal.concat(app.command);
|
||||
Quickshell.execDetached(command);
|
||||
CompositorService.spawn(command);
|
||||
} else if (app.command && app.command.length > 0) {
|
||||
Quickshell.execDetached(app.command);
|
||||
CompositorService.spawn(app.command);
|
||||
} else if (app.execute) {
|
||||
app.execute();
|
||||
} else {
|
||||
@@ -1030,15 +1071,28 @@ Loader {
|
||||
}
|
||||
}
|
||||
|
||||
// Active indicator - always below the icon
|
||||
// Active indicator - positioned at the edge of the delegate area
|
||||
Rectangle {
|
||||
visible: Settings.data.dock.inactiveIndicators ? isRunning : isActive
|
||||
width: iconSize * 0.2
|
||||
height: iconSize * 0.1
|
||||
width: isVertical ? indicatorMargin * 0.6 : iconSize * 0.2
|
||||
height: isVertical ? iconSize * 0.2 : indicatorMargin * 0.6
|
||||
color: Color.mPrimary
|
||||
radius: Style.radiusXS
|
||||
anchors.top: parent.bottom
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
|
||||
// Anchor to the edge facing the screen center
|
||||
anchors.bottom: !isVertical && dockPosition === "bottom" ? parent.bottom : undefined
|
||||
anchors.top: !isVertical && dockPosition === "top" ? parent.top : undefined
|
||||
anchors.left: isVertical && dockPosition === "left" ? parent.left : undefined
|
||||
anchors.right: isVertical && dockPosition === "right" ? parent.right : undefined
|
||||
|
||||
anchors.horizontalCenter: isVertical ? undefined : parent.horizontalCenter
|
||||
anchors.verticalCenter: isVertical ? parent.verticalCenter : undefined
|
||||
|
||||
// Offset slightly from the edge
|
||||
anchors.bottomMargin: !isVertical && dockPosition === "bottom" ? 2 : 0
|
||||
anchors.topMargin: !isVertical && dockPosition === "top" ? 2 : 0
|
||||
anchors.leftMargin: isVertical && dockPosition === "left" ? 2 : 0
|
||||
anchors.rightMargin: isVertical && dockPosition === "right" ? 2 : 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,11 +78,11 @@ Loader {
|
||||
Item {
|
||||
id: batteryIndicator
|
||||
|
||||
property bool isReady: BatteryService.ready && BatteryService.batteryReady
|
||||
property bool isReady: BatteryService.batteryReady
|
||||
property real percent: BatteryService.batteryPercentage
|
||||
property bool charging: BatteryService.batteryCharging
|
||||
property bool pluggedIn: BatteryService.batteryPluggedIn
|
||||
property bool batteryVisible: isReady && percent >= 0 && BatteryService.hasAnyBattery()
|
||||
property bool batteryVisible: isReady && BatteryService.hasAnyBattery()
|
||||
}
|
||||
|
||||
Item {
|
||||
|
||||
@@ -102,9 +102,12 @@ Rectangle {
|
||||
"fr": "dddd d MMMM",
|
||||
"hu": "dddd, MMMM d.",
|
||||
"ja": "yyyy年M月d日 dddd",
|
||||
"ko": "yyyy년 M월 d일 dddd",
|
||||
"ku": "dddd, dê MMMM",
|
||||
"nl": "dddd d MMMM",
|
||||
"nn": "dddd d. MMMM",
|
||||
"pt": "dddd, d 'de' MMMM",
|
||||
"sv": "dddd d MMMM",
|
||||
"zh": "yyyy年M月d日 dddd"
|
||||
};
|
||||
var dateString = I18n.locale.toString(Time.now, formats[lang] || "dddd, d MMMM");
|
||||
|
||||
@@ -75,6 +75,32 @@ Variants {
|
||||
}
|
||||
}
|
||||
|
||||
// BarTriggerZone - thin invisible zone to reveal hidden bar
|
||||
// Always loaded when auto-hide is enabled (it's just 1px, no performance impact)
|
||||
Loader {
|
||||
active: {
|
||||
if (!parent.windowLoaded || !parent.shouldBeActive)
|
||||
return false;
|
||||
if (!BarService.effectivelyVisible)
|
||||
return false;
|
||||
if (Settings.data.bar.displayMode !== "auto_hide")
|
||||
return false;
|
||||
|
||||
// Check if bar is configured for this screen
|
||||
var monitors = Settings.data.bar.monitors || [];
|
||||
return monitors.length === 0 || monitors.includes(modelData?.name);
|
||||
}
|
||||
asynchronous: false
|
||||
|
||||
sourceComponent: BarTriggerZone {
|
||||
screen: modelData
|
||||
}
|
||||
|
||||
onLoaded: {
|
||||
Logger.d("AllScreens", "BarTriggerZone created for", modelData?.name);
|
||||
}
|
||||
}
|
||||
|
||||
// BarExclusionZone - created after MainScreen has fully loaded
|
||||
// Disabled when bar is hidden or not configured for this screen
|
||||
Repeater {
|
||||
@@ -102,9 +128,15 @@ Variants {
|
||||
}
|
||||
|
||||
// PopupMenuWindow - reusable popup window for both tray menus and context menus
|
||||
// Disabled when bar is hidden or not configured for this screen
|
||||
// Active when bar is visible on this screen, OR when desktop widgets edit mode is active
|
||||
Loader {
|
||||
active: {
|
||||
// Desktop widgets edit mode needs popup window on ALL screens
|
||||
if (DesktopWidgetRegistry.editMode && Settings.data.desktopWidgets.enabled) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Normal bar-based condition
|
||||
if (!parent.windowLoaded || !parent.shouldBeActive || !BarService.effectivelyVisible)
|
||||
return false;
|
||||
|
||||
|
||||
@@ -103,9 +103,20 @@ ShapePath {
|
||||
readonly property real blMultY: bar ? ShapeCornerHelper.getMultY(bar.bottomLeftCornerState) : 1
|
||||
readonly property real blRadius: bar ? getCornerRadius(bar.bottomLeftCornerState) : 0
|
||||
|
||||
// Auto-hide opacity factor for background fade
|
||||
property real opacityFactor: (bar && bar.isHidden) ? 0 : 1
|
||||
|
||||
Behavior on opacityFactor {
|
||||
enabled: bar && bar.autoHide
|
||||
NumberAnimation {
|
||||
duration: Style.animationFast
|
||||
easing.type: Easing.OutQuad
|
||||
}
|
||||
}
|
||||
|
||||
// ShapePath configuration
|
||||
strokeWidth: -1 // No stroke, fill only
|
||||
fillColor: backgroundColor
|
||||
fillColor: Qt.rgba(backgroundColor.r, backgroundColor.g, backgroundColor.b, backgroundColor.a * opacityFactor)
|
||||
fillRule: isFramed ? ShapePath.OddEvenFill : ShapePath.WindingFill
|
||||
|
||||
// Starting position
|
||||
|
||||
@@ -20,6 +20,9 @@ PanelWindow {
|
||||
// Note: screen property is inherited from PanelWindow and should be set by parent
|
||||
color: "transparent" // Transparent - background is in MainScreen below
|
||||
|
||||
// Make window pass-through when content is unloaded
|
||||
visible: contentLoaded
|
||||
|
||||
Component.onCompleted: {
|
||||
Logger.d("BarContentWindow", "Bar content window created for screen:", barWindow.screen?.name);
|
||||
}
|
||||
@@ -39,6 +42,100 @@ PanelWindow {
|
||||
readonly property real barMarginV: Math.ceil(barFloating ? Settings.data.bar.marginVertical : 0)
|
||||
readonly property real barHeight: Style.getBarHeightForScreen(barWindow.screen?.name)
|
||||
|
||||
// Auto-hide properties
|
||||
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
|
||||
readonly property int hideDelay: Settings.data.bar.autoHideDelay || 500
|
||||
readonly property int showDelay: Settings.data.bar.autoShowDelay || 100
|
||||
property bool isHidden: false
|
||||
|
||||
// Hover tracking
|
||||
property bool barHovered: false
|
||||
|
||||
// Check if any panel is open on this screen
|
||||
readonly property bool panelOpen: PanelService.openedPanel !== null
|
||||
|
||||
// Timer for delayed hide
|
||||
Timer {
|
||||
id: hideTimer
|
||||
interval: barWindow.hideDelay
|
||||
onTriggered: {
|
||||
if (barWindow.autoHide && !barWindow.barHovered && !barWindow.panelOpen && !BarService.popupOpen) {
|
||||
BarService.setScreenHidden(barWindow.screen?.name, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Timer for delayed show
|
||||
Timer {
|
||||
id: showTimer
|
||||
interval: barWindow.showDelay
|
||||
onTriggered: {
|
||||
// Only show if still hovered (via trigger zone or bar itself)
|
||||
if (barWindow.autoHide && BarService.isBarHovered(barWindow.screen?.name)) {
|
||||
BarService.setScreenHidden(barWindow.screen?.name, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// React to auto-hide state changes from BarService
|
||||
Connections {
|
||||
target: BarService
|
||||
function onBarAutoHideStateChanged(screenName, hidden) {
|
||||
Logger.d("BarContentWindow", "onBarAutoHideStateChanged:", screenName, hidden, "my screen:", barWindow.screen?.name);
|
||||
if (screenName === barWindow.screen?.name) {
|
||||
barWindow.isHidden = hidden;
|
||||
}
|
||||
}
|
||||
function onBarHoverStateChanged(screenName, hovered) {
|
||||
if (screenName === barWindow.screen?.name && barWindow.autoHide) {
|
||||
if (hovered) {
|
||||
hideTimer.stop();
|
||||
// If bar is already visible, no need to delay
|
||||
if (!barWindow.isHidden) {
|
||||
showTimer.stop();
|
||||
} else {
|
||||
// Bar is hidden, use show delay
|
||||
showTimer.restart();
|
||||
}
|
||||
} else if (!barWindow.barHovered && !barWindow.panelOpen) {
|
||||
showTimer.stop();
|
||||
hideTimer.restart();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Don't hide when panel is open
|
||||
onPanelOpenChanged: {
|
||||
if (panelOpen && autoHide) {
|
||||
hideTimer.stop();
|
||||
BarService.setScreenHidden(barWindow.screen?.name, false);
|
||||
} else if (!panelOpen && autoHide && !barHovered) {
|
||||
hideTimer.restart();
|
||||
}
|
||||
}
|
||||
|
||||
// React to popup menu closing
|
||||
Connections {
|
||||
target: BarService
|
||||
function onPopupOpenChanged() {
|
||||
if (!BarService.popupOpen && barWindow.autoHide && !barWindow.barHovered && !barWindow.panelOpen) {
|
||||
hideTimer.restart();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// React to displayMode changes
|
||||
onAutoHideChanged: {
|
||||
if (!autoHide) {
|
||||
// Show bar when auto-hide is disabled
|
||||
hideTimer.stop();
|
||||
showTimer.stop();
|
||||
barWindow.isHidden = false;
|
||||
}
|
||||
// When auto-hide is enabled, don't immediately hide - wait for mouse to leave
|
||||
}
|
||||
|
||||
// Anchor to the bar's edge
|
||||
anchors {
|
||||
top: barPosition === "top" || barIsVertical
|
||||
@@ -47,6 +144,35 @@ PanelWindow {
|
||||
right: barPosition === "right" || !barIsVertical
|
||||
}
|
||||
|
||||
// Track if content should be loaded (stays true during fade-out animation)
|
||||
property bool contentLoaded: !isHidden
|
||||
|
||||
// Timer to delay unload until after fade animation
|
||||
Timer {
|
||||
id: unloadTimer
|
||||
interval: Style.animationFast + 50
|
||||
onTriggered: {
|
||||
// Only unload if still hidden AND not about to show (prevents unload/reload race)
|
||||
if (barWindow.isHidden && !showTimer.running) {
|
||||
// Clear hover state before unloading to prevent issues during destruction
|
||||
barWindow.barHovered = false;
|
||||
barWindow.contentLoaded = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// When hidden changes, handle load/unload
|
||||
onIsHiddenChanged: {
|
||||
if (isHidden) {
|
||||
// Start fade out, then unload after animation
|
||||
unloadTimer.restart();
|
||||
} else {
|
||||
// Load immediately when showing
|
||||
unloadTimer.stop();
|
||||
contentLoaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Handle floating margins and framed mode offsets
|
||||
margins {
|
||||
top: (barPosition === "top") ? barMarginV : (isFramed ? frameThickness : barMarginV)
|
||||
@@ -59,9 +185,57 @@ PanelWindow {
|
||||
implicitWidth: barIsVertical ? barHeight : barWindow.screen.width
|
||||
implicitHeight: barIsVertical ? barWindow.screen.height : barHeight
|
||||
|
||||
// Bar content - just the widgets, no background
|
||||
Bar {
|
||||
// Bar content loader - unloads when hidden to prevent input
|
||||
Loader {
|
||||
id: barLoader
|
||||
anchors.fill: parent
|
||||
screen: barWindow.screen
|
||||
active: barWindow.contentLoaded
|
||||
|
||||
sourceComponent: Item {
|
||||
anchors.fill: parent
|
||||
|
||||
// Fade animation
|
||||
opacity: barWindow.isHidden ? 0 : 1
|
||||
|
||||
Behavior on opacity {
|
||||
enabled: barWindow.autoHide
|
||||
NumberAnimation {
|
||||
duration: Style.animationFast
|
||||
easing.type: Easing.OutQuad
|
||||
}
|
||||
}
|
||||
|
||||
Bar {
|
||||
id: barContent
|
||||
anchors.fill: parent
|
||||
screen: barWindow.screen
|
||||
|
||||
// Hover detection using HoverHandler (doesn't block child hover events)
|
||||
HoverHandler {
|
||||
id: hoverHandler
|
||||
|
||||
onHoveredChanged: {
|
||||
if (hovered) {
|
||||
barWindow.barHovered = true;
|
||||
BarService.setScreenHovered(barWindow.screen?.name, true);
|
||||
if (barWindow.autoHide) {
|
||||
hideTimer.stop();
|
||||
showTimer.restart();
|
||||
}
|
||||
} else {
|
||||
// Skip if already hidden (being destroyed)
|
||||
if (barWindow.isHidden)
|
||||
return;
|
||||
barWindow.barHovered = false;
|
||||
BarService.setScreenHovered(barWindow.screen?.name, false);
|
||||
if (barWindow.autoHide && !barWindow.panelOpen) {
|
||||
showTimer.stop();
|
||||
hideTimer.restart();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@ PanelWindow {
|
||||
property string edge: Settings.getBarPositionForScreen(screen?.name)
|
||||
property real thickness: (edge === Settings.getBarPositionForScreen(screen?.name)) ? Style.getBarHeightForScreen(screen?.name) : (Settings.data.bar.frameThickness ?? 12)
|
||||
|
||||
readonly property bool exclusive: Settings.data.bar.exclusive
|
||||
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
|
||||
readonly property bool barFloating: Settings.data.bar.floating || false
|
||||
readonly property real barMarginH: (barFloating && edge === Settings.getBarPositionForScreen(screen?.name)) ? Math.ceil(Settings.data.bar.marginHorizontal) : 0
|
||||
readonly property real barMarginV: (barFloating && edge === Settings.getBarPositionForScreen(screen?.name)) ? Math.ceil(Settings.data.bar.marginVertical) : 0
|
||||
@@ -31,7 +31,8 @@ PanelWindow {
|
||||
// Wayland layer shell configuration
|
||||
WlrLayershell.layer: WlrLayer.Top
|
||||
WlrLayershell.namespace: "noctalia-bar-exclusion-" + edge + "-" + (screen?.name || "unknown")
|
||||
WlrLayershell.exclusionMode: exclusive ? ExclusionMode.Auto : ExclusionMode.Ignore
|
||||
// When auto-hide is enabled, never reserve space
|
||||
WlrLayershell.exclusionMode: autoHide ? ExclusionMode.Ignore : ExclusionMode.Auto
|
||||
|
||||
// Anchor based on specified edge
|
||||
anchors {
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Wayland
|
||||
import qs.Commons
|
||||
import qs.Services.UI
|
||||
|
||||
/**
|
||||
* BarTriggerZone - Thin invisible window at screen edge to reveal hidden bar
|
||||
*
|
||||
* This window is only active when the bar is in auto-hide mode and hidden.
|
||||
* When the mouse enters this zone, it triggers the bar to show.
|
||||
*/
|
||||
PanelWindow {
|
||||
id: root
|
||||
|
||||
readonly property string barPosition: Settings.getBarPositionForScreen(screen?.name)
|
||||
readonly property bool barIsVertical: barPosition === "left" || barPosition === "right"
|
||||
readonly property int triggerSize: 1
|
||||
|
||||
// Track if component is being destroyed to prevent signals during cleanup
|
||||
property bool isBeingDestroyed: false
|
||||
Component.onDestruction: isBeingDestroyed = true
|
||||
|
||||
// Invisible trigger zone
|
||||
color: "transparent"
|
||||
focusable: false
|
||||
|
||||
WlrLayershell.namespace: "noctalia-bar-trigger-" + (screen?.name || "unknown")
|
||||
WlrLayershell.layer: WlrLayer.Top
|
||||
WlrLayershell.exclusionMode: ExclusionMode.Ignore
|
||||
|
||||
// Anchor to bar's edge
|
||||
anchors {
|
||||
top: barPosition === "top" || barIsVertical
|
||||
bottom: barPosition === "bottom" || barIsVertical
|
||||
left: barPosition === "left" || !barIsVertical
|
||||
right: barPosition === "right" || !barIsVertical
|
||||
}
|
||||
|
||||
// Size based on orientation - thin strip at edge
|
||||
implicitWidth: barIsVertical ? triggerSize : 0
|
||||
implicitHeight: !barIsVertical ? triggerSize : 0
|
||||
|
||||
MouseArea {
|
||||
id: triggerArea
|
||||
anchors.fill: parent
|
||||
hoverEnabled: true
|
||||
|
||||
onEntered: {
|
||||
if (root.isBeingDestroyed)
|
||||
return;
|
||||
// Signal hover - BarContentWindow will handle the show delay
|
||||
BarService.setScreenHovered(root.screen?.name, true);
|
||||
}
|
||||
|
||||
onExited: {
|
||||
if (root.isBeingDestroyed)
|
||||
return;
|
||||
BarService.setScreenHovered(root.screen?.name, false);
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
Logger.d("BarTriggerZone", "Created for screen:", screen?.name);
|
||||
}
|
||||
}
|
||||
@@ -375,6 +375,19 @@ PanelWindow {
|
||||
readonly property real barMarginV: barFloating ? Math.floor(Settings.data.bar.marginVertical) : 0
|
||||
readonly property real barHeight: Style.getBarHeightForScreen(screen?.name)
|
||||
|
||||
// Auto-hide properties (read by AllBackgrounds for background fade)
|
||||
readonly property bool autoHide: Settings.data.bar.displayMode === "auto_hide"
|
||||
property bool isHidden: false
|
||||
|
||||
Connections {
|
||||
target: BarService
|
||||
function onBarAutoHideStateChanged(screenName, hidden) {
|
||||
if (screenName === barPlaceholder.screen?.name) {
|
||||
barPlaceholder.isHidden = hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Expose bar dimensions directly on this Item for BarBackground
|
||||
// Use screen dimensions directly
|
||||
x: {
|
||||
|
||||
@@ -85,6 +85,7 @@ PanelWindow {
|
||||
|
||||
function open() {
|
||||
visible = true;
|
||||
BarService.popupOpen = true;
|
||||
}
|
||||
|
||||
// Show a context menu (temporarily replaces TrayMenu as content)
|
||||
@@ -126,6 +127,7 @@ PanelWindow {
|
||||
|
||||
function close() {
|
||||
visible = false;
|
||||
BarService.popupOpen = false;
|
||||
// Call close/hide method on current content
|
||||
if (contentItem) {
|
||||
if (typeof contentItem.hideMenu === "function") {
|
||||
|
||||
+12
-1
@@ -180,7 +180,9 @@ Variants {
|
||||
root.currentBrightness = newBrightness;
|
||||
// Don't show OSD if brightness panel is open
|
||||
var brightnessPanel = PanelService.getPanel("brightnessPanel", root.modelData);
|
||||
if (brightnessPanel && brightnessPanel.isPanelOpen) {
|
||||
var controlCenterPanel = PanelService.getPanel("controlCenterPanel", root.modelData);
|
||||
|
||||
if ((brightnessPanel && brightnessPanel.isPanelOpen) || (controlCenterPanel && controlCenterPanel.isPanelOpen)) {
|
||||
return;
|
||||
}
|
||||
showOSD(OSD.Type.Brightness);
|
||||
@@ -205,6 +207,15 @@ Variants {
|
||||
if (!isTypeEnabled(type))
|
||||
return;
|
||||
|
||||
// Suppress Audio OSD if Audio Panel or Control Center is open
|
||||
if (type === OSD.Type.Volume || type === OSD.Type.InputVolume) {
|
||||
var audioPanel = PanelService.getPanel("audioPanel", root.modelData);
|
||||
var controlCenterPanel = PanelService.getPanel("controlCenterPanel", root.modelData);
|
||||
if ((audioPanel && audioPanel.isPanelOpen) || (controlCenterPanel && controlCenterPanel.isPanelOpen)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
currentOSDType = type;
|
||||
|
||||
if (!root.active) {
|
||||
|
||||
@@ -146,130 +146,7 @@ SmartPanel {
|
||||
// Find application streams that are actually playing audio (connected to default sink)
|
||||
// Use linkGroups to find nodes connected to the default audio sink
|
||||
// Note: We need to use link IDs since source/target properties require binding
|
||||
readonly property var appStreams: {
|
||||
if (!Pipewire.ready || !AudioService.sink) {
|
||||
return [];
|
||||
}
|
||||
|
||||
var defaultSink = AudioService.sink;
|
||||
var defaultSinkId = defaultSink.id;
|
||||
var connectedStreamIds = {};
|
||||
var connectedStreams = [];
|
||||
|
||||
// Use PwNodeLinkTracker to get properly bound link groups
|
||||
if (!sinkLinkTracker.linkGroups) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Check if linkGroups is an array or ObjectModel
|
||||
var linkGroupsCount = 0;
|
||||
if (sinkLinkTracker.linkGroups.length !== undefined) {
|
||||
linkGroupsCount = sinkLinkTracker.linkGroups.length;
|
||||
} else if (sinkLinkTracker.linkGroups.count !== undefined) {
|
||||
linkGroupsCount = sinkLinkTracker.linkGroups.count;
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (linkGroupsCount === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
// Collect intermediate node IDs that are connected to the sink
|
||||
var intermediateNodeIds = {};
|
||||
|
||||
// Process link groups from sinkLinkTracker
|
||||
var nodesToCheck = [];
|
||||
|
||||
for (var i = 0; i < linkGroupsCount; i++) {
|
||||
var linkGroup;
|
||||
if (sinkLinkTracker.linkGroups.get) {
|
||||
linkGroup = sinkLinkTracker.linkGroups.get(i);
|
||||
} else {
|
||||
linkGroup = sinkLinkTracker.linkGroups[i];
|
||||
}
|
||||
|
||||
if (!linkGroup || !linkGroup.source) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var sourceNode = linkGroup.source;
|
||||
|
||||
// If it's a stream node, add it directly
|
||||
if (sourceNode.isStream && sourceNode.audio) {
|
||||
if (!connectedStreamIds[sourceNode.id]) {
|
||||
connectedStreamIds[sourceNode.id] = true;
|
||||
connectedStreams.push(sourceNode);
|
||||
}
|
||||
} else {
|
||||
// Not a stream - this is an intermediate node, track it
|
||||
intermediateNodeIds[sourceNode.id] = true;
|
||||
nodesToCheck.push(sourceNode);
|
||||
}
|
||||
}
|
||||
|
||||
// If we found intermediate nodes, we need to find streams connected to them
|
||||
// Since Pipewire.linkGroups is not directly accessible, we'll use a heuristic:
|
||||
// When intermediate nodes are present, include all active stream nodes
|
||||
// (reasonable assumption: if audio is playing, streams are connected)
|
||||
if (nodesToCheck.length > 0 || connectedStreams.length === 0) {
|
||||
try {
|
||||
// Get all nodes from Pipewire
|
||||
var allNodes = [];
|
||||
if (Pipewire.nodes) {
|
||||
if (Pipewire.nodes.count !== undefined) {
|
||||
var nodeCount = Pipewire.nodes.count;
|
||||
for (var n = 0; n < nodeCount; n++) {
|
||||
var node;
|
||||
if (Pipewire.nodes.get) {
|
||||
node = Pipewire.nodes.get(n);
|
||||
} else {
|
||||
node = Pipewire.nodes[n];
|
||||
}
|
||||
if (node)
|
||||
allNodes.push(node);
|
||||
}
|
||||
} else if (Pipewire.nodes.values) {
|
||||
allNodes = Pipewire.nodes.values;
|
||||
}
|
||||
}
|
||||
|
||||
// Find all stream nodes
|
||||
for (var j = 0; j < allNodes.length; j++) {
|
||||
var node = allNodes[j];
|
||||
if (!node || !node.isStream || !node.audio) {
|
||||
continue;
|
||||
}
|
||||
|
||||
var streamId = node.id;
|
||||
if (connectedStreamIds[streamId]) {
|
||||
continue; // Already added
|
||||
}
|
||||
|
||||
// When intermediate nodes are present, include all stream nodes
|
||||
// This is a reasonable heuristic since if audio is playing, they're likely connected
|
||||
if (Object.keys(intermediateNodeIds).length > 0) {
|
||||
connectedStreamIds[streamId] = true;
|
||||
connectedStreams.push(node);
|
||||
} else if (connectedStreams.length === 0) {
|
||||
// Fallback: if no streams found yet, include as fallback
|
||||
connectedStreamIds[streamId] = true;
|
||||
connectedStreams.push(node);
|
||||
}
|
||||
}
|
||||
} catch (e)
|
||||
// Error finding stream nodes - continue with what we have
|
||||
{}
|
||||
}
|
||||
|
||||
return connectedStreams;
|
||||
}
|
||||
|
||||
// Track links to the default sink using PwNodeLinkTracker (properly binds links)
|
||||
PwNodeLinkTracker {
|
||||
id: sinkLinkTracker
|
||||
node: AudioService.sink
|
||||
}
|
||||
readonly property var appStreams: AudioService.appStreams
|
||||
|
||||
// Use implicitHeight from content + margins to avoid binding loops
|
||||
property real contentPreferredHeight: mainColumn.implicitHeight + Style.marginL * 2
|
||||
|
||||
@@ -25,43 +25,75 @@ SmartPanel {
|
||||
id: panelContent
|
||||
property real contentPreferredHeight: mainLayout.implicitHeight + Style.marginL * 2
|
||||
|
||||
// Get device selection from Battery widget settings (check right section first, then any Battery widget)
|
||||
function getBatteryDevicePath() {
|
||||
var widget = BarService.lookupWidget("Battery");
|
||||
if (widget !== undefined && widget.deviceNativePath !== undefined) {
|
||||
return widget.deviceNativePath;
|
||||
readonly property string deviceNativePath: resolveWidgetSetting("deviceNativePath", "__default__")
|
||||
readonly property var selectedBattery: BatteryService.findUPowerDevice(deviceNativePath)
|
||||
readonly property var selectedBluetoothDevice: BatteryService.findBluetoothDevice(deviceNativePath)
|
||||
readonly property var selectedDevice: {
|
||||
if (BatteryService.isDevicePresent(selectedBluetoothDevice)) {
|
||||
return selectedBluetoothDevice;
|
||||
}
|
||||
return "";
|
||||
if (BatteryService.isDevicePresent(selectedBattery)) {
|
||||
return selectedBattery;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
readonly property string deviceNativePath: getBatteryDevicePath()
|
||||
|
||||
// Use the centralized helper to find the specific device or fallback to primary
|
||||
readonly property var selectedDevice: BatteryService.resolveDevice(deviceNativePath)
|
||||
|
||||
// Check if selected device is actually present/connected
|
||||
readonly property bool isDevicePresent: BatteryService.isDevicePresent(selectedDevice)
|
||||
readonly property bool isPresent: BatteryService.isDevicePresent(selectedDevice)
|
||||
readonly property bool isReady: BatteryService.isDeviceReady(selectedDevice)
|
||||
|
||||
readonly property int percent: isReady ? Math.round(BatteryService.getPercentage(selectedDevice)) : -1
|
||||
readonly property bool isCharging: BatteryService.isCharging(selectedDevice)
|
||||
readonly property bool isPluggedIn: BatteryService.isPluggedIn(selectedDevice)
|
||||
|
||||
readonly property bool isLaptopBattery: selectedDevice && !BatteryService.isBluetoothDevice(selectedDevice)
|
||||
|
||||
readonly property bool healthAvailable: (isReady && isLaptopBattery && selectedDevice.healthSupported) || (isLaptopBattery && BatteryService.healthAvailable)
|
||||
readonly property int healthPercent: (isReady && isLaptopBattery && selectedDevice.healthSupported) ? Math.round(selectedDevice.healthPercentage) : BatteryService.healthPercent
|
||||
readonly property bool isCharging: isReady ? BatteryService.isCharging(selectedDevice) : false
|
||||
readonly property bool isPluggedIn: isReady ? BatteryService.isPluggedIn(selectedDevice) : false
|
||||
readonly property bool healthAvailable: (isReady && selectedBattery && selectedBattery.healthSupported) || (selectedBattery && BatteryService.healthAvailable)
|
||||
readonly property int healthPercent: (isReady && selectedBattery && selectedBattery.healthSupported) ? Math.round(selectedBattery.healthPercentage) : BatteryService.healthPercent
|
||||
|
||||
readonly property string deviceName: BatteryService.getDeviceName(selectedDevice)
|
||||
readonly property string panelTitle: deviceName ? `${I18n.tr("common.battery")} - ${deviceName}` : I18n.tr("common.battery")
|
||||
readonly property string panelTitle: deviceName ? `${deviceName}` : I18n.tr("common.battery")
|
||||
|
||||
// Use the centralized list of all devices
|
||||
readonly property var allDevices: BatteryService.devices
|
||||
readonly property var allDevices: {
|
||||
var list = [];
|
||||
var seenPaths = new Set();
|
||||
|
||||
readonly property var laptopBatteries: BatteryService.laptopBatteries
|
||||
readonly property var otherDevices: BatteryService.externalBatteries
|
||||
// Add UPower batteries
|
||||
if (UPower.devices) {
|
||||
var upowerArray = UPower.devices.values || [];
|
||||
for (var i = 0; i < upowerArray.length; i++) {
|
||||
var d = upowerArray[i];
|
||||
if (BatteryService.isDevicePresent(d) && d.type === UPowerDeviceType.Battery) {
|
||||
if (d.nativePath && !seenPaths.has(d.nativePath)) {
|
||||
list.push(d);
|
||||
seenPaths.add(d.nativePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Add Bluetooth batteries
|
||||
if (BluetoothService.devices) {
|
||||
var btArray = BluetoothService.devices.values || [];
|
||||
for (var j = 0; j < btArray.length; j++) {
|
||||
var btd = btArray[j];
|
||||
if (BatteryService.isDevicePresent(btd) && btd.batteryAvailable) {
|
||||
// Bluetooth devices use address as unique ID
|
||||
if (btd.address && !seenPaths.has(btd.address)) {
|
||||
list.push(btd);
|
||||
seenPaths.add(btd.address);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback: if no specific batteries found but display device is a battery, use it
|
||||
if (list.length === 0 && UPower.displayDevice && UPower.displayDevice.type === UPowerDeviceType.Battery && BatteryService.isDevicePresent(UPower.displayDevice)) {
|
||||
list.push(UPower.displayDevice);
|
||||
}
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
readonly property var laptopBatteries: allDevices.filter(d => !BatteryService.isBluetoothDevice(d))
|
||||
readonly property var otherDevices: allDevices.filter(d => BatteryService.isBluetoothDevice(d))
|
||||
|
||||
readonly property string timeText: BatteryService.getTimeRemainingText(selectedDevice)
|
||||
readonly property string iconName: BatteryService.getIcon(percent, isCharging, isPluggedIn, isReady)
|
||||
|
||||
property var batteryWidgetInstance: BarService.lookupWidget("Battery", screen ? screen.name : null)
|
||||
@@ -147,7 +179,7 @@ SmartPanel {
|
||||
}
|
||||
|
||||
NText {
|
||||
text: timeText
|
||||
text: BatteryService.getTimeRemainingText(selectedDevice)
|
||||
pointSize: Style.fontSizeS
|
||||
color: Color.mOnSurfaceVariant
|
||||
wrapMode: Text.Wrap
|
||||
@@ -242,7 +274,7 @@ SmartPanel {
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
visible: modelData.healthSupported || (modelData === BatteryService.primaryDevice && BatteryService.healthAvailable)
|
||||
visible: modelData.healthSupported || (modelData === selectedBattery && BatteryService.healthAvailable)
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
@@ -273,14 +305,14 @@ SmartPanel {
|
||||
height: parent.height
|
||||
radius: parent.radius
|
||||
width: {
|
||||
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === BatteryService.primaryDevice ? BatteryService.healthPercent : 0);
|
||||
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === selectedBattery ? BatteryService.healthPercent : 0);
|
||||
if (h <= 0)
|
||||
return 0;
|
||||
var ratio = Math.max(0, Math.min(1, h / 100));
|
||||
return parent.width * ratio;
|
||||
}
|
||||
color: {
|
||||
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === BatteryService.primaryDevice ? BatteryService.healthPercent : 0);
|
||||
var h = modelData.healthSupported ? modelData.healthPercentage : (modelData === selectedBattery ? BatteryService.healthPercent : 0);
|
||||
return h >= 80 ? Color.mPrimary : (h >= 50 ? Color.mTertiary : Color.mError);
|
||||
}
|
||||
}
|
||||
@@ -289,7 +321,7 @@ SmartPanel {
|
||||
Layout.preferredWidth: 40 * Style.uiScaleRatio
|
||||
horizontalAlignment: Text.AlignRight
|
||||
|
||||
readonly property int h: modelData.healthSupported ? Math.round(modelData.healthPercentage) : (modelData === BatteryService.primaryDevice ? BatteryService.healthPercent : -1)
|
||||
readonly property int h: modelData.healthSupported ? Math.round(modelData.healthPercentage) : (modelData === selectedBattery ? BatteryService.healthPercent : -1)
|
||||
text: h >= 0 ? `${h}%` : "--"
|
||||
color: Color.mOnSurface
|
||||
pointSize: Style.fontSizeS
|
||||
|
||||
@@ -5,7 +5,6 @@ import Quickshell
|
||||
import qs.Commons
|
||||
import qs.Modules.Cards
|
||||
import qs.Modules.MainScreen
|
||||
import qs.Services.Hardware
|
||||
import qs.Services.Media
|
||||
import qs.Services.UI
|
||||
import qs.Widgets
|
||||
@@ -81,12 +80,6 @@ SmartPanel {
|
||||
|
||||
onOpened: {
|
||||
MediaService.autoSwitchingPaused = true;
|
||||
// Refresh DDC brightness from monitors (one-time on QS open)
|
||||
BrightnessService.monitors.forEach(m => {
|
||||
if (m.isDdc) {
|
||||
m.refreshBrightnessFromSystem();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
onClosed: {
|
||||
|
||||
@@ -179,9 +179,8 @@ SmartPanel {
|
||||
readonly property int gridContentWidth: listPanelWidth - (2 * Style.marginXS)
|
||||
readonly property int gridCellSize: Math.floor((gridContentWidth - ((targetGridColumns - 1) * Style.marginS)) / targetGridColumns)
|
||||
|
||||
// Actual columns that fit in the GridView
|
||||
// This gets updated dynamically by the GridView when its actual width is known
|
||||
property int gridColumns: 5
|
||||
// Actual columns in the GridView - tracks targetGridColumns
|
||||
readonly property int gridColumns: targetGridColumns
|
||||
|
||||
// Listen for plugin provider registry changes
|
||||
Connections {
|
||||
@@ -763,6 +762,14 @@ SmartPanel {
|
||||
}
|
||||
}
|
||||
|
||||
WindowsProvider {
|
||||
id: windowsProvider
|
||||
Component.onCompleted: {
|
||||
registerProvider(this);
|
||||
Logger.d("Launcher", "Registered: WindowsProvider");
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
panelContent: Rectangle {
|
||||
id: ui
|
||||
@@ -775,7 +782,7 @@ SmartPanel {
|
||||
visible: root.previewActive
|
||||
width: root.previewPanelWidth
|
||||
height: Math.round(400 * Style.uiScaleRatio)
|
||||
x: ui.width + Style.marginM
|
||||
x: root.panelAnchorRight ? -(root.previewPanelWidth + Style.marginM) : ui.width + Style.marginM
|
||||
y: {
|
||||
if (!resultsViewLoader.item)
|
||||
return Style.marginL;
|
||||
@@ -1196,6 +1203,24 @@ SmartPanel {
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
}
|
||||
|
||||
// Badge icon overlay (generic indicator for any provider)
|
||||
Rectangle {
|
||||
visible: !!modelData.badgeIcon
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.margins: 2
|
||||
width: height
|
||||
height: Style.fontSizeM + Style.marginXS
|
||||
color: Color.mSurfaceVariant
|
||||
radius: Style.radiusXXS
|
||||
NIcon {
|
||||
anchors.centerIn: parent
|
||||
icon: modelData.badgeIcon || ""
|
||||
pointSize: Style.fontSizeS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Text content
|
||||
@@ -1351,8 +1376,9 @@ SmartPanel {
|
||||
horizontalPolicy: ScrollBar.AlwaysOff
|
||||
verticalPolicy: ScrollBar.AlwaysOff
|
||||
reserveScrollbarSpace: false
|
||||
gradientColor: "transparent" //Color.mSurface
|
||||
gradientColor: Color.mSurface
|
||||
wheelScrollMultiplier: 4.0
|
||||
trackedSelectionIndex: root.selectedIndex
|
||||
|
||||
width: parent.width
|
||||
height: parent.height
|
||||
@@ -1375,20 +1401,6 @@ SmartPanel {
|
||||
focus: false
|
||||
interactive: !Settings.data.appLauncher.ignoreMouseInput
|
||||
|
||||
Component.onCompleted: {
|
||||
// Initialize gridColumns when grid view is created
|
||||
updateGridColumns();
|
||||
}
|
||||
|
||||
function updateGridColumns() {
|
||||
// Since cellWidth = width / targetGridColumns, the number of columns is always targetGridColumns
|
||||
root.gridColumns = root.targetGridColumns;
|
||||
}
|
||||
|
||||
onWidthChanged: {
|
||||
updateGridColumns();
|
||||
}
|
||||
|
||||
// Completely disable GridView key handling
|
||||
Keys.enabled: false
|
||||
|
||||
@@ -1573,6 +1585,24 @@ SmartPanel {
|
||||
font.weight: Style.fontWeightBold
|
||||
color: modelData.displayString ? Color.mOnSurface : Color.mOnPrimary
|
||||
}
|
||||
|
||||
// Badge icon overlay (generic indicator for any provider)
|
||||
Rectangle {
|
||||
visible: !!modelData.badgeIcon
|
||||
anchors.bottom: parent.bottom
|
||||
anchors.right: parent.right
|
||||
anchors.margins: 2
|
||||
width: height
|
||||
height: Style.fontSizeM + Style.marginXS
|
||||
color: Color.mSurfaceVariant
|
||||
radius: Style.radiusXXS
|
||||
NIcon {
|
||||
anchors.centerIn: parent
|
||||
icon: modelData.badgeIcon || ""
|
||||
pointSize: Style.fontSizeS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Text content (hidden when hideLabel is true)
|
||||
|
||||
@@ -2,6 +2,7 @@ import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Io
|
||||
import qs.Commons
|
||||
import qs.Services.Compositor
|
||||
import qs.Services.System
|
||||
|
||||
Item {
|
||||
@@ -580,13 +581,12 @@ Item {
|
||||
} else {
|
||||
// Fallback logic when app2unit is not used
|
||||
if (app.runInTerminal) {
|
||||
// If app.execute() fails for terminal apps, we handle it manually.
|
||||
Logger.d("ApplicationsProvider", "Executing terminal app manually: " + app.name);
|
||||
const terminal = Settings.data.appLauncher.terminalCommand.split(" ");
|
||||
const command = terminal.concat(app.command);
|
||||
Quickshell.execDetached(command);
|
||||
CompositorService.spawn(command);
|
||||
} else if (app.command && app.command.length > 0) {
|
||||
Quickshell.execDetached(app.command);
|
||||
CompositorService.spawn(app.command);
|
||||
} else if (app.execute) {
|
||||
app.execute();
|
||||
} else {
|
||||
|
||||
@@ -23,6 +23,7 @@ Item {
|
||||
readonly property string emptyBrowsingMessage: selectedCategory === "recent" ? I18n.tr("launcher.providers.emoji-no-recent") : ""
|
||||
|
||||
property var categoryIcons: ({
|
||||
"all": "apps",
|
||||
"recent": "clock",
|
||||
"people": "user",
|
||||
"animals": "paw",
|
||||
@@ -35,10 +36,11 @@ Item {
|
||||
"flags": "flag"
|
||||
})
|
||||
|
||||
property var categories: ["recent", "people", "animals", "nature", "food", "activity", "travel", "objects", "symbols", "flags"]
|
||||
property var categories: ["all", "recent", "people", "animals", "nature", "food", "activity", "travel", "objects", "symbols", "flags"]
|
||||
|
||||
function getCategoryName(category) {
|
||||
const names = {
|
||||
"all": I18n.tr("launcher.categories.all"),
|
||||
"recent": I18n.tr("launcher.categories.emoji-recent"),
|
||||
"people": I18n.tr("launcher.categories.emoji-people"),
|
||||
"animals": I18n.tr("launcher.categories.emoji-animals"),
|
||||
@@ -121,16 +123,14 @@ Item {
|
||||
}
|
||||
|
||||
var query = searchText.slice(6).trim();
|
||||
var emojis = [];
|
||||
|
||||
if (query === "") {
|
||||
showsCategories = true;
|
||||
var emojis = EmojiService.getEmojisByCategory(selectedCategory);
|
||||
return emojis.map(formatEmojiEntry);
|
||||
if (query !== "" || selectedCategory === "all") {
|
||||
emojis = EmojiService.search(query);
|
||||
} else {
|
||||
showsCategories = false;
|
||||
var emojis = EmojiService.search(query);
|
||||
return emojis.map(formatEmojiEntry);
|
||||
emojis = EmojiService.getEmojisByCategory(selectedCategory);
|
||||
}
|
||||
return emojis.map(formatEmojiEntry);
|
||||
}
|
||||
|
||||
// Format an emoji entry for the results list
|
||||
|
||||
@@ -34,13 +34,48 @@ Item {
|
||||
Logger.d("SettingsProvider", "Initialized");
|
||||
}
|
||||
|
||||
// Check if this provider handles the command
|
||||
function handleCommand(searchText) {
|
||||
return searchText.startsWith(">settings");
|
||||
}
|
||||
|
||||
// Return available commands when user types ">"
|
||||
function commands() {
|
||||
return [
|
||||
{
|
||||
"name": ">settings",
|
||||
"description": I18n.tr("launcher.providers.settings-search-description"),
|
||||
"icon": "settings",
|
||||
"isTablerIcon": true,
|
||||
"isImage": false,
|
||||
"onActivate": function () {
|
||||
launcher.setSearchText(">settings ");
|
||||
}
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
function getResults(query) {
|
||||
if (!query || searchIndex.length === 0)
|
||||
return [];
|
||||
|
||||
const trimmed = query.trim();
|
||||
if (!trimmed || trimmed.length < 2)
|
||||
return [];
|
||||
var trimmed = query.trim();
|
||||
|
||||
// Handle command mode: ">settings" or ">settings <search>"
|
||||
var isCommandMode = trimmed.startsWith(">settings");
|
||||
if (isCommandMode) {
|
||||
// Extract search term after ">settings "
|
||||
var searchTerm = trimmed.substring(9).trim();
|
||||
// In command mode, show all settings if no search term
|
||||
if (searchTerm.length === 0) {
|
||||
return getAllSettings();
|
||||
}
|
||||
trimmed = searchTerm;
|
||||
} else {
|
||||
// Regular search mode - require at least 2 chars
|
||||
if (!trimmed || trimmed.length < 2)
|
||||
return [];
|
||||
}
|
||||
|
||||
// Build searchable items with resolved translations
|
||||
let items = [];
|
||||
@@ -94,6 +129,39 @@ Item {
|
||||
return launcherItems;
|
||||
}
|
||||
|
||||
function getAllSettings() {
|
||||
var launcherItems = [];
|
||||
|
||||
for (var j = 0; j < searchIndex.length; j++) {
|
||||
var entry = searchIndex[j];
|
||||
var label = I18n.tr(entry.labelKey);
|
||||
var tabName = I18n.tr(entry.tabLabel);
|
||||
var subTabName = entry.subTabLabel ? I18n.tr(entry.subTabLabel) : "";
|
||||
var breadcrumb = subTabName ? (tabName + " › " + subTabName) : tabName;
|
||||
|
||||
launcherItems.push({
|
||||
"name": label,
|
||||
"description": breadcrumb,
|
||||
"icon": "settings",
|
||||
"isTablerIcon": true,
|
||||
"isImage": false,
|
||||
"_score": 0,
|
||||
"provider": root,
|
||||
"onActivate": createActivateHandler({
|
||||
"labelKey": entry.labelKey,
|
||||
"descriptionKey": entry.descriptionKey,
|
||||
"widget": entry.widget,
|
||||
"tab": entry.tab,
|
||||
"tabLabel": entry.tabLabel,
|
||||
"subTab": entry.subTab,
|
||||
"subTabLabel": entry.subTabLabel || null
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
return launcherItems;
|
||||
}
|
||||
|
||||
function createActivateHandler(entry) {
|
||||
return function () {
|
||||
if (launcher)
|
||||
|
||||
@@ -0,0 +1,158 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import qs.Commons
|
||||
import qs.Services.Compositor
|
||||
|
||||
Item {
|
||||
id: root
|
||||
|
||||
property string name: I18n.tr("common.windows")
|
||||
property var launcher: null
|
||||
property bool handleSearch: Settings.data.appLauncher.enableWindowsSearch
|
||||
property string supportedLayouts: "list"
|
||||
|
||||
function init() {
|
||||
Logger.d("WindowsProvider", "Initialized");
|
||||
}
|
||||
|
||||
// Check if this provider handles the command
|
||||
function handleCommand(searchText) {
|
||||
return searchText.startsWith(">win");
|
||||
}
|
||||
|
||||
// Return available commands when user types ">"
|
||||
function commands() {
|
||||
return [
|
||||
{
|
||||
"name": ">win",
|
||||
"description": I18n.tr("launcher.providers.windows-search-description"),
|
||||
"icon": "app-window",
|
||||
"isTablerIcon": true,
|
||||
"isImage": false,
|
||||
"onActivate": function () {
|
||||
launcher.setSearchText(">win ");
|
||||
}
|
||||
}
|
||||
];
|
||||
}
|
||||
|
||||
function getResults(query) {
|
||||
if (!query)
|
||||
return [];
|
||||
|
||||
var trimmed = query.trim();
|
||||
|
||||
// Handle command mode: ">win" or ">win <search>"
|
||||
var isCommandMode = trimmed.startsWith(">win");
|
||||
if (isCommandMode) {
|
||||
// Extract search term after ">win "
|
||||
var searchTerm = trimmed.substring(4).trim();
|
||||
// In command mode, show all windows if no search term
|
||||
if (searchTerm.length === 0) {
|
||||
return getAllWindows();
|
||||
}
|
||||
trimmed = searchTerm;
|
||||
} else {
|
||||
// Regular search mode - require at least 2 chars
|
||||
if (trimmed.length < 2)
|
||||
return [];
|
||||
}
|
||||
|
||||
var items = [];
|
||||
|
||||
// Collect all windows from CompositorService
|
||||
for (var i = 0; i < CompositorService.windows.count; i++) {
|
||||
var win = CompositorService.windows.get(i);
|
||||
items.push({
|
||||
"id": win.id,
|
||||
"title": win.title || "",
|
||||
"appId": win.appId || "",
|
||||
"workspaceId": win.workspaceId,
|
||||
"isFocused": win.isFocused,
|
||||
"searchText": (win.title + " " + win.appId).toLowerCase()
|
||||
});
|
||||
}
|
||||
|
||||
// Fuzzy search on title and appId
|
||||
var results = FuzzySort.go(trimmed, items, {
|
||||
"keys": ["title", "appId"],
|
||||
"limit": 10
|
||||
});
|
||||
|
||||
// Map to launcher items
|
||||
var launcherItems = [];
|
||||
for (var j = 0; j < results.length; j++) {
|
||||
var entry = results[j].obj;
|
||||
var score = results[j].score;
|
||||
|
||||
// Get icon name from DesktopEntry if available, otherwise use appId
|
||||
var iconName = entry.appId;
|
||||
var appEntry = ThemeIcons.findAppEntry(entry.appId);
|
||||
if (appEntry && appEntry.icon) {
|
||||
iconName = appEntry.icon;
|
||||
}
|
||||
|
||||
launcherItems.push({
|
||||
"name": entry.title || entry.appId,
|
||||
"description": entry.appId,
|
||||
"icon": iconName || "application-x-executable",
|
||||
"isTablerIcon": false,
|
||||
"badgeIcon": "app-window",
|
||||
"_score": score,
|
||||
"provider": root,
|
||||
"windowId": entry.id,
|
||||
"onActivate": createActivateHandler(entry)
|
||||
});
|
||||
}
|
||||
|
||||
return launcherItems;
|
||||
}
|
||||
|
||||
function getAllWindows() {
|
||||
var launcherItems = [];
|
||||
|
||||
for (var i = 0; i < CompositorService.windows.count; i++) {
|
||||
var win = CompositorService.windows.get(i);
|
||||
|
||||
var iconName = win.appId;
|
||||
var appEntry = ThemeIcons.findAppEntry(win.appId);
|
||||
if (appEntry && appEntry.icon) {
|
||||
iconName = appEntry.icon;
|
||||
}
|
||||
|
||||
launcherItems.push({
|
||||
"name": win.title || win.appId,
|
||||
"description": win.appId,
|
||||
"icon": iconName || "application-x-executable",
|
||||
"isTablerIcon": false,
|
||||
"badgeIcon": "app-window",
|
||||
"_score": 0,
|
||||
"provider": root,
|
||||
"windowId": win.id,
|
||||
"onActivate": createActivateHandler({
|
||||
"id": win.id
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
return launcherItems;
|
||||
}
|
||||
|
||||
function createActivateHandler(windowEntry) {
|
||||
return function () {
|
||||
if (launcher)
|
||||
launcher.close();
|
||||
|
||||
Qt.callLater(() => {
|
||||
// Find the actual window object to pass to focusWindow
|
||||
for (var i = 0; i < CompositorService.windows.count; i++) {
|
||||
var win = CompositorService.windows.get(i);
|
||||
if (win.id === windowEntry.id) {
|
||||
CompositorService.focusWindow(win);
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -890,10 +890,11 @@ SmartPanel {
|
||||
|
||||
// Effective hover state that respects ignoreMouseHover
|
||||
readonly property bool effectiveHover: !root.ignoreMouseHover && mouseArea.containsMouse
|
||||
readonly property real hoveredScale: 1.05
|
||||
|
||||
signal clicked
|
||||
|
||||
property real hoverScale: (isSelected || effectiveHover) ? 1.05 : 1.0
|
||||
property real hoverScale: (isSelected || effectiveHover) ? hoveredScale : 1.0
|
||||
|
||||
radius: Style.radiusL
|
||||
color: {
|
||||
@@ -909,8 +910,10 @@ SmartPanel {
|
||||
border.width: Style.borderS
|
||||
border.color: Color.mOutline
|
||||
|
||||
layer.enabled: hoverScale !== 1.0
|
||||
// Always enable layer to fix nvidia bug, render at 2x size to avoid blur when scaling up
|
||||
layer.enabled: true
|
||||
layer.smooth: true
|
||||
layer.textureSize: Qt.size(Math.ceil(width * 2), Math.ceil(height * 2))
|
||||
|
||||
// Scale transform for hover effect
|
||||
transform: Scale {
|
||||
@@ -967,10 +970,13 @@ SmartPanel {
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
|
||||
property real iconScale: (largeButtonRoot.isSelected || largeButtonRoot.effectiveHover) ? 1.15 : 1.0
|
||||
readonly property real hoveredIconScale: 1.15
|
||||
property real iconScale: (largeButtonRoot.isSelected || largeButtonRoot.effectiveHover) ? hoveredIconScale : 1.0
|
||||
|
||||
layer.enabled: iconScale !== 1.0
|
||||
// Always enable layer to fix nvidia bug, render at 2x size to avoid blur when scaling up
|
||||
layer.enabled: true
|
||||
layer.smooth: true
|
||||
layer.textureSize: Qt.size(Math.ceil(width * 2), Math.ceil(height * 2))
|
||||
|
||||
transform: Scale {
|
||||
origin.x: iconElement.width / 2
|
||||
|
||||
@@ -15,11 +15,12 @@ Popup {
|
||||
property string widgetId: ""
|
||||
property string sectionId: ""
|
||||
property var screen: null
|
||||
|
||||
signal updateWidgetSettings(string section, int index, var settings)
|
||||
property var settingsCache: ({})
|
||||
|
||||
readonly property real maxHeight: screen ? screen.height * 0.9 : 800
|
||||
|
||||
signal updateWidgetSettings(string section, int index, var settings)
|
||||
|
||||
width: Math.max(content.implicitWidth + padding * 2, 640)
|
||||
height: Math.min(content.implicitHeight + padding * 2, maxHeight)
|
||||
padding: Style.marginXL
|
||||
@@ -138,36 +139,27 @@ Popup {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Action buttons
|
||||
RowLayout {
|
||||
id: buttonRow
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: Style.marginM
|
||||
Layout.preferredHeight: implicitHeight
|
||||
spacing: Style.marginM
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NButton {
|
||||
text: I18n.tr("common.close")
|
||||
outlined: true
|
||||
onClicked: saveAndClose()
|
||||
}
|
||||
}
|
||||
Timer {
|
||||
id: saveTimer
|
||||
running: false
|
||||
interval: 150
|
||||
onTriggered: {
|
||||
root.updateWidgetSettings(root.sectionId, root.widgetIndex, root.settingsCache);
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: settingsLoader.item
|
||||
ignoreUnknownSignals: true
|
||||
function onSettingsChanged(newSettings) {
|
||||
if (newSettings) {
|
||||
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
|
||||
root.settingsCache = newSettings;
|
||||
saveTimer.start();
|
||||
}
|
||||
}
|
||||
ignoreUnknownSignals: true
|
||||
}
|
||||
|
||||
function saveAndClose() {
|
||||
|
||||
@@ -44,15 +44,14 @@ NBox {
|
||||
var metadata = BarWidgetRegistry.widgetMetadata[widgetId];
|
||||
if (metadata) {
|
||||
Object.keys(metadata).forEach(function (key) {
|
||||
if (key !== "allowUserSettings") {
|
||||
newWidget[key] = metadata[key];
|
||||
}
|
||||
newWidget[key] = metadata[key];
|
||||
});
|
||||
}
|
||||
}
|
||||
var widgets = _getWidgetsContainer();
|
||||
widgets[section].push(newWidget);
|
||||
_saveWidgets(widgets);
|
||||
BarService.widgetsRevision++;
|
||||
}
|
||||
|
||||
function _removeWidgetFromSection(section, index) {
|
||||
@@ -62,6 +61,7 @@ NBox {
|
||||
var removedWidgets = newArray.splice(index, 1);
|
||||
widgets[section] = newArray;
|
||||
_saveWidgets(widgets);
|
||||
BarService.widgetsRevision++;
|
||||
|
||||
if (removedWidgets[0].id === "ControlCenter" && BarService.lookupWidget("ControlCenter") === undefined) {
|
||||
ToastService.showWarning(I18n.tr("toast.missing-control-center.label"), I18n.tr("toast.missing-control-center.description"), 12000);
|
||||
@@ -78,9 +78,12 @@ NBox {
|
||||
newArray.splice(toIndex, 0, item);
|
||||
widgets[section] = newArray;
|
||||
_saveWidgets(widgets);
|
||||
BarService.widgetsRevision++;
|
||||
}
|
||||
}
|
||||
|
||||
// Note: _updateWidgetSettingsInSection does NOT increment revision
|
||||
// because it only changes settings, not widget structure
|
||||
function _updateWidgetSettingsInSection(section, index, settings) {
|
||||
var widgets = _getWidgetsContainer();
|
||||
widgets[section][index] = settings;
|
||||
@@ -98,6 +101,7 @@ NBox {
|
||||
targetArray.push(widget);
|
||||
widgets[toSection] = targetArray;
|
||||
_saveWidgets(widgets);
|
||||
BarService.widgetsRevision++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,21 +18,12 @@ ColumnLayout {
|
||||
// Local state
|
||||
property string valueDisplayMode: widgetData.displayMode !== undefined ? widgetData.displayMode : widgetMetadata.displayMode
|
||||
property int valueWarningThreshold: widgetData.warningThreshold !== undefined ? widgetData.warningThreshold : widgetMetadata.warningThreshold
|
||||
property string valueDeviceNativePath: widgetData.deviceNativePath !== undefined ? widgetData.deviceNativePath : ""
|
||||
property string valueDeviceNativePath: widgetData.deviceNativePath !== undefined ? widgetData.deviceNativePath : "__default__"
|
||||
property bool valueShowPowerProfiles: widgetData.showPowerProfiles !== undefined ? widgetData.showPowerProfiles : widgetMetadata.showPowerProfiles
|
||||
property bool valueShowNoctaliaPerformance: widgetData.showNoctaliaPerformance !== undefined ? widgetData.showNoctaliaPerformance : widgetMetadata.showNoctaliaPerformance
|
||||
property bool valueHideIfNotDetected: widgetData.hideIfNotDetected !== undefined ? widgetData.hideIfNotDetected : widgetMetadata.hideIfNotDetected
|
||||
property bool valueHideIfIdle: widgetData.hideIfIdle !== undefined ? widgetData.hideIfIdle : widgetMetadata.hideIfIdle
|
||||
|
||||
property var deviceModel: BatteryService.getDeviceOptionsModel()
|
||||
|
||||
Connections {
|
||||
target: BatteryService
|
||||
function onDevicesChanged() {
|
||||
deviceModel = BatteryService.getDeviceOptionsModel();
|
||||
}
|
||||
}
|
||||
|
||||
function saveSettings() {
|
||||
var settings = Object.assign({}, widgetData || {});
|
||||
if (widgetData && widgetData.id) {
|
||||
@@ -44,54 +35,29 @@ ColumnLayout {
|
||||
settings.showNoctaliaPerformance = valueShowNoctaliaPerformance;
|
||||
settings.hideIfNotDetected = valueHideIfNotDetected;
|
||||
settings.hideIfIdle = valueHideIfIdle;
|
||||
if (valueDeviceNativePath && valueDeviceNativePath !== "") {
|
||||
settings.deviceNativePath = valueDeviceNativePath;
|
||||
} else {
|
||||
delete settings.deviceNativePath;
|
||||
}
|
||||
settings.deviceNativePath = valueDeviceNativePath;
|
||||
return settings;
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
NComboBox {
|
||||
id: deviceComboBox
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginM
|
||||
|
||||
NComboBox {
|
||||
id: deviceComboBox
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("bar.battery.device-label")
|
||||
description: I18n.tr("bar.battery.device-description")
|
||||
minimumWidth: 200
|
||||
model: root.deviceModel
|
||||
currentKey: root.valueDeviceNativePath
|
||||
onSelected: key => {
|
||||
root.valueDeviceNativePath = key;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
|
||||
// Update currentKey when model changes to ensure selection is preserved
|
||||
Connections {
|
||||
target: root
|
||||
function onDeviceModelChanged() {
|
||||
// Force update of currentKey to trigger selection update
|
||||
deviceComboBox.currentKey = root.valueDeviceNativePath;
|
||||
}
|
||||
}
|
||||
|
||||
NIconButton {
|
||||
icon: "refresh"
|
||||
// TODO i18n
|
||||
tooltipText: "Refresh device list"
|
||||
onClicked: deviceModel = BatteryService.getDeviceOptionsModel()
|
||||
}
|
||||
label: I18n.tr("bar.battery.device-label")
|
||||
description: I18n.tr("bar.battery.device-description")
|
||||
minimumWidth: 200
|
||||
model: BatteryService.deviceModel
|
||||
currentKey: root.valueDeviceNativePath
|
||||
onSelected: key => {
|
||||
root.valueDeviceNativePath = key;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
|
||||
NComboBox {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 240
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
|
||||
@@ -25,7 +25,7 @@ ColumnLayout {
|
||||
NComboBox {
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 134
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
|
||||
@@ -26,7 +26,7 @@ ColumnLayout {
|
||||
NComboBox {
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 134
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
|
||||
@@ -29,7 +29,7 @@ ColumnLayout {
|
||||
visible: valueShowIcon // Hide display mode setting when icon is disabled
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 134
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
|
||||
@@ -28,7 +28,7 @@ ColumnLayout {
|
||||
NComboBox {
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 134
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ ColumnLayout {
|
||||
NComboBox {
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 134
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
@@ -20,6 +20,7 @@ ColumnLayout {
|
||||
property bool valueUsePrimaryColor: widgetData.usePrimaryColor !== undefined ? widgetData.usePrimaryColor : widgetMetadata.usePrimaryColor
|
||||
property bool valueUseMonospaceFont: widgetData.useMonospaceFont !== undefined ? widgetData.useMonospaceFont : widgetMetadata.useMonospaceFont
|
||||
property bool valueShowCpuUsage: widgetData.showCpuUsage !== undefined ? widgetData.showCpuUsage : widgetMetadata.showCpuUsage
|
||||
property bool valueShowCpuFreq: widgetData.showCpuFreq !== undefined ? widgetData.showCpuFreq : widgetMetadata.showCpuFreq
|
||||
property bool valueShowCpuTemp: widgetData.showCpuTemp !== undefined ? widgetData.showCpuTemp : widgetMetadata.showCpuTemp
|
||||
property bool valueShowGpuTemp: widgetData.showGpuTemp !== undefined ? widgetData.showGpuTemp : widgetMetadata.showGpuTemp
|
||||
property bool valueShowLoadAverage: widgetData.showLoadAverage !== undefined ? widgetData.showLoadAverage : widgetMetadata.showLoadAverage
|
||||
@@ -38,6 +39,7 @@ ColumnLayout {
|
||||
settings.usePrimaryColor = valueUsePrimaryColor;
|
||||
settings.useMonospaceFont = valueUseMonospaceFont;
|
||||
settings.showCpuUsage = valueShowCpuUsage;
|
||||
settings.showCpuFreq = valueShowCpuFreq;
|
||||
settings.showCpuTemp = valueShowCpuTemp;
|
||||
settings.showGpuTemp = valueShowGpuTemp;
|
||||
settings.showLoadAverage = valueShowLoadAverage;
|
||||
@@ -100,6 +102,18 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
NToggle {
|
||||
id: showCpuFreq
|
||||
Layout.fillWidth: true
|
||||
label: "Show CPU Frequency" // TODO: use I18n.tr
|
||||
description: "Display the current CPU clock speed in GHz" // TODO: use I18n.tr
|
||||
checked: valueShowCpuFreq
|
||||
onToggled: checked => {
|
||||
valueShowCpuFreq = checked;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
|
||||
NToggle {
|
||||
id: showCpuTemp
|
||||
Layout.fillWidth: true
|
||||
|
||||
@@ -147,6 +147,17 @@ ColumnLayout {
|
||||
enabled: !isVerticalBar
|
||||
}
|
||||
|
||||
NTextInput {
|
||||
id: titleWidthInput
|
||||
visible: root.valueShowTitle && !isVerticalBar
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("bar.taskbar.title-width-label")
|
||||
description: I18n.tr("bar.taskbar.title-width-description")
|
||||
text: widgetData.titleWidth || widgetMetadata.titleWidth
|
||||
placeholderText: I18n.tr("placeholders.enter-width-pixels")
|
||||
onEditingFinished: settingsChanged(saveSettings())
|
||||
}
|
||||
|
||||
NToggle {
|
||||
Layout.fillWidth: true
|
||||
visible: !isVerticalBar && root.valueShowTitle
|
||||
@@ -174,15 +185,4 @@ ColumnLayout {
|
||||
}
|
||||
text: Math.round(root.valueMaxTaskbarWidth) + "%"
|
||||
}
|
||||
|
||||
NTextInput {
|
||||
id: titleWidthInput
|
||||
visible: root.valueShowTitle && !isVerticalBar && !root.valueSmartWidth
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("bar.taskbar.title-width-label")
|
||||
description: I18n.tr("bar.taskbar.title-width-description")
|
||||
text: widgetData.titleWidth || widgetMetadata.titleWidth
|
||||
placeholderText: I18n.tr("placeholders.enter-width-pixels")
|
||||
onEditingFinished: settingsChanged(saveSettings())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,19 +137,17 @@ ColumnLayout {
|
||||
spacing: Style.marginS
|
||||
|
||||
NText {
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
text: model.rule
|
||||
elide: Text.ElideRight
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NIconButton {
|
||||
width: 16
|
||||
height: 16
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
icon: "close"
|
||||
baseSize: 8
|
||||
baseSize: 12 * Style.uiScaleRatio
|
||||
colorBg: Color.mSurfaceVariant
|
||||
colorFg: Color.mOnSurface
|
||||
colorFg: Color.mOnSurfaceVariant
|
||||
colorBgHover: Color.mError
|
||||
colorFgHover: Color.mOnError
|
||||
onClicked: {
|
||||
|
||||
@@ -23,7 +23,7 @@ ColumnLayout {
|
||||
NComboBox {
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 134
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
|
||||
@@ -28,7 +28,7 @@ ColumnLayout {
|
||||
NComboBox {
|
||||
label: I18n.tr("bar.volume.display-mode-label")
|
||||
description: I18n.tr("bar.volume.display-mode-description")
|
||||
minimumWidth: 134
|
||||
minimumWidth: 200
|
||||
model: [
|
||||
{
|
||||
"key": "onhover",
|
||||
|
||||
@@ -226,6 +226,7 @@ ColumnLayout {
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
text: Math.round(valueIconScale * 100) + "%"
|
||||
visible: valueShowApplications
|
||||
}
|
||||
|
||||
NDivider {
|
||||
|
||||
@@ -14,6 +14,7 @@ Popup {
|
||||
property string widgetId: ""
|
||||
property string sectionId: ""
|
||||
property var screen: null
|
||||
property var settingsCache: ({})
|
||||
|
||||
signal updateWidgetSettings(string section, int index, var settings)
|
||||
|
||||
@@ -111,35 +112,26 @@ Popup {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Action buttons
|
||||
RowLayout {
|
||||
id: buttonRow
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: Style.marginM
|
||||
Layout.preferredHeight: implicitHeight
|
||||
spacing: Style.marginM
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NButton {
|
||||
text: I18n.tr("common.close")
|
||||
outlined: true
|
||||
onClicked: saveAndClose()
|
||||
}
|
||||
Timer {
|
||||
id: saveTimer
|
||||
running: false
|
||||
interval: 150
|
||||
onTriggered: {
|
||||
root.updateWidgetSettings(root.sectionId, root.widgetIndex, root.settingsCache);
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: settingsLoader.item
|
||||
ignoreUnknownSignals: true
|
||||
function onSettingsChanged(newSettings) {
|
||||
if (newSettings) {
|
||||
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
|
||||
root.settingsCache = newSettings;
|
||||
saveTimer.start();
|
||||
}
|
||||
}
|
||||
ignoreUnknownSignals: true
|
||||
}
|
||||
|
||||
function saveAndClose() {
|
||||
|
||||
@@ -16,11 +16,12 @@ Popup {
|
||||
property string widgetId: ""
|
||||
property string sectionId: "" // Not used for desktop widgets, but required by NSectionEditor
|
||||
property var screen: null
|
||||
|
||||
signal updateWidgetSettings(string section, int index, var settings)
|
||||
property var settingsCache: ({})
|
||||
|
||||
readonly property real maxHeight: screen ? screen.height * 0.9 : 800
|
||||
|
||||
signal updateWidgetSettings(string section, int index, var settings)
|
||||
|
||||
width: Math.max(content.implicitWidth + padding * 2, 500)
|
||||
height: Math.min(content.implicitHeight + padding * 2, maxHeight)
|
||||
padding: Style.marginXL
|
||||
@@ -132,35 +133,27 @@ Popup {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
id: buttonRow
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: Style.marginM
|
||||
Layout.preferredHeight: implicitHeight
|
||||
spacing: Style.marginM
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NButton {
|
||||
text: I18n.tr("common.close")
|
||||
outlined: true
|
||||
onClicked: saveAndClose()
|
||||
}
|
||||
}
|
||||
Timer {
|
||||
id: saveTimer
|
||||
running: false
|
||||
interval: 150
|
||||
onTriggered: {
|
||||
root.updateWidgetSettings(root.sectionId, root.widgetIndex, root.settingsCache);
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: settingsLoader.item
|
||||
ignoreUnknownSignals: true
|
||||
function onSettingsChanged(newSettings) {
|
||||
if (newSettings) {
|
||||
root.updateWidgetSettings(root.sectionId, root.widgetIndex, newSettings);
|
||||
root.settingsCache = newSettings;
|
||||
saveTimer.start();
|
||||
}
|
||||
}
|
||||
ignoreUnknownSignals: true
|
||||
}
|
||||
|
||||
function saveAndClose() {
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import qs.Commons
|
||||
import qs.Services.System
|
||||
import qs.Widgets
|
||||
|
||||
ColumnLayout {
|
||||
id: root
|
||||
spacing: Style.marginM
|
||||
width: 700
|
||||
|
||||
property var widgetData: null
|
||||
property var widgetMetadata: null
|
||||
|
||||
signal settingsChanged(var settings)
|
||||
|
||||
property string valueStatType: widgetData.statType !== undefined ? widgetData.statType : widgetMetadata.statType
|
||||
property string valueDiskPath: widgetData.diskPath !== undefined ? widgetData.diskPath : widgetMetadata.diskPath
|
||||
property bool valueShowBackground: widgetData.showBackground !== undefined ? widgetData.showBackground : widgetMetadata.showBackground
|
||||
property bool valueRoundedCorners: widgetData.roundedCorners !== undefined ? widgetData.roundedCorners : (widgetMetadata.roundedCorners !== undefined ? widgetMetadata.roundedCorners : true)
|
||||
property string valueLayout: widgetData.layout !== undefined ? widgetData.layout : (widgetMetadata.layout !== undefined ? widgetMetadata.layout : "side")
|
||||
|
||||
function saveSettings() {
|
||||
var settings = Object.assign({}, widgetData || {});
|
||||
settings.statType = valueStatType;
|
||||
settings.diskPath = valueDiskPath;
|
||||
settings.showBackground = valueShowBackground;
|
||||
settings.roundedCorners = valueRoundedCorners;
|
||||
settings.layout = valueLayout;
|
||||
return settings;
|
||||
}
|
||||
|
||||
NComboBox {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.desktop-widgets.system-stat-stat-type-label")
|
||||
description: I18n.tr("panels.desktop-widgets.system-stat-stat-type-description")
|
||||
currentKey: valueStatType
|
||||
minimumWidth: 260 * Style.uiScaleRatio
|
||||
model: [
|
||||
{
|
||||
"key": "CPU",
|
||||
"name": I18n.tr("system-monitor.cpu-usage")
|
||||
},
|
||||
{
|
||||
"key": "GPU",
|
||||
"name": I18n.tr("panels.system-monitor.gpu-section-label")
|
||||
},
|
||||
{
|
||||
"key": "Memory",
|
||||
"name": I18n.tr("common.memory")
|
||||
},
|
||||
{
|
||||
"key": "Network",
|
||||
"name": I18n.tr("bar.system-monitor.network-traffic-label")
|
||||
},
|
||||
{
|
||||
"key": "Disk",
|
||||
"name": I18n.tr("system-monitor.disk")
|
||||
}
|
||||
]
|
||||
onSelected: key => {
|
||||
valueStatType = key;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
|
||||
NComboBox {
|
||||
Layout.fillWidth: true
|
||||
visible: valueStatType === "Disk"
|
||||
label: I18n.tr("bar.system-monitor.disk-path-label")
|
||||
description: I18n.tr("bar.system-monitor.disk-path-description")
|
||||
model: {
|
||||
const paths = Object.keys(SystemStatService.diskPercents).sort();
|
||||
return paths.map(path => ({
|
||||
key: path,
|
||||
name: path
|
||||
}));
|
||||
}
|
||||
currentKey: valueDiskPath
|
||||
onSelected: key => {
|
||||
valueDiskPath = key;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
|
||||
NDivider {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NToggle {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.desktop-widgets.system-stat-show-background-label")
|
||||
description: I18n.tr("panels.desktop-widgets.system-stat-show-background-description")
|
||||
checked: valueShowBackground
|
||||
onToggled: checked => {
|
||||
valueShowBackground = checked;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
|
||||
NToggle {
|
||||
Layout.fillWidth: true
|
||||
visible: valueShowBackground
|
||||
label: I18n.tr("panels.desktop-widgets.system-stat-rounded-corners-label")
|
||||
description: I18n.tr("panels.desktop-widgets.system-stat-rounded-corners-description")
|
||||
checked: valueRoundedCorners
|
||||
onToggled: checked => {
|
||||
valueRoundedCorners = checked;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
|
||||
NDivider {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NComboBox {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.desktop-widgets.system-stat-layout-label")
|
||||
description: I18n.tr("panels.desktop-widgets.system-stat-layout-description")
|
||||
currentKey: valueLayout
|
||||
minimumWidth: 260 * Style.uiScaleRatio
|
||||
model: [
|
||||
{
|
||||
"key": "side",
|
||||
"name": I18n.tr("panels.desktop-widgets.system-stat-layout-side")
|
||||
},
|
||||
{
|
||||
"key": "bottom",
|
||||
"name": I18n.tr("panels.desktop-widgets.system-stat-layout-bottom")
|
||||
}
|
||||
]
|
||||
onSelected: key => {
|
||||
valueLayout = key;
|
||||
settingsChanged(saveSettings());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -57,6 +57,8 @@ Item {
|
||||
property real _lastMouseY: 0
|
||||
property bool _mouseInitialized: false
|
||||
|
||||
readonly property bool panelVeryTransparent: Settings.data.ui.panelBackgroundOpacity <= 0.75
|
||||
|
||||
onSearchResultsChanged: {
|
||||
searchSelectedIndex = 0;
|
||||
ignoreMouseHover = true;
|
||||
@@ -554,7 +556,9 @@ Item {
|
||||
ProgramCheckerService.checkAllPrograms();
|
||||
updateTabsModel();
|
||||
selectTabById(requestedTab);
|
||||
if (sidebarExpanded) {
|
||||
// Skip auto-focus on Nvidia GPUs - cursor blink causes UI choppiness
|
||||
const isNvidia = SystemStatService.gpuType === "nvidia";
|
||||
if (sidebarExpanded && !isNvidia) {
|
||||
Qt.callLater(() => {
|
||||
if (searchInput.inputItem)
|
||||
searchInput.inputItem.forceActiveFocus();
|
||||
@@ -652,16 +656,14 @@ Item {
|
||||
NBox {
|
||||
id: sidebar
|
||||
|
||||
readonly property bool panelVeryTransparent: Settings.data.ui.panelBackgroundOpacity <= 0.75
|
||||
|
||||
clip: true
|
||||
Layout.preferredWidth: Math.round(root.sidebarExpanded ? 200 * Style.uiScaleRatio : sidebarToggle.width + (panelVeryTransparent ? Style.marginXL : 0) + (sidebarList.verticalScrollBarActive ? Style.marginM : 0))
|
||||
Layout.preferredWidth: Math.round(root.sidebarExpanded ? 200 * Style.uiScaleRatio : sidebarToggle.width + (root.panelVeryTransparent ? Style.marginXL : 0) + (sidebarList.verticalScrollBarActive ? Style.marginM : 0))
|
||||
Layout.fillHeight: true
|
||||
Layout.alignment: Qt.AlignTop
|
||||
|
||||
radius: sidebar.panelVeryTransparent ? Style.radiusM : 0
|
||||
color: sidebar.panelVeryTransparent ? Color.mSurfaceVariant : "transparent"
|
||||
border.color: sidebar.panelVeryTransparent ? Style.boxBorderColor : "transparent"
|
||||
radius: root.panelVeryTransparent ? Style.radiusM : 0
|
||||
color: root.panelVeryTransparent ? Color.mSurfaceVariant : "transparent"
|
||||
border.color: root.panelVeryTransparent ? Style.boxBorderColor : "transparent"
|
||||
|
||||
Behavior on Layout.preferredWidth {
|
||||
NumberAnimation {
|
||||
@@ -674,7 +676,7 @@ Item {
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
spacing: Style.marginS
|
||||
anchors.margins: sidebar.panelVeryTransparent ? Style.marginM : 0
|
||||
anchors.margins: root.panelVeryTransparent ? Style.marginM : 0
|
||||
|
||||
// Sidebar toggle button
|
||||
Item {
|
||||
@@ -737,7 +739,7 @@ Item {
|
||||
Layout.fillWidth: true
|
||||
placeholderText: I18n.tr("common.search")
|
||||
inputIconName: "search"
|
||||
visible: root.sidebarExpanded
|
||||
visible: opacity > 0
|
||||
opacity: root.sidebarExpanded ? 1.0 : 0.0
|
||||
|
||||
Behavior on opacity {
|
||||
@@ -759,7 +761,7 @@ Item {
|
||||
id: searchCollapsedContainer
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: Math.round(searchCollapsedRow.implicitHeight + Style.marginS * 2)
|
||||
visible: !root.sidebarExpanded
|
||||
visible: opacity > 0
|
||||
opacity: !root.sidebarExpanded ? 1.0 : 0.0
|
||||
|
||||
Behavior on opacity {
|
||||
@@ -832,7 +834,7 @@ Item {
|
||||
spacing: Style.marginXS
|
||||
visible: root.searchText.trim() !== ""
|
||||
verticalPolicy: ScrollBar.AsNeeded
|
||||
gradientColor: Color.mSurface
|
||||
gradientColor: "transparent"
|
||||
reserveScrollbarSpace: false
|
||||
|
||||
HoverHandler {
|
||||
@@ -932,7 +934,7 @@ Item {
|
||||
spacing: Style.marginXS
|
||||
currentIndex: root.currentTabIndex
|
||||
verticalPolicy: ScrollBar.AsNeeded
|
||||
gradientColor: Color.mSurface
|
||||
gradientColor: "transparent"
|
||||
reserveScrollbarSpace: false
|
||||
|
||||
delegate: Rectangle {
|
||||
|
||||
@@ -476,17 +476,22 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
// Action buttons row
|
||||
RowLayout {
|
||||
GridLayout {
|
||||
id: actionsGrid
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
Layout.topMargin: Style.marginM
|
||||
Layout.bottomMargin: Style.marginM
|
||||
spacing: Style.marginM
|
||||
rowSpacing: Style.marginM
|
||||
columnSpacing: Style.marginM
|
||||
|
||||
columns: (changelogBtn.implicitWidth + copyBtn.implicitWidth + supportBtn.implicitWidth + 2 * columnSpacing) < root.width ? 3 : 1
|
||||
|
||||
NButton {
|
||||
id: changelogBtn
|
||||
icon: "sparkles"
|
||||
text: I18n.tr("panels.about.changelog")
|
||||
outlined: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
onClicked: {
|
||||
var screen = PanelService.openedPanel?.screen || Quickshell.screens[0];
|
||||
UpdateService.viewChangelog(screen);
|
||||
@@ -494,16 +499,20 @@ ColumnLayout {
|
||||
}
|
||||
|
||||
NButton {
|
||||
id: copyBtn
|
||||
icon: "copy"
|
||||
text: I18n.tr("panels.about.copy-info")
|
||||
outlined: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
onClicked: root.copyInfoToClipboard()
|
||||
}
|
||||
|
||||
NButton {
|
||||
id: supportBtn
|
||||
icon: "heart"
|
||||
text: I18n.tr("panels.about.support")
|
||||
outlined: true
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
onClicked: {
|
||||
Quickshell.execDetached(["xdg-open", "https://buymeacoffee.com/noctalia"]);
|
||||
ToastService.showNotice(I18n.tr("panels.about.support"), I18n.tr("toast.kofi-opened"));
|
||||
|
||||
@@ -67,6 +67,50 @@ ColumnLayout {
|
||||
defaultValue: Settings.getDefaultValue("bar.density")
|
||||
onSelected: key => Settings.data.bar.density = key
|
||||
}
|
||||
NComboBox {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.bar.appearance-type-label")
|
||||
description: I18n.tr("panels.bar.appearance-type-description")
|
||||
model: [
|
||||
{
|
||||
"key": "simple",
|
||||
"name": I18n.tr("options.bar.type-simple")
|
||||
},
|
||||
{
|
||||
"key": "floating",
|
||||
"name": I18n.tr("options.bar.type-floating")
|
||||
},
|
||||
{
|
||||
"key": "framed",
|
||||
"name": I18n.tr("options.bar.type-framed")
|
||||
}
|
||||
]
|
||||
currentKey: Settings.data.bar.barType
|
||||
defaultValue: Settings.getDefaultValue("bar.barType")
|
||||
onSelected: key => {
|
||||
Settings.data.bar.barType = key;
|
||||
Settings.data.bar.floating = (key === "floating");
|
||||
}
|
||||
}
|
||||
|
||||
NComboBox {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.bar.appearance-display-mode-label")
|
||||
description: I18n.tr("panels.bar.appearance-display-mode-description")
|
||||
model: [
|
||||
{
|
||||
"key": "always_visible",
|
||||
"name": I18n.tr("hide-modes.visible")
|
||||
},
|
||||
{
|
||||
"key": "auto_hide",
|
||||
"name": I18n.tr("hide-modes.auto-hide")
|
||||
}
|
||||
]
|
||||
currentKey: Settings.data.bar.displayMode
|
||||
defaultValue: Settings.getDefaultValue("bar.displayMode")
|
||||
onSelected: key => Settings.data.bar.displayMode = key
|
||||
}
|
||||
|
||||
NToggle {
|
||||
label: I18n.tr("panels.bar.appearance-use-separate-opacity-label")
|
||||
@@ -122,30 +166,14 @@ ColumnLayout {
|
||||
text: Math.floor(Settings.data.bar.capsuleOpacity * 100) + "%"
|
||||
}
|
||||
|
||||
NComboBox {
|
||||
NToggle {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.bar.appearance-type-label") ?? "Bar Type"
|
||||
description: I18n.tr("panels.bar.appearance-type-description") ?? "Choose the style of the bar: Simple, Floating or Framed"
|
||||
model: [
|
||||
{
|
||||
"key": "simple",
|
||||
"name": I18n.tr("options.bar.type-simple") ?? "Simple"
|
||||
},
|
||||
{
|
||||
"key": "floating",
|
||||
"name": I18n.tr("options.bar.type-floating") ?? "Floating"
|
||||
},
|
||||
{
|
||||
"key": "framed",
|
||||
"name": I18n.tr("options.bar.type-framed") ?? "Framed"
|
||||
}
|
||||
]
|
||||
currentKey: Settings.data.bar.barType
|
||||
defaultValue: Settings.getDefaultValue("bar.barType")
|
||||
onSelected: key => {
|
||||
Settings.data.bar.barType = key;
|
||||
Settings.data.bar.floating = (key === "floating");
|
||||
}
|
||||
visible: CompositorService.isNiri
|
||||
label: I18n.tr("panels.bar.appearance-hide-on-overview-label")
|
||||
description: I18n.tr("panels.bar.appearance-hide-on-overview-description")
|
||||
checked: Settings.data.bar.hideOnOverview
|
||||
defaultValue: Settings.getDefaultValue("bar.hideOnOverview")
|
||||
onToggled: checked => Settings.data.bar.hideOnOverview = checked
|
||||
}
|
||||
|
||||
NToggle {
|
||||
@@ -164,8 +192,8 @@ ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
NLabel {
|
||||
label: I18n.tr("panels.bar.appearance-frame-settings-label") ?? "Frame Settings"
|
||||
description: I18n.tr("panels.bar.appearance-frame-settings-description") ?? "Adjust frame thickness and inner corner radius"
|
||||
label: I18n.tr("panels.bar.appearance-frame-settings-label")
|
||||
description: I18n.tr("panels.bar.appearance-frame-settings-description")
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
@@ -174,7 +202,7 @@ ColumnLayout {
|
||||
|
||||
NValueSlider {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.bar.appearance-frame-thickness") ?? "Thickness"
|
||||
label: I18n.tr("panels.bar.appearance-frame-thickness")
|
||||
from: 4
|
||||
to: 24
|
||||
stepSize: 1
|
||||
@@ -186,7 +214,7 @@ ColumnLayout {
|
||||
|
||||
NValueSlider {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.bar.appearance-frame-radius") ?? "Inner Radius"
|
||||
label: I18n.tr("panels.bar.appearance-frame-radius")
|
||||
from: 4
|
||||
to: 24
|
||||
stepSize: 1
|
||||
@@ -238,13 +266,40 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
NToggle {
|
||||
NDivider {
|
||||
Layout.fillWidth: true
|
||||
visible: CompositorService.isNiri
|
||||
label: I18n.tr("panels.bar.appearance-hide-on-overview-label")
|
||||
description: I18n.tr("panels.bar.appearance-hide-on-overview-description")
|
||||
checked: Settings.data.bar.hideOnOverview
|
||||
defaultValue: Settings.getDefaultValue("bar.hideOnOverview")
|
||||
onToggled: checked => Settings.data.bar.hideOnOverview = checked
|
||||
Layout.topMargin: Style.marginS
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
visible: Settings.data.bar.displayMode === "auto_hide"
|
||||
spacing: Style.marginS
|
||||
Layout.fillWidth: true
|
||||
|
||||
NValueSlider {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.bar.appearance-auto-hide-delay-label")
|
||||
description: I18n.tr("panels.bar.appearance-auto-hide-delay-description")
|
||||
from: 100
|
||||
to: 2000
|
||||
stepSize: 100
|
||||
value: Settings.data.bar.autoHideDelay
|
||||
defaultValue: Settings.getDefaultValue("bar.autoHideDelay")
|
||||
onMoved: value => Settings.data.bar.autoHideDelay = value
|
||||
text: Settings.data.bar.autoHideDelay + "ms"
|
||||
}
|
||||
|
||||
NValueSlider {
|
||||
Layout.fillWidth: true
|
||||
label: I18n.tr("panels.bar.appearance-auto-show-delay-label")
|
||||
description: I18n.tr("panels.bar.appearance-auto-show-delay-description")
|
||||
from: 0
|
||||
to: 500
|
||||
stepSize: 50
|
||||
value: Settings.data.bar.autoShowDelay
|
||||
defaultValue: Settings.getDefaultValue("bar.autoShowDelay")
|
||||
onMoved: value => Settings.data.bar.autoShowDelay = value
|
||||
text: Settings.data.bar.autoShowDelay + "ms"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,13 +33,12 @@ ColumnLayout {
|
||||
var metadata = BarWidgetRegistry.widgetMetadata[widgetId];
|
||||
if (metadata) {
|
||||
Object.keys(metadata).forEach(function (key) {
|
||||
if (key !== "allowUserSettings") {
|
||||
newWidget[key] = metadata[key];
|
||||
}
|
||||
newWidget[key] = metadata[key];
|
||||
});
|
||||
}
|
||||
}
|
||||
Settings.data.bar.widgets[section].push(newWidget);
|
||||
BarService.widgetsRevision++;
|
||||
}
|
||||
|
||||
function _removeWidgetFromSection(section, index) {
|
||||
@@ -48,9 +47,10 @@ ColumnLayout {
|
||||
var newArray = widgets[section].slice();
|
||||
var removedWidgets = newArray.splice(index, 1);
|
||||
widgets[section] = newArray;
|
||||
BarService.widgetsRevision++;
|
||||
|
||||
if (removedWidgets[0].id === "ControlCenter" && BarService.lookupWidget("ControlCenter") === undefined) {
|
||||
ToastService.showWarning(I18n.tr("toast.missing-control-center.label"), I18n.tr("toast.missing-control-center.description"), 12000);
|
||||
ToastService.showWarning(I18n.tr("toast.missing-control-center.label"), I18n.tr("toast.missing-control-center.description"), 6000);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -63,9 +63,12 @@ ColumnLayout {
|
||||
newArray.splice(fromIndex, 1);
|
||||
newArray.splice(toIndex, 0, item);
|
||||
widgets[section] = newArray;
|
||||
BarService.widgetsRevision++;
|
||||
}
|
||||
}
|
||||
|
||||
// Note: _updateWidgetSettingsInSection does NOT increment revision
|
||||
// because it only changes settings, not widget structure
|
||||
function _updateWidgetSettingsInSection(section, index, settings) {
|
||||
Settings.data.bar.widgets[section][index] = settings;
|
||||
}
|
||||
@@ -80,6 +83,8 @@ ColumnLayout {
|
||||
var targetArray = widgets[toSection].slice();
|
||||
targetArray.push(widget);
|
||||
widgets[toSection] = targetArray;
|
||||
BarService.widgetsRevision++;
|
||||
Logger.d("BarTab", "_moveWidgetBetweenSections: revision now", BarService.widgetsRevision);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -219,7 +219,7 @@ ColumnLayout {
|
||||
id: chip
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: Math.round(Style.baseWidgetSize * 0.9)
|
||||
radius: height / 2
|
||||
radius: Style.iRadiusM
|
||||
color: chipMouse.containsMouse ? Color.mHover : (isActive ? Color.mPrimary : Color.mSurface)
|
||||
border.color: isActive ? Color.mPrimary : Color.mOutline
|
||||
border.width: Style.borderS
|
||||
|
||||
@@ -184,9 +184,7 @@ ColumnLayout {
|
||||
var metadata = ControlCenterWidgetRegistry.widgetMetadata[widgetId];
|
||||
if (metadata) {
|
||||
Object.keys(metadata).forEach(function (key) {
|
||||
if (key !== "allowUserSettings") {
|
||||
newWidget[key] = metadata[key];
|
||||
}
|
||||
newWidget[key] = metadata[key];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,9 +234,7 @@ ColumnLayout {
|
||||
var metadata = DesktopWidgetRegistry.widgetMetadata[widgetId];
|
||||
if (metadata) {
|
||||
Object.keys(metadata).forEach(function (key) {
|
||||
if (key !== "allowUserSettings") {
|
||||
newWidget[key] = metadata[key];
|
||||
}
|
||||
newWidget[key] = metadata[key];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,12 +194,15 @@ ColumnLayout {
|
||||
}
|
||||
var setupPanel = PanelService.getPanel("setupWizardPanel", targetScreen);
|
||||
if (setupPanel) {
|
||||
setupPanel.telemetryOnlyMode = false;
|
||||
setupPanel.open();
|
||||
} else {
|
||||
Qt.callLater(() => {
|
||||
var sp = PanelService.getPanel("setupWizardPanel", targetScreen);
|
||||
if (sp)
|
||||
sp.open();
|
||||
if (sp) {
|
||||
sp.telemetryOnlyMode = false;
|
||||
sp.open();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,6 +107,14 @@ ColumnLayout {
|
||||
defaultValue: Settings.getDefaultValue("appLauncher.enableSettingsSearch")
|
||||
}
|
||||
|
||||
NToggle {
|
||||
label: I18n.tr("panels.launcher.settings-enable-windows-search-label")
|
||||
description: I18n.tr("panels.launcher.settings-enable-windows-search-description")
|
||||
checked: Settings.data.appLauncher.enableWindowsSearch
|
||||
onToggled: checked => Settings.data.appLauncher.enableWindowsSearch = checked
|
||||
defaultValue: Settings.getDefaultValue("appLauncher.enableWindowsSearch")
|
||||
}
|
||||
|
||||
NToggle {
|
||||
label: I18n.tr("panels.launcher.settings-ignore-mouse-input-label")
|
||||
description: I18n.tr("panels.launcher.settings-ignore-mouse-input-description")
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import qs.Commons
|
||||
import qs.Services.Noctalia
|
||||
@@ -234,14 +233,6 @@ ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
// Downloaded indicator
|
||||
NIcon {
|
||||
icon: "circle-check"
|
||||
pointSize: Style.baseWidgetSize * 0.5
|
||||
color: Color.mPrimary
|
||||
visible: modelData.downloaded === true
|
||||
}
|
||||
|
||||
// Open plugin page button
|
||||
NIconButton {
|
||||
icon: "external-link"
|
||||
@@ -250,22 +241,21 @@ ColumnLayout {
|
||||
onClicked: Qt.openUrlExternally("https://noctalia.dev/plugins/" + modelData.id + "/")
|
||||
}
|
||||
|
||||
// Install/Uninstall button
|
||||
// Downloaded indicator
|
||||
NIcon {
|
||||
icon: "circle-check"
|
||||
pointSize: Style.baseWidgetSize * 0.5
|
||||
color: Color.mPrimary
|
||||
visible: modelData.downloaded === true
|
||||
}
|
||||
|
||||
// Install button (only shown when not downloaded)
|
||||
NIconButton {
|
||||
icon: modelData.downloaded ? "trash" : "download"
|
||||
visible: modelData.downloaded === false
|
||||
icon: "download"
|
||||
baseSize: Style.baseWidgetSize * 0.7
|
||||
tooltipText: modelData.downloaded ? I18n.tr("common.uninstall") : I18n.tr("common.install")
|
||||
onClicked: {
|
||||
if (modelData.downloaded) {
|
||||
// Construct composite key for available plugins
|
||||
var pluginData = Object.assign({}, modelData);
|
||||
pluginData.compositeKey = PluginRegistry.generateCompositeKey(modelData.id, modelData.source?.url || "");
|
||||
uninstallDialog.pluginToUninstall = pluginData;
|
||||
uninstallDialog.open();
|
||||
} else {
|
||||
installPlugin(modelData);
|
||||
}
|
||||
}
|
||||
tooltipText: I18n.tr("common.install")
|
||||
onClicked: installPlugin(modelData)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -346,64 +336,6 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
// Uninstall confirmation dialog
|
||||
Popup {
|
||||
id: uninstallDialog
|
||||
parent: Overlay.overlay
|
||||
modal: true
|
||||
dim: false
|
||||
anchors.centerIn: parent
|
||||
width: 400 * Style.uiScaleRatio
|
||||
padding: Style.marginL
|
||||
|
||||
property var pluginToUninstall: null
|
||||
|
||||
background: Rectangle {
|
||||
color: Color.mSurface
|
||||
radius: Style.radiusS
|
||||
border.color: Color.mPrimary
|
||||
border.width: Style.borderM
|
||||
}
|
||||
|
||||
contentItem: ColumnLayout {
|
||||
width: parent.width
|
||||
spacing: Style.marginL
|
||||
|
||||
NHeader {
|
||||
label: I18n.tr("panels.plugins.uninstall-dialog-title")
|
||||
description: I18n.tr("panels.plugins.uninstall-dialog-description", {
|
||||
"plugin": uninstallDialog.pluginToUninstall?.name || ""
|
||||
})
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: Style.marginM
|
||||
Layout.fillWidth: true
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NButton {
|
||||
text: I18n.tr("common.cancel")
|
||||
onClicked: uninstallDialog.close()
|
||||
}
|
||||
|
||||
NButton {
|
||||
text: I18n.tr("common.uninstall")
|
||||
backgroundColor: Color.mPrimary
|
||||
textColor: Color.mOnPrimary
|
||||
onClicked: {
|
||||
if (uninstallDialog.pluginToUninstall) {
|
||||
uninstallPlugin(uninstallDialog.pluginToUninstall.compositeKey);
|
||||
uninstallDialog.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Timer to check for updates after refresh starts
|
||||
Timer {
|
||||
id: checkUpdatesTimer
|
||||
@@ -433,27 +365,6 @@ ColumnLayout {
|
||||
});
|
||||
}
|
||||
|
||||
function uninstallPlugin(pluginId) {
|
||||
var manifest = PluginRegistry.getPluginManifest(pluginId);
|
||||
var pluginName = manifest?.name || pluginId;
|
||||
|
||||
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstalling", {
|
||||
"plugin": pluginName
|
||||
}));
|
||||
|
||||
PluginService.uninstallPlugin(pluginId, function (success, error) {
|
||||
if (success) {
|
||||
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstall-success", {
|
||||
"plugin": pluginName
|
||||
}));
|
||||
} else {
|
||||
ToastService.showError(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstall-error", {
|
||||
"error": error || "Unknown error"
|
||||
}));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Listen to plugin service signals
|
||||
Connections {
|
||||
target: PluginService
|
||||
|
||||
@@ -41,7 +41,7 @@ ColumnLayout {
|
||||
"count": updateCount
|
||||
})
|
||||
icon: "download"
|
||||
visible: updateCount >= 2
|
||||
visible: (updateCount > 0)
|
||||
enabled: !isUpdating
|
||||
backgroundColor: Color.mPrimary
|
||||
textColor: Color.mOnPrimary
|
||||
@@ -457,6 +457,8 @@ ColumnLayout {
|
||||
var manifest = PluginRegistry.getPluginManifest(pluginId);
|
||||
var pluginName = manifest?.name || pluginId;
|
||||
|
||||
BarService.widgetsRevision++;
|
||||
|
||||
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.tr("panels.plugins.uninstalling", {
|
||||
"plugin": pluginName
|
||||
}));
|
||||
|
||||
@@ -36,28 +36,6 @@ ColumnLayout {
|
||||
}
|
||||
}
|
||||
|
||||
// Temperature Polling
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginM
|
||||
|
||||
NText {
|
||||
Layout.fillWidth: true
|
||||
text: I18n.tr("bar.system-monitor.cpu-temperature-label")
|
||||
pointSize: Style.fontSizeM
|
||||
}
|
||||
|
||||
NSpinBox {
|
||||
from: 250
|
||||
to: 10000
|
||||
stepSize: 250
|
||||
value: Settings.data.systemMonitor.tempPollingInterval
|
||||
defaultValue: Settings.getDefaultValue("systemMonitor.tempPollingInterval")
|
||||
onValueChanged: Settings.data.systemMonitor.tempPollingInterval = value
|
||||
suffix: " ms"
|
||||
}
|
||||
}
|
||||
|
||||
// GPU Polling
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
|
||||
@@ -12,11 +12,11 @@ SmartPanel {
|
||||
id: root
|
||||
|
||||
preferredWidth: Math.round(440 * Style.uiScaleRatio)
|
||||
preferredHeight: Math.round(420 * Style.uiScaleRatio)
|
||||
|
||||
panelContent: Item {
|
||||
id: panelContent
|
||||
property real contentPreferredHeight: mainColumn.implicitHeight + Style.marginL * 2
|
||||
readonly property real cardHeight: 90 * Style.uiScaleRatio
|
||||
|
||||
// Get diskPath from bar's SystemMonitor widget if available, otherwise use "/"
|
||||
readonly property string diskPath: {
|
||||
@@ -69,398 +69,340 @@ SmartPanel {
|
||||
}
|
||||
}
|
||||
|
||||
// Stats Grid + Bottom section
|
||||
// CPU Card (dual-line: usage % + temperature °C)
|
||||
NBox {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: statsContainer.implicitHeight + (Style.marginXL)
|
||||
Layout.preferredHeight: panelContent.cardHeight
|
||||
|
||||
ColumnLayout {
|
||||
id: statsContainer
|
||||
anchors.fill: parent
|
||||
anchors.margins: Style.marginS
|
||||
spacing: Style.marginXS
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginXS
|
||||
|
||||
NIcon {
|
||||
icon: "cpu-usage"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
NText {
|
||||
text: `${Math.round(SystemStatService.cpuUsage)}%`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mPrimary
|
||||
Layout.rightMargin: Style.marginS
|
||||
}
|
||||
|
||||
NIcon {
|
||||
icon: "cpu-temperature"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mError
|
||||
}
|
||||
|
||||
NText {
|
||||
text: `${Math.round(SystemStatService.cpuTemp)}°C`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mError
|
||||
Layout.rightMargin: Style.marginS
|
||||
}
|
||||
|
||||
NIcon {
|
||||
icon: "bolt"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: SystemStatService.cpuFreq
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NText {
|
||||
text: I18n.tr("system-monitor.cpu-usage")
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
}
|
||||
|
||||
NGraph {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
values: SystemStatService.cpuHistory
|
||||
values2: SystemStatService.cpuTempHistory
|
||||
minValue: 0
|
||||
maxValue: Math.max(SystemStatService.cpuHistoryMax, 1)
|
||||
minValue2: Math.max(SystemStatService.cpuTempHistoryMin - 5, 0)
|
||||
maxValue2: Math.max(SystemStatService.cpuTempHistoryMax + 5, 1)
|
||||
color: Color.mPrimary
|
||||
color2: Color.mError
|
||||
fill: true
|
||||
fillOpacity: 0.15
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Memory Card (single-line + optional swap indicator)
|
||||
NBox {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: panelContent.cardHeight
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: Style.marginS
|
||||
spacing: Style.marginXS
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginXS
|
||||
|
||||
NIcon {
|
||||
icon: "memory"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
NText {
|
||||
text: `${Math.round(SystemStatService.memPercent)}% • ${SystemStatService.formatMemoryGb(SystemStatService.memGb).replace(/[^0-9.]/g, "")} GB`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
NIcon {
|
||||
visible: SystemStatService.swapTotalGb > 0
|
||||
icon: "exchange"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
visible: SystemStatService.swapTotalGb > 0
|
||||
text: `${Math.round(SystemStatService.swapPercent)}%`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NText {
|
||||
text: I18n.tr("common.memory")
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
}
|
||||
|
||||
NGraph {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
values: SystemStatService.memHistory
|
||||
minValue: 0
|
||||
maxValue: Math.max(SystemStatService.memHistoryMax, 1)
|
||||
color: Color.mPrimary
|
||||
fill: true
|
||||
fillOpacity: 0.15
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Network Card (dual-line: RX + TX speeds)
|
||||
NBox {
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: panelContent.cardHeight
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: Style.marginS
|
||||
spacing: Style.marginXS
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginXS
|
||||
|
||||
NIcon {
|
||||
icon: "download-speed"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
NText {
|
||||
text: SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mPrimary
|
||||
Layout.rightMargin: Style.marginS
|
||||
}
|
||||
|
||||
NIcon {
|
||||
icon: "upload-speed"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mError
|
||||
}
|
||||
|
||||
NText {
|
||||
text: SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mError
|
||||
}
|
||||
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
}
|
||||
|
||||
NText {
|
||||
text: I18n.tr("common.network")
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
}
|
||||
|
||||
NGraph {
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
values: SystemStatService.rxSpeedHistory
|
||||
values2: SystemStatService.txSpeedHistory
|
||||
minValue: 0
|
||||
maxValue: Math.max(SystemStatService.rxMaxSpeed, 1)
|
||||
minValue2: 0
|
||||
maxValue2: Math.max(SystemStatService.txMaxSpeed, 1)
|
||||
color: Color.mPrimary
|
||||
color2: Color.mError
|
||||
fill: true
|
||||
fillOpacity: 0.15
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Detailed Stats section
|
||||
NBox {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: detailsColumn.implicitHeight + Style.marginXL
|
||||
|
||||
ColumnLayout {
|
||||
id: detailsColumn
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: parent.top
|
||||
anchors.margins: Style.marginM
|
||||
spacing: Style.marginM
|
||||
spacing: Style.marginS
|
||||
|
||||
// Top row: 5 NCircleStat gauges
|
||||
// Load Average
|
||||
RowLayout {
|
||||
id: topRow
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
visible: SystemStatService.nproc > 0
|
||||
|
||||
// CPU Usage
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: cpuUsageGauge.implicitHeight
|
||||
|
||||
NCircleStat {
|
||||
id: cpuUsageGauge
|
||||
anchors.centerIn: parent
|
||||
ratio: SystemStatService.cpuUsage / 100
|
||||
icon: "cpu-usage"
|
||||
suffix: "%"
|
||||
fillColor: SystemStatService.cpuColor
|
||||
tooltipText: I18n.tr("system-monitor.cpu-usage") + `: ${Math.round(SystemStatService.cpuUsage)}%`
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onCpuUsageChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === cpuUsageGauge) {
|
||||
TooltipService.updateText(I18n.tr("system-monitor.cpu-usage") + `: ${Math.round(SystemStatService.cpuUsage)}%`);
|
||||
}
|
||||
}
|
||||
}
|
||||
NIcon {
|
||||
icon: "cpu-usage"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
// CPU Temperature
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: cpuTempGauge.implicitHeight
|
||||
|
||||
NCircleStat {
|
||||
id: cpuTempGauge
|
||||
anchors.centerIn: parent
|
||||
ratio: SystemStatService.cpuTemp / 100
|
||||
icon: "cpu-temperature"
|
||||
suffix: "\u00B0"
|
||||
fillColor: SystemStatService.tempColor
|
||||
tooltipText: I18n.tr("system-monitor.cpu-temp") + `: ${Math.round(SystemStatService.cpuTemp)}°C`
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onCpuTempChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === cpuTempGauge) {
|
||||
TooltipService.updateText(I18n.tr("system-monitor.cpu-temp") + `: ${Math.round(SystemStatService.cpuTemp)}°C`);
|
||||
}
|
||||
}
|
||||
}
|
||||
NText {
|
||||
text: I18n.tr("system-monitor.load-average") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
// GPU Temperature
|
||||
Item {
|
||||
NText {
|
||||
text: `${SystemStatService.loadAvg1.toFixed(2)} • ${SystemStatService.loadAvg5.toFixed(2)} • ${SystemStatService.loadAvg15.toFixed(2)}`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: gpuTempGauge.implicitHeight
|
||||
visible: SystemStatService.gpuAvailable
|
||||
|
||||
NCircleStat {
|
||||
id: gpuTempGauge
|
||||
anchors.centerIn: parent
|
||||
ratio: SystemStatService.gpuTemp / 100
|
||||
icon: "gpu-temperature"
|
||||
suffix: "\u00B0"
|
||||
fillColor: SystemStatService.gpuColor
|
||||
tooltipText: I18n.tr("system-monitor.gpu-temp") + `: ${Math.round(SystemStatService.gpuTemp)}°C`
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onGpuTempChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === gpuTempGauge) {
|
||||
TooltipService.updateText(I18n.tr("system-monitor.gpu-temp") + `: ${Math.round(SystemStatService.gpuTemp)}°C`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Memory Usage
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: memPercentGauge.implicitHeight
|
||||
|
||||
NCircleStat {
|
||||
id: memPercentGauge
|
||||
anchors.centerIn: parent
|
||||
ratio: SystemStatService.memPercent / 100
|
||||
icon: "memory"
|
||||
suffix: "%"
|
||||
fillColor: SystemStatService.memColor
|
||||
tooltipText: I18n.tr("common.memory") + `: ${Math.round(SystemStatService.memPercent)}%`
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onMemPercentChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === memPercentGauge) {
|
||||
TooltipService.updateText(I18n.tr("common.memory") + `: ${Math.round(SystemStatService.memPercent)}%`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Swap Usage (only visible if swap is enabled)
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: swapPercentGauge.implicitHeight
|
||||
visible: SystemStatService.swapTotalGb > 0
|
||||
|
||||
NCircleStat {
|
||||
id: swapPercentGauge
|
||||
anchors.centerIn: parent
|
||||
ratio: SystemStatService.swapPercent / 100
|
||||
icon: "exchange"
|
||||
suffix: "%"
|
||||
fillColor: SystemStatService.swapColor
|
||||
tooltipText: I18n.tr("bar.system-monitor.swap-usage-label") + `: ${Math.round(SystemStatService.swapPercent)}%`
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onSwapPercentChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === swapPercentGauge) {
|
||||
TooltipService.updateText(I18n.tr("bar.system-monitor.swap-usage-label") + `: ${Math.round(SystemStatService.swapPercent)}%`);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Disk Usage
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: diskPercentsGauge.implicitHeight
|
||||
|
||||
NCircleStat {
|
||||
id: diskPercentsGauge
|
||||
anchors.centerIn: parent
|
||||
ratio: (SystemStatService.diskPercents[panelContent.diskPath] ?? 0) / 100
|
||||
icon: "storage"
|
||||
suffix: "%"
|
||||
fillColor: SystemStatService.getDiskColor(panelContent.diskPath)
|
||||
tooltipText: I18n.tr("system-monitor.disk") + `: ${SystemStatService.diskPercents[panelContent.diskPath] || 0}%\n${panelContent.diskPath}`
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onDiskPercentsChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === diskPercentsGauge) {
|
||||
TooltipService.updateText(I18n.tr("system-monitor.disk") + `: ${SystemStatService.diskPercents[panelContent.diskPath] || 0}%\n${panelContent.diskPath}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
|
||||
// Divider
|
||||
NDivider {
|
||||
Layout.fillWidth: true
|
||||
Layout.topMargin: Style.marginS
|
||||
Layout.bottomMargin: Style.marginXS
|
||||
}
|
||||
|
||||
// Bottom row: 2 NCircleStat (download/upload) with speeds below + Detailed Stats
|
||||
// Disk usage
|
||||
RowLayout {
|
||||
id: bottomRow
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
|
||||
// Number of visible gauges in top row
|
||||
readonly property int topRowGaugeCount: {
|
||||
let count = 4; // CPU, CPU Temp, Memory, Disk
|
||||
if (SystemStatService.gpuAvailable)
|
||||
count++;
|
||||
if (SystemStatService.swapTotalGb > 0)
|
||||
count++;
|
||||
return count;
|
||||
NIcon {
|
||||
icon: "storage"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
// Download gauge with speed below (same width as top row items)
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: downloadColumn.implicitHeight
|
||||
|
||||
ColumnLayout {
|
||||
id: downloadColumn
|
||||
anchors.centerIn: parent
|
||||
spacing: Style.marginS
|
||||
|
||||
NCircleStat {
|
||||
id: rxSpeedGauge
|
||||
ratio: SystemStatService.rxRatio
|
||||
icon: "download-speed"
|
||||
suffix: "%"
|
||||
fillColor: Color.mPrimary
|
||||
tooltipText: I18n.tr("common.download") + `: ${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
|
||||
NText {
|
||||
text: SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
|
||||
pointSize: Style.fontSizeXXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onRxSpeedChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === rxSpeedGauge) {
|
||||
TooltipService.updateText(I18n.tr("common.download") + `: ${SystemStatService.formatSpeed(SystemStatService.rxSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
NText {
|
||||
text: I18n.tr("system-monitor.disk") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
// Upload gauge with speed below (same width as top row items)
|
||||
Item {
|
||||
Layout.fillWidth: true
|
||||
implicitHeight: uploadColumn.implicitHeight
|
||||
|
||||
ColumnLayout {
|
||||
id: uploadColumn
|
||||
anchors.centerIn: parent
|
||||
spacing: Style.marginS
|
||||
|
||||
NCircleStat {
|
||||
id: txSpeedGauge
|
||||
ratio: SystemStatService.txRatio
|
||||
icon: "upload-speed"
|
||||
suffix: "%"
|
||||
fillColor: Color.mPrimary
|
||||
tooltipText: I18n.tr("common.upload") + `: ${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s"
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
|
||||
NText {
|
||||
text: SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2") + "/s"
|
||||
pointSize: Style.fontSizeXXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: SystemStatService
|
||||
function onTxSpeedChanged() {
|
||||
if (TooltipService.activeTooltip && TooltipService.activeTooltip.targetItem === txSpeedGauge) {
|
||||
TooltipService.updateText(I18n.tr("common.upload") + `: ${SystemStatService.formatSpeed(SystemStatService.txSpeed).replace(/([0-9.]+)([A-Za-z]+)/, "$1 $2")}` + "/s");
|
||||
}
|
||||
}
|
||||
}
|
||||
NText {
|
||||
text: {
|
||||
const usedGb = SystemStatService.diskUsedGb[panelContent.diskPath] || 0;
|
||||
const sizeGb = SystemStatService.diskSizeGb[panelContent.diskPath] || 0;
|
||||
const percent = SystemStatService.diskPercents[panelContent.diskPath] || 0;
|
||||
return `${percent}% (${usedGb.toFixed(1)} / ${sizeGb.toFixed(1)} GB)`;
|
||||
}
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
elide: Text.ElideMiddle
|
||||
}
|
||||
}
|
||||
|
||||
// GPU Temperature (only if available)
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
visible: SystemStatService.gpuAvailable
|
||||
|
||||
NIcon {
|
||||
icon: "gpu-temperature"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
// Detailed Stats column (takes remaining space equivalent to topRowGaugeCount - 2 items)
|
||||
Item {
|
||||
NText {
|
||||
text: I18n.tr("system-monitor.gpu-temp") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: `${Math.round(SystemStatService.gpuTemp)}°C`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
Layout.fillHeight: true
|
||||
Layout.preferredWidth: bottomRow.topRowGaugeCount - 2 // Match remaining top row slots
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
id: detailsColumn
|
||||
anchors.fill: parent
|
||||
spacing: -Style.marginM
|
||||
// Swap details (only visible if swap is enabled)
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
visible: SystemStatService.swapTotalGb > 0
|
||||
|
||||
// Load average
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
visible: SystemStatService.nproc > 0
|
||||
NIcon {
|
||||
icon: "exchange"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mPrimary
|
||||
}
|
||||
|
||||
NIcon {
|
||||
icon: "cpu-usage"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
NText {
|
||||
text: I18n.tr("bar.system-monitor.swap-usage-label") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: I18n.tr("system-monitor.load-average") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: `${SystemStatService.loadAvg1.toFixed(2)} · ${SystemStatService.loadAvg5.toFixed(2)} · ${SystemStatService.loadAvg15.toFixed(2)}`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
|
||||
// Memory details
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
|
||||
NIcon {
|
||||
icon: "memory"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: I18n.tr("common.memory") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: SystemStatService.formatGigabytes(SystemStatService.memGb).replace(/[^0-9.]/g, "") + " GB"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
|
||||
// Swap details (only visible if swap is enabled)
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
visible: SystemStatService.swapTotalGb > 0
|
||||
|
||||
NIcon {
|
||||
icon: "exchange"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: I18n.tr("bar.system-monitor.swap-usage-label") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: `${SystemStatService.formatGigabytes(SystemStatService.swapGb).replace(/[^0-9.]/g, "") + " GB"} / ${SystemStatService.formatGigabytes(SystemStatService.swapTotalGb).replace(/[^0-9.]/g, "") + " GB"}`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
|
||||
// Disk details
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: Style.marginS
|
||||
|
||||
NIcon {
|
||||
icon: "storage"
|
||||
pointSize: Style.fontSizeM
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: I18n.tr("system-monitor.disk") + ":"
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurfaceVariant
|
||||
}
|
||||
|
||||
NText {
|
||||
text: {
|
||||
const usedGb = SystemStatService.diskUsedGb[panelContent.diskPath] || 0;
|
||||
const sizeGb = SystemStatService.diskSizeGb[panelContent.diskPath] || 0;
|
||||
return `${usedGb.toFixed(1)} GB / ${sizeGb.toFixed(1)} GB`;
|
||||
}
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
}
|
||||
NText {
|
||||
text: `${SystemStatService.formatMemoryGb(SystemStatService.swapGb).replace(/[^0-9.]/g, "")} / ${SystemStatService.formatMemoryGb(SystemStatService.swapTotalGb).replace(/[^0-9.]/g, "")} GB`
|
||||
pointSize: Style.fontSizeXS
|
||||
color: Color.mOnSurface
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignRight
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -752,6 +752,50 @@ SmartPanel {
|
||||
}
|
||||
}
|
||||
|
||||
NIconButton {
|
||||
property string sortOrder: Settings.data.wallpaper.sortOrder || "name"
|
||||
icon: {
|
||||
if (sortOrder === "date_desc")
|
||||
return "clock";
|
||||
if (sortOrder === "date_asc")
|
||||
return "history";
|
||||
if (sortOrder === "name_desc")
|
||||
return "sort-descending";
|
||||
return "sort-ascending";
|
||||
}
|
||||
tooltipText: {
|
||||
if (sortOrder === "date_desc")
|
||||
return "Sort: Newest First";
|
||||
if (sortOrder === "date_asc")
|
||||
return "Sort: Oldest First";
|
||||
if (sortOrder === "name_desc")
|
||||
return "Sort: Name (Z-A)";
|
||||
return "Sort: Name (A-Z)";
|
||||
}
|
||||
baseSize: Style.baseWidgetSize * 0.8
|
||||
onClicked: {
|
||||
var next = "name";
|
||||
if (sortOrder === "name")
|
||||
next = "date_desc";
|
||||
else if (sortOrder === "date_desc")
|
||||
next = "name"; // Toggle simpler: Name -> Newest -> Name
|
||||
// Expanded cycle: Name -> Newest -> Oldest -> Z-A -> Name
|
||||
// User just asked for "newest first", so let's make it easy to reach.
|
||||
// Let's do: Name (A-Z) -> Newest -> Oldest -> Name (Z-A) -> ...
|
||||
|
||||
if (sortOrder === "name")
|
||||
next = "date_desc";
|
||||
else if (sortOrder === "date_desc")
|
||||
next = "date_asc";
|
||||
else if (sortOrder === "date_asc")
|
||||
next = "name_desc";
|
||||
else
|
||||
next = "name";
|
||||
|
||||
Settings.data.wallpaper.sortOrder = next;
|
||||
}
|
||||
}
|
||||
|
||||
NIconButton {
|
||||
icon: getViewModeIcon()
|
||||
tooltipText: getViewModeTooltip()
|
||||
|
||||
@@ -2,6 +2,7 @@ import QtQuick
|
||||
import QtQuick.Controls
|
||||
import QtQuick.Layouts
|
||||
import qs.Commons
|
||||
import qs.Services.System
|
||||
import qs.Widgets
|
||||
|
||||
Item {
|
||||
@@ -27,6 +28,29 @@ Item {
|
||||
opacity: 0
|
||||
scale: initialScale
|
||||
|
||||
property real progress: 1.0
|
||||
property int hoverCount: 0
|
||||
|
||||
onHoverCountChanged: {
|
||||
if (hoverCount > 0) {
|
||||
resumeTimer.stop();
|
||||
progressAnimation.pause();
|
||||
} else {
|
||||
resumeTimer.start();
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: resumeTimer
|
||||
interval: 50
|
||||
repeat: false
|
||||
onTriggered: {
|
||||
if (hoverCount === 0) {
|
||||
progressAnimation.resume();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Background rectangle (apply shadows here)
|
||||
Rectangle {
|
||||
id: background
|
||||
@@ -40,9 +64,6 @@ Item {
|
||||
border.color: {
|
||||
var baseColor;
|
||||
switch (root.type) {
|
||||
case "warning":
|
||||
baseColor = Color.mPrimary;
|
||||
break;
|
||||
case "error":
|
||||
baseColor = Color.mError;
|
||||
break;
|
||||
@@ -52,6 +73,40 @@ Item {
|
||||
}
|
||||
return Qt.alpha(baseColor, Settings.data.notifications.backgroundOpacity || 1.0);
|
||||
}
|
||||
|
||||
// Progress bar
|
||||
Rectangle {
|
||||
anchors.top: parent.top
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: 2
|
||||
color: "transparent"
|
||||
|
||||
Rectangle {
|
||||
id: progressBar
|
||||
readonly property real progressWidth: background.width - (2 * background.radius)
|
||||
height: parent.height
|
||||
// Mirrored logic: centers the bar as it shrinks
|
||||
x: background.radius + (progressWidth * (1 - root.progress)) / 2
|
||||
width: progressWidth * root.progress
|
||||
|
||||
color: {
|
||||
var baseColor;
|
||||
switch (root.type) {
|
||||
case "warning":
|
||||
baseColor = Color.mPrimary;
|
||||
break;
|
||||
case "error":
|
||||
baseColor = Color.mError;
|
||||
break;
|
||||
default:
|
||||
baseColor = Color.mPrimary; // Match standard notification color
|
||||
break;
|
||||
}
|
||||
return Qt.alpha(baseColor, Settings.data.notifications.backgroundOpacity || 1.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NDropShadow {
|
||||
@@ -60,6 +115,23 @@ Item {
|
||||
autoPaddingEnabled: true
|
||||
}
|
||||
|
||||
NumberAnimation {
|
||||
id: progressAnimation
|
||||
target: root
|
||||
property: "progress"
|
||||
from: 1.0
|
||||
to: 0.0
|
||||
duration: root.duration
|
||||
easing.type: Easing.Linear
|
||||
onFinished: {
|
||||
if (root.progress === 0.0 && root.visible) {
|
||||
root.hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Timer: hideTimer removed, using progressAnimation
|
||||
|
||||
Behavior on opacity {
|
||||
NumberAnimation {
|
||||
duration: Style.animationNormal
|
||||
@@ -74,12 +146,6 @@ Item {
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: hideTimer
|
||||
interval: root.duration
|
||||
onTriggered: root.hide()
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: hideAnimation
|
||||
interval: Style.animationFast
|
||||
@@ -91,7 +157,7 @@ Item {
|
||||
|
||||
// Cleanup on destruction
|
||||
Component.onDestruction: {
|
||||
hideTimer.stop();
|
||||
progressAnimation.stop();
|
||||
hideAnimation.stop();
|
||||
}
|
||||
|
||||
@@ -100,8 +166,12 @@ Item {
|
||||
anchors.fill: background
|
||||
acceptedButtons: Qt.LeftButton
|
||||
hoverEnabled: true
|
||||
onEntered: hideTimer.stop()
|
||||
onExited: hideTimer.restart()
|
||||
onEntered: {
|
||||
root.hoverCount++;
|
||||
}
|
||||
onExited: {
|
||||
root.hoverCount--;
|
||||
}
|
||||
onClicked: root.hide()
|
||||
cursorShape: Qt.PointingHandCursor
|
||||
}
|
||||
@@ -176,6 +246,10 @@ Item {
|
||||
hoverColor: Color.mHover
|
||||
outlined: false
|
||||
implicitHeight: 24
|
||||
|
||||
onEntered: root.hoverCount++
|
||||
onExited: root.hoverCount--
|
||||
|
||||
onClicked: {
|
||||
if (root.actionCallback) {
|
||||
root.actionCallback();
|
||||
@@ -188,7 +262,7 @@ Item {
|
||||
|
||||
function show(msgTitle, msgDescription, msgIcon, msgType, msgDuration, msgActionLabel, msgActionCallback) {
|
||||
// Stop all timers first
|
||||
hideTimer.stop();
|
||||
progressAnimation.stop();
|
||||
hideAnimation.stop();
|
||||
|
||||
title = msgTitle;
|
||||
@@ -202,23 +276,28 @@ Item {
|
||||
visible = true;
|
||||
opacity = 1.0;
|
||||
scale = 1.0;
|
||||
progress = 1.0;
|
||||
hoverCount = 0;
|
||||
|
||||
hideTimer.restart();
|
||||
// Configure and start animation
|
||||
progressAnimation.duration = duration;
|
||||
progressAnimation.from = 1.0;
|
||||
progressAnimation.to = 0.0;
|
||||
progressAnimation.restart();
|
||||
}
|
||||
|
||||
function hide() {
|
||||
hideTimer.stop();
|
||||
progressAnimation.stop();
|
||||
opacity = 0;
|
||||
scale = initialScale;
|
||||
hideAnimation.restart();
|
||||
}
|
||||
|
||||
function hideImmediately() {
|
||||
hideTimer.stop();
|
||||
hideAnimation.stop();
|
||||
progressAnimation.stop();
|
||||
opacity = 0;
|
||||
scale = initialScale;
|
||||
root.visible = false;
|
||||
root.hidden();
|
||||
}
|
||||
}
|
||||
@@ -229,7 +229,7 @@ Item {
|
||||
toastItem.hideImmediately();
|
||||
}
|
||||
|
||||
SimpleToast {
|
||||
Toast {
|
||||
id: toastItem
|
||||
onHidden: root.onToastHidden()
|
||||
}
|
||||
|
||||
+258
-121
@@ -1,4 +1,5 @@
|
||||
import QtQuick
|
||||
import QtQuick.Layouts
|
||||
import Quickshell
|
||||
import qs.Commons
|
||||
import qs.Widgets
|
||||
@@ -7,16 +8,42 @@ PopupWindow {
|
||||
id: root
|
||||
|
||||
property string text: ""
|
||||
property var rows: null // Array of arrays for grid mode: [["col1", "col2"], ["row2col1", "row2col2"]]
|
||||
property bool isGridMode: rows !== null && Array.isArray(rows) && rows.length > 0
|
||||
property int columnCount: isGridMode && rows.length > 0 ? rows[0].length : 0
|
||||
property string direction: "auto" // "auto", "left", "right", "top", "bottom"
|
||||
property int margin: Style.marginXS // distance from target
|
||||
property int padding: Style.marginM
|
||||
property int gridPaddingVertical: Style.marginXS // extra vertical padding for grid mode
|
||||
property int delay: 0
|
||||
property int hideDelay: 0
|
||||
property int maxWidth: 320
|
||||
property int maxWidth: 340
|
||||
|
||||
property int animationDuration: Style.animationFast
|
||||
property real animationScale: 0.85
|
||||
|
||||
// Font scale calculation matching NText behavior
|
||||
readonly property real gridFontScale: {
|
||||
const baseScale = (tooltipText.family === Settings.data.ui.fontDefault ? Settings.data.ui.fontDefaultScale : Settings.data.ui.fontFixedScale);
|
||||
return baseScale * Style.uiScaleRatio;
|
||||
}
|
||||
|
||||
// For measuring grid cell widths - must match actual NText font
|
||||
TextMetrics {
|
||||
id: cellMetrics
|
||||
font.family: tooltipText.family
|
||||
font.pointSize: Math.max(1, Style.fontSizeS * gridFontScale)
|
||||
}
|
||||
|
||||
// For measuring grid row height - hidden NText matches actual grid items exactly
|
||||
NText {
|
||||
id: rowHeightMeasure
|
||||
visible: false
|
||||
text: "Ag" // Characters with ascenders and descenders
|
||||
pointSize: Style.fontSizeS
|
||||
family: tooltipText.family
|
||||
}
|
||||
|
||||
// Internal properties
|
||||
property var targetItem: null
|
||||
property real anchorX: 0
|
||||
@@ -106,9 +133,9 @@ PopupWindow {
|
||||
}
|
||||
}
|
||||
|
||||
// Function to show tooltip
|
||||
function show(target, tipText, customDirection, showDelay, fontFamily) {
|
||||
if (!target || !tipText || tipText === "")
|
||||
// Function to show tooltip (content can be string or array of arrays for grid mode)
|
||||
function show(target, content, customDirection, showDelay, fontFamily) {
|
||||
if (!target || !content || content === "" || (Array.isArray(content) && content.length === 0))
|
||||
return;
|
||||
|
||||
root.delay = showDelay;
|
||||
@@ -124,11 +151,17 @@ PopupWindow {
|
||||
hideImmediately();
|
||||
}
|
||||
|
||||
// Convert \n to <br> for RichText format
|
||||
const processedText = tipText.replace(/\n/g, '<br>');
|
||||
// Set content based on type
|
||||
if (Array.isArray(content)) {
|
||||
rows = content;
|
||||
text = "";
|
||||
} else {
|
||||
// Convert \n to <br> for RichText format
|
||||
const processedText = content.replace(/\n/g, '<br>');
|
||||
text = processedText;
|
||||
rows = null;
|
||||
}
|
||||
|
||||
// Set properties
|
||||
text = processedText;
|
||||
targetItem = target;
|
||||
|
||||
// Find the correct screen dimensions based on target's global position
|
||||
@@ -166,17 +199,68 @@ PopupWindow {
|
||||
tooltipText.family = fontFamily ? fontFamily : Settings.data.ui.fontDefault;
|
||||
}
|
||||
|
||||
// Calculate grid dimensions using measurements that match actual NText rendering
|
||||
function calculateGridSize() {
|
||||
if (!rows || rows.length === 0)
|
||||
return {
|
||||
width: 0,
|
||||
height: 0
|
||||
};
|
||||
|
||||
const numCols = rows[0].length;
|
||||
const numRows = rows.length;
|
||||
let columnWidths = [];
|
||||
|
||||
// Find max width for each column using TextMetrics
|
||||
for (let col = 0; col < numCols; col++) {
|
||||
let maxWidth = 0;
|
||||
for (let row = 0; row < numRows; row++) {
|
||||
cellMetrics.text = rows[row][col] || "";
|
||||
if (cellMetrics.width > maxWidth) {
|
||||
maxWidth = cellMetrics.width;
|
||||
}
|
||||
}
|
||||
columnWidths.push(maxWidth);
|
||||
}
|
||||
|
||||
// Calculate total width: sum of columns + spacing between columns
|
||||
let totalWidth = 0;
|
||||
for (let i = 0; i < columnWidths.length; i++) {
|
||||
totalWidth += columnWidths[i];
|
||||
}
|
||||
totalWidth += (numCols - 1) * Style.marginM; // columnSpacing
|
||||
|
||||
// Calculate total height using hidden NText for accurate row height
|
||||
const rowHeight = rowHeightMeasure.implicitHeight;
|
||||
const totalHeight = numRows * rowHeight;
|
||||
|
||||
return {
|
||||
width: totalWidth,
|
||||
height: totalHeight
|
||||
};
|
||||
}
|
||||
|
||||
// Function to position and display the tooltip
|
||||
function positionAndShow() {
|
||||
if (!targetItem || !targetItem.parent) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Calculate tooltip dimensions
|
||||
const tipWidth = Math.min(tooltipText.implicitWidth + (padding * 2), maxWidth);
|
||||
// Calculate tooltip dimensions based on content mode
|
||||
let contentWidth, contentHeight;
|
||||
if (isGridMode) {
|
||||
const gridSize = calculateGridSize();
|
||||
contentWidth = gridSize.width;
|
||||
contentHeight = gridSize.height;
|
||||
} else {
|
||||
contentWidth = tooltipText.implicitWidth;
|
||||
contentHeight = tooltipText.implicitHeight;
|
||||
}
|
||||
|
||||
const tipWidth = Math.min(contentWidth + (padding * 2), maxWidth);
|
||||
root.implicitWidth = tipWidth;
|
||||
|
||||
const tipHeight = tooltipText.implicitHeight + (padding * 2);
|
||||
const tipHeight = contentHeight + (padding * 2);
|
||||
root.implicitHeight = tipHeight;
|
||||
|
||||
// Get target's global position and convert to screen-relative
|
||||
@@ -377,6 +461,7 @@ PopupWindow {
|
||||
visible = false;
|
||||
animatingOut = false;
|
||||
text = "";
|
||||
rows = null;
|
||||
isPositioned = false;
|
||||
tooltipContainer.opacity = 1.0;
|
||||
tooltipContainer.scale = 1.0;
|
||||
@@ -392,120 +477,147 @@ PopupWindow {
|
||||
completeHide();
|
||||
}
|
||||
|
||||
// Update text function
|
||||
function updateText(newText) {
|
||||
// Update content function (supports both text and rows)
|
||||
function updateContent(newContent) {
|
||||
if (visible && targetItem) {
|
||||
// Convert \n to <br> for RichText format
|
||||
const processedText = newText.replace(/\n/g, '<br>');
|
||||
text = processedText;
|
||||
|
||||
// Recalculate dimensions
|
||||
const tipWidth = Math.min(tooltipText.implicitWidth + (padding * 2), maxWidth);
|
||||
root.implicitWidth = tipWidth;
|
||||
|
||||
const tipHeight = tooltipText.implicitHeight + (padding * 2);
|
||||
root.implicitHeight = tipHeight;
|
||||
|
||||
// Reposition based on current direction (screen-relative)
|
||||
var targetGlobalAbs = targetItem.mapToGlobal(0, 0);
|
||||
var targetGlobal = {
|
||||
"x": targetGlobalAbs.x - screenX,
|
||||
"y": targetGlobalAbs.y - screenY
|
||||
};
|
||||
const targetWidth = targetItem.width;
|
||||
const targetHeight = targetItem.height;
|
||||
|
||||
// Recalculate base anchor position (center on target for top/bottom, etc.)
|
||||
var newAnchorX = anchorX;
|
||||
var newAnchorY = anchorY;
|
||||
|
||||
// Determine which direction the tooltip is currently positioned
|
||||
// and recalculate the centering for that direction
|
||||
var isHorizontalTooltip = false;
|
||||
var isVerticalTooltip = false;
|
||||
if (anchorY > targetHeight / 2) {
|
||||
// Tooltip is below target
|
||||
newAnchorX = (targetWidth - tipWidth) / 2;
|
||||
isHorizontalTooltip = true;
|
||||
} else if (anchorY < -tipHeight / 2) {
|
||||
// Tooltip is above target
|
||||
newAnchorX = (targetWidth - tipWidth) / 2;
|
||||
isHorizontalTooltip = true;
|
||||
} else if (anchorX > targetWidth / 2) {
|
||||
// Tooltip is to the right
|
||||
newAnchorY = (targetHeight - tipHeight) / 2;
|
||||
isVerticalTooltip = true;
|
||||
} else if (anchorX < -tipWidth / 2) {
|
||||
// Tooltip is to the left
|
||||
newAnchorY = (targetHeight - tipHeight) / 2;
|
||||
isVerticalTooltip = true;
|
||||
if (Array.isArray(newContent)) {
|
||||
rows = newContent;
|
||||
text = "";
|
||||
} else {
|
||||
// Convert \n to <br> for RichText format
|
||||
const processedText = newContent.replace(/\n/g, '<br>');
|
||||
text = processedText;
|
||||
rows = null;
|
||||
}
|
||||
|
||||
// Adjust horizontal position to keep tooltip on screen if needed
|
||||
// For top/bottom tooltips, always adjust horizontally (they don't overlap horizontally)
|
||||
// For left/right tooltips, check for overlap before adjusting
|
||||
const globalX = targetGlobal.x + newAnchorX;
|
||||
if (globalX < 0) {
|
||||
const adjustedX = -targetGlobal.x + margin;
|
||||
if (isHorizontalTooltip) {
|
||||
newAnchorX = adjustedX;
|
||||
} else {
|
||||
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorX = adjustedX;
|
||||
}
|
||||
}
|
||||
} else if (globalX + tipWidth > screenWidth) {
|
||||
const adjustedX = screenWidth - targetGlobal.x - tipWidth - margin;
|
||||
if (isHorizontalTooltip) {
|
||||
newAnchorX = adjustedX;
|
||||
} else {
|
||||
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorX = adjustedX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Adjust vertical position to keep tooltip on screen if needed
|
||||
// For left/right tooltips, always adjust vertically (they don't overlap vertically)
|
||||
// For top/bottom tooltips, check for overlap before adjusting
|
||||
const globalY = targetGlobal.y + newAnchorY;
|
||||
if (globalY < 0) {
|
||||
const adjustedY = -targetGlobal.y + margin;
|
||||
if (isVerticalTooltip) {
|
||||
newAnchorY = adjustedY;
|
||||
} else {
|
||||
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorY = adjustedY;
|
||||
}
|
||||
}
|
||||
} else if (globalY + tipHeight > screenHeight) {
|
||||
const adjustedY = screenHeight - targetGlobal.y - tipHeight - margin;
|
||||
if (isVerticalTooltip) {
|
||||
newAnchorY = adjustedY;
|
||||
} else {
|
||||
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorY = adjustedY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the new anchor positions
|
||||
anchorX = newAnchorX;
|
||||
anchorY = newAnchorY;
|
||||
|
||||
// Force anchor update
|
||||
Qt.callLater(() => {
|
||||
if (root.anchor && root.visible) {
|
||||
root.anchor.updateAnchor();
|
||||
}
|
||||
});
|
||||
// Defer dimension recalculation to allow GridLayout to update
|
||||
Qt.callLater(updateContentDeferred);
|
||||
}
|
||||
}
|
||||
|
||||
function updateContentDeferred() {
|
||||
if (!visible || !targetItem) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Recalculate dimensions based on content mode
|
||||
// Use calculateGridSize() for consistency with initial show
|
||||
let contentWidth, contentHeight;
|
||||
if (isGridMode) {
|
||||
const gridSize = calculateGridSize();
|
||||
contentWidth = gridSize.width;
|
||||
contentHeight = gridSize.height;
|
||||
} else {
|
||||
contentWidth = tooltipText.implicitWidth;
|
||||
contentHeight = tooltipText.implicitHeight;
|
||||
}
|
||||
|
||||
const tipWidth = Math.min(contentWidth + (padding * 2), maxWidth);
|
||||
root.implicitWidth = tipWidth;
|
||||
|
||||
const tipHeight = contentHeight + (padding * 2);
|
||||
root.implicitHeight = tipHeight;
|
||||
|
||||
// Reposition based on current direction (screen-relative)
|
||||
var targetGlobalAbs = targetItem.mapToGlobal(0, 0);
|
||||
var targetGlobal = {
|
||||
"x": targetGlobalAbs.x - screenX,
|
||||
"y": targetGlobalAbs.y - screenY
|
||||
};
|
||||
const targetWidth = targetItem.width;
|
||||
const targetHeight = targetItem.height;
|
||||
|
||||
// Recalculate base anchor position (center on target for top/bottom, etc.)
|
||||
var newAnchorX = anchorX;
|
||||
var newAnchorY = anchorY;
|
||||
|
||||
// Determine which direction the tooltip is currently positioned
|
||||
// and recalculate the centering for that direction
|
||||
var isHorizontalTooltip = false;
|
||||
var isVerticalTooltip = false;
|
||||
if (anchorY > targetHeight / 2) {
|
||||
// Tooltip is below target
|
||||
newAnchorX = (targetWidth - tipWidth) / 2;
|
||||
isHorizontalTooltip = true;
|
||||
} else if (anchorY < -tipHeight / 2) {
|
||||
// Tooltip is above target
|
||||
newAnchorX = (targetWidth - tipWidth) / 2;
|
||||
isHorizontalTooltip = true;
|
||||
} else if (anchorX > targetWidth / 2) {
|
||||
// Tooltip is to the right
|
||||
newAnchorY = (targetHeight - tipHeight) / 2;
|
||||
isVerticalTooltip = true;
|
||||
} else if (anchorX < -tipWidth / 2) {
|
||||
// Tooltip is to the left
|
||||
newAnchorY = (targetHeight - tipHeight) / 2;
|
||||
isVerticalTooltip = true;
|
||||
}
|
||||
|
||||
// Adjust horizontal position to keep tooltip on screen if needed
|
||||
const globalX = targetGlobal.x + newAnchorX;
|
||||
if (globalX < 0) {
|
||||
const adjustedX = -targetGlobal.x + margin;
|
||||
if (isHorizontalTooltip) {
|
||||
newAnchorX = adjustedX;
|
||||
} else {
|
||||
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorX = adjustedX;
|
||||
}
|
||||
}
|
||||
} else if (globalX + tipWidth > screenWidth) {
|
||||
const adjustedX = screenWidth - targetGlobal.x - tipWidth - margin;
|
||||
if (isHorizontalTooltip) {
|
||||
newAnchorX = adjustedX;
|
||||
} else {
|
||||
const wouldOverlap = adjustedX < targetWidth && adjustedX + tipWidth > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorX = adjustedX;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Adjust vertical position to keep tooltip on screen if needed
|
||||
const globalY = targetGlobal.y + newAnchorY;
|
||||
if (globalY < 0) {
|
||||
const adjustedY = -targetGlobal.y + margin;
|
||||
if (isVerticalTooltip) {
|
||||
newAnchorY = adjustedY;
|
||||
} else {
|
||||
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorY = adjustedY;
|
||||
}
|
||||
}
|
||||
} else if (globalY + tipHeight > screenHeight) {
|
||||
const adjustedY = screenHeight - targetGlobal.y - tipHeight - margin;
|
||||
if (isVerticalTooltip) {
|
||||
newAnchorY = adjustedY;
|
||||
} else {
|
||||
const wouldOverlap = adjustedY < targetHeight && adjustedY + tipHeight > 0;
|
||||
if (!wouldOverlap) {
|
||||
newAnchorY = adjustedY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply the new anchor positions
|
||||
anchorX = newAnchorX;
|
||||
anchorY = newAnchorY;
|
||||
|
||||
// Force anchor update
|
||||
Qt.callLater(() => {
|
||||
if (root.anchor && root.visible) {
|
||||
root.anchor.updateAnchor();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Backward compatibility alias
|
||||
function updateText(newText) {
|
||||
updateContent(newText);
|
||||
}
|
||||
|
||||
// Reset function to clean up state
|
||||
function reset() {
|
||||
// Stop all timers and animations
|
||||
@@ -518,6 +630,7 @@ PopupWindow {
|
||||
visible = false;
|
||||
animatingOut = false;
|
||||
text = "";
|
||||
rows = null;
|
||||
isPositioned = false;
|
||||
|
||||
// Reset to defaults
|
||||
@@ -547,11 +660,13 @@ PopupWindow {
|
||||
border.width: Style.borderS
|
||||
radius: Style.radiusS
|
||||
|
||||
// Only show content when we have text
|
||||
visible: root.text !== ""
|
||||
// Only show content when we have content
|
||||
visible: root.text !== "" || root.isGridMode
|
||||
|
||||
// Text content (default mode)
|
||||
NText {
|
||||
id: tooltipText
|
||||
visible: !root.isGridMode
|
||||
anchors.centerIn: parent
|
||||
anchors.margins: root.padding
|
||||
text: root.text
|
||||
@@ -564,6 +679,28 @@ PopupWindow {
|
||||
width: Math.min(implicitWidth, root.maxWidth - (root.padding * 2))
|
||||
richTextEnabled: true
|
||||
}
|
||||
|
||||
// Grid content (grid mode)
|
||||
GridLayout {
|
||||
id: gridContent
|
||||
visible: root.isGridMode
|
||||
anchors.centerIn: parent
|
||||
columns: root.columnCount
|
||||
rowSpacing: 0
|
||||
columnSpacing: Style.marginM
|
||||
|
||||
Repeater {
|
||||
model: root.isGridMode ? [].concat.apply([], root.rows) : []
|
||||
|
||||
NText {
|
||||
text: modelData
|
||||
pointSize: Style.fontSizeS
|
||||
family: tooltipText.family
|
||||
color: Color.mOnSurfaceVariant
|
||||
Layout.preferredHeight: rowHeightMeasure.implicitHeight
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user