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

jclune@myxo.css.msu.edu jclune at myxo.css.msu.edu
Tue Jul 12 10:53:21 PDT 2005


Author: jclune
Date: 2005-07-12 13:53:21 -0400 (Tue, 12 Jul 2005)
New Revision: 232

Modified:
   trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py
   trunk/source/python/AvidaGui2/pyGradientScaleView.py
   trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py
   trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
Log:
scrolling works....mostly (still some glitches right after you zoom)


Modified: trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py	2005-07-12 17:28:43 UTC (rev 231)
+++ trunk/source/python/AvidaGui2/pyGradientScaleCtrl.py	2005-07-12 17:53:21 UTC (rev 232)
@@ -12,10 +12,14 @@
   def construct(self, session_mdl):
     self.m_session_mdl = session_mdl
     self.m_avida = None
+    self.m_current_map_mode_name = None
     self.connect(
       self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"),
       self.setAvidaSlot)
+    self.connect(self.m_session_mdl.m_session_mdtr,
+       PYSIGNAL("mapModeChangedSig"), self.setMapModeSlot)
 
+
   def setAvidaSlot(self, avida):
     print "pyGradientScaleCtrl.setAvidaSlot() ..."
     old_avida = self.m_avida
@@ -32,6 +36,9 @@
         self.m_avida.m_avida_thread_mdtr, PYSIGNAL("AvidaUpdatedSig"),
         self.avidaUpdatedSlot)
 
+  def setMapModeSlot(self,index):
+    self.m_current_map_mode_name = index
+
   def avidaUpdatedSlot(self):
     pass
 

Modified: trunk/source/python/AvidaGui2/pyGradientScaleView.py
===================================================================
--- trunk/source/python/AvidaGui2/pyGradientScaleView.py	2005-07-12 17:28:43 UTC (rev 231)
+++ trunk/source/python/AvidaGui2/pyGradientScaleView.py	2005-07-12 17:53:21 UTC (rev 232)
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-
+ # -*- coding: utf-8 -*-
 
 # Original form implementation generated from reading ui file 
 # '/Users/kaben/Projects/Software/Avida/svn/avida2/trunk/source/python/AvidaGui2/pyGradientScaleView.ui'
@@ -22,6 +22,7 @@
   s_empty_text_width = 0
   s_off_scale_text_width = 0
   s_label_text_width = 0
+  s_map_mode_name_label_width = 100
   s_text_height = 0
 
   def __init__(self,parent = None,name = None,fl = 0):
@@ -49,7 +50,14 @@
 
     if not name:
       setName("pyGradientScaleView")
+  
+  def construct(self, session_mdl):
+    self.m_session_mdl = session_mdl
+    self.m_avida = None
 
+
+
+
   def doubleToColor(self, x): return self.m_color_lookup and self.m_color_lookup(x) or QColor(Qt.black)
 
   def setRange(self, min, max):
@@ -125,6 +133,34 @@
       self.getLabelString(self.m_max_value)
     )
 
+# draw the number label for the midpoint
+    p.drawText(
+      #w - self.s_right_margin - label_width,
+#      w/2 - self.s_right_margin - self.s_label_text_width,
+      w/2 - self.s_label_text_width/2,
+      self.s_top_margin,
+      self.s_label_text_width,
+      self.s_text_height,
+      #label_width,
+      #text_height,
+      Qt.AlignBottom | Qt.AlignCenter,
+      self.getLabelString((self.m_max_value-self.m_min_value)/2.0)
+    )
+
+
+#  make a word label for the scale 
+    p.drawText(
+      w/2 - self.s_map_mode_name_label_width/2,
+      h - self.s_top_margin*4,            #the multiple is a hack
+      self.s_map_mode_name_label_width,
+      self.s_text_height,
+      #label_width,
+      #text_height,
+      Qt.AlignBottom | Qt.AlignCenter,
+      self.m_current_map_mode_name
+    )
+
+
       #self.s_spacing + 2 * self.fontMetrics().width("0.0e+02")
 
       #if i%self.s_step == 0:
