Tvorba grafických aplikací
Žijeme v přelomovém období
- vznikl obrovský trh z mobilními aplikacemi
- s mobilními aplikacemi přichází touch-screen, což má obrovský impakt na UI
- Windows Metro, Ubuntu Unity - snaha sjednotit UI mobilních a desktopových aplikací, za cenu kompromisů (např. absence hover akcí na touch screenu), zkuste se odhlásit ve Windows 10
- dlouho jsme měli klávesnici, myš a nepsanou dohodu o tom, jak má vypadat widget-set
Potřebujeme vůbec GUI?
Výhody/nevýhody GUI aplikací
- 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ů.
- Stačí pasivní znalost UI.
- Větší vyjadřovací schopnost, obrázek má nespornou vyjadřovací schopnost.
- Lze maximálně využít display.
- Počítačová grafika
- Většinu aplikace tvoří GUI
- Lze je používat v režimu sváteční uživatel
Výhody/nevýhody CLI aplikací
- Učící křivka je jednotkový skok
- Lze jednoduše skriptovat a automatizovat práci
- Většinu aplikace tvoří business logika
- Je třeba je používat pravidelně, jinak uživatel zapomene, jak se to vlastně psalo
CLI aplikace s GUI kabátkem
- Na desktopu ideální stav
- Asi nejvíc práce
Tvorba aplikaci
Požadavky na aplikaci
- MULTIPLATFORMNOST (MacOSX, Windows, Linux) (Android, iOS, Windows Mobile, Ubuntu Mobile, Sailfish OS - Jolla, …)
- Write once, deploy everywhere - jako developer jistě chcete svou aplikaci napsat jednou a pak ji prodávat na všech platformách
- UI adaptability
- widgetset
- layout manager
- atd. …
Některé platformy
- desktop
- Linux
- OSX
- Windows
- web
- HTML5 + frameworky (Django, Ruby on rails, NodeJS, …)
- mobile
- Android - Java
- Apple iOS - Object C
- Windows Mobile
- Ubuntu Phone - HTML5, Qt/QML
- Sailfish OS - HTML5, Qt/QML
Je pozoruhodné, kolik z těchto platforem je podporováno knihovnou Qt.
Vývojové nástroje
- IDE
- Build System (CMake, QMake, Ant, …)
- Source Code Management (Git, Mercurial, Bazaar, Darts, SVN, CVS, …)
- Issue Tracking System (Jira, BugZilla, GitLab, GitHub, Redmine, Track, …)
- Code Review (GitHub, GitLab, Gerrit, …)
- Continuous Integration CI (Jenkins, Travis, GitHub, …)
- Testing Framework
- Documentation Wiki (Confluence, IkiWiki, GitLab, GitHub, DokuWiki, <1000 skipped>, MediaWiki)
- Process Planning, Agile, Scrum, Kanban, Waterfall, (Jira, Redmine)
Firma | Počet zaměstnanců | SCM | CI | Wiki | Issue tracking | Planning |
---|---|---|---|---|---|---|
Firma1 | 1 | Git | DokuWiki | todo.txt | včera vám to uděláme | |
Firma2 | 10 000 | Git, SVN | Jenkins | Confulence | Jira | Scrum s lidskou tváří |
Firma3 | 200 000 | Git | Jenkins | Confulence | Jira | Scrum s ďábelskou tváří |
Firma4 | 200 | Git | Jenkins, Travis | GitLab | GitLab | káva po obědě |
Krátká odbočka do korporátního světa
- Každý developer, který chce pracovat v IT firmě, musí umět GIT.
- Každý developer, který chce dělat něco užitečného v IT firmě, musí vědět, co je:
- Process
- Thread + synchronization
- Mutex
- Socket
- Virtuální paměť
- Znalost nějakého programovacího jazyka je velkou výhodou
- Kvalitní developer nemusí umět mnoho programovacích jazyků, stačí 5-6, ale pořádně
Grafický subsystém např. v Unixu
vždy je dobré znát protivníka
X Window System
- Grafické prostředí pro operační systém UNIX
- Začal vyvíjet institut MIT (Massachusetts Institute of Technology) v r. 1984.
- Označení X11 (verze 11) od r. 1987
- Další verze jsou označovány jako revize.
- 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ů.
- Klient-server architektura, klient (GUI aplikace) nemusí nutně běžet na stejném stroji, jako server.
- Server se stará o klávesnici, myš a zobrazení grafického výstupu aplikací.
- Klient komunikuje se serverem pomocí socketu. Používá X-protokol.
- XFree86 v roce 1992 z X386, což byla implementace X serveru pro 386 architekturu.
- X11R6.4 restriktivnější licence ve verzi 4.4 v únoru 2004.
- Referenční implementací je X server vyvíjený X.Org Foundation.
Alternativy
- Wayland display server - kompozice, zatím no network transparency
- Apple Quartz
- Android SurfaceFlinger
- MS Windows
- atd.
Správce oken (window manager)
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.
X protokol
- Specifikuje způsob komunikace mezi X-Serverem a X-Klienty.
- Nejslavnější implementací je Xlib.
Používat přímo xlib by bylo poněkud těžkopádné (příklad), proto vzniklo mnoho knihoven, které se snaží tvorbu GUI aplikací zjednodušit. Např. GTK+, Qt, FLTK, wxWindows, HTML + DOM + JavaScript, atd.
Knihovny pro desktopové aplikace
Gnome
- GNU Network Object Model Environment
- Window manager
- Vývojová platforma
- GTK+
- Bylo potřeba něco jako Win95 pro Linux.
- V r. 1997 Miguel de Icaza and Federico Mena mimo jiné i kvůli problémům s Qt licencí v KDE.
- the story of the Gnome
KDE
- 1996 Matthias Ettrich, student Eberhard Karls University v Tübingen (1998 zaměstnanec TrollTech).
- I jemu scházelo něco jako Win95 pro Linux.
- Qt
- Trošku jiná filosofie než Gnome, ale v podstatě to samé.
FLTK
- Vhodná pro aplikace s nízkými HW nároky a statické linkování
wxWindows / wxWidgets
GTK+ (GIMP Toolkit)
- 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.
- Napsán objektově v jazyce C, což sebou nese řadu výhod i nevýhod.
- LGPL licence.
- Současná verze již multiplatformní.
- Součást GNU projektu.
- Využívá jej mnoho vyšších programovacích jazyků pro snadný wrapping.
QT
- 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 the story of Qt.
- V r. 2009 ji koupila Nokia.
- V C++ => obtížnější wrapping, ABI problemy.
- Od samého počátku multiplatformní (dokonce vlastni make systém).
- Signal/Slot koncept (implementace observer pattern).
- Komerční a LGPL licence (od r. 2009), dříve GPL, ještě dříve podivná QPL (1998) kvuli KDE.
- Snaží se doplnit C++ a libc/c++ o chybějící vlastnosti vyplývající zejména z chabého RTTI v C++
- signals and slots, across threads !!!
- object properties
- 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
- qobject_cast - a dynamic cast that works across library boundaries
- contextual string translation for internationalization
- sophisticated interval driven timers that make it possible to elegantly integrate many tasks in an event-driven GUI
- hierarchical and queryable object trees that organize object ownership in a natural way
- 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.
- Model/View architektura.
- Implicitně sdílené objekty.
Cenou, kterou za to platíme je MOC (Meta Object Compiler)
Qt 5.6 LTS (2016)
- Qt 5.7 (2016) nelze přeložit bez c++11
- c++11 mala revoluce, move semantics, perfect forwarding, lambda functions, auto keyword, multi threading => část Qt kódu je součástí c++. Např. stl containers + movable objects jsou mnohem efektivnější než Qt containers (QList)
Úspěšné postupy při tvorbě GUI aplikací
Ať už se rozhodnete pro jakoukoliv platformu, narazíte nakonec na stejné problémy, budete implementovat:
- Prezentační vrstvu
- UI design (deklarativní)
- XML
- QML
- kód
- navázání ovládacích prvků na jejich handlery (procedurální)
- SIGNAL/SLOT
- update zobrazovacích prvků se změnami prezentovaných dat
- SIGNAL/SLOT
- MVC
- komunikace s aplikační vrstvou
- SIGNAL/SLOT
- RPC
- v tu ránu potřebujete serializaci-deserializaci a většinou i VARIANT
- UI design (deklarativní)
- Aplikační vrstvu
- Business logika
- tady je konečně to programování
- Persistence dat
- velmi často SQL
- Business logika
UI design
- způsob (deklarativní) jakým definujeme UI
- poloha a atributy ovládacích prvků v oknech aplikace
- poměrně výrazně ovlivňuje produktivitu vývojáře
- kód, XML, QML, custom
Použití layout manageru
- Zaručuje optimální umístění a velikost widgetů při změně velikosti okna.
- Je přirozenější říct tlačítka jsou nalevo pod sebou, než specifikovat jejich souřadnice
Komunikace objektů
- objekty spolu musí komunikovat
- callback - dangling pointers
- inner classes Java
- SIGNAL/SLOT
Signal/Slot koncept
- Observer pattern, výrazně redukuje boilerplate kód.
- Many to many relationship.
- Velice se hodí na řešení volání callback funkcí widgetů.
- dokáží multiplatformě obalit problém synchronizace window system eventů a eventů od file desriptorů (implementace není vždy ideální)
- Kromě toho řeší mnoho dalších problémů, zejména neexistující reference (dangling pointers).
QVariant
QVariant může být každý objekt, který má
- public implicit constructor
- public copy constructor
- public destructor
Model-View-Controller(Delegate) architektura
- Odděluje data od jejich prezentace.
- Data jsou v aplikaci jen jednou, řeší data redundancy hell
- Jedny data mohpu být zobrazeny více způsoby či perspektivami.
- Jeden pohled lze použít pro zobrazní různých dat, pro různé modely
- Modely generující data, data vubec nemusí existovat, počítají se na požádání.
- Delegát/Controller slouží pro zobrazení/editaci dat
Qt Declarative QML
- use QML for UI design
- use JavaScript for UI event handling
- use C++ for business logic implementation
- looks great, but … type erasure is developer’s grave