Source Code (Use browser search to find items of interest.)

Class Index

empath'EmpathListView (./kdepim/empath/parts/libEmpathListView/EmpathListView.h:41)

class EmpathListView : public KListView
{
    Q_OBJECT

    public:
        
        EmpathListView(
            QWidget * parent = 0,
            const char * name = 0);

        virtual ~EmpathListView();

        enum Area { Item, OpenClose, Void };

        /**
         * When set TRUE the link isn't shown immediately when the cursor is
         * moved using the keyboard, but after a short delay. 
         */
        void setDelayedLink(bool flag) { delayedLink_ = flag; };
        bool isDelayedLink() { return delayedLink_; };

        virtual void setLinkItem(QListViewItem *);
        QListViewItem * linkItem() const
            { return linkItem_; };
        
        QListViewItem * itemAt(const QPoint & screenPos) const 
            { return QListView::itemAt(screenPos); };
        QListViewItem * itemAt(const QPoint & screenPos, 
            Area & areaAtPos) const;
       
        QList<QListViewItem> thread(QListViewItem *);
        QList<QListViewItem> subThread(QListViewItem *);
        
    protected slots:

        void s_currentChanged       (QListViewItem *);
        void s_delayedLinkTimeout   ();

    signals:
      
        void rightButtonPressed(QListViewItem *, const QPoint &, int);
        void rightButtonPressed(QListViewItem *, const QPoint &, int, Area);
        
        void linkChanged(QListViewItem *);
        void startDrag(const QList<QListViewItem> &); // Add another one for single selection(?)

    protected:

        virtual void contentsMousePressEvent    (QMouseEvent *);
        virtual void contentsMouseReleaseEvent  (QMouseEvent *);
        virtual void contentsMouseMoveEvent     (QMouseEvent *);
        virtual void keyPressEvent              (QKeyEvent *);

    private:

        QListViewItem * linkItem_;

        bool delayedLink_;
        QTimer * delayedLinkTimer_;

        bool waitForLink_;

        // DnD stuff
        QPoint pressPos_;
        QListViewItem * pressItem_;
        Area pressArea_;
        bool dragEnabled_;
        bool maybeDrag_;

};

#endif

// vim:ts=4:sw=4:tw=78

empath'EmpathListView::EmpathListView() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:37)

EmpathListView::EmpathListView(
    QWidget * parent, const char * name)
    :   KListView(parent, name),
        delayedLink_(false),
        waitForLink_(false),
        dragEnabled_(true),
        maybeDrag_(false)
{
    viewport()->setMouseTracking(true);

    linkItem_ = 0;

    delayedLinkTimer_ = new QTimer(this);

    QObject::connect(this, SIGNAL(currentChanged(QListViewItem *)),
            this, SLOT(s_currentChanged(QListViewItem *)));

    QObject::connect(delayedLinkTimer_, SIGNAL(timeout()),
            this, SLOT(s_delayedLinkTimeout()));
}


empath'EmpathListView::~EmpathListView() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:58)

EmpathListView::~EmpathListView()
{
}

    void

empath'EmpathListView::setLinkItem() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:63)

EmpathListView::setLinkItem(QListViewItem * i)
{ 
    delayedLinkTimer_->stop();
    if (i != linkItem_) {
        linkItem_ = i;
        emit linkChanged(i);
    }
}

    QListViewItem *

empath'EmpathListView::itemAt() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:73)

EmpathListView::itemAt(const QPoint & screenPos, 
    EmpathListView::Area & areaAtPos) const
{
    QListViewItem * i = itemAt(screenPos);
    if (!i) { 
        areaAtPos = Void;
        return i;
    }

    int xrel = screenPos.x() - ( i->depth() - !rootIsDecorated() ) * treeStepSize();

    if (xrel >= treeStepSize()) 
        areaAtPos = Item;
    else if (xrel >= 0 && i->childCount() > 0)
        areaAtPos = OpenClose;
    else 
        areaAtPos = Void;

    return i;
}

    QList<QListViewItem>

empath'EmpathListView::thread() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:95)

EmpathListView::thread(QListViewItem * item)
{
    // find the topmost item of this thread.
    QListViewItem * top = item;

    while (top->parent())
        top = top->parent();
    
    return subThread(top);
}

    QList<QListViewItem>

empath'EmpathListView::subThread() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:107)

EmpathListView::subThread(QListViewItem * item)
{
    QList<QListViewItem> subThreadList;
    QList<QListViewItem> childThreadList;
    
    if (!item)
        return subThreadList;
    
    subThreadList.append(item);
    
    QListViewItem * child = item->firstChild();
    
    while (child) {
        childThreadList = subThread(child);
        
        QListIterator<QListViewItem> it(childThreadList);
        for (; it.current(); ++it) 
            subThreadList.append(it.current());
        
        child = child->nextSibling();
    }

    return subThreadList;
}

    void

empath'EmpathListView::s_currentChanged() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:133)

EmpathListView::s_currentChanged(QListViewItem *)
{
    if (delayedLink_) {
        delayedLinkTimer_->start(400); // XXX: hardcoded
        delayedLink_ = false;
    }
}

    void

