Mercurial > bellaciao
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); + } +}