diff layout_view.cpp @ 9:0d7875c26974

layout designer: hints on widget placement during drag and drop
author Goffi <goffi@goffi.org>
date Fri, 26 Aug 2011 12:15:21 +0200
parents c63d67895cbe
children 877a005c2b42
line wrap: on
line diff
--- a/layout_view.cpp	Wed Aug 24 20:38:55 2011 +0200
+++ b/layout_view.cpp	Fri Aug 26 12:15:21 2011 +0200
@@ -18,6 +18,11 @@
 #include "layout_view.h"
 #include <QDebug>
 
+WidgetView::WidgetView(const QString& name)
+    : QLabel(name)
+{
+}
+
 LayoutView::LayoutView(QWidget* parent)
 {
     setAcceptDrops(true);
@@ -45,21 +50,48 @@
         
 void LayoutView::dragEnterEvent (QDragEnterEvent* event )
 {
-    qDebug() << "Drag enter: " << event->pos();
     if (event->mimeData()->hasFormat(LAYOUT_WIDGET_MIME))
         event->acceptProposedAction();
 }
         
+void LayoutView::dragLeaveEvent (QDragLeaveEvent* event )
+{
+    m_loc_hint.setCoords(1,1,0,0); //We make the QRect invalid to hide it
+    update();
+}
+
+
 void LayoutView::dragMoveEvent (QDragMoveEvent* event )
 {
-    qDebug() << "Drag move: " << event->pos();
-    QWidget* _wid = childAt(event->pos());
-    if (_wid)
-        qDebug() << "Object: " << _wid->metaObject()->className();
+    int pos_y = event->pos().y();
+    int top = 0;
+    QList<QWidget*>  _children = findChildren<QWidget*>("");
+   
+    QWidget* wid = 0;
+
+    for (m_insert_pos=0; m_insert_pos<layout()->count()-1; m_insert_pos++) {
+        wid = layout()->itemAt(m_insert_pos)->widget();
+
+        if (wid->geometry().bottom() > pos_y && wid->geometry().top() < pos_y) {
+            //We are inside a widget, we break here
+            top = wid->geometry().bottom();
+            m_insert_pos++;
+            break;
+        }
+        else if (wid->geometry().top() > pos_y)
+            break;
+        
+        top = wid->geometry().bottom();
+    }
+    
+    m_loc_hint.setRect(5, top+1, qMax(5,width()-10), 5);
+    update();
 }
 
 void LayoutView::dropEvent (QDropEvent* event)
 {
+    m_loc_hint.setCoords(1,1,0,0); //We make the QRect invalid to hide it
+    update();
     const QMimeData *data = event->mimeData();
     QByteArray encodedData = data->data(LAYOUT_WIDGET_MIME);
     QDataStream stream(&encodedData, QIODevice::ReadOnly);
@@ -73,9 +105,16 @@
 void LayoutView::addWidget(const QString& name)
 {
     LayoutWidget* _widget = m_layout_widgets[name];
-    qDebug() << "Adding: " << name;
-    QLabel* _label = new QLabel(name);
-    _label->setAlignment(Qt::AlignCenter);
-    m_layout->insertWidget(qMax(0, m_layout->count()-1), _label, 0, Qt::AlignTop);
+    WidgetView* _widget_view = new WidgetView(name);
+    _widget_view->setAlignment(Qt::AlignCenter);
+    m_layout->insertWidget(m_insert_pos, _widget_view, 0, Qt::AlignTop);
 
 }
+
+void LayoutView::paintEvent(QPaintEvent* event)
+{
+   if (m_loc_hint.isValid()) {
+       QPainter newPainter(this);
+       newPainter.fillRect(m_loc_hint, Qt::blue);
+   }
+}