Dialog na otevření souboru
Všechna dialogová okna, která něco dělají se soubory nebo složkami, je vlastně jedna a ta samá třída, FileChooserDialog. Hlavní informace, tedy, jaký bude mít dané dialogové okno název a co má dělat, předáváme přímo konstruktoru. Na výběr máme tyto typy:
- FILE_CHOOSER_ACTION_OPEN
- FILE_CHOOSER_ACTION_SAVE
- FILE_CHOOSER_ACTION_SELECT_FOLDER
- FILE_CHOOSER_ACTION_CREATE_FOLDER
Takto vypadá např. dialog na uložení souboru:
Dále můžeme pomocí metody add_button() přidávat tlačítka. To si buď pojmenujeme sami (typ Glib::ustring), nebo zvolíme jeden z BuiltinStockID. Těch je docela dost, proto je zde nebudu vypisovat, ale pouze na ně odkazuji. K tlačítkům se vždy přiřadí událost (signál), která se vygeneruje, když se na dané tlačítko klikne. Několik událostí už je předdefinovaných a jejich seznam vidíte níže. Lze však zadat jakékoli číslo (typu int), ovšem předchozí možnost je jaksi názornější.
- RESPONSE_NONE
- RESPONSE_REJECT
- RESPONSE_ACCEPT
- RESPONSE_DELETE_EVENT
- RESPONSE_OK
- RESPONSE_CANCEL
- RESPONSE_CLOSE
- RESPONSE_YES
- RESPONSE_NO
- RESPONSE_APPLY
- RESPONSE_HELP
Abychom se dozvěděli, co uživatel s dialogovým oknem udělal, uložíme si návratovou hodnotu metody run() (ta dialog spouští) a použijeme běžný switch. Asi tak, jak to vidíte níže.
#include <gtkmm.h>
class Okno : public Gtk::Window {
public:
Okno();
void VyberSoubor();
protected:
Gtk::VBox ram;
Gtk::Button tlacitko;
Gtk::Label cesta;
};
Okno::Okno() {
tlacitko.set_label("Vyber soubor");
tlacitko.signal_clicked().connect(sigc::mem_fun(*this, &Okno::VyberSoubor));
cesta.set_text("Ještě nebyl vybrán žádný soubor.");
add(ram);
ram.pack_start(tlacitko);
ram.pack_end(cesta);
show_all_children();
}
void Okno::VyberSoubor() {
Gtk::FileChooserDialog dialog("Výběr souboru", Gtk::FILE_CHOOSER_ACTION_SAVE);
dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
dialog.add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_OK);
int odpoved = dialog.run();
switch(odpoved) {
case(Gtk::RESPONSE_OK): {
cesta.set_text(dialog.get_filename());
break;
}
case(Gtk::RESPONSE_CANCEL): {
break;
}
default: {
break;
}
}
}
int main(int argc, char *argv[]) {
Gtk::Main kit(argc, argv);
Okno okno;
Gtk::Main::run(okno);
return 0;
}
Notebook
Notebook je kontejner, který může mít několik stránek, mezi kterými se dá přepínat.
Vše zaštiťuje třída Gtk::Notebook. Metoda get_current_page() vrátí číslo právě aktivní stránky, page_num() vrátí číslo stránky, ve které se nachází předaný widget. Tato čísla budeme potřebovat při zavírání a aktivování stránek metodami remove_page() a set_current_page(). set_current_page() musíme předat číslo stránky, remove_page() nám dává na výběr mezi číslem stránky a widgetem, který je v ní. get_n_pages() vrací počet stránek v notebooku.
Nakonec to nejdůležitější. O přidání nové stránky se postará append_page(), která požaduje jen widget, který má nová stránka obsahovat. Tuto stránku se také hodí nějak označit. Nejjednodušší je použít metodu set_tab_label_text(widget_v_dané_stránce, označení), jenž je však schopna nastavit pouhý text. Za to set_tab_label(widget_v_dané_stránce, widget_v_popisku) je oprávněna použít k označení stránky jakýkoli widget. V praxi tam tak můžeme vložit kontejner, který bude obsahovat třeba ikonku představující typ souboru, název souboru, hvězdičku, která značí, že byl soubor nějak upraven a křížek, který se postará o zavření stránky („tabu“).
SrolledWindow
Textový editor je od toho, aby se v něm psal text. Většinou dlouh. Někdy dost dlouhý. Aby se v něm uživatel vyznal, byly vynalezeny posuvníky. Těmi „obalíme“ vstupní pole. Jak? Stačí jej vložit do kontejneru ScrolledWindow ( add(Gtk::Widget&)). K základnímu nastavení chování ScrolledWindow slouží metoda set_policy(), kde první argument nastavuje vodorovný, druhý svislý posuvník. I tady máme na výběz z několika možností.
- Gtk::POLICY_ALWAYS
- Gtk::POLICY_AUTOMATIC
- Gtk::POLICY_NEVER
POLICY_ALWAYS posuvník zobrazí za jakýchkoli okolností, POLICY_NEVER jej nezobrazí vůbec, POLICY_AUTOMATIC jen tehdy, když bude v poli příliš mnoho textu (tzn., že se do tohoto pole nevejde) a pokud metodu set_policy() nepoužijeme vůbec, zobrazí se oba posuvníky i při prázdném vstupním poli.
Schránka
Při práci se schránkou se využívá třídy chytrého ukazatele Glib::RefPtr. Deklarace vypadá nějak takto: Glib::RefPtr<Gtk::Clipboard> schranka;. V konstruktoru hlavního okna našeho editoru bude akorát schranka = Gtk::Clipboard::get(); – tímto získáme ukazatel na schránku. To bylo z přípravy práce se schránkou vše. K samotné práci s textem se většinou použije vždy jeden z těchto tří příkazů:
editacni_pole.get_buffer()->cut_clipboard(schranka, true); editacni_pole.get_buffer()->copy_clipboard(schranka); editacni_pole.get_buffer()->paste_clipboard(schranka, true);
Metoda get_buffer() vrací ukazatel na Gtk::TextBuffer, třídu obsahující text obsažený např. v Gtk::TextView.
Stavový řádek
Stavový řádek je většinou ten úzký pruh dole na úplném okraji okna, kde dostáváme základní informace o běhu programu, nějakou nápovědu, případně informace o pozici kurzoru apod.
Práce s ním je velmi jednoduchá. Jedná se o třídu Gtk::Statusbar a nový text do něj dostaneme za použití metody push(), které předáme požadovaný řetězec a „číslo kontextu“ (int). To znamená, že tam můžeme zobrazit nějaký text, ten následně přepsat a až se to bude hodit, zobrazit bez opětovného předávání řetězce ten původní. Řetězec s nějakým „číslem kontextu“ se maže metodou pop(guint context_id).
Ukázkový program
Tentokrát je pro přehlednost ukázkový program rozložen na tři díly. Prvním dílem je třída hlavního okna editoru, dalším metody pro práci se soubory a poslední obsahuje funkci main a několik různých metod.
Pokračování
Příště se pravděpodobně naučíme pracovat s Glade. Mám v plánu podívat se na práci s tiskárnou, popř. na novinky v Gtkmm 3. Další náměty můžete psát do diskuze.



