Hlavní navigace

Knihovna ClanLib (23)

18. 10. 2004
Doba čtení: 5 minut

Sdílet

Minule a předminule jsme se věnovali tvorbě menu. V tomto dílu si doplníme ještě několik informací týkajících se této problematiky (například si ukážeme, jak vytvořit menu s ikonami u jednotlivých položek) a příště se již budeme moci vrhnout zase na něco trochu jiného.

Metody třídy CL_MenuItem

CL_MenuItem(
        const std::string &text,
        CL_Component *parent,
        CL_StyleManager *style = NULL);

Konstruktor třídy CL_MenuItem přijímá jako první parametr řetězec odpovídající textu, který tato komponenta zobrazí uživateli jako svůj popis. Druhý parametr je ukazatel na „rodičovskou“ komponentu, což bude v tomto případě obvykle ukazatel na objekt třídy CL_MenuNode.

const std::string &get_text() const;
void set_text(const std::string &text);
void set_text(int number);
void set_text(double number);

První metoda vrátí zmíněný text jako std::string. Pomocí druhé můžeme tento text kdykoliv nastavit. Třetí a čtvrtá z metoda nastaví řetězcovou reprezentaci zadaného čísla, což nám může často ušetřit práci, jelikož pak nejsme nuceni sami provádět převod čísla na řetězec.

void clear();

Metoda clear() nastaví text na prázdný řetězec.

bool is_toggling() const;

Tato metoda odpoví, zda se jedná o objekt třídy CL_MenuItem v přepínacím módu (takový se dá vytvořit například pomocí metody create_toggle_i­tem() třídy CL_Menu, viz příklad v předminulém dí­lu).

void set_toggling(bool toggle);

Pomocí set_toggling() můžeme přepínat mezi přepínacím a nepřepínacím módem.

bool is_selected() const;

Metoda is_selected() odpovídá, zda je tento objekt vybrán, což má pochopitelně svůj význam v přepínacím módu.

void set_selected(bool selected);

Přepnutí, jak vidíte, je možno provést přímo v kódu. Jinak se samozřejmě přepíná v běžícím programu kliknutím myší na příslušnou položku (uzel resp. list) menu.

void set_use_icon(bool use_icon);
bool use_icon() const;

Pomocí první z metod můžete povolit či zakázat použití ikony, která se zobrazí jako součást příslušné položky menu. Druhá metoda odpoví, zda je použití ikony povoleno, nebo zakázáno.

Možná jste si na ukázkách v předchozích dílech všimli, že pokud vytvoříte CL_MenuItem v přepínacím módu, zobrazí se vedle jeho textu v běžícím programu také ikonka:

Když se na tento obrázek podíváte, nejen že uvidíte ikonu vedle položky F, zajisté si také všimnete, že vedle všech nápisů je místo, do kterého by se ikona vešla. Jak dokazuje následující obrázek a na něm zachycená položka Save, není zde toto místo bezdůvodně:

Otázka přirozeně zní: Jak příslušnou ikonu nastavit? Odpověď překvapivě není úplně jednoduchá. Třída CL_MenuItem totiž pro tuto činnost nemá žádnou použitelnou metodu, jak by možná někteří z nás očekávali.

Pokud se však trochu zamyslíme, uvědomíme si, že se všichni potomci třídy CL_Component, o nichž jsme se dosud zmiňovali, starali o funkčnost příslušných komponent, nikoliv však o jejich vzhled. Zjednodušeně řečeno je to tak, že funkčnost je věcí potomků CL_Component a vzhled je věcí stylů. Funkčnost je stejná, avšak styly, tj. vzhledy, se mohou podstatně lišit.

K povídání o stylech se dostaneme někdy později, proto nyní nebudu zabíhat do podrobností. Pro vyřešení našeho problému je třeba uvědomit si pouze to, že otázka, zda se v menu budou vyskytovat ikony a jaké, je otázkou stylu, nikoliv funkčnosti, proto by bylo nesmyslné povolit nastavení ikony pro libovolný objekt CL_MenuItem, když by to z hlediska potenciálně mnoha stylů nedávalo žádný smysl.

V našem povídání a ukázkách pracujeme neustále se stříbrným stylem GUI, a to je také důvod, proč na předchozích obrázcích menu můžete vidět ikony. Stříbrný styl je prostě podporuje. Ikonu pro objekt třídy CL_ListItem v takovém případě můžeme nastavit například následovně:

CL_MenuItem_Silver *item_save_style = (CL_MenuItem_Silver *)(menu.get_item("File/Save")->get_style());


item_save_style->set_icon(new CL_Surface("save.tga"), true); 

Nejprve získáme ukazatel na CL_MenuItem_Silver, což je objekt reprezentující stříbrný styl komponenty CL_MenuItem. Tento ukazatel získáme pomocí metody get_style(), kterou CL_MenuItem dědí od CL_Component. Tato metoda vrací ukazatel na styl, jímž je příslušná komponenta reprezentována. Pokud používáme CL_StyleManager_Sil­ver (náš případ), nemusíme se bát přetypování na potomka, tj. přetypování (CL_MenuItem_Sil­ver*).

Nakonec použijeme metodu set_icon() třídy CL_MenuItem_Silver k nastavení ikony. Deklarace této metody je následující:

void set_icon(CL_Surface *surface, bool delete_surface = false); 

První parametr je ukazatel na obrázek ikony (na objekt třídy CL_Surface), druhý říká, zda má být odkazovaný objekt obrázku automaticky uvolněn po destrukci této komponenty.

Některé další metody třídy CL_Menu

bool is_open();
void open();
void collapse();
void collapse_submenus();

V odpovídajícím pořadí nám tyto metody umožní zjistit, zda je menu rozbalené, rozbalit ho, sbalit ho, sbalit všechna submenu tohoto menu.

bool is_vertical();
void set_vertical(bool vertical);

Menu může být buď svislé, nebo podélné. První metoda vrátí true, je-li menu svislé. Pomocí druhé můžete tento příznak nastavit.

bool is_root_collapsing();
void set_root_collapsing(bool collapse);

První metoda vrátí true, jestliže je menu nastaveno, aby se sbalilo, kdykoliv klikneme mimo něj. Pomocí druhé tuto vlastnost můžeme nastavit na zapnout (true), či vypnout (false).

bool is_auto_resize();
void set_auto_resize(bool value);

Pomocí první z metod zjistíme, zda menu automaticky přizpůsobuje svou velikost rozměrům okna k němuž je přichyceno. Druhá metoda toto chování nastavuje.

bool has_mouse_over();
bool has_mouse_in_submenus();

První metoda vrátí true, je-li kurzor nad vždy viditelnou částí menu (uzly těsně pod kořenem). Druhá vrací true je-li kurzor nad některým z otevřených submenu.

std::list<CL_MenuNode*> &get_node_list();

Vrací list všech uzlů (krom kořene) tohoto menu.

bool is_click_to_open();
void set_click_to_open(bool click);

První metoda říká, zda je třeba kliknout, abychom menu rozbalili. Druhá toto chování nastavuje.

CS24_early

CL_Menu *get_menu(const std::string &name);
CL_MenuNode *get_node(const std::string &name);
CL_Component *get_item(const std::string &name);

Nakonec tři metody, které vrací tři různé reprezentace zadané části menu.

Závěr

Dokončili jsme problematiku tvorby menu, což, jak doufám, rozšířilo vaše možnosti při tvorbě uživatelského rozhraní. Příště se nejspíš podíváme na další užitečné třídy podobné již popsané třídě CL_Rect.

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

Autor článku