@@ -200,6 +236,7 @@
     self.setMinimumHeight(h)
     self.setMaximumHeight(h)
 
+
   def getLabelString(self, x):
 
     # To show numbers < 10,000 without going to sci. notation had to
@@ -209,4 +246,5 @@
     if x >= 100:
       ix = int(x)
       x = float(ix)
-    return QString("%1").arg(x, 0, 'g', 5)
+    return QString("%1").arg(x, 0, 'g', 2)
+

Modified: trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py	2005-07-12 17:28:43 UTC (rev 231)
+++ trunk/source/python/AvidaGui2/pyOnePop_PetriDishCtrl.py	2005-07-12 17:53:21 UTC (rev 232)
@@ -6,6 +6,7 @@
 import os
 from pyReadFreezer import pyReadFreezer
 
+
 class pyOnePop_PetriDishCtrl(pyOnePop_PetriDishView):
 
   def __init__(self,parent = None,name = None,fl = 0):
@@ -15,10 +16,19 @@
     self.m_session_mdl = session_mdl
     self.m_avida = None
     self.dishDisabled = False
+
     print "*** pyOnePop_PetriDishCtrl.py:consruct about to call m_petri_dish_ctrl.construct ***"
     self.m_petri_dish_ctrl.construct(self.m_session_mdl)
+
+#    self.m_petri_dish_ctrl_h_scrollBar = QScrollBar(1,300,1,20,300,Qt.Horizontal,self.m_petri_dish_ctrl)
+#    self.m_petri_dish_ctrl_v_scrollBar = QScrollBar(1,300,1,20,300,Qt.Vertical,self.m_petri_dish_ctrl)
+#    self.m_petri_dish_ctrl_h_scrollBar.setGeometry(0,371, 371,15)
+#    self.m_petri_dish_ctrl_v_scrollBar.setGeometry(371,0,15,371)
     print "*** pyOnePop_PetriDishCtrl.py:consruct about to call m_gradient_scale_ctrl.construct ***"
     self.m_gradient_scale_ctrl.construct(self.m_session_mdl)
+    print "*** pyOnePop_PetriDishView.py:consruct about to call m_gradient_scale_view.construct ***"
+    self.m_gradient_scale_view.construct(self.m_session_mdl)
+
     print "*** pyOnePop_PetriDishCtrl.py:consruct about to call m_live_controls_ctrl.construct ***"
     self.m_live_controls_ctrl.construct(self.m_session_mdl)
     print "*** pyOnePop_PetriDishCtrl.py:consruct about to call m_petri_configure_ctrl.construct ***"
@@ -56,7 +66,7 @@
     self.m_map_profile = pyMapProfile(self.m_session_mdl)
     for i in range(self.m_map_profile.getSize()):
       self.m_mode_combobox.insertItem(self.m_map_profile.getModeName(i))
-
+ 
     # Start with second map mode -- "Fitness".
     self.m_mode_combobox.setCurrentItem(2)
     self.m_mode_index = self.m_mode_combobox.currentItem()
@@ -105,7 +115,7 @@
 
   def modeActivatedSlot(self, index):
     self.m_avida and self.m_avida.m_avida_threaded_driver.m_lock.acquire()
-
+    self.m_session_mdl.m_session_mdtr.emit(PYSIGNAL("mapModeChangedSig"), (self.m_map_profile.getModeName(index),))
     self.m_mode_index = index
     self.m_petri_dish_ctrl.setIndexer(self.m_map_profile.getIndexer(self.m_mode_index))
     self.m_petri_dish_ctrl.setColorLookupFunctor(self.m_map_profile.getColorLookup(self.m_mode_index))

