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

kaben@myxo.css.msu.edu kaben at myxo.css.msu.edu
Tue Jul 5 15:19:48 PDT 2005


Author: kaben
Date: 2005-07-05 18:19:48 -0400 (Tue, 05 Jul 2005)
New Revision: 225

Modified:
   trunk/source/python/AvidaGui2/pyAnalyzeControlsView.ui
   trunk/source/python/AvidaGui2/pyAvida.py
   trunk/source/python/AvidaGui2/pyGradientScaleView.py
   trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py
   trunk/source/python/AvidaGui2/pyMapProfile.py
   trunk/source/python/AvidaGui2/pyOneAna_GraphCtrl.py
   trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
   trunk/source/python/AvidaGui2/pyOneOrg_ScopeView.ui
   trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py
   trunk/source/python/AvidaGui2/pyOrganismScopeView.py
   trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
   trunk/source/python/AvidaGui2/py_test_utils.py
Log:

Changes to the organism view:
- Can drag organism from freezer into view
- Can use rewind, play, pause, and cue buttons to play organism
  gestation
- Instruction head path is now marked by lines
- Instructions have correspondingly colored backgrounds



Modified: trunk/source/python/AvidaGui2/pyAnalyzeControlsView.ui
===================================================================
--- trunk/source/python/AvidaGui2/pyAnalyzeControlsView.ui	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyAnalyzeControlsView.ui	2005-07-05 22:19:48 UTC (rev 225)
@@ -44,7 +44,7 @@
         </spacer>
         <widget class="QToolButton">
             <property name="name">
-                <cstring>toolButton23</cstring>
+                <cstring>m_rewind_btn</cstring>
             </property>
             <property name="text">
                 <string></string>
@@ -55,11 +55,11 @@
         </widget>
         <widget class="QWidgetStack">
             <property name="name">
-                <cstring>widgetStack3</cstring>
+                <cstring>m_widget_stack</cstring>
             </property>
             <widget class="QWidget">
                 <property name="name">
-                    <cstring>WStackPage</cstring>
+                    <cstring>m_play_page</cstring>
                 </property>
                 <attribute name="id">
                     <number>0</number>
@@ -76,7 +76,7 @@
                     </property>
                     <widget class="QToolButton">
                         <property name="name">
-                            <cstring>toolButton19</cstring>
+                            <cstring>m_play_btn</cstring>
                         </property>
                         <property name="text">
                             <string></string>
@@ -92,7 +92,7 @@
             </widget>
             <widget class="QWidget">
                 <property name="name">
-                    <cstring>WStackPage</cstring>
+                    <cstring>m_pause_page</cstring>
                 </property>
                 <attribute name="id">
                     <number>1</number>
@@ -109,7 +109,7 @@
                     </property>
                     <widget class="QToolButton">
                         <property name="name">
-                            <cstring>toolButton20</cstring>
+                            <cstring>m_pause_btn</cstring>
                         </property>
                         <property name="text">
                             <string></string>
@@ -126,7 +126,7 @@
         </widget>
         <widget class="QToolButton">
             <property name="name">
-                <cstring>toolButton24</cstring>
+                <cstring>m_cue_btn</cstring>
             </property>
             <property name="text">
                 <string></string>

Modified: trunk/source/python/AvidaGui2/pyAvida.py
===================================================================
--- trunk/source/python/AvidaGui2/pyAvida.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyAvida.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -132,9 +132,10 @@
       pass
 
   def doStepAvidaSlot(self, cell_id):
-    print("doStepAvidaSlot")
+    print("pyAvida.doStepAvidaSlot() ...")
 
   def doCloseAvidaSlot(self):
+    print("pyAvida.doCloseAvidaSlot() ...")
     self.m_avida_threaded_driver.doExit()
     if self.m_avida_threaded_driver.m_thread.isAlive():
       self.m_avida_threaded_driver.m_thread.join()

Modified: trunk/source/python/AvidaGui2/pyGradientScaleView.py
===================================================================
--- trunk/source/python/AvidaGui2/pyGradientScaleView.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyGradientScaleView.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -92,7 +92,7 @@
     #text_height = self.fontMetrics().height()
     #label_width = self.fontMetrics().width("0.00000")
   
