Hlavní navigace

Screenlet ovládaný myší

30. 10. 2009
Doba čtení: 4 minuty

Sdílet

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.

UX DAy - tip 2

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!

Byl pro vás článek přínosný?