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()
|
|||
|
}
|
|||
|
}
|
|||
|
}
|