-    for i in range(self.s_stripes):
+    for i in xrange(self.s_stripes):
       x = float(i) / float(self.s_stripes);
       p.fillRect(
         (self.s_left_margin + x*plot_width),

Modified: trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py
===================================================================
--- trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyHardwareCPUTrace.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -41,7 +41,7 @@
 
     self.m_last_copied_instruction = max(
       [hardware.GetMemory().GetFlagCopied(i) and i or self.m_last_copied_instruction \
-      for i in range(self.m_last_copied_instruction, hardware.GetMemory().GetSize())]
+      for i in xrange(self.m_last_copied_instruction, hardware.GetMemory().GetSize())]
     )
     self.m_last_copy_info.append(self.m_last_copied_instruction)
 

Modified: trunk/source/python/AvidaGui2/pyMapProfile.py
===================================================================
--- trunk/source/python/AvidaGui2/pyMapProfile.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyMapProfile.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -155,7 +155,7 @@
       s = sigmoid(1 - x, 0.1, 30) * 255
       return QColor(h, s, v, QColor.Hsv)
 
-    self.m_color_cache = [sigmoidDoubleToColor(float(n)/(self.m_color_cache_size - 1)) for n in range(self.m_color_cache_size)]
+    self.m_color_cache = [sigmoidDoubleToColor(float(n)/(self.m_color_cache_size - 1)) for n in xrange(self.m_color_cache_size)]
     self.m_empty_color = QColor(Qt.black)
     self.m_off_scale_color = QColor(Qt.white)
     def sigmoidColorLookup(x):

Modified: trunk/source/python/AvidaGui2/pyOneAna_GraphCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOneAna_GraphCtrl.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyOneAna_GraphCtrl.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -113,7 +113,7 @@
     x_array = zeros(init_file.GetNumLines(), Float)
     y_array = zeros(init_file.GetNumLines(), Float)
 
-    for line_id in range(init_file.GetNumLines()):
+    for line_id in xrange(init_file.GetNumLines()):
       line = init_file.GetLine(line_id)
       x_array[line_id] = line.GetWord(colx - 1).AsDouble()
       y_array[line_id] = line.GetWord(coly - 1).AsDouble()

Modified: trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -2,6 +2,7 @@
 
 from pyOneOrg_ScopeView import pyOneOrg_ScopeView
 import qt
+import os
 
 class pyOneOrg_ScopeCtrl(pyOneOrg_ScopeView):
 
@@ -13,19 +14,44 @@
     self.m_organism_scope_ctrl.construct(self.m_session_mdl)
     self.m_execution_step_slider.setMinValue(0)
     self.m_execution_step_slider.setMaxValue(0)
+    self.m_clock = qt.QTime()
+    self.m_timer = qt.QTimer()
+    self.m_next = qt.QTimer()
+    self.m_timer_interval = 250
+
     self.connect(
       self.m_execution_step_slider, qt.SIGNAL("valueChanged(int)"),
-      self.m_organism_scope_ctrl.showFrame)
+      self.sliderValueChangedSlot)
     self.connect(
+      self.m_execution_step_slider, qt.SIGNAL("sliderMoved(int)"),
+      self.sliderMovedSlot)
+
+    self.connect(
       self.m_organism_scope_ctrl, qt.PYSIGNAL("gestationTimeChangedSig"),
       self.gestationTimeChangedSlot)
     self.connect(
       self.m_organism_scope_ctrl, qt.PYSIGNAL("executionStepResetSig"),
       self.executionStepResetSlot)
 
+    self.connect(
+      self.m_analyze_controls_ctrl.m_rewind_btn, qt.SIGNAL("clicked()"),
+      self.rewindSlot)
+    self.connect(
+      self.m_analyze_controls_ctrl.m_cue_btn, qt.SIGNAL("clicked()"),
+      self.cueSlot)
+    self.connect(
+      self.m_analyze_controls_ctrl.m_play_btn, qt.SIGNAL("clicked()"),
+      self.playSlot)
+    self.connect(
+      self.m_analyze_controls_ctrl.m_pause_btn, qt.SIGNAL("clicked()"),
+      self.pauseSlot)
+
+    self.connect(self.m_timer, qt.SIGNAL("timeout()"), self.advanceSlot)
+
   def gestationTimeChangedSlot(self, gestation_time):
     print "pyOneOrg_ScopeCtrl.gestationTimeChangedSlot called, gestation_time ", gestation_time
     self.m_execution_step_slider.setMaxValue(gestation_time - 1)
