[Avida-cvs] [avida-svn] r799 - branches/developers/avida-edward/source/python/AvidaGui2

avidaedward@myxo.css.msu.edu avidaedward at myxo.css.msu.edu
Wed Jul 5 07:40:31 PDT 2006


Author: avidaedward
Date: 2006-07-05 10:40:31 -0400 (Wed, 05 Jul 2006)
New Revision: 799

Added:
   branches/developers/avida-edward/source/python/AvidaGui2/next_step.png
   branches/developers/avida-edward/source/python/AvidaGui2/previous_step.png
   branches/developers/avida-edward/source/python/AvidaGui2/pyTaskDescriptionCtrl.py
Modified:
   branches/developers/avida-edward/source/python/AvidaGui2/pyAnalyzeControlsView.ui
   branches/developers/avida-edward/source/python/AvidaGui2/pyBufferView.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareCPUTrace.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareTracer.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyInstructionDescriptionCtrl.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismDataCtrl.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py
   branches/developers/avida-edward/source/python/AvidaGui2/to-do_list
Log:

Additions to organism viewer:
- mutations. added in test cpu, mutation-rate is hard wired, mutated
  instructions displayed with a green ring.
- task counts.
- current instruction description.
- next-step and previous-step controls.



Added: branches/developers/avida-edward/source/python/AvidaGui2/next_step.png
===================================================================
(Binary files differ)


Property changes on: branches/developers/avida-edward/source/python/AvidaGui2/next_step.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: branches/developers/avida-edward/source/python/AvidaGui2/previous_step.png
===================================================================
(Binary files differ)


Property changes on: branches/developers/avida-edward/source/python/AvidaGui2/previous_step.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyAnalyzeControlsView.ui
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyAnalyzeControlsView.ui	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyAnalyzeControlsView.ui	2006-07-05 14:40:31 UTC (rev 799)
@@ -8,8 +8,8 @@
         <rect>
             <x>0</x>
             <y>0</y>
-            <width>124</width>
-            <height>40</height>
+            <width>387</width>
+            <height>51</height>
         </rect>
     </property>
     <property name="caption">
@@ -37,7 +37,7 @@
             </property>
             <property name="sizeHint">
                 <size>
-                    <width>20</width>
+                    <width>90</width>
                     <height>20</height>
                 </size>
             </property>
@@ -56,6 +56,17 @@
                 <string>Go to beginning of movie</string>
             </property>
         </widget>
+        <widget class="QToolButton">
+            <property name="name">
+                <cstring>m_prev_btn</cstring>
+            </property>
+            <property name="text">
+                <string></string>
+            </property>
+            <property name="iconSet">
+                <iconset>image1</iconset>
+            </property>
+        </widget>
         <widget class="QWidgetStack">
             <property name="name">
                 <cstring>m_widget_stack</cstring>
@@ -85,7 +96,7 @@
                             <string></string>
                         </property>
                         <property name="iconSet">
-                            <iconset>image1</iconset>
+                            <iconset>image2</iconset>
                         </property>
                         <property name="usesBigPixmap">
                             <bool>false</bool>
@@ -121,7 +132,7 @@
                             <string></string>
                         </property>
                         <property name="iconSet">
-                            <iconset>image2</iconset>
+                            <iconset>image3</iconset>
                         </property>
                         <property name="usesBigPixmap">
                             <bool>false</bool>
@@ -135,13 +146,24 @@
         </widget>
         <widget class="QToolButton">
             <property name="name">
+                <cstring>m_next_btn</cstring>
+            </property>
+            <property name="text">
+                <string></string>
+            </property>
+            <property name="iconSet">
+                <iconset>image4</iconset>
+            </property>
+        </widget>
+        <widget class="QToolButton">
+            <property name="name">
                 <cstring>m_cue_btn</cstring>
             </property>
             <property name="text">
                 <string></string>
             </property>
             <property name="iconSet">
-                <iconset>image3</iconset>
+                <iconset>image5</iconset>
             </property>
             <property name="toolTip" stdset="0">
                 <string>Go to end of movie</string>
@@ -159,7 +181,7 @@
             </property>
             <property name="sizeHint">
                 <size>
-                    <width>20</width>
+                    <width>80</width>
                     <height>20</height>
                 </size>
             </property>
@@ -171,12 +193,18 @@
         <data format="PNG" length="1172">89504e470d0a1a0a0000000d4948445200000021000000140806000000035354710000045b49444154789cad564b6c1357143df7be373f7ba8ddb148e260acaa2109b2e2e0b820542155c0a65d56ac0a59b57ba46e4a37d9259b4aecd8b040d065975d16ba682a51ea4a54842016c456a850a82527b16a2776eccce775318e630707f5932b1dcd7b67e6dd3973de7d57434a29ec0511c501c400d8000c0084a30b05a00d601b404d29f557f7bd4a299c3d7b56ab56aba39393931f2712894b86617c20a57c0f807684225ccff3fe68b7dbbf6f6e6efef4e2c58bfb8ee3fcf9f8f163570280655927cf9f3fff793a9dfe223b951d3d357e0ac99124a49447a6c0f77dad5c2e8f974aa5f1a7cb4f3f8ac7e327d7d6d6ee0158a5ab57af0e6b9af6593299fcfaf2a5cbc96c368bd0b9a3dc89fe585e5ec6831f1f94373636be715df73b994aa592f57afde274763a393d7da647c0ff1511d61af5cd0062422693c14a7125d968342e0e0f0fffcc8ee38c10d1ccc4e4248420b0101082c182207a50ad6ef4cddfc693206c56ab108241428084000b0162861002aee7626464044434e338ce08271289e341109c48a552606608663089f0da83f98585be3933a350280ce47f2b14b0303f0fa67d4e10410801c1028d4603f177e3088!
 2e0442291382ee3f1b80d40ea520351c73ceef1af13ed761b4c0200b0bbbb8b7bdfdec3e2e22222d1c8e1bc1080ea6c2f03cc8cfa561df57a1d966901808cc7e3b68cc562510060c1fb220604118105a35c2ee3e6cd9b78fdfa35886830cf212fa4e8ae0f8200b57a0d954a05420830310020168b45a56ddb76af0805054298e44023c3c35f1ee2ce9d3b68b55add8a1bc42ba51004015aad167ccfc7aebb8b46a38156ab05c102d294dddcb66ddb321a8d1e0342ab42d7184a29ec349bd8da6e7445b45a6dacafaf63676707aeeb767921e41b7c10046066acafaf4329157e18110cc308ddeee900d168f4988c4422f69e08220a6dabd5d06c36fb0f9c0a70e1c205a45229dcbe7d1bd56af5509e88c0cc304c23746b2f070042e8f65ecd4522119b4dd30c9d200681b0bdbd0ddff76159561f8410b02c0ba74f9fc6c2c202b2d96c58ed87f0cc0cd330611a268c0ec2b1118e4d1300609ae631d6753dc2cc811ff8f07c17208265599d87f72184e88e138904e6e6e670e5ca957fc41f84d9c9c7cc81aeeb11a9ebfa96e338cdb5b5357b7474146677dffa5bf78daf6ec0d08dbe2d9abd368bdc99dc1bfcb56bb33893cbc130f4fea3be570f00cae5321cc769eababe25354d2b8d8d8d359f3f7f6ea7d3e903c7743fc34c3e8741319827e46766a054f8de41512c16313636d6d!
 434adc44454c8e7f33babababeed2d212a4943dd0fe23c2f59a260fe40bf1e!
 4c913bc7
cf9d2cde7f33b445490d168f47e2693b95babd5be7cf4e8d13b954a454c4d4d219d4e434af9d606f66fc2f33cbc7af50acf9e3d43a954f2cf9d3bb79dc964eeeaba7e9f3a4d63c8f3bcebc562f1fad2d292b9b2b2222b958af03cef480400809412434343fec4c48497cbe55ae3e3e3b7a494b70054a8b72b02f83408824f88e84300efe388ffac00ac2aa57e65e61f007cbf77e36fdd28b386ae3295220000000049454e44ae426082</data>
     </image>
     <image name="image1">
