Changeset 8436:21e3029685e8 in orange


Ignore:
Timestamp:
07/24/11 11:39:57 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
0b6b790dba9048203f9471267610d99c3a699c89
Message:

Moving the legend towards the edge of the graph shrinks the graph, so that there is space for the legend outside of the graph area

Location:
orange/OrangeWidgets/plot
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • orange/OrangeWidgets/plot/owconstants.py

    r8431 r8436  
    2121PlotZValue = 0 
    2222HighlightZValue = 5 
     23LegendZValue = 10 
  • orange/OrangeWidgets/plot/owlegend.py

    r8428 r8436  
    1212 
    1313class OWLegend(QGraphicsItem): 
    14     def __init__(self, scene): 
    15         QGraphicsItemGroup.__init__(self, None, scene) 
     14    def __init__(self, graph, scene): 
     15        QGraphicsItem.__init__(self, None, scene) 
     16        self.graph = graph 
    1617        self.curves = [] 
    1718        self.items = [] 
     
    9899    def mouseMoveEvent(self, event): 
    99100        self.setPos(self.pos() + event.scenePos() - event.lastScenePos()) 
     101        self.graph.notify_legend_moved() 
    100102        event.accept() 
    101103             
  • orange/OrangeWidgets/plot/owplot.py

    r8435 r8436  
    104104        self.graph_item.setPen(QPen(Qt.NoPen)) 
    105105         
    106         self._legend = OWLegend(self.scene()) 
    107         self._legend.setZValue(1.0) 
     106        self._legend = OWLegend(self, self.scene()) 
     107        self._legend.setZValue(LegendZValue) 
     108        self._legend_margin = QRectF() 
     109        self._legend_moved = False 
    108110        self.axes = dict() 
    109111        self.axis_margin = 50 
     
    184186    selectionCurveList = deprecated_attribute("selectionCurveList", "selection_items") 
    185187    autoSendSelectionCallback = deprecated_attribute("autoSendSelectionCallback", "auto_send_selection_callback") 
     188    showLegend = deprecated_attribute("ShowLegend", "show_legend") 
    186189     
    187190    def __setattr__(self, name, value): 
     
    446449            graph_rect.setTop(graph_rect.top() + self.title_margin) 
    447450         
     451        self._legend_outside_area = graph_rect 
     452         
    448453        if self.show_legend: 
    449             ## TODO: Figure out a good placement for the legend, possibly outside the graph area 
    450             self._legend.setPos(graph_rect.topRight() - QPointF(100, 0)) 
     454            if not self._legend_moved: 
     455                self._legend.setPos(graph_rect.topRight() - QPointF(self.legend_rect().width(), 0)) 
    451456            self._legend.show() 
     457             
     458            ## Adjust for possible external legend: 
     459            r = self._legend_margin 
     460            graph_rect.adjust(r.left(), r.top(), -r.right(), -r.bottom()) 
    452461        else: 
    453462            self._legend.hide() 
    454          
     463             
    455464        axis_rects = dict() 
    456465        margin = min(self.axis_margin,  graph_rect.height()/4, graph_rect.height()/4) 
     
    576585        return self._legend 
    577586         
     587    def legend_rect(self): 
     588        return self._legend.mapRectToScene(self._legend.boundingRect()) 
     589         
    578590    def isLegendEvent(self, event, function): 
    579         rect = self._legend.boundingRect() 
    580         rect = self._legend.mapRectToScene(rect) 
    581        # rect.translate(self._legend.pos()) 
    582         if rect.contains(self.mapToScene(event.pos())): 
     591        if self.legend_rect().contains(self.mapToScene(event.pos())): 
    583592            function(self, event) 
    584593            return True 
     
    931940    def showTip(self, x, y, text): 
    932941        QToolTip.showText(self.mapToGlobal(QPoint(x, y)), text, self, QRect(x-3,y-3,6,6)) 
     942         
     943    def notify_legend_moved(self): 
     944        self._legend_moved = True 
     945        l = self.legend_rect() 
     946        g = getattr(self, '_legend_outside_area', QRectF()) 
     947        offset = 10 
     948        rect = QRectF() 
     949        if l.right() > g.right() - offset: 
     950            rect.setRight(l.width()) 
     951        elif l.left() < g.left() + offset: 
     952            rect.setLeft(l.width()) 
     953        elif l.top() < g.top() + offset: 
     954            rect.setTop(l.height()) 
     955        elif l.bottom() > g.bottom() + offset: 
     956            rect.setBottom(l.height()) 
     957        if rect != self._legend_margin: 
     958            self._legend_animation = QPropertyAnimation(self, 'legend_margin') 
     959            self._legend_animation.setStartValue(self._legend_margin) 
     960            self._legend_animation.setEndValue(rect) 
     961            self._legend_animation.setDuration(100) 
     962            self._legend_animation.start(QPropertyAnimation.DeleteWhenStopped) 
     963 
     964    @pyqtProperty(QRectF) 
     965    def legend_margin(self): 
     966        return self._legend_margin 
     967         
     968    @legend_margin.setter 
     969    def legend_margin(self, value): 
     970        self._legend_margin = value 
     971        self.update_layout() 
     972        self.update_axes() 
     973         
     974         
Note: See TracChangeset for help on using the changeset viewer.