Warning, /system/apper/plasmoid/package/contents/ui/main.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * Copyright 2012  Luís Gabriel Lima <lampih@gmail.com>
0003  * Copyright 2012-2013 Daniel Nicoletti <dantti12@gmail.com>
0004  *
0005  * This program is free software; you can redistribute it and/or
0006  * modify it under the terms of the GNU General Public License as
0007  * published by the Free Software Foundation; either version 2 of
0008  * the License, or (at your option) any later version.
0009  *
0010  * This program is distributed in the hope that it will be useful,
0011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0013  * GNU General Public License for more details.
0014  *
0015  * You should have received a copy of the GNU General Public License
0016  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
0017  */
0018 
0019 import QtQuick 1.1
0020 import org.kde.plasma.core 0.1 as PlasmaCore
0021 import org.kde.plasma.components 0.1 as PlasmaComponents
0022 import org.kde.apper 0.1 as Apper
0023 
0024 FocusScope {
0025     id: root
0026 
0027     state: ""
0028 
0029     property int minimumHeight: 320
0030     property int minimumWidth: 370
0031     property int maximumHeight: 0
0032     property int maximumWidth: 0
0033     property int preferredHeight: 0
0034     property int preferredWidth: 0
0035     property int implicitHeight: 0
0036     property int implicitWidth: 0
0037 
0038     property bool checkedForUpdates: false
0039     property string tooltipText: i18n("Software Updates")
0040     property string tooltipIcon: "kpackagekit-updates"
0041 
0042     property Component compactRepresentation: CompactRepresentation {
0043         text: tooltipText
0044         icon: tooltipIcon
0045     }
0046 
0047     anchors.fill: parent
0048     clip: true
0049 
0050     PlasmaCore.Theme {
0051         id: theme
0052     }
0053 
0054     Component.onCompleted: {
0055         getUpdatesTransaction.package.connect(updatesModel.addSelectedPackage);
0056         getUpdatesTransaction.errorCode.connect(errorCode);
0057         getUpdatesTransaction.finished.connect(getUpdatesFinished);
0058 
0059         Daemon.updatesChanged.connect(updatesChanged);
0060 
0061         // This allows the plasmoid to shrink when the layout changes
0062         plasmoid.status = "PassiveStatus"
0063         plasmoid.aspectRatioMode = IgnoreAspectRatio
0064         plasmoid.popupEvent.connect(popupEventSlot)
0065         plasmoid.setAction('checkForNewUpdates', i18n("Check for new updates"), 'view-refresh')
0066         dbusInterface.registerService()
0067         dbusInterface.reviewUpdates.connect(reviewUpdates)
0068         dbusInterface.reviewUpdates.connect(plasmoid.showPopup)
0069     }
0070 
0071     function popupEventSlot(popped) {
0072         if (popped) {
0073             root.forceActiveFocus()
0074             getUpdates()
0075         }
0076     }
0077 
0078     function action_checkForNewUpdates() {
0079         transactionView.refreshCache();
0080         var error = transactionView.transaction.internalError;
0081         if (error) {
0082             statusView.title = PkStrings.daemonError(error);
0083             statusView.subTitle = transactionView.transaction.internalErrorMessage;
0084             statusView.iconName = "dialog-error";
0085             root.state = "MESSAGE";
0086         } else {
0087             root.state = "TRANSACTION";
0088         }
0089     }
0090 
0091     function reviewUpdates() {
0092         if (root.state !== "TRANSACTION") {
0093             // If we are not checking for updates show
0094             // the package selection
0095             if (checkedForUpdates && root.state !== "BUSY") {
0096                 root.state = "SELECTION";
0097             } else {
0098                 getUpdates();
0099             }
0100         }
0101     }
0102 
0103     function installUpdates() {
0104         transactionView.update(updatesModel.selectedPackagesToInstall());
0105         root.state = "TRANSACTION";
0106     }
0107 
0108     function getUpdates() {
0109         if (!checkedForUpdates) {
0110             state = "BUSY"
0111             getUpdatesTransaction.cancel()
0112             updatesModel.clear()
0113             getUpdatesTransaction.getUpdates()
0114             checkedForUpdates = true
0115         }
0116     }
0117 
0118     function errorCode() {
0119         statusView.title = i18n("Failed to get updates");
0120         statusView.subTitle = PkStrings.daemonError(error);
0121         statusView.iconName = "dialog-error";
0122         state = "MESSAGE";
0123         plasmoid.status = "PassiveStatus"
0124     }
0125 
0126     function getUpdatesFinished() {
0127         updatesModel.finished();
0128         updatesModel.clearSelectedNotPresent();
0129         updatesView.sortModel.sortNow();
0130         updateIcon();
0131         decideState(false);
0132     }
0133 
0134     function decideState(force) {
0135         if (force || state !== "TRANSACTION") {
0136             if (updatesModel.rowCount() === 0) {
0137                 var lastTime = DaemonHelper.getTimeSinceLastRefresh();
0138                 statusView.title = PkStrings.lastCacheRefreshTitle(lastTime);
0139                 statusView.subTitle = PkStrings.lastCacheRefreshSubTitle(lastTime);
0140                 statusView.iconName = PkIcons.lastCacheRefreshIconName(lastTime);
0141                 state = "MESSAGE";
0142                 plasmoid.status = "PassiveStatus"
0143             } else {
0144                 plasmoid.status = "ActiveStatus"
0145                 root.state = "SELECTION";
0146             }
0147         }
0148     }
0149 
0150     function updatesChanged() {
0151         checkedForUpdates = false;
0152         getUpdates();
0153     }
0154 
0155     function updateIcon() {
0156         if (updatesModel.rowCount()) {
0157             if (updatesModel.countInfo(Apper.Transaction.InfoSecurity)) {
0158                 tooltipIcon = "kpackagekit-security"
0159             } else if (updatesModel.countInfo(Apper.Transaction.InfoImportant)) {
0160                 tooltipIcon = "kpackagekit-important"
0161             } else {
0162                 tooltipIcon = "kpackagekit-updates"
0163             }
0164             tooltipText = i18np("You have one update",
0165                                 "You have %1 updates",
0166                                 updatesModel.rowCount())
0167         } else {
0168             tooltipIcon = "kpackagekit-updates"
0169             tooltipText = i18n("Your system is up to date")
0170         }
0171     }
0172 
0173     Apper.PackageModel {
0174         id: updatesModel
0175         checkable: true
0176     }
0177 
0178     Apper.DBusUpdaterInterface {
0179         id: dbusInterface
0180     }
0181 
0182     Timer {
0183         // Grab updates in five minutes
0184         interval: 360000
0185         running: true
0186         repeat: false
0187         onTriggered: getUpdates()
0188     }
0189 
0190     Apper.PkTransaction {
0191         id: getUpdatesTransaction
0192     }
0193 
0194     StatusView {
0195         id: busyView
0196         opacity: 0
0197         anchors.fill: parent
0198         anchors.margins: 4
0199         state: "BUSY"
0200         title: PkStrings.action(getUpdatesTransaction.role, getUpdatesTransaction.transactionFlags)
0201         subTitle: PkStrings.status(getUpdatesTransaction.status)
0202     }
0203 
0204     Column {
0205         id: statusColumn
0206         opacity: 0
0207         spacing: 4
0208         anchors.fill: parent
0209         anchors.margins: 4
0210         StatusView {
0211             id: statusView
0212             height: parent.height - refreshBT.height - parent.anchors.margins - parent.spacing
0213             width: parent.width
0214         }
0215         PlasmaComponents.Button {
0216             id: refreshBT
0217             anchors.right: parent.right
0218             text:  i18n("Check for new updates")
0219             iconSource: "system-software-update"
0220             onClicked: action_checkForNewUpdates()
0221         }
0222     }
0223 
0224     Updates {
0225         id: updatesView
0226         opacity: 0
0227         anchors.fill: parent
0228         anchors.margins: 4
0229         onUpdateClicked: installUpdates()
0230     }
0231 
0232     Transaction {
0233         id: transactionView
0234         opacity: 0
0235         anchors.fill: parent
0236         anchors.margins: 4
0237         onFinished: {
0238             if (success) {
0239                 if (root.state !== "BUSY") {
0240                     checkedForUpdates = false;
0241                     getUpdates();
0242                 }
0243             } else {
0244                 decideState(true);
0245             }
0246         }
0247     }
0248 
0249     states: [
0250         State {
0251             name: "SELECTION"
0252             PropertyChanges { target: updatesView; opacity: 1 }
0253             PropertyChanges { target: updatesView; focus: true }
0254         },
0255         State {
0256             name: "TRANSACTION"
0257             PropertyChanges { target: transactionView; opacity: 1 }
0258             PropertyChanges { target: transactionView; focus: true }
0259         },
0260         State {
0261             name: "BUSY"
0262             PropertyChanges { target: busyView; opacity: 1 }
0263         },
0264         State {
0265             name: "MESSAGE"
0266             PropertyChanges { target: statusColumn; opacity: 1 }
0267             PropertyChanges { target: refreshBT; focus: true }
0268         }
0269     ]
0270 
0271     transitions: Transition {
0272         NumberAnimation { properties: "opacity"; easing.type: Easing.InOutQuad }
0273     }
0274 }