[Avida-cvs] [Avida2-svn] r349 - trunk/source/python/AvidaGui2

kaben@myxo.css.msu.edu kaben at myxo.css.msu.edu
Tue Oct 18 12:34:41 PDT 2005


Author: kaben
Date: 2005-10-18 15:11:59 -0400 (Tue, 18 Oct 2005)
New Revision: 349

Modified:
   trunk/source/python/AvidaGui2/_Custom_Widgets.cw
   trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py
   trunk/source/python/AvidaGui2/pyFreezerCtrl.py
   trunk/source/python/AvidaGui2/pyFreezerView.ui
   trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py
   trunk/source/python/AvidaGui2/pyHardwareTracer.py
   trunk/source/python/AvidaGui2/pyMapProfile.py
   trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
   trunk/source/python/AvidaGui2/pyOneOrganismCtrl.py
   trunk/source/python/AvidaGui2/pyOneOrganismView.ui
   trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py
   trunk/source/python/AvidaGui2/pyOnePopulationCtrl.py
   trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py
   trunk/source/python/AvidaGui2/pyOrganismScopeView.py
   trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py
   trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
   trunk/source/python/AvidaGui2/pySessionCtrl.py
   trunk/source/python/AvidaGui2/pyTemporaryReloads.py
Log:

Repairs restoring lost Avida-ED functionality.



Modified: trunk/source/python/AvidaGui2/_Custom_Widgets.cw
===================================================================
--- trunk/source/python/AvidaGui2/_Custom_Widgets.cw	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/_Custom_Widgets.cw	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,7 +1,7 @@
 <!DOCTYPE CW><CW>
 <customwidgets>
     <customwidget>
-        <class>pyFreezerCtrl</class>
+        <class>pyPetriDishCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -9,22 +9,54 @@
         </sizehint>
         <container>0</container>
         <sizepolicy>
-            <hordata>3</hordata>
-            <verdata>3</verdata>
+            <hordata>0</hordata>
+            <verdata>0</verdata>
         </sizepolicy>
         <pixmap>
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyFreezerView</property>
+        <property type="1">pyPetriDishCtrl</property>
         <property type="3">-1</property>
-        <property type="1">pyFreezerView</property>
+        <property type="1">pyPetriDishCtrl</property>
         <property type="3">-1</property>
-        <property type="pyFreezerView"></property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="4">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="4">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyPetriDishCtrl</property>
+        <property type="0">-1</property>
+        <property type="pyPetriDishCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyNavBarCtrl</class>
+        <class>pyGradientScaleCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -32,22 +64,54 @@
         </sizehint>
         <container>0</container>
         <sizepolicy>
-            <hordata>3</hordata>
-            <verdata>3</verdata>
+            <hordata>0</hordata>
+            <verdata>0</verdata>
         </sizepolicy>
         <pixmap>
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyNavBarView</property>
+        <property type="1">pyGradientScaleCtrl</property>
         <property type="3">-1</property>
-        <property type="1">pyNavBarView</property>
+        <property type="1">pyGradientScaleCtrl</property>
         <property type="3">-1</property>
-        <property type="pyNavBarView"></property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="4">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="4">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyGradientScaleCtrl</property>
+        <property type="0">-1</property>
+        <property type="pyGradientScaleCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyOneAnalyzeCtrl</class>
+        <class>pyLiveControlsCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -55,18 +119,70 @@
         </sizehint>
         <container>0</container>
         <sizepolicy>
-            <hordata>3</hordata>
-            <verdata>3</verdata>
+            <hordata>0</hordata>
+            <verdata>0</verdata>
         </sizepolicy>
         <pixmap>
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyOneAnalyzeCtrl</property>
+        <property type="1">pyLiveControlsCtrl</property>
         <property type="3">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="3">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="4">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="4">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="1">pyLiveControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="pyLiveControlsCtrl"></property>
+        <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyTwoAnalyzeCtrl</class>
+        <class>pyPetriConfigureCtrl</class>
+        <header location="local">mywidget.h</header>
+        <sizehint>
+            <width>202</width>
+            <height>202</height>
+        </sizehint>
+        <container>0</container>
+        <sizepolicy>
+            <hordata>5</hordata>
+            <verdata>5</verdata>
+        </sizepolicy>
+        <pixmap>
+            <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
+        </pixmap>
+    </customwidget>
+    <customwidget>
+        <class>pyAnalyzeControlsCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -74,6 +190,63 @@
         </sizehint>
         <container>0</container>
         <sizepolicy>
+            <hordata>0</hordata>
+            <verdata>0</verdata>
+        </sizepolicy>
+        <pixmap>
+            <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
+        </pixmap>
+        <property type="0">3</property>
+        <property type="1">pyAnalyzeControlsCtrl</property>
+        <property type="3">-1</property>
+        <property type="1">pyAnalyzeControlsCtrl</property>
+        <property type="3">-1</property>
+        <property type="1">pyAnalyzeControlsCtrl</property>
+        <property type="0">-1</property>
+        <property type="pyAnalyzeControlsCtrl"></property>
+        <property type="-1">1</property>
+    </customwidget>
+    <customwidget>
+        <class>pyOrganismScopeCtrl</class>
+        <header location="local">1</header>
+        <sizehint>
+            <width>-1</width>
+            <height>-1</height>
+        </sizehint>
+        <container>0</container>
+        <sizepolicy>
+            <hordata>5</hordata>
+            <verdata>5</verdata>
+        </sizepolicy>
+        <pixmap>
+            <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
+        </pixmap>
+    </customwidget>
+    <customwidget>
+        <class>pyOneOrg_ScopeCtrl</class>
+        <header location="local">1</header>
+        <sizehint>
+            <width>-1</width>
+            <height>-1</height>
+        </sizehint>
+        <container>0</container>
+        <sizepolicy>
+            <hordata>5</hordata>
+            <verdata>5</verdata>
+        </sizepolicy>
+        <pixmap>
+            <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
+        </pixmap>
+    </customwidget>
+    <customwidget>
+        <class>pyFreezerCtrl</class>
+        <header location="global">1</header>
+        <sizehint>
+            <width>-1</width>
+            <height>0</height>
+        </sizehint>
+        <container>0</container>
+        <sizepolicy>
             <hordata>3</hordata>
             <verdata>3</verdata>
         </sizepolicy>
@@ -81,11 +254,15 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyTwoAnalyzeCtrl</property>
+        <property type="1">pyFreezerView</property>
         <property type="3">-1</property>
+        <property type="1">pyFreezerView</property>
+        <property type="3">-1</property>
+        <property type="pyFreezerView"></property>
+        <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyOneOrganismCtrl</class>
+        <class>pyNavBarCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -100,11 +277,15 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyOneOrganismCtrl</property>
+        <property type="1">pyNavBarView</property>
         <property type="3">-1</property>
+        <property type="1">pyNavBarView</property>
+        <property type="3">-1</property>
+        <property type="pyNavBarView"></property>
+        <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyTwoOrganismCtrl</class>
+        <class>pyOneAnalyzeCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -119,11 +300,11 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyTwoOrganismCtrl</property>
+        <property type="1">pyOneAnalyzeCtrl</property>
         <property type="3">-1</property>
     </customwidget>
     <customwidget>
-        <class>pyOnePopulationCtrl</class>
+        <class>pyTwoAnalyzeCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -138,11 +319,11 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyOnePopulationCtrl</property>
+        <property type="1">pyTwoAnalyzeCtrl</property>
         <property type="3">-1</property>
     </customwidget>
     <customwidget>
-        <class>pyTwoPopulationCtrl</class>
+        <class>pyOneOrganismCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -157,11 +338,11 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyTwoPopulationCtrl</property>
+        <property type="1">pyOneOrganismCtrl</property>
         <property type="3">-1</property>
     </customwidget>
     <customwidget>
-        <class>pyPetriDishCtrl</class>
+        <class>pyTwoOrganismCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -176,15 +357,11 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyPetriDishCtrl</property>
+        <property type="1">pyTwoOrganismCtrl</property>
         <property type="3">-1</property>
-        <property type="1">pyPetriDishCtrl</property>
-        <property type="3">-1</property>
-        <property type="pyPetriDishCtrl"></property>
-        <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyOrgSquareCtrl</class>
+        <class>pyOnePopulationCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -199,15 +376,11 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyOrgSquareCtrl</property>
+        <property type="1">pyOnePopulationCtrl</property>
         <property type="3">-1</property>
-        <property type="1">pyOrgSquareCtrl</property>
-        <property type="3">-1</property>
-        <property type="pyOrgSquareCtrl"></property>
-        <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyTimelineCtrl</class>
+        <class>pyTwoPopulationCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -222,15 +395,11 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyTimelineCtrl</property>
+        <property type="1">pyTwoPopulationCtrl</property>
         <property type="3">-1</property>
-        <property type="1">pyTimelineCtrl</property>
-        <property type="3">-1</property>
-        <property type="pyTimelineCtrl"></property>
-        <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyGradientScaleCtrl</class>
+        <class>pyOrgSquareCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -245,15 +414,15 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyGradientScaleCtrl</property>
+        <property type="1">pyOrgSquareCtrl</property>
         <property type="3">-1</property>
-        <property type="1">pyGradientScaleCtrl</property>
+        <property type="1">pyOrgSquareCtrl</property>
         <property type="3">-1</property>
-        <property type="pyGradientScaleCtrl"></property>
+        <property type="pyOrgSquareCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
     <customwidget>
-        <class>pyLiveControlsCtrl</class>
+        <class>pyTimelineCtrl</class>
         <header location="global">1</header>
         <sizehint>
             <width>-1</width>
@@ -268,11 +437,11 @@
             <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d032!
 6df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df21!
 8e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454!
 e44ae426
082</data>
         </pixmap>
         <property type="0">3</property>
-        <property type="1">pyLiveControlsCtrl</property>
+        <property type="1">pyTimelineCtrl</property>
         <property type="3">-1</property>
-        <property type="1">pyLiveControlsCtrl</property>
+        <property type="1">pyTimelineCtrl</property>
         <property type="3">-1</property>
-        <property type="pyLiveControlsCtrl"></property>
+        <property type="pyTimelineCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
     <customwidget>
@@ -471,7 +640,7 @@
         </pixmap>
     </customwidget>
     <customwidget>
-        <class>pyAnalyzeControlsCtrl</class>
+        <class>pyTwoOrg_VivisectionCtrl</class>
         <header location="local"></header>
         <sizehint>
             <width>-1</width>
@@ -487,7 +656,7 @@
         </pixmap>
     </customwidget>
     <customwidget>
-        <class>pyTwoOrg_VivisectionCtrl</class>
+        <class>pyOneAna_GraphCtrl</class>
         <header location="local"></header>
         <sizehint>
             <width>-1</width>
@@ -503,7 +672,7 @@
         </pixmap>
     </customwidget>
     <customwidget>
-        <class>pyOneAna_GraphCtrl</class>
+        <class>pyOneAna_PetriDishCtrl</class>
         <header location="local"></header>
         <sizehint>
             <width>-1</width>
@@ -519,7 +688,7 @@
         </pixmap>
     </customwidget>
     <customwidget>
-        <class>pyOneAna_PetriDishCtrl</class>
+        <class>pyOneAna_StatsCtrl</class>
         <header location="local"></header>
         <sizehint>
             <width>-1</width>
@@ -535,7 +704,7 @@
         </pixmap>
     </customwidget>
     <customwidget>
-        <class>pyOneAna_StatsCtrl</class>
+        <class>pyOneAna_TimelineCtrl</class>
         <header location="local"></header>
         <sizehint>
             <width>-1</width>
@@ -551,7 +720,7 @@
         </pixmap>
     </customwidget>
     <customwidget>
-        <class>pyOneAna_TimelineCtrl</class>
+        <class>pyOrganismConfigureCtrl</class>
         <header location="local"></header>
         <sizehint>
             <width>-1</width>

Modified: trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyEduWorkspaceCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -98,6 +98,11 @@
     self.connect(self.controlRepopulateAction,SIGNAL("activated()"),
       self.RepopulateActionSlot)
 
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("addStatusBarWidgetSig"), self.addStatusBarWidgetSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("removeStatusBarWidgetSig"), self.removeStatusBarWidgetSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("statusBarMessageSig"), self.statusBarMessageSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("statusBarClearSig"), self.statusBarClearSlot)
+
     self.m_nav_bar_ctrl.m_one_population_cli.setState(QCheckListItem.On)
     self.m_widget_stack.raiseWidget(self.m_one_population_ctrl)
     self.splitter1.setSizes([100])
@@ -130,7 +135,6 @@
     self.emit(PYSIGNAL("quitAvidaPhaseISig"), ())
     return False
 
-######### pyuic-one-time-generated-code lives below this line.
 
   def __del__(self):
     print "pyEduWorkspaceCtrl.__del__(): Not implemented yet"
@@ -317,3 +321,14 @@
       PYSIGNAL("freezerItemDoubleClicked"), (file_name, ))
 
 
