Skip to content

Commit

Permalink
multiple doodads cookin and talkin to one another. more logging. upda…
Browse files Browse the repository at this point in the history
…tes in line with updates to Modular fork. Sure hope the hasMapping getInstance in SwiftSuspenders is fixed to allow crawling up the chain.
  • Loading branch information
joelhooks committed May 1, 2010
1 parent 8346d1b commit ad42e53
Show file tree
Hide file tree
Showing 12 changed files with 454 additions and 4 deletions.
33 changes: 32 additions & 1 deletion src/ModularDoodads.mxml
Expand Up @@ -4,16 +4,37 @@
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:modulardoodads="robotlegs.examples.modulardoodads.*"
xmlns:logger="robotlegs.examples.modulardoodads.modules.logger.*"
width="400">
width="450" xmlns:doodad="robotlegs.examples.modulardoodads.modules.doodad.*" xmlns:view="robotlegs.examples.modulardoodads.view.*">

<fx:Script>
<![CDATA[
import mx.modules.Module;
import robotlegs.examples.modulardoodads.common.events.LoggingEvent;
import robotlegs.examples.modulardoodads.common.events.ModuleCommandTriggerEvent;
import robotlegs.examples.modulardoodads.modules.doodad.DoodadModule;
protected function logIt_clickHandler(event:Event):void
{
dispatchEvent(new LoggingEvent(LoggingEvent.MESSAGE, logText.text));
logText.text = "";
}
protected function addDoodad_clickHandler(event:MouseEvent):void
{
doodadHolder.addElement(new DoodadModule());
}
public function setFocusOnAddDoodadButton():void
{
focusManager.setFocus(addDoodad);
}
protected function triggerCommand_clickHandler(event:MouseEvent):void
{
dispatchEvent(new ModuleCommandTriggerEvent(ModuleCommandTriggerEvent.TRIGGER_MODULE_COMMAND));
}
]]>
</fx:Script>

Expand All @@ -26,6 +47,16 @@
<s:HGroup width="100%">
<s:Button id="logIt" label="LOG IT!" click="logIt_clickHandler(event)" enabled="{logText.text.length &gt;0}"/>
<s:TextInput id="logText" width="100%" enter="logIt_clickHandler(event)"/>
<s:Button id="addDoodad" label="Add a Doodad" click="addDoodad_clickHandler(event)"/>
<s:Button id="triggerCommand" label="Trigger" click="triggerCommand_clickHandler(event)"/>
</s:HGroup>
<logger:LoggerModule/>
<s:Scroller width="100%" height="100%">
<s:Group id="doodadHolder">
<s:layout>
<s:TileLayout/>
</s:layout>
</s:Group>
</s:Scroller>
<view:StatsView/>
</s:Application>
174 changes: 174 additions & 0 deletions src/net/hires/debug/Stats.as
@@ -0,0 +1,174 @@
/**
* stats.as
* http://github.com/mrdoob/stats.as
*
* Released under MIT license:
* http://www.opensource.org/licenses/mit-license.php
*
* How to use:
*
* addChild( new Stats() );
*
**/

