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!

Ohodnoťte jako ve škole:

Průměrná známka 3,15

Našli jste v článku chybu?
Zasílat nově přidané názory e-mailem
Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

Vitalia.cz: Martin Kasa o byznysu s léky

Martin Kasa o byznysu s léky

Lupa.cz: Jak EET vidí ajťák aneb Drahá vražda UX

Jak EET vidí ajťák aneb Drahá vražda UX

120na80.cz: Tady se vaří padělané léky

Tady se vaří padělané léky

Vitalia.cz: Falšované masné výrobky byly v Tescu i Lidlu

Falšované masné výrobky byly v Tescu i Lidlu

Vitalia.cz: Mražené ryby z Makra byly falšované

Mražené ryby z Makra byly falšované

Vitalia.cz: Tetanus v USA – i po odřeninách

Tetanus v USA – i po odřeninách

Vitalia.cz: 10 rad šéfkuchařů pro perfektní grilování

10 rad šéfkuchařů pro perfektní grilování

DigiZone.cz: Stream představil souboj žroutů

Stream představil souboj žroutů

DigiZone.cz: Rádio Retro spouští stream o Karlu IV.

Rádio Retro spouští stream o Karlu IV.

120na80.cz: Jak správně vytrhnout mléčný zub?

Jak správně vytrhnout mléčný zub?

Vitalia.cz: Falšovaný salám v Kauflandu

Falšovaný salám v Kauflandu

Podnikatel.cz: Alza radí e-shopům, jak opustit Heureku

Alza radí e-shopům, jak opustit Heureku

Podnikatel.cz: Přechod z OSVČ na firmu? Totální šok!

Přechod z OSVČ na firmu? Totální šok!

DigiZone.cz: Konec geoblokace? Ani náhodou…

Konec geoblokace? Ani náhodou…

Podnikatel.cz: Využijte v byznysu nulové tarify

Využijte v byznysu nulové tarify

DigiZone.cz: Kolik lidí sleduje hokej na webu ČT?

Kolik lidí sleduje hokej na webu ČT?

120na80.cz: Poznáte, který z léků je pravý?

Poznáte, který z léků je pravý?

DigiZone.cz: Šlágr TV: pokuta 100 tisíc za on-line

Šlágr TV: pokuta 100 tisíc za on-line

120na80.cz: Jak si udržet zdravou vaginu

Jak si udržet zdravou vaginu