+    self.rewindSlot()
 
   def executionStepResetSlot(self, execution_step):
     print "pyOneOrg_ScopeCtrl.executionStepResetSlot called, execution_step ", execution_step
@@ -33,3 +59,39 @@
     # 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):
+    self.m_organism_scope_ctrl.showFrame(frame_number)
+
+  def sliderMovedSlot(self, frame_number):
+    print "pyOneOrg_ScopeCtrl.sliderMovedSlot()."
+    self.pauseSlot()
+
+  def rewindSlot(self):
+    print "pyOneOrg_ScopeCtrl.rewindSlot()."
+    self.m_execution_step_slider.setValue(0)
+    self.pauseSlot()
+
+  def cueSlot(self):
+    print "pyOneOrg_ScopeCtrl.cueSlot()."
+    self.m_execution_step_slider.setValue(self.m_execution_step_slider.maxValue())
+    self.pauseSlot()
+
+  def pauseSlot(self):
+    print "pyOneOrg_ScopeCtrl.pauseSlot()."
+    self.m_analyze_controls_ctrl.m_widget_stack.raiseWidget(self.m_analyze_controls_ctrl.m_play_page)
+    self.m_timer.stop()
+
+  def playSlot(self):
+    print "pyOneOrg_ScopeCtrl.playSlot()."
+    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, True)
+    self.m_clock.start()
+
+  def advanceSlot(self):
+    #print "pyOneOrg_ScopeCtrl.advanceSlot()."
+    slider_value = self.m_execution_step_slider.value()
+    if self.m_execution_step_slider.maxValue() <= slider_value:
+      self.pauseSlot()
+    else:
+      self.m_execution_step_slider.setValue(slider_value + 1)
+      self.m_timer.start(min(0, self.m_timer_interval - self.m_clock.restart(), True))

Modified: trunk/source/python/AvidaGui2/pyOneOrg_ScopeView.ui
===================================================================
--- trunk/source/python/AvidaGui2/pyOneOrg_ScopeView.ui	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyOneOrg_ScopeView.ui	2005-07-05 22:19:48 UTC (rev 225)
@@ -70,7 +70,7 @@
                 </spacer>
                 <widget class="pyAnalyzeControlsCtrl">
                     <property name="name">
-                        <cstring>pyAnalyzeControlsCtrl1</cstring>
+                        <cstring>m_analyze_controls_ctrl</cstring>
                     </property>
                     <property name="sizePolicy">
                         <sizepolicy>
@@ -123,6 +123,8 @@
         <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>

Modified: trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyOrganismScopeCtrl.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -20,8 +20,10 @@
     if not name: self.setName("pyOrganismScopeCtrl")
 
   def construct(self, session_mdl):
+    print "pyOrganismScopeCtrl.construct()."
     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)
@@ -29,6 +31,41 @@
       self.m_session_mdl.m_session_mdtr, PYSIGNAL("setDebugOrganismFileSig"),
       self.setDebugOrganismFileSlot)
 
+  def dragEnterEvent( self, e ):
+    e.acceptAction(True)
+    if e.isAccepted():
+      print "pyOrganismScopeCtrl.dragEnterEvent(e): isAccepted."
+    else:
+      print "pyOrganismScopeCtrl.dragEnterEvent(e): not isAccepted."
+
+    freezer_item_name = QString()
+    if ( QTextDrag.decode( e, freezer_item_name ) ) :
+      if os.path.exists( str(freezer_item_name)) == False:
+        print "pyOrganismScopeCtrl.dragEnterEvent(e): that was not a valid path."
+      else:
+        print "pyOrganismScopeCtrl.dragEnterEvent(e): that was a valid path."
+        print "pyOrganismScopeCtrl.dragEnterEvent(e): freezer_item_name", freezer_item_name
+        if str(freezer_item_name).endswith('.organism'):
+          print "pyOrganismScopeCtrl.dragEnterEvent(e): freezer_item_name ends with .organism."
+          e.accept()
+        else:
+          print "pyOrganismScopeCtrl.dragEnterEvent(e): freezer_item_name doesn't end with .organism."
+
+  def dropEvent( self, e ):
+    freezer_item_name = QString()
+    if ( QTextDrag.decode( e, freezer_item_name ) ) :
+      if os.path.exists( str(freezer_item_name)) == False:
+        print "pyOrganismScopeCtrl.dropEvent(e): that was not a valid path."
+      else:
+        print "pyOrganismScopeCtrl.dropEvent(e): that was a valid path."
+        if str(freezer_item_name).endswith('.organism'):
+          print "pyOrganismScopeCtrl.dropEvent(e): freezer_item_name ends with .organism."
+          e.accept()
+          self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("setDebugOrganismFileSig"), (freezer_item_name,))
+        else:
+          print "pyOrganismScopeCtrl.dropEvent(e): freezer_item_name doesn't end with .organism."
+
+
   def setAvidaSlot(self, avida):
     print "pyOrganismScopeCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
