DIY: KDE Plasmoid.

Egy ideje már fájt, hogy a KDE jöttével a Conky-nak mennie kellett és nem látom a panelen a CPU aktuális terheltséget /mag alapon. A hétvégét rászántam a problémára és azt találtam, hogy a legújabb QML technikával olyan könnyed lett Plasmoidot fejleszteni, mint egy HTML oldalt összerakni. Nem kezdek hosszú elvi magyarázkodásba, abból rengeteg van a neten, inkább beszéljen a megkommentelt .qml;

ui/main.qml

:


import QtQuick 1.0
import org.kde.plasma.core 0.1 as PlasmaCore
import "../code/history.js" as History

/*
 * A "rootItem", minden ezen belülre kerül
 * Ad egy fekete keretet, átlátszó színnel kitöltve
 */
Rectangle {
  color: "#00FFFFFF"
  border.width: 1
  /*
   * Ez egymás mellé rendezi a majdan alá berakott elemeket
   * (a fenti kereten belülre került)
   */
  Row {
    id: cpuBars
    // a kereten belülre méretezzük
    width: parent.width - 2; height: parent.height
    x: 1

    /*
     * Ez egy virtuális elem, dinamikusan fogjuk hozzáadogatni (példányosítani),
     * attól függően hány CPU mag van
     */
    Component {
      id: cpuBar
      /*
       * Külső oszlop, ez szemlélteti az utóbbi X minta közül a legmagasabb értéket
       */
      Rectangle {
        width: parent.width / parent.children.length
        // ez egy pici hack: soha nem lehet nulla, másképp "nem tartalmazza" a belső dobozt,
        // ami így eggyel balra csúszna
        height: 1
        // az alsó része rögzített, a felső mozoghat
        anchors.bottom: parent.bottom
        color: "#D9DA16"

        /*
         * Belső oszlop, ez szemlélteti a legutolsó minta értéket
         * mindig a külső oszlop előtt van, takarja azt
         */
        Rectangle {
          width: parent.width
          anchors.bottom: parent.bottom
          color: "red"
        }
      }
    }
  }

  /*
   * Az adatforrásunk, aminek a frissülése mozgatja az oszlopainkat
   */
  PlasmaCore.DataSource {
    id: datasource
    engine: "systemmonitor"
    // amint inicializálva lett ez az objektum..
    Component.onCompleted: {
      // végigmegyünk a már ismert erőforrásokon..
      for (i in sources) {
        source = sources[i]
        // és az érdekeseknél..
        if (source.match(/cpu\/cpu[0-9]+\/TotalLoad/)) {
          // kérünk értesítést 'onNewData'
          connectSource(source)
        }
      }
    }
    // ezzel a CPU hotplugot is támogatjuk :)
    onSourceAdded: {
      if (source.match(/cpu\/cpu[0-9]+\/TotalLoad/))
        connectSource(source)
    }
    // egyébként ugyanezzel az eljárással szinte mindent le tudsz kérni, ami
    // létezik a /proc alatt

    // frissítési intervallum
    interval: 500
    onNewData: {
      // a value 0-100(%) között lehet, illetve az első mintánál ismeretlen
      if ((value = data['value'])) {
        match = sourceName.match('^cpu/cpu([0-9]{1,2})/TotalLoad$')
        cpunum = parseInt(match[1])
        h = value / 100 * cpuBars.height
        // ha kevesebb oszlop van mint CPU: adjunk hozzá
        for (; cpuBars.children.length < cpunum + 1;)
          cpuBar.createObject(cpuBars)
        History.addH(cpunum, h)
        /*
         * és itt a lelke az egésznek, itt kapcsolódik a nézet a kóddal:
         */
        // a külső oszlop magasságát hangoljuk a legmagasabb ismert CPU terheltséghez
        cpuBars.children[cpunum].height = Math.max(1, History.maxH(cpunum))
        // a belső oszlop magasságát hangoljuk az aktuális CPU terheltséghez
        cpuBars.children[cpunum].children[0].height = h
      }
    }

../code/history.js

:


/*
 * Ez jegyzi meg a magok utolsó mintáit
 * (a QML-en belül erre nincs lehetőség, de szebb is így, kiemelve)
 */
var lastheights = []

function getH(cpu) {
  return lastheights[cpu]
}
function maxH(cpu) {
  return Math.max.apply(null, lastheights[cpu])
}
function addH(cpu, value) {
  if (!lastheights[cpu])
    lastheights[cpu] = []
  // csak az utolsó 6 mintára emlékszünk
  if (lastheights[cpu].push(value) > 6)
    lastheights[cpu].shift()
}

Telepíthető Plasmoid így lehet belőle.

Először Ruby-ban írtam meg, de sajnos folyamatosan elcrash-elt miatta a panel és egyébként is 6% körüli CPU-t evett. Átírtam Javascriptre, ami már beérte 1% körüli CPU-val és tökéletesen működött, de kíváncsi lettem, hogy QML-ben hogy nézne ki. Szerintem a QML elegáns és gyors. Megszerettem.

UPDATE:
ulysses linkjén lévő Conky óra megtetszett, azon felbuzdulva én is összedobtam a QML verzióm:


(A felső Conky, az alsó saját)

Csúnyább, persze, de egyelőre nem is cicomázom, mert a hátteret szeretném eltüntetni először, de azt csak a Plasma 4.10 tudja majd.

QML: http://paste.kde.org/659144/ (96 sor)

Hozzászólások

Uh. Legalább 1-2 órát elcsesztem azzal anno, hogy működő megoldást találjak és nem sikerült. Egyébként teljesen egyetértek Aaronnal: a Conky hackolása helyett QML-ezzünk! Fun.

Amit sajnálok, hogy az http://opendesktop.org/ (aka http://kde-look.org/) elég elhanyagolt. Túl sok reklám, túl idejemúlt design és spammolják mint állat. Sok kis hasznos widget kallódhat még a világban.

Azt meg nem lesz könnyű megszokni, hogy ne KDE-zzen az ember, hanem Plazmázzon. :)