+  def addStatusBarWidgetSlot(self, *args):
+    widget = args[0]
+    pt = QPoint()
+    widget.reparent(self, pt)
+    apply(QStatusBar.addWidget,(self.statusBar(),) + args)
+  def removeStatusBarWidgetSlot(self, *args):
+    apply(QStatusBar.removeWidget,(self.statusBar(),) + args)
+  def statusBarMessageSlot(self, *args):
+    apply(QStatusBar.message,(self.statusBar(),) + args)
+  def statusBarClearSlot(self):
+    self.statusBar().clear()

Modified: trunk/source/python/AvidaGui2/pyFreezerCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyFreezerCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyFreezerCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,17 +1,125 @@
 # -*- coding: utf-8 -*-
 
+from descr import *
+
 import os
 from qt import *
-from pyFreezerView import pyFreezerView
+from pyFreezerView import *
 from pyReadFreezer import pyReadFreezer
 from pyWriteToFreezer import pyWriteToFreezer
 from pyFreezeOrganismCtrl import pyFreezeOrganismCtrl
 import os.path
 
-class pyFreezerCtrl(pyFreezerView):
+class pyFreezerListView(QListView):
+  def __init__(self, *args):
+    descr()
+    apply(QListView.__init__,(self,) + args)
+    self.setAcceptDrops( True )
+    self.viewport().setAcceptDrops( True )
+  def construct(self, session_mdl):
+    descr()
+    self.m_session_mdl = session_mdl
 
+  def contentsDropEvent(self, e):
+    descr(e)
+    freezer_item_name = QString()
+    if e.source() is self:
+      return
+    if ( QTextDrag.decode( e, freezer_item_name ) ) : #freezer_item_name is a string...the file name 
+      if freezer_item_name[:9] == 'organism.':
+        freezer_item_name = freezer_item_name[9:] 
+        self.FreezeOrganismSlot(freezer_item_name)
+      else:
+        print "that was not an organism"      
+    
+  def FreezeOrganismSlot(self, freezer_item_name, send_reset_signal = False, send_quit_signal = False):
+    tmp_dict = {1:freezer_item_name}
+    pop_up_organism_file_name = pyFreezeOrganismCtrl()
+    file_name = pop_up_organism_file_name.showDialog(self.m_session_mdl.m_current_freezer)
+
+    file_name_len = len(file_name.rstrip())
+    if (file_name_len > 0):
+      freezer_file = pyWriteToFreezer(tmp_dict, file_name)
+    
+    self.m_session_mdl.m_session_mdtr.emit(
+      PYSIGNAL("doRefreshFreezerInventorySig"), ())
+
+class pyEmptyDishListViewItem(QListViewItem):
+  def __init__(self, *args):
+    apply(QListViewItem.__init__,(self,) + args)
+    descr()
+  def dragEntered(self):
+    descr()
+  def dragLeft(self):
+    descr()
+  def dropped(self, e):
+    descr(e)
+
+class pyFullDishListViewItem(QListViewItem):
+  def __init__(self, *args):
+    apply(QListViewItem.__init__,(self,) + args)
+    descr()
+  def dragEntered(self):
+    descr()
+  def dragLeft(self):
+    descr()
+  def dropped(self, e):
+    descr(e)
+
+class pyOrganismListViewItem(QListViewItem):
+  def __init__(self, *args):
+    apply(QListViewItem.__init__,(self,) + args)
+    descr()
+  def dragEntered(self):
+    self.setDropEnabled(True)
+    descr()
+  def dragLeft(self):
+    descr()
+  def dropped(self, e):
+    descr(e)
+
+#class pyFreezerCtrl(pyFreezerView):
+class pyFreezerCtrl(QWidget):
+
   def __init__(self,parent = None,name = None,fl = 0):
-    pyFreezerView.__init__(self,parent,name,fl)
+    QWidget.__init__(self,parent,name,fl)
+
+    self.image0 = QPixmap()
+    self.image0.loadFromData(image0_data,"PNG")
+    self.image1 = QPixmap()
+    self.image1.loadFromData(image1_data,"PNG")
+    self.image2 = QPixmap()
+    self.image2.loadFromData(image2_data,"PNG")
+    if not name:
+        self.setName("pyFreezerView")
+
+    self.setSizePolicy(QSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred,0,0,self.sizePolicy().hasHeightForWidth()))
+
+    pyFreezerViewLayout = QVBoxLayout(self,0,6,"pyFreezerViewLayout")
+
+    self.m_list_view = pyFreezerListView(self,"m_list_view")
+    self.m_list_view.addColumn("Freezer")
+    self.m_list_view.header().setClickEnabled(0,self.m_list_view.header().count() - 1)
+    self.m_list_view.header().setResizeEnabled(0,self.m_list_view.header().count() - 1)
+    self.m_list_view.setSizePolicy(QSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred,0,0,self.m_list_view.sizePolicy().hasHeightForWidth()))
+    m_list_view_font = QFont(self.m_list_view.font())
+    m_list_view_font.setPointSize(9)
+    self.m_list_view.setFont(m_list_view_font)
+    self.m_list_view.setAcceptDrops(1)
+    self.m_list_view.setFrameShape(QListView.StyledPanel)
+    self.m_list_view.setFrameShadow(QListView.Sunken)
+    self.m_list_view.setHScrollBarMode(QListView.AlwaysOff)
+    self.m_list_view.setAllColumnsShowFocus(1)
+    self.m_list_view.setRootIsDecorated(1)
+    self.m_list_view.setResizeMode(QListView.AllColumns)
+    pyFreezerViewLayout.addWidget(self.m_list_view)
+
+    self.languageChange()
+
+    self.resize(QSize(232,383).expandedTo(self.minimumSizeHint()))
+    self.clearWState(Qt.WState_Polished)
+
+    #pyFreezerView.__init__(self,parent,name,fl)
     self.m_list_view.setSelectionMode(QListView.Extended)
     self.connect(self.m_list_view, 
       SIGNAL("doubleClicked(QListViewItem*, const QPoint &, int)"),
@@ -19,30 +127,57 @@
     self.connect(self.m_list_view, 
       SIGNAL("pressed(QListViewItem*, const QPoint &, int )"),
       self.pressed_itemSlot)
+    self.setAcceptDrops(1)
+    descr()
 
+  # This shadows pyFreezerView.languageChange, which was generated by
+  # pyuic from pyFreezerView.ui. @kgn
+  def languageChange(self):
+    self.setCaption("pyFreezerView")
+    self.m_list_view.header().setLabel(0,"Freezer")
+    self.m_list_view.clear()
+    item = pyEmptyDishListViewItem(self.m_list_view,None)
+    item.setText(0," Empty Petri Dishes")
+    item.setPixmap(0,self.image0)
+
+    item = pyFullDishListViewItem(self.m_list_view,item)
+    item.setText(0," Full Petri Dishes")
+    item.setPixmap(0,self.image1)
+
+    item = pyOrganismListViewItem(self.m_list_view,item)
+    item.setText(0," Organisms")
+    item.setPixmap(0,self.image2)
+
   def construct(self, session_mdl):
+    descr()
     self.m_session_mdl = session_mdl
+    self.m_list_view.construct(session_mdl)
     self.connect(self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("doRefreshFreezerInventorySig"),
       self.createFreezerIndexSlot)
     self.createFreezerIndexSlot()
+    self.m_list_view.setAcceptDrops(True)
+    self.m_empty_item.setDropEnabled(True)
+    self.m_full_item.setDropEnabled(True)
+    self.m_organism_item.setDropEnabled(True)
 
 
   def createFreezerIndexSlot(self):
-    empty_item = self.m_list_view.firstChild()
-    while empty_item.firstChild():
-      tmp_child = empty_item.firstChild()
-      empty_item.takeItem(tmp_child)
+    descr()
+    self.m_empty_item = self.m_list_view.firstChild()
+    while self.m_empty_item.firstChild():
+      tmp_child = self.m_empty_item.firstChild()
+      self.m_empty_item.takeItem(tmp_child)
       del (tmp_child)
-    full_item = empty_item.nextSibling()
-    while full_item.firstChild():
-      tmp_child = full_item.firstChild()
-      full_item.takeItem(tmp_child)
+    self.m_full_item = self.m_empty_item.nextSibling()
+    while self.m_full_item.firstChild():
+      tmp_child = self.m_full_item.firstChild()
+      self.m_full_item.takeItem(tmp_child)
       del (tmp_child)
-    organism_item = full_item.nextSibling()
-    while organism_item.firstChild():
-      tmp_child = organism_item.firstChild()
-      organism_item.takeItem(tmp_child)
+    self.m_organism_item = self.m_full_item.nextSibling()
+    while self.m_organism_item.firstChild():
+      tmp_child = self.m_organism_item.firstChild()
+      self.m_organism_item.takeItem(tmp_child)
       del (tmp_child)
     if os.path.exists(self.m_session_mdl.m_current_freezer) == False:
       os.mkdir(self.m_session_mdl.m_current_freezer)
@@ -50,15 +185,15 @@
     for file in freezer_dir:
       if file.endswith(".empty"):
         dish_name = file[:-6]
-        tmp_item = QListViewItem(empty_item)
+        tmp_item = QListViewItem(self.m_empty_item)
         tmp_item.setText(0,dish_name)
       if file.endswith(".full"):
         dish_name = file[:-5]
-        tmp_item = QListViewItem(full_item)
+        tmp_item = QListViewItem(self.m_full_item)
         tmp_item.setText(0,dish_name)
       if file.endswith(".organism"):
         organism_name = file[:-9]
-        tmp_item = QListViewItem(organism_item)
+        tmp_item = QListViewItem(self.m_organism_item)
         tmp_item.setText(0,organism_name)
 
   # if mouse is pressed on list item prepare its info to be dragged        
@@ -117,10 +252,26 @@
 
   class itemDrag(QTextDrag):
     def __init__(self, item_name, parent=None, name=None):
-        QStoredDrag.__init__(self, 'item name (QString)', parent, name)
-        self.setText(item_name)
+      QStoredDrag.__init__(self, 'item name (QString)', parent, name)
+      self.setText(item_name)
+      descr(item_name)
 
+  def dragMoveEvent( self, e ):
+    descr(e)
+
+  def dragEnterEvent( self, e ):
+    descr(e)
+    e.acceptAction(True)
+    if e.isAccepted():
+      descr("isAccepted.")
+    else:
+      descr("not isAccepted.")
+
+  def dragLeaveEvent( self, e ):
+    descr(e)
+
   def dropEvent( self, e):
+    descr(e)
     freezer_item_name = QString()
     if e.source() is self:
       return
@@ -131,11 +282,10 @@
       else:
         print "that was not an organism"      
     
-  def FreezeOrganismSlot(self, freezer_item_name, 
-      send_reset_signal = False, send_quit_signal = False):
+  def FreezeOrganismSlot(self, freezer_item_name, send_reset_signal = False, send_quit_signal = False):
     tmp_dict = {1:freezer_item_name}
-    m_pop_up_organism_file_name = pyFreezeOrganismCtrl()
-    file_name = m_pop_up_organism_file_name.showDialog(self.m_session_mdl.m_current_freezer)
+    pop_up_organism_file_name = pyFreezeOrganismCtrl()
+    file_name = pop_up_organism_file_name.showDialog(self.m_session_mdl.m_current_freezer)
 
     file_name_len = len(file_name.rstrip())
     if (file_name_len > 0):

Modified: trunk/source/python/AvidaGui2/pyFreezerView.ui
===================================================================
--- trunk/source/python/AvidaGui2/pyFreezerView.ui	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyFreezerView.ui	2005-10-18 19:11:59 UTC (rev 349)
@@ -83,7 +83,7 @@
                 </font>
             </property>
             <property name="acceptDrops">
-                <bool>false</bool>
+                <bool>true</bool>
             </property>
             <property name="frameShape">
                 <enum>StyledPanel</enum>

Modified: trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py
===================================================================
--- trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,11 +1,25 @@
 from AvidaCore import cHardwareDefs
 from AvidaCore import cHardwareCPUDefs
+from AvidaCore import cHardwareCPU
 
+#class pyHardwareCPUFrame:
+#  def __init__(self):
+#    pass
+#    # cCPUMemory memory : cCPUMemory & GetMemory()
+#    # cCPUStack global_stack : cCPUStack pyGetGlobalStack()
+#    # int thread_time_used : int pyGetThreadTimeUsed()
+#    ### assume a single thread
+#    # cHardwareCPU_Thread thread : tArray<cHardwareCPU_Thread> pyGetThreads()
+#    # bool mal_active : bool GetMalActive()
+#    # bool advance_ip : bool pyGetAdvanceIP()
+
 class pyHardwareCPUTrace:
   def __init__(self):
     self.clearFrames()
 
   def clearFrames(self):
+    self.m_hardware_snapshots = []
+
     self.m_genome_info = []
     self.m_ihead_info = []
     self.m_rhead_info = []
@@ -28,7 +42,18 @@
     self.m_fitness = None
     self.m_size = None
 
+  def getSnapshotCount(self):
+    return len(self.m_hardware_snapshots)
+  def getHardwareSnapshotAt(self, frame_number):
+    return self.m_hardware_snapshots[frame_number]
+  def getMemorySnapshotAt(self, frame_number):
+    return self.getHardwareSnapshotAt(frame_number).GetMemory()
+  def getThreadsSnapshotAt(self, frame_number):
+    return self.getHardwareSnapshotAt(frame_number).pyGetThreads()
+
   def recordFrame(self, hardware):
+    self.m_hardware_snapshots.append(cHardwareCPU(hardware))
+
     self.m_genome_info.append(hardware.GetMemory().AsString().GetData())
     self.m_ihead_info.append(hardware.GetHead(cHardwareDefs.s_HEAD_IP).GetPosition())
     self.m_rhead_info.append(hardware.GetHead(cHardwareDefs.s_HEAD_READ).GetPosition())

Modified: trunk/source/python/AvidaGui2/pyHardwareTracer.py
===================================================================
--- trunk/source/python/AvidaGui2/pyHardwareTracer.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyHardwareTracer.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -5,35 +5,55 @@
 
 class pyHardwareTracer(pyHardwareTracerBase):
 
+  def __init__(self, progress_callback = None):
+    pyHardwareTracerBase.__init__(self)
+    self.m_progress_callback = progress_callback
+
   def TraceHardware_CPU(self, hardware):
     self.m_hardware_trace.recordFrame(hardware)
+    if self.m_progress_callback is not None:
+      self.m_trace_progress = self.m_trace_progress + 1
+      self.m_progress_callback(self.m_trace_progress)
 
   def TraceHardware_CPUBonus(self, hardware):
     self.m_hardware_trace.recordFrame(hardware)
+    if self.m_progress_callback is not None:
+      self.m_trace_progress = self.m_trace_progress + 1
+      self.m_progress_callback(self.m_trace_progress)
 
-  def backupTestCPU(self, environment):
-    backup_environment = cTestCPU.GetEnvironment()
-    original_resource_count = cTestCPU.GetResourceCount()
-    backup_usage = cTestCPU.GetUseResources()
+  # XXX Changes to Avida core have broken the next two functions, and
+  # now isn't a good time to fix them. @kgn
+  #
+  #def backupTestCPU(self, environment):
+  #  print "pyHardwareTracer.backupTestCPU()..."
+  #  backup_environment = cTestCPU.GetEnvironment()
+  #  original_resource_count = cTestCPU.GetResourceCount()
+  #  backup_usage = cTestCPU.GetUseResources()
 
-    cTestCPU.SetEnvironment(environment)
-    cTestCPU.SetupResources()
-    cTestCPU.SetUseResources(True)
+  #  cTestCPU.SetEnvironment(environment)
+  #  cTestCPU.SetupResources()
+  #  cTestCPU.SetUseResources(True)
 
-    return backup_environment, original_resource_count, backup_usage
+  #  return backup_environment, original_resource_count, backup_usage
 
-  def restoreTestCPU(self, backup_environment, original_resource_count, backup_usage):
-    cTestCPU.SetEnvironment(backup_environment)
-    cTestCPU.GetResourceCount().SetTo(original_resource_count)
-    cTestCPU.SetUseResources(True)
+  #def restoreTestCPU(self, backup_environment, original_resource_count, backup_usage):
+  #  cTestCPU.SetEnvironment(backup_environment)
+  #  cTestCPU.GetResourceCount().SetTo(original_resource_count)
+  #  cTestCPU.SetUseResources(True)
 
   def traceAnalyzeGenotype(self, analyze_genotype, environment, should_use_resources):
+    print "pyHardwareTracer.traceAnalyzeGenotype()..."
     backup_environment = None
     original_resource_count = None
     backup_usage = None
+
     # Backup test cpu if we need to use resources.
+    #if should_use_resources:
+    #  backup_environment, original_resource_count, backup_usage = self.backupTestCPU(environment)
     if should_use_resources:
-      backup_environment, original_resource_count, backup_usage = self.backupTestCPU(environment)
+      print " *** Warning in pyHardwareTracer.traceAnalyzeGenotype():"
+      print " *** traceAnalyzeGenotype called with should_use_resources = True,"
+      print " *** but resources in the python test-cpu are disabled for now."
 
     # Build the test info for tracing hardware.
     test_info = cCPUTestInfo()
@@ -42,10 +62,11 @@
     self.m_hardware_trace = pyHardwareCPUTrace()
     test_info.SetTraceExecution(self)
     # Trace the genotype's execution.
+    self.m_trace_progress = 0
     cTestCPU.TestGenome(test_info, analyze_genotype.GetGenome())
     # Record some of the genotype's statistics.
     analyze_genotype.Recalculate()
     self.m_hardware_trace.recordGenotypeSummary(analyze_genotype)
 
     # Restore test cpu if we need to use resources.
-    if should_use_resources: self.restoreTestCPU(backup_environment, original_resource_count, backup_usage)
+    #if should_use_resources: self.restoreTestCPU(backup_environment, original_resource_count, backup_usage)

Modified: trunk/source/python/AvidaGui2/pyMapProfile.py
===================================================================
--- trunk/source/python/AvidaGui2/pyMapProfile.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyMapProfile.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,4 +1,6 @@
 
+from descr import *
+
 from qt import PYSIGNAL, QColor, QObject, Qt
 from math import exp
 
@@ -46,16 +48,21 @@
         self.m_should_reset = True
 
       def reset(self, should_reset):
+        #descr(should_reset)
         self.m_should_reset = should_reset
 
       def shouldReset(self):
+        #descr()
         return self.m_should_reset 
 
       def getRange(self):
+        #descr()
         return self.m_inf, self.m_sup
 
       def resetRange(self, population):
+        #descr(population)
         (inf, sup) = self.m_range.getRange()
+        #descr("(inf, sup)", (inf, sup))
         #(self.m_target_inf, self.m_target_sup) = (self.m_inf, self.m_sup) = (inf, sup)
         (self.m_target_inf, self.m_target_sup) = (self.m_inf, self.m_sup) = (0, sup)
         self.m_inf_rescale_rate = self.m_sup_rescale_rate = 0
@@ -63,6 +70,7 @@
         return self.getRange()
 
       def updateRange(self, population):
+        #descr(population)
         if self.m_should_reset:
           return self.resetRange(population)
 

Modified: trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -48,6 +48,12 @@
 
     self.connect(self.m_timer, qt.SIGNAL("timeout()"), self.advanceSlot)
 
+
+  def sliderValueChangedSlot(self, frame_number):
+    print "pyOneOrg_ScopeCtrl.sliderValueChangedSlot(", frame_number, ")."
+    self.m_organism_scope_ctrl.showFrame(frame_number)
+
+
   def gestationTimeChangedSlot(self, gestation_time):
     print "pyOneOrg_ScopeCtrl.gestationTimeChangedSlot called, gestation_time ", gestation_time
     self.m_execution_step_slider.setMaxValue(gestation_time - 1)
@@ -59,10 +65,6 @@
     # This may be redundant (I'm not sure). @kgn
     self.m_execution_step_slider.emit(qt.SIGNAL("valueChanged(int)"),(execution_step,))
 
-  def sliderValueChangedSlot(self, frame_number):
-    print "pyOneOrg_ScopeCtrl.sliderValueChangedSlot(", frame_number, ")."
-    self.m_organism_scope_ctrl.showFrame(frame_number)
-
   def sliderMovedSlot(self, frame_number):
     print "pyOneOrg_ScopeCtrl.sliderMovedSlot()."
     self.pauseSlot()

Modified: trunk/source/python/AvidaGui2/pyOneOrganismCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOneOrganismCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyOneOrganismCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -12,3 +12,22 @@
   def construct(self, session_mdl):
     self.m_session_mdl = session_mdl
     self.m_one_org_scope_ctrl.construct(self.m_session_mdl)
+    self.m_organism_configure_ctrl.construct(self.m_session_mdl)
+
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("setOneOrganismViewNameLabelTextSig"),
+      self.setOneOrganismViewNameLabelTextSlot)
+    self.connect(self.m_organism_scope_toggle, SIGNAL("clicked()"),
+      self.ToggleScopeSlot)
+
+
+  def setOneOrganismViewNameLabelTextSlot(self, name):
+    self.m_organism_name_label.setText(name)
+
+  def ToggleScopeSlot (self):
+    current_page = self.m_organism_scope_widget_stack.visibleWidget()
+    current_page_int = self.m_organism_scope_widget_stack.id(current_page)
+    if (current_page_int == 0):
+       self.m_organism_scope_widget_stack.raiseWidget(1)
+    else:
+       self.m_organism_scope_widget_stack.raiseWidget(0)
+