package net.hires.debug
{
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Rectangle;
import flash.system.System;
import flash.text.StyleSheet;
import flash.text.TextField;
import flash.utils.getTimer;

public class Stats extends Sprite
{
protected const WIDTH : uint = 70;
protected const HEIGHT : uint = 100;

protected var xml : XML;

protected var text : TextField;
protected var style : StyleSheet;

protected var timer : uint;
protected var fps : uint;
protected var ms : uint;
protected var ms_prev : uint;
protected var mem : Number;
protected var mem_max : Number;

protected var graph : BitmapData;
protected var rectangle : Rectangle;

protected var fps_graph : uint;
protected var mem_graph : uint;
protected var mem_max_graph : uint;

protected var theme : Object = { bg: 0x000033, fps: 0xffff00, ms: 0x00ff00, mem: 0x00ffff, memmax: 0xff0070 };

/**
* <b>Stats</b> FPS, MS and MEM, all in one.
*
* @param _theme Example: { bg: 0x202020, fps: 0xC0C0C0, ms: 0x505050, mem: 0x707070, memmax: 0xA0A0A0 }
*/
public function Stats( _theme : Object = null ) : void
{
if (_theme)
{
if (_theme.bg != null) theme.bg = _theme.bg;
if (_theme.fps != null) theme.fps = _theme.fps;
if (_theme.ms != null) theme.ms = _theme.ms;
if (_theme.mem != null) theme.mem = _theme.mem;
if (_theme.memmax != null) theme.memmax = _theme.memmax;
}

mem_max = 0;

xml = <xml><fps>FPS:</fps><ms>MS:</ms><mem>MEM:</mem><memMax>MAX:</memMax></xml>;

style = new StyleSheet();
style.setStyle("xml", {fontSize:'9px', fontFamily:'_sans', leading:'-2px'});
style.setStyle("fps", {color: hex2css(theme.fps)});
style.setStyle("ms", {color: hex2css(theme.ms)});
style.setStyle("mem", {color: hex2css(theme.mem)});
style.setStyle("memMax", {color: hex2css(theme.memmax)});

text = new TextField();
text.width = WIDTH;
text.height = 50;
text.styleSheet = style;
text.condenseWhite = true;
text.selectable = false;
text.mouseEnabled = false;

rectangle = new Rectangle( WIDTH - 1, 0, 1, HEIGHT - 50 );

addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
addEventListener(Event.REMOVED_FROM_STAGE, destroy, false, 0, true);
}

private function init(e : Event) : void
{
graphics.beginFill(theme.bg);
graphics.drawRect(0, 0, WIDTH, HEIGHT);
graphics.endFill();

addChild(text);

graph = new BitmapData(WIDTH, HEIGHT - 50, false, theme.bg);
graphics.beginBitmapFill (graph, new Matrix (1, 0, 0, 1, 0, 50));
graphics.drawRect(0, 50, WIDTH, HEIGHT - 50);

addEventListener(MouseEvent.CLICK, onClick);
addEventListener(Event.ENTER_FRAME, update);
}

private function destroy(e : Event) : void
{
graphics.clear();

while(numChildren > 0)
removeChildAt(0);

graph.dispose();

removeEventListener(MouseEvent.CLICK, onClick);
removeEventListener(Event.ENTER_FRAME, update);
}

private function update(e : Event) : void
{
timer = getTimer();

if( timer - 1000 > ms_prev )
{
ms_prev = timer;
mem = Number((System.totalMemory * 0.000000954).toFixed(3));
mem_max = mem_max > mem ? mem_max : mem;

fps_graph = Math.min( graph.height, ( fps / stage.frameRate ) * graph.height );
mem_graph = Math.min( graph.height, Math.sqrt( Math.sqrt( mem * 5000 ) ) ) - 2;
mem_max_graph = Math.min( graph.height, Math.sqrt( Math.sqrt( mem_max * 5000 ) ) ) - 2;

graph.scroll( -1, 0 );

graph.fillRect( rectangle , theme.bg );
graph.setPixel( graph.width - 1, graph.height - fps_graph, theme.fps);
graph.setPixel( graph.width - 1, graph.height - ( ( timer - ms ) >> 1 ), theme.ms );
graph.setPixel( graph.width - 1, graph.height - mem_graph, theme.mem);
graph.setPixel( graph.width - 1, graph.height - mem_max_graph, theme.memmax);

xml.fps = "FPS: " + fps + " / " + stage.frameRate;
xml.mem = "MEM: " + mem;
xml.memMax = "MAX: " + mem_max;

fps = 0;
}

fps++;

xml.ms = "MS: " + (timer - ms);
ms = timer;

text.htmlText = xml;
}

private function onClick(e : MouseEvent) : void
{
mouseY / height > .5 ? stage.frameRate-- : stage.frameRate++;
xml.fps = "FPS: " + fps + " / " + stage.frameRate;
text.htmlText = xml;
}

// .. Utils

private function hex2css( color : int ) : String
{
return "#" + color.toString(16);
}
}
}
Expand Up @@ -5,6 +5,7 @@ package robotlegs.examples.modulardoodads
import org.robotlegs.core.IInjector;
import org.robotlegs.utilities.modular.mvcs.ModuleContext;

import robotlegs.examples.modulardoodads.modules.doodad.DoodadModule;
import robotlegs.examples.modulardoodads.modules.logger.LoggerModule;
import robotlegs.examples.modulardoodads.view.ModuleDoodadsMediator;