+        <data format="PNG" length="1131">89504e470d0a1a0a0000000d4948445200000021000000140806000000035354710000043249444154789cad563b4c2357143df7bd371fdb43ec8cb58059af158535200bb3e080508414ed6e93942943b6daf42ba5c9a6a10b4d24ba2da0404bca141429032942280805112c0824b0051182583260c5061b9bf9bc14831db3b1919270a4ab77463373ef99f3debd1a9252a206220a0108023000680008770709a00ae00240414af967bdae9412c3c3c34a3e9fefeaededfd381c0e3fd134ed0321c47b00943b1461d9b6fd7bb55afdedececece7dddddd05d334ff585b5bb30400f87cbe07a3a3a3cf63b1d817c9fe64d7c3f843443a231042dc9902c771946c361bcf6432f1379b6f3e0a85420f8e8e8ee600ecd3f8f87887a2289f452291af9f3e791a492693f09cbbcb9db889cdcd4d2cfeb4983d3d3dfdd6b2acef45341a8d148bc5c703c981c8c0c0a30601ff578477d6e8c615408c904824b097de8b944aa5c71d1d1dbf30d3343b8968a8a7b7179c1318e7e09c817102bf25f2f9d3ebe7590beee521ce419c83710e620c9c7358b685cece4e10d190699a9d2c1c0edf735df77e341a05630c9c3130e2deda22565757f1cde4241879d7ad787d650c9c089c7370c6512a95107a3704d775ef87c3e17b22140a1900842!
 a14105d9bc71afc6bc0d5d515e6be9bc3d2d212fc013f18e78094a856ab4d3918f35610c000c6188ae745148b45f8741f0088502864886030180000c6d9df229a209bcd626a6a0ac7c7c720221011b8e0de3eb7e08d705d17856201b95c0e9c7330620080603018108661188d222424085e91da205b5e5ec6ecec2c2a954afda411112a950a1cdb69c9b9e0706c0757d6154aa5122a950a38e310baa8e7360cc3108140a00df0acf25c639052e2b25cc6f945090070727282cbcb4b589655ff32ce054e4e4e20a544a5526dca6b1f22e1714dd33cb71b2640201068137ebfdfa8892022cfb64201e572b95e706c6c0cd16814333333c8e7f35ecb49179aaeddca6b686c5382e776edccf9fd7e43e8baee3971bd47171717701c073e9fef46a2bebe3e4c4e4e627a7a1a3b3b3be09c43d7f46b579af356681c85baaeb7095555fd8c31d7711d26a50b10fd43400d9aa661626202f3f3f3585c5c84a669f5c2cdf86db06d1b8c31575555bf5055f5dc34cdf2d1d191d1d5d505bdbe6fad47f7b3cf9f61f0d120344d0524f0f2ab974d3908375bbd761ee0759b699a655555cf85a22899eeeeeef2f6f6b6118bc5de6ad326c3e21a43a9c15bb897434aaf6e33a4d369747777971545c930225a4da55297fbfbfbd6c6c60684100da1fcc7f0de5714f1563e2fd6d7d771707060a552a!
 94b225a15814060219148bc2e140a5faeacacbc93cbe5787f7f3f62b118841!
 0b70eb07
f03dbb671787888adad2d643219676464e4229148bc56557581ae8746bb6ddb2fd2e9f48b8d8d0d7d6f6f4fe472396edbf69d0800002104dadbdb9d9e9e1e7b7070b0128fc75f09215e01c851e3ef1d804f5dd7fd84883e04f03eeef8cf0ac0be94f257c6d88f007ea8ddf80b8136b752602c4bed0000000049454e44ae426082</data>
+    </image>
+    <image name="image2">
         <data format="PNG" length="2819">89504e470d0a1a0a0000000d49484452000000270000002708060000008ca3513500000aca49444154789cad585b6c54c719fee6b2678fb35edb7bf72e1b630c066ce36217c9769c98c4984bb924d0280d9522f5258887f6a14ff4ad804823a57da70f1195a24a488da8d2aa54752b27109404e2a81482afd81bdf646cb3b677f7acedbd9cbd4c1fced9b3c7c6c6d074a4d1ce39fbcfcc37dffffd33ff192284c0f31642880cc006e0050032002b000e8001c801c802480348014800581142a49e7b9e67054708a165656515b22c3baaaaaa76f9fdfee6d2d2d25d9224d570ce8394521721c4268458c9e7f38bd96c765a55d5b1e5e5e587b3b3b3f7a6a6a61ea652a9683c1e8f0921f2ff3770757575ae743aedaeafafff91c3e178c5ed72bf5c5555e50f0402f0783d70395db0dbedb05aad48a7d3585a5ac2626411f3e179cccccc606a6a6a766171e1ab6834fae5e0e0e03fad56ebc2d0d0d0e2f702d7dede5eb2b2b252b975ebd6430e87e358cdb66d4777edde2dedacdd89ca4a9f66240840048400080001024204b4274040e0f1dc638c8e8e607878581d1b1fef8e46a3ff989c9cecb1d96c73b76fdf4e3e37b8cecece8a4c26b3a5babafa4c201078aba9a929b877ef5e382a1c9b2d78c3128d46f1ed836f71fffef!
 de99999993f4f4c4c5cb1582c8f6edebc197b66706fbef9a68b52fa03bbdd7eb6beaefe744b6b0bd9595b8b021b00607423021004c4f84b40143814d0fa10c0300730323a82dede6fc4d0d0e0c74b4b4b1fe6f3f9079f7cf2c9136e7e02dc9933679caaaafe5092a45f3437359feae8e880d7e32df8cc3451e1410084c0f0a410103a52ed51ffdfbc2802cc87c3f8e2cb2f70efdebdbfaaaa7a5992a4ff5cb9722562c642cd0fe7ce9db371ce6b64593edbdcdc7ceac08103f0fabc452b7d06420042c8aa5f1895184dcd560756e84b357bafcf87aece03686e6e3e25cbf259ce79cdb973e76c663c7c0d93db28a5ef6edfbefdadfd1dfbe1743acd9e5cbf98911496bb518c1511030270389dd8dfb11fc944f2adb1f1b145009701f49b8702005cbc783198cbe58e959797bfd1d6d6467c3e9fb16a02a233b441c506ed67b0f7f97c687ba98dd86cb63772b9dcb18b172f065781bb76ed1ab3d96cdb3299cca1a6bd4d81ddbb7769ee21042054d3342145b799dad0db6637638d9b6102661ea35077eedc899a6d35814c2673c866b36dbb76ed1a33c0298a52a528ca09afd7bbbfa9b9190005d53b52bd82105042914a26f0c16f3fc077a1ef4009f45a5800d5fb5053356b938090e2d884009431acacac20f8621076bb7dbfa228271445a93234c718ab4a2412fb9a9a9a2497c!
 bb546260202b4282542d1dfdf8ffefe7ed4d737e0f4db3fc18eda5a10503da!
 08d8dc40
8706a122531629d18a32e2e2cc26eb723180c4aa150681f63ac0ac0386b686870c662b1a34b4b4b6f1fecea7aa1cc5ea6ad8aaeaf9f6c368beb7fbb0e028285f9797cfef92d0c3f1c46c01f80d3e532b1b2b6e289778c334463512c46164129856495303131516eb7db43939393235492a44a4551f604b7045dfec0165d174f02c3869a0206070771e1e205bcfffe6f301a0aadb22d6e35ab8132ce914824100e87c1180563142ea70b4ea7d3a528ca1e49922aa92ccbbe4422511d7c31b84a0b05408541a9ae17523c0a9e28838383b870e13cde7bef1242a1ef56e9ccd02325608c6169298ee9e969e4f37930c6412905650c1eaf178944a25a96651fb5582c95a9542ae0aff41ba08c60a0ebbb47df5c8aecae690f0f0de3fcf9f3b874e9124643a39a0ba9c68e1002f38b0b9879f408799107e73a30cac02885cbe9442a950a582c964a2e4992535555b7dbebd1424f4097b0281c8bbab88511104f9047d66f0f0d0fe1fcf9f3a8afabc3dba74fc3e7f321aec49156d3a08cadeb0587c3015555dd922439b9d56a7564b3597b4559b9b1250800446871a5b1a9c79c80b6ad3cad082d6285d06a3e9fc7bdfbf7f1efbb7751535383e3c78f63fbf6eda6a35a8f5f220001949696229bcddaad56ab8372ce4b73b99c5596ad8670a92e746a885ed721d5a218d00ef45c368b4c26!
 035555914ea7914aa5904c25914aa5904ea7914ea791c96490cbe50000e3e3e3b87cf932eedebd0bc63938e7609c8133064e3938e328297901b95cceca392fe5922411c6585a553356b94446219f281044f4739250824c2683a5f8125455453e9fc36649b4d96d9452b4b4b4e0c89123f079bd284c5048520bb4a755158cb1b424498473ce55599693f178dc2a9794e8dad2c009210ca65656125094181445413e9f5fb580a7154a295a5b5b71ece831b8bd1eac5d9149cd00806432095996939c739573ce15bbddbe3cbf305fe1abf4a1108980006514d94c168aa22099d4b26949929eba9d9841b5b5b5e1f8f1e3f0783c9baf422ff1781c76bb7d9973ae708bc51276b95cf1b9b9393436361657442872b91c623105aaaa82736e4cfa34709452bcd4d686e3274e68b9a0418a916eea191329669e26e62291085c2e57dc62b18439636c7acb962df1a9a9298331420872f93c144581103958248bae3d01cef8bae028a578a9bd1d27df38098fdb055386ae47b09ebde8221320850035b62d08606e6e0e5bb76e8d33c6a6392124545b5b3bfbe0c183e4cceca392c0162d9d4a2412c6eead0daa81606bf6274a29dadbdb71f2e44978bc9e2213620d3883b82283664e0501c2738f118bc592070f1e9c25848478201098b2582cdf783c9e7d03038355c1e08b48a7d3c866b3b0!
 582c4f30c438d34f0f8a8e8e0e0dd47368ea6965341482d7eb9df7fbfddf78!
 3c9ea942
