gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/button_character_instanc...


From: Udo Giacomozzi
Subject: [Gnash-commit] gnash ChangeLog server/button_character_instanc...
Date: Wed, 07 Mar 2007 18:42:23 +0000

CVSROOT:        /cvsroot/gnash
Module name:    gnash
Changes by:     Udo Giacomozzi <udog>   07/03/07 18:42:23

Modified files:
        .              : ChangeLog 
        server         : button_character_instance.cpp 
                         button_character_instance.h 

Log message:
        correct behaviour on button state change

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.2568&r2=1.2569
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.cpp?cvsroot=gnash&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.h?cvsroot=gnash&r1=1.13&r2=1.14

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/gnash/gnash/ChangeLog,v
retrieving revision 1.2568
retrieving revision 1.2569
diff -u -b -r1.2568 -r1.2569
--- ChangeLog   7 Mar 2007 17:34:23 -0000       1.2568
+++ ChangeLog   7 Mar 2007 18:42:22 -0000       1.2569
@@ -7,6 +7,9 @@
                for unlink()
        * server/sprite_instance.cpp: Make sure clear_invalidated() is called 
          for sprites which currently have an empty DisplayList         
+       * server/button_character_instance.{h,cpp}: Implemented correct 
behaviour
+         on button state change (invalidate only when needed, restart only
+               reappeared characters)                  
 
 2007-03-06 Sandro Santilli <address@hidden>
 

Index: server/button_character_instance.cpp
===================================================================
RCS file: /cvsroot/gnash/gnash/server/button_character_instance.cpp,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- server/button_character_instance.cpp        28 Feb 2007 17:25:25 -0000      
1.30
+++ server/button_character_instance.cpp        7 Mar 2007 18:42:23 -0000       
1.31
@@ -482,11 +482,8 @@
                break;
        };
        
-       if (new_state!=m_mouse_state) {
-    set_invalidated();
-    m_mouse_state=new_state; 
-  }
     
+       set_current_state(new_state);
 
        // Button transition sounds.
        if (m_def->m_sound != NULL)
@@ -536,6 +533,7 @@
                }
        }
 
+
        // @@ eh, should just be a lookup table.
        int     c = 0;
        if (event.m_id == event_id::ROLL_OVER) c |= 
(button_action::IDLE_TO_OVER_UP);
@@ -549,7 +547,7 @@
        //OVER_DOWN_TO_IDLE = 1 << 8,
 
        // restart the characters of the new state.
-       restart_characters(c);
+       //restart_characters(c);  --> <Udo> done by set_current_state() now
 
        // From: "ActionScript - The Definiteve Guide" by Colin Moock
        // (chapter 10: Events and Event Handlers)
@@ -560,7 +558,7 @@
        // Immediately execute all events actions (don't append to
        // parent's action buffer for later execution!)
 
-       {for (unsigned int i = 0; i < m_def->m_button_actions.size(); i++)
+       for (unsigned int i = 0; i < m_def->m_button_actions.size(); i++)
        {
                if (m_def->m_button_actions[i].m_conditions & c)
                {
@@ -578,7 +576,7 @@
                                
                        }
                }
-       }}
+       }
 
        // check for built-in event handler.
        as_value method;
@@ -596,6 +594,76 @@
        // @@ TODO
 }
 
+void 
+button_character_instance::get_active_characters(std::vector<character*>& list)
+{
+       get_active_characters(list, m_mouse_state);
+}
+
+void 
+button_character_instance::get_active_characters(std::vector<character*>& list,
+  e_mouse_state state)
+{
+       list.clear();
+       
+       for (unsigned int i = 0; i < m_def->m_button_records.size(); i++)
+       {
+               button_record&  rec = m_def->m_button_records[i];
+               if (m_record_character[i] == NULL)
+               {
+                       continue;
+               }
+               if ((state == UP && rec.m_up)
+                   || (state == DOWN && rec.m_down)
+                   || (state == OVER && rec.m_over))
+               {
+                       list.push_back(m_record_character[i].get());
+               }
+       } // for button record  
+}
+
+void
+button_character_instance::set_current_state(e_mouse_state new_state)
+{
+       if (new_state == m_mouse_state)
+               return;
+               
+       // save current "display list"
+       std::vector<character*> old_list;
+       get_active_characters(old_list, m_mouse_state);
+       
+       // load new "display list" 
+       // NOTE: We don't change state yet, so that set_invalidated() can 
+       // load the current bounds first.
+       std::vector<character*> new_list;
+       get_active_characters(new_list, new_state);
+               
+       // see if the two lists differ and restart characters if needed
+       if (new_list.size() != old_list.size())
+               set_invalidated();              // something changed 
+  
+  unsigned int old_count = old_list.size();
+  unsigned int new_count = new_list.size();
+  for (unsigned int i=0; i<new_count; i++) {
+
+       bool found=false;
+       for (unsigned int j=0; j<old_count; j++) { 
+               if (new_list[i] == old_list[j]) {
+                               found=true;
+                               break; 
+                       }
+               }
+               if (!found) {
+                       // character (re-)appeared on stage -> restart!
+                       new_list[i]->restart();
+                       set_invalidated();
+               } 
+       }
+
+       // effectively change state
+       m_mouse_state=new_state;
+        
+}
 
 void
 button_character_instance::restart_characters(int condition)

Index: server/button_character_instance.h
===================================================================
RCS file: /cvsroot/gnash/gnash/server/button_character_instance.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -b -r1.13 -r1.14
--- server/button_character_instance.h  28 Feb 2007 17:25:25 -0000      1.13
+++ server/button_character_instance.h  7 Mar 2007 18:42:23 -0000       1.14
@@ -5,7 +5,7 @@
 
 // SWF buttons.  Mouse-sensitive update/display, actions, etc.
 
-/* $Id: button_character_instance.h,v 1.13 2007/02/28 17:25:25 udog Exp $ */
+/* $Id: button_character_instance.h,v 1.14 2007/03/07 18:42:23 udog Exp $ */
 
 #ifndef GNASH_BUTTON_CHARACTER_INSTANCE_H
 #define GNASH_BUTTON_CHARACTER_INSTANCE_H
@@ -77,6 +77,14 @@
 
        void    display();
 
+       void set_current_state(e_mouse_state new_state);
+       
+       /// Returns all characters that are currently visible based on the
+       /// current button state. The "_visible" property does not matter here. 
+       void get_active_characters(std::vector<character*>& list);
+       void get_active_characters(std::vector<character*>& list, e_mouse_state 
state);
+       
+
        /// Combine the flags to avoid a conditional.
        //  It would be faster with a macro.
        inline int      transition(int a, int b) const




reply via email to

[Prev in Thread] Current Thread [Next in Thread]