/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * macrowindow.cc * * Fri Jul 4 12:29:41 CEST 2008 * Copyright 2008 Bent Bisballe Nyeng * deva@aasimon.org ****************************************************************************/ /* * This file is part of Pracro. * * Pracro 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. * * Pracro 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 General Public License * along with Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "macrowindow.h" #include #include #include #include #include #include "widget.h" #include "widgetwrapper.h" MacroWindow::MacroWindow(Qt::Orientation orientation) : QFrame() { this->orientation = orientation; setAcceptDrops(true); if(orientation == Qt::Horizontal) { setLayout(new QHBoxLayout()); } else { setLayout(new QVBoxLayout()); } // layout()->setSpacing(0); // layout()->setContentsMargins(2,2,2,2); // show(); dragObject = NULL; setFrameStyle(QFrame::Box | QFrame::Plain); QPalette pal; pal.setColor(QPalette::Foreground, Qt::blue); setPalette(pal); } void MacroWindow::dragEnterEvent(QDragEnterEvent *event) { if(event->mimeData()->hasFormat("pracro/widget")) { event->acceptProposedAction(); if(dragObject) delete dragObject; QFrame *frame = new QFrame(); QPalette pal; pal.setColor(QPalette::Foreground, Qt::red); frame->setPalette(pal); if(orientation == Qt::Horizontal) { frame->setFixedWidth(1); } else { frame->setFixedHeight(1); } frame->setFrameStyle(QFrame::Box | QFrame::Plain); frame->setContentsMargins(1,1,0,0); dragObject = frame; QWidget *w = findWidget(event->pos()); if(w) { int idx = ((QBoxLayout*)layout())->indexOf(w); ((QBoxLayout*)layout())->insertWidget(idx, dragObject); } else { layout()->addWidget(dragObject); } } } void MacroWindow::dragLeaveEvent(QDragLeaveEvent *) { if(dragObject) delete dragObject; dragObject = NULL; } void MacroWindow::dragMoveEvent(QDragMoveEvent *event) { if(event->mimeData()->hasFormat("pracro/widget")) { event->acceptProposedAction(); layout()->removeWidget(dragObject); QWidget *w = findWidget(event->pos()); if(w == dragObject) return; if(w) { int idx = ((QBoxLayout*)layout())->indexOf(w); ((QBoxLayout*)layout())->insertWidget(idx, dragObject); } else { layout()->addWidget(dragObject); } } } void MacroWindow::dropEvent(QDropEvent *event) { if(event->mimeData()->hasFormat("pracro/widget")) { int idx = layout()->indexOf(dragObject); /* QString type = event->mimeData()->data("pracro/widget").data(); QWidget *widget; if(type == "horizontal") widget = new MacroWindow(Qt::Horizontal); else if(type == "vertical") widget = new MacroWindow(Qt::Vertical); else widget = new Widget(type); */ QWidget *widget = unwrapWidget(event->mimeData()->data("pracro/widget")); widget->setVisible(true); ((QBoxLayout*)layout())->insertWidget(idx, widget); delete dragObject; dragObject = NULL; event->acceptProposedAction(); } } QWidget *MacroWindow::findWidget(QPoint pos) { QPoint newpos = pos; QWidget *w = childAt(newpos); float angle = 0.0; float dist = 0.0; while((!w || QString(w->metaObject()->className()) == "QFrame") && layout()->count()) { angle += M_PI / 4; dist += 1; newpos = pos + QPoint(sin(angle) * dist, cos(angle) * dist); if(newpos.x() > height() && newpos.y() > width() && newpos.y() < 0 && newpos.x() < 0) { break; } // printf("%d, %d\n", newpos.x(), newpos.y()); w = childAt(newpos); } // printf("Done {%p %s}\n", w, w!=NULL?w->metaObject()->className():"(null)"); if(w) { int idx = layout()->indexOf(w); // printf("\r%d > %d", pos.y() - w->pos().y(), w->height() / 2); fflush(stdout); if(orientation == Qt::Horizontal) { if(pos.x() - w->pos().x() > w->width() / 2) idx++; } else { if(pos.y() - w->pos().y() > w->height() / 2) idx++; } // if(idx < layout()->count()) idx = layout()->count() - 1; if(idx >= 0 && idx < layout()->count()) w = layout()->itemAt(idx)->widget(); else w = NULL; } return w; } void MacroWindow::mousePressEvent(QMouseEvent *event) { if(event->button() == Qt::LeftButton) { QDrag *drag = new QDrag(this); drag->setPixmap(QPixmap("drag.png")); QMimeData *mimedata = new QMimeData(); mimedata->setData("pracro/widget", wrapWidget(this)); drag->setMimeData(mimedata); QWidget *parent = parentWidget(); if(parent) { parent->layout()->removeWidget(this); setVisible(false); drag->exec(); } } }