ca74b7a1a121d6dbdb1bdcb76f1f9565198cf37533744992d0d9d98953a74e6d0a4adbcc51dcd89f621b8944303a3a9a6f6f6f8f31c6ee02c5af2faba228ef5dbd7af5677ebfdff7da6baf1507df7476f367df663dc46a2b53ffcf3efd14f3f3f38fdf79e79d3f969797ff1a40baf00d9106d0d3d2d2f278646424f5f0e1433046c119036514945130c6c0f436a5da33e50c8c317046c12803651c94323dc328f661857794835106ae27018c6b638d8e8c606c6c2cd5d2d2f218408f8ea7f8f5555e5ede53575777757676f69777eedc09b83d6ef82bfdc0aa2dd24c80b664233684d06e266066b2101ce68d76759e3c3b3787dbb76fa3bebe3e52575777d566b3f514a659f5ddca18fbb8ababebef1e8f2772e3b31b8846a37a2ab3a63266a4401a235a2ea63154b42ba44245167526758f446331dcb871031e8f27d2d5d5f577c6d8c7663cabc0c9b23c4908f9e8f0e1c37724498a777777231c7eac4dc8340085bcab00929a5d4ff567b35b69d14673b1f63e1c0ea3bbbb1b9224c50f1f3e7c8710f2912ccb93663cebde95a452a9cee5e5e55ff5f4f4bc120e874b5f7df555ecd9b3c7ace9ef55fafbfb71ebd62d78bddee543870e7d595a5afa3b59966faeb5dbf096299bcdbe2c84f8f9cd9b375fefebeb2ba9adade56d6dad70b9dd28dc7c08b3e69ea12c2c2ce0ebafbfc!
 6e8e868b6b1b131d9d9d9799d10f27bcef957ebd96f76795893cd66df0d8542677b7b7bede170586a6868208d8d8d0806836b4c4dc7c86aed637a7a1a7d7d7d181818105eaf576d6d6d5ddab163c7879cf33f0018db68f267bad9cce5723f06f0d3818181d7fbfafaf8c4c404733a9db4baba1a8140005eaf17151515906519a9540ab1580ce17018333333989898402412c9575757e71a1b1bb30d0d0dd701fc8931f697cde67de63b610025b95cee7542c891c5c5c5a3636363eea9a929323b3b4b171616483c1e27a9540ab22ca3acac4cb8dd6ee1f7fbf3555555a2a6a666c1e572750b21fec518bb0e60c3dbccff159cb9ec02d00a60af10a20ec036005e0076004b00c200c609214300be05d00be0e1f34ef25f67ef2763415fa3160000000049454e44ae426082</data>
     </image>
-    <image name="image2">
+    <image name="image3">
         <data format="PNG" length="2611">89504e470d0a1a0a0000000d49484452000000270000002708060000008ca35135000009fa49444154789cad585b6c1bc7153df3e072558a92f816699a9694c8b624ab966440569dd8812cd86d82244883002d90cf18fe683ffae57efbbbffe947e002f9b1d140455a2041d540a88dbcec2840e238b2ec5812649990f5a0f85a4ae263c9dde9c73eb87a5096db5e62c059ee9db967ee3d73e772881002cf2b8410198007c0cf00c800dc0038000640035003500150065004b02584283fb79d83822384d09696963659967d8944e258341a1d6c6e6e3e26495217e73c4e290d10423c42882d5dd733b55a6d4955d585cdcdcd472b2b2b7793c9e4a372b99c2b140a792184fe7f03d7d3d313a8542ac1dedede5ff97cbe978381e04b8944221a8bc5100a8710f007e0f57ae176bb51a954b0b1b1814c3683f5d43a969797914c2657d299f4d7b95ceeab070f1efccbed76a71f3e7c98f99fc09d3973a6696b6babfdc89123177c3edf6b5d9d9daf1e3b7e5c3ada7d14eded1143491080080801100002048408184f8080c0daea1ae6e666f1d34f3fa90b8f1f4fe472b97f3e79f264d2e3f1acdebe7dbbf4dce0464747dbaad5eaa18e8e8e4bb158ec9d818181f8c99327e16bf33d6bc10d2597cbe1de8ff7f0c30f3f2c2d2f2ff!
 f6d7171f19acbe57a7aebd6adfc81c1bdfdf6db014ae9cfbd5eefe5de9ededf0c9f1e2647bbbb61790300ec6144008280d8af0484e54301630c016c7500b373b3989afa563c7cf8e0a38d8d8d0f745dfff1e38f3fde15e65de02e5dbae45755754892a4df0f0e0cbe75f6ec598443612b660e43d6830008811d4921204ca4c6a3f9deb92802aca752f8f2ab2f71f7eedd7fa8aafabe2449df5fbb762debc4429d0f57ae5cf170cebb6459be3c3838f8d6f9f3e7118e84eb5aa605420042c8b66fd88dd85d43d704668da5867e3812c1d8e8790c0e0ebe25cbf265ce79d7952b573c4e3c7c87273b29a5efbdf0c20bef9c3b7b0e7ebfdf19c9bdc589c45a6ea33d56470c08c0e7f7e3dcd97328154bef2c3c5ec800781fc07de7540080ab57afc6354d7badb5b5f5cd919111128944ec551310d3430d1a1af40fa01f894430f28b11e2f178ded434edb5ab57afc6b7811b1f1f671e8fa7b35aad5e183839103b7efc98111e4200420d4e13520f9ba30fb3ef0c337684190e60ce39ac76f4e851747576c5aad5ea058fc7d3393e3ece6c708aa2241445793d1c0e9f1b181c044041cd81d46c2004945050d3a8d5a766df0048cd31d4d19cdc2420a43e372100650c5b5b5b881f8ec3ebf59e5314e57545511236e718638962b1786a6060400a04023b682220406d2abdfbeebb7bd2e!
 9faf51be686160d756e5cbf0162ef7562cf9a4967e0f57a118fc7a5f9f9f95!
 38cb1048
0c7747c7cdc5f2c168738e7033dc78fdb9ea294982bdceec5461fa777f7d680ed396b4ec619f28a8262a908c618e287e30030502c1687c6c7c7fd5492a47645514ec40fc503d1d8219317bb898d5d29637bb3e86771707773ce0730ce512c16914aa5c018056314017f007ebf3fa028ca094992daa92ccb9162b1d8113f1cdfc6050b109c5e23148d843838d658c78808630c1b1b052c2d2d41d77530c6412905650ca17018c562b14396e50875b95cede57239166d8fdaa0ec30d2bdd280c144fbe3f432753ceffc1002c628841058cfa4b1fcf42974a18373131865609422e0f7a35c2ec75c2e573b9724c9afaa6a30180e195b4f000035884b1c950684f1ca7114d55d62647eabbf57e216422093cda2a01450512ba08c19d1d9213e9f0faaaa062549f273b7dbedabd56adeb696563b2508004418fbcaf0a630003fa3f4134200c2f8b69aaeebd0751d9aa62193c9801002ceb9e3a836f72f31c6363737a356ab79dd6eb78f73ce9b354d73cbb2db3c5508a8e925fb24b2cf47233cb6614d836ef6d7d6d6a0eb1a344d47b95cae83758824490d5655efb2260e4dd3dc9cf3662e4912618c5554b5ea969be43aa7ac2899030925a856aba8556bd0740dbaaec169bb52a960679476868d51564762beb38a540b654555c118ab48924438e75c9565b9542814dc725393c92d039c!
 10c2e6d2d656118a92875a554da3641b182b547b81b2847206ecf0a683cd008052a90459964b9c739573ce15afd7bbb99e5e6f8bb44760ed444080328a5ab5064551502a19d534a57ba713ceeb054e23709cb13d7f774aa15080d7ebdde49c2bdce572a502814061757515fdfdfd0e03149aa6219f57a0aaaa6dbc9161c698590a897d7438006173dbae3c1d9ecb66b30804020597cb95e28cb1a543870e1592c9a4ed314208345d87a2281042834b7299dcdbcfb0056e9f05700662924c80581bd44e5b10c0eaea2a8e1c3952608c2d5142c87c7777f7cafafa7a6979e529402940088ac5a29dbdade38599b969afc6183374f87e3a14947150cac1280575cc4b19433a9d463e9f2f757777af1042e6792c164bba5cae6f43a1d0a99999078978fc302a950a6ab51a5c2ed7aed537e4d38138b7b3f0de2e73f3f30887c3ebd168f4db502894b44aa6effafafaf2535353f153a74e515996c11cbbcf29376edcd8d78053c748e6a827f67dc664b359cccdcde967ce9cc933c6be03cc62d3eff77f313434f4594b4bcbfad4d49491c54d57b3fd1a657648a81556c77bce181877f41d21dc39fedebd7bf0f97ceb4343439ff9fdfe2f6c70302e5d26878787d7666767cb8f1e3d0263d404687183999ca1a0d434621ba66094997c626685511fc3acdf2807a30c9c9a5ce3c65c73b3!
 b3585858280f0f0faf019834f1d4ff7db5b6b64ef6f4f45c5f5959f9c39d3b!
 7762c150
10d1f628b02d459a621dba02f5442c84713301e71f68f34938136dbd94000456565771fbf66df4f6f6667b7a7aae7b3c9e49cbccb68cca18fb686c6cecd3502894bdf9ef9bc8e5726629b3a331a3bc61a617ad5accf0505dcf2a85e8b6705ba1a5c8e5f3b879f32642a150766c6cec53c6d8474e3cdbc0c9b2fc8410f2e1c58b17ef489254989898402ab56618640600abeedace37338cd47c768695d6758c101bbfa752294c4c4c4092a4c2c58b17ef10423e9465f98913cf9e7725e57279747373f38f9393932fa752a9e6575e7905274e9c708474d790e792fbf7efe3f3cf3f47381cdebc70e1c257cdcdcd7f9265f9d64ebd86b74cb55aed2521c4ef6eddbaf5c6f4f474537777371f19398d403008abdc144ece1d40d2e934bef9e61bcccdcdd5fafbfb4ba3a3a39f1042fecc39ff7a2ffd675d1e76d56ab5f7e6e7e72f4f4d4d7953a994d4d7d747fafbfb118fc777a8927a7db59dfb585a5ac2f4f43466666644381c564f9f3ebdf1e28b2f7ec039ff0b808546c60f74b3a969daaf01fc766666e68de9e969beb8b8c8fc7e3fede8e8402c1643381c465b5b1b645946b95c463e9f472a95c2f2f23216171791cd66f58e8e0eadbfbfbfd6d7d7f70980bf32c6fefe2cbb07be1306d0a469da1b84905f6632995717161682c96492acacacd0743a4d0a85022997cb9065192!
 d2d2d22180c8a6834aa271209d1d5d5950e0402134288cf18639f0068789bf9df8273ca3100a7019c1442f400e8041006e005b0012005e03121e421807b00a6003c7a5e23ff01b479d2670f099ffb0000000049454e44ae426082</data>
     </image>
