Changeset 8434:35ac158feccc in orange


Ignore:
Timestamp:
07/24/11 10:50:48 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
0a5bddb4cfd277c63bd8eba8cb117b391e197c9b
Message:

Prevent crashes when updating items asynchronously and infinite recursion in distribErrorBarCurve

Files:
3 edited

Legend:

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

    r8423 r8434  
    2626        self._items = [] 
    2727        OWCurve.__init__(self,xData=[], yData=[]) 
     28        self._currently_updating = False 
    2829         
    2930    def updateProperties(self): 
     31        if self._currently_updating: 
     32            OWCurve.updateProperties(self) 
     33            self._currently_updating = False 
     34            return 
     35             
     36        self._currently_updating = True 
    3037        if self.style() != OWCurve.UserCurve: 
    3138            resize_plot_item_list(self._items, 0, None, self) 
    3239            self.items = [] 
    3340            self.setDirty() 
    34             OWCurve.updateProperties(self) 
    35             return 
    36              
    37         t = self.graphTransform() 
    38         d = self.data() 
    39         n = len(d)/3 
    40         self._items = resize_plot_item_list(self._items, n, QGraphicsPathItem, self) 
    41         for i in range(n): 
    42             p = QPainterPath() 
    43             px, py1 = d[3*i] 
    44             _, py2 = d[3*i+1] 
    45             _, py3 = d[3*i+2] 
    46             pxl = px - 0.1 
    47             pxr = px + 0.1 
    48             p.moveTo(px, py1) 
    49             p.lineTo(px, py3) 
    50             p.moveTo(pxl, py1) 
    51             p.lineTo(pxr, py1) 
    52             p.moveTo(pxl, py3) 
    53             p.lineTo(pxr, py3) 
    54             self._items[i].setPath(t.map(p)) 
    55             self._items[i].setPen(self.pen()) 
     41        else: 
     42            t = self.graphTransform() 
     43            d = self.data() 
     44            n = len(d)/3 
     45            self._items = resize_plot_item_list(self._items, n, QGraphicsPathItem, self) 
     46            for i in range(n): 
     47                p = QPainterPath() 
     48                px, py1 = d[3*i] 
     49                _, py2 = d[3*i+1] 
     50                _, py3 = d[3*i+2] 
     51                pxl = px - 0.1 
     52                pxr = px + 0.1 
     53                p.moveTo(px, py1) 
     54                p.lineTo(px, py3) 
     55                p.moveTo(pxl, py1) 
     56                p.lineTo(pxr, py1) 
     57                p.moveTo(pxl, py3) 
     58                p.lineTo(pxr, py3) 
     59                self._items[i].setPath(t.map(p)) 
     60                self._items[i].setPen(self.pen()) 
     61        self._currently_updating = False 
    5662 
    5763class OWDistributionGraphQt(OWPlot): 
  • source/orangeplot/curve.cpp

    r8433 r8434  
    2929Curve::~Curve() 
    3030{ 
    31  
     31    cancelAllUpdates(); 
    3232} 
    3333 
    3434void Curve::updateNumberOfItems() 
    3535{ 
     36  cancelAllUpdates(); 
    3637  if (m_continuous) 
    3738  { 
     
    9697  if (m_needsUpdate & UpdatePosition) 
    9798  { 
     99    cancelAllUpdates(); 
    98100    QPointF p; 
    99101    for (int i = 0; i < n; ++i) 
     
    113115void Curve::updateAll() 
    114116{ 
    115   if (m_needsUpdate & UpdateContinuous) 
    116   { 
    117     changeContinuous(); 
    118   } 
    119    
    120   else  
    121   { 
    122     if (m_needsUpdate & UpdateNumberOfItems) 
    123     { 
    124       updateNumberOfItems(); 
    125     } 
    126      
    127     int n = m_data.size(); 
    128     QBrush brush(m_color); 
    129     QPointF p; 
    130     for (int i = 0; i < n; ++i) 
    131     { 
    132       Point* item = m_pointItems[i]; 
    133       DataPoint& point = m_data[i]; 
    134       p = QPointF(point.x, point.y); 
    135       item->setPos(p * m_graphTransform); 
    136       } 
    137   } 
    138   m_needsUpdate = 0; 
    139 } 
    140  
     117  m_needsUpdate = UpdateAll; 
     118  updateProperties(); 
     119} 
    141120 
    142121Point* Curve::pointItem(qreal x, qreal y, int size, QGraphicsItem* parent) 
     
    330309void Curve::changeContinuous() 
    331310{ 
     311  cancelAllUpdates(); 
    332312  if (m_continuous) 
    333313  { 
     
    407387    checkForUpdate(); 
    408388} 
     389 
     390void Curve::cancelAllUpdates() 
     391{ 
     392    foreach (QFuture<void> f, m_currentUpdate) 
     393    { 
     394        if (f.isRunning()) 
     395        { 
     396            f.cancel(); 
     397            f.waitForFinished(); 
     398        } 
     399    } 
     400    m_currentUpdate.clear(); 
     401} 
  • source/orangeplot/curve.h

    r8423 r8434  
    215215  void changeContinuous(); 
    216216  void updateBounds(); 
     217  void cancelAllUpdates(); 
    217218   
    218219  QColor m_color; 
     
    245246    { 
    246247        m_currentUpdate[flag].cancel(); 
     248        m_currentUpdate[flag].waitForFinished(); 
    247249    } 
    248250    m_currentUpdate[flag] = QtConcurrent::map(sequence, updater); 
Note: See TracChangeset for help on using the changeset viewer.