empath'EmpathListView::s_delayedLinkTimeout() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:142)

EmpathListView::s_delayedLinkTimeout()
{
    delayedLinkTimer_->stop();
    setLinkItem(currentItem());
}

    void

empath'EmpathListView::contentsMousePressEvent() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:149)

EmpathListView::contentsMousePressEvent(QMouseEvent *e)
{
    // Unfortunately there is a lot of duplicated code here.
    if (!e) 
        return;

    delayedLink_ = false;

    pressPos_ = e->pos();
    QPoint vp = contentsToViewport(pressPos_);
    pressItem_ = itemAt(vp, pressArea_);

    if (e->button() == RightButton) {

        if ( !pressItem_ ) {
            clearSelection();
            emit rightButtonPressed( 0, viewport()->mapToGlobal( vp ), -1);
            emit rightButtonPressed( 0, viewport()->mapToGlobal( vp ), 
                -1, pressArea_ );
            return;
        }
      
        setCurrentItem(pressItem_);
      
        int c = 0;
        int cumColumnWidth = columnWidth(c);
        while (vp.x() > cumColumnWidth) 
            cumColumnWidth += columnWidth(++c);
        
        emit rightButtonPressed( pressItem_, viewport()->mapToGlobal( vp ), c );
        emit rightButtonPressed( pressItem_, viewport()->mapToGlobal( vp ), c, pressArea_ );

        return;
    } 

    if (e->button() != LeftButton) 
        return;

    if (pressArea_ == Void)
        return;

    if (pressArea_ == OpenClose) {
        // setCurrentItem(pressItem_);
        setOpen(pressItem_, !pressItem_->isOpen());
        return;
    }

    // No modifier key pressed
    if (e->state() == 0) { 
        maybeDrag_ = (true & dragEnabled_);
        setCurrentItem(pressItem_);
        if (!pressItem_->isSelected()) {
            clearSelection();
            setSelected(pressItem_, true);
        }
        return;
    }
            
    if (e->state() & ControlButton) {
        return;
    }

    if (e->state() & ShiftButton) {
        return;
    }
}

    void

empath'EmpathListView::contentsMouseReleaseEvent() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:217)

EmpathListView::contentsMouseReleaseEvent(QMouseEvent *e)
{ 
    maybeDrag_ = false;
    
    if (!e || pressArea_ != Item) 
        return;
    
    if (e->state() & ShiftButton) {

        if (!(e->state() & ControlButton))
            clearSelection();

        if (!currentItem()) {
            setCurrentItem(pressItem_);
            setSelected(pressItem_, true);
            return;
        }
    
        QListViewItem * i1 = 0;
        QListViewItem * i2 = 0;
   
        if (currentItem()->itemPos() < pressItem_->itemPos()) {
            i1 = currentItem();
            i2 = pressItem_;
        } else {
            i1 = pressItem_;
            i2 = currentItem();
        }
        
        while (i1 != i2) {
            setSelected(i1, true);
            i1 = i1->itemBelow();
        }
        setSelected(i2, true);

        setCurrentItem(pressItem_);
        return;
    }
 
    if (e->state() & ControlButton) {
        setCurrentItem(pressItem_);
        setSelected(pressItem_, !isSelected(pressItem_));
        return;
    }

    if (e->button() == LeftButton) {
        clearSelection();
        setSelected(pressItem_, true);
        setLinkItem(pressItem_);
    }
}

    void

empath'EmpathListView::contentsMouseMoveEvent() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:270)

EmpathListView::contentsMouseMoveEvent(QMouseEvent *e)
{
    // FIXME: Disable for the moment. Qt crashes !
    // return;
    
    if (!maybeDrag_)
        return;

    if (!e) 
        return;

    qDebug("We may be dragging");

    QPoint p = e->pos();

    if ( (p - pressPos_).manhattanLength() < 
                QApplication::startDragDistance()) {
        // Ignore, we haven't moved the cursor far enough.
        // QListView::contentsMouseMoveEvent(e);
        return;
    }

    qDebug("Ok, we're dragging");

    maybeDrag_ = false;

    if (!pressItem_) {
        qDebug("Not over anything to drag");
        // QListView::contentsMouseMoveEvent(e);
        return;
    }
    
    QList<QListViewItem> selected;   
    
    if (isMultiSelection()) {
        QListViewItemIterator it(this);
        while (it.current()) {
            if (it.current()->isSelected())
                selected.append(it.current());
            ++it;
        }
    } else
        selected.append(selectedItem());
        
    emit startDrag(selected);
}

    void

empath'EmpathListView::keyPressEvent() (./kdepim/empath/parts/libEmpathListView/EmpathListView.cpp:318)

EmpathListView::keyPressEvent(QKeyEvent *e)
{ 
    /*
    delayedLink_ = true;

    if (e->key() == Key_Escape && isMultiSelection()) {
        clearSelection();
        return;
    }
    */
    
    KListView::keyPressEvent(e);
}

// vim:ts=4:sw=4:tw=78