23
Interno funkcioniranje modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Embed Size (px)

DESCRIPTION

English title: "GUI Framework Internals (Unity3d)" Pretty old presentation of GUI framework tips and tricks (made back in 2010). It describes how to build the framework on top of low-level elements that the particular platforms offers (could be applied to Javascript, Flash, Unity3d and all the platforms providing the clickable screen and moveable elements). Video recording of the presentation: https://experts.adobeconnect.com/_a204547676/p10429271/?launcher=false&fcsContent=true&pbMode=normal Unity Web player demo: http://dankokozar.com/unity/GuiGridTest.html It's all in Croatian. Sorry! :)

Citation preview

Page 1: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Interno funkcioniranje modernog GUI-ja(korisničkog sučelja)

na primjeru Unity 3D GUI frameworka

Autor: Danko Kozar, 17.2.2010.

Page 2: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka
Page 3: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Unity = mlad proizvod, mali broj korisnika Javascript, C# 2.0, Mono Skripta Attachiranje skripte (kamera...) MonoBehaviour

void Start() void Update() void OnGUI()

Style

Page 4: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

DEMO „native“ Unity GUI-ja

Page 5: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Krećete od onoga što imate (low level API) Gradite OOP „wrapper“ oko low level komponente IDrawable interface: public interface IDrawable {

/// <summary> /// Draws stuff /// </summary> void Draw(); }

Page 6: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Pozicija, dimenzije Bounds => klasa Rectangle (struct Rect) Visible, Alpha, Color Eventi: EVENT_SHOW, EVENT_HIDE Draw():

PreRender() Render() PostRender()

Page 7: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

DEMO: DisplayObject

Page 8: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Composite Singleton Intenzivno korištenje kompozicije Koristiti interfejse gdje god je moguće Invalidacija/validacija Klasa Rectangle Global, local, content (*) MVC (DataGrid + kolekcije)

Page 9: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

UiComponent klasa ima tendenciju biti ogromna (gomila funkcionalnosti je u njoj)

Razbiti UiComponent u hijerarhiju (EventDispatcher - DisplayObject – LifecycleComponent – InteractiveComponent) preglednosti radi

Prednost: testiranje svakog dijela hijerarhije nezavisno Initialize() => invalidacija(*) propertyja, veličine i

pozicije

Page 10: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Composite pattern Parent – child odnos AddChild(), RemoveChild() CreateChildren() => mjesto za kreiranje childova

unutar containera Initialize():

Parent, Stage (propagacija) invalidacija(*) layouta

Scrolling => global, local, content (*)

Page 11: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Konverzija koordinata: DisplayListMember:

IGlobalLocal:− GlobalToLocal()− LocalToGlobal()

Container: IGlobalContent:

− GlobalToContent()− ContentToGlobal()

ILocalContent:− LocalToContent()− ContentToLocal()

Page 12: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Kompozicija – Layout je child object od Containera

Prednost: zamjena Layouta on-the-fly (Flex: OpenFlux)

ILayout: Measure() LayoutChildren()

Page 13: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

DEMO: Layout

Page 14: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

IEventDispatcher AddEventListener() RemoveEventListener() DispatchEvent()

„+=“ i „-=“ notacija

Page 15: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Top-most container „Srce krvotoka“ prema child komponenatama u

hijerarhiji Update()

Late event processing Validacija komponenti

GuiStage => adapter za Stage na MonoBehaviour

GuiApplication preko GuiStage pokreće Update() metodu u svakom frameu

Page 16: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

InvalidateProperties() InvalidateSize() InvalidateLayout() InvalidatePosition()Osnovna ideja:

Odgađa akcije do instanciranja childova u CreateChildren() metodi

Agregiranje više identičnih promjena u jednu Update komponente jednom i to tik prije iscrtavanja

Page 17: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

ValidateProperties() => CommitProperties() ValidateSize() => UpdateSize() [bottom-up!] ValidateLayout() => UpdateLayout() ValidatePosition() => UpdatePosition()

Page 18: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Ako propertyji parenta utječu na childove Ideja:− Odgađa akcije do nakon instanciranja childova u

CreateChildren() metodi− Agregiranje više istih akcija u jednu− Update komponente tik prije iscrtavanja Primjer

Page 19: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

SystemManager (mouse, key) ClickManager (traži kliknutu komponentu) ComponentManager (dohvat komponente po ID-ju) FocusManager (focus & blur) TabManager (tab => promjena fokusa) EventManager (event bubbling)

Ideja: prebaciti često korištenu funkcionalnost na centralno mjesto

Singleton ili statička klasa

Page 20: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

DataGrid cell renderer => event dispatcher DataGrid => event listener GuiEvent (bubbles = true) Smanjuje broj potrebnih event listenera kod

grafičkih komponenti DEMO: DataGrid + item editor

Page 21: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

ListCollection Ispucavaju event u slučaju da:

im je kompletni sadržaj promijenjen (EVENT_COLLECTION_CHANGE)

je jedan item promijenjen (EVENT_ITEM_CHANGE) UpdateItem() Filter Sort

Page 22: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Model: EventDispatcher + Singleton Primjeri: ProductModel, CartModel

View: DataList DataGrid

IDataRenderer: object Data {get; set;} string DataField {get; set;}

Page 23: Interno funkcioniranje GUI-ja na primjeru Unity 3D GUI frameworka

Happy coding!