Modified: trunk/source/python/AvidaGui2/pyOneOrganismView.ui
===================================================================
--- trunk/source/python/AvidaGui2/pyOneOrganismView.ui	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyOneOrganismView.ui	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,6 +1,7 @@
 <!DOCTYPE UI><UI version="3.3" stdsetdef="1">
 <class>pyOneOrganismView</class>
 <comment>Python:from pyOneOrg_ScopeCtrl import pyOneOrg_ScopeCtrl
+Python:from pyOrganismConfigureCtrl import pyOrganismConfigureCtrl
 Python:from pyTimelineCtrl import pyTimelineCtrl
 </comment>
 <widget class="QWidget">
@@ -11,7 +12,7 @@
         <rect>
             <x>0</x>
             <y>0</y>
-            <width>613</width>
+            <width>455</width>
             <height>434</height>
         </rect>
     </property>
@@ -49,37 +50,25 @@
                 </widget>
                 <widget class="QLabel">
                     <property name="name">
-                        <cstring>textLabel13</cstring>
+                        <cstring>m_organism_name_label</cstring>
                     </property>
                     <property name="sizePolicy">
                         <sizepolicy>
-                            <hsizetype>5</hsizetype>
+                            <hsizetype>3</hsizetype>
                             <vsizetype>5</vsizetype>
                             <horstretch>0</horstretch>
                             <verstretch>0</verstretch>
                         </sizepolicy>
                     </property>
+                    <property name="font">
+                        <font>
+                            <pointsize>11</pointsize>
+                        </font>
+                    </property>
                     <property name="text">
-                        <string>Leopold</string>
+                        <string>[organism]</string>
                     </property>
                 </widget>
-                <spacer>
-                    <property name="name">
-                        <cstring>spacer33</cstring>
-                    </property>
-                    <property name="orientation">
-                        <enum>Horizontal</enum>
-                    </property>
-                    <property name="sizeType">
-                        <enum>MinimumExpanding</enum>
-                    </property>
-                    <property name="sizeHint">
-                        <size>
-                            <width>477</width>
-                            <height>16</height>
-                        </size>
-                    </property>
-                </spacer>
                 <widget class="QLayoutWidget">
                     <property name="name">
                         <cstring>layout178</cstring>
@@ -107,7 +96,7 @@
                         </spacer>
                         <widget class="QToolButton">
                             <property name="name">
-                                <cstring>toolButton31_2</cstring>
+                                <cstring>m_organism_scope_toggle</cstring>
                             </property>
                             <property name="font">
                                 <font>
@@ -142,18 +131,68 @@
                 </widget>
             </hbox>
         </widget>
-        <widget class="pyOneOrg_ScopeCtrl">
+        <widget class="QWidgetStack">
             <property name="name">
-                <cstring>m_one_org_scope_ctrl</cstring>
+                <cstring>m_organism_scope_widget_stack</cstring>
             </property>
             <property name="sizePolicy">
                 <sizepolicy>
-                    <hsizetype>5</hsizetype>
+                    <hsizetype>3</hsizetype>
                     <vsizetype>3</vsizetype>
                     <horstretch>0</horstretch>
                     <verstretch>0</verstretch>
                 </sizepolicy>
             </property>
+            <widget class="QWidget">
+                <property name="name">
+                    <cstring>WStackPage</cstring>
+                </property>
+                <attribute name="id">
+                    <number>0</number>
+                </attribute>
+                <vbox>
+                    <property name="name">
+                        <cstring>unnamed</cstring>
+                    </property>
+                    <property name="margin">
+                        <number>0</number>
+                    </property>
+                    <widget class="pyOneOrg_ScopeCtrl">
+                        <property name="name">
+                            <cstring>m_one_org_scope_ctrl</cstring>
+                        </property>
+                        <property name="sizePolicy">
+                            <sizepolicy>
+                                <hsizetype>5</hsizetype>
+                                <vsizetype>3</vsizetype>
+                                <horstretch>0</horstretch>
+                                <verstretch>0</verstretch>
+                            </sizepolicy>
+                        </property>
+                    </widget>
+                </vbox>
+            </widget>
+            <widget class="QWidget">
+                <property name="name">
+                    <cstring>WStackPage</cstring>
+                </property>
+                <attribute name="id">
+                    <number>1</number>
+                </attribute>
+                <vbox>
+                    <property name="name">
+                        <cstring>unnamed</cstring>
+                    </property>
+                    <property name="margin">
+                        <number>0</number>
+                    </property>
+                    <widget class="pyOrganismConfigureCtrl">
+                        <property name="name">
+                            <cstring>m_organism_configure_ctrl</cstring>
+                        </property>
+                    </widget>
+                </vbox>
+            </widget>
         </widget>
     </vbox>
 </widget>
