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

gerrishj@myxo.css.msu.edu gerrishj at myxo.css.msu.edu
Mon Jul 3 13:16:15 PDT 2006


Author: gerrishj
Date: 2006-07-03 16:16:15 -0400 (Mon, 03 Jul 2006)
New Revision: 793

Added:
   branches/developers/avida-edward/source/python/AvidaGui2/pyTimeline.py
   branches/developers/avida-edward/source/python/AvidaGui2/timeline_arrow.png
Modified:
   branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
   branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeView.ui
   branches/developers/avida-edward/source/python/AvidaGui2/to-do_list
Log:
Basic timeline code.  Still needs work.


Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2006-07-03 20:07:19 UTC (rev 792)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeCtrl.py	2006-07-03 20:16:15 UTC (rev 793)
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 from pyOneOrg_ScopeView import pyOneOrg_ScopeView
+from pyTimeline import pyTimeline, Flag
 import qt
 import os
 
@@ -14,10 +15,17 @@
     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_timeline.setMinValue(0)
+    self.m_timeline.setMaxValue(0)
     self.m_timer = qt.QTimer()
     self.m_next = qt.QTimer()
     self.m_timer_interval = 100
 
+    # TODO: example to show flags, need to hook into TestCPU to get proper
+    # organism events
+    self.m_timeline.addFlag(Flag("timeline_arrow.png", 86, "First write into child"))
+    self.m_timeline.addFlag(Flag("timeline_arrow.png", 385, "Organism divide"))
+
     self.connect(
       self.m_execution_step_slider, qt.SIGNAL("valueChanged(int)"),
       self.sliderValueChangedSlot)
@@ -55,16 +63,19 @@
   def sliderValueChangedSlot(self, frame_number):
 #    print "pyOneOrg_ScopeCtrl.sliderValueChangedSlot(", frame_number, ")."
     self.m_organism_scope_ctrl.showFrame(frame_number)
+    self.m_timeline.setValue(frame_number)
 
 
   def gestationTimeChangedSlot(self, gestation_time):
     print "pyOneOrg_ScopeCtrl.gestationTimeChangedSlot called, gestation_time ", gestation_time
     self.m_execution_step_slider.setMaxValue(gestation_time - 1)
+    self.m_timeline.setMaxValue(gestation_time - 1)
     self.rewindSlot()
 
   def executionStepResetSlot(self, execution_step):
     print "pyOneOrg_ScopeCtrl.executionStepResetSlot called, execution_step ", execution_step
     self.m_execution_step_slider.setValue(execution_step)
+    self.m_timeline.setValue(execution_step)
     # This may be redundant (I'm not sure). @kgn
     self.m_execution_step_slider.emit(qt.SIGNAL("valueChanged(int)"),(execution_step,))
 
@@ -75,11 +86,13 @@
   def rewindSlot(self):
     print "pyOneOrg_ScopeCtrl.rewindSlot()."
     self.m_execution_step_slider.setValue(0)
+    self.m_timeline.setValue(0)
     self.pauseSlot()
 
   def cueSlot(self):
     print "pyOneOrg_ScopeCtrl.cueSlot()."
     self.m_execution_step_slider.setValue(self.m_execution_step_slider.maxValue())
+    self.m_timeline.setValue(self.m_timeline.maxValue())
     self.pauseSlot()
 
   def pauseSlot(self):
@@ -99,3 +112,4 @@
       self.pauseSlot()
     else:
       self.m_execution_step_slider.setValue(slider_value + 1)
+      self.m_timeline.setValue(slider_value + 1)

Modified: branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeView.ui
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeView.ui	2006-07-03 20:07:19 UTC (rev 792)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyOneOrg_ScopeView.ui	2006-07-03 20:16:15 UTC (rev 793)
@@ -3,6 +3,7 @@
 <comment>Python:from pyOrganismDataCtrl import pyOrganismDataCtrl
 Python:from pyOrganismScopeCtrl import pyOrganismScopeCtrl
 Python:from pyAnalyzeControlsCtrl import pyAnalyzeControlsCtrl
+Python:from pyTimeline import pyTimeline
 </comment>
 <widget class="QWidget">
     <property name="name">
@@ -71,6 +72,25 @@
                 </widget>
             </hbox>
         </widget>
+        <widget class="pyTimeline">
+            <property name="name">
+                <cstring>m_timeline</cstring>
+            </property>
+            <property name="sizePolicy">
+                <sizepolicy>
+                    <hsizetype>5</hsizetype>
+                    <vsizetype>5</vsizetype>
+                    <horstretch>0</horstretch>
+                    <verstretch>0</verstretch>
+                </sizepolicy>
+            </property>
+            <property name="minimumSize">
+                <size>
+                    <width>0</width>
+                    <height>20</height>
+                </size>
+            </property>
+        </widget>
         <widget class="QSlider">
             <property name="name">
                 <cstring>m_execution_step_slider</cstring>
@@ -163,6 +183,8 @@
         <property type="0">-1</property>
         <property type="1">pyAnalyzeControlsCtrl</property>
         <property type="0">-1</property>
