summaryrefslogtreecommitdiffstats
path: root/src/ciwidgetmgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ciwidgetmgr.cpp')
-rw-r--r--src/ciwidgetmgr.cpp308
1 files changed, 308 insertions, 0 deletions
diff --git a/src/ciwidgetmgr.cpp b/src/ciwidgetmgr.cpp
new file mode 100644
index 0000000..6e32423
--- /dev/null
+++ b/src/ciwidgetmgr.cpp
@@ -0,0 +1,308 @@
+/***************************************************************************
+ * Copyright (C) 2005 by David Saxton *
+ * david@bluehaze.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ ***************************************************************************/
+
+#include "cnitem.h"
+#include "canvasitemparts.h"
+#include "eventinfo.h"
+
+#include <kdebug.h>
+
+CIWidgetMgr::CIWidgetMgr( QCanvas *canvas, CNItem *item )
+{
+ p_cnItem = item;
+ p_canvas = canvas;
+}
+
+
+CIWidgetMgr::~CIWidgetMgr()
+{
+ // QCanvas deletes our items for us. Actually, it pretty much insists on deleting them,
+ // despite me telling it not to, so if I delete them then it gets confused and crashes.
+ // Naughty QCanvas!
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ delete it.data();
+ }
+ m_widgetMap.clear();
+}
+
+
+void CIWidgetMgr::setWidgetsPos( const QPoint &pos )
+{
+ m_pos = pos;
+}
+
+
+void CIWidgetMgr::setDrawWidgets( bool draw )
+{
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ draw ? it.data()->show() : it.data()->hide();
+ }
+}
+
+
+Widget *CIWidgetMgr::widgetWithID( const QString &id ) const
+{
+ WidgetMap::const_iterator it = m_widgetMap.find(id);
+ if ( it == m_widgetMap.end() )
+ return 0l;
+ else return it.data();
+}
+
+
+Button *CIWidgetMgr::button( const QString &id ) const
+{
+ return dynamic_cast<Button*>(widgetWithID(id));
+}
+
+Slider *CIWidgetMgr::slider( const QString &id ) const
+{
+ return dynamic_cast<Slider*>(widgetWithID(id));
+}
+
+
+
+void CIWidgetMgr::setButtonState( const QString &id, int state )
+{
+ Button *b = button(id);
+ if (!b)
+ return;
+
+ // Actually, we don't want to check to see if we are already down; this way,
+ // we get toggle events when loading from file
+// bool oldState = b->isDown();
+// if ( oldState == state )
+// return;
+
+ b->setState(state);
+}
+
+
+void CIWidgetMgr::drawWidgets( QPainter &p )
+{
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ it.data()->drawShape(p);
+ }
+}
+
+
+void CIWidgetMgr::removeWidget( const QString & id )
+{
+ if ( !m_widgetMap.contains(id) )
+ return;
+
+ delete m_widgetMap[id];
+ m_widgetMap.remove(id);
+}
+
+
+Button* CIWidgetMgr::addButton( const QString &id, const QRect & pos, const QString &display, bool toggle )
+{
+ WidgetMap::iterator it;
+
+ Button *button = new Button( id, p_cnItem, toggle, pos, p_canvas );
+ (dynamic_cast<QButton*>(button->widget()))->setText(display);
+
+ it = m_widgetMap.find(id);
+ if ( it == m_widgetMap.end() )
+ {
+ m_widgetMap[id] = button;
+ }
+ else
+ {
+ kdWarning() << "CIWidgetMgr::addButton: Attempting to re-add button with same id as previous"<<endl;
+ delete it.data();
+ it.data() = button;
+ }
+
+ p_cnItem->updateAttachedPositioning();
+ return button;
+}
+
+
+Button* CIWidgetMgr::addButton( const QString &id, const QRect & pos, QPixmap pixmap, bool toggle )
+{
+ WidgetMap::iterator it;
+
+ Button *button = new Button( id, p_cnItem, toggle, pos, p_canvas );
+ button->setPixmap(pixmap);
+
+ it = m_widgetMap.find(id);
+ if ( it == m_widgetMap.end() )
+ {
+ m_widgetMap[id] = button;
+ }
+ else
+ {
+ kdWarning() << "CIWidgetMgr::addButton: Attempting to re-add button with same id as previous"<<endl;
+ delete it.data();
+ it.data() = button;
+ }
+
+ p_cnItem->updateAttachedPositioning();
+ return button;
+}
+
+
+Slider* CIWidgetMgr::addSlider( const QString &id, int minValue, int maxValue, int pageStep, int value, Qt::Orientation orientation, const QRect & pos )
+{
+ Slider *slider = new Slider( id, p_cnItem, pos, p_canvas );
+ QSlider *qslider = dynamic_cast<QSlider*>(slider->widget());
+
+ qslider->setMinValue(minValue);
+ qslider->setMaxValue(maxValue);
+ qslider->setPageStep(pageStep);
+ qslider->setValue(value);
+ slider->setOrientation(orientation);
+
+ WidgetMap::iterator it = m_widgetMap.find(id);
+ if ( it == m_widgetMap.end() )
+ {
+ m_widgetMap[id] = slider;
+ }
+ else
+ {
+ kdWarning() << "CIWidgetMgr::addSlider: Attempting to re-add slider with same id as previous"<<endl;
+ delete slider;
+ return 0l;
+ }
+
+ p_cnItem->updateAttachedPositioning();
+ return slider;
+}
+
+
+bool CIWidgetMgr::mousePressEvent( const EventInfo &info )
+{
+ QMouseEvent *e = info.mousePressEvent( 0, 0 );
+
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ if ( it.data()->rect().contains(info.pos) )
+ {
+ it.data()->mousePressEvent(e);
+ if (e->isAccepted())
+ {
+ delete e;
+ return true;
+ }
+ }
+ }
+ delete e;
+ return false;
+}
+
+
+bool CIWidgetMgr::mouseReleaseEvent( const EventInfo &info )
+{
+ QMouseEvent *e = info.mouseReleaseEvent( 0, 0 );
+
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ it.data()->mouseReleaseEvent(e);
+ }
+
+ bool accepted = e->isAccepted();
+ delete e;
+ return accepted;
+}
+
+
+bool CIWidgetMgr::mouseDoubleClickEvent( const EventInfo &info )
+{
+ QMouseEvent *e = info.mouseDoubleClickEvent( 0, 0 );
+
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ if ( it.data()->rect().contains(info.pos) )
+ {
+ it.data()->mouseDoubleClickEvent(e);
+ if (e->isAccepted())
+ {
+ delete e;
+ return true;
+ }
+ }
+ }
+ delete e;
+ return false;
+}
+
+
+bool CIWidgetMgr::mouseMoveEvent( const EventInfo &info )
+{
+ QMouseEvent *e = info.mouseMoveEvent( 0, 0 );
+
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ it.data()->mouseMoveEvent(e);
+ if (e->isAccepted())
+ {
+ delete e;
+ return true;
+ }
+ }
+ delete e;
+ return false;
+}
+
+
+bool CIWidgetMgr::wheelEvent( const EventInfo &info )
+{
+ QWheelEvent *e = info.wheelEvent( 0, 0 );
+
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ if ( it.data()->rect().contains(info.pos) )
+ {
+ it.data()->wheelEvent(e);
+ if (e->isAccepted())
+ {
+ delete e;
+ return true;
+ }
+ }
+ }
+
+ delete e;
+ return false;
+}
+
+
+void CIWidgetMgr::enterEvent()
+{
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ it.data()->enterEvent();
+ }
+}
+
+
+void CIWidgetMgr::leaveEvent()
+{
+ const WidgetMap::iterator widgetMapEnd = m_widgetMap.end();
+ for ( WidgetMap::iterator it = m_widgetMap.begin(); it != widgetMapEnd; ++it )
+ {
+ it.data()->leaveEvent();
+ }
+}
+
+