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