Hlavní navigace

Knihovna ClanLib (15)

Petr Kavánek

V tomto dílu se podíváme blíže na ClanLibovské scroll bary a framy, čímž rozšíříme zásobu komponent, které jsme již schopni používat při tvorbě GUI.

Doba čtení: 5 minut

CL_ScrollBar

Parametry scroll baru můžeme pohodlně nastavit v GDF. Kromě atributů společných pro všechny komponenty (uvedených v jednom z předchozích dílů) jsou atributy typické pro scroll bar popsány v následujících odstavcích.

Scroll bar se může vyskytovat buď v horizontální, nebo ve vertikální podobě. O jakou podobu se bude jednat v našem případě, je možné nastavit pomocí atributu orientation, přičemž možné hodnoty jsou horizontal (alternativně horz, hor, nebo 1) a vertical (alternativně vert, ver, 0). Defaultní hodnotou je vertical.

Rozsah je možné zadat pomocí atributů min a max s defaultní hodnotou 0. Přesněji 0 je defaultní pro minimum a pro maximum je defaultní hodnota minima.

Počáteční polohu posuvníku zadáme atributem value. Pokud ji neuvedeme, bude nastavena na minimum.

Posledním speciálním atributem scroll baru, který je možné nastavit v GDF, je tracking s možnými hodnotami true nebo false (defaultní). Pokud nastavíme na false, bude scroll bar vysílat signál sig_value_changed pouze v okamžiku, kdy uživatel uvolní tlačítko poté, co pohyboval s posuvníkem (slider). V případě, že nastavíme tracking na true, bude tento signál vysílán během doby, kdy je posuvník uchopen.

Následuje příklad zápisu nastavení scroll baru v GDF:

<scrollbar name="ScrollBar" x="160" y="40" width="100" height="20" min="0" orientation="hor" max="2" tracking="false" /> 

Samotná třída CL_ScrollBar nám nabízí následující metody:

bool is_vertical() const;

Metoda is_vertical() nám odpoví, zda se jedná o horizontální nebo vertikální scroll bar.

bool is_tracking() const;

Metoda is_tracking() říká, zda je tracking zapnut, nebo není.

int get_min_value() const;
int get_max_value() const;
int get_range() const;

První dvě metody vrací minimální resp. maximální hodnotu scroll baru, třetí vrací jejich rozdíl, tj. rozpětí.

int get_value() const;

Metoda get_value() vrací aktuální hodnotu udanou pozicí posuvníku.

bool is_dragging_slider() const;

Metoda is_dragging_sli­der() vrací true, pokud uživatel kliknul na posuvník a dosud ho drží. V opačném případě vrací false.

bool is_fixed_length_slider() const;

Metoda is_fixed_length_sli­der() říká, zda má posuvník pevnou velikost.

CL_Rect &get_slider_rect() const;

Pomocí get_slider_rect() dostaneme obdelník (CL_Rect) odpovídající posuvníku.

int get_min_slider_length() const;

Metoda get_min_slider_len­gth() vrací minimální velikost (resp. délku) posuvníku.

void set_fixed_length_mode(bool enabel = true);

Pomocí set_fixed_len­gth_mode() můžeme nastavit, zda má mít posuvník pevnou délku (true), nebo zda se má délka automaticky měnit podle rozsahu (false).

void set_slider_length(int length);
void set_min_slider_length(int length);

Pomocí set_slider_length() nastavujeme délku posuvníku. Pomocí set_min_slider_len­gth() nastavujeme minimální délku posuvníku, která může být použita při automatickém nastavování.

void set_vertical(bool enable = true);

Pomocí set_vertical() můžeme přepínat mezi vertikální a horizontální verzí posuvníku.

void set_tracking(bool enable = true);

Metodou set_tracking() můžeme nastavit tracking (viz odpovídající atribut v GDF popsaný výše).

void set_min_value(int value);
void set_max_value(int value);
void set_range(int min_value, int max_value);

Tyto metody slouží k nastavení minimální resp. maximální hodnoty resp. obou dvou najednou.

void set_value(int value);