@@ -174,6 +213,22 @@
         </sizepolicy>
         <pixmap>image2</pixmap>
     </customwidget>
+    <customwidget>
+        <class>pyOrganismConfigureCtrl</class>
+        <header location="local"></header>
+        <sizehint>
+            <width>-1</width>
+            <height>-1</height>
+        </sizehint>
+        <container>0</container>
+        <sizepolicy>
+            <hordata>5</hordata>
+            <verdata>5</verdata>
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+        </sizepolicy>
+        <pixmap>image3</pixmap>
+    </customwidget>
 </customwidgets>
 <images>
     <image name="image0">
@@ -185,9 +240,13 @@
     <image name="image2">
         <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7!
 ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e05!
 82c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454e44a!
 e426082<
/data>
     </image>
+    <image name="image3">
+        <data format="PNG" length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042c49444154789cb5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d404e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3eeffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6bebebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64dcbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb004580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9ee0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93!
 d642365be0636a0d28ec7600941d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13ed1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f72208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45!
 c02d37499182b01cc0201a085d61a2144d8b2ac8fb6ed340e77240c4261890!
 e04c2501
85262546d534a032154b59e0ad394e41c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd051532ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de6795578012889ff6b98fe016ea0ce1c203e47720000000049454e44ae426082</data>
+    </image>
 </images>
 <layoutdefaults spacing="6" margin="11"/>
 <includehints>
     <includehint>pyoneorg_scopectrl.h</includehint>
+    <includehint>pyorganismconfigurectrl.h</includehint>
 </includehints>
 </UI>

Modified: trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,5 +1,7 @@
 # -*- coding: utf-8 -*-
 
+from descr import descr
+
 from qt import *
 from pyMapProfile import pyMapProfile
 from pyOnePop_PetriDishView import pyOnePop_PetriDishView
@@ -88,6 +90,7 @@
 
     if self.m_avida:
       self.m_map_profile.getUpdater(self.m_mode_combobox.currentItem()).resetRange(self.m_avida.m_population)
+      self.modeActivatedSlot(self.m_mode_combobox.currentItem())
 
 
   def ToggleDishSlot (self):
@@ -130,11 +133,14 @@
     if self.m_updater:
       (old_min, old_max) = self.m_updater.getRange()
       (min, max) = self.m_avida and self.m_updater.updateRange(self.m_avida.m_population) or (0, 0)
+      #descr(self.m_avida)
       if self.m_updater.shouldReset() or ((old_min, old_max) != (min, max)):
         self.m_gradient_scale_ctrl.setRange(min, max)
         self.m_gradient_scale_ctrl.activate(True)
         self.m_petri_dish_ctrl.setRange(min, max)
-        self.m_updater.reset(False)
+        # Force subsequent resets until valid range is obtained.
+        if ((min, max) != (0, 0)):
+          self.m_updater.reset(False)
         should_update_all = True
     else:
       self.m_gradient_scale_ctrl.setRange(0, 0)
@@ -148,17 +154,20 @@
     if update: self.m_update_label.setText(QString("%1").arg(update))
     
   def RenameDishSlot(self, dishName):
+    descr()
     if (not self.dishDisabled):
       self.PopulationTextLabel.setText(dishName)
     
   # Dummy routine
     
   def freezeDishPhaseISlot(self, send_reset_signal = False, send_quit_signal = False):
+    descr()
     print "in pyOnePop_PetriDishCtrl recieved freezeDishPhaseISig"
     print "send_reset_signal = " + str(send_reset_signal)
     print "send_quit_signal = " + str(send_quit_signal)
 
   def petriDropped(self, e):
+    descr()
     # Try to decode to the data you understand...
     freezer_item_name = QString()
     if ( QTextDrag.decode( e, freezer_item_name ) ) :
@@ -180,6 +189,7 @@
       self.MakeConfigVisiableSlot()
 
   def DefrostSlot(self, dish_name, petri_dict):
+    descr()
     if self.isVisible():
 
       Restart_Only_Flag = False
@@ -225,9 +235,11 @@
           PYSIGNAL("restartPopulationSig"), (self.m_session_mdl, ))
 
   def finishedPetriDishSlot(self):
+    descr()
     self.finishedPetriDish = True
 
   def restart(self, session_mdl):
-    print "pyOnePop_PetriDishCtrl.py:restart called"
+    descr()
+    descr(session_mdl)
     self.dishDisabled = False
 

Modified: trunk/source/python/AvidaGui2/pyOnePopulationCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePopulationCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyOnePopulationCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,5 +1,7 @@
 # -*- coding: utf-8 -*-
 
+from descr import descr
+
 from pyAvida import pyAvida
 from qt import *
 from pyOnePopulationView import pyOnePopulationView
@@ -28,8 +30,17 @@
     self.connect(self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("restartPopulationSig"), self.restartPopulationSlot)
 
+  def dragEnterEvent( self, e ):
+    descr(e)
+    e.acceptAction(True)
+    if e.isAccepted():
+      descr("isAccepted.")
+    else:
+      descr("not isAccepted.")
 
+
   def dropEvent( self, e ):
+    descr(e)
     freezer_item_name = QString()
     if ( QTextDrag.decode( e, freezer_item_name ) ) : #freezer_item_name is a string...the file name 
       if os.path.exists(str(freezer_item_name)) == False:
@@ -43,9 +54,11 @@
        (freezer_item_name,))
 
   def restartPopulationSlot(self, session_mdl):
+    descr()
     self.m_one_pop_petri_dish_ctrl.restart(self.m_session_mdl)
     self.m_one_pop_graph_ctrl.restart()
     self.m_one_pop_stats_ctrl.restart()
+    self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("doSyncSig"), ())
     # self.m_session_mdl.m_session_mdtr.emit(
     #   PYSIGNAL("doInitializeAvidaPhaseISig"), (self.m_session_mdl.m_tempdir,))
 

Modified: trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,17 +1,18 @@
 # -*- coding: utf-8 -*-
 
-from pyOrganismScopeView import pyOrganismScopeView
-
+from pyOrganismScopeView import pyOrganismScopeView, pyOrganismAnimator
 from AvidaCore import cAnalyzeGenotype, cGenome, cInstruction, cInstUtil, cString
-
 from pyHardwareTracer import pyHardwareTracer
 
+from descr import descr
+
 from qt import *
 
 import os
 import tempfile
 
 
+
 class pyOrganismScopeCtrl(pyOrganismScopeView):
 
   def __init__(self,parent = None,name = None,fl = 0):
@@ -24,19 +25,49 @@
     self.m_session_mdl = session_mdl
     self.m_avida = None
     self.setAcceptDrops(1)
-    self.connect(
-      self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
-      self.setAvidaSlot)
-    self.connect(
-      self.m_session_mdl.m_session_mdtr, PYSIGNAL("setDebugOrganismFileSig"),
-      self.setDebugOrganismFileSlot)
 
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"), self.setAvidaSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("setDebugOrganismFileSig"), self.setDebugOrganismFileSlot)
+
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_HeadsTypeCBActivatedSig"),
+      self.HeadsTypeCBActivatedSlot)
+
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowTaskTestsCBToggledSig"),
+      self.ShowTaskTestsCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowRegistersCBToggledSig"),
+      self.ShowRegistersCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_AnimateHeadMovementCBToggledSig"),
+      self.AnimateHeadMovementCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowStacksCBToggledSig"),
+      self.ShowStacksCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowHeadsAsLettersCBToggledSig"),
+      self.ShowHeadsAsLettersCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowInstructionNamesCBToggledSig"),
+      self.ShowInstructionNamesCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowInputsAndOutputsCBToggledSig"),
+      self.ShowInputsAndOutputsCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowFullStacksCBToggledSig"),
+      self.ShowFullStacksCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_AnimateInstructionCopyCBToggledSig"),
+      self.AnimateInstructionCopyCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_ShowHardwareCBToggledSig"),
+      self.ShowHardwareCBToggledSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_AnimateOrganismDivideCBToggledSig"),
+      self.AnimateOrganismDivideCBToggledSlot)
+
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_LayoutSpacingSBValueChangedSig"),
+      self.LayoutSpacingSBValueChangedSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("ScopeConfig_HardwareIndicatorSBValueChangedSig"),
+      self.HardwareIndicatorSBValueChangedSlot)
+
+
   def dragEnterEvent( self, e ):
+    descr(e)
     e.acceptAction(True)
     if e.isAccepted():
-      print "pyOrganismScopeCtrl.dragEnterEvent(e): isAccepted."
+      descr("isAccepted.")
     else:
-      print "pyOrganismScopeCtrl.dragEnterEvent(e): not isAccepted."
+      descr("not isAccepted.")
 
     freezer_item_name = QString()
     if ( QTextDrag.decode( e, freezer_item_name ) ) :
@@ -52,6 +83,7 @@
           print "pyOrganismScopeCtrl.dragEnterEvent(e): freezer_item_name doesn't end with .organism."
 
   def dropEvent( self, e ):
+    descr(e)
     freezer_item_name = QString()
     if ( QTextDrag.decode( e, freezer_item_name ) ) :
       if os.path.exists( str(freezer_item_name)) == False:
@@ -77,7 +109,7 @@
   def setDebugOrganismFileSlot(self, organism_filename):
     print "pyOrganismScopeCtrl.setDebugOrganismFileSlot"
     if self.m_avida:
-      self.reset()
+      self.setFrames()
 
       inst_set = self.m_avida.m_environment.GetInstSet()
       org_file = open(organism_filename.ascii())
@@ -87,9 +119,36 @@
       org_file.close
       genome = cGenome(cString(org_string))
       analyze_genotype = cAnalyzeGenotype(genome, inst_set)
-      hardware_tracer = pyHardwareTracer()
+
+
+      class ProgressCallback:
+        def __init__(self, qobj):
+          self.qobj = qobj
+          # FIXME : remove hard-coding of 2000 below. @kgn
+          self.progress_bar = QProgressBar(2000)
+          self.qobj.emit(PYSIGNAL("addStatusBarWidgetSig"), (self.progress_bar, 0, True))
+        def clear(self):
+          self.qobj.emit(PYSIGNAL("removeStatusBarWidgetSig"), (self.progress_bar,))
+          pt = QPoint()
+          self.progress_bar.reparent(None, pt)
+          del self.progress_bar
+        def __call__(self, step):
+          self.progress_bar.setProgress(step)
+          qApp.processEvents()
+
+      self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("setOneOrganismViewNameLabelTextSig"), (organism_filename.ascii(),))
+      self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("statusBarMessageSig"), ("Analyzing organism...",))
+      progress_callback = ProgressCallback(self.m_session_mdl.m_session_mdtr)
+
+      hardware_tracer = pyHardwareTracer(progress_callback)
       hardware_tracer.traceAnalyzeGenotype(analyze_genotype, self.m_avida.m_environment, should_use_resources = False)
 
+      progress_callback(2000)
+      #del progress_callback
+
+      self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("statusBarMessageSig"), ("Setting up organism scope...",))
+      qApp.processEvents()
+
       # Translate from string genome representation to actual command names.
       inst_names = {}
       ops = {}
@@ -103,3 +162,51 @@
       self.setInstNames(inst_names)
       self.setOps(ops)
       self.setFrames(hardware_tracer.m_hardware_trace)
+
+      progress_callback.clear()
+      self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("statusBarClearSig"), ())
+
+    else:
+      # XXX Temporary. @kgn
+      warning_message_box = QMessageBox.warning(
+        self,
+        "Avida-ED Beta Limitation",
+        """In this beta version, you must start an Avida population before you can analyze an organism.
+(After you start a population, if you want you can pause it.)""",
+        QMessageBox.Ok,
+        QMessageBox.NoButton,
+        QMessageBox.NoButton
+      )
+
+  def HeadsTypeCBActivatedSlot(self, index):
+    descr(index)
+    self.anim.setDisplayHeadsAs(index)
+
+  def ShowTaskTestsCBToggledSlot(self, bool):
+    descr(bool)
+  def ShowRegistersCBToggledSlot(self, bool):
+    descr(bool)
+  def AnimateHeadMovementCBToggledSlot(self, bool):
+    descr(bool)
+  def ShowStacksCBToggledSlot(self, bool):
+    descr(bool)
+  def ShowHeadsAsLettersCBToggledSlot(self, bool):
+    descr(bool)
+  def ShowInstructionNamesCBToggledSlot(self, bool):
+    descr(bool)
+  def ShowInputsAndOutputsCBToggledSlot(self, bool):
+    descr(bool)
+  def ShowFullStacksCBToggledSlot(self, bool):
+    descr(bool)
+  def AnimateInstructionCopyCBToggledSlot(self, bool):
+    descr(bool)
+  def ShowHardwareCBToggledSlot(self, bool):
+    descr(bool)
+  def AnimateOrganismDivideCBToggledSlot(self, bool):
+    descr(bool)
+
+  def LayoutSpacingSBValueChangedSlot(self, value):
+    descr(value)
+  def HardwareIndicatorSBValueChangedSlot(self, value):
+    descr(value)
+

