1 [[!meta title="Grafická uživatelská prostředí a knihovny"]]
4 # Tvorba grafických aplikací
6 ## Žijeme v přelomovém období
8 - vznikl obrovský trh z mobilními aplikacemi
9 - desktopové aplikace opouští programátorské výsluní a jsou nahrazovány mobilními
10 - dlouho jsme měli klávesnici, myš a nepsanou dohodu o tom, jak má vypadat widget-set
11 - s mobilními aplikacemi přichází touch-screen, což má obrovský impakt na UI
12 - postupně se vžívá názor, že aplikace musí být průhledná, nepřehledná a zmatená, aby byla úspěšná na trhu, uživatelé na to přistupují
13 - vysledkem je, že v grafických aplikacích jsme v podstatě zase na začátku
14 - Je velký rozdíl mezi desktopovou aplikací a mobilní, přesto existují snahy je sjednotit (Windows Metro, Ubuntu Unity)
16 ## Potřebujeme vůbec GUI?
18 ### Výhody/nevýhody GUI aplikací
20 - Uživatel může být hloupější a nemusí se tolik učit, existuje jisté latentní Know-How, aplikace se ovládají obdobně pomocí stejných typů widgetů.
21 - Stačí pasivní znalost UI.
22 - Větší vyjadřovací schopnost, obrázek má nespornou vyjadřovací schopnost.
23 - Lze maximálně využít display.
25 - Většinu aplikace tvoří GUI
26 - Lze je používat v režimu sváteční uživatel
28 ### Výhody/nevýhody CLI aplikací
30 - Učící křivka je jednotkový skok
31 - Lze jednoduše skriptovat a automatizovat práci
32 - Většinu aplikace tvoří business logika
33 - Je třeba je používat pravidelně, jinak uživatel zapomene, jak se to vlastně psalo
35 ### CLI aplikace s GUI kabátkem
37 - Na desktopu ideální stav
42 ### Požadavky na aplikaci
44 - **MULTIPLATFORMNOST** (MasOS, Windows, Linux) (iOS, Windows Mobile, Android, BB10, ...)
45 - jako developer jistě chcete svou aplikaci napsat jednou a pak ji prodávat na všech platformách
50 - komunikace s okolím, často nějaký druh RPC (SQL, HTTP, AJAX, DBus)
51 - podpora standardů (XML, JSON, PDF, JPG, PNG, SVG)
52 - autentizace uživatelů
53 - bezpečnost (systémová, práva uživatelů)
55 - multithreading, synchronizace
57 - instalátor/balíčkovací systém
61 GUI aplikace mají navíc:
63 - zpracování eventů (event driven aplikace, xev)
66 - mobilní aplikace - UI adaptability
69 #### Stále nemáme ani řádek cílené funkcionality
71 ### Systémové požadavky
73 - použité programovací jazyky a jejich počet
74 - cílová platforma (cílový OS) / multiplatformnost
75 - lokální, síťová, tenký/tlustý klient, 1-2-3 vrstvá
83 - Apple iOS - Object C
85 - BlackBerry BB10 - Cascades Qt/QML
86 - Meego - Qt + QML ???
90 - mnoho dalších možností
91 - HW nároky (paměť, procesor, konektivita)
100 ### Vývojové nástroje
102 - Build System (CMake, QMake, Ant, ...)
103 - Source Code Management (Git, Mercurial, Bazaar, Darts, SVN, CVS, ...)
104 - Issue Tracking System (Jira, BugZilla, GitLab, GitHub, Redmine, Track, ...)
105 - Code Review (GitHub, GitLab, Gerrit, ...)
106 - Continuous Integration CI (Jenkins, Travis, GitHub, ...)
108 - Documentation Wiki (Confluence, IkiWiki, GitLab, GitHub, DokuWiki, <1000 skipped>, MediaWiki)
109 - Process Planning, Agile, Scrum, Kanban, Waterfall, **je to hnus**, (Jira, Redmine)
112 ### V neposlední řadě
114 - **MUSÍ TO FUNGOVAT**
116 ### Doby, kdy toto vše dokázal vymyslet a napsat někdo sám jsou nenávratně pryč
118 - ať chceme, či ne, jsme nuceni se dříve či později porozhlédnout po nějakém pěkném frameworku
119 - rovněž vhodné IDE dokáže naši práci podstatně urychlit (code completion, indexer, profiling, debugging, UI designer)
121 [[!table class="borders" data="""
122 Firma | Počet zaměstnanců | SCM | CI | Wiki | Issue tracking | Planning
123 Firma1 | 1 | Git | | DokuWiki | todo.txt | včera vám to uděláme
124 Firma2 | 10 000 | Git, SVN | Jenkins | Confulence | Jira | Scrum s lidskou tváří
125 Firma3 | 200 000 | Git | Jenkins | Confulence | Jira | Scrum s ďábelskou tváří
126 Firma4 | 200 | Git | Jenkins | GitLab | GitLab | káva po obědě
129 * **Každý developer, který chce pracovat v IT firmě, musí umět GIT.**
130 * Každý developer, který chce dělat něco užitečného v IT firmě, musí vědět, co je:
135 * Perfektní znalost nějakého programovacího jazyka je velkou výhodou
141 #Grafický subsystém např. v Unixu
143 vždy je dobré znát protivníka
147 - Grafické prostředí pro operační systém UNIX
148 - Začal vyvíjet institut MIT (Massachusetts Institute of Technology) v r. 1984.
149 - Označení X11 (verze 11) od r. 1987
150 - Další verze jsou označovány jako revize.
151 - Současná podoba systému oken X se principiálně nemění a nová vydání jsou rozšiřující především z pohledu způsobů implementace grafických režimů.
152 - Klient-server architektura, klient (GUI aplikace) nemusí nutně běžet na stejném stroji, jako server.
153 - Server se stará o klávesnici, myš a zobrazení grafického výstupu aplikací.
154 - Klient komunikuje se serverem pomocí socketu. Používá [X-protokol](#x-protocol).
155 - XFree86 v roce 1992 z X386, což byla implementace X serveru pro 386 architekturu.
156 - X11R6.4 restriktivnější licence ve verzi 4.4 v únoru 2004.
157 - Referenční implementací je X server vyvíjený X.Org Foundation.
163 - Wayland display server - kompozice, zatím no network transparency
165 - Android SurfaceFlinger
169 ## Správce oken (window manager)
171 Samotný X Server má na starost pouze zobrazení na obrazovku, obsluhu hardware (grafická karta, myš, klávesnice, touchpad) a sám o sobě je těžko použitelný. Proto se používá spolu se správcem oken (anglicky window manager), který se stará o ovládání uživatelem (přesun a změna velikosti okna) a podobně (horní lišta oken, ohraničení oken, změna velikosti, překrývání atp.). Z hlediska X Serveru je ovšem správce oken jen další klient, a proto je snadno zaměnitelný. Pro Linux existuje několik desítek správců oken, přičemž mezi nejznámějším patří IceWM, FVWM, Sawfish, Window Maker, Kwm, Metacity nebo Fluxbox.
173 <a name="x-protocol"/>
177 - Specifikuje způsob komunikace mezi X-Serverem a X-Klienty.
178 - Nejslavnější implementací je Xlib.
182 Používat přímo xlib by bylo poněkud těžkopádné ([[příklad| xlib-example]]), proto vzniklo mnoho knihoven, které se snaží tvorbu GUI aplikací zjednodušit. Např. GTK+, Qt, FLTK, wxWindows, HTML + DOM + JavaScript, atd.
184 #Knihovny pro desktopové aplikace
187 - GNU Network Object Model Environment
191 - Bylo potřeba něco jako Win95 pro Linux.
192 - V r. 1997 Miguel de Icaza and Federico Mena mimo jiné i kvůli problémům s Qt licencí v KDE.
193 - [[the story of the Gnome|the-gnome-story]]
198 - 1996 Matthias Ettrich, student Eberhard Karls University v Tübingen (1998 zaměstnanec TrollTech).
199 - I jemu scházelo něco jako Win95 pro Linux.
201 - Trošku jiná filosofie než Gnome, ale v podstatě to samé.
206 - Vhodná pro aplikace s nízkými HW nároky a statické linkování
210 ## wxWindows / wxWidgets
211 [wxWidgets](http://www.wxwindows.org/)
215 ## GTK+ (GIMP Toolkit)
217 - Vytvořen v roce 1997 členy skupiny eXperimental Computing Facility (XCF) Kalifornské university v Berkeley (Peter Mattis, Spencer Kimball, Josh MacDonald) pro vývoj programu GIMP (GNU Image Manipulation Program) jako náhrada knihovny Motif.
218 - Napsán objektově v jazyce C, což sebou nese řadu výhod i nevýhod.
220 - Současná verze již multiplatformní.
221 - Součást GNU projektu.
222 - Využívá jej mnoho vyšších programovacích jazyků pro snadný wrapping.
230 - Haavard Nord a Eirik Chambe-Eng (Norwegian Institute of Technology in Trondheim) začali vývoj v roce 1991, později založili firmu Trolltech [[celkem zajímavé|the-qt-story]].
231 - V r. 2009 ji koupila Nokia.
232 - V C++ => obtížnější wrapping.
233 - Od samého počátku multiplatformní (dokonce vlastni make systém).
234 - Signal/Slot koncept (implementace observer pattern).
235 - Komerční a LGPL licence (od r. 2009), dříve GPL, ještě dříve podivná QPL (1998) kvuli KDE.
236 - Snaží se doplnit C++ a libc/c++ o chybějící vlastnosti vyplývající zejména z chabého RTTI v C++
239 1. QSharedPointer, QWeakPointer, QScopedPointer - guarded pointers that are automatically set to 0 when the referenced object is destroyed, unlike normal C++ pointers which become dangling pointers when their objects are destroyed
240 1. qobject_cast - a dynamic cast that works across library boundaries
241 1. contextual string translation for internationalization
242 1. sophisticated interval driven timers that make it possible to elegantly integrate many tasks in an event-driven GUI
243 1. hierarchical and queryable object trees that organize object ownership in a natural way
244 - Implementují velké množství objektů, které se využívají při tvorbě aplikací jako kontajnery, grafické formáty, sockety, SQL konektivita, SSL, JavaScript interpreter, QML apod. **multiplatformním způsobem**.
245 - Model/View architektura.
246 - Implicitně sdílené objekty.
247 - Cenou, kterou za to platíme je MOC (Meta Object Compiler)
251 # Úspěšné postupy při tvorbě GUI aplikací
253 Ať už se rozhodnete pro jakoukoliv platformu, narazíte nakonec na stejné problémy, budete implementovat:
255 * UI design (deklarativní)
259 * navázání ovládacích prvků na jejich handlery (procedurální)
261 * update zobrazovacích prvků se změnami prezentovaných dat
264 * komunikace s aplikační vrstvou
267 * v tu ránu potřebujete serializaci-deserializaci a většinou i VARIANT
270 * tady je konečně to programování
276 - způsob (deklarativní) jakým definujeme UI
277 - poloha a atributy ovládacích prvků v oknech aplikace
278 - poměrně výrazně ovlivňuje produktivitu vývojáře
279 - kód, XML, QML, custom
281 ### Použití layout manageru
283 - Zaručuje optimální umístění a velikost widgetů při změně velikosti okna.
284 - Je přirozenější říct tlačítka jsou nalevo pod sebou, než specifikovat jejich souřadnice
287 ## Komunikace objektů
289 - objekty spolu musí komunikovat
290 - callback - dangling pointers
294 ### Signal/Slot koncept
296 - Observer pattern, výrazně redukuje boilerplate kód.
297 - Many to many relationship.
298 - Velice se hodí na řešení volání callback funkcí widgetů.
299 - dokáží multiplatformě obalit problém synchronizace window system eventů a eventů od file desriptorů (implementace není vždy ideální)
300 - Kromě toho řeší mnoho dalších problémů, zejména neexistující reference (dangling pointers).
304 ## Model-View-Controller(Delegate) architektura
306 - Odděluje data od jejich prezentace.
307 - Data jsou v aplikaci jen jednou, řeší data redundancy hell
308 - Jedny data mohpu být zobrazeny více způsoby či perspektivami.
309 - Jeden pohled lze použít pro zobrazní různých dat, pro různé modely
310 - Modely generující data, data vubec nemusí existovat, počítají se na požádání.
311 - Delegát/Controller slouží pro zobrazení/editaci dat
313 ![model-view-overview][5]
317 ## Qt Declarative QML
319 * use QML for UI design
320 * use JavaScript for UI event handling
321 * use C++ for business logic implementation
322 * looks great, but ... type erasure is developer's grave
324 [1]: X_client_sever_example.svg
325 [2]: http://cs.wikipedia.org/wiki/X_display_manager
327 [4]: abstract-connections.png
328 [5]: modelview-overview.png
329 [6]: modelview-example.svg