Changeset 8879:a051ca2a528e in orange


Ignore:
Timestamp:
09/01/11 16:15:13 (3 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
33580617a5005edd666ad342cc007442e367681d
Message:

Added arrows on directed graphs.

Location:
source/orangeqt
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source/orangeqt/networkcurve.cpp

    r8858 r8879  
    3333/* NodeItem */   
    3434/************/ 
     35 
     36#define PI 3.14159265 
    3537 
    3638NodeItem::NodeItem(int index, int symbol, QColor color, int size, QGraphicsItem* parent): Point(symbol, color, size, parent) 
     
    177179/************/ 
    178180 
     181QHash<ArrowData, QPixmap> EdgeItem::arrow_cache; 
     182 
     183uint qHash(const ArrowData& data) 
     184{ 
     185    // uint has 32 bits: 
     186    uint ret = data.size; 
     187    // QRgb takes the full uins, so we just XOR by it 
     188    ret ^= data.color.rgba(); 
     189    return ret; 
     190} 
     191 
     192bool operator==(const ArrowData& one, const ArrowData& other) 
     193{ 
     194    return one.size == other.size && one.color == other.color; 
     195} 
     196 
    179197EdgeItem::EdgeItem(NodeItem* u, NodeItem* v, QGraphicsItem* parent, QGraphicsScene* scene): QAbstractGraphicsShapeItem(parent, scene), 
    180198m_u(0), m_v(0) 
     
    206224{ 
    207225    painter->setRenderHint(QPainter::Antialiasing, false); 
    208         painter->setPen(pen()); 
    209         QLineF _line; 
    210         if (m_u && m_v) 
    211         { 
    212             _line.setPoints(m_u->pos(), m_v->pos()); 
    213             painter->drawLine(_line); 
    214         } 
    215          
     226    painter->setPen(pen()); 
     227    QLineF _line; 
     228    if (m_u && m_v) 
     229    { 
     230        _line.setPoints(m_u->pos(), m_v->pos()); 
     231        painter->drawLine(_line); 
     232 
     233        if ((m_arrows & (ArrowU | ArrowV)) && m_u->pos() != m_v->pos()) 
     234        { 
     235            double size = 10; 
     236            double half_size = 0.5 * size; 
     237            const ArrowData key(1, pen().color()); 
     238            if (!arrow_cache.contains(key)) 
     239            { 
     240                QBrush brush(key.color); 
     241                QPixmap pixmap(size, size); 
     242                pixmap.fill(Qt::transparent); 
     243                QPainter p; 
     244 
     245                QPen pen(key.color); 
     246                //pen.setWidth(0); 
     247                pen.setStyle(Qt::NoPen); 
     248 
     249                p.begin(&pixmap); 
     250                p.setRenderHints(painter->renderHints() | QPainter::Antialiasing); 
     251 
     252                QPainterPath path; 
     253                path.moveTo(half_size, 0); 
     254                path.lineTo(size, size); 
     255                path.lineTo(0, size); 
     256 
     257                p.setBrush(brush); 
     258                p.setPen(pen); 
     259                p.drawPath(path); 
     260                arrow_cache.insert(key, pixmap); 
     261            } 
     262            double x1 = m_u->pos().x(); 
     263            double y1 = m_u->pos().y(); 
     264            double x2 = m_v->pos().x(); 
     265            double y2 = m_v->pos().y(); 
     266            if (m_arrows & ArrowU) 
     267            { 
     268                double phi = atan2(y1-y2, x1-x2) * 180 / PI + 90; 
     269                painter->save(); 
     270                painter->translate(m_u->pos()); 
     271                painter->rotate(phi); 
     272                //painter->setViewTransformEnabled(false); 
     273                painter->drawPixmap(-half_size, 0.5 * m_u->size(), arrow_cache.value(key)); 
     274                painter->restore(); 
     275            } 
     276 
     277            if (m_arrows & ArrowV) 
     278            { 
     279                double phi = atan2(y2-y1, x2-x1) * 180 / PI + 90; 
     280                painter->save(); 
     281                painter->translate(m_v->pos()); 
     282                painter->rotate(phi); 
     283                //painter->setViewTransformEnabled(false); 
     284                painter->drawPixmap(-half_size, 0.5 * m_v->size(), arrow_cache.value(key)); 
     285                painter->restore(); 
     286            } 
     287        } 
     288    } 
     289 
    216290    if (!m_label.isEmpty()) 
    217291    { 
  • source/orangeqt/networkcurve.h

    r8846 r8879  
    133133}; 
    134134 
     135struct ArrowData 
     136{ 
     137    ArrowData(int size, const QColor& color) : size(size), color(color) {} 
     138 
     139    int size; 
     140    QColor color; 
     141}; 
     142 
    135143class EdgeItem : public QAbstractGraphicsShapeItem 
    136144{ 
     
    169177    Arrows arrows(); 
    170178     
     179    static QHash<ArrowData, QPixmap> arrow_cache; 
     180 
    171181private: 
    172182    Arrows m_arrows; 
Note: See TracChangeset for help on using the changeset viewer.