Modified: trunk/source/python/AvidaGui2/pyOrganismScopeView.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOrganismScopeView.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyOrganismScopeView.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,10 +1,599 @@
 # -*- coding: utf-8 -*-
 
 
-from qt import PYSIGNAL, QBrush, QColor, QFont, QFontMetrics, QPen, QPointArray, QPoint, QScrollView, Qt, QWMatrix
-from qtcanvas import QCanvas, QCanvasEllipse, QCanvasLine, QCanvasSpline, QCanvasText, QCanvasView
+from AvidaCore import cHardwareDefs, cHardwareCPUDefs
+
+from descr import descr
+
+from qt import *
+from qtcanvas import *
 import math
 
+
+class ringHead(QCanvasEllipse):
+  def __init__(self, anim, color):
+    QCanvasEllipse.__init__(self, anim.canvas)
+    descr()
+    self.anim = anim
+    if hasattr(anim, 'r'):
+      diam = 2 * (anim.r + 1)
+      self.setSize(diam, diam)
+      self.setBrush(QBrush(color))
+  def move(self, displayed_genome_size, head_pos):
+    circle_pts = self.anim.circles[displayed_genome_size]
+    if len(circle_pts) <= head_pos: head_pos = -1
+    circle_pt = circle_pts[head_pos]
+    self.setX(circle_pt[0])
+    self.setY(circle_pt[1])
+    self.show()
+
+class textHead(QCanvasText):
+  def __init__(self, anim, text):
+    QCanvasText.__init__(self, anim.canvas)
+    descr()
+    self.anim = anim
+    self.setTextFlags(Qt.AlignCenter)
+    self.setFont(anim.font)
+    self.setText(text)
+  def move(self, displayed_genome_size, head_pos):
+    circle_pts = self.anim.head_circles[displayed_genome_size]
+    if len(circle_pts) <= head_pos: head_pos = -1
+    circle_pt = circle_pts[head_pos]
+    self.setX(circle_pt[0])
+    self.setY(circle_pt[1])
+    self.show()
+
+class headsDotShapePolicy:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+  def createHeads(self):
+    a = self.anim
+    return (ringHead(a, Qt.blue), ringHead(a, Qt.green), ringHead(a, Qt.red), textHead(a, 'F'))
+  
+
+class headsLetterShapePolicy:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+  def createHeads(self):
+    a = self.anim
+    return (textHead(a, 'I'), textHead(a, 'R'), textHead(a, 'W'), textHead(a, 'F'))
+
+
+class headsAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+    anim.ihead_item = anim.rhead_item = anim.whead_item = anim.fhead_item = None
+
+  def resetHeads(self, head_items):
+    descr()
+    a = self.anim
+    for head_item in head_items:
+      if head_item is not None: head_item.setCanvas(None)
+    return a.heads_shape_policy.createHeads()
+
+  def setFrames(self, frames):
+    descr()
+    a = self.anim
+    (a.ihead_item, a.rhead_item, a.whead_item, a.fhead_item
+    ) = self.resetHeads((a.ihead_item, a.rhead_item, a.whead_item, a.fhead_item))
+
+  def showFrame(self, frame_number):
+    descr()
+    a = self.anim
+    if a.frames is not None and frame_number < a.frames.m_gestation_time:
+      displayed_genome_size = max(a.last_copied_instruction_cache[frame_number] + 1, a.frames.m_size)
+      circle_pts = a.head_circles[displayed_genome_size]
+      hw = a.frames.getHardwareSnapshotAt(frame_number)
+      for id, item in (
+        (cHardwareDefs.s_HEAD_IP, a.ihead_item),
+        (cHardwareDefs.s_HEAD_READ, a.rhead_item),
+        (cHardwareDefs.s_HEAD_WRITE, a.whead_item),
+        (cHardwareDefs.s_HEAD_FLOW, a.fhead_item)
+      ):
+        head_pos = hw.GetHead(id).GetPosition()
+        item.move(displayed_genome_size, head_pos)
+
+
+class instructionsAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+    anim.canvas_ellipses = []
+    anim.current_genome_str = None
+    anim.current_frame_number = 0
+    anim.current_radius = None
+    anim.color = QColor()
+
+  def setFrames(self, frames):
+    descr("frames", frames)
+    a = self.anim
+    # canvas items must be detached from canvas before attempt is made to delete them.
+    for item in a.canvas_ellipses: item.setCanvas(None)
+    # create new canvas items, deleting old ones.
+    if frames is None: a.canvas_ellipses = []
+    else:
+      a.canvas_ellipses = [QCanvasEllipse(a.canvas) for i in xrange(frames.getSnapshotCount())]
+      for ellipse in a.canvas_ellipses:
+        ellipse.setSize(2*a.r, 2*a.r)
+        ellipse.setZ(10.)
+
+  def _placeEllipses(self, circle_pts, rng):
+    a = self.anim
+    for i in rng:
+      ellipse = a.canvas_ellipses[i]
+      ellipse.setX(circle_pts[i][0])
+      ellipse.setY(circle_pts[i][1])
+
+  def _brushEllipses(self, circle_pts, rng):
+    a = self.anim
+    for i in rng:
+      ellipse = a.canvas_ellipses[i]
+      a.color.setHsv((a.ops_dict[a.current_genome_str[i]] * 360) / len(a.ops_dict), 85, 248)
+      ellipse.setBrush(QBrush(a.color))
+      ellipse.show()
+
+  def showFrame(self, frame_number):
+    descr("frame number", frame_number)
+
+    a = self.anim
+
+    old_genome_str = a.current_genome_str
+    old_frame_number = a.current_frame_number
+    old_radius = a.current_radius
+
+    a.current_frame_number = 0
+    a.current_radius = None
+    a.current_genome_str = None
+
+    if frame_number < 0:
+      descr("bad frame_number %d reset to zero." % frame_number)
+      frame_number = 0
+
+    if a.frames is not None and frame_number < a.frames.m_gestation_time:
+      a.current_frame_number = frame_number
+      a.current_genome_str = a.frames.getMemorySnapshotAt(frame_number).AsString().GetData()
+      displayed_genome_size = max(a.last_copied_instruction_cache[frame_number] + 1, a.frames.m_size)
+      a.current_radius = a.circle_radii[displayed_genome_size - 1]
+      circle_pts = a.circles[displayed_genome_size]
+      if old_genome_str is None:
+        rng = xrange(displayed_genome_size)
+        self._placeEllipses(circle_pts, rng)
+        self._brushEllipses(circle_pts, rng)
+      else:
+        old_length = max(a.last_copied_instruction_cache[old_frame_number] + 1, a.frames.m_size)
+        new_length = max(a.last_copied_instruction_cache[frame_number] + 1, a.frames.m_size)
+        compare_max = min(old_length, new_length)
+        range_end = max(old_length, new_length)
+        if old_radius != a.current_radius:
+          self._placeEllipses(circle_pts, xrange(compare_max))
+          if old_length < new_length:
+            self._placeEllipses(circle_pts, xrange(compare_max, range_end))
+        for i in xrange(compare_max):
+          if old_genome_str[i] != a.current_genome_str[i]:
+            a.color.setHsv((a.ops_dict[a.current_genome_str[i]] * 360) / len(a.ops_dict), 85, 248)
+            a.canvas_ellipses[i].setBrush(QBrush(a.color))
+        if old_length < new_length:
+          self._brushEllipses(circle_pts, xrange(compare_max, range_end))
+        else:
+          for i in xrange(compare_max, range_end):
+            a.canvas_ellipses[i].hide()
+
+class instFactoryAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+
+
+class segAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+
+class pathAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+
+class indicator(QCanvasRectangle):
+  def __init__(self, anim, x, y, width, height):
+    QCanvasRectangle.__init__(self, x, y, width, height, anim.canvas)
+    descr()
+    self.anim = anim
+  def setBit(self, bit):
+    self.setBrush(bit and self.anim.on_brush or self.anim.off_brush)
+    self.setPen(bit and self.anim.on_pen or self.anim.off_pen)
+
+class indicatorPolicy:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+  def createIndicators(self):
+    a = self.anim
+    hw_anim = a.hw_anim
+    x = hw_anim.regs_anim.x
+    y = hw_anim.regs_anim.y
+    w = a.hardware_indicator_size
+    h = a.hardware_indicator_size
+    return [indicator(a, x + i*w, y, w, h) for i in xrange(32)]
+
+class bufAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+    self.indicator_items = []
+    self.indicator_policy = indicatorPolicy()
+  def width(self):
+    return 32 * anim.hardware_indicator_size
+  def height(self):
+    return anim.hardware_indicator_size
+
+  def setReadFnc(self, read_fnc):
+    self.read_fnc = read_fnc
+  def resetIndicators(self, indicator_items):
+    descr()
+    a = self.anim
+    for item in indicator_items:
+      if item is not None: item.setCanvas(None)
+    return self.indicator_policy.createIndicators()
+  def setX(self, x):
+    descr()
+  def setY(self, y):
+    descr()
+  def setZ(self, z):
+    descr()
+  def show(self):
+    descr()
+  def hide(self):
+    descr()
+  def setFrames(self, frames):
+    descr()
+    self.indicator_items = self.resetIndicators()
+  def showFrame(self, frame_number):
+    descr()
+
+
+class regsAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+  def size(self):
+    descr()
+    if not self.anim.show_registers_flag:
+      return 0, 0
+  def setFrames(self, frames):
+    descr()
+    if self.anim.show_hardware_flag and self.anim.show_registers_flag:
+      pass
+    else:
+      pass
+  def showFrame(self, frame_number):
+    descr()
+    if self.anim.show_hardware_flag and self.anim.show_registers_flag:
+      pass
+    else:
+      pass
+
+class stackAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+  def size(self):
+    descr()
+    return 0, 0
+
+class ioAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+  def size(self):
+    descr()
+    return 0, 0
+
+class taskTestsAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+  def size(self):
+    descr()
+    return 0, 0
+
+
+class hwAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+    self.regs_anim = regsAnimator(anim)
+    self.stack_a_anim = stackAnimator(anim)
+    self.stack_b_anim = stackAnimator(anim)
+    self.io_anim = ioAnimator(anim)
+    self.task_tests_anim = taskTestsAnimator(anim)
+
+    self.x = None
+    self.y = None
+
+    self.regs_anim.x = None
+    self.regs_anim.y = None
+
+  def size(self):
+    descr()
+    if not self.anim.show_hardware_flag:
+      return 0, 0
+
+    width = height = self.anim.layout_margin
+    for a in (self.regs_anim, self.stack_a_anim, self.stack_b_anim, self.io_anim, self.task_tests_anim):
+      a_width, a_height = a.size()
+      width, height = (max(width, a_width), height + a_height)
+    return width, height
+
+  def setFrames(self, frames):
+    descr()
+    self.x = self.anim.layout_margin
+    self.y = self.anim.layout_margin
+
+    self.regs_anim.x = self.x
+    self.regs_anim.y = self.y
+
+    self.regs_anim.setFrames(frames)
+
+  def showFrame(self, frame_number):
+    descr()
+    self.regs_anim.showFrame(frame_number)
+
+class dataAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+
+
+class divideAnimator:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+
+
+class layoutManager:
+  def __init__(self, anim):
+    descr()
+    self.anim = anim
+    anim.MAX_ORG_LEN = 200
+  def checkDimensions(self, width, height):
+    descr(width, height)
+    a = self.anim
+    hw_width, hw_height = a.hw_anim.size()
+    w = width - hw_width
+    w = w - 2 * a.layout_margin
+
+    h = height - hw_width
+    h = h - 2 * a.layout_margin
+
+    # FIXME: remove hard-coded 200 - the maximum (expected) length of an organism. @kgn
+    sin_n = math.sin(math.pi/a.MAX_ORG_LEN)
+    sin_n_3 = 3 * sin_n
+    R = (h / 2.) / (1 + sin_n_3)
+    r = R * sin_n
+    rr = r - a.layout_spacing / 2.
+
+    c_x = width - w / 2.
+    c_y = height / 2.
+
+    descr(c_x, c_y, R, r, rr)
+    return c_x, c_y, R, r, rr
+
+  def setDimensions(self, layout_dims):
+    descr()
+    a = self.anim
+    c_x, c_y, R, r, rr = layout_dims
+    descr(c_x, c_y, R, r, rr)
+    descr(layout_dims)
+    a.circles = []
+    a.head_circles = []
+    a.circle_radii = []
+    a.head_circle_radii = []
+
+    angle_offset = math.pi/2
+    for i in xrange(1, a.MAX_ORG_LEN + 2):
+      radius = R*i/a.MAX_ORG_LEN
+      head_radius = radius + 3*r
+      dt = 2*math.pi/i
+      circle_pts = []
+      head_circle_pts = []
+      for j in xrange(i):
+        theta = j * dt + angle_offset
+        c = math.cos(theta)
+        s = -math.sin(theta)
+        x = radius * c + c_x
+        y = radius * s + c_y
+        h_x = head_radius * c + c_x
+        h_y = head_radius * s + c_y
+        circle_pts.append((x,y))
+        head_circle_pts.append((h_x,h_y))
+      a.circles.append(circle_pts)
+      a.head_circles.append(head_circle_pts)
+      a.circle_radii.append(radius)
+      a.head_circle_radii.append(head_radius)
+
+
+class pyOrganismAnimator:
+  def __init__(self):
+    descr()
+    self.heads_anim = headsAnimator(self)
+    self.instructions_anim = instructionsAnimator(self)
+    self.ihead_path_anim = pathAnimator(self)
+    self.hw_anim = hwAnimator(self)
+    self.divide_anim = divideAnimator(self)
+
+    self.layout_manager = layoutManager(self)
+
+    self.font = QFont(qApp.font())
+
+    self.on_brush = QBrush(Qt.white)
+    self.off_brush = QBrush(Qt.black)
+    self.on_pen = QPen(Qt.white)
+    self.off_pen = QPen(Qt.black)
+
+    self.hardware_indicator_size = 4
+    self.layout_spacing = 2
+    self.layout_margin = 20
+
+    self.layout_dims = None
+
+    self.canvas = None
+    self.ops_dict = None
+
+    self.frames = None
+    
+    self.animate_head_movement_flag = False
+    self.animate_instruction_copy_flag = False
+    self.animate_organism_divide_flag = False
+    self.show_hardware_flag = None
+    self.show_registers_flag = False
+    self.show_stacks_flag = False
+    self.show_full_stacks_flag = False
+    self.show_io_flag = False
+    self.show_task_tests_flag = False
+    self.show_instruction_names_flag = False
+
+    self.display_heads_as = None
+
+    self.setDisplayHeadsAs(0)
+    self.setShowHardwareCBToggled(True)
+
+  def setOps(self, ops = None):
+    self.ops_dict = ops
+
+  def setCanvas(self, canvas = None):
+    descr()
+    self.canvas = canvas
+  def setFrames(self, frames = None):
+    descr()
+    self.frames = frames
+    if frames is None:
+      self.last_copied_instruction_cache = None
+    else:
+      self.last_copied_instruction_cache = []
+      last_copied_instruction = 0
+      for i in xrange(frames.getSnapshotCount()):
+        ms = frames.getMemorySnapshotAt(i)
+        last_copied_instruction = max(
+          [ms.GetFlagCopied(j) and j or last_copied_instruction for j in xrange(last_copied_instruction, ms.GetSize())]
+        )
+        self.last_copied_instruction_cache.append(last_copied_instruction)
+      descr("self.last_copied_instruction_cache", self.last_copied_instruction_cache)
+
+    self.instructions_anim.setFrames(frames)
+    self.heads_anim.setFrames(frames)
+    self.hw_anim.setFrames(frames)
+  def showFrame(self, frame_number):
+    descr()
+    self.instructions_anim.showFrame(frame_number)
+    self.heads_anim.showFrame(frame_number)
+    self.hw_anim.showFrame(frame_number)
+    self.canvas.update()
+  def animateFrame(self, frame_number):
+    descr()
+    pass
+
+
+  def setSize(self, width, height):
+    descr()
+    self.canvas_width = width
+    self.canvas_height = height
+
+    layout_dims = self.layout_manager.checkDimensions(width, height)
+    for num in layout_dims:
+      if num <= 0:
+        return
+    if layout_dims != self.layout_dims:
+      self.layout_dims = layout_dims
+      self.layout_manager.setDimensions(layout_dims)
+      descr()
+      self.c_x, self.c_y, self.R, self.r, self.rr = layout_dims
+      text_height = 3 * self.r
+      font_metrics = QFontMetrics(self.font)
+      font_points_per_pixel = self.font.pointSizeFloat()/font_metrics.height()
+      point_size_float = text_height * font_points_per_pixel
+      self.font.setPointSizeFloat(point_size_float)
+
+
+  def setAnimateHeadMovementCBToggled(self, bool):
+    descr()
+    if self.animate_head_movement_flag != bool:
+      self.animate_head_movement_flag = bool
+  def setAnimateInstructionCopyCBToggled(self, bool):
+    descr()
+    if self.animate_instruction_copy_flag != bool:
+      self.animate_instruction_copy_flag = bool
+  def setAnimateOrganismDivideCBToggled(self, bool):
+    descr()
+    if self.animate_organism_divide_flag != bool:
+      self.animate_organism_divide_flag = bool
+
+
+  def setDisplayHeadsAs(self, head_type_index):
+    descr()
+    heads_shape_policy_table = (
+      headsDotShapePolicy,
+      headsLetterShapePolicy
+    )
+    if self.display_heads_as != head_type_index:
+      self.display_heads_as = head_type_index
+      self.heads_shape_policy = heads_shape_policy_table[head_type_index](self)
+      self.heads_anim.setFrames(self.frames)
+      self.heads_anim.showFrame(self.current_frame_number)
+
+  def setShowHardwareCBToggled(self, bool):
+    descr()
+    if self.show_hardware_flag != bool:
+      self.show_hardware_flag = bool
+      self.hw_anim.setFrames(self.frames)
+      self.hw_anim.showFrame(self.current_frame_number)
+  def setShowRegistersCBToggled(self, bool):
+    descr()
+    if self.show_registers_flag != bool:
+      self.show_registers_flag = bool
+  def setShowStacksCBToggled(self, bool):
+    descr()
+    if self.show_stacks_flag != bool:
+      self.show_stacks_flag = bool
+  def setShowFullStacksCBToggled(self, bool):
+    descr()
+    if self.show_full_stacks_flag != bool:
+      self.show_full_stacks_flag = bool
+  def setShowInputsAndOutputsCBToggled(self, bool):
+    descr()
+    if self.show_io_flag != bool:
+      self.show_io_flag = bool
+  def setShowTaskTestsCBToggled(self, bool):
+    descr()
+    if self.show_task_tests_flag != bool:
+      self.show_task_tests_flag = bool
+  def setShowInstructionNamesCBToggled(self, bool):
+    descr()
+    if self.show_instruction_names_flag != bool:
+      self.show_instruction_names_flag = bool
+
+
+  def setHardwareIndicatorSBValueChanged(self, value):
+    descr()
+    if self.hardware_indicator_size != value:
+      self.hardware_indicator_size = value
+
+
+  def setLayoutSpacingSBValueChanged(self, value):
+    descr()
+    if self.layout_spacing != value:
+      self.layout_spacing = value
+  def setLayoutMarginSBValueChanged(self, value):
+    descr()
+    if self.layout_margin != value:
+      self.layout_margin = value
+
+
+
+
 class pyHeadPath:
   def __init__(self, canvas):
     self.m_canvas = canvas
