Changeset 1454:85f058506df7 in orange-bioinformatics


Ignore:
Timestamp:
07/11/11 10:52:15 (3 years ago)
Author:
ales_erjavec <ales.erjavec@…>
Branch:
default
Convert:
fe4386b0285f4251f635eb1485bf9442dff660c2
Message:

Changed the color schema.
Added point selection.
Resize and update the graph when on view resizeEvent.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • widgets/prototypes/OWDifferentiationScale.py

    r1452 r1454  
    5454         
    5555        self.scene = QGraphicsScene() 
    56         self.scene_view = QGraphicsView(self.scene, self.mainArea) 
     56        self.scene_view = DiffScaleView(self.scene, self.mainArea) 
    5757        self.scene_view.setRenderHint(QPainter.Antialiasing) 
     58        self.scene_view.setMinimumWidth(300) 
    5859        self.mainArea.layout().addWidget(self.scene_view) 
    5960        self.connect(self.scene, SIGNAL("selectionChanged()"), self.on_selection_changed) 
     61        self.connect(self.scene_view, SIGNAL("view_resized(QSize)"), lambda size: self.on_view_resized()) 
    6062         
    6163        self.data = None 
     
    101103        if self.data is not None: 
    102104            self.run_projections() 
     105            self.projection_layout() 
    103106            self.update_graph() 
     107             
    104108            info_text = """\ 
    105109Data with {0} genes  
     
    137141            self.clear() 
    138142            return 
    139              
    140     def update_graph(self): 
    141         """ Populate the Graphics Scene with the current projections.  
    142         """ 
    143         scene_size_hint = self.scene_view.viewport().size() 
    144         scene_size_hint = QSizeF(max(scene_size_hint.width() - 20, 100), 
    145                                  scene_size_hint.height()) 
     143         
     144    def projection_layout(self): 
     145        """ Compute the layout for the projections. 
     146        """ 
    146147        if self.projections1:  
    147148            projections = self.projections1 + self.projections2 
     
    151152            x_max = numpy.max(projections) 
    152153             
     154            # Scale projections  
    153155            projections = (projections - x_min) / ((x_max - x_min) or 1.0) 
    154             projections *= scene_size_hint.width() 
    155156            projections = list(projections) 
    156157             
     
    162163             
    163164            # TODO: handle samples with the same projection 
     165            # the point_layout should return the proj to sample mapping instead 
    164166            proj_to_sample = dict([((label, proj), sample) for label, proj, sample \ 
    165167                                   in zip(labels, projections, samples)]) 
     
    167169             
    168170            time_points = point_layout(labels, projections) 
     171            self.time_points = time_points 
    169172            level_height = 20 
    170173            all_points = numpy.array(reduce(add, [p for _, p in time_points], [])) 
    171              
     174            self.all_points = all_points 
     175             
     176#            all_points[:, 1] *= -level_height 
     177            self.time_samples = [] # samples for time label (same order as in self.time_points) 
     178             
     179            point_i = 0 
     180            for label, points, in time_points: 
     181                samples = []  
     182                for x, y in points: 
     183                    samples.append(proj_to_sample.get((label, x), None)) 
     184                self.time_samples.append((label, samples)) 
     185             
     186    def update_graph(self): 
     187        """ Populate the Graphics Scene with the current projections.  
     188        """ 
     189        scene_size_hint = self.scene_view.viewport().size() 
     190        scene_size_hint = QSizeF(max(scene_size_hint.width() - 50, 100), 
     191                                 scene_size_hint.height()) 
     192        self.scene.clear() 
     193         
     194        if self.projections1: 
     195            level_height = 20 
     196            all_points = self.all_points.copy() 
     197            all_points[:, 0] *= scene_size_hint.width() 
    172198            all_points[:, 1] *= -level_height 
    173199             
     
    175201            centers = [] 
    176202            z_value = 0 
    177             for label, points, in time_points: 
     203            for label, samples in self.time_samples: 
    178204                # Points 
    179                 points = all_points[point_i: point_i + len(points), :] 
    180                 for x, y in points: 
     205                p1 = all_points[point_i] 
     206                points = all_points[point_i: point_i + len(samples), :] 
     207                for (x, y), sample in zip(points, samples): 
    181208                    item = GraphicsTimePoint(QRectF(QPointF(x-3, y-3), QSizeF(6, 6))) 
    182209                    item.setBrush(QBrush(Qt.black)) 
    183                     sample = proj_to_sample.get((label, x), None) 
    184210                    item.sample = sample 
    185211                    item.setToolTip(sample[0].name if sample else "") 
    186212                    item.setZValue(z_value) 
    187213                    self.scene.addItem(item) 
    188                 p1 = all_points[point_i] 
    189                 point_i += len(points) 
     214                    point_i += 1 
    190215                p2 = all_points[point_i - 1] 
    191216                 
     
    231256            self.scene.addItem(title) 
    232257             
    233             for center, (label, _) in zip(centers, time_points): 
     258            for center, (label, _) in zip(centers, self.time_samples): 
    234259                x, y = center 
    235260                self.scene.addLine(x, -2, x, 2) 
     
    240265#                self.scene.addItem(text) 
    241266 
     267            self.scene.setSceneRect(self.scene.itemsBoundingRect().adjusted(-10, -10, 10, 10)) 
     268 
     269    def on_view_resized(self): 
     270        self.update_graph() 
     271         
    242272    def on_selection_changed(self): 
    243273        try: 
     
    256286                 
    257287        self.selected_time_samples = selected_attrs1, selected_attrs2 
    258          
     288        print self.selected_time_samples 
    259289        self.commit_if() 
    260290                 
     
    298328        QGraphicsEllipseItem.__init__(self, *args) 
    299329        self.setFlags(QGraphicsItem.ItemIsSelectable) 
     330        self.setAcceptsHoverEvents(True) 
     331        self._is_hovering = False 
    300332         
    301333    def paint(self, painter, option, widget=0): 
    302334        if self.isSelected(): 
    303335            brush = QBrush(Qt.red) 
    304             pen = QPen(Qt.red, 2) 
     336            pen = QPen(Qt.red, 1) 
    305337        else: 
    306             brush = QBrush(Qt.black) 
    307             pen = QPen(Qt.black, 2) 
     338            brush = QBrush(Qt.darkGray) 
     339            pen = QPen(Qt.black, 1) 
     340        if self._is_hovering: 
     341            brush = QBrush(brush.color().darker(200)) 
    308342        painter.save() 
    309343        painter.setBrush(brush) 
     
    312346        painter.restore() 
    313347         
    314                  
    315 def axis_ticks(points): 
    316     print points 
    317     return 
    318     points = [p[1] for p in points] 
    319     labels = [p[0] for p in points] 
    320     return 
    321  
    322 def axis_label_layout(labels, label_bounds, ticks): 
    323     raise_next = False 
    324     for label, (x1, x2), tick in zip(labels, label_bounds, ticks): 
    325         pass 
     348    def hoverEnterEvent(self, event): 
     349        self._is_hovering = True 
     350        self.update() 
     351        return QGraphicsEllipseItem.hoverEnterEvent(self, event) 
     352     
     353    def hoverLeaveEvent(self, event): 
     354        self._is_hovering = False 
     355        self.update() 
     356        return QGraphicsEllipseItem.hoverLeaveEvent(self, event) 
     357         
     358     
     359class DiffScaleView(QGraphicsView): 
     360    def resizeEvent(self, event): 
     361        QGraphicsView.resizeEvent(self, event) 
     362        self.emit(SIGNAL("view_resized(QSize)"), event.size()) 
    326363         
    327364 
     
    356393         
    357394    return list(groups.items()) 
    358              
     395     
     396         
    359397     
    360398if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.