KDE 4: jak funguje plasmoid

Adam Štrauch 30. 1. 2009

Tento týden ještě u tématu KDE chvíli zůstaneme. Podíváme se na vytváření plasmoidů. Ty jsme v úterním článku označili za hnací sílu KDE 4, takže je takovou povinností nahlédnout plasmoidům pod kapotu. Ukážeme si, jak vytvořit jednoduchý plasmoid a napojit ho na čím dál více oblíbený Twitter.

Co je to plasmoid

Jak již bylo v úterý řečeno, prostředí KDE je postaveno převážně na tzv. Plasmě. Tedy aspoň ta část, na kterou se díváme, a která je u prostředí to co zaujme na první pohled. Plasma v jednom programu kombinuje vlastnosti Kickeru (hlavního panelu), plochy a SuperKaramby (malé prográmky umístěně na plochu nebo do panelu). Poslední zmíněnou vlastnost tu budeme dnes prezentovat a takový malý prográmek si vytvoříme v Pythonu. Vývojáři tyto prográmky nazývají plasmoidy.

Plasmoidů je dnes již celá řada, nicméně pokud nás Plasma zaujme a budeme podle ní chtít upravit svoje zvyklosti, může se schopnost naprogramovat si vlastní plasmoid hodit. Nejlepším zdrojem na plasmoidy je kde-look.org. Najdeme jich tam přibližně stovku.

V čem můžeme plasmoid naprogramovat

Podle oficiálního how-to máme tři možnosti jak vytvořit plasmoid. Jsou to C++, Python a Ruby. Python je mému srdci nejblíže, takže použijeme na vytvoření plasmoidu právě jeho. Všechno, co jde udělat v Pythonu, lze samozřejmě více či méně obtížně udělat i ve zbylých dvou. Jedna z dalších možností je použití HTML a JavaScriptu.

Pro vytvoření plasmoidu v Pythonu budeme potřebovat tyto dva moduly:

  • PyQt4
  • pykde4

Máme-li připravené prostředí, je čas vytáhnout náš oblíbený editor a začít psát plasmoid.

Hallo Plasma

Rozložení adresářů

Než začneme vytvářet náš první „Hello World“ plasmoid, řekneme si něco o tom, kde a jak jsou uloženy zdrojové kódy, případně další soubory. U plasmoidů musíme držet pevnou adresářovou strukturu, aby KDE mohlo plasmoid správně zpracovat. U našeho plasmoidu „Hello Plasma“ budou soubory v následujícím stromu:

hello-plasma/install.sh
hello-plasma/metadata.desktop
hello-plasma/contents/
hello-plasma/contents/code/
hello-plasma/contents/code/main.py 

Adresář contents obsahuje všechno, co bude umístěno na plasmoidu a také samotný zdrojový kód. Ten se ukládá do jeho podadresáře code. Soubor metadata.desktop obsahuje informace o plasmoidu, viz níže. A nakonec main.py. Tento skript se začne vykonávat jako první a může naimportovat další .py soubory ve stejném adresáři. Jeho název je možné nadefinovat v metadata.desktop.

Kód

Než začneme se samotným programováním, musíme do souboru metadata.desktop napsat informace o tom, co je náš plasmoid zač.

[Desktop Entry]
Encoding=UTF-8
Name=Hello Plasma
Name[nl]=Hallo Plasma
Type=Service
ServiceTypes=Plasma/Applet
Icon=oxygen
X-Plasma-API=python
X-Plasma-MainScript=code/main.py
X-KDE-PluginInfo-Author=Root.cz
X-KDE-PluginInfo-Email=redakce@iinfo.cz
X-KDE-PluginInfo-Name=hello-plasma
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=http://root.cz/
X-KDE-PluginInfo-Category=Examples
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=true 

Názvy položek jsou podle mě dostatečně výmluvné, takže se jimi nebudu blíže zabývat.