@@ -50,9 +639,13 @@
     self.m_organism_circle_margin = 10
     self.m_font_oversize_factor = 1.2
 
-    self.m_visible_width = 0
-    self.m_visible_height = 0
+    self.m_visible_width = 1
+    self.m_visible_height = 1
 
+    self.anim = pyOrganismAnimator()
+    self.anim.setSize(1, 1)
+    self.anim.setCanvas(self.m_canvas)
+
     self.reset()
 
   def reset(self):
@@ -98,6 +691,8 @@
     self.m_current_fhead = None
     self.m_current_ihead_move = None
 
+    self.anim.setFrames()
+
     # Hmm; can't emit gestationTimeChangedSig(0) without causing absurd slider values. @kgn
     self.emit(PYSIGNAL("gestationTimeChangedSig"),(1,))
     self.emit(PYSIGNAL("executionStepResetSig"),(0,))
@@ -110,6 +705,7 @@
 
   def setOps(self, ops = None):
     self.m_ops_dict = ops
+    self.anim.setOps(ops)
 
   def setFrames(self, frames = None):
     self.reset()
@@ -163,6 +759,10 @@
       self.updateCircle()
       self.showFrame(0)
 
+    # XXX XXX
+    self.anim.setFrames(frames)
+    self.anim.showFrame(0)
+
   def viewportResizeEvent(self, resize_event):
     QCanvasView.viewportResizeEvent(self, resize_event)
     # XXX Fragility: If the top-level Avida-ED window is allowed to change height, this is going to cause a painful slow-down
@@ -176,6 +776,10 @@
       self.updateCircle()
       self.showFrame(self.m_current_frame_number)
 
+    # XXX XXX
+    self.anim.setSize(self.m_visible_width, self.m_visible_height)
+    self.anim.showFrame(self.m_current_frame_number)
+
   def updateCircle(self):
     self.m_circle_center_x = self.m_visible_width / 2
     self.m_circle_center_y = self.m_visible_height / 2
@@ -214,7 +818,58 @@
         self.m_head_circles.append(head_circle_pts)
         self.m_circle_radii.append(radius)
 
+  def debug_displayHardwareCPUSnapshot(self, frame_number):
+    print "pyOrganismScopeView.debug_displayHardwareCPUSnapshot()..."
+    hardware_snapshot = self.m_frames.getHardwareSnapshotAt(frame_number)
+    memory_snapshot = self.m_frames.getMemorySnapshotAt(frame_number)
+    threads_snapshot = self.m_frames.getThreadsSnapshotAt(frame_number)
+
+    print "hardware_snapshot", hardware_snapshot
+    print "memory_snapshot", memory_snapshot
+    print "threads_snapshot", threads_snapshot
+    memory_size = memory_snapshot.GetSize()
+    memory_string = str(memory_snapshot.AsString())
+    print "memory_snapshot.GetSize()", memory_size
+    print "memory:"
+    for i in xrange(memory_size):
+      print " ", memory_string[i], memory_snapshot.GetFlagCopied(i), memory_snapshot.GetFlagExecuted(i)
+    threads_count = len(threads_snapshot)
+    print "thread:"
+    for i in xrange(threads_count):
+      thread = threads_snapshot[i]
+      print " .cur_head", thread.cur_head
+      print " .cur_stack", thread.cur_stack
+      print " .next_label", thread.next_label
+      print " .read_label", thread.read_label
+      #print " .stack", thread.stack
+      for j in xrange(cHardwareDefs.s_STACK_SIZE):
+        print " .stack[%d]" % j, thread.stack.Get(j)
+      print " .reg[s_REG_AX]", thread.GetRegister(cHardwareCPUDefs.s_REG_AX)
+      print " .reg[s_REG_BX]", thread.GetRegister(cHardwareCPUDefs.s_REG_BX)
+      print " .reg[s_REG_CX]", thread.GetRegister(cHardwareCPUDefs.s_REG_CX)
+      #print " .reg[s_REG_DX]", thread.GetRegister(cHardwareCPUDefs.s_REG_DX)
+      print " .heads[s_HEAD_IP]", thread.GetHead(cHardwareDefs.s_HEAD_IP).GetPosition()
+      print " .heads[s_HEAD_READ]", thread.GetHead(cHardwareDefs.s_HEAD_READ).GetPosition()
+      print " .heads[s_HEAD_WRITE]", thread.GetHead(cHardwareDefs.s_HEAD_WRITE).GetPosition()
+      print " .heads[s_HEAD_FLOW]", thread.GetHead(cHardwareDefs.s_HEAD_FLOW).GetPosition()
+
+
+    #print "ss", hardware_snapshot
+    #print "ss.GetMemory()", hardware_snapshot.GetMemory()
+    #print "ss.GetMemory().AsString()", hardware_snapshot.GetMemory().AsString()
+
+    # cCPUMemory memory : cCPUMemory & GetMemory()
+    # cCPUStack global_stack : cCPUStack pyGetGlobalStack()
+    # int thread_time_used : int pyGetThreadTimeUsed()
+    ### assume a single thread
+    # cHardwareCPU_Thread thread : tArray<cHardwareCPU_Thread> pyGetThreads()
+    # bool mal_active : bool GetMalActive()
+    # bool advance_ip : bool pyGetAdvanceIP()
+
   def showFrame(self, frame_number = 0):
+    # XXX
+    self.anim.showFrame(frame_number)
+
     old_frame_number = self.m_current_frame_number
     old_radius = self.m_current_radius
     old_genome = self.m_current_genome
@@ -242,198 +897,209 @@
       frame_number = 0
 
     if self.m_frames is not None and frame_number < self.m_frames.m_gestation_time:
+      # XXX
+      #self.debug_displayHardwareCPUSnapshot(frame_number)
+
       self.m_current_frame_number = frame_number
       self.m_current_radius = self.m_circle_radii[frame_number]
       circle_pts = self.m_circles[frame_number]
       head_circle_pts = self.m_head_circles[frame_number]
-      if self.m_frames.m_genome_info is not None:
-        self.m_current_genome = self.m_frames.m_genome_info[frame_number]
-        if old_genome is None:
-          displayed_genome_size = max(self.m_frames.m_last_copy_info[self.m_current_frame_number], self.m_frames.m_size)
-          # Update all instruction_items.
-          color = QColor()
-          for i in xrange(displayed_genome_size):
-            item = self.m_instruction_items[i]
-            item.setX(circle_pts[i][0])
-            item.setY(circle_pts[i][1])
-            item.setText(self.m_current_genome[i])
-            item.show()
+      #if self.m_frames.m_genome_info is not None:
+      #  self.m_current_genome = self.m_frames.m_genome_info[frame_number]
+      #  if old_genome is None:
+      #    displayed_genome_size = max(self.m_frames.m_last_copy_info[self.m_current_frame_number], self.m_frames.m_size)
+      #    # Update all instruction_items.
+      #    color = QColor()
+      #    for i in xrange(displayed_genome_size):
+      #      item = self.m_instruction_items[i]
+      #      item.setX(circle_pts[i][0])
+      #      item.setY(circle_pts[i][1])
+      #      item.setText(self.m_current_genome[i])
+      #      item.show()
 