Expand All @@ -19,9 +20,10 @@ package robotlegs.examples.modulardoodads
{
override public function startup():void
{
//map the LoggerModule so that its instances will
//be properly injected with the injector.
//map the modules so that instances will be properly supplied (injected) with an injector.
viewMap.mapType(LoggerModule);
viewMap.mapType(DoodadModule);

mediatorMap.mapView(ModularDoodads, ModuleDoodadsMediator);
}
}
Expand Down
@@ -0,0 +1,19 @@
package robotlegs.examples.modulardoodads.common.events
{
import flash.events.Event;

public class ModuleCommandTriggerEvent extends Event
{
public static const TRIGGER_MODULE_COMMAND:String = "triggerModuleCommand";

public function ModuleCommandTriggerEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}

override public function clone():Event
{
return new ModuleCommandTriggerEvent(type,bubbles,cancelable);
}
}
}
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" implements="org.robotlegs.utilities.modular.core.IModule"
xmlns:mx="library://ns.adobe.com/flex/mx" layout="absolute" width="100" height="100">

<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.core.IVisualElementContainer;
import org.robotlegs.core.IContext;
import org.robotlegs.core.IInjector;
import org.robotlegs.utilities.modular.core.IModule;
import org.robotlegs.utilities.modular.core.IModuleContext;
import robotlegs.examples.modulardoodads.modules.doodad.events.DoodadModuleEvent;
[Bindable]
public var color:uint = 0x000000;
protected var context:IModuleContext;
/**
* We need to initialize our context by setting the parent
* injector for the module. This is actually injected by the
* shell, so no need to worry about it!
*/
[Inject]
public function set parentInjector(value:IInjector):void
{
context = new DoodadModuleContext(this,value);
}
protected function doStuff_clickHandler(event:MouseEvent):void
{
dispatchEvent(new DoodadModuleEvent(DoodadModuleEvent.DO_STUFF_REQUESTED));
}
protected function killModule_clickHandler(event:MouseEvent):void
{
dispatchEvent(new DoodadModuleEvent(DoodadModuleEvent.REMOVE));
}
public function dispose():void
{
if(parent && parent.contains(this))
IVisualElementContainer(parent).removeElement(this);
context.dispose();
context = null;
}
]]>
</fx:Script>
<s:Group width="100%" height="100%">
<s:Rect width="100%" height="100%">
<s:fill>
<s:SolidColor color="{color}"/>
</s:fill>
</s:Rect>
</s:Group>
<s:Button id="killModule" label="x" right="2" top="2" width="30" click="killModule_clickHandler(event)"/>
<s:VGroup width="100%" height="100%" verticalAlign="middle" horizontalAlign="center">
<s:Button id="doStuff" label="request" click="doStuff_clickHandler(event)"/>
</s:VGroup>
</mx:Module>
@@ -0,0 +1,22 @@
package robotlegs.examples.modulardoodads.modules.doodad
{
import org.robotlegs.mvcs.Command;
import org.robotlegs.utilities.modular.core.IModuleEventDispatcher;

import robotlegs.examples.modulardoodads.common.events.LoggingEvent;
import robotlegs.examples.modulardoodads.common.events.ModuleCommandTriggerEvent;

public class DoodadModuleCommand extends Command
{
[Inject]
public var event:ModuleCommandTriggerEvent;

[Inject]
public var moduleDispatcher:IModuleEventDispatcher;

override public function execute():void
{
moduleDispatcher.dispatchEvent(new LoggingEvent(LoggingEvent.MESSAGE, "Module Command Executed!"));
}
}
}
@@ -0,0 +1,31 @@
package robotlegs.examples.modulardoodads.modules.doodad
{
import flash.display.DisplayObjectContainer;

import org.robotlegs.core.IInjector;
import org.robotlegs.utilities.modular.mvcs.ModuleContext;

import robotlegs.examples.modulardoodads.common.events.LoggingEvent;
import robotlegs.examples.modulardoodads.common.events.ModuleCommandTriggerEvent;

public class DoodadModuleContext extends ModuleContext
{
public function DoodadModuleContext(contextView:DisplayObjectContainer, injector:IInjector)
{
super(contextView, true, injector);
}

override public function startup():void
{
mediatorMap.mapView(DoodadModule, DoodadModuleMediator);
moduleCommandMap.mapEvent(ModuleCommandTriggerEvent.TRIGGER_MODULE_COMMAND, DoodadModuleCommand);
dispatchToModules(new LoggingEvent(LoggingEvent.MESSAGE, "New Doodad Added"));
}

override public function dispose():void
{
mediatorMap.removeMediatorByView(contextView);
super.dispose();
}
}
}

0 comments on commit ad42e53

Please sign in to comment.