Interno funkcioniranje modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka...

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

Transcript of Interno funkcioniranje modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka...

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

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.
Page 3: Interno funkcioniranje modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

DEMO „native“ Unity GUI-ja

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

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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

PreRender()

Render()

PostRender()

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

DEMO: DisplayObject

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

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

Konverzija koordinata: DisplayListMember:

IGlobalLocal: GlobalToLocal() LocalToGlobal()

Container: IGlobalContent:

GlobalToContent() ContentToGlobal()

ILocalContent: LocalToContent() ContentToLocal()

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

Kompozicija – Layout je child object od Containera

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

ILayout: Measure() LayoutChildren()

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

DEMO: Layout

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

IEventDispatcher AddEventListener() RemoveEventListener() DispatchEvent()

„+=“ i „-=“ notacija

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

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

ValidateProperties() => CommitProperties() ValidateSize() => UpdateSize() [bottom-up!]

ValidateLayout() => UpdateLayout() ValidatePosition() => UpdatePosition()

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

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

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 modernog GUI-ja (korisničkog sučelja) na primjeru Unity 3D GUI frameworka Autor: Danko Kozar, 17.2.2010.

Model: EventDispatcher + Singleton Primjeri: ProductModel, CartModel

View: DataList DataGrid

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

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

Happy coding!