Orbiter refactoring - the new design

From LinuxMCE
Revision as of 09:51, 7 June 2006 by Wikiadmin (Talk | contribs)

Jump to: navigation, search
This page was written by Pluto and imported with their permission when LinuxMCE branched off in February, 2007. In general any information should apply to LinuxMCE. However, this page should be edited to reflect changes to LinuxMCE and remove old references to Pluto.
== Orbiter Renderers ==

General information

All the methods from Orbiter which have rendering functionality have been moved in OrbiterRenderer. Same for functions used to display dialogs or a progress.


Orbiter creates a custom renderer when it starts, using an OrbiterRendererFactory. Based on the graphic engine used, a specific OrbiterRenderer is created. Orbiter has a method Renderer() which gives access to renderer functionality to other classes.


PlutoGraphic class is isolated in a new h/cpp since it’s not directly related to DesignObj_Orbiter class.


From Orbiter there are derived classes with specific implementation:

- Orbiter_Win32 (which overrides SelfUpdate method - uses OrbiterSelfUpdate class to update orbiter's binary)

- OrbiterLinux (X11 stuff, XRecording, GrabPointer/GrabKeyboard, window manager)

- OrbiterBluetooth (creates a BDCommandProcessor and uses PhoneDetection to detect/connect to smartphones)

- Proxy_Orbiter (has a tcp server, communicates with apache, creates xml for cisco phone).


These changes didn't affect Orbiter’s behavior. Here's a simplified partial UML:


Orbiter Refactoring Orbiter Renderers.png


=== Orbiter creation and destruction

Here's a sequence diagram. Orbiter's framework thread should be handled by the framework. Additional threads like OpenGL's thread will be handled (created/destroyed) in OrbiterRenderer_OpenGL.

Orbiter Seq diagram.png


Object Renderers

General information

Each class derived from DesignObj_Data has an ObjectRenderer associated. The classes derived from ObjectRenderer is created using ObjectRendererFactory and can differ from engine to engine or shared between engines. We can create an AnimatedDatagridRender_OpenGL which will work only with opengl, but we can create a ClassicColoredDatagridRenderer which can be used for all engines.


The AnimatedDatagridRenderer is not implemented now, only DatagridRenderer which has the same behavior as the one we are using today. Additionally, we are using now a custom datagrid for Bluetooth_Dongle : DataGridRenderer_Bluetooth (which does extra things on overriden RenderObject method) and one for Proxy_Orbiter : DataGridRenderer_Proxy.cpp (RenderCell is overriden in order to create the xml with touch zones for datagrid's cells).


Orbiter refactor Object Renderer.png

DataGridRenderer class

DataGridRenderer class is derived from ObjectRenderer. ObjectRenderer has an owner, a DesignObj_Orbiter, which contains to deserialized data with info about that object, type, etc. In DataGridRenderer's case, the owner is a DesignObj_DataGrid.

ObjectRendererFactory creates the DataGridRenderer instance for a DesignObj_Orbiter when object's type is DESIGNOBJTYPE_Datagrid_CONST:


Orbiter Refactor ObjectRendererFactory.PNG


Here's a small UML for DataGridRenderer class:


Orbiter Refactor DataGridRenderer.png


NOTE: The datagrid renderers are passive objects. They cannot handle users input events by themselves. Another step in refactoring process will be needed in order to accomplish this.