+        <property type="1">pyAnalyzeControlsCtrl</property>
+        <property type="0">-1</property>
         <property type="pyAnalyzeControlsCtrl"></property>
         <property type="-1">1</property>
     </customwidget>
@@ -202,16 +224,40 @@
         <property type="-1">-1</property>
         <property type="3">0</property>
     </customwidget>
+    <customwidget>
+        <class>pyTimeline</class>
+        <header location="local"></header>
+        <sizehint>
+            <width>-1</width>
+            <height>-1</height>
+        </sizehint>
+        <container>0</container>
+        <sizepolicy>
+            <hordata>5</hordata>
+            <verdata>5</verdata>
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+        </sizepolicy>
+        <pixmap>image1</pixmap>
+        <property type="0">4</property>
+        <property type="1">pyOrganismDataCtrl</property>
+        <property type="-1">-1</property>
+        <property type="3">0</property>
+    </customwidget>
 </customwidgets>
 <images>
     <image name="image0">
-        <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7!
 ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e05!
 82c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454e44a!
 e426082<
/data>
+        <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154388dad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7!
 ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e05!
 82c261e95f8bfc04f1a1e8bc5c4dfe0a190172af6a9690000000049454e44a!
 e426082<
/data>
     </image>
+    <image name="image1">
+        <data format="PNG" length="1125">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b0000042c49444154388db5954f6c14551cc73fefcd7476b65bdaae4bb78bb5502a14d404e4801c88182d1c4c2c693da847400f9c24c68b878684238660e2b1e01f12c19493012ef2478c814412d354a46017a8a564bb6da5bbedccee767776e63d0ffb073751d483bfe49799974c3eeffb7ebf37df9fd05a530b2184040cc0042420aaf9a4d0d554800f045a6b256ae0e1e1e1d6bebebe838ee31c48a7d39b5cd7fd075e251cc7617272f2ded8d8d819cff33e0316819259537aead4a9839d5dd6d1784f91f55b0a94830242088404d304292bef68a89f520802a598fecddaa04f1a876f5c250c7c0a64cdeac686e33807e23d45e6b297c8b877f1831542614550b6599835c83c2a81b6786a75134faf2f1169f12997350881d9021d0903e06de0745d3160a6d3e94dbd5b0a64dcbb94b5831d0e3375ab892b1772dcf9790528543f8dd0d367b36768153b5e31503a0f1aecb004580b44ffac58baae8b1714f0833c7638cc8dab303a320f4822ab4c7a37c69196203de3319d5ce1c4d13c733331dedc67a129a154fd128401ab0616d55a130ac3d42d93d1913940d13fd0c9ee0183685c60da01c5421bd72f7a8c8efccef9afd374267ad93!
 d642365be0636a0d28ec7600941d9e6f23917f0e97f23ce5bef35d19ec863da0ed9059b2be70bec196c66dfa10ec0e49b338f7017258651bf95021035c595429bb0903248fe52a2b5b595dd7b4d945cc2340cdca536be389ee3f67886c5798f773fe8e0dac508c989659277a2180da4ca4ff07821058b8b251445d63d6b13ed1098a6417e39cac85197dbe31962ab9bd9f1f22a226d45366f6d0620fdb08c900d281af6110284b20085b414861d905d88f2e52739ee8cbb8022143259d3dd84691730aa2d52da441a8de0c6958068870022a41e9629ad3473fd3b8fdbe319dadb9b4924da994d2d716c7896fbe35152f78b48245d6b2da4507faf582be8eaf159b721cc837b05ae7debb1f79d08cb8b515edad942a22bc4b1c33eb3d34b1c797f06af90a72d16e2f96d9a74aa11dca8586b222d01af0fb60070f6c402d72f15d97f28c6f6d7027a5f5ce6c3233dc4e2ede496b278be4fff608cee8d3e1add806aeca51094cbb06397c1ecc328e746537c7e3ccdb5cb1136bf60635882d4d41c6ec6836ab37efa214f72208ed9f4d7cdd38ee310280542e38b1c43fb6de26b3672e1ec3cc99bcb246f66a938a3241ab3e91f7c861fbf77710b1e5e49915bae974203ba0e9e9c9cbc373d6d6d305a040a89c2a77f50b27d5782bbbf7acccf28349235dd16cf6dd374f7295e1de8a45!
 c02d37499182b01cc0201a085d61a2144d8b2ac8fb6ed340e77240c4261890!
 e04c2501
85262546d534a032154b59e0ad394e41c98182bf268ce6721ed9f064e0253356f6da2e24c1f030f783c15fe6da680af8021602bd051532ca9b8521488559f61aa86c29343578fbf0264a94c906c7d3409214c20043457a116ff6de6795578012889ff6b98fe016ea0ce1c6a2573410000000049454e44ae426082</data>
+    </image>
 </images>
 <layoutdefaults spacing="6" margin="11"/>
 <includehints>
     <includehint>pyorganismdatactrl.h</includehint>
     <includehint>pyorganismscopectrl.h</includehint>
     <includehint>pyanalyzecontrolsctrl.h</includehint>
