Changeset 8410:2a2e6cca1004 in orange


Ignore:
Timestamp:
07/21/11 12:45:24 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
30646698db0981e96039b6b9b2809cfd042c78b4
Message:

Don't recreate all the items needed by OWAxis on every update, speeds up updating and zooming.

Location:
orange/OrangeWidgets/plot
Files:
3 edited

Legend:

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

    r8409 r8410  
    4141from owpalette import * 
    4242from owconstants import * 
     43from owtools import resize_plot_item_list 
    4344 
    4445class OWAxis(QGraphicsItemGroup): 
     
    117118        if self.update_callback: 
    118119            self.update_callback() 
    119  
    120     def update(self): 
     120             
     121 
     122    def update(self, zoom_only = False): 
    121123        if not self.graph_line or not self.title or not self.scene(): 
    122124            return 
     
    148150         
    149151        ## Arrows 
    150         if self.start_arrow_item: 
    151             self.scene().removeItem(self.start_arrow_item) 
    152             self.start_arrow_item = None 
    153         if self.end_arrow_item: 
    154             self.scene().removeItem(self.end_arrow_item) 
    155             self.end_arrow_item = None 
    156              
     152        if not zoom_only: 
     153            if self.start_arrow_item: 
     154                self.scene().removeItem(self.start_arrow_item) 
     155                self.start_arrow_item = None 
     156            if self.end_arrow_item: 
     157                self.scene().removeItem(self.end_arrow_item) 
     158                self.end_arrow_item = None 
     159 
    157160        if self.arrows & AxisStart: 
    158             self.start_arrow_item = QGraphicsPathItem(self.arrow_path, self) 
     161            if not zoom_only or not self.start_arrow_item: 
     162                self.start_arrow_item = QGraphicsPathItem(self.arrow_path, self) 
    159163            self.start_arrow_item.setPos(self.graph_line.p1()) 
    160164            self.start_arrow_item.setRotation(-self.graph_line.angle() + 180) 
    161165            self.start_arrow_item.setBrush(self.style.brush()) 
    162166        if self.arrows & AxisEnd: 
    163             self.end_arrow_item = QGraphicsPathItem(self.arrow_path, self) 
     167            if not zoom_only or not self.end_arrow_item: 
     168                self.end_arrow_item = QGraphicsPathItem(self.arrow_path, self) 
    164169            self.end_arrow_item.setPos(self.graph_line.p2()) 
    165170            self.end_arrow_item.setRotation(-self.graph_line.angle()) 
    166             self.end_arrow_item.setBrush(self.style.brush())\ 
     171            self.end_arrow_item.setBrush(self.style.brush()) 
    167172             
    168173        ## Labels 
     
    170175        self.update_ticks() 
    171176         
    172         for i in self.label_items: 
    173             self.scene().removeItem(i) 
    174         del self.label_items[:] 
    175         for i in self.tick_items: 
    176             self.scene().removeItem(i) 
    177         del self.tick_items[:] 
     177        n = len(self._ticks) 
     178        self.label_items = resize_plot_item_list(self.label_items, n, QGraphicsTextItem, self) 
     179        self.tick_items = resize_plot_item_list(self.tick_items, n, QGraphicsLineItem, self) 
     180         
    178181        if self.scale: 
    179182            min, max, step = self.scale 
    180183        else: 
    181184            step = 1 
    182         ratio = self.zoom_transform.map(self.graph_line).length() / self.graph_line.length() 
    183         for pos, text, size in self._ticks: 
     185         
     186        test_rect = QRectF(self.graph_line.p1(),  self.graph_line.p2()).normalized() 
     187        test_rect.adjust(-1, -1, 1, 1) 
     188        v = self.graph_line.normalVector().unitVector() 
     189        for i in range(len(self._ticks)): 
     190            pos, text, size = self._ticks[i] 
    184191            label_pos = self.map_to_graph( pos ) 
    185             test_rect = QRectF(self.graph_line.p1(),  self.graph_line.p2()).normalized() 
    186             test_rect.adjust(-1, -1, 1, 1) 
    187192            if not test_rect.contains(label_pos): 
    188193                continue 
    189194            hs = 0.5*step 
    190195            label_pos = self.map_to_graph(pos - hs) 
    191             item = QGraphicsTextItem(self) 
    192             item.setHtml( '<center>' + text.strip() + '</center>') 
     196            item = self.label_items[i] 
     197            if not zoom_only: 
     198                item.setHtml( '<center>' + text.strip() + '</center>') 
    193199            item.setTextWidth( QLineF(self.map_to_graph(pos - hs), self.map_to_graph(pos + hs) ).length() ) 
    194             v = self.graph_line.normalVector().unitVector() 
    195200            if self.title_above: 
    196201                label_pos = label_pos + (v.p2() - v.p1())*40 
    197202            item.setPos(label_pos) 
    198203            item.setRotation(-self.graph_line.angle()) 
    199             self.label_items.append(item) 
    200              
    201             item = QGraphicsLineItem(self) 
     204             
     205            item = self.tick_items[i] 
    202206            tick_line = QLineF(v) 
    203207            tick_line.translate(-tick_line.p1()) 
     
    208212            item.setPen(self.style.pen()) 
    209213            item.setPos(self.map_to_graph(pos)) 
    210             self.tick_items.append(item) 
    211         
     214             
    212215    @staticmethod 
    213216    def make_title(label, unit = None): 
     
    267270        min, max, step = self.scale 
    268271        magnitude = log10(abs(max-min)) 
    269          
    270     def update_zoom(self): 
    271         if not self.graph_line: 
    272             return 
    273         if self.scale: 
    274             min, max, step = self.scale 
    275         else: 
    276             step = 1 
    277         v = self.graph_line.normalVector().unitVector() 
    278         rect = QRectF(self.graph_line.p1(), self.graph_line.p2()) 
    279         rect.adjust(-1, -1, 1, 1) 
    280         for i in range(len(self._ticks)): 
    281             pos, text, size = self._ticks[i] 
    282             hs = 0.5 * step 
    283             label_pos = self.map_to_graph(pos - hs) 
    284             self.label_items[i].setTextWidth( QLineF(self.map_to_graph(pos - hs), self.map_to_graph(pos + hs) ).length() ) 
    285             if self.title_above: 
    286                 label_pos = label_pos + (v.p2() - v.p1())*40 
    287             self.label_items[i].setPos(label_pos) 
    288             graph_pos = self.map_to_graph(pos) 
    289             self.tick_items[i].setPos(graph_pos) 
    290             visible = rect.contains(graph_pos) 
    291             self.tick_items[i].setVisible(visible) 
    292             self.label_items[i].setVisible(visible) 
    293              
  • orange/OrangeWidgets/plot/owplot.py

    r8408 r8410  
    531531                item.graph_line.translate(self.graph_item.pos()) 
    532532            item.zoom_transform = self.zoom_transform 
    533             if zoom_only: 
    534                 item.update_zoom() 
    535             else: 
    536                 item.update() 
     533            item.update(zoom_only) 
    537534         
    538535    def replot(self, force = False): 
  • orange/OrangeWidgets/plot/owtools.py

    r8406 r8410  
    142142    def updateProperties(self): 
    143143        self._item.setPos(self.graphTransform().map(self._data_point)) 
     144 
     145class MovableItem(orangeplot.PlotItem): 
     146    def __init__(self): 
     147        orangeplot.PlotItem.__init__(self) 
     148         
     149    def mouseMoveEvent(self, event): 
     150        if event.buttons(): 
     151            self.setPos(self.pos() + event.scenePos() - event.lastScenePos()) 
     152     
Note: See TracChangeset for help on using the changeset viewer.