Knihovna ClanLib (15)

23. 8. 2004
Doba čtení: 5 minut

Sdílet

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.

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)

bitcoin školení listopad 24

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.

Autor článku