Search code examples
openlaszlolzx

Is it possible to have a while loop connected to the mouseover state in an OpenLaszlo app?


Is it possible to do something like this

while (view.mouseover == true) {
    preform action
}

I want to have an action repeat for as long as the mouse is over a specific view.
(asked on the laszlo-user mailing list)


Solution

  • Well, it looks like you answered your own question while I was testing my solution to make sure it worked correctly, but here is an alternative solution that works under OpenLaszlo 4.9.0 SWF10 and OpenLaszlo 4.9.0 DHTML run-times:

    <canvas width="1000" height="665" debug="true">
    
      <view id="v" bgcolor="0xcccccc" width="200" height="200">
    
        <!--- @param boolean mouseisover: true when the mouse is over -->
        <attribute name="mouseisover" type="boolean" value="false" />
    
        <!--- @keywords private -->
        <!--- @param lz.Delegate dlgt_repeat: stores the lz.Delegate object --> 
        <attribute name="dlgt_repeat" type="expression" />
    
        <!--
        Called when the 'onmouseover' event occurs
        -->
        <handler name="onmouseover">
    
          // Step 1) unregister any existing delegate 
          // mark it for garbage collection 
          // and prevent its event from triggering:
    
          if (this['dlgt_repeat'])
            this.dlgt_repeat.unregisterAll(); 
    
          // Step 2) update this.mouseisover flag:
    
          if (!this.mouseisover)
            this.setAttribute('mouseisover', true);
    
          // Step 3) create an event Delegate and call it 
          // on the next application idle event:
    
          var objDlgt = new lz.Delegate(this, 'doSomething');       
          this.setAttribute('dlgt_repeat', objDlgt);
    
          lz.Idle.callOnIdle(this.dlgt_repeat);
    
        </handler>
    
        <!--
        Called when the 'onmouseout' event occurs
        --> 
        <handler name="onmouseout">
    
          // Step 1) unregister any existing delegate 
          // mark it for garbage collection 
          // and prevent its event from triggering: 
    
          if (this['dlgt_repeat'])
            this.dlgt_repeat.unregisterAll();   
    
          // Step 2) Update this.mouseisover flag:
    
          if (this.mouseisover)
            this.setAttribute('mouseisover', false);    
    
        </handler>
    
        <!--- @keywords private -->
        <!--- 
        Called on application idle event by lz.Idle repeatedly 
        when the mouse is down.
    
        @param ??? objDummy: required for SWF9+ run-times for methods 
        called by delegates due to AS3 (ActionScript3 compiler 
        requirements). Just set default to null to make compiler 
        happy and ignore...
        -->
        <method name="doSomething" args="objDummy=null">
        <![CDATA[
    
          // Note: CDATA allows '&&' to be used in script below, 
          // alternatively omit CDATA and use '&amp;&amp;' instead
          // of '&&'
    
          // Step 1) Execute your code you want to run here:  
    
          if ($debug) Debug.debug('Do something...');
    
          // Step 2): If mouse is still over and the event 
          // delegate exists then schedule the event to be 
          // executed upon the next application idle state:
    
         if (this.mouseisover && this['dlgt_repeat'] != null)
           lz.Idle.callOnIdle(this.dlgt_repeat);
    
       ]]>
       </method>
    
        <text text="Move mouse over" />
    
      </view>
    
    </canvas>