-    <image name="image3">
+    <image name="image4">
+        <data format="PNG" length="1160">89504e470d0a1a0a0000000d4948445200000021000000140806000000035354710000044f49444154789cad564d6c134714fede7bb33fb697da5d8b240ec18a1a924826491317847aa9804b7bac1087726c4f7040ea0152d12b5c7a46f44245af3df658e8a10a079a0315218803b1152a14626a6c531bdb89e3dd9d1e36719db0546a9b273dcdb7bb336fbe797f3ba4b5c68e10510a40128003c00240d83fd1003a009a00ea5aeb3f7bfb6aad71ecd831a356ab0d4f4e4e7e9c4ea74f5996f581526a1480b18f24ba9ee7fddee9747eab56abbf3c79f2e4b6ebbaebf7efdfef2a0088c562874f9c38f179369bfd627a6a7af8c8f811648632504aed1b03dff78d52a9345e2c16c71f2e3ffc28954a1d5e5b5bfb1ec02a9d3b776ed0308ccf3299cc57a74f9dce4c4f4f23f4dc7e4662b72c2f2fe3cecf774a954ae59b6eb7fb831a1919c9341a8d9333d333999999f7fb08fc5f1261aed1ae27809890cbe5b05258c9b45aad938383830becbaee1011cd4d4c4e4284c0221061b0102442abb56a24aed52a7be6324818240212018b80982122e87a5d0c0d0d8188e65cd71de2743a7d300882432323236066083398241cfb95c2f1dad5ab91f8eab56b585c5cdcb5a6df86104144202c68b55a48bd9b42100487d2e9f4414ea!
 5520e00652a034c121a15dec67d2ae1d8d9ea44e34e07376e7c8b9b37bf83d7f5c38390849b13834560288566ab8946a381981d0300954aa51c954c261300c0c2207a7b1e101374a041441025919888b0b0b08062b1884b972e21339ce9d90c8200f5461de5721922e1610120994c26d8711c6787040b8384c0c21025bd772c8ccdcd4db030822088c444d4cbe7e7ebcf71e5eb2bb87b7701ad660baf5ebdc2fafa3a2a950a8405b66dc330c316e4388ea31289c401006066800006436b8d8d761baf9bad9e273636da88c5e2e8743a78f9f2e51b7873b383adadadbf6b436bbc78f107aab52a34424f59961592edeb008944e2808ac7e3ce0e09220add56afa3dd6eef0a87655bf07d0fcc1c89b50eb0f30b705d17e7cf9fc7e8e82840bbcb9440d0d0bd9a8dc7e38eb26d3bf4c4768c9acd267cdf472c168bcc0d66866dd96f601181882097cbe1c2850bd88e72a4f4b742dbb60f28d334e3cc1cf881cf5a0700d15b09ec6c665956243e73e60cce9e3dfbd6b5fde2791e9839304d33ae4cd37cedba6e7b6d6dcd191e1e86dd8bdb9ed64d1ad084cbf3f3b02cf30d3c7f791e478f1e8d38b1eeb341bd30944a25b8aedb364df3b5320ca3383636d67efcf8b193cd66f794a9c65ec9cfcd46e2b9fc6cdfacd086d6e1be51522814303636d6360ca3c844b498cfe737565757bb4!
 b4b4b504af5a9f11f355c6f186a8fbd501f3c7880a74f9f76f3f9fc06112da!
 a4422713
b97cbddaad7eb5fdebb77ef9d72b92c535353c866b3504afd6303fb37e2791e9e3d7b86478f1ea1582cfac78f1f6fe672b95ba669dea6edb21af03cef62a150b8b8b4b464afacaca872b92c9ee7ed0b0100504a616060c09f9898f066676737c7c7c7af2ba5ae032853fff50ec0a741107c42441f02780ffb7cb302b0aab5fe95997f02f0e3ce87bf005c82a3d579ecbe300000000049454e44ae426082</data>
+    </image>
+    <image name="image5">
         <data format="PNG" length="1176">89504e470d0a1a0a0000000d4948445200000021000000140806000000035354710000045f49444154789cad564d6c135710fe66e6ed8feda576d6228943b0aa86249249d2c405a10aa9225cda63853894637be380d403a4a2f406979e11bd50d16b8f3d167aa88228cd818a10c481d80a150a71e338061b3bc4f1eebe1e16071b1c54d18cf469f77dab37f3edccbcd123ad355a4644090071000e000b0061f74c036800a801a868ad9f6dc7d55ae3d0a14346b95c1e181d1dfd34994c4e5b96f59152ea7d00c62e8a687a9ef777a3d1f86b7d7dfdf7870f1f5e775d77e5ce9d3b4d0500914864ff912347be4ca7d35f8d8f8d0f1c183e80547f0a4aa95d53e0fbbe51281486f3f9fcf0bd857b9f241289fdcbcbcb3f0158a253a74ef51986f1452a95fae6f8f4f1d4f8f838c2cced66253a6d616101377ebb5128954adf379bcd9fd5e0e060aa5aad1e9b189f484d4c7cd826e0ff8a087b8d3a5600312193c96031b798aad7ebc7fafafa66d975dd7e229a1a191d8508814520c26021481bcae552c7fa6d3c0961bd5c8608834440226011103344044daf89fefe7e10d194ebbafd9c4c26f70641b06f707010cc0c61069384cf365cbc74097373731ddc4ebc30e3d2c58b606ae38820221016d4eb75247a120882605f3299d!
 ccb8944c201a04c658049c28dc22fdf5fa1d168e0ca951f70f5ea8ff09afe5b79214163ab11669508420c1681a1146af51aaad52a2276040054229170381e8fc70084815b60ee5c0b83884044989d9dc585ef2e60b5b8ba33af425e94400c053104c4844ab582d5d55588084cc30400c4e3f1183b8ee3b48b2021b03044c91b225afdfa64e509ce7f7b1eb7feb8d595bf797316411060737313f55a1d4f9f3ec5caca0a4aa5128405b66dc330c311e4388ea362b1d81e006066800006436b8d171b1b785eab6ff7fae666035b5b5baf7a5f6bacadad75e5fff967158d46036b6b6bd05a4343838860595628ba6d02c462b13d1c8d469d9608610100542a153cab54e0fbde36b40e42875aa3a7a70767cf9ec5d1a347bbf2d3d3d3606658b6053b62231a892062dbb06c0b9665c1b44d9866588e6834ea28dbb6c34c1003006ab51a7cdf472412e938f5220211412693c1e9d3a7f1b28a3bf2cc0cdbb2779c20adf961dbf61e659a669499033ff059eb00207a43402bd889132770f2e4c9ffcc5b96d5550400789e07660e4cd38c2ad3349fbbaebbb1bcbcec0c0c0cc0deae5be7e89e39378383070fbee1ac1baf019c9b99816599af462500b4fa0140a15080ebba1ba6693e578661e4878686361e3c78e0a4d3e9504087bbd0a6b2935dffa83b4fc84e4d41eb306e37cbe572181!
 a1ada300c23cf443497cd665f2c2d2d35e7e7e7a1946a83f18e08f71b867ac!
 d5f88bb7
7efe2d1a347cd6c36fb8288e6542c16bb9ec964ae552a95af6fdfbefd5eb15894b1b131a4d36928a55ecbccbb9be77978fcf831eedfbf8f7c3eef1f3e7cb896c964ae99a6799d5edeac7a3dcf3b93cbe5cecccfcfdb8b8b8baa582c8ae779bb2200009452e8ededf5474646bcc9c9c9cde1e1e1cb4aa9cb008ad47ebd03f07910049f11d1c7003ec02edfac002c69adff64e65f01fcd2faf02f4d6ab00c1f4920a20000000049454e44ae426082</data>
     </image>
 </images>

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyBufferView.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyBufferView.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyBufferView.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -15,6 +15,7 @@
     self.setIndicatorHeight(5)
     self.setIndicatorWidth(5)
     self.setIndicatorBitCount(32)
+    self.setIndicatorColors(Qt.yellow, Qt.blue, Qt.darkGray, Qt.lightGray)
     self.setBits(0)
 
   def _updateSize(self):
@@ -23,6 +24,15 @@
     self.setMaximumSize(size)
     self.backing_store.resize(size)
 
+  def getIndicatorColor_OnFg(self):
+    return self.on_fg_color
+  def getIndicatorColor_OffFg(self):
+    return self.off_fg_color
+  def getIndicatorColor_EvenBg(self):
+    return self.even_bg_color
+  def getIndicatorColor_OddBg(self):
+    return self.odd_bg_color
+
   def getIndicatorHeight(self):
     return self.indicator_h
   def getIndicatorWidth(self):
@@ -30,6 +40,11 @@
   def getIndicatorBitCount(self):
     return self.indicator_bit_count
 
