přejít na obsah přejít na navigaci

Linux E X P R E S, Grafické komponenty v Ruby - Akce

Grafické komponenty v Ruby - Akce

GTK.jpg

V dnešním díle budeme pokračovat úpravami programu a přiřadíme jednotlivým tlačítkům konkrétní akce. Také se podíváme na otázku zabezpečení aplikace proti chybám ze strany uživatele. Aplikace tedy začne pomalu ožívat a výsledkem bude téměř hotový program.


Stejně jako v běžném životě, i v programování je potřeba, aby před určitou reakcí předcházela nějaká akce. Tou může být kliknutí, pohyb myši, přetažení a mnohé další běžně prováděné operace. Připojení této reakce se provádí voláním metody signal_connect dané komponenty s parametrem udávajícím typ akce, např. kliknutí. Nic víc, nic míň.

Dál to vezměme postupně. Pomocí tlačítek Zdrojový adresář reps. Cílový adresář bychom chtěli vybrat vstupní resp. výstupní adresář s obrázky. K tomu použijeme standardní dialogová okna pro otevření souboru, ty se skrývají ve třídě Gtk::FileChooserDialog a připojíme je k těm správným tlačítkům.

sbutton.signal_connect("clicked") {
        dialog = Gtk::FileChooserDialog.new("Vyberte zdrojový adresář",
                                     @window,
                                     Gtk::FileChooser::ACTION_SELECT_FOLDER,
                                     nil,
                                     [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
                                     [Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_ACCEPT])
        dialog.current_folder = `echo $HOME`.chomp
        if dialog.run == Gtk::Dialog::RESPONSE_ACCEPT
                @sdirectory.text=dialog.filename
        end

        dialog.destroy
}

Upravený zdrojový soubor si opět můžete stáhnout. 2.rb

dbutton.signal_connect("clicked") {
        dialog = Gtk::FileChooserDialog.new("Vyberte cílový adresář",
                                     @window,
                                     Gtk::FileChooser::ACTION_SELECT_FOLDER,
                                     nil,
                                     [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
                                     [Gtk::Stock::OPEN, Gtk::Dialog::RESPONSE_ACCEPT])
        dialog.current_folder = `echo $HOME`.chomp
        if dialog.run == Gtk::Dialog::RESPONSE_ACCEPT
                @ddirectory.text=dialog.filename
        end

        dialog.destroy
}

Vybrání adresářeVybrání adresáře

Protože je program procházen směrem shora dolů, je nutno uvést předchozí metody až pod definice tlačítek dbutton a sbutton. Jinak program skončí chybovou hláškou.

Pokud jste se podívali na stránku s dokumentací ke třídě Gtk::FileChooserDialog, pak jste si jistě všimli že se naše část kódu podobá vzorovému kódu. Není to náhodou a jediné na co si musíte dát pozor je prováděná akce ACTION_SELECT_FOLDER, která se liší od běžnější ACTION_OPEN v tom, že uživateli umožní vybrat adresář.

Konstrukce `echo $HOME`.chomp používá jednoduchý příkaz shellu echo $HOME, pomocí něhož zjistí domovský adresář uživatele, který program spustil a použije ho jako výchozí adresář otevřený po zobrazení dialogu. Metoda chomp odstraňuje netisknutelné znaky (např. znak nového řádku), který by nám při nastavení aktuálního adresáře překážel.

Tím máme tlačítka Zdrojový/Cílový adresář nastavena a napojena na příslušná textová pole. Uživatel přitom může zadat umístění zdrojového a cílového adresáře také ručně. Tady si dovolím znovu trochu odbočit a podívat se na ošetření našeho programu proti chybám ze strany uživatele.

Neexistují hloupí uživatelé, ale pouze hloupě napsané aplikace, přesně takto by se dalo shrnout jednoduché pravidlo, kterým bychom se mohli dál řídit. Protože je zdrojový a cílový adresář jedním z míst, kde může uživatel ve spěchu či z nepozornosti udělat nějakou chybu, je jistě dobré tuto chybu předem předvídat a program na ní nějakým způsobem připravit.

Dalším slabým místem také může být chybně zadaný rozměr cílového obrázku nebo zdrojový adresář ve kterém není žádný obrázek. Ošetření těchto chyb ale už nechám na vás.

Vytvořme proto metodu check_before, která se provede po kliknutí na tlačítko Převést! a provede nutnou kontrolu správnosti zadání zdrojového a cílového adresáře. Tato metoda může vypadat třeba následovně:

def check_before 
        if @sdirectory.text.length < 1 || @ddirectory.text.length < 1
                error_window "Musíte zadat zdrojový a cílový adresář!"
                false
        elsif (not File.exist?(@sdirectory.text)) || (not File.exist?(@ddirectory.text))
                error_window "Takový zdrojový nebo cílový adresář neexistuje!"
                false
        else
                true
        end
end

Na tuto metodu se pak odkážeme po kliknutí na tlačítko Převést! následovně:

button.signal_connect("clicked") {

  if check_before then 
                # požadované akce po kliknutí na tlačítko
  end
}

Ještě se vraťme k metodě check_before, v ní totiž voláme jakousi metodu error_window, kterou musíme nejprve vytvořit. Tato metoda jednoduše použije třídu Gtk::MessageDialog obsahující přesně ta dialogová okna, které potřebujeme.

def error_window (message)
        dialog = Gtk::MessageDialog.new(@window, 
                                Gtk::Dialog::MODAL,
                                Gtk::MessageDialog::QUESTION,
                                Gtk::MessageDialog::BUTTONS_CLOSE,
                                message )
        dialog.run
        dialog.destroy
end

Volba MODAL zde přitom uvádí, že bude dialogové okno zobrazeno nad aktivním oknem a pomocí proměnné message tomuto oknu předáváme zobrazovaný text. Také si všimněte, že metoda check_before vrací hodnotu false (nepravda) resp. true (pravda) v závislosti na tom, zda testy proběhnou v pořádku. Tato návratová hodnota metody se uvádí na posledním řádku, který se provede.

Aby toho nebylo moc, nechejme si zbytek na příště. V příštím závěrečném díle se podíváme na to nejdůležitější, tím jsou akce prováděné po kliknutí na tlačítko Převést! a také si povíme něco málo o lokalizaci našeho programu do jiných jazyků.

Nahoru

Přidat téma diskuse

Nejsou podporovány žádné značky, komentáře jsou jen čistě textové. Více o diskuzích a pravidlech najdete v nápovědě.
Diskuzi můžete sledovat pomocí RSS kanálu rss



 
 

Top články z OpenOffice.cz