Modified: trunk/source/python/AvidaGui2/pyPetriDishCtrl.py
===================================================================
--- trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-07-12 17:28:43 UTC (rev 231)
+++ trunk/source/python/AvidaGui2/pyPetriDishCtrl.py	2005-07-12 17:53:21 UTC (rev 232)
@@ -10,8 +10,9 @@
 from AvidaCore import cConfig
 from AvidaCore import cInitFile, cString
 
+from qt import *
 from math import exp
-from qt import PYSIGNAL, QBrush, QColor, QLayout, QPen, QSize, Qt, QVBoxLayout, QWidget, QWMatrix, QTextDrag, QStoredDrag
+from qt import PYSIGNAL, QBrush, QColor, QLayout, QPen, QSize, Qt, QVBoxLayout, QWidget, QWMatrix, QTextDrag, QStoredDrag, QScrollView, QScrollBar
 from qtcanvas import QCanvas, QCanvasRectangle
 from pyPetriCanvasView import pyPetriCanvasView
 from pyPopulationCellItem import pyPopulationCellItem
@@ -38,11 +39,32 @@
 
     self.m_canvas = None
     self.m_cell_info = None
-    #self.m_petri_dish_layout = QVBoxLayout(self,0,0,"m_petri_dish_layout")
+    self.m_zoom_factor = 11
+    self.m_target_dish_width = 350
+    self.m_target_dish_scaling = 5.
+    self.m_map_cell_width = 5
+    self.m_h_scrollbar_offset = 0
+    self.m_v_scrollbar_offset = 0
+    self.m_zoom_old_value = self.m_zoom_factor
+
     self.m_petri_dish_layout = pySquareVBoxLayout(self,0,0,"m_petri_dish_layout")
     print "pyPetriDishCtrl.construct() self.m_petri_dish_layout.heightForWidth(20) :", self.m_petri_dish_layout.heightForWidth(20)
-    #self.m_petri_dish_layout.setResizeMode(QLayout.Minimum)
     self.m_canvas_view = pyPetriCanvasView(None, self,"m_canvas_view")
+
+    #hiding the scroll bars, the pre-packaged ones were not working so we are adding them manually elsewhere
+    self.m_canvas_view.setVScrollBarMode(QScrollView.AlwaysOff)
+    self.m_canvas_view.setHScrollBarMode(QScrollView.AlwaysOff)
+
+    #adding manual ones
+    self.m_scroll_bar_width = 15  # also the height if vertical
+    # the following settings get overridden once the scroll bars are necessary, so they are junk
+    self.m_petri_dish_ctrl_h_scrollBar = QScrollBar(0,371,0,20,185,Qt.Horizontal,self.m_canvas_view)
+    self.m_petri_dish_ctrl_v_scrollBar = QScrollBar(0,371,0,20,185,Qt.Vertical,self.m_canvas_view)
+    print "setting up scroll bar"
+    self.m_petri_dish_ctrl_h_scrollBar.setGeometry(0,371, 371,self.m_scroll_bar_width)
+    print "done setting geo"
+    self.m_petri_dish_ctrl_v_scrollBar.setGeometry(371,0,self.m_scroll_bar_width,371)
+
     self.m_petri_dish_layout.addWidget(self.m_canvas_view)
     self.m_changed_cell_items = []
     self.m_indexer = None
@@ -52,10 +74,6 @@
     self.m_org_clicked_on_item = None
     self.m_occupied_cells_ids = []
 
-    self.m_target_dish_width = 350
-    self.m_target_dish_scaling = 5.
-    self.m_map_cell_width = 5
-
     self.connect( self.m_session_mdl.m_session_mdtr, PYSIGNAL("setAvidaSig"), 
       self.setAvidaSlot)
     self.connect( self.m_canvas_view, PYSIGNAL("orgClickedOnSig"), 
@@ -64,7 +82,14 @@
       PYSIGNAL("orgClickedOnSig"), self.updateOrgClickedOutlineCellNumberSlot)
     self.connect( self.m_session_mdl.m_session_mdtr, 
       PYSIGNAL("orgClickedOnSig"), self.setDragSlot)