+  def setIndicatorColors(self, on_fg, off_fg, even_bg, odd_bg):
+    self.on_fg_color = on_fg
+    self.off_fg_color = off_fg
+    self.even_bg_color = even_bg
+    self.odd_bg_color = odd_bg
   def setIndicatorHeight(self, pixels):
     self.indicator_h = pixels
     self._updateSize()
@@ -44,11 +59,11 @@
     p = QPainter(self.backing_store)
     # fill rect with first color if bit_val is high, otherwise use
     # second color
-    p.setBrush(bit_val and Qt.yellow or Qt.blue)
+    p.setBrush(bit_val and self.getIndicatorColor_OnFg() or self.getIndicatorColor_OffFg())
     # alternate background colors, to help count bits visually.
     # do this by outlining odd bit number the fist color, and even the
     # second.
-    p.setPen(bit_no & 1 and Qt.lightGray or Qt.darkGray)
+    p.setPen(bit_no & 1 and self.getIndicatorColor_OddBg() or self.getIndicatorColor_EvenBg())
     p.drawRect(
       (self.getIndicatorBitCount() - bit_no - 1) * self.getIndicatorWidth(),
       0,
@@ -60,7 +75,7 @@
     if self.old_bits != bits:
       # hi is always 2^(current bit number)
       hi = 1
-      for i in xrange(32):
+      for i in xrange(self.getIndicatorBitCount()):
         self.setBit(i, hi & bits)
         hi = hi << 1
       self.old_bits = bits

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareCPUTrace.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareCPUTrace.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareCPUTrace.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -1,6 +1,5 @@
-from AvidaCore import cHardwareDefs
-from AvidaCore import cHardwareCPUDefs
-from AvidaCore import cHardwareCPU
+from AvidaCore import cEnvironment, cHardwareDefs, cHardwareCPUDefs, cHardwareCPU
+from descr import descr
 
 #class pyHardwareCPUFrame:
 #  def __init__(self):
@@ -30,6 +29,7 @@
     self.m_whead_info = []
     self.m_fhead_info = []
     self.m_tasks_info = []
+    self.m_task_names = []
     self.m_register_ax_info = []
     self.m_register_bx_info = []
     self.m_register_cx_info = []
@@ -75,6 +75,8 @@
     self.m_register_cx_info.append(hardware.GetRegister(cHardwareCPUDefs.s_REG_CX))
     self.m_read_label_info.append(hardware.GetReadLabel().AsString().GetData())
 
+    #descr("self.m_last_copied_instruction", self.m_last_copied_instruction)
+    #descr("hardware.GetMemory().GetSize()", hardware.GetMemory().GetSize())
     self.m_last_copied_instruction = max(
       [hardware.GetMemory().GetFlagCopied(i) and i or self.m_last_copied_instruction \
       for i in xrange(self.m_last_copied_instruction, hardware.GetMemory().GetSize())]
@@ -91,16 +93,17 @@
     self.m_ihead_moves_snapshot.append(self.m_ihead_moves_counts.copy())
     self.m_ihead_moves_info.append(len(self.m_ihead_moves))
 
+  def recordTaskNames(self, environment):
+    #for i in range(phenotype.GetEnvironment().GetTaskLib().GetSize()):
+    #  self.m_task_names.append(phenotype.GetEnvironment().GetTaskLib().GetTask(i).GetName())
+    for i in range(environment.GetTaskLib().GetSize()):
+      self.m_task_names.append(environment.GetTaskLib().GetTask(i).GetName())
+
   def recordGenotypeSummary(self, analyze_genotype):
-    print "pyHardwareCPUTrace.recordGenotypeSummary() ..."
     self.m_is_viable = analyze_genotype.GetViable()
     self.m_gestation_time = analyze_genotype.GetGestTime()
     self.m_fitness = analyze_genotype.GetFitness()
     self.m_size = analyze_genotype.GetLength()
     if not self.m_is_viable:
       self.m_gestation_time = len(self.m_genome_info)
-    print "  self.m_is_viable", self.m_is_viable
-    print "  self.m_gestation_time", self.m_gestation_time
-    print "  self.m_fitness", self.m_fitness
-    print "  self.m_size", self.m_size
 

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareTracer.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareTracer.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyHardwareTracer.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -1,7 +1,7 @@
 
 from pyHardwareCPUTrace import pyHardwareCPUTrace
-
 from AvidaCore import cCPUTestInfo, cTestCPU, pyHardwareTracerBase
+from descr import descr
 
 class pyHardwareTracer(pyHardwareTracerBase):
 
@@ -42,7 +42,7 @@
   #  cTestCPU.SetUseResources(True)
 
   def traceAnalyzeGenotype(self, analyze_genotype, environment, should_use_resources):
-    print "pyHardwareTracer.traceAnalyzeGenotype()..."
+    descr()
     backup_environment = None
     original_resource_count = None
     backup_usage = None
@@ -56,19 +56,30 @@
       print " *** but resources in the python test-cpu are disabled for now."
 
     # Build the test info for tracing hardware.
-    test_info = cCPUTestInfo()
+    test_info = cCPUTestInfo(1)
     test_info.TestThreads()
-    organism = test_info.GetTestOrganism(0)
-    #organism.MutationRates().SetCopyMutProb(0.5)
+
     # Build storage for hardware trace info.
     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())
+
+    #cTestCPU.TestGenome(test_info, analyze_genotype.GetGenome())
+    test_info.Clear()
+    organism = cTestCPU.SetupTestOrganism(test_info, analyze_genotype.GetGenome(), 0)
+    descr(organism)
+    organism.MutationRates().SetCopyMutProb(0.08)
+    organism.MutationRates().SetPointMutProb(0.08)
+    cTestCPU.TestGenome_Body(test_info, organism, analyze_genotype.GetGenome(), 0)
+
     # Record some of the genotype's statistics.
     analyze_genotype.Recalculate()
+    environment = cTestCPU.GetEnvironment()
+    self.m_hardware_trace.recordTaskNames(environment)
     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)
+

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyInstructionDescriptionCtrl.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyInstructionDescriptionCtrl.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyInstructionDescriptionCtrl.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -4,15 +4,73 @@
 #from AvidaCore import cHardwareDefs, cHardwareCPUDefs
 from AvidaCore import *
 
-class pyInstructionDescriptionCtrl(QLabel):
-  def __init__(self,parent = None,name = None,fl = 0):
-    QLabel.__init__(self,parent,name,fl)
+descriptions_dict = {
+  'a':"""The instructions nop-A (a), nop-B (b), and nop-C (c) are no-operation instructions, and will not do anything when executed. They will, however, modifiy the behavior of the instruction preceeding it (by changing the CPU component that it affects; see also nop-register notation and nop-head notation) or act as part of a template to denote positions in the genome.""",
+  
+  'b':"""The instructions nop-A (a), nop-B (b), and nop-C (c) are no-operation instructions, and will not do anything when executed. They will, however, modifiy the behavior of the instruction preceeding it (by changing the CPU component that it affects; see also nop-register notation and nop-head notation) or act as part of a template to denote positions in the genome.""",
+  
+  'c':"""The instructions nop-A (a), nop-B (b), and nop-C (c) are no-operation instructions, and will not do anything when executed. They will, however, modifiy the behavior of the instruction preceeding it (by changing the CPU component that it affects; see also nop-register notation and nop-head notation) or act as part of a template to denote positions in the genome.""",
+  
+  'd':"""This instruction compares the BX register to its complement. If they are not equal, the next instruction (after a modifying no-operation instruction, if one is present) is executed. If they are equal, that next instruction is skipped.""",
+  
+  'e':"""This instruction compares the BX register to its complement. If BX is the lesser of the pair, the next instruction (after a modifying no-operation instruction, if one is present) is executed. If it is greater or equal, then that next instruction is skipped.""",
+  
+  'f':"""This instruction removes the top element from the active stack, and places it into the BX register.""",
+  
+  'g':"""This instruction reads in the contents of the BX register, and places it as a new entry at the top of the active stack. The BX register itself remains unchanged.""",
+  
+  'h':"""This instruction toggles the active stack in the CPU. All other instructions that use a stack will always use the active one.""",
+  
+  'i':"""This instruction swaps the contents of the BX register with its complement.""",
+  
+  'j':"""This instruction reads in the contents of the BX register, and shifts all of the bits in that register to the right by one. In effect, it divides the value stored in the register by two, rounding down.""",
+  
+  'k':"""This instruction reads in the contents of the BX register, and shifts all of the bits in that register to the left by one, placing a zero as the new rightmost bit, and trunkating any bits beyond the 32 maximum. For values that require fewer than 32 bits, it effectively multiplies that value by two.""",
+  
+  'l':"""The inc (l) and dec (m) instructions read in the contents of the BX register and increment or decrement it by one.""",
+  
+  'm':"""The inc (l) and dec (m) instructions read in the contents of the BX register and increment or decrement it by one.""",
+  
+  'n':"""The add (n) and sub (o) instructions read in the contents of the BX and CX registers and either sums them together or subtracts CX from BX (respectively). The result of this operation is then placed in the BX register.""",
+  
+  'o':"""The add (n) and sub (o) instructions read in the contents of the BX and CX registers and either sums them together or subtracts CX from BX (respectively). The result of this operation is then placed in the BX register.""",
+  
+  'p':"""This instruction reads in the contents of the BX and CX registers (each of which are 32-bit numbers) and performs a bitwise nand operation on them. The result of this operation is placed in the BX register. Note that this is the only logic operation provided in the basic avida instruction set.""",
+  
+  'q':"""This is the input/output instruction. It takes the contents of the BX register and outputs it, checking it for any tasks that may have been performed. It will then place a new input into BX.""",
+  
+  'r':"""This instruction allocates additional memory for the organism up to the maximum it is allowed to use for its offspring.""",
+  
+  's':"""This instruction is used for an organism to divide off an finnished offspring. The original organism keeps the state of its memory up until the read-head. The offspring's memory is initialized to everything between the read-head and the write-head. All memory past the write-head is removed entirely.""",
+  
+  't':"""This instruction reads the contents of the organism's memory at the position of the read-head, and copy that to the position of the write-head. If a non-zero copy mutation rate is set, a test will be made based on this probability to determine if a mutation occurs. If so, a random instruction (chosen from the full set with equal probability) will be placed at the write-head instead.""",
+  
+  'u':"""This instruction will read in the template the follows it, and find the location of a complement template in the code. The BX register will be set to the distance to the complement from the current position of the instruction-pointer, and the CX register will be set to the size of the template. The flow-head will also be placed at the beginning of the complement template. If no template follows, both BX and CX will be set to zero, and the flow-head will be placed on the instruction immediatly following the h-search.""",
+  
+  'v':"""This instruction will cause the IP to jump to the position in memory of the flow-head.""",
+  
+  'w':"""This instruction will read in the value of the CX register, and the move the IP by that fixed amount through the organism's memory.""",
+  
+  'x':"""This instruction will copy the position of the IP into the CX register.""",
+  
+  'y':"""This instruction reads in the template that follows it, and tests if its complement template was the most recent series of instructions copied. If so, it executed the next instruction, otherwise it skips it. This instruction is commonly used for an organism to determine when it has finished producing its offspring.""",
+  
+  'z':"""This instruction moves the flow-head to the memory position denoted in the CX register.""",
+}
+
+class pyInstructionDescriptionCtrl(QTextEdit):
+  #def __init__(self,parent = None,name = None,fl = 0):
+  #  QLabel.__init__(self,parent,name,fl)
+  def __init__(self,parent = None,name = None):
+    QTextEdit.__init__(self,parent,name)
     if not name: self.setName("pyInstructionDescriptionCtrl")
 
     font = QFont(qApp.font())
     font.setPointSize(9)
     self.setFont(font)
 
