Možná se teď ptáte, k čemu nám bude dobré, že náš Screenlet může provést nějakou akci, pokud nad Screenletem projedeme myší či na něj klikneme a další akce. Samozřejmě pro informační Screenlety to bude většinou k ničemu. Jiná situace nastane, pokud píšeme Screenlet, který zobrazuje připojené (třeba i odpojené disky) a po najetí myši můžeme pozadí určitého disku zvýraznit a po kliknutí otevřít souborový manažer s cestou k tomuto oddílu.
Propásli jste předchozí články?
Toto je poslední díl celého našeho seriálu o vytváření miniaplikací zvaných Screenlety. Pokud byste se o nich chtěli dozvědět více a naučit se je správně vytvářet, určitě si přečtěte seriál od začátku.
Handlery
Nyní vám popíšu handlery, které jsou pro tyto akce připraveny.
Handler | Popis |
---|---|
on_mouse_down | Voláno, pokud se v okně Screenletu stisklo tlačítko. |
on_mouse_enter | Voláno, pokud myš najede nad Screenlet. |
on_mouse_leave | Voláno, pokud myš opustí Screenlet. |
on_mouse_move | Voláno, pokud se myš pohybuje nad Screenletem. |
on_mouse_up | Voláno, pokud se v okně Screenletu stisklo tlačítko, ale až po puštění tlačítka. |
Ukázka
Nyní si můžete zkusit přidat do Screenletu takovýto kód a spustit Screenlet přes terminál ( $ python MyFisrtScreenlet.py
).
def on_mouse_down (self, event):
print 'mouse down'
def on_mouse_enter (self, event):
print 'mouse enter'
def on_mouse_leave (self, event):
print 'mouse leave'
def on_mouse_move(self, event):
print 'mouse move'
def on_mouse_up (self, event):
print 'mouse up'
Můžete si všimnout, že pokud nad Screenlet najedete, v terminálu se objeví hláška „mouse enter“. Při pohybu kurzorem nad Screenletem se bude vypisovat stále hláška „mouse move“ a při opuštění Screenletu se objeví „mouse leave“. Pokud však na Screenlet klikneme, zobrazí se nám naráz „mouse down“ a „mouse leave“ a po uvolnění tlačítka místo „mouse up“ pouze „mouse enter“. Je to dáno tím, že ještě závisí na ukončení handleru on_mouse_down
. Nyní to je jakoby byl handler ukončen příkazem return False
, což znamená, že Screenlet bude na tlačítko dále citlivý, neboli lépe – budeme moci stále se Screenletem posouvat prostým tažením. Kvůli tomuto se neodchytí handler on_mouse_up
. Pro „zprovoznění“ i tohoto handleru si musíme pomoci tak, že vypneme defaultní propojení Screenletu s tlačítkem ukončením handleru on_mouse_down
hodnotou True
.
def on_mouse_down (self, event):
print 'mouse down'
return False # funguje stejne i bez tohoto prikazu, ale budeme to psat takto
def on_mouse_down (self, event):
print 'mouse down'
return True # takto vypneme defaultni propojeni tlacitka se Screenletem
Pokud propojení tlačítka se Screenletem zrušíme, tak už při kliknutí neuvidíme hlášky „mouse leave“ a „mouse enter“ po uvolnění tlačítka, ale pouze „mouse down“ při kliknutí a po uvolnění „mouse up“. Nyní ale není možné Screenlet posouvat tažením.
Rozhodování podle souřadnic
Je však také možnost, jak zařídit, že se v nějakých místech plochy našeho Screenletu bude vracet False
a v ostatních True
. K takovému výsledku nám pomůže argument handlerů, který je zde pojmenován jako event
. V této proměnné máme zpřístupněny souřadnice kurzoru. Souřadnice X se ukrývá pod proměnnou event.x
a souřadnice Y jak jinak než pod proměnnou event.y
.
Před tím, než začneme se souřadnicemi pracovat, musíme se ujistit, že všechny adresy máme počítány stejně. Měli bychom používat vždy souřadnice při 100% zvětšení – tedy žádném (skutečná velikost). Přepočítání uskutečníme jednoduše vydělením souřadnice zvětšením, přičemž zvětšení nalezneme v proměnné scale
našeho Screenletu. Ukázka:
x = event.x / self.scale
y = event.y / self.scale
Nyní můžeme vyzkoušet test, že při kliknutí na druhý čas bude propojení tlačítka se Screenletem zrušené a bude fungovat handler on_mouse_up
a jinak se propojení nezruší. Půjde to jednoduše podmínkou:
def on_mouse_down( self, event ):
x = event.x / self.scale
y = event.y / self.scale
print 'mouse down', x, y
if 40 < x < 175 and 45 < y < 70:
return True
return False
Poznámka: Nesmíme také zapomenout změnit klikatelnou velikost Screenletu podle zvětšení v handleru on_draw_shape
.
def on_draw_shape( self, ctx ):
self.draw_rectangle( ctx, 0, 0, self.width*self.scale, self.height*self.scale )
Další handlery
Scrollovací tlačítko
Na myši existuje už nějakou tu dobu také „kolečko“, které nám defaultně Screenlet zvětšuje nebo zmenšuje. Můžeme však kolečko využít i my pomocí handlerů on_scroll_up
či on_scroll_down
.
Opět můžete funkčnost otestovat jednoduchým kódem:
def on_scroll_up( self ):
print 'scroll up'
def on_scroll_down( self ):
print 'scroll down'
Klávesnice
Ve screenletu může existovat i vyhledávací políčko, které bude vyplňovat handler on_key_down
. Tento handler se zavolá po stisknutí nějaké klávesy na klávesnici a vrátí kód i hodnotu klávesy. Malá ukázka:
def on_key_down( self, keycode, keyvalue, event=None ):
print 'key', keycode, keyvalue
Argument event
předává objekt gtk.gdk.Event.
Konec
Tímto končím seriál Jak psát Screenlety a pokud budete nějaké ty složitější Screenlety psát, podívejte se do dokumentace samotných Screenletů, kde naleznete spoustu dalších vychytávek, které se mohou hodit. Vaše hodnotné výtvory můžete jednoduše uploadnout například na server Gnome-Look.org, kde je spousta takových Screenletů.
Těším se na české vydařené Screenlety!