Blame platform-demos/cs/image-viewer.vala.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="image-viewer.vala" xml:lang="cs">
Packit 1470ea
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Prohlížeč obrázků (Vala)</title>
Packit 1470ea
    <link type="guide" xref="vala#examples"/>
Packit 1470ea
Packit 1470ea
    <desc>O trošku složitější aplikace GTK+ než jednoduché „Hello world“.</desc>
Packit 1470ea
Packit 1470ea
    <revision pkgversion="0.1" version="0.1" date="2011-03-18" status="review"/>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Dokumentační projekt GNOME</name>
Packit 1470ea
      <email its:translate="no">gnome-doc-list@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Johannes Schmid</name>
Packit 1470ea
      <email its:translate="no">jhs@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Philip Chimento</name>
Packit 1470ea
      <email its:translate="no">philip.chimento@gmail.com</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="editor">
Packit 1470ea
     <name>Tiffany Antopolski</name>
Packit 1470ea
     <email its:translate="no">tiffany.antopolski@gmail.com</email>
Packit 1470ea
    </credit>
Packit 1470ea
  <credit type="editor">
Packit 1470ea
    <name>Marta Maria Casetti</name>
Packit 1470ea
    <email its:translate="no">mmcasetti@gmail.com</email>
Packit 1470ea
    <years>2013</years>
Packit 1470ea
  </credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>Prohlížeč obrázků</title>
Packit 1470ea
<synopsis>
Packit 1470ea
  

V této lekci vytvoříte aplikaci, která otevře a zobrazí soubor s obrázkem. Naučíte se:

Packit 1470ea
  <list type="numbered">
Packit 1470ea
    <item>

Jak vytvořit základní projekt pomocí <link xref="getting-ready">IDE Anjuta</link>.

</item>
Packit 1470ea
    <item>

Jak napsat <link href="http://developer.gnome.org/platform-overview/stable/gtk">aplikaci Gtk</link> v jazyce Vala.

</item>
Packit 1470ea
    <item>

Některé základní koncepty programování s <link href="http://developer.gnome.org/gobject/stable/">GObject</link>

</item>
Packit 1470ea
Packit 1470ea
  </list>
Packit 1470ea
  

Abyste mohli pokračovat v této lekci, budete potřebovat následující:

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Základní znalosti programovacího jazyka <link href="https://live.gnome.org/Vala/Tutorial">Vala</link>.

</item>
Packit 1470ea
    <item>

Nainstalovanou kopii vývojářského studia <app>Anjuta</app>.

</item>
Packit 1470ea
    <item>

Může se vám hodit referenční příručka k API <link href="http://valadoc.org/gtk+-3.0/">gtk+-3.0</link>, ačkoliv pro tuto výuku není nutná.

</item>
Packit 1470ea
  </list>
Packit 1470ea
</synopsis>
Packit 1470ea
Packit 1470ea
<media type="image" mime="image/png" src="media/image-viewer.png"/>
Packit 1470ea
Packit 1470ea
<section id="anjuta">
Packit 1470ea
  <title>Vytvoření projektu ve studiu Anjuta</title>
Packit 1470ea
  

Než začnete s kódováním, musíte ve studiu Anjuta vytvořit nový projekt. Tím se vytvoří všechny soubory, které budete později potřebovat k sestavení a spuštění kódu. Je to také užitečné kvůli udržení všeho pohromadě.

Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
      

Spusťte aplikaci <app>Anjuta</app> a klikněte na <gui>Vytvořit nový projekt</gui> nebo <guiseq><gui>Soubor</gui> <gui>Nový</gui> <gui>Projekt</gui></guiseq>, aby se otevřel průvodce projektem.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Na kartě <gui>Vala</gui> zvolte <gui>GTK+ (jednoduchý)</gui>. Klikněte na <gui>Pokračovat</gui> a na několika následujících stránkách vyplňte své údaje. Jako název projektu a složky použijte <file>image-viewer</file>.