+    self.setAlignment(Qt.WordBreak)
+    self.setReadOnly(True)
     #self.read_fn = None
 
   def setReadFn(self, sender, read_fn):
@@ -22,6 +80,7 @@
 
   def frameShownSlot(self, frames, frame_no):
     #if frames is not None and frame_no < frames.m_gestation_time and self.read_fn is not None:
+    label_text = "(no instruction)"
     if frames is not None and frame_no < frames.m_gestation_time:
       #self.read_fn(frames, frame_no)
       inst_set = frames.getHardwareSnapshotAt(frame_no).GetInstSet()
@@ -30,8 +89,10 @@
       inst = cInstruction()
       inst.SetSymbol(short_name)
       long_name = inst_set.GetName(inst)
-      self.setText("%s: %s" % (short_name, long_name))
-    else: 
-      self.setText("(no instruction)")
-      pass
+      description = descriptions_dict.has_key(short_name) and descriptions_dict[short_name] or ""
+      label_text = "%s: %s\n%s" % (short_name, long_name, description)
+      #self.setText("%s: %s" % (short_name, long_name))
+    #else: 
+    #  self.setText("(no instruction)")
+    self.setText(label_text)
 

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -57,6 +57,12 @@
     self.connect(
       self.m_analyze_controls_ctrl.m_pause_btn, qt.SIGNAL("clicked()"),
       self.pauseSlot)
+    self.connect(
+      self.m_analyze_controls_ctrl.m_prev_btn, qt.SIGNAL("clicked()"),
+      self.backSlot)
+    self.connect(
+      self.m_analyze_controls_ctrl.m_next_btn, qt.SIGNAL("clicked()"),
+      self.advanceSlot)
 
     self.connect(self.m_timer, qt.SIGNAL("timeout()"), self.advanceSlot)
 
@@ -106,6 +112,15 @@
     self.m_analyze_controls_ctrl.m_widget_stack.raiseWidget(self.m_analyze_controls_ctrl.m_pause_page)
     self.m_timer.start(self.m_timer_interval, False)
 
+  def backSlot(self):
+    #print "pyOneOrg_ScopeCtrl.backSlot()."
+    slider_value = self.m_execution_step_slider.value()
+    if slider_value <= self.m_execution_step_slider.minValue():
+      self.pauseSlot()
+    else:
+      self.m_execution_step_slider.setValue(slider_value - 1)
+      self.m_timeline.setValue(slider_value - 1)
+
   def advanceSlot(self):
     #print "pyOneOrg_ScopeCtrl.advanceSlot()."
     slider_value = self.m_execution_step_slider.value()

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismDataCtrl.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismDataCtrl.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismDataCtrl.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -1,5 +1,6 @@
 from pyBufferCtrl import pyBufferCtrl
 from pyInstructionDescriptionCtrl import pyInstructionDescriptionCtrl
+from pyTaskDescriptionCtrl import pyTaskDescriptionCtrl
 from pyHideShowCtrl import pyHideShowCtrl
 from descr import descr
 from qt import *
@@ -37,6 +38,11 @@
   layout.addWidget(inst_descr)
   parent.updateMinWidth(inst_descr.maximumWidth())
   return inst_descr
+def taskDescrSetup(parent, layout, name):
+  task_descr = pyTaskDescriptionCtrl(parent.getSubwidget(), name)
+  layout.addWidget(task_descr)
+  parent.updateMinWidth(task_descr.maximumWidth())
+  return task_descr
 def labelSetup(parent, layout, name):
   font = QFont(qApp.font())
   font.setPointSize(9)
@@ -47,11 +53,12 @@
   return label
 
 
-class pyOrganismDataCtrl(QScrollView):
-#class pyOrganismDataCtrl(QWidget):
+#class pyOrganismDataCtrl(QScrollView):
+class pyOrganismDataCtrl(QWidget):
   def __init__(self,parent = None,name = None,fl = 0):
-    QScrollView.__init__(self,parent,name,fl)
-    #QWidget.__init__(self,parent,name,fl)
+    #QScrollView.__init__(self,parent,name,fl)
+
+    QWidget.__init__(self,parent,name,fl)
     if not name: self.setName("pyOrganismDataCtrl")
     QToolTip.add(self,"Shows current state of the organism's hardware")
 
@@ -61,30 +68,48 @@
 
     self.setPaletteBackgroundColor(Qt.white)
 
-    self.setResizePolicy(QScrollView.AutoOneFit)
-    self.viewport().setPaletteBackgroundColor(Qt.white)
-    self.setVScrollBarMode(QScrollView.AlwaysOn)
-    self.setHScrollBarMode(QScrollView.AlwaysOff)
+    #self.setResizePolicy(QScrollView.AutoOneFit)
+    #self.viewport().setPaletteBackgroundColor(Qt.white)
+    #self.setVScrollBarMode(QScrollView.AlwaysOn)
+    #self.setHScrollBarMode(QScrollView.AlwaysOff)
 
-    layout = QVBoxLayout(self.viewport(),5,0)
-    #layout = QVBoxLayout(self,5,0)
+    #layout = QVBoxLayout(self.viewport(),5,0)
+    layout = QVBoxLayout(self,5,0)
 
     self.old_frame_no = -1
 
     self.hideshow_factory = WidgetFactory()
     self.hideshow_factory.setWidgetFn(hideShowSetup)
     self.hideshow_factory.setLayoutFn(lambda parent: layout)
-    self.hideshow_factory.setParent(self.viewport())
-    #self.hideshow_factory.setParent(self)
+    #self.hideshow_factory.setParent(self.viewport())
+    self.hideshow_factory.setParent(self)
 
+    self.widget_factory = WidgetFactory()
+    self.widget_factory.setLayoutFn(lambda parent: QVBoxLayout(parent.getSubwidget(),0,0))
+
+
+    self.widget_factory.setWidgetFn(taskDescrSetup)
+
+    self.hideshow_tasks = self.hideshow_factory.newWidget()
+    self.hideshow_tasks.getLabel().setText("Task Counts")
+    self.widget_factory.setParent(self.hideshow_tasks)
+    self.task0_label = self.widget_factory.newWidget('task0').setReadFn(self, lambda f, fn: 0)
+    self.task1_label = self.widget_factory.newWidget('task1').setReadFn(self, lambda f, fn: 1)
+    self.task2_label = self.widget_factory.newWidget('task2').setReadFn(self, lambda f, fn: 2)
+    self.task3_label = self.widget_factory.newWidget('task3').setReadFn(self, lambda f, fn: 3)
+    self.task4_label = self.widget_factory.newWidget('task4').setReadFn(self, lambda f, fn: 4)
+    self.task5_label = self.widget_factory.newWidget('task5').setReadFn(self, lambda f, fn: 5)
+    self.task6_label = self.widget_factory.newWidget('task6').setReadFn(self, lambda f, fn: 6)
+    self.task7_label = self.widget_factory.newWidget('task7').setReadFn(self, lambda f, fn: 7)
+    self.task8_label = self.widget_factory.newWidget('task8').setReadFn(self, lambda f, fn: 8)
+
+
     self.hideshow_all_hardware = self.hideshow_factory.newWidget("pyOrganismDataCtrl.hideshow_all_hardware")
     self.hideshow_all_hardware.getLabel().setText("Hardware")
     self.hideshow_factory.setLayoutFn(lambda parent: QVBoxLayout(parent,0,0))
     self.hideshow_factory.setParent(self.hideshow_all_hardware.getSubwidget())
 