-            bg_item = self.m_instruction_bg_items[i]
-            bg_item.setX(circle_pts[i][0])
-            bg_item.setY(circle_pts[i][1])
-            color.setHsv((self.m_ops_dict[self.m_current_genome[i]] * 360) / len(self.m_ops_dict), 85, 248)
-            bg_item.setBrush(QBrush(color))
-            bg_item.show()
-        else:
-          # Update changed instruction_items.
-          old_length = max(self.m_frames.m_last_copy_info[old_frame_number] + 1, self.m_frames.m_size)
-          new_length = max(self.m_frames.m_last_copy_info[self.m_current_frame_number] + 1, self.m_frames.m_size)
-          compare_max = min(old_length, new_length)
-          range_end = max(old_length, new_length)
+      #      bg_item = self.m_instruction_bg_items[i]
+      #      bg_item.setX(circle_pts[i][0])
+      #      bg_item.setY(circle_pts[i][1])
+      #      color.setHsv((self.m_ops_dict[self.m_current_genome[i]] * 360) / len(self.m_ops_dict), 85, 248)
+      #      bg_item.setBrush(QBrush(color))
+      #      bg_item.show()
+      #  else:
+      #    # Update changed instruction_items.
+      #    old_length = max(self.m_frames.m_last_copy_info[old_frame_number] + 1, self.m_frames.m_size)
+      #    new_length = max(self.m_frames.m_last_copy_info[self.m_current_frame_number] + 1, self.m_frames.m_size)
+      #    compare_max = min(old_length, new_length)
+      #    range_end = max(old_length, new_length)
 
-          if old_radius != self.m_current_radius:
-            for i in xrange(compare_max):
-              item = self.m_instruction_items[i]
-              item.setX(circle_pts[i][0])
-              item.setY(circle_pts[i][1])
-              bg_item = self.m_instruction_bg_items[i]
-              bg_item.setX(circle_pts[i][0])
-              bg_item.setY(circle_pts[i][1])
-            if old_length < new_length:
-              for i in xrange(compare_max, range_end):
-                item = self.m_instruction_items[i]
-                item.setX(circle_pts[i][0])
-                item.setY(circle_pts[i][1])
-                bg_item = self.m_instruction_bg_items[i]
-                bg_item.setX(circle_pts[i][0])
-                bg_item.setY(circle_pts[i][1])
+      #    if old_radius != self.m_current_radius:
+      #      for i in xrange(compare_max):
+      #        item = self.m_instruction_items[i]
+      #        item.setX(circle_pts[i][0])
+      #        item.setY(circle_pts[i][1])
+      #        bg_item = self.m_instruction_bg_items[i]
+      #        bg_item.setX(circle_pts[i][0])
+      #        bg_item.setY(circle_pts[i][1])
+      #      if old_length < new_length:
+      #        for i in xrange(compare_max, range_end):
+      #          item = self.m_instruction_items[i]
+      #          item.setX(circle_pts[i][0])
+      #          item.setY(circle_pts[i][1])
+      #          bg_item = self.m_instruction_bg_items[i]
+      #          bg_item.setX(circle_pts[i][0])
+      #          bg_item.setY(circle_pts[i][1])
 
-          for i in xrange(compare_max):
-            instruction_item = self.m_instruction_items[i]
-            if old_genome[i] == self.m_current_genome[i]:
-              pass
-            else:
-              self.m_instruction_items[i].setText(self.m_current_genome[i])
-              color = QColor()
-              color.setHsv((self.m_ops_dict[self.m_current_genome[i]] * 360) / len(self.m_ops_dict), 85, 248)
-              self.m_instruction_bg_items[i].setBrush(QBrush(color))
+      #    for i in xrange(compare_max):
+      #      instruction_item = self.m_instruction_items[i]
+      #      if old_genome[i] == self.m_current_genome[i]:
+      #        pass
+      #      else:
+      #        self.m_instruction_items[i].setText(self.m_current_genome[i])
+      #        color = QColor()
+      #        color.setHsv((self.m_ops_dict[self.m_current_genome[i]] * 360) / len(self.m_ops_dict), 85, 248)
+      #        self.m_instruction_bg_items[i].setBrush(QBrush(color))
 
-          if old_length < new_length:
-            for i in xrange(compare_max, range_end):
-              item = self.m_instruction_items[i]
-              item.setText(self.m_current_genome[i])
-              item.show()
-              bg_item = self.m_instruction_bg_items[i]
-              color = QColor()
-              color.setHsv((self.m_ops_dict[self.m_current_genome[i]] * 360) / len(self.m_ops_dict), 85, 248)
-              bg_item.setBrush(QBrush(color))
-              bg_item.show()
-          else:
-            for i in xrange(compare_max, range_end):
-              self.m_instruction_items[i].hide()
-              self.m_instruction_bg_items[i].hide()
+      #    if old_length < new_length:
+      #      for i in xrange(compare_max, range_end):
+      #        item = self.m_instruction_items[i]
+      #        item.setText(self.m_current_genome[i])
+      #        item.show()
+      #        bg_item = self.m_instruction_bg_items[i]
+      #        color = QColor()
+      #        color.setHsv((self.m_ops_dict[self.m_current_genome[i]] * 360) / len(self.m_ops_dict), 85, 248)
+      #        bg_item.setBrush(QBrush(color))
+      #        bg_item.show()
+      #    else:
+      #      for i in xrange(compare_max, range_end):
+      #        self.m_instruction_items[i].hide()
+      #        self.m_instruction_bg_items[i].hide()
 
-      if self.m_frames.m_ihead_moves_info is not None:
-        self.m_current_ihead_move = self.m_frames.m_ihead_moves_info[frame_number]
-        if old_ihead_move is None:
-          # Update all ihead_move_items.
-          for i in xrange(self.m_current_ihead_move):
-            if len(self.m_ihead_move_items) < i:
-              print "pyOrganismScopeView.showFrame(): i", i, ", len(self.m_ihead_move_items)", len(self.m_ihead_move_items)
-            ihead_move_item = self.m_ihead_move_items[self.m_current_ihead_move]
-            anchor_radius = float(m_current_radius - 10)
-            anchor_radii_ratio = anchor_radius / self.m_current_radius
-            control_radii_ratio = 0.4 + 0.5 * pow(2., -float(self.m_frames.m_ihead_moves[i][2])/25)
-            #control_radii_ratio = 0.4 + 0.5 * pow(2., -float((1 + self.m_frames.m_ihead_moves[i][2]))/8)
-            point_array = QPointArray(3)
-            #from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
-            #to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
-            if len(circle_pts) > self.m_frames.m_ihead_moves[i][0]:
-              from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
-            else:
-              from_circle_pt = circle_pts[-1]
-            if len(circle_pts) > self.m_frames.m_ihead_moves[i][1]:
-              to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
-            else:
-              to_circle_pt = circle_pts[-1]
-            point_array[0] = QPoint(
-              self.m_circle_center_x + anchor_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
-              self.m_circle_center_y + anchor_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
-            )
-            point_array[1] = QPoint(
-              self.m_circle_center_x + control_radii_ratio * ((from_circle_pt[0] + to_circle_pt[0])/2 - self.m_circle_center_x),
-              self.m_circle_center_y + control_radii_ratio * ((from_circle_pt[1] + to_circle_pt[1])/2 - self.m_circle_center_y),
-            )
-            point_array[2] = QPoint(
-              self.m_circle_center_x + anchor_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
-              self.m_circle_center_y + anchor_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
-            )
-            ihead_move_item.setControlPoints(point_array, False)
-            if self.m_frames.m_ihead_moves[i][0] < self.m_frames.m_ihead_moves[i][1]:
-              ihead_move_item.setPen(QPen(Qt.blue))
-            else:
-              ihead_move_item.setPen(QPen(Qt.red))
-            ihead_move_item.show()
-        else:
-          # Update changed ihead_move_items.
-          for i in xrange(self.m_current_ihead_move):
-            ihead_move_item = self.m_ihead_move_items[i]
-            anchor_radius = float(self.m_current_radius - 10)
-            anchor_radii_ratio = anchor_radius / self.m_current_radius
-            control_radii_ratio = 0.4 + 0.5 * pow(2., -float(self.m_frames.m_ihead_moves[i][2])/25)
-            #control_radii_ratio = 0.4 + 0.5 * pow(2., -float((1 + self.m_frames.m_ihead_moves[i][2]))/8)
-            point_array = QPointArray(3)
-            #from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
-            #to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
-            if len(circle_pts) > self.m_frames.m_ihead_moves[i][0]:
-              from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
-            else:
-              from_circle_pt = circle_pts[-1]
-            if len(circle_pts) > self.m_frames.m_ihead_moves[i][1]:
-              to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
-            else:
-              to_circle_pt = circle_pts[-1]
-            point_array.setPoint(0, QPoint(
-              self.m_circle_center_x + anchor_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
-              self.m_circle_center_y + anchor_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
-            ) )
-            point_array.setPoint(1, QPoint(
-              self.m_circle_center_x + control_radii_ratio * ((from_circle_pt[0] + to_circle_pt[0])/2 - self.m_circle_center_x),
-              self.m_circle_center_y + control_radii_ratio * ((from_circle_pt[1] + to_circle_pt[1])/2 - self.m_circle_center_y),
-            ) )
-            point_array.setPoint(2, QPoint(
-              self.m_circle_center_x + anchor_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
-              self.m_circle_center_y + anchor_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
-            ) )
-            ihead_move_item.setControlPoints(point_array, False)
-            if self.m_frames.m_ihead_moves[i][0] < self.m_frames.m_ihead_moves[i][1]:
-              ihead_move_item.setPen(QPen(Qt.blue))
-            else:
-              ihead_move_item.setPen(QPen(Qt.red))
-            ihead_move_item.show()
-          if self.m_current_ihead_move < old_ihead_move:
-            for i in xrange(self.m_current_ihead_move, old_ihead_move):
-              self.m_ihead_move_items[i].hide()
-          pass
 
+
+
+
+      # if self.m_frames.m_ihead_moves_info is not None:
+      #   self.m_current_ihead_move = self.m_frames.m_ihead_moves_info[frame_number]
+      #   if old_ihead_move is None:
+      #     # Update all ihead_move_items.
+      #     for i in xrange(self.m_current_ihead_move):
+      #       if len(self.m_ihead_move_items) < i:
+      #         print "pyOrganismScopeView.showFrame(): i", i, ", len(self.m_ihead_move_items)", len(self.m_ihead_move_items)
+      #       ihead_move_item = self.m_ihead_move_items[self.m_current_ihead_move]
+      #       anchor_radius = float(m_current_radius - 10)
+      #       anchor_radii_ratio = anchor_radius / self.m_current_radius
+      #       control_radii_ratio = 0.4 + 0.5 * pow(2., -float(self.m_frames.m_ihead_moves[i][2])/25)
+      #       #control_radii_ratio = 0.4 + 0.5 * pow(2., -float((1 + self.m_frames.m_ihead_moves[i][2]))/8)
+      #       point_array = QPointArray(3)
+      #       #from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
+      #       #to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
+      #       if len(circle_pts) > self.m_frames.m_ihead_moves[i][0]:
+      #         from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
+      #       else:
+      #         from_circle_pt = circle_pts[-1]
+      #       if len(circle_pts) > self.m_frames.m_ihead_moves[i][1]:
+      #         to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
+      #       else:
+      #         to_circle_pt = circle_pts[-1]
+      #       point_array[0] = QPoint(
+      #         self.m_circle_center_x + anchor_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
+      #         self.m_circle_center_y + anchor_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+      #       )
+      #       point_array[1] = QPoint(
+      #         self.m_circle_center_x + control_radii_ratio * ((from_circle_pt[0] + to_circle_pt[0])/2 - self.m_circle_center_x),
+      #         self.m_circle_center_y + control_radii_ratio * ((from_circle_pt[1] + to_circle_pt[1])/2 - self.m_circle_center_y),
+      #       )
+      #       point_array[2] = QPoint(
+      #         self.m_circle_center_x + anchor_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
+      #         self.m_circle_center_y + anchor_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
+      #       )
+      #       ihead_move_item.setControlPoints(point_array, False)
+      #       if self.m_frames.m_ihead_moves[i][0] < self.m_frames.m_ihead_moves[i][1]:
+      #         ihead_move_item.setPen(QPen(Qt.blue))
+      #       else:
+      #         ihead_move_item.setPen(QPen(Qt.red))
+      #       ihead_move_item.show()
+      #   else:
+      #     # Update changed ihead_move_items.
+      #     for i in xrange(self.m_current_ihead_move):
+      #       ihead_move_item = self.m_ihead_move_items[i]
+      #       anchor_radius = float(self.m_current_radius - 10)
+      #       anchor_radii_ratio = anchor_radius / self.m_current_radius
+      #       control_radii_ratio = 0.4 + 0.5 * pow(2., -float(self.m_frames.m_ihead_moves[i][2])/25)
+      #       #control_radii_ratio = 0.4 + 0.5 * pow(2., -float((1 + self.m_frames.m_ihead_moves[i][2]))/8)
+      #       point_array = QPointArray(3)
+      #       #from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
+      #       #to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
+      #       if len(circle_pts) > self.m_frames.m_ihead_moves[i][0]:
+      #         from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][0]]
+      #       else:
+      #         from_circle_pt = circle_pts[-1]
+      #       if len(circle_pts) > self.m_frames.m_ihead_moves[i][1]:
+      #         to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[i][1]]
+      #       else:
+      #         to_circle_pt = circle_pts[-1]
+      #       point_array.setPoint(0, QPoint(
+      #         self.m_circle_center_x + anchor_radii_ratio * (from_circle_pt[0] - self.m_circle_center_x),
+      #         self.m_circle_center_y + anchor_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+      #       ) )
+      #       point_array.setPoint(1, QPoint(
+      #         self.m_circle_center_x + control_radii_ratio * ((from_circle_pt[0] + to_circle_pt[0])/2 - self.m_circle_center_x),
+      #         self.m_circle_center_y + control_radii_ratio * ((from_circle_pt[1] + to_circle_pt[1])/2 - self.m_circle_center_y),
+      #       ) )
+      #       point_array.setPoint(2, QPoint(
+      #         self.m_circle_center_x + anchor_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
+      #         self.m_circle_center_y + anchor_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
+      #       ) )
+      #       ihead_move_item.setControlPoints(point_array, False)
+      #       if self.m_frames.m_ihead_moves[i][0] < self.m_frames.m_ihead_moves[i][1]:
+      #         ihead_move_item.setPen(QPen(Qt.blue))
+      #       else:
+      #         ihead_move_item.setPen(QPen(Qt.red))
+      #       ihead_move_item.show()
+      #     if self.m_current_ihead_move < old_ihead_move:
+      #       for i in xrange(self.m_current_ihead_move, old_ihead_move):
+      #         self.m_ihead_move_items[i].hide()
+      #     pass
+
+
+
+
+
       if self.m_frames.m_tasks_info is not None:
         self.m_current_tasks = self.m_frames.m_tasks_info[frame_number]
         # Update tasks_item.
 