+#    self.connect(self.m_petri_dish_ctrl_h_scrollBar, SIGNAL("valueChanged(int)"), self.moveCanvasHorizontallySlot)    
+#    self.connect(self.m_petri_dish_ctrl_h_scrollBar, SIGNAL("nextLine()"), self.hbarScrollNextLineSlot)    
+#    self.connect(self.m_petri_dish_ctrl_h_scrollBar, SIGNAL("prevLine()"), self.hbarScrollPrevLineSlot)    
+    self.connect(self.m_petri_dish_ctrl_v_scrollBar, SIGNAL("valueChanged(int)"), self.moveCanvasVerticallySlot)    
+    self.connect(self.m_petri_dish_ctrl_v_scrollBar, SIGNAL("nextLine()"), self.vbarScrollNextLineSlot)    
+    self.connect(self.m_petri_dish_ctrl_v_scrollBar, SIGNAL("prevLine()"), self.vbarScrollPrevLineSlot)    
 
+
   def restart(self):
     self.m_cell_info = None
     self.m_changed_cell_items = []
@@ -205,19 +230,96 @@
       (population_dict, send_reset_signal, send_quit_signal, ))
 
   def zoomSlot(self, zoom_factor):
+    if hasattr(self,"m_world_h") == False:
+      return
+
+    self.m_zoom_factor = zoom_factor
+    self.m_world_matrix = QWMatrix()
     if self.m_canvas_view:
-      m = QWMatrix()
-      m.scale(zoom_factor/self.m_target_dish_scaling, zoom_factor/self.m_target_dish_scaling)
-      trans_h = (self.m_canvas_view.size().height() - (self.m_map_cell_width * self.m_world_h)*
-        (zoom_factor/self.m_target_dish_scaling))/2
+      self.m_world_matrix.scale(self.m_zoom_factor/self.m_target_dish_scaling, self.m_zoom_factor/self.m_target_dish_scaling)
+      trans_h = ((self.m_canvas_view.size().height()-self.m_scroll_bar_width) - (self.m_map_cell_width * self.m_world_h)*
+        (self.m_zoom_factor/self.m_target_dish_scaling))/2
 
-      if zoom_factor == 0:
-        m.translate(trans_h/(1/self.m_target_dish_scaling),trans_h/(1/self.m_target_dish_scaling))
+      trans_h = trans_h + self.m_v_scrollbar_offset*(self.m_zoom_factor/self.m_target_dish_scaling)
+      trans_w = trans_h + self.m_h_scrollbar_offset*(self.m_zoom_factor/self.m_target_dish_scaling)
+
+
+      if self.m_zoom_factor == 0:
+        self.m_world_matrix.translate(trans_w/(1/self.m_target_dish_scaling),trans_h/(1/self.m_target_dish_scaling))
       else:
-        m.translate(trans_h/(zoom_factor/self.m_target_dish_scaling),trans_h/(zoom_factor/self.m_target_dish_scaling))    
-      self.m_canvas_view.setWorldMatrix(m)
- 
+        self.m_world_matrix.translate(trans_w/(self.m_zoom_factor/self.m_target_dish_scaling),trans_h/(self.m_zoom_factor/self.m_target_dish_scaling))    
+      self.m_canvas_view.setWorldMatrix(self.m_world_matrix)
+
+      black_box = (self.m_map_cell_width * self.m_world_h)*(self.m_zoom_factor/self.m_target_dish_scaling)
+      outside = black_box - 371
+      if outside < 0: 
+        outside = 1
+
+      self.m_setting_scrollbar_values = 1
+
+      self.m_petri_dish_ctrl_h_scrollBar.setMaxValue( 30 + outside/(self.m_zoom_factor/self.m_target_dish_scaling) )
+      self.m_petri_dish_ctrl_v_scrollBar.setMaxValue( 30 + outside/(self.m_zoom_factor/self.m_target_dish_scaling) )
+
+      self.m_h_scrollbar_offset = self.m_h_scrollbar_offset*(float(self.m_zoom_factor)/self.m_zoom_old_value) 
+      self.m_v_scrollbar_offset = self.m_v_scrollbar_offset*(float(self.m_zoom_factor)/self.m_zoom_old_value) 
+
+      self.m_petri_dish_ctrl_h_scrollBar.setValue( (self.m_petri_dish_ctrl_h_scrollBar.maxValue()/2) - self.m_h_scrollbar_offset)
+      self.m_petri_dish_ctrl_v_scrollBar.setValue( (self.m_petri_dish_ctrl_v_scrollBar.maxValue()/2) - self.m_v_scrollbar_offset)
+
+      self.m_zoom_old_value = self.m_zoom_factor
+
+      self.m_setting_scrollbar_values = 0
+
+  def moveCanvasHorizontallySlot(self,horizontal_value):
+  
+    if horizontal_value < 0:
+      return
+  
+    if self.m_setting_scrollbar_values == 1:
+      return
+
+    h_scroll_adjustment_needed = (horizontal_value- (self.m_petri_dish_ctrl_h_scrollBar.maxValue()/2)+ self.m_h_scrollbar_offset)*-1
+    self.m_h_scrollbar_offset = h_scroll_adjustment_needed + self.m_h_scrollbar_offset
+	
+    if self.m_canvas_view:
+      self.m_world_matrix.translate(h_scroll_adjustment_needed,0)
+      self.m_canvas_view.setWorldMatrix(self.m_world_matrix)
+
+  def moveCanvasVerticallySlot(self,vertical_value):
+    print "############################################################"
+    if vertical_value < 0:
+      return
+  
+    if self.m_setting_scrollbar_values == 1:
+      print "returning"
+      return
+
+    v_scroll_adjustment_needed = (vertical_value- (self.m_petri_dish_ctrl_v_scrollBar.maxValue()/2)+ self.m_v_scrollbar_offset)*-1
+    self.m_v_scrollbar_offset = v_scroll_adjustment_needed + self.m_v_scrollbar_offset
+
+    if self.m_canvas_view:
+      self.m_world_matrix.translate(0,v_scroll_adjustment_needed)
+      self.m_canvas_view.setWorldMatrix(self.m_world_matrix)
+
+
+  def hbarScrollNextLineSlot(self):
+    if self.m_petri_dish_ctrl_h_scrollBar.value() < self.m_petri_dish_ctrl_h_scrollBar.maxValue():
+      self.m_petri_dish_ctrl_h_scrollBar.setValue(self.m_petri_dish_ctrl_h_scrollBar.value()+1)
+
+  def vbarScrollNextLineSlot(self):
+    if self.m_petri_dish_ctrl_v_scrollBar.value() < self.m_petri_dish_ctrl_v_scrollBar.maxValue():
+      self.m_petri_dish_ctrl_v_scrollBar.setValue(self.m_petri_dish_ctrl_v_scrollBar.value()+1)
+
+  def hbarScrollPrevLineSlot(self):
+    if self.m_petri_dish_ctrl_h_scrollBar.value() > self.m_petri_dish_ctrl_h_scrollBar.minValue():
+      self.m_petri_dish_ctrl_h_scrollBar.setValue(self.m_petri_dish_ctrl_h_scrollBar.value()-1)
+
+  def vbarScrollPrevLineSlot(self):
+    if self.m_petri_dish_ctrl_v_scrollBar.value() > self.m_petri_dish_ctrl_v_scrollBar.minValue():
+      self.m_petri_dish_ctrl_v_scrollBar.setValue(self.m_petri_dish_ctrl_v_scrollBar.value()-1)
+
   class itemDrag(QTextDrag):
     def __init__(self, item_name, parent=None, name=None):
         QStoredDrag.__init__(self, 'item name (QString)', parent, name)
         self.setText(item_name)
+




More information about the Avida-cvs mailing list