Pomocí set_value() nastavíme aktuální polohu posuvníku.

void increase(int step = 1);
void decrease(int step = 1);

Metody increase(), decrease() způsobí posun posuvníku o zadaný počet dílků, defaultně o jeden dílek.

Navíc CL_ScrollBar vysílá následující signály:

CL_Signal_v1<int> &sig_value_changed();

Signál sig_value_changed jsme si již popsali v úvodu v souvislosti s atributem tracking, podle jehož hodnoty se mění moment, kdy je tento signál vyslán.

CL_Signal_v0 &sig_slider_pressed();

Signál vyslaný, pokud zmáčkneme tlačítko myši nad posuvníkem.

CL_Signal_v1<int> &sig_slider_moved();

Signál vyslaný ve chvíli, kdy pohneme s posuvníkem. Nese s sebou novou hodnotu pozice posuvníku.

CL_Signal_v0 &sig_slider_released();

Signál, kerý je vyslán, pokud uvolníme chycený posuvník.

CL_Frame

CL_Frame je komponenta reprezentující rámeček. Tento rámeček může být buď vyplněný, nebo průhledný, tj. vidíme pouze okraj. K nastavení této vlastnosti v GDF se používá atribut filled s možnými hodnotami true, nebo false, což je defaultní hodnota.

V GDF tedy nastavení rámečku může vypadat třeba nějak takto:

<frame name="frame1" x="10" y="10" width="100" height="20" filled="true" /> 

Jestli je rámeček vyplněný, nebo ne, zjistíme pomocí metody

bool is_fill_enabled() const;

Tuto vlastnost je samozřejmě také možné nastavit. Příslušná metoda je tato:

void enable_fill(bool enabled = true);

V příkladu z minulého dílu je použit rámeček na dvou místech. Rád bych se trochu vrátil k tomu, jak je možné naprogramovat efekt, který je v uvedeném příkladě, totiž že se rámeček vyplňuje pouze ve chvíli, kdy je v něm myš.

Třída CL_Component vysílá, jak již víme, signály sig_mouse_enter a sig_mouse_leave ve chvílích, kdy kurzorem vstoupíme do plochy komponenty, resp. když tuto plochu opustíme.

Prvním nápadem, jak naprogramovat vyplňování rámečku, by tedy asi mohlo být připojení jeho signálů sig_mouse_enter a sig_mouse_leave k metodám, které budou patřičně nastavovat mód zobrazení rámečku pomocí enable_fill().

Problém je v tom, že rámeček sám sebe považuje pouze za nevyplněný obrys, tj. do jeho plochy spadá pouze okraj, nikoliv však vnitřek, a proto přesunutí kurzoru z vnějšku rámečku do jeho vnitřku způsobí vyslání obou ze signálů, což ovšem není to, co potřebujeme.

Naštěstí třída CL_Component poskytuje metodu get_client_area(), která vrací ukazatel na CL_Component, tj. na komponentu reprezentující celou plochu zabranou danou komponentou, což je v případě rámečku obrys i s vnitřkem, a proto požadovaného efektu docílíme tak, že nepoužijeme přímo signály třídy CL_Frame, ale signály třídy CL_Component získané metodou CL_Frame::get_cli­ent_area().

Na přesnou implementaci se můžete podívat do zmíněného příkladu, základem však je následující část kódu:

Sloty.connect(Ramecek-> get_client_area()-> sig_mouse_enter(), this, &T_Aplikace::on_Ramecek_enter); 

(Pozn. red: mezery za šipky přidány kvůli sazbě –Johanka)

NMI18_Materna

Závěr

Možná jste si všimli, že stránky www.ClanLib.org zase začínají pěkně fungovat poté, co přešly na nový server, takže se můžeme těšit na další vylepšení knihovny.

Příště budeme pokračovat s dalšími komponentami. Pokud máte nějaký námět na ukázkový příklad k tvorbě GUI nebo na nějaké rozšíření příkladu z minula, klidně se ozvěte, pokud to bude v mých silách, pokusím se to naprogramovat.

Našli jste v článku chybu?