Changeset 8376:65bcd64a6306 in orange


Ignore:
Timestamp:
07/06/11 15:07:09 (3 years ago)
Author:
Noughmad <Noughmad@…>
Branch:
default
Convert:
c34b2bbd37ecb21e6b0f421598cf3023126e7b96
Message:

Initial (testing) implementation of multi-threaded curve updating.

Files:
5 edited

Legend:

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

    r8374 r8376  
    466466        self.zoom_transform = self.transform_for_zoom(self._zoom_factor, self._zoom_point, self.graph_area) 
    467467        self.zoom_rect = self.zoom_transform.mapRect(self.graph_area) 
    468         """ 
    469468        for c in self.itemList(): 
    470             x,y = c.axes() 
    471             if hasattr(c, 'setGraphTransform'): 
    472                 c.setGraphTransform(self.transform_for_axes(x,y) * self.zoom_transform) 
    473                 c.updateProperties() 
    474             else: 
    475                 ## This shouldn't happen, but it's possible to add such items to the graph 
    476                 ## The check could be removed if all visualizations are well-behaved 
    477                 qDebug(' !!     Warning: an item without setGraphTransform            !!') 
    478                 qDebug(' !! Make sure all your curves inherit from Graph.item.PlotItem  !!') 
    479         """ 
     469            c.set_zoom_factor(self._zoom_factor) 
     470            c.updateProperties() 
    480471        self.graph_item.setTransform(self.zoom_transform) 
    481472        for a in self.axes.values(): 
  • source/orangeplot/curve.cpp

    r8373 r8376  
    66 
    77#include <QtCore/qmath.h> 
     8#include <QtCore/QtConcurrentRun> 
    89 
    910Curve::Curve(const QList< double >& xData, const QList< double >& yData, QGraphicsItem* parent, QGraphicsScene* scene): PlotItem(parent, scene) 
     
    3435  if (m_continuous) 
    3536  { 
     37    m_needsUpdate &= ~UpdateNumberOfItems; 
    3638    return; 
    3739  } 
     
    4749    m_pointItems << new QGraphicsPathItem(this); 
    4850  } 
     51  Q_ASSERT(m_pointItems.size() == data().size()); 
    4952} 
    5053 
    5154void Curve::updateProperties() 
    5255{ 
     56  qDebug() << "Updating curve " << m_needsUpdate; 
    5357  setContinuous(m_style != Curve::NoCurve); 
    5458   
     59  if (m_needsUpdate & UpdateNumberOfItems) 
     60  { 
     61    updateNumberOfItems(); 
     62  } 
     63   
     64  /* 
     65   *  
     66   *  
    5567  if (m_continuous || (m_needsUpdate & UpdateAll) ) 
    5668  { 
    5769    // Partial updates only make sense for discrete curves, because they have more properties 
    58     updateAll(); 
     70    qDebug() << "Updating all"; 
     71    QtConcurrent::run(this, &Curve::updateAll); 
    5972    return; 
    6073  } 
     74  */ 
    6175   
    6276  int n = m_data.size();   
    63  
    64   if (m_needsUpdate & UpdateNumberOfItems) 
    65   { 
    66     updateNumberOfItems(); 
    67   } 
    6877   
    6978  if (m_needsUpdate & (UpdateSize | UpdateSymbol)) 
     
    8594      m_pointItems[i]->setPos(m_graphTransform.map(p)); 
    8695    } 
    87   } 
    88   if (m_needsUpdate & UpdateBrush) 
    89   { 
    90     for (int i = 0; i < n; ++i) 
    91     { 
    92       m_pointItems[i]->setBrush(m_brush); 
    93     } 
     96  }  
     97   
     98  if (m_needsUpdate & (UpdateZoom | UpdateBrush | UpdatePen) ) 
     99  { 
     100      qDebug() << "Setting scale to " << 1.0/m_zoom_factor << m_zoom_factor; 
     101    updateItems(m_pointItems, Updater(1.0/m_zoom_factor, m_pen, m_brush)); 
    94102  } 
    95103  m_needsUpdate = 0; 
     
    518526} 
    519527 
    520  
     528double Curve::zoom_factor() 
     529{ 
     530    return m_zoom_factor; 
     531} 
     532 
     533void Curve::set_zoom_factor(double factor) 
     534{ 
     535    m_zoom_factor = factor; 
     536    qDebug() << "zoom factor is now" << factor; 
     537    m_needsUpdate |= UpdateZoom; 
     538    checkForUpdate(); 
     539} 
     540 
     541void Curve::updateItems(const QList< QAbstractGraphicsShapeItem* >& items, Updater updater) 
     542{ 
     543    qDebug() << "Updating items asynchronously"; 
     544    qDebug() << updater.m_scale; 
     545    QtConcurrent::map(items, updater); 
     546} 
  • source/orangeplot/curve.h

    r8371 r8376  
    77#include <QtGui/QBrush> 
    88 
     9#include <QtCore/QtConcurrentMap> 
     10 
    911struct DataPoint 
    1012{ 
    1113  qreal x; 
    1214  qreal y; 
     15}; 
     16 
     17struct Updater 
     18{ 
     19    Updater(qreal scale, const QPen& pen, const QBrush& brush) 
     20    { 
     21        m_scale = scale; 
     22        m_pen = pen; 
     23        m_brush = brush; 
     24    } 
     25     
     26    void operator()(QAbstractGraphicsShapeItem* item) 
     27    { 
     28        item->setBrush(m_brush); 
     29        item->setPen(m_pen); 
     30        item->setScale(m_scale); 
     31    } 
     32     
     33    qreal m_scale; 
     34    QPen m_pen; 
     35    QBrush m_brush; 
    1336}; 
    1437   
     
    92115  virtual void updateAll(); 
    93116   
     117  void updateItems(const QList< QAbstractGraphicsShapeItem* >& items, Updater updater); 
     118  template <class T> 
     119  void updateItems(const QList<T*>& items, Updater updater); 
     120   
    94121  /** 
    95122   * @brief ... 
     
    120147  bool isContinuous() const; 
    121148  void setContinuous(bool continuous); 
    122    
     149 
    123150  Data data() const; 
    124151  void setData(const QList<qreal> xData, const QList<qreal> yData); 
     
    135162  bool autoUpdate() const; 
    136163  void setAutoUpdate(bool autoUpdate); 
     164   
     165  double zoom_factor(); 
     166  void set_zoom_factor(double factor); 
    137167   
    138168  qreal max_x_value() const; 
     
    159189    UpdateBrush = 0x20, 
    160190    UpdateContinuous = 0x40, 
     191    UpdateZoom = 0x80, 
    161192    UpdateAll = 0xFF 
    162193  }; 
     
    202233  QPen m_pen; 
    203234  QBrush m_brush; 
     235  double m_zoom_factor; 
    204236}; 
    205237 
     238template <class T> 
     239void Curve::updateItems(const QList< T* >& items, Updater updater) 
     240{ 
     241    updateItems(reinterpret_cast< const QList<QAbstractGraphicsShapeItem*>& >(items), updater); 
     242} 
     243 
     244 
    206245#endif // CURVE_H 
  • source/orangeplot/curve.sip

    r8372 r8376  
    2424%End 
    2525}; 
     26 
     27 
     28struct Updater 
     29{ 
     30 
     31%TypeHeaderCode 
     32#include "curve.h" 
     33%End 
     34 
     35    Updater(qreal scale, const QPen& pen, const QBrush& brush); 
     36     
     37    void operator()(QAbstractGraphicsShapeItem* item); 
     38     
     39    qreal m_scale; 
     40    QPen m_pen; 
     41    QBrush m_brush; 
     42}; 
     43 
    2644 
    2745typedef QList<DataPoint> Data; 
     
    7593  void updateAll(); 
    7694   
     95  void updateItems(QList<QAbstractGraphicsShapeItem*> items, Updater u); 
     96   
    7797  QGraphicsItem* pointItem(qreal x, qreal y, int size = 0, QGraphicsItem* parent = 0); 
    7898   
     
    103123  int style() const; 
    104124  void setStyle(int style); 
    105    
     125  
     126  double zoom_factor(); 
     127  void set_zoom_factor(double factor); 
     128 
    106129  bool autoUpdate() const; 
    107130  void setAutoUpdate(bool autoUpdate); 
  • source/orangeplot/plot.cpp

    r8373 r8376  
    4848QList< PlotItem* > Plot::itemList() 
    4949{ 
    50     qDebug() << "Returning itemlist with" << m_items.size() << "items"; 
    5150    return m_items; 
    5251} 
Note: See TracChangeset for help on using the changeset viewer.