@@ -48,11 +85,14 @@
 
       # Translate from string genome representation to actual command names.
       inst_names = {}
+      ops = {}
       inst_set = self.m_avida.m_environment.GetInstSet()
       instruction = cInstruction()
-      for id in range(inst_set.GetSize()):
+      for id in xrange(inst_set.GetSize()):
         instruction.SetOp(id)
         inst_names[instruction.GetSymbol()] = str(inst_set.GetName(instruction))
+        ops[instruction.GetSymbol()] = id
 
       self.setInstNames(inst_names)
+      self.setOps(ops)
       self.setFrames(hardware_tracer.m_hardware_trace)

Modified: trunk/source/python/AvidaGui2/pyOrganismScopeView.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOrganismScopeView.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyOrganismScopeView.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -1,10 +1,38 @@
 # -*- coding: utf-8 -*-
 
 
-from qt import PYSIGNAL, QBrush, QColor, QFont, QFontMetrics, QPointArray, QPoint, QScrollView, Qt, QWMatrix
-from qtcanvas import QCanvas, QCanvasSpline, QCanvasText, QCanvasView
+from qt import PYSIGNAL, QBrush, QColor, QFont, QFontMetrics, QPen, QPointArray, QPoint, QScrollView, Qt, QWMatrix
+from qtcanvas import QCanvas, QCanvasEllipse, QCanvasLine, QCanvasSpline, QCanvasText, QCanvasView
 import math
 
+class pyHeadPath:
+  def __init__(self, canvas):
+    self.m_canvas = canvas
+    self.m_line1 = QCanvasLine(canvas)
+    self.m_line2 = QCanvasLine(canvas)
+  def setCanvas(self, canvas):
+    self.m_canvas = canvas
+    self.m_line1.setCanvas(canvas)
+    self.m_line2.setCanvas(canvas)
+  def setControlPoints(self, point_array, ignored_bool):
+    x0 = point_array.point(0)[0]
+    x1 = point_array.point(1)[0]
+    x2 = point_array.point(2)[0]
+    y0 = point_array.point(0)[1]
+    y1 = point_array.point(1)[1]
+    y2 = point_array.point(2)[1]
+    self.m_line1.setPoints(x0, y0, x1, y1)
+    self.m_line2.setPoints(x1, y1, x2, y2)
+  def setPen(self, pen):
+    self.m_line1.setPen(pen)
+    self.m_line2.setPen(pen)
+  def show(self):
+    self.m_line1.show()
+    self.m_line2.show()
+  def hide(self):
+    self.m_line1.hide()
+    self.m_line2.hide()
+
 class pyOrganismScopeView(QCanvasView):
   def __init__(self,parent = None,name = None,fl = 0):
     QCanvasView.__init__(self,parent,name,fl)
@@ -29,15 +57,18 @@
 
   def reset(self):
     if hasattr(self, "m_instruction_items") and self.m_instruction_items is not None:
-      for instruction_item in self.m_instruction_items:
-        instruction_item.setCanvas(None)
+      for item in self.m_instruction_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:
+        item.setCanvas(None)
     self.m_instruction_items = None
     self.m_task_items = None
     self.m_ihead_item = None
     self.m_rhead_item = None
     self.m_whead_item = None
     self.m_fhead_item = None
-    self.m_rhead_move_items = None
+    self.m_ihead_move_items = None
 
     self.m_task_names = None
     self.m_inst_names = None
@@ -52,29 +83,37 @@
     self.m_current_rhead = None
     self.m_current_whead = None
     self.m_current_fhead = None