Packit 1470ea
   	</item>
Packit 1470ea
    <item>
Packit 1470ea
      

Ujistěte se, že <gui>Použít GtkBuilder k tvorbě uživatelského rozhraní</gui> je vypnuto, protože jej chceme v této lekci vytvořit ručně.

Packit 1470ea
     <note>

Jak používat builder k tvorbě rozhraní se můžete naučit v lekci <link xref="guitar-tuner.vala">Kytarová ladička</link>.

</note>
Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Klikněte na <gui>Pokračovat</gui> a pak na <gui>Použít</gui> a vytvoří se vám projekt. Otevřete <file>src/image_viewer.vala</file> na kartě <gui>Projekt</gui> nebo <gui>Soubor</gui>. Měli byste vidět kód, který začíná řádky:

Packit 1470ea
      
Packit 1470ea
using GLib;
Packit 1470ea
using Gtk;
Packit 1470ea
Packit 1470ea
public class Main : Object
Packit 1470ea
{
Packit 1470ea
Packit 1470ea
	public Main ()
Packit 1470ea
	{
Packit 1470ea
		Window window = new Window();
Packit 1470ea
		window.set_title ("Hello World");
Packit 1470ea
		window.show_all();
Packit 1470ea
		window.destroy.connect(on_destroy);
Packit 1470ea
	}
Packit 1470ea
Packit 1470ea
	public void on_destroy (Widget window)
Packit 1470ea
	{
Packit 1470ea
		Gtk.main_quit();
Packit 1470ea
	}
Packit 1470ea
Packit 1470ea
	static int main (string[] args)
Packit 1470ea
	{
Packit 1470ea
		Gtk.init (ref args);
Packit 1470ea
		var app = new Main ();
Packit 1470ea
Packit 1470ea
		Gtk.main ();
Packit 1470ea
Packit 1470ea
		return 0;
Packit 1470ea
	}
Packit 1470ea
}
Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="build">
Packit 1470ea
  <title>Prvotní sestavení kódu</title>
Packit 1470ea
  

Kód načte (prázdné) okno ze souboru s popisem uživatelského rozhraní a zobrazí jej. Dále to podrobněji rozebereme. Pokud jste již pochopili základy, tak tento seznam můžete přeskočit:

Packit 1470ea
Packit 1470ea
  <list>
Packit 1470ea
    <item>
Packit 1470ea
      

Dva řádky using v horní části naimportují jmenné prostory, abychom je nemuseli výslovně uvádět.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Konstruktor třídy Main vytvoří nové (prázdné) okno a napojí <link href="https://live.gnome.org/Vala/SignalsAndCallbacks">signál</link>, aby se aplikace ukončila, když se zavře okno.

Packit 1470ea
      

Napojení signálu je způsob, jak definovat, co se má stát, když zmáčknete tlačítko nebo se prostě něco přihodí. Zde je zavolána metoda destroy (a ukončení aplikace) při zavření okna.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Funkce static main se spustí jako výchozí, když spustíte aplikaci napsanou v jazyce Vala. Volá pár funkcí, které vytvoří třídu Main a nastaví a spustí aplikaci. Funkce <link href="http://valadoc.org/gtk+-3.0/Gtk.main.html">Gtk.main</link> spustí <link href="http://en.wikipedia.org/wiki/Event_loop">hlavní smyčku</link> GTK, která spustí uživatelské rozhraní a začne naslouchat událostem (jako je kliknutí nebo zmáčknutí klávesy).

Packit 1470ea
    </item>
Packit 1470ea
  </list>
Packit 1470ea
Packit 1470ea
  

Kód je připravený k použití, takže jej můžete zkompilovat kliknutím na <guiseq><gui>Sestavit</gui> <gui>Sestavit projekt</gui></guiseq> (nebo zmáčknutím <keyseq><key>Shift</key> <key>F7</key></keyseq>).

Packit 1470ea
  