+    <includehint>pytimeline.h</includehint>
 </includehints>
 </UI>

Added: branches/developers/avida-edward/source/python/AvidaGui2/pyTimeline.py
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/pyTimeline.py	2006-07-03 20:07:19 UTC (rev 792)
+++ branches/developers/avida-edward/source/python/AvidaGui2/pyTimeline.py	2006-07-03 20:16:15 UTC (rev 793)
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+
+from qt import Qt, QPainter, QPixmap, QWidget, QToolTip, QSize
+from qwt import QwtThermo
+
+class FlagWidget(QWidget):
+    def __init__(self, parent, pixmap, info):
+        QWidget.__init__(self, parent)
+        self.pixmap = pixmap
+        QToolTip.add(self, info)
+        self.pixmap_size = QSize(self.pixmap.width(), self.pixmap.height())
+        self.setFixedSize(self.pixmap_size)
+
+    def paintEvent(self, event):
+        painter = QPainter(self)
+        painter.drawPixmap(0, 0, self.pixmap)
+
+    def minimumSizeHint(self):
+        "Set our minimum size hint to the size of the pixmap"
+        return self.pixmap_size
+
+    def sizeHint(self):
+        return self.pixmap_size
+
+class Flag:
+    "Flag contains information about event flags."
+    def __init__(self, filename, pos, info):
+        self.filename = filename
+        self.pos = pos
+        self.info = info
+        self.pixmap = QPixmap(filename)
+
+class pyTimeline(QwtThermo):
+    """pyTimeline is a generic timeline control.
+    It is derived from the QwtThermo control.  It offers the ability to plot
+    flags on the timeline."""
+    def __init__(self, *args):
+        QwtThermo.__init__(self, *args)
+        self.setOrientation(Qt.Horizontal, QwtThermo.Bottom)
+        self.setPipeWidth(16)
+        self.flags = []
+
+    def addFlag(self, flag):
+        "Add new flag to timeline"
+        self.flags.append(flag)
+        flag.widget = FlagWidget(self, flag.pixmap, flag.info)
+        self.move_flag(flag)
+        if self.maxValue() == 0.0:
+            flag.widget.hide()
+
+    def move_flag(self, flag):
+        "Draw the flag in the proper location"
+        if self.maxValue() == 0.0:
+            # Uninitialized range
+            return
+        # adj adjusts for the pixmap size
+        adj = flag.pos - (flag.widget.pixmap_size.width() / 2)
+        # adjust for borders
+        borders = self.borderWidth() * 2 + 13
+        # FIXME: horrible hack 418 depends on current geometry of window
+        # TODO: figure out proper geometry code
+        a = self.width() - 418
+        mult = a / (self.maxValue() - self.minValue())
+#        print self.height()
+#        print "frameGeometry: %d" % (self.frameSize().width())
+#        print "size: %d" % (self.width())
+#        print flag.pos * mult
+#        print adj
+#        print borders
+        flag.widget.move((flag.pos * mult) + adj + borders, 2)
+
+    def removeFlag(self, pos):
+        "Remove flag from timeline position pos"
+        tmp_flag = None
+        for flag in self.flags:
+            if flag.pos == pos:
+                tmp_flag = flag
+        if tmp_flag:
+            self.flags.remove(tmp_flag)
+            tmp_flag.widget.hide()
+
+    def paintEvent(self, event):
+        "Paint event handler"
+        QwtThermo.paintEvent(self, event)
+        self.draw_flags()
+
+    def draw_flags(self):
+        "Draw flags on timeline"
+        for flag in self.flags:
+            self.move_flag(flag)
+
+    def setMaxValue(self, value):
+        "Set the range max value"
+        old_value = self.maxValue()
+        QwtThermo.setMaxValue(self, value)
+        if old_value == 0.0:
+            for flag in self.flags:
+                flag.widget.show()
+
+    def setIncrementalShow(flag):
+        "Hide flags until the meter hits their position"
+        self.surprise = flag
+
+    def reset(self):
+        "Reset the timeline, hiding all flags"
+        for flag in self.flags:
+            flag.widget.hide()

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


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

Modified: branches/developers/avida-edward/source/python/AvidaGui2/to-do_list
===================================================================
--- branches/developers/avida-edward/source/python/AvidaGui2/to-do_list	2006-07-03 20:07:19 UTC (rev 792)
+++ branches/developers/avida-edward/source/python/AvidaGui2/to-do_list	2006-07-03 20:16:15 UTC (rev 793)
@@ -108,6 +108,12 @@
 
 08-Jun-06 Add printing/saving images to organism and population stats view.
 
+03-Jul-06 Fix analysis mode pop box resizing issues
+03-Jul-06 Delete extra whitespace at top of analysis-mode
+03-Jul-06 Change title to y-axis vs. x-axis
+03-Jul-06 Remove "Drag a Full Petri Dish..." after first dish is dragged
+03-Jul-06 Remove flip arrow on analyze mode
+
 ************Other*****************
 a.	Under the sliders with ranges put a few values in grey that tell you the range min and max (non)
 




More information about the Avida-cvs mailing list