Merge remote-tracking branch 'upstream/main' into pr/networking-refactor-pt2

This commit is contained in:
Turann_
2026-03-15 23:46:39 +03:00
24 changed files with 150 additions and 54 deletions
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Installieren Sie Plugins aus dem Abschnitt \"Verfügbar\".",
"installed-no-plugins-label": "Keine Plugins installiert",
"installing": "{plugin} wird installiert...",
"notify-updates": "Plugin-Update-Benachrichtigungen",
"notify-updates-description": "Zeige ein Benachrichtigungs-Popup an, wenn neue Plugin-Updates verfügbar sind.",
"open-plugin-page": "Plugin-Seite öffnen",
"open-plugins-tab": "Plugin-Einstellungen öffnen",
"plugin-settings-title": "{plugin} Einstellungen",
+2
View File
@@ -1553,6 +1553,8 @@
"installed-no-plugins-description": "Install plugins from the \"Available\" section.",
"installed-no-plugins-label": "No plugins installed",
"installing": "Installing {plugin}...",
"notify-updates": "Plugin update notifications",
"notify-updates-description": "Show a notification popup when new plugin updates are available.",
"open-plugin-page": "Open plugin page",
"open-plugins-tab": "Open plugins settings",
"plugin-settings-title": "{plugin} Settings",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Instale los plugins de la sección \"Disponible\".",
"installed-no-plugins-label": "No hay plugins instalados",
"installing": "Instalando {plugin}...",
"notify-updates": "Notificaciones de actualización de plugins",
"notify-updates-description": "Mostrar una notificación emergente cuando haya nuevas actualizaciones de plugins disponibles.",
"open-plugin-page": "Abrir página del plugin",
"open-plugins-tab": "Abrir la configuración de los plugins",
"plugin-settings-title": "Ajustes de {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Installez les plugins depuis la section \"Disponible\".",
"installed-no-plugins-label": "Aucun plugin installé",
"installing": "Installation de {plugin}...",
"notify-updates": "Notifications de mise à jour des plugins",
"notify-updates-description": "Afficher une notification contextuelle lorsque de nouvelles mises à jour de plugins sont disponibles.",
"open-plugin-page": "Ouvrir la page du plugin",
"open-plugins-tab": "Ouvrir les paramètres des plugins",
"plugin-settings-title": "Paramètres de {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Bővítmények telepítése az \"Elérhető\" szakaszban lehetséges.",
"installed-no-plugins-label": "Nincs telepített bővítmény",
"installing": "{plugin} telepítése...",
"notify-updates": "Bővítményfrissítési értesítések",
"notify-updates-description": "Értesítési előugró ablak megjelenítése, ha új bővítményfrissítések érhetők el.",
"open-plugin-page": "Bővítmény oldal megnyitása",
"open-plugins-tab": "Bővítmények beállításainak megnyitása",
"plugin-settings-title": "{plugin} beállításai",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Installa plugin dalla sezione \"Disponibili\".",
"installed-no-plugins-label": "Nessun plugin installato",
"installing": "Installazione {plugin}...",
"notify-updates": "Notifiche di aggiornamento dei plugin",
"notify-updates-description": "Mostra un popup di notifica quando sono disponibili nuovi aggiornamenti per i plugin.",
"open-plugin-page": "Apri pagina plugin",
"open-plugins-tab": "Apri impostazioni plugin",
"plugin-settings-title": "Impostazioni {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "「利用可能」セクションからプラグインをインストールしてください。",
"installed-no-plugins-label": "インストールされているプラグインはありません",
"installing": "{plugin} をインストール中...",
"notify-updates": "プラグインの更新通知",
"notify-updates-description": "新しいプラグインのアップデートが利用可能な場合に通知ポップアップを表示します。",
"open-plugin-page": "プラグインページを開く",
"open-plugins-tab": "プラグイン設定を開く",
"plugin-settings-title": "{plugin} の設定",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "\"사용 가능\" 섹션에서 플러그인을 설치하세요.",
"installed-no-plugins-label": "설치된 플러그인 없음",
"installing": "{plugin} 설치 중...",
"notify-updates": "플러그인 업데이트 알림",
"notify-updates-description": "새로운 플러그인 업데이트가 있을 때 알림 팝업을 표시합니다.",
"open-plugin-page": "플러그인 페이지 열기",
"open-plugins-tab": "플러그인 설정 열기",
"plugin-settings-title": "{plugin} 설정",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Installeer plugins uit de sectie \"Beschikbaar\".",
"installed-no-plugins-label": "Geen plugins geïnstalleerd",
"installing": "{plugin} installeren...",
"notify-updates": "Plugin-updatemeldingen",
"notify-updates-description": "Toon een melding wanneer nieuwe plug-in-updates beschikbaar zijn.",
"open-plugin-page": "Open plug-in pagina",
"open-plugins-tab": "Open plugininstellingen",
"plugin-settings-title": "{plugin} Instellingen",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Zainstaluj wtyczki z sekcji \"Dostępne\".",
"installed-no-plugins-label": "Brak zainstalowanych wtyczek",
"installing": "Instalowanie {plugin}...",
"notify-updates": "Powiadomienia o aktualizacjach wtyczek",
"notify-updates-description": "Wyświetl wyskakujące powiadomienie, gdy dostępne są nowe aktualizacje wtyczek.",
"open-plugin-page": "Otwórz stronę wtyczki",
"open-plugins-tab": "Otwórz ustawienia wtyczek",
"plugin-settings-title": "Ustawienia {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Instale os plugins da seção \"Disponível\".",
"installed-no-plugins-label": "Nenhum plugin instalado",
"installing": "Instalando {plugin}...",
"notify-updates": "Notificações de atualização de plugins",
"notify-updates-description": "Mostrar um popup de notificação quando novas atualizações de plugins estiverem disponíveis.",
"open-plugin-page": "Abrir página do plugin",
"open-plugins-tab": "Abrir configurações de plugins",
"plugin-settings-title": "Configurações do {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Установите плагины из раздела \"Доступно\".",
"installed-no-plugins-label": "Нет установленных плагинов",
"installing": "Установка {plugin}...",
"notify-updates": "Уведомления об обновлении плагинов",
"notify-updates-description": "Показывать всплывающее уведомление при наличии новых обновлений плагинов.",
"open-plugin-page": "Открыть страницу плагина",
"open-plugins-tab": "Открыть настройки плагинов",
"plugin-settings-title": "Настройки {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Installera insticksmoduler från avsnittet \"Tillgängliga\".",
"installed-no-plugins-label": "Inga insticksmoduler installerade",
"installing": "Installerar {plugin}...",
"notify-updates": "Meddelanden om plugin-uppdateringar",
"notify-updates-description": "Visa en notifikationspopup när nya plugin-uppdateringar är tillgängliga.",
"open-plugin-page": "Öppna insticksmodulsida",
"open-plugins-tab": "Öppna insticksmodulinställningar",
"plugin-settings-title": "Inställningar för {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "\"Mevcut\" bölümünden eklentileri kurun.",
"installed-no-plugins-label": "Eklenti kurulu değil",
"installing": "{eklenti} kuruluyor...",
"notify-updates": "Eklenti güncelleme bildirimleri",
"notify-updates-description": "Yeni eklenti güncellemeleri olduğunda bir bildirim penceresi göster.",
"open-plugin-page": "Eklenti sayfasını aç",
"open-plugins-tab": "Eklenti ayarlarına git",
"plugin-settings-title": "{plugin} ayarları",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "Встановіть плагіни з розділу \"Доступний\".",
"installed-no-plugins-label": "Немає встановлених плагінів",
"installing": "Встановлення {plugin}...",
"notify-updates": "Сповіщення про оновлення плагінів",
"notify-updates-description": "Показувати спливаюче сповіщення, коли доступні нові оновлення плагінів.",
"open-plugin-page": "Відкрити сторінку плагіна",
"open-plugins-tab": "Відкрити налаштування плагінів",
"plugin-settings-title": "Налаштування {plugin}",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "从“可用”部分安装插件。",
"installed-no-plugins-label": "未安装插件",
"installing": "正在安装 {plugin}...",
"notify-updates": "插件更新通知",
"notify-updates-description": "当有新的插件更新可用时,显示通知弹窗。",
"open-plugin-page": "打开插件页面",
"open-plugins-tab": "打开插件设置",
"plugin-settings-title": "{plugin} 设置",
+2
View File
@@ -1558,6 +1558,8 @@
"installed-no-plugins-description": "從 \"可用\"頁面來安裝外掛模組",
"installed-no-plugins-label": "沒有安裝外掛模組",
"installing": "正在安裝 {plugin}...",
"notify-updates": "外掛程式更新通知",
"notify-updates-description": "當有新的外掛程式更新可用時,顯示通知彈出視窗。",
"open-plugin-page": "打開模組頁面",
"open-plugins-tab": "開啟外掛模組設定",
"plugin-settings-title": "{plugin} 設定",
+4 -2
View File
@@ -526,10 +526,12 @@
"performanceModeEnabled": "",
"performanceModeDisabled": "",
"startup": "",
"session": ""
"session": "",
"colorGeneration": ""
},
"plugins": {
"autoUpdate": false
"autoUpdate": false,
"notifyUpdates": true
},
"idle": {
"enabled": false,
+9
View File
@@ -1950,6 +1950,15 @@
"subTab": 0,
"subTabLabel": "common.installed"
},
{
"labelKey": "panels.plugins.notify-updates",
"descriptionKey": "panels.plugins.notify-updates-description",
"widget": "NToggle",
"tab": 19,
"tabLabel": "panels.plugins.title",
"subTab": 0,
"subTabLabel": "common.installed"
},
{
"labelKey": "panels.plugins.installed-no-plugins-label",
"descriptionKey": "panels.plugins.installed-no-plugins-description",
+1
View File
@@ -744,6 +744,7 @@ Singleton {
// plugins
property JsonObject plugins: JsonObject {
property bool autoUpdate: false
property bool notifyUpdates: true
}
// idle management
@@ -664,14 +664,20 @@ Item {
readonly property bool isExpanded: root.infoSsid === modelData.ssid
readonly property bool isEnterprise: NetworkService.isEnterprise(modelData.security)
function getContentColor(defaultColor = Color.mOnSurface) {
function getContentColors(defaultColors = [Color.mSurface, Color.mOnSurface]) {
if (root.passwordSsid === modelData.ssid || NetworkService.connectingTo === modelData.ssid) {
return Color.mPrimary;
return [Color.mPrimary, Color.mOnPrimary];
}
if (modelData.connected && NetworkService.internetConnectivity && NetworkService.disconnectingFrom !== modelData.ssid) {
return [Color.mPrimary, Color.mOnPrimary];
}
if (NetworkService.disconnectingFrom === modelData.ssid || NetworkService.forgettingNetwork === modelData.ssid) {
return Color.mError;
return [Color.mError, Color.mOnError];
}
return defaultColor;
if (modelData.connected && !NetworkService.internetConnectivity) {
return [Color.mError, Color.mOnError];
}
return defaultColors;
}
Layout.fillWidth: true
@@ -679,7 +685,7 @@ Item {
radius: Style.radiusM
clip: true
color: (modelData.connected && NetworkService.disconnectingFrom !== modelData.ssid) ? Qt.alpha(Color.mPrimary, Math.min(1.15 - Color.panelBackgroundOpacity, 0.75)) : Color.mSurface
color: networkItem.getContentColors()[0]
ColumnLayout {
id: deviceColumn
@@ -701,11 +707,11 @@ Item {
color: Color.smartAlpha(Color.mSurfaceVariant)
Layout.alignment: Qt.AlignVCenter
NIcon {
anchors.centerIn: parent
icon: NetworkService.getSignalInfo(modelData.signal, modelData.connected).icon
pointSize: Style.fontSizeXXL
color: modelData.connected ? (NetworkService.internetConnectivity ? Color.mPrimary : Color.mError) : networkItem.getContentColor(Color.mOnSurface)
NIcon {
icon: NetworkService.signalIcon(modelData.signal, modelData.connected)
pointSize: Style.fontSizeXXL
color: networkItem.getContentColors()[1]
Layout.alignment: Qt.AlignVCenter
MouseArea {
anchors.fill: parent
@@ -725,7 +731,7 @@ Item {
pointSize: Style.fontSizeM
font.weight: modelData.connected ? Style.fontWeightBold : Style.fontWeightMedium
elide: Text.ElideRight
color: networkItem.getContentColor(Color.mOnSurface)
color: networkItem.getContentColors()[1]
Layout.fillWidth: true
}
@@ -735,7 +741,7 @@ Item {
NIcon {
icon: NetworkService.isSecured(modelData.security) ? "lock" : "lock-open"
pointSize: Style.fontSizeXXS
color: networkItem.getContentColor(Color.mOnSurfaceVariant)
color: Qt.alpha(networkItem.getContentColors()[1], Style.opacityHeavy)
visible: !modelData.connected && NetworkService.disconnectingFrom !== modelData.ssid && NetworkService.forgettingNetwork !== modelData.ssid
}
@@ -765,15 +771,7 @@ Item {
return NetworkService.isSecured(modelData.security) ? modelData.security : I18n.tr("wifi.panel.security-open");
}
pointSize: Style.fontSizeXXS
color: {
if (modelData.connected) {
return (NetworkService.networkConnectivity === "full") ? Color.mPrimary : Color.mError;
}
if (NetworkService.disconnectingFrom === modelData.ssid || NetworkService.forgettingNetwork === modelData.ssid) {
return Color.mError;
}
return networkItem.getContentColor(Color.mOnSurfaceVariant);
}
color: Qt.alpha(networkItem.getContentColors()[1], Style.opacityHeavy)
}
// Network speed indicators (visible when connected and speed > 0)
@@ -787,15 +785,14 @@ Item {
visible: SystemStatService.rxSpeed > 0
icon: "arrow-down"
pointSize: Style.fontSizeXXS
color: networkItem.getContentColor(Color.mOnSurfaceVariant)
color: Qt.alpha(networkItem.getContentColors()[1], Style.opacityHeavy)
}
NText {
visible: SystemStatService.rxSpeed > 0
text: SystemStatService.formatSpeed(SystemStatService.rxSpeed)
pointSize: Style.fontSizeXXS
color: networkItem.getContentColor(Color.mOnSurfaceVariant)
elide: Text.ElideNone
color: Qt.alpha(networkItem.getContentColors()[1], Style.opacityHeavy)
}
Item {
@@ -808,15 +805,14 @@ Item {
visible: SystemStatService.txSpeed > 0
icon: "arrow-up"
pointSize: Style.fontSizeXXS
color: networkItem.getContentColor(Color.mOnSurfaceVariant)
color: Qt.alpha(networkItem.getContentColors()[1], Style.opacityHeavy)
}
NText {
visible: SystemStatService.txSpeed > 0
text: SystemStatService.formatSpeed(SystemStatService.txSpeed)
pointSize: Style.fontSizeXXS
color: networkItem.getContentColor(Color.mOnSurfaceVariant)
elide: Text.ElideNone
color: Qt.alpha(networkItem.getContentColors()[1], Style.opacityHeavy)
}
}
}
@@ -832,7 +828,7 @@ Item {
NBusyIndicator {
visible: networkItem.isBusy
running: visible && root.effectivelyVisible
color: Color.mPrimary
color: networkItem.getContentColors()[1]
size: Style.baseWidgetSize * 0.5
}
@@ -841,6 +837,10 @@ Item {
icon: "info"
tooltipText: I18n.tr("common.info")
baseSize: Style.baseWidgetSize * 0.8
colorBg: Color.mSurfaceVariant
colorFg: Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
onClicked: {
if (root.infoSsid === modelData.ssid) {
root.infoSsid = "";
@@ -856,6 +856,10 @@ Item {
icon: "trash"
tooltipText: I18n.tr("tooltips.forget-network")
baseSize: Style.baseWidgetSize * 0.8
colorBg: Color.mSurfaceVariant
colorFg: Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
onClicked: root.requestForget(modelData.ssid)
}
@@ -863,9 +867,9 @@ Item {
id: button
visible: itemHover.hovered && !modelData.connected && NetworkService.connectingTo !== modelData.ssid && root.passwordSsid !== modelData.ssid
enabled: !NetworkService.connecting && !networkItem.isBusy
outlined: !button.hovered
fontSize: Style.fontSizeS
backgroundColor: Color.mPrimary
textColor: Color.mOnPrimary
text: I18n.tr("common.connect")
onClicked: {
if (modelData.existing || modelData.cached || !NetworkService.isSecured(modelData.security)) {
@@ -880,9 +884,9 @@ Item {
id: disconnectButton
visible: itemHover.hovered && modelData.connected && NetworkService.disconnectingFrom !== modelData.ssid
text: I18n.tr("common.disconnect")
outlined: !disconnectButton.hovered
fontSize: Style.fontSizeS
backgroundColor: Color.mError
backgroundColor: Color.mSurfaceVariant
textColor: Color.mOnSurface
onClicked: NetworkService.disconnect(modelData.ssid)
}
}
@@ -40,6 +40,14 @@ ColumnLayout {
onToggled: checked => Settings.data.plugins.autoUpdate = checked
}
// Update notification toggle
NToggle {
label: I18n.tr("panels.plugins.notify-updates")
description: I18n.tr("panels.plugins.notify-updates-description")
checked: Settings.data.plugins.notifyUpdates
onToggled: checked => Settings.data.plugins.notifyUpdates = checked
}
// Check for updates button
NButton {
property bool isChecking: Object.keys(PluginService.activeFetches).length > 0
+17 -14
View File
@@ -1451,25 +1451,28 @@ Singleton {
if (updateCount > 0) {
Logger.i("PluginService", updateCount, "plugin update(s) available");
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.trp("panels.plugins.update-available", updateCount) + "\n\n" + updatesDescription, "plugin", 5000, I18n.tr("panels.plugins.open-plugins-tab"), function () {
// Open settings panel to Plugins tab on the screen where the cursor is
if (root.screenDetector) {
root.screenDetector.withCurrentScreen(function (screen) {
var panel = PanelService.getPanel("settingsPanel", screen);
if (Settings.data.plugins.notifyUpdates) {
ToastService.showNotice(I18n.tr("panels.plugins.title"), I18n.trp("panels.plugins.update-available", updateCount) + "\n\n" + updatesDescription, "plugin", 5000, I18n.tr("panels.plugins.open-plugins-tab"), function () {
// Open settings panel to Plugins tab on the screen where the cursor is
if (root.screenDetector) {
root.screenDetector.withCurrentScreen(function (screen) {
var panel = PanelService.getPanel("settingsPanel", screen);
if (panel) {
panel.requestedTab = SettingsPanel.Tab.Plugins;
panel.open();
}
});
} else {
// Fallback to primary screen if screen detector is not available
var panel = PanelService.getPanel("settingsPanel", Quickshell.screens[0]);
if (panel) {
panel.requestedTab = SettingsPanel.Tab.Plugins;
panel.open();
}
});
} else {
// Fallback to primary screen if screen detector is not available
var panel = PanelService.getPanel("settingsPanel", Quickshell.screens[0]);
if (panel) {
panel.requestedTab = SettingsPanel.Tab.Plugins;
panel.open();
}
}
});
});
}
} else if (pendingCount > 0) {
Logger.i("PluginService", pendingCount, "plugin update(s) pending (require newer Noctalia)");
} else {
Generated
+42 -7
View File
@@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1772963539,
"narHash": "sha256-9jVDGZnvCckTGdYT53d/EfznygLskyLQXYwJLKMPsZs=",
"lastModified": 1773389992,
"narHash": "sha256-wvfdLLWJ2I9oEpDd9PfMA8osfIZicoQ5MT1jIwNs9Tk=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9dcb002ca1690658be4a04645215baea8b95f31d",
"rev": "c06b4ae3d6599a672a6210b7021d699c351eebda",
"type": "github"
},
"original": {
@@ -16,19 +16,36 @@
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1770107345,
"narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"noctalia-qs": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"systems": "systems"
"systems": "systems",
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1773175685,
"narHash": "sha256-YOkWzVq7opym1ovJvSCvqpG6OCDGJwPo/EPeRxcGay4=",
"lastModified": 1773514555,
"narHash": "sha256-XNmLf4HqUM6/he/eJiHT+Mvxmt7QuwgGU14jB4Ha+pM=",
"owner": "noctalia-dev",
"repo": "noctalia-qs",
"rev": "6b9eceefde3d47ca83c544b54bcdd358be4cbd2f",
"rev": "8aa9d8ce86ef018fb442c585ad7fbb2a15a4f822",
"type": "github"
},
"original": {
@@ -57,6 +74,24 @@
"repo": "default-linux",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1772660329,
"narHash": "sha256-IjU1FxYqm+VDe5qIOxoW+pISBlGvVApRjiw/Y/ttJzY=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "3710e0e1218041bbad640352a0440114b1e10428",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
}
},
"root": "root",