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 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.
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.