diff options
Diffstat (limited to 'src/kbfxplasmaindexview.cpp')
-rw-r--r-- | src/kbfxplasmaindexview.cpp | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/src/kbfxplasmaindexview.cpp b/src/kbfxplasmaindexview.cpp new file mode 100644 index 0000000..ee50c9e --- /dev/null +++ b/src/kbfxplasmaindexview.cpp @@ -0,0 +1,436 @@ +/* + * Copyright (C) 2006 + * Siraj Razick <siraj@kdemail.net> + * PhobosK <phobosk@mail.kbfx.org> + * see Also AUTHORS + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "kbfxplasmaindexview.h" + +KbfxPlasmaIndexView::KbfxPlasmaIndexView ( QWidget * parent, const char *name, + WFlags l ) : + QCanvasView ( parent, name, l ) +{ + m_itemGroup = new KbfxPlasmaCanvasGroup (); + m_itemGroupList = new KbfxPlasmaCanvasGroupView (); + m_itemStack = new KbfxPlasmaCanvasStack (); + m_pluginLoaded = ""; + m_itemStack->addGroup ( m_itemGroupList ); + viewport ()->setMouseTracking ( TRUE ); + + m_currentPos = QPoint ( 0, 0 ); + m_mousePollTimer = new QTimer ( this ); + + m_pluginList = KbfxPlasmaPluginLoader::scanPlugins (); + viewport ()->setAcceptDrops ( true ); + this->setVScrollBarMode ( QScrollView::AlwaysOff ); + this->setHScrollBarMode ( QScrollView::AlwaysOff ); + setFrameShape ( QFrame::NoFrame ); + m_currentItem = 0L; + m_selectedItem = 0L; +// m_pluginList = ""; + connect ( this, SIGNAL ( clicked ( KbfxPlasmaIndexItem * ) ), this, + SLOT ( slotClicked ( KbfxPlasmaIndexItem * ) ) ); + m_currentView = 0; + setDragAutoScroll ( true ); +} + + +KbfxPlasmaIndexView::~KbfxPlasmaIndexView () +{ +} + +void +KbfxPlasmaIndexView::checkMousePos () +{ + KbfxPlasmaCanvasGroup *tmp = 0; + if ( QCursor::pos () == mapToGlobal ( contentsToViewport ( m_currentPos ) ) ) + { + QMouseEvent me ( QEvent::MouseButtonPress, + this->mapToGlobal ( m_currentPos ), Qt::LeftButton, + Qt::LeftButton ); + + clearAll (); + + QCanvasItemList l = canvas ()->collisions ( m_currentPos ); + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + + if ( t->type () != KbfxPlasmaCanvasItem::SEPARATOR ) + { + emit clearSelected(); + t->mousePressEvent ( &me ); + m_selectedItem = t; + t->setSelected ( true ); + emit clicked ( t ); + } + + if ( t->type () == KbfxPlasmaCanvasItem::SEPARATOR ) + tmp = KbfxPlasmaCanvasGroup::groupContaining ( t ); +// groupContaining ((KbfxPlasmaCanvasItem *) l.first ()); + } + } + + } +// if (tmp != 0) +// tmp->shade(); +} + + +void +KbfxPlasmaIndexView::setView ( KbfxPlasmaCanvasView * view ) +{ + if ( view == NULL ) + return; + m_currentView = view; +} + +void +KbfxPlasmaIndexView::clearAllButOne ( KbfxPlasmaIndexItem * i ) +{ + i = i; + + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { + if ( *it != m_selectedItem ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->setCurrent ( false ); + } + } + } + canvas ()->update (); +} + +void +KbfxPlasmaIndexView::clearSelection () +{ + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->setCurrent ( false ); + t->setSelected ( false ); + } + } + canvas ()->update (); +} + +void +KbfxPlasmaIndexView::leaveEvent ( QEvent * e ) +{ + e = e; + clearAllButOne ( m_currentItem ); + emit expand (); +} + +void +KbfxPlasmaIndexView::contextMenuSlot ( int id ) +{ + id = id; +/* + m_pluginList.remove ( m_pluginList.at ( id - 1 ) ); + if ( m_currentView != 0 ) + emit pluginRequest ( m_pluginMenu->text ( id ), m_currentView ); +*/ +} + +void +KbfxPlasmaIndexView::contentsContextMenuEvent ( QContextMenuEvent * event ) +{ + event = event; +/* + m_pluginMenu = new KPopupMenu ( this );; + connect ( m_pluginMenu, SIGNAL ( activated ( int ) ), this, + SLOT ( contextMenuSlot ( int ) ) ); + + m_pluginMenu->insertTitle ( "Insert Plugin", 0, 0 ); + int _index = 1; + + for ( QStringList::Iterator it = m_pluginList.begin (); + it != m_pluginList.end (); ++it ) + { + + m_pluginMenu->insertItem ( *it, _index, _index ); + _index++; + } + + m_pluginMenu->exec ( event->globalPos () ); +*/ +} + +void +KbfxPlasmaIndexView::loadList ( KbfxDataStack * stkPtr ) +{ + if ( stkPtr == NULL ) + { + kdDebug() << "Loading Stack Failed:KbfxListBox->loadList()" << endl; + return; + } + + int _height = 0; + + KbfxPlasmaCanvasItem *box = 0; + KbfxPlasmaCanvasItemWrapper *boxwrapper = 0; + + KbfxPlasmaCanvasItemWrapper *indexitemwrap = + new KbfxPlasmaCanvasItemWrapper ( canvas () ); + + m_itemGroup = new KbfxPlasmaCanvasGroup (); + + boxwrapper = new KbfxPlasmaCanvasItemWrapper ( canvas () ); + + box = + ( KbfxPlasmaCanvasItem * ) boxwrapper-> + itemIndex ( KbfxPlasmaCanvasItem::SEPARATOR ); + + box->setLabelText ( stkPtr->name () ); + m_itemGroup->addItem ( box ); + + _height += box->height (); + + KbfxDataStack::DataDict _dict = stkPtr->getDataDict (); + KbfxDataStack::DataDict::Iterator it; + for ( it = _dict.begin (); it != _dict.end (); ++it ) + { + KbfxPlasmaIndexItem *item = + ( KbfxPlasmaIndexItem * ) indexitemwrap-> + itemIndex ( KbfxPlasmaCanvasItem::INDEX ); + + if ( item == 0 ) + return; + + item->setType ( KbfxPlasmaCanvasItem::INDEX ); + item->setText ( it.data ().name ); + item->setName ( it.data ().name ); + item->setLabelText ( it.data ().name ); + item->setIcon ( it.data ().icon ); + item->setId ( it.key () ); + + m_itemGroup->addItem ( item ); + + item->setBelongsTo ( stkPtr->name () ); + } + + m_itemGroupList->addGroup ( m_itemGroup ); + + if ( m_itemGroupList->height () > this->height () ) + canvas ()->resize ( this->width (), m_itemGroupList->height () ); + canvas ()->update (); + + m_itemStack->raise ( 0 ); + + for ( QStringList::Iterator it = m_pluginList.begin (); + it != m_pluginList.end (); ++it ) + { + if ( *it == stkPtr->name() ) + { + m_pluginList.remove ( it ); + break; + } + } +} + +void +KbfxPlasmaIndexView::setKbfxCanvas ( QCanvas * cnv ) +{ + setCanvas ( cnv ); + + canvas ()->setBackgroundPixmap ( ( *KbfxPlasmaPixmapProvider::pixmap ( "listboxbg" )) ); + + canvas ()->update (); +} + + +void +KbfxPlasmaIndexView::loadPlugin ( QString name, KbfxPlasmaCanvasView * view ) +{ + if ( m_pluginList.contains ( name ) <= 0 ) + { + KbfxPlasmaPluginLoader *m_loader = new KbfxPlasmaPluginLoader (); + KbfxDataStack *m_stack_R = m_loader->getView ( name ); + + if ( m_stack_R == NULL ) + return; + + if ( m_currentView != 0 ) + view->addStack ( m_stack_R, name ); + + this->loadList ( m_stack_R ); + canvas ()->update (); + m_pluginLoaded += name; + + delete m_loader; + return; + } + else + { + kdDebug() << "Plugin already loaded" << endl; + return; + } +} + + +void +KbfxPlasmaIndexView::mouseMoveEvent ( QMouseEvent * me ) +{ + me = me; +} + + + +void +KbfxPlasmaIndexView::contentsMouseMoveEvent ( QMouseEvent * me ) +{ + if ( canvas () == NULL ) + return; + + m_currentPos = me->pos (); + +// TODO: Get wait time from config + + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); + + QTimer::singleShot ( 800, this, SLOT ( checkMousePos () ) ); + + if ( contentsToViewport ( me->pos () ).y () < this->height () / 5 ) + { + scrollBy ( -10, -10 ); + } + else if ( contentsToViewport ( me->pos () ).y () > ( ( this->height () * 2 ) / 3 ) ) + { + scrollBy ( 10, 10 ); + } + + QScrollView::contentsMouseMoveEvent ( me ); + + +// KbfxPlasmaCanvasGroup *tmp = 0; + QCanvasItemList l = canvas ()->collisions ( me->pos () ); + + if ( l.count () <= 0 ) + return; + + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( *it == 0 ) + return; + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->mouseMoveEvent ( me ); + if ( m_currentItem != NULL ) + { + if ( !m_currentItem->isSelected () ) + m_currentItem->setCurrent ( false ); + } + m_currentItem = t; + t->setCurrent ( true ); + } + } + canvas ()->update (); +} + +void +KbfxPlasmaIndexView::contentsMousePressEvent ( QMouseEvent * me ) +{ + if ( me->button () == RightButton ) + return; + + clearAll (); + + this->setCursor ( QCursor ( Qt::WaitCursor ) ); + + KbfxPlasmaCanvasGroup *tmp = 0; + QCanvasItemList l = canvas ()->collisions ( me->pos () ); + for ( QCanvasItemList::Iterator it = l.begin (); it != l.end (); ++it ) + { + if ( ( *it )->rtti () == CANVASITEM ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + + if ( t->type () != KbfxPlasmaCanvasItem::SEPARATOR ) + { + t->mousePressEvent ( me ); + m_selectedItem = t; + t->setSelected ( true ); + emit clicked ( t ); + } + + if ( t->type () == KbfxPlasmaCanvasItem::SEPARATOR ) + tmp = KbfxPlasmaCanvasGroup::groupContaining ( t ); +// groupContaining ((KbfxPlasmaCanvasItem *) l.first ()); + } + } + if ( tmp != 0 ) + tmp->shade (); + +// m_clickPos = me->pos (); + + QScrollView::contentsMousePressEvent ( me ); + + canvas ()->update (); + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); +} + +void +KbfxPlasmaIndexView::slotClicked ( KbfxPlasmaIndexItem * it ) +{ + if ( it == NULL ) + return; + + KbfxPlasmaIndexItem *_it = ( KbfxPlasmaIndexItem * ) it; + + KbfxSignal signal ( _it->belongsTo (), _it->Id () ); + + this->setCursor ( QCursor ( Qt::WaitCursor ) ); + emit loadRequest ( signal ); + this->setCursor ( QCursor ( Qt::PointingHandCursor ) ); +} + +void +KbfxPlasmaIndexView::clearAll () +{ + QCanvasItemList list = canvas ()->allItems (); + + QCanvasItemList::Iterator it = list.begin (); + for ( ; it != list.end (); ++it ) + { + if ( *it ) + { + KbfxPlasmaIndexItem *t = ( KbfxPlasmaIndexItem * ) ( *it ); + t->setSelected ( false ); + } + } + + canvas ()->update (); +} + + +#include "kbfxplasmaindexview.moc" |