-    self.m_current_rhead_move = None
+    self.m_current_ihead_move = None
 
     # Hmm; can't emit gestationTimeChangedSig(0) without causing absurd slider values. @kgn
     self.emit(PYSIGNAL("gestationTimeChangedSig"),(1,))
     self.emit(PYSIGNAL("executionStepResetSig"),(0,))
 
   def setTaskNames(self, task_names = None):
-    old_task_names = self.m_task_names
     self.m_task_names = task_names
 
   def setInstNames(self, inst_names = None):
-    old_inst_names = self.m_inst_names
     self.m_inst_names = inst_names
 
+  def setOps(self, ops = None):
+    self.m_ops_dict = ops
+
   def setFrames(self, frames = None):
     self.reset()
     self.m_frames = frames
     if self.m_frames is not None:
       if self.m_frames.m_genome_info is not None:
         self.m_max_genome_size = max([len(genome) for genome in self.m_frames.m_genome_info])
-        self.m_instruction_items = [QCanvasText(self.m_canvas) for i in range(self.m_max_genome_size)]
+        self.m_instruction_items = [QCanvasText(self.m_canvas) for i in xrange(self.m_max_genome_size)]
+        self.m_instruction_bg_items = [QCanvasEllipse(self.m_canvas) for i in xrange(self.m_max_genome_size)]
+        for item in self.m_instruction_items:
+          item.setTextFlags(Qt.AlignCenter)
+          item.setZ(1.)
+        for item in self.m_instruction_bg_items:
+          item.setZ(0.)
       if self.m_frames.m_ihead_moves is not None:
-        self.m_rhead_move_items = [QCanvasSpline(self.m_canvas) for i in range(len(self.m_frames.m_ihead_moves))]
+        #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.emit(PYSIGNAL("gestationTimeChangedSig"),(self.m_frames.m_gestation_time,))
       self.updateCircle()
       self.showFrame(0)
@@ -99,19 +138,22 @@
     if self.m_instruction_items is not None:
       text_height = 2 * 3.14159 * self.m_max_circle_radius / self.m_max_genome_size
       font = QFont(self.font())
-      font.setPointSizeFloat(self.m_font_oversize_factor * text_height * self.m_font_points_per_pixel)
-      for instruction_item in self.m_instruction_items:
-        instruction_item.setFont(font)
+      point_size_float = self.m_font_oversize_factor * text_height * self.m_font_points_per_pixel
+      font.setPointSizeFloat(point_size_float)
+      for item in self.m_instruction_items:
+        item.setFont(font)
+      for item in self.m_instruction_bg_items:
+        item.setSize(point_size_float, point_size_float)
       self.m_circles = []
       self.m_circle_radii = []
-      for frame_no in range(self.m_frames.m_gestation_time):
+      for frame_no in xrange(self.m_frames.m_gestation_time):
         organism_current_size = max(self.m_frames.m_last_copy_info[frame_no] + 1, self.m_frames.m_size)
         circumference = text_height * organism_current_size
         radius = circumference / (2 * 3.14159)
         dt = 2 * 3.14159 / (organism_current_size + 1)
         angle_offset = 3.14159 / 2
         circle_pts = []
-        for i in range(organism_current_size):
+        for i in xrange(organism_current_size):
           theta = i * dt + angle_offset
           c = math.cos(theta)
           s = -math.sin(theta)
@@ -130,7 +172,7 @@
     old_rhead = self.m_current_rhead
     old_whead = self.m_current_whead
     old_fhead = self.m_current_fhead
-    old_rhead_move = self.m_current_rhead_move
+    old_ihead_move = self.m_current_ihead_move
 
     self.m_current_frame_number = 0
     self.m_current_radius = None
@@ -140,7 +182,7 @@
     self.m_current_rhead = None
     self.m_current_whead = None
     self.m_current_fhead = None
-    self.m_current_rhead_move = None
+    self.m_current_ihead_move = None
 
     circle_pts = None
 
@@ -153,12 +195,20 @@
         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.
-          for i in range(displayed_genome_size):
-            instruction_item = self.m_instruction_items[i]
-            instruction_item.setX(circle_pts[i][0])
-            instruction_item.setY(circle_pts[i][1])
-            instruction_item.setText(self.m_current_genome[i])
-            instruction_item.show()
+          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)
@@ -167,71 +217,87 @@
           range_end = max(old_length, new_length)
 
           if old_radius != self.m_current_radius:
-            for i in range(compare_max):
-              instruction_item = self.m_instruction_items[i]
-              instruction_item.setX(circle_pts[i][0])
-              instruction_item.setY(circle_pts[i][1])
+            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 range(compare_max, range_end):
-                instruction_item = self.m_instruction_items[i]
-                instruction_item.setX(circle_pts[i][0])
-                instruction_item.setY(circle_pts[i][1])
+              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 range(compare_max):
+          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 range(compare_max, range_end):
-              instruction_item = self.m_instruction_items[i]
-              instruction_item.setText(self.m_current_genome[i])
-              instruction_item.show()
+            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 range(compare_max, range_end):
+            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_rhead_move = self.m_frames.m_ihead_moves_info[frame_number]
-        if old_rhead_move is None:
-          # Update all rhead_move_items.
-          for i in range(self.m_current_rhead_move):
-            rhead_move_item = self.m_rhead_move_items[self.m_current_rhead_move]
+        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):
+            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.5 + 0.4/math.ldexp(1, self.m_frames.m_ihead_moves[rhead_move_item][2])) * anchor_radii_ratio
-            point_array = QPointArray(4)
-            from_circle_pt = circle_pts[self.m_frames.m_ihead_moves[rhead_move_item][0]]
-            to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[rhead_move_item][1]]
+            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[ihead_move_item][0]]
+            to_circle_pt = circle_pts[self.m_frames.m_ihead_moves[ihead_move_item][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] - self.m_circle_center_x),
-              self.m_circle_center_y + control_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+              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 + control_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
-              self.m_circle_center_y + control_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
-            )
-            point_array[3] = 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)
             )
-            rhead_move_item.setControlPoints(point_array, False)
-            rhead_move_item.setBrush(QBrush(Qt.blue))
-            rhead_move_item.show()
+            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 rhead_move_items.
-          for i in range(self.m_current_rhead_move):
-            rhead_move_item = self.m_rhead_move_items[i]
+          # 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.5 + 0.4/math.ldexp(1, self.m_frames.m_ihead_moves[i][2])) * anchor_radii_ratio
-            point_array = QPointArray(4)
+            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]]
             point_array.setPoint(0, QPoint(
@@ -239,23 +305,22 @@
               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] - self.m_circle_center_x),
-              self.m_circle_center_y + control_radii_ratio * (from_circle_pt[1] - self.m_circle_center_y)
+              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 + control_radii_ratio * (to_circle_pt[0] - self.m_circle_center_x),
-              self.m_circle_center_y + control_radii_ratio * (to_circle_pt[1] - self.m_circle_center_y)
-            ) )
-            point_array.setPoint(3, 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)
             ) )
-            rhead_move_item.setControlPoints(point_array, False)
-            rhead_move_item.setBrush(QBrush(Qt.blue))
-            rhead_move_item.show()
-          if self.m_current_rhead_move < old_rhead_move:
-            for i in range(self.m_current_rhead_move, old_rhead_move):
-              self.m_rhead_move_items[i].hide()
+            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:

Modified: trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -186,7 +186,7 @@
 
       self.m_avida and self.m_avida.m_avida_threaded_driver.m_lock.acquire()
       if self.m_change_list:
-        for index in range(self.m_change_list.GetChangeCount()):
+        for index in xrange(self.m_change_list.GetChangeCount()):
           self.updateCellItem(self.m_change_list[index])
         self.m_change_list.Reset()
       self.m_avida and self.m_avida.m_avida_threaded_driver.m_lock.release()

Modified: trunk/source/python/AvidaGui2/py_test_utils.py
===================================================================
--- trunk/source/python/AvidaGui2/py_test_utils.py	2005-07-05 20:05:52 UTC (rev 224)
+++ trunk/source/python/AvidaGui2/py_test_utils.py	2005-07-05 22:19:48 UTC (rev 225)
@@ -93,7 +93,7 @@
       # will have the index embedded in it. similarly, embedded keys for
       # undeleted objects in dictionaries.
       if type(o) == types.ListType:
-        for i in range(len(o)):
+        for i in xrange(len(o)):
           attr = o[i]
           if not id_dict.has_key(id(attr)):
             enqueueAndMark(attr, id_dict[id(o)] + '[%d]'%i + str(attr), id_dict, object_queue)




More information about the Avida-cvs mailing list