Screenlet ovládaný myší

Michal Hořejšek 30. 10. 2009

Po minulých dílech našeho seriálu již umíme napsat plnohodnotný Screenlet a zbývá nám probrat už pouze další drobné možnosti ve psaní Screenletů. Dnes se podíváme na poslední věc, a tou je, jak ve Screenletu používat myš. Naučíme tedy Screenlet správnému chování při najetí myši, kliknutí myši a podobně.

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.

Screenlet perex

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

Gnomelook

Těším se na české vydařené Screenlety!

Našli jste v článku chybu?
Root.cz: Který mini počítač je letos nejlepší?

Který mini počítač je letos nejlepší?

DigiZone.cz: Server VideaCesky.cz má Mladá fronta

Server VideaCesky.cz má Mladá fronta

120na80.cz: Dejte sbohem pigmentovým skvrnám

Dejte sbohem pigmentovým skvrnám

Vitalia.cz: Rybí tatarák – z lososa i z kapra

Rybí tatarák – z lososa i z kapra

DigiZone.cz: Joj u nás spustí nový kanál

Joj u nás spustí nový kanál

Lupa.cz: Trash Made: je libo šperky z vysloužilé elektroniky?

Trash Made: je libo šperky z vysloužilé elektroniky?

Měšec.cz: Co když na dovolené přijdete o kartu?

Co když na dovolené přijdete o kartu?

Vitalia.cz: 9 potravin, které nesmí chybět v jídelníčku těhotné

9 potravin, které nesmí chybět v jídelníčku těhotné

Podnikatel.cz: OSA zdražuje poplatky. Zaplatíte o polovinu víc

OSA zdražuje poplatky. Zaplatíte o polovinu víc

DigiZone.cz: Pevnost Boyard v září a česká

Pevnost Boyard v září a česká

Lupa.cz: Co vzal čas: internetové kavárny a herny

Co vzal čas: internetové kavárny a herny

DigiZone.cz: Hodlá Markíza skončit v DVB-T?

Hodlá Markíza skončit v DVB-T?

Měšec.cz: Co s reklamací, když e-shop krachuje?

Co s reklamací, když e-shop krachuje?

DigiZone.cz: První Ultra HD (4K) Blu-ray je tady

První Ultra HD (4K) Blu-ray je tady

Měšec.cz: Ceny PHM v Evropě. Finty na úspory

Ceny PHM v Evropě. Finty na úspory

Podnikatel.cz: Pozor na vykuky, imitují služby České pošty

Pozor na vykuky, imitují služby České pošty

Vitalia.cz: Koukám, co bych dobrého snědla, abych zhubla

Koukám, co bych dobrého snědla, abych zhubla

Měšec.cz: Se stavebkem k soudu už (většinou) nemusíte

Se stavebkem k soudu už (většinou) nemusíte

Lupa.cz: Kdo vykrádá LinkedIn? Zjistit to má soud

Kdo vykrádá LinkedIn? Zjistit to má soud

Vitalia.cz: Domácí limonády: Někde ovoce, jinde šťáva za pade

Domácí limonády: Někde ovoce, jinde šťáva za pade