-      if self.m_frames.m_ihead_info is not None:
-        self.m_current_ihead = self.m_frames.m_ihead_info[frame_number]
-        if len(head_circle_pts) < self.m_current_ihead:
-          self.m_current_ihead = -1
-        self.m_ihead_item.setX(head_circle_pts[self.m_current_ihead][0])
-        self.m_ihead_item.setY(head_circle_pts[self.m_current_ihead][1])
-        self.m_ihead_item.show()
+      #if self.m_frames.m_ihead_info is not None:
+      #  self.m_current_ihead = self.m_frames.m_ihead_info[frame_number]
+      #  if len(head_circle_pts) < self.m_current_ihead:
+      #    self.m_current_ihead = -1
+      #  self.m_ihead_item.setX(head_circle_pts[self.m_current_ihead][0])
+      #  self.m_ihead_item.setY(head_circle_pts[self.m_current_ihead][1])
+      #  self.m_ihead_item.show()
 
-      if self.m_frames.m_rhead_info is not None:
-        self.m_current_rhead = self.m_frames.m_rhead_info[frame_number]
-        if len(head_circle_pts) <= self.m_current_rhead:
-          self.m_current_rhead = -1
-        self.m_rhead_item.setX(head_circle_pts[self.m_current_rhead][0])
-        self.m_rhead_item.setY(head_circle_pts[self.m_current_rhead][1])
-        self.m_rhead_item.show()
-        # Update changed rhead_item.
+      #if self.m_frames.m_rhead_info is not None:
+      #  self.m_current_rhead = self.m_frames.m_rhead_info[frame_number]
+      #  if len(head_circle_pts) <= self.m_current_rhead:
+      #    self.m_current_rhead = -1
+      #  self.m_rhead_item.setX(head_circle_pts[self.m_current_rhead][0])
+      #  self.m_rhead_item.setY(head_circle_pts[self.m_current_rhead][1])
+      #  self.m_rhead_item.show()
+      #  # Update changed rhead_item.
 
-      if self.m_frames.m_whead_info is not None:
-        self.m_current_whead = self.m_frames.m_whead_info[frame_number]
-        if len(head_circle_pts) <= self.m_current_whead:
-          self.m_current_whead = -1
-        self.m_whead_item.setX(head_circle_pts[self.m_current_whead][0])
-        self.m_whead_item.setY(head_circle_pts[self.m_current_whead][1])
-        self.m_whead_item.show()
-        # Update changed whead_item.
+      #if self.m_frames.m_whead_info is not None:
+      #  self.m_current_whead = self.m_frames.m_whead_info[frame_number]
+      #  if len(head_circle_pts) <= self.m_current_whead:
+      #    self.m_current_whead = -1
+      #  self.m_whead_item.setX(head_circle_pts[self.m_current_whead][0])
+      #  self.m_whead_item.setY(head_circle_pts[self.m_current_whead][1])
+      #  self.m_whead_item.show()
+      #  # Update changed whead_item.
 
-      if self.m_frames.m_fhead_info is not None:
-        self.m_current_fhead = self.m_frames.m_fhead_info[frame_number]
-        if len(head_circle_pts) <= self.m_current_fhead:
-          self.m_current_fhead = -1
-        self.m_fhead_item.setX(head_circle_pts[self.m_current_fhead][0])
-        self.m_fhead_item.setY(head_circle_pts[self.m_current_fhead][1])
-        self.m_fhead_item.show()
-        # Update changed fhead_item.
+      #if self.m_frames.m_fhead_info is not None:
+      #  self.m_current_fhead = self.m_frames.m_fhead_info[frame_number]
+      #  if len(head_circle_pts) <= self.m_current_fhead:
+      #    self.m_current_fhead = -1
+      #  self.m_fhead_item.setX(head_circle_pts[self.m_current_fhead][0])
+      #  self.m_fhead_item.setY(head_circle_pts[self.m_current_fhead][1])
+      #  self.m_fhead_item.show()
+      #  # Update changed fhead_item.
 
     self.m_canvas.update()

Modified: trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyPetriConfigureCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -1,5 +1,7 @@
 # -*- coding: utf-8 -*-
 
+from descr import descr
+
 from pyAvida import pyAvida
 from pyFreezeDialogCtrl import pyFreezeDialogCtrl
 from pyPetriConfigureView import pyPetriConfigureView
@@ -28,6 +30,7 @@
       pass
     
   def construct(self, session_mdl):
+    descr()
     self.m_session_mdl = session_mdl
     self.m_session_petri_view = pyPetriConfigureView()
     self.m_avida = None
@@ -60,6 +63,8 @@
     self.connect(self.m_session_mdl.m_session_mdtr, 
       PYSIGNAL("doEnablePetriDishSig"), self.EnablePetriConfigureSlot)
     self.connect(self.m_session_mdl.m_session_mdtr, 
+      PYSIGNAL("doInitializeAvidaPhaseSyncSig"), self.CreateFilesFromPetriSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr, 
       PYSIGNAL("doInitializeAvidaPhaseISig"), self.CreateFilesFromPetriSlot)
     self.connect(self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"), 
       self.setAvidaSlot)
@@ -76,6 +81,7 @@
     self.populated = False
     
   def destruct(self):
+    descr()
     self.m_session_petri_view = None
     self.m_avida = None
     self.full_petri_dict = {}
@@ -163,6 +169,7 @@
       self.StopAtSpinBox.setEnabled(True)
   
   def FillDishSlot(self, dish_name, petri_dict):
+    descr()
     
     self.full_petri_dict = petri_dict.dictionary
     settings_dict =  petri_dict.dictionary["SETTINGS"]
@@ -226,6 +233,7 @@
 
        
   def DisablePetriConfigureSlot(self):
+    descr()
 
     # Turn off the controls 
 
@@ -259,6 +267,7 @@
       PYSIGNAL("doDisablePetriDishSig"), ())
 
   def EnablePetriConfigureSlot(self):
+    descr()
 
     # Turn on the controls 
     
@@ -291,6 +300,7 @@
 
 
   def CreateFilesFromPetriSlot(self, out_dir = None):
+    descr()
 
     # The input files will be placed in a python generated temporary directory
     # ouput files will be stored in tmp_dir/output until the data is frozen
@@ -305,6 +315,7 @@
       PYSIGNAL("doInitializeAvidaPhaseIISig"), (os.path.join(self.m_session_mdl.m_tempdir, "genesis.avida"),))
       
   def Form2Dictionary(self):
+    descr()
     settings_dict = {}
     
     # Write START_CREATUREx for all the organisms in the Ancestor Combo Box
@@ -337,8 +348,8 @@
       settings_dict["DEATH_METHOD"] = 2
     return settings_dict
     
-  def FreezePetriSlot(self, population_dict = None, 
-      send_reset_signal = False, send_quit_signal = False):
+  def FreezePetriSlot(self, population_dict = None, send_reset_signal = False, send_quit_signal = False):
+    descr()
     tmp_dict = {}
     tmp_dict["SETTINGS"] = self.Form2Dictionary()
     m_pop_up_freezer_file_name = pyFreezeDialogCtrl()
@@ -385,6 +396,7 @@
 
 
   def doLoadPetriDishConfigFileSlot(self, genesisFileName = None):
+    descr()
     genesis = cGenesis()
     genesis.Open(cString(genesisFileName))
     if 0 == genesis.IsOpen():
@@ -407,6 +419,7 @@
       self.setAvidaSlot)
       
   def dropEvent( self, e ):
+    descr()
     freezer_item_name = QString()
     if ( QTextDrag.decode( e, freezer_item_name ) ) :
       if os.path.exists(str(freezer_item_name)) == False:
@@ -415,6 +428,7 @@
         self.emit(PYSIGNAL("petriDishDroppedInPopViewSig"), (e,))
 
   def petriDropped(self, e):
+    descr()
     # Try to decode to the data you understand...
     freezer_item_name = QString()
     if ( QTextDrag.decode( e, freezer_item_name ) and not self.DishDisabled) :

Modified: trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -8,6 +8,8 @@
 @kgn
 """
 
+from descr import *
+
 from AvidaCore import cConfig
 from AvidaCore import cInitFile, cString
 
@@ -158,6 +160,7 @@
     self.updateCellItems(True)
 
   def setDragSlot(self, org_clicked_on_item = None):
+    descr(org_clicked_on_item)
     if org_clicked_on_item:
       clicked_cell_num = org_clicked_on_item.m_population_cell.GetID()
       clicked_cell = self.m_avida.m_population.GetCell(int(clicked_cell_num))
@@ -325,4 +328,5 @@
     def __init__(self, item_name, parent=None, name=None):
         QStoredDrag.__init__(self, 'item name (QString)', parent, name)
         self.setText(item_name)
+        descr(item_name)
 

Modified: trunk/source/python/AvidaGui2/pySessionCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pySessionCtrl.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pySessionCtrl.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -106,6 +106,11 @@
 
     self.connect(
       self.m_session_mdl.m_session_mdtr,
+      PYSIGNAL("doSyncSig"),
+      self.doSync)
+
+    self.connect(
+      self.m_session_mdl.m_session_mdtr,
       PYSIGNAL("doStartSig"),
       self.doStart)
 
@@ -197,6 +202,12 @@
     self.m_session_mdl.m_main_mdl.m_main_mdtr.m_main_controller_factory_mdtr.emit(
       qt.PYSIGNAL("deleteControllerSig"), (self,))
 
+  def doSync(self):
+    self.m_session_mdl.m_session_mdtr.emit(
+      PYSIGNAL("doInitializeAvidaPhaseSyncSig"),
+      (self.m_session_mdl.m_tempdir,))
+    self.m_avida.m_avida_thread_mdtr.emit(PYSIGNAL("AvidaUpdatedSig"), ())
+
   def doStart(self):
     if self.sessionInitialized == False:
       self.m_session_mdl.m_session_mdtr.emit(

Modified: trunk/source/python/AvidaGui2/pyTemporaryReloads.py
===================================================================
--- trunk/source/python/AvidaGui2/pyTemporaryReloads.py	2005-10-16 19:25:00 UTC (rev 348)
+++ trunk/source/python/AvidaGui2/pyTemporaryReloads.py	2005-10-18 19:11:59 UTC (rev 349)
@@ -64,6 +64,8 @@
   "AvidaGui2.pyMapProfile",
   "AvidaGui2.pyNavBarView",
   "AvidaGui2.pyNavBarCtrl",
+  "AvidaGui2.pyOrganismConfigureView",
+  "AvidaGui2.pyOrganismConfigureCtrl",
   "AvidaGui2.pyOrganismScopeView",
   "AvidaGui2.pyOrganismScopeCtrl",
   "AvidaGui2.pyPetriConfigureView",




More information about the Avida-cvs mailing list