233 lines
6.3 KiB
QML
233 lines
6.3 KiB
QML
import QtQuick 2.15
|
||
import QtQuick.Layouts 1.15
|
||
import QtQuick.Controls 2.15
|
||
|
||
import org.kde.plasma.plasmoid 2.0
|
||
import org.kde.plasma.core 2.1 as PlasmaCore
|
||
|
||
import "../_toolbox" as Tb
|
||
import "../service" as Sv
|
||
|
||
// Корневой элемент
|
||
Item {
|
||
id: root
|
||
|
||
property string appTitle: Plasmoid.configuration.title
|
||
|
||
property string iconDefault: "../assets/default.svg"
|
||
property string iconRefresh: "../assets/refresh.svg"
|
||
property string iconReadyToUpgrade: "../assets/ready.svg"
|
||
property string iconError: "../assets/error.svg"
|
||
|
||
property string mainIcon: iconDefault
|
||
|
||
property string total: "0"
|
||
|
||
property bool showNotification: Plasmoid.configuration.showNotification
|
||
|
||
property string notifyText: ""
|
||
property string errorText: ""
|
||
|
||
property int defaultStatus: -1
|
||
property int normalStatus: 0
|
||
property int checkingUpdatesStatus: 1
|
||
property int readyStatus: 2
|
||
property int errorStatus: 3
|
||
|
||
property int upgradeStatus: defaultStatus
|
||
|
||
property string listOfPackages: ""
|
||
|
||
Plasmoid.preferredRepresentation: Plasmoid.compactRepresentation
|
||
Plasmoid.compactRepresentation: Compact {}
|
||
Plasmoid.fullRepresentation: Full {}
|
||
// load one instance of each needed service
|
||
Sv.Updater{ id: updater }
|
||
Tb.Cmd { id: cmd }
|
||
|
||
PlasmaCore.DataSource {
|
||
id: notificationSource
|
||
engine: "notifications"
|
||
connectedSources: "org.freedesktop.Notifications"
|
||
}
|
||
|
||
function strip(text) {
|
||
return text.replace(/[^a-zA-Z0-9 \(\)\[\]:;\.,\_\-><\n\t]/g, "")
|
||
//return text.replace(/[^a-zA-Z0-9 \n\t]/g, "")
|
||
}
|
||
|
||
function createNotification(text) {
|
||
|
||
var service = notificationSource.serviceForSource("notification");
|
||
var operation = service.operationDescription("createNotification");
|
||
|
||
operation.appName = i18n(appTitle);
|
||
operation["appIcon"] = iconDefault;
|
||
operation.summary = text || i18n("Some text")
|
||
operation["body"] = "";
|
||
operation["timeout"] = 10000;
|
||
|
||
service.startOperationCall(operation);
|
||
}
|
||
|
||
// updates the icon according to the refresh status
|
||
function updateUi() {
|
||
|
||
switch (upgradeStatus) {
|
||
case normalStatus:
|
||
mainIcon = iconDefault
|
||
break
|
||
case checkingUpdatesStatus:
|
||
mainIcon = iconRefresh
|
||
//total = 0
|
||
total = "↻"
|
||
break
|
||
case readyStatus:
|
||
mainIcon = iconReadyToUpgrade
|
||
break
|
||
case errorStatus:
|
||
mainIcon=iconError
|
||
total = 0
|
||
break
|
||
default:
|
||
mainIcon = iconDefault
|
||
total = 0
|
||
}
|
||
}
|
||
|
||
// map the cmd signal with the widget
|
||
Connections {
|
||
target: cmd
|
||
|
||
function onExited(cmd, exitCode, exitStatus, stdout, stderr) {
|
||
|
||
// Если запущена проверка обновлений
|
||
if (cmd == Plasmoid.configuration.commandForCheckingUpdates) {
|
||
|
||
// Если ошибок при проверке обновлений нет
|
||
if (exitCode == 0) {
|
||
|
||
var stdoutText = strip(stdout)
|
||
var lines = parseInt(stdoutText.trim().split('\n').length, 10)
|
||
|
||
// Если стандарный вывод можно подсчитать по строкам
|
||
if (lines) {
|
||
total = lines
|
||
|
||
listOfPackages = stdoutText
|
||
|
||
if (showNotification) {
|
||
notifyText = "Найдено " + total + " пакетов для обновления"
|
||
createNotification(notifyText)
|
||
}
|
||
|
||
upgradeStatus = readyStatus
|
||
updateUi()
|
||
}
|
||
|
||
// Иначе
|
||
else {
|
||
total = 0
|
||
|
||
upgradeStatus = normalStatus
|
||
updateUi()
|
||
|
||
upgradeStatus = defaultStatus
|
||
}
|
||
}
|
||
|
||
// Если есть ошибки при проверке обновлений
|
||
else if (exitCode == 1) {
|
||
if (stderr.length > 0) {
|
||
errorText = strip(stderr).trim()
|
||
|
||
if (showNotification) {
|
||
notifyText = "Ошибка обновления: \n" + errorText
|
||
createNotification(notifyText)
|
||
}
|
||
}
|
||
|
||
upgradeStatus = errorStatus
|
||
updateUi()
|
||
|
||
upgradeStatus = defaultStatus
|
||
}
|
||
|
||
// Если нет пакетов для обновлений
|
||
else if (exitCode == 2) {
|
||
upgradeStatus = defaultStatus
|
||
updateUi()
|
||
}
|
||
|
||
// Неправильно указана программа в настройках
|
||
else if (exitCode == 127) {
|
||
|
||
if (showNotification) {
|
||
notifyText = "Возможно программа, указанная в настройках, не существует на этом компьютере"
|
||
createNotification(notifyText)
|
||
}
|
||
|
||
upgradeStatus = defaultStatus
|
||
updateUi()
|
||
}
|
||
|
||
// Иначе
|
||
else {
|
||
upgradeStatus = defaultStatus
|
||
updateUi()
|
||
}
|
||
}
|
||
|
||
// Если запущено обновление пакетов
|
||
else if (cmd == Plasmoid.configuration.commandForUpgrade) {
|
||
|
||
// Если обновление было успешно
|
||
if (exitCode == 0) {
|
||
total = 0
|
||
|
||
listOfPackages = ""
|
||
|
||
if (showNotification) {
|
||
notifyText = "Обновление успешно завершено"
|
||
createNotification(notifyText)
|
||
}
|
||
|
||
upgradeStatus = normalStatus
|
||
updateUi()
|
||
|
||
upgradeStatus = defaultStatus
|
||
}
|
||
|
||
// Неправильно указана программа в настройках
|
||
else if (exitCode == 127) {
|
||
if (showNotification) {
|
||
notifyText = "Возможно программа, указанная в настройках, не существует на этом компьютере"
|
||
createNotification(notifyText)
|
||
}
|
||
|
||
upgradeStatus = defaultStatus
|
||
updateUi()
|
||
}
|
||
|
||
// Если есть ошибки при обновлении пакетов
|
||
else {
|
||
if (showNotification) {
|
||
notifyText = "Обновление завершено с ошибками"
|
||
createNotification(notifyText)
|
||
}
|
||
|
||
upgradeStatus = errorStatus
|
||
updateUi()
|
||
|
||
upgradeStatus = defaultStatus
|
||
}
|
||
}
|
||
}
|
||
|
||
function onConnected(source) {
|
||
upgradeStatus = checkingUpdatesStatus
|
||
updateUi()
|
||
}
|
||
}
|
||
}
|