Změňte <gui>Konfiguraci</gui> na <gui>Výchozí</gui> a klikněte na <gui>Spustit</gui>, aby se nakonfigurovala složka, ve které se provádí sestavení. Stačí to udělat jen jednou, pro první sestavení.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="ui">
Packit 1470ea
  <title>Vytvoření uživatelského rozhraní</title>
Packit 1470ea
  

Nyní prázdné okno oživíme. GTK uspořádává uživatelské rozhraní pomocí widgetů <link href="http://www.valadoc.org/gtk+-2.0/Gtk.Container.html">Gtk.Container</link>, které mohou obsahovat další widgety i další kontejnery. Zde použijeme nejjednodušší dostupný kontejner <link href="http://unstable.valadoc.org/gtk+-2.0/Gtk.Box.html">Gtk.Box</link>.

Packit 1470ea
Packit 1470ea

Přidejte následující řádky na začátek třídy Main:

Packit 1470ea
  
Packit 1470ea
private Window window;
Packit 1470ea
private Image image;
Packit 1470ea
Packit 1470ea
Packit 1470ea

Nyní nahraďte současný konstruktor tímto uvedeným níže:

Packit 1470ea
Packit 1470ea
Packit 1470ea
public Main () {
Packit 1470ea
Packit 1470ea
	window = new Window ();
Packit 1470ea
	window.set_title ("Image Viewer in Vala");
Packit 1470ea
Packit 1470ea
	// Nastaví uživatelské rozhraní
Packit 1470ea
	var box = new Box (Orientation.VERTICAL, 5);
Packit 1470ea
	var button = new Button.with_label ("Open image");
Packit 1470ea
	image = new Image ();
Packit 1470ea
Packit 1470ea
	box.pack_start (image, true, true, 0);
Packit 1470ea
	box.pack_start (button, false, false, 0);
Packit 1470ea
	window.add (box);
Packit 1470ea
Packit 1470ea
	// Zobrazí dialogové okno při otevírání souboru
Packit 1470ea
	button.clicked.connect (on_open_image);
Packit 1470ea
Packit 1470ea
	window.show_all ();
Packit 1470ea
	window.destroy.connect (main_quit);
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
      

První dva řádky jsou částí GUI a budeme k nim potřebovat přístup z více než jedné metody. Proto je deklarujeme zde, takže budou přístupné skrze třídu. Jinak by byly přístupné jen v metodě, kde by byly vytvořeny.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

První řádek konstruktoru vytvoří prázdné okno. Následující řádky vytvoří widgety, které chceme používat: tlačítko pro otevření obrázku, vlastní widget pro zobrazení obrázku a box sloužící jako kontejner.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Volání <link href="http://unstable.valadoc.org/gtk+-2.0/Gtk.Box.pack_start.html">pack_start</link> přidává dva widgety do boxu a definuje jejich chování. Obrázek se roztáhne přes veškeré dostupné místo, zatímco tlačítko bude jen tak velké, jak je potřeba. Všimněte si, že jsem u widgetů výslovně nenastavili velikost. GTK to obvykle nepotřebuje, což usnadňuje udělat rozvržení, které vypadá dobře při různých velikostech okna. Následně je box přidán do okna.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Potřebujeme nadefinovat, co se stane, když uživatel klikne na tlačítko. GTK používá koncept signálů.

Packit 1470ea
      

Když je kliknuto na <link href="http://valadoc.org/gtk+-3.0/Gtk.Button.html">button</link>, vyšle se signál <link href="http://valadoc.org/gtk+-3.0/Gtk.Button.clicked.html">clicked</link>, který může být napojen na nějakou akci (definovanou v metodě <link href="https://live.gnome.org/Vala/SignalsAndCallbacks">zpětného volání</link>).

Packit 1470ea
      

To se udělá pomocí metody connect signálu clicked u tlačítka, což v tomto případě řekne GTK, aby ve chvíli, kdy je na tlačítko kliknuto, zavolalo (zatím nenadefinovanou) metodu zpětného volání on_image_open. Zpětné volání nadefinujeme v další části.

Packit 1470ea
      

Ve zpětném volání potřebujeme přístup k widgetům window a image, což je důvod, proč je definujeme jako soukromé členy na začátku naší třídy.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Poslední volání funkce connect zajistí, že se aplikace ukončí, když je zavřeno okno. Kód, který vygenerovala Anjuta, volá metodu zpětného volání on_destroy, která volá <link href="http://www.valadoc.org/gtk+-2.0/Gtk.main_quit.html">Gtk.main_quit</link>, ale prosté napojení signálu na main_quit je jednodušší. Metodu on_destroy můžete smazat.

Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="image">
Packit 1470ea
  <title>Zobrazení obrázku</title>
Packit 1470ea
  

Nyní nadefinujeme obsluhu signálu pro signál clicked tzn. pro tlačítko zmíněné dříve. Přidejte tento kód za konstruktor:

Packit 1470ea
  
Packit 1470ea
public void on_open_image (Button self) {
Packit 1470ea
	var filter = new FileFilter ();
Packit 1470ea
	var dialog = new FileChooserDialog ("Open image",
Packit 1470ea
	                                    window,
Packit 1470ea
	                                    FileChooserAction.OPEN,
Packit 1470ea
	                                    Stock.OK,     ResponseType.ACCEPT,
Packit 1470ea
	                                    Stock.CANCEL, ResponseType.CANCEL);
Packit 1470ea
	filter.add_pixbuf_formats ();
Packit 1470ea
	dialog.add_filter (filter);
Packit 1470ea
Packit 1470ea
	switch (dialog.run ())
Packit 1470ea
	{
Packit 1470ea
		case ResponseType.ACCEPT:
Packit 1470ea
			var filename = dialog.get_filename ();
Packit 1470ea
			image.set_from_file (filename);
Packit 1470ea
			break;
Packit 1470ea
		default:
Packit 1470ea
			break;
Packit 1470ea
	}
Packit 1470ea
	dialog.destroy ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  

Toto je trochu složitější, takže si to pojďme rozebrat:

Packit 1470ea
  <note>

Obsluha signálu je typ metody zpětného volání, která je volána, když je vyslán signál. Běžně se k označní používají oba termíny.

</note>
Packit 1470ea
  <list>
Packit 1470ea
    <item>
Packit 1470ea
      

Prvním argumentem metody zpětného volání je vždy widget, který signál vyslal. Někdy za ním může následovat další argument související se signálem, ale clicked žádný nemá.

Packit 1470ea
      

V tomto případě button vyšle signál clicked, který je napojen na metodu zpětného volání on_open_image:

Packit 1470ea
Packit 1470ea
        button.clicked.connect (on_open_image);
Packit 1470ea
Packit 1470ea
Packit 1470ea
  

Metoda on_open_image přebírá jako argument tlačítko, které vyslalo signál:

Packit 1470ea
 
Packit 1470ea
        public void on_open_image (Button self)
Packit 1470ea
Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Dalším zajímavým řádkem je ten, kde je vytvořeno dialogové okno pro výběr souboru. Konstruktor widgetu <link href="http://www.valadoc.org/gtk+-3.0/Gtk.FileChooserDialog.html">FileChooserDialog</link> přebírá název do záhlaví dialogového okna, rodičovské okno a několik voleb, jako je počet tlačítek a jim odpovídající hodnoty.

Packit 1470ea
      

Všimněte si, že používáme <link href="http://unstable.valadoc.org/gtk+-3.0/Gtk.Stock.html">standardní</link> názvy tlačítek z Gtk, místo abychom ručně psali „Cancel“ nebo „Open“. Výhodou použití standardních názvů je, že popisky tlačítek budou vždy přeloženy do uživatelova jazyka.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Následující dva řádky omezí dialogové okno <gui>Open</gui>, aby zobrazovalo jen soubory, které lze otevřít pomocí GtkImage. Nejprve je vytvořen filtr a pak do něj přidáme všechny druhy souborů podporované v <link href="http://www.valadoc.org/gdk-pixbuf-2.0/Gdk.Pixbuf.html">GdkPixbuf</link> (což zahrnuje většinu obrázkových formátů, včetně PNG a JPEG). Nakonec tento filtr nastavíme aby byl filtrem dialogového okna <gui>Open</gui>.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

<link href="http://www.valadoc.org/gtk+-3.0/Gtk.Dialog.run.html">dialog.run</link> zobrazí dialogové okno <gui>Open</gui>. Dialogové okno bude čekat na uživatele, než si vybere obrázek. Až tak učiní, vrátí dialog.run hodnotu <output>ResponseType.ACCEPT</output> typu <link href="http://www.valadoc.org/gtk+-3.0/Gtk.ResponseType.html">ResponseType</link> nebo by mohl vrátit <output>ResponseType.CANCEL</output>, když uživatel klikne na <gui>Cancel</gui>. Otestujeme to výrazem switch.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Při předpokladu, že uživatel klikl na <gui>Open</gui>, následující řádek získá název souboru s obrázkem, který uživatel vybral a řekne widgetu GtkImage, aby jej načetl a zobrazil.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

Na posledním řádku této metody zlikvidujeme dialogové okno <gui>Open</gui>, protože jej již nebudeme potřebovat.

Packit 1470ea
      

Zlikvidováním se dialogové okno automaticky skryje.

Packit 1470ea
    </item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="run">
Packit 1470ea
  <title>Sestavení a spuštění aplikace</title>
Packit 1470ea
  

Celý kód by nyní měl být připravený k fungování. Klikněte na <guiseq><gui>Sestavit</gui> <gui>Sestavit projekt</gui></guiseq>, aby se vše znovu sestavilo a pak na <guiseq><gui>Spustit</gui> <gui>Spustit</gui></guiseq>, aby se aplikace spustila.

Packit 1470ea
  

Pokud jste tak ještě neučinili, zvolte aplikaci <file>src/image-viewer</file> v dialogovém okně, které se objeví. Nakonec klikněte na <gui>Spustit</gui> a užijte si ji!

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="impl">
Packit 1470ea
  <title>Ukázková implementace</title>
Packit 1470ea
  

Pokud v této lekci narazíte na nějaké problémy, porovnejte si svůj kód s tímto <link href="image-viewer/image-viewer.vala">ukázkovým kódem</link>.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="next">
Packit 1470ea
  <title>Další postup</title>
Packit 1470ea
  

Zde je pár nápadů, jak byste mohli tuto jednoduchou ukázku rozšířit:

Packit 1470ea
  <list>
Packit 1470ea
  <item>

Nastavit ji tak, že když se okno otevře, bude mít konkrétní počáteční velikost. Například 200 × 200 pixelů.

</item>
Packit 1470ea
   <item>
Packit 1470ea
     

Umožnit uživateli výběr složky místo souboru a poskytnout ovládání pro procházení všech obrázků v této složce.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
     

Použít při načtení obrázku náhodné filtry a efekty a umožnit uživateli takto změněný obrázek uložit.

Packit 1470ea
     

<link href="http://www.gegl.org/api.html">GEGL</link> poskytuje mocné schopnosti pro práci s obrázky.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
     

Umožnit uživateli načíst obrázky ze síťového sdílení, skenerů a dalších složitějších zdrojů.

Packit 1470ea
     

Pro práci se síťovými přenosy můžete použít <link href="http://library.gnome.org/devel/gio/unstable/">GIO</link> a pro obsluhu skeneru <link href="http://library.gnome.org/devel/gnome-scan/unstable/">GNOME Scan</link>.

Packit 1470ea
   </item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
</page>