Changeset 8437:3a3a4ebcbc61 in orange


Ignore:
Timestamp:
07/24/11 13:06:08 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
5c8222298cfd49e0e295ccdde057e4ea1f3eaf82
Message:

Movable, animated legend that changes layout depending on its position

Location:
orange/OrangeWidgets
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/Prototypes/OWScatterPlotGraphQt.py

    r8423 r8437  
    99from orngScaleScatterPlotData import * 
    1010import ColorPalette 
     11import numpy 
    1112 
    1213DONT_SHOW_TOOLTIPS = 0 
  • orange/OrangeWidgets/plot/owcurve.py

    r8379 r8437  
    3131        if tooltip: 
    3232            self.setToolTip(tooltip) 
     33        self.name = '' 
    3334 
    3435             
  • orange/OrangeWidgets/plot/owlegend.py

    r8436 r8437  
    11 
    22 
    3 from PyQt4.QtGui import QGraphicsItem, QGraphicsTextItem, QGraphicsRectItem, QColor 
    4 from PyQt4.QtCore import QPointF, QRectF, Qt 
     3from PyQt4.QtGui import QGraphicsItem, QGraphicsTextItem, QGraphicsRectItem, QGraphicsObject, QColor, QPen 
     4from PyQt4.QtCore import QPointF, QRectF, Qt, QPropertyAnimation 
    55 
    66from owpoint import * 
     
    1111PointSymbol = 4 
    1212 
     13class OWLegendItem(QGraphicsObject): 
     14    def __init__(self, curve, parent): 
     15        QGraphicsObject.__init__(self, parent) 
     16        self.text_item = QGraphicsTextItem(curve.name, self) 
     17        s = curve.pointSize() 
     18        height = max(2*s, self.text_item.boundingRect().height()) 
     19        p = 0.5 * height 
     20        self.text_item.setPos(height, 0) 
     21        self.point_item = curve.pointItem(p, p, s, self) 
     22        self._rect = QRectF(0, 0, height + self.text_item.boundingRect().width(), height ) 
     23        self.rect_item = QGraphicsRectItem(self._rect, self) 
     24        self.rect_item.setPen(QPen(Qt.NoPen)) 
     25         
     26    def boundingRect(self): 
     27        return self._rect 
     28         
     29    def paint(self, painter, option, widget): 
     30        pass 
     31         
    1332class OWLegend(QGraphicsItem): 
    1433    def __init__(self, graph, scene): 
     
    2948        self.setFlag(self.ItemHasNoContents, True) 
    3049        self.mouse_down = False 
     50        self._orientation = Qt.Vertical 
     51        self.animated = True 
    3152         
    3253    def clear(self): 
     
    3859 
    3960    def add_curve(self, curve, attributes = []): 
    40         for point_attribute, data_attribute, value in attributes: 
    41             if point_attribute not in self.point_attrs: 
    42                 self.point_attrs[point_attribute] = data_attribute 
    43                  
    44             if point_attribute == PointColor: 
    45                 point_val = curve.color() 
    46             elif point_attribute == PointSize: 
    47                 point_val = curve.pointSize() 
    48             else: 
    49                 point_val = curve.symbol() 
    50  
    51             if not point_attribute in self.point_vals: 
    52                 self.point_vals[point_attribute] = {} 
    53             self.point_vals[point_attribute][point_val] = value 
    54         self.curves.append(curve) 
     61        self.items.append(OWLegendItem(curve, self)) 
    5562        self.update() 
    5663         
    5764    def update(self): 
    58         for i in self.items: 
    59             self.scene().removeItem(i) 
    60         del self.items[:] 
    61         y = 10 
    62         length = 0 
    63         if self.point_attrs: 
    64             ## Using the owplot API to specify paremeters 
    65             ## NOTE: The API is neither finished nor used 
    66             for p_a, d_a in self.point_attrs.iteritems(): 
    67                 ## We construct a separate box for each attribute  
    68                 title_item = QGraphicsTextItem( d_a, self ) 
    69                 title_item.setPos(QPointF(10, y-10)) 
    70                 self.items.append(title_item) 
    71                 y = y + 20 
    72                 for p_v, d_v in self.point_vals[p_a].iteritems(): 
    73                     color = p_v if p_a == PointColor else self.default_values[PointColor] 
    74                     symbol = p_v if p_a == PointSymbol else self.default_values[PointSymbol] 
    75                     size = p_v if p_a == PointSize else self.default_values[PointSize] 
    76                     self.items.append( point_item(10, y,  color, symbol, size, self) ) 
    77                     text = QGraphicsTextItem(d_v, self) 
    78                     text.setPos(QPointF(20, y-10)) 
    79                     self.items.append(text) 
    80                     y = y + 20 
    81                 y = y + 10 
    82         else: 
    83             for curve in self.curves: 
    84                 self.items.append(curve.pointItem(10, y, curve.pointSize(), self)) 
    85                 text = QGraphicsTextItem(curve.name, self) 
    86                 length = max(length, text.boundingRect().width()) 
    87                 text.setPos(QPointF(20, y-10)) 
    88                 self.items.append(text) 
    89                 y = y + 20 
    90             if self.curves: 
    91                 self.box_rect = QRectF(0, 0, 20 + length, y-10) 
    92                 box_item = QGraphicsRectItem(self.box_rect, self) 
    93                 box_item.setBrush(Qt.white) 
    94                 box_item.setZValue(-1) 
    95                 self.items.append(box_item) 
    96             else: 
    97                 box_rect = QRectF() 
     65        self._animations = [] 
     66        self.box_rect = QRectF() 
     67        if self._orientation == Qt.Vertical: 
     68            y = 0 
     69            for item in self.items: 
     70                self.move_item(item, 0, y) 
     71                y = y + item.boundingRect().height() 
     72                self.box_rect = self.box_rect | item.mapRectToParent(item.boundingRect()) 
     73        elif self._orientation == Qt.Horizontal: 
     74            x = 0 
     75            for item in self.items: 
     76                self.move_item(item, x, 0) 
     77                x = x + item.boundingRect().width() 
     78                self.box_rect = self.box_rect | item.mapRectToParent(item.boundingRect()) 
    9879                 
    9980    def mouseMoveEvent(self, event): 
     
    11899        pass 
    119100     
     101    def set_orientation(self, orientation): 
     102        self._orientation = orientation 
     103        self.update() 
     104         
     105    def move_item(self, item, x, y): 
     106        if self.animated: 
     107            a = QPropertyAnimation(item, 'pos') 
     108            a.setStartValue(item.pos()) 
     109            a.setEndValue(QPointF(x,y)) 
     110            a.start(QPropertyAnimation.DeleteWhenStopped) 
     111            self._animations.append(a) 
     112        else: 
     113            item.setPos(x, y) 
  • orange/OrangeWidgets/plot/owplot.py

    r8436 r8437  
    106106        self._legend = OWLegend(self, self.scene()) 
    107107        self._legend.setZValue(LegendZValue) 
    108         self._legend_margin = QRectF() 
     108        self._legend_margin = QRectF(0, 0, 100, 0) 
    109109        self._legend_moved = False 
    110110        self.axes = dict() 
     
    453453        if self.show_legend: 
    454454            if not self._legend_moved: 
    455                 self._legend.setPos(graph_rect.topRight() - QPointF(self.legend_rect().width(), 0)) 
     455                self._legend.setPos(graph_rect.topRight() + QPointF(-100, 100)) 
    456456            self._legend.show() 
    457457             
     
    953953        elif l.top() < g.top() + offset: 
    954954            rect.setTop(l.height()) 
    955         elif l.bottom() > g.bottom() + offset: 
     955        elif l.bottom() > g.bottom() - offset: 
    956956            rect.setBottom(l.height()) 
    957957        if rect != self._legend_margin: 
     958            self._legend.set_orientation(Qt.Horizontal if rect.top() or rect.bottom() else Qt.Vertical) 
    958959            self._legend_animation = QPropertyAnimation(self, 'legend_margin') 
    959960            self._legend_animation.setStartValue(self._legend_margin) 
Note: See TracChangeset for help on using the changeset viewer.