-    self.widget_factory = WidgetFactory()
     self.widget_factory.setWidgetFn(bufferSetup)
-    self.widget_factory.setLayoutFn(lambda parent: QVBoxLayout(parent.getSubwidget(),0,0))
 
     self.hideshow_inputs = self.hideshow_factory.newWidget("pyOrganismDataCtrl.hideshow_inputs")
     self.hideshow_inputs.getLabel().setText("Input array")
@@ -105,7 +130,7 @@
     self.hideshow_all_hardware.updateMinWidth(self.hideshow_output.minimumWidth())
 
     self.hideshow_regs = self.hideshow_factory.newWidget("pyOrganismDataCtrl.hideshow_regs")
-    self.hideshow_regs.getLabel().setText("Registers A, B, C")
+    self.hideshow_regs.getLabel().setText("Registers AX, BX, CX")
     self.widget_factory.setParent(self.hideshow_regs)
     self.buffer_regA = self.widget_factory.newWidget("pyOrganismDataCtrl.buffer_regA").setReadFn(self,
       lambda f, fn: f.getThreadsSnapshotAt(fn)[0].GetRegister(cHardwareCPUDefs.s_REG_AX))
@@ -116,40 +141,42 @@
     self.hideshow_all_hardware.updateMinWidth(self.hideshow_regs.minimumWidth())
 
     self.hideshow_stackA = self.hideshow_factory.newWidget("pyOrganismDataCtrl.hideshow_stackA")
-    self.hideshow_stackA.getLabel().setText("Stack A")
+    self.hideshow_stackA.getLabel().setText("Stack A (first two frames)")
     self.widget_factory.setParent(self.hideshow_stackA)
     ##### I don't know why this doesn't work (@kgn):
     #self.buflist_stackA = [self.widget_factory.newWidget("pyOrganismDataCtrl.buflist_stackA[%i]"%i).setReadFn(self,
     #  lambda f, fn: f.getHardwareSnapshotAt(fn).pyGetGlobalStack().Get(i)) for i in range(10)]
     l = lambda i: lambda f, fn: f.getHardwareSnapshotAt(fn).pyGetGlobalStack().Get(i)
-    self.buflist_stackB = [self.widget_factory.newWidget("pyOrganismDataCtrl.buflist_stackA[%i]"%i).setReadFn(self, l(i))
-      for i in range(10)]
+    self.buflist_stackB = [
+      self.widget_factory.newWidget("pyOrganismDataCtrl.buflist_stackA[%i]"%i).setReadFn(self, l(i)) for i in range(2)]
     self.hideshow_all_hardware.updateMinWidth(self.hideshow_stackA.minimumWidth())
 
     self.hideshow_stackB = self.hideshow_factory.newWidget("pyOrganismDataCtrl.hideshow_stackB")
-    self.hideshow_stackB.getLabel().setText("Stack B")
+    self.hideshow_stackB.getLabel().setText("Stack B (first two frames)")
     self.widget_factory.setParent(self.hideshow_stackB)
     ##### I don't know why this doesn't work (@kgn):
     #self.buflist_stackB = [self.widget_factory.newWidget("pyOrganismDataCtrl.buflist_stackB[%i]"%i).setReadFn(self,
     #  lambda f, fn: f.getThreadsSnapshotAt(fn)[0].stack.Get(i)) for i in range(10)]
     l = lambda i: lambda f, fn: f.getThreadsSnapshotAt(fn)[0].stack.Get(i)
-    self.buflist_stackB = [self.widget_factory.newWidget("pyOrganismDataCtrl.buflist_stackB[%i]"%i).setReadFn(self, l(i))
-      for i in range(10)]
+    self.buflist_stackB = [
+      self.widget_factory.newWidget("pyOrganismDataCtrl.buflist_stackB[%i]"%i).setReadFn(self, l(i)) for i in range(2)]
     self.hideshow_all_hardware.updateMinWidth(self.hideshow_stackB.minimumWidth())
 
     self.hideshow_factory.setLayoutFn(lambda parent: layout)
-    self.hideshow_factory.setParent(self.viewport())
-    #self.hideshow_factory.setParent(self)
+    #self.hideshow_factory.setParent(self.viewport())
+    self.hideshow_factory.setParent(self)
 
-    self.widget_factory.setWidgetFn(labelSetup)
 
-    self.hideshow_inst_legend = self.hideshow_factory.newWidget()
-    self.hideshow_inst_legend.getLabel().setText("Instructions legend")
-    self.widget_factory.setParent(self.hideshow_inst_legend)
-    self.no_legend_entries = self.widget_factory.newWidget()
-    self.no_legend_entries.setText("(no instruction set)")
-    self.hideshow_all_hardware.updateMinWidth(self.hideshow_inst_legend.minimumWidth())
+    #self.widget_factory.setWidgetFn(labelSetup)
 
+    #self.hideshow_inst_legend = self.hideshow_factory.newWidget()
+    #self.hideshow_inst_legend.getLabel().setText("Instructions legend")
+    #self.widget_factory.setParent(self.hideshow_inst_legend)
+    #self.no_legend_entries = self.widget_factory.newWidget()
+    #self.no_legend_entries.setText("(no instruction set)")
+    #self.hideshow_all_hardware.updateMinWidth(self.hideshow_inst_legend.minimumWidth())
+
+
     self.widget_factory.setWidgetFn(instDescrSetup)
 
     self.hideshow_cur_inst = self.hideshow_factory.newWidget()

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyOrganismScopeView2.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -2,9 +2,11 @@
 
 
 from AvidaCore import cHardwareDefs, cHardwareCPUDefs
+from descr import descr
 
 from qt import *
 from qtcanvas import *
+
 import math
 
 class pyCircle:
@@ -115,9 +117,12 @@
     if hasattr(self, "m_inst_bg_items") and self.m_inst_bg_items is not None:
       for item in self.m_inst_bg_items:
         item.setCanvas(None)
-    if hasattr(self, "m_ihead_move_items") and self.m_ihead_move_items is not None:
-      for item in self.m_ihead_move_items:
+    if hasattr(self, "m_muts_items_cache") and self.m_muts_items_cache is not None:
+      for item in self.m_muts_items_cache:
         item.setCanvas(None)
+    if hasattr(self, "m_ihead_move_items_cache") and self.m_ihead_move_items_cache is not None:
+      for item in self.m_ihead_move_items_cache:
+        item.setCanvas(None)
     if hasattr(self, "m_ihead_item") and self.m_ihead_item is not None:
       self.m_ihead_item.setCanvas(None)
       self.m_ihead_bg_item.setCanvas(None)
@@ -138,7 +143,8 @@
     self.m_inst_pts = None
     self.m_inst_items = None
     self.m_inst_bg_items = None
-    self.m_ihead_move_items = None
+    self.m_muts_items_cache = None
+    self.m_ihead_move_items_cache = None
 
     self.m_ihead_item = None
     self.m_ihead_bg_item = None
@@ -219,12 +225,16 @@
       self.m_inst_items = [QCanvasText(self.m_canvas) for i in xrange(self.m_max_genome_size)]
       self.m_inst_bg_items = [QCanvasEllipse(self.m_canvas) for i in xrange(self.m_max_genome_size)]
       for item in self.m_inst_items:
+        item.setFont(font)
+        item.setColor(Qt.black)
         item.setTextFlags(Qt.AlignCenter)
         item.setZ(4.)
       for item in self.m_inst_bg_items:
         item.setSize(text_height, text_height)
         item.setZ(3.)
 
+      self.m_muts_items_cache = []
+
       if self.m_frames.m_ihead_info is not None:
         self.m_ihead_item = QCanvasEllipse(self.m_canvas)
         self.m_ihead_item.setSize(text_height + 6, text_height + 6)
@@ -299,12 +309,12 @@
 
       # XXX
       #if self.m_frames.m_ihead_moves is not None:
-      #  self.m_ihead_move_items = [QCanvasSpline(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves))]
-      #  #self.m_ihead_move_items = [pyHeadPath(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves))]
+      #  self.m_ihead_move_items_cache = [QCanvasSpline(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves))]
+      #  #self.m_ihead_move_items_cache = [pyHeadPath(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves))]
       if self.m_frames.m_ihead_moves_snapshot is not None:
-        #self.m_ihead_move_items = [QCanvasSpline(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves_snapshot[-1]))]
-        #self.m_ihead_move_items = [QCanvasLine(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves_snapshot[-1]))]
-        self.m_ihead_move_items = []
+        #self.m_ihead_move_items_cache = [QCanvasSpline(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves_snapshot[-1]))]
+        #self.m_ihead_move_items_cache = [QCanvasLine(self.m_canvas) for i in xrange(len(self.m_frames.m_ihead_moves_snapshot[-1]))]
+        self.m_ihead_move_items_cache = []
 
       if self.m_frames.m_is_viable:
         self.emit(PYSIGNAL("gestationTimeChangedSig"),(self.m_frames.m_gestation_time,))
@@ -355,7 +365,7 @@
           item.setSize(point_size_float, point_size_float)
 
   def updateChildCircle(self, child_size, parent_size, parent_circle_radius, parent_center_x, parent_center_y, instruction_spot_radius):