Další soubor, který budeme potřebovat, je samotný zdrojový kód.

#!/usr/bin/python
# -*- coding: utf-8 -*-

from PyQt4.Qt import *
from PyQt4.QtGui import *
from PyKDE4.plasma import Plasma
from PyKDE4.kdecore import KGlobal
from PyKDE4 import plasmascript

class PyTestApplet(plasmascript.Applet):
    def __init__(self, parent, args=None):
        plasmascript.Applet.__init__(self,parent)

    def init(self):
        self.setHasConfigurationInterface(False)
        self.resize(125, 125)
        self.setAspectRatioMode(Plasma.Square)

    def paintInterface(self, painter, option, rect):
        painter.setPen(Plasma.Theme.defaultTheme().color(Plasma.Theme.TextColor))
        painter.save()
        painter.drawText(rect, Qt.AlignCenter, "Hallo applet")
        painter.restore()

def CreateApplet(parent):
    return PyTestApplet(parent) 

Nejdříve naimportujeme potřebné knihovny. Poté vytvoříme třídu s naším plasmoidem a do ní umístíme metody init(), init() a paintInterface(). V init() zavoláme init() metodu zděděné třídy. Pokud možno sem již další kód nepřidáváme a místo toho použijeme metodu init(). Metoda paintInterface() se volá při potřebě vykreslit plasmoid.

První věc co se spustí při provádění kódu je funkce CreateApplet(). Ta vrátí adresu na PyTestApplet(), se kterým Plasma dále pracuje. Při vytvoření plasmoidu zavolá Plasma metodu init(). To je místo, kde nastavíme třeba velikost nebo poměr stran jako u příkladu. V metodě paintInterface() voláme pouze metody, které souvisejí s překreslováním plasmoidu. Na plochu plasmoidu můžeme kreslit jako v kterékoli jiné Qt aplikaci a samozřejmě můžeme používat i další prvky, které knihovna Qt obsahuje.

Instalace

Pro instalaci si můžeme vytvořit třeba instalační skriptík, který rovnou ukáže výsledek. Mohl by vypadat třeba takto:

#!/bin/sh

zip -r ../hello-plasma.zip .
cd ..
plasmapkg -r hello-plasma
plasmapkg -i hello-plasma.zip
plasmoidviewer hello-plasma 

Plasmoidy se zabalují do zip balíků a instalovat je můžeme pomocí plasmapkg. Pro prohlížení plasmoidů se používá program plasmoidviewer. Při spouštění skriptu si musíme dát pozor, abychom byli v adresáři s plasmoidem. S dalších parametrů plasmapkg zmíním -l, který umí vypsat seznam nainstalovaných plasmoidů.

hallo-plasma

Hallo Twitter

Jako další příklad uvedu zobrazení posledních několika twittů z Twitteru. Tento komunikační kanál se v okolí redakce stal za poslední týden velmi populární, takže je na místě použít právě jej.

Layout

Stejně jako u normálních aplikací, také u plasmoidu můžeme použít tzv. layouty. Díky nim lze jednoduše rozprostřít jednotlivé prvky formuláře nebo grafiky po plasmoidu. Jedná se víceméně o objekt, který může na sobě vykreslit další objekty a vždy je dá do nastavené pozice. Např. vertikální layout bude dávat prvky pod sebe a horizontální vedle sebe.

Kód

#!/usr/bin/python
# -*- coding: utf-8 -*-

import twitter
from PyQt4.Qt import *
from PyQt4.QtGui import *
from PyKDE4.plasma import Plasma
from PyKDE4.kdecore import KGlobal
from PyKDE4 import plasmascript

class PyTestApplet(plasmascript.Applet):
    def __init__(self, parent, args=None):
        plasmascript.Applet.__init__(self,parent)

    def init(self):
        self.setHasConfigurationInterface(False)
        self.setAspectRatioMode(Plasma.Square)
        self.resize(300, 300)

        api = twitter.Api()
        statuses = api.GetUserTimeline("rootcz")

        self.layout = QGraphicsLinearLayout(Qt.Vertical, self.applet)

        for x in [s.text for s in statuses][0:3]:
            label = Plasma.Label(self.applet)
            label.setText(x)
            self.layout.addItem(label)

        self.setLayout(self.layout)

def CreateApplet(parent):
    return PyTestApplet(parent) 

Tato upravená verze prvního příkladu neobsahuje metody paintInterface() a pouze vkládá poslední tři twitty do layoutu. Pro komunikaci s Twitterem použijeme modul python-twitter. Pomocí něj se můžeme spojit se serverem a díky jednoduchému API provádět veškerou činnost jako v jiných klientech či na webu. Hned poté si vytvoříme náš layout a řekneme mu, že má prvky sázet pod sebe. V cyklu pak projedeme poslední tři twitty, ke každému vytvoříme objekt QLabel a umístíme ho do layoutu. Bohužel zde zatím neexistuje cesta, jak si plasmoid jednoduše „naklikat“ pomocí Qt designéru, musíme na něj veškeré prvky nasázet ručně ve zdrojovém kódu.

widgety

hallo-twitter

Závěr

Programování plasmoidů se zas o tolik neliší oproti programování jiných KDE/Qt aplikací. Víceméně se stačí držet pouze určitého způsobu ukládání zdrojového kódu a správně pracovat s init metodami. O plasmoidech budeme pokračovat ještě jedním článkem, kde si ukážeme vytvoření kompletního plasmoidu s grafickými prvky, SVG obrázky a hlavně s DataEnginy. Dokončíme také našeho klienta.

Článek vychází z tutoriálů na stránkách techbase.kde.org.

Našli jste v článku chybu?
Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

Vitalia.cz: Antibakteriální mýdla nepomáhají, spíš škodí

Antibakteriální mýdla nepomáhají, spíš škodí

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

Podnikatel.cz: Chystá se smršť legislativních novinek

Chystá se smršť legislativních novinek

Vitalia.cz: Tohle jsou nejlepší česká piva podle odborníků

Tohle jsou nejlepší česká piva podle odborníků

Podnikatel.cz: Nemá dluhy? Zjistíte to na poště

Nemá dluhy? Zjistíte to na poště

120na80.cz: Pálení žáhy: která jídla ne a co nás uzdraví?

Pálení žáhy: která jídla ne a co nás uzdraví?

Vitalia.cz: Voda z Vltavy před a po úpravě na pitnou

Voda z Vltavy před a po úpravě na pitnou

Lupa.cz: Proč jsou firemní počítače pomalé?

Proč jsou firemní počítače pomalé?

DigiZone.cz: Parlamentní listy: kde končí PR...

Parlamentní listy: kde končí PR...

Lupa.cz: Patička e-mailu závazná jako vlastnoruční podpis?

Patička e-mailu závazná jako vlastnoruční podpis?

Lupa.cz: Co všechno je Facebook schopný cenzurovat?

Co všechno je Facebook schopný cenzurovat?

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

DigiZone.cz: Budoucnost TV vysílání ve Visegrádu

Budoucnost TV vysílání ve Visegrádu

Vitalia.cz: 5 chyb, které děláme při skladování potravin

5 chyb, které děláme při skladování potravin

DigiZone.cz: Regionální tele­vize CZ vysílá "Mapu úspěchu"

Regionální tele­vize CZ vysílá "Mapu úspěchu"

Podnikatel.cz: Letáky? Lidi zuří, ale ony stále fungují

Letáky? Lidi zuří, ale ony stále fungují

Vitalia.cz: Jsou vegani a vyrábějí nemléko

Jsou vegani a vyrábějí nemléko

Lupa.cz: Jak se prodává firma za miliardu?

Jak se prodává firma za miliardu?