-    print "pyOrganismScopeView2.updateChildCircle()..."
+    #descr()
     self.m_child_circle.setRadius(parent_circle_radius * child_size / parent_size)
     self.m_child_circle.setCenterX(parent_center_x + parent_circle_radius + 2*instruction_spot_radius + self.m_child_circle.radius())
     self.m_child_circle.setCenterY(parent_center_y)
@@ -363,41 +373,58 @@
     self.m_child_circle.setOTheta(math.pi)
 
   def debug_displayHardwareCPUSnapshot(self, frame_number):
-    print "pyOrganismScopeView2.debug_displayHardwareCPUSnapshot(%d)..." % frame_number
+    descr("frame_number", frame_number)
+
     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()
+    # XXX @kgn: This triggers "Bus Error" on OS X; bad memory address
+    # stored beneath hardware_snapshot?
 
+    #descr("hardware_snapshot", hardware_snapshot)
+    #organism = hardware_snapshot.GetOrganism()
+    #descr("organism", organism)
+    #phenotype = organism.GetPhenotype()
+    #descr("phenotype", phenotype)
+    #cur_task_ct = phenotype.GetCurTaskCount()
+    #descr("cur_task_ct", cur_task_ct)
 
+    tasks_frame = self.m_frames.m_tasks_info[frame_number]
+    descr("tasks_frame", tasks_frame)
+    for task in tasks_frame:
+      descr("task", task)
+
+    #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()
@@ -411,7 +438,7 @@
     # bool advance_ip : bool pyGetAdvanceIP()
 
   def showFrame(self, frame_number = 0):
-    print "pyOrganismScopeView2.showFrame(%d)" % frame_number
+    #descr("frame_number", frame_number)
     old_frame_number = self.m_current_frame_number
     old_genome = self.m_current_genome
 
@@ -423,6 +450,7 @@
 
       self.m_current_frame_number = frame_number
       self.m_current_genome = self.m_frames.m_genome_info[self.m_current_frame_number]
+      memory_snapshot = self.m_frames.getMemorySnapshotAt(self.m_current_frame_number)
       displayed_genome_size = max(self.last_copied_instruction_cache[self.m_current_frame_number] + 1, self.m_parent_size)
       color = QColor()
 
@@ -466,6 +494,7 @@
         self.m_child_circle.setCenterX(self.m_child_circle.centerX() + 2 * self.m_instruction_spot_radius)
 
       ###
+      muts_item_idx = 0
       for i in xrange(self.m_max_genome_size):
         pt = self.m_inst_pts[i]
         item = self.m_inst_items[i]
@@ -489,6 +518,41 @@
           bg_item.setBrush(QBrush(color))
           bg_item.show()
 
+          if memory_snapshot.GetFlagMutated(i):
+            #descr("GetFlagMutated", i)
+            if len(self.m_muts_items_cache) <= muts_item_idx:
+              # Make a new mutation circle outline, and append it to the
+              # cache.
+              self.m_muts_items_cache.append(QCanvasEllipse(self.m_canvas))
+              # Size it.
+              text_height = 2. * self.m_instruction_spot_radius
+              self.m_muts_items_cache[-1].setSize(text_height + 4, text_height + 4)
+              # Color it.
+              #self.m_muts_items_cache[-1].setBrush(QBrush(Qt.green))
+              # Place it low on the Z plane (behind other stuff)
+              self.m_muts_items_cache[-1].setZ(0.)
+
+            mut_item = self.m_muts_items_cache[muts_item_idx]
+            mut_item.setX(x)
+            mut_item.setY(y)
+            mut_item.show()
+            if memory_snapshot.GetFlagCopyMut(i):
+              mut_item.setBrush(QBrush(Qt.green))
+            elif memory_snapshot.GetFlagPointMut(i):
+              mut_item.setBrush(QBrush(Qt.yellow))
+            else:
+              mut_item.setBrush(QBrush(Qt.magenta))
+
+            muts_item_idx = muts_item_idx + 1
+
+          #if memory_snapshot.GetFlagCopyMut(i):
+          #  descr("GetFlagCopyMut", i)
+          #if memory_snapshot.GetFlagPointMut(i):
+          #  descr("GetFlagPointMut", i)
+
+      for idx in range(muts_item_idx, len(self.m_muts_items_cache)):
+        self.m_muts_items_cache[idx].hide()
+
       for head_info, head_item, head_bg_item, head_text in (
         (self.m_frames.m_ihead_info, self.m_ihead_item, self.m_ihead_bg_item, self.m_ihead_text),
         (self.m_frames.m_rhead_info, self.m_rhead_item, self.m_rhead_bg_item, self.m_rhead_text),
@@ -574,7 +638,7 @@
             cs_cy + control_radii_ratio * (ce_cy - cs_cy)
           ) )
 
-          #ihead_move_item = self.m_ihead_move_items[move_item_idx]
+          #ihead_move_item = self.m_ihead_move_items_cache[move_item_idx]
           #ihead_move_item.setControlPoints(point_array, False)
           #if move_start < move_end:
           #  ihead_move_item.setPen(QPen(Qt.gray))
@@ -587,9 +651,9 @@
 
           bezier_pa = point_array.cubicBezier()
           for i in range(bezier_pa.size() - 1):
-            if len(self.m_ihead_move_items) <= move_item_idx:
-              self.m_ihead_move_items.append(QCanvasLine(self.m_canvas))
-            line = self.m_ihead_move_items[move_item_idx]
+            if len(self.m_ihead_move_items_cache) <= move_item_idx:
+              self.m_ihead_move_items_cache.append(QCanvasLine(self.m_canvas))
+            line = self.m_ihead_move_items_cache[move_item_idx]
             line.setPoints(
               bezier_pa.point(i)[0], 
               bezier_pa.point(i)[1], 
@@ -597,13 +661,12 @@
               bezier_pa.point(i+1)[1], 
             )
             if move_start < move_end: line.setPen(QPen(Qt.black, 1))
-            else: line.setPen(QPen(Qt.lightGray, 1))
+            else: line.setPen(QPen(Qt.red, 1))
             line.show()
-            line.show()
             move_item_idx = move_item_idx + 1
 
-        for idx in range(move_item_idx, len(self.m_ihead_move_items)):
-          self.m_ihead_move_items[idx].hide()
+        for idx in range(move_item_idx, len(self.m_ihead_move_items_cache)):
+          self.m_ihead_move_items_cache[idx].hide()
 
     self.emit(PYSIGNAL("frameShownSig"),(self.m_frames, self.m_current_frame_number))
     self.m_canvas.update()

Added: branches/developers/avida-edward/source/python/AvidaGui2/pyTaskDescriptionCtrl.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyTaskDescriptionCtrl.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyTaskDescriptionCtrl.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -0,0 +1,43 @@
+from descr import descr
+from qt import *
+#from AvidaCore import cHardwareDefs, cHardwareCPUDefs
+from AvidaCore import *
+
+class pyTaskDescriptionCtrl(QLabel):
+  def __init__(self,parent = None,name = None,fl = 0):
+    QLabel.__init__(self,parent,name,fl)
+    if not name: name = "pyTaskDescriptionCtrl"
+    self.name = name
+    self.setName(self.name)
+    self.setText(self.name)
+
+    self.normal_font = QFont(qApp.font())
+    self.normal_font.setPointSize(9)
+    self.normal_font.setBold(False)
+
+    self.bold_font = QFont(qApp.font())
+    self.bold_font.setPointSize(9)
+    self.bold_font.setBold(True)
+
+    self.setFont(self.normal_font)
+
+    self.read_fn = None
+
+  def setReadFn(self, sender, read_fn):
+    self.read_fn = read_fn
+    self.connect(sender, PYSIGNAL("propagated-FrameShownSig"), self.frameShownSlot)
+    return self
+
+  def frameShownSlot(self, frames, frame_no):
+    #descr()
+    task_text = self.name
+    if frames is not None and frame_no < frames.m_gestation_time and self.read_fn is not None:
+      task_num = self.read_fn(frames, frame_no)
+      task_name = frames.m_task_names[task_num]
+      task_text = '%s' % task_name
+      tasks_frame = frames.m_tasks_info[frame_no]
+      task_count = tasks_frame[task_num]
+      self.setFont(task_count > 0 and self.bold_font or self.normal_font)
+      task_text = task_text + ": " + str(task_count)
+    self.setText("%s" % task_text)
+

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyTemporaryReloads.py	2006-07-05 14:40:31 UTC (rev 799)
@@ -95,6 +95,7 @@
   "AvidaGui2.pyPetriDishCtrl",
   "AvidaGui2.pyPopulationCellItem",
   "AvidaGui2.pyReadFreezer",
+  "AvidaGui2.pyTaskDescriptionCtrl",
   "AvidaGui2.pyTimelineView",
   "AvidaGui2.pyTimelineCtrl",
   "AvidaGui2.pyWriteGenesisEvent",

Modified: branches/developers/avida-edward/source/python/AvidaGui2/to-do_list
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/to-do_list	2006-07-05 14:16:11 UTC (rev 798)
+++ branches/developers/avida-edward/source/python/AvidaGui2/to-do_list	2006-07-05 14:40:31 UTC (rev 799)
@@ -92,6 +92,13 @@
 - toggle to see letters
 - in petri dish, indication of each mutation as it occurs.
 
+- title in organism view: instructions to drag organism into viewer,
+  then change to name of organism. (jeff)
+- get rid of pane
+- see tasks on timeline (josh)
+- task box
+- step forward/back buttons in organism scope
+
 Priority Medium-
 - run things throught the test cpus (so we can accurately paint loaded
   dishes and so the graphs have good data from the get go)




More information about the Avida-cvs mailing list