#include "cdgraphics.h" #include "cdutils_core.h" #include "cdutils_x.h" #include "qcd_core.h" #include "qcd_model.h" #include "graphic.h" #include "piqt.h" #include #include #include #include #include #include #include using namespace CDUtils; GDockWidget::GDockWidget(QString title, QMainWindow * p): QDockWidget(title, p) { da = p; menu = new QMenu(this); QAction * a = new QAction(QIcon(":/icons/document-edit.png"), "Rename ...", this); connect(a, SIGNAL(triggered(bool)), this, SLOT(rename())); dactions << a; a = new QAction(QIcon(":/icons/edit-delete.png"), "Remove", this); connect(a, SIGNAL(triggered(bool)), this, SIGNAL(removeRequest())); dactions << a; menu_x = new QMenu(this); menu_x->setTitle(trUtf8("Remove X")); graphic = new Graphic(); graphic->setGraphicsCount(0); graphic->setBorderInputsVisible(false); graphic->setLegendVisible(true); graphic->setStatusVisible(false); graphic->setButtons(graphic->buttons() & ~(Graphic::Grid | Graphic::OnlyExpandX | Graphic::Close)); graphic->viewport()->setAcceptDrops(true); graphic->viewport()->installEventFilter(this); setWidget(graphic); } void GDockWidget::addX(const CDType & t) { if (t.cd_type() != CDType::cdX) return; PIDeque xp = t.path(); if (x_list.contains(xp)) return; x_list << xp; int gind = graphic->graphicsCount(); graphic->setGraphicsCount(gind + 1); graphic->setGraphicName(PI2QString(t.pathString().join(".")), gind); } bool GDockWidget::eventFilter(QObject * o, QEvent * e) { //if (o == graphic->viewport()) { switch (e->type()) { case QEvent::DragEnter: { QDragEnterEvent * de = (QDragEnterEvent*)e; const QMimeData * mime = de->mimeData(); //qDebug() << "enter" << mime; if (!mime) break; if (mime->text().isEmpty()) break; de->setDropAction(Qt::CopyAction); de->accept(); return true; } break; case QEvent::Drop: { QDropEvent * de = (QDropEvent*)e; const QMimeData * mime = de->mimeData(); if (!mime) break; //qDebug() << "drop" << mime->text(); if (mime->text().isEmpty()) break; addX(X[CDCore::stringToPath(Q2PIString(mime->text()))]); de->accept(); return true; } break; default: break; } //} return QWidget::eventFilter(o, e); } void GDockWidget::contextMenuEvent(QContextMenuEvent * e) { qDeleteAll(menu_x->actions()); menu_x->clear(); for (int i = 0; i < graphic->graphicsCount(); ++i) { QPixmap icon(da->iconSize()); icon.fill(graphic->graphic(i).pen.color()); QAction * a = new QAction(QIcon(icon), graphic->graphic(i).name, this); a->setData(i); connect(a, SIGNAL(triggered(bool)), this, SLOT(removeX())); menu_x->addAction(a); } QMenu * mwm = da->createPopupMenu(); menu->clear(); menu->addActions(dactions); menu->addMenu(menu_x); menu->addSeparator(); menu->addActions(mwm->actions()); menu->popup(e->globalPos()); mwm->deleteLater(); } Graphic * GDockWidget::viewportGraphic(QObject * o) const { if (!o) return 0; while (!qobject_cast(o) && o) o = o->parent(); return qobject_cast(o); } void GDockWidget::rename() { QString nn = QInputDialog::getText(this, trUtf8("Rename area"), trUtf8("New area name:"), QLineEdit::Normal, windowTitle()); if (nn.isEmpty()) return; setWindowTitle(nn); } void GDockWidget::removeX() { QAction * a = qobject_cast(sender()); if (!a) return; int ind = a->data().toInt(); if (ind < 0 || ind >= x_list.size_s()) return; x_list.remove(ind); graphic->removeGraphic(ind); } CDGraphics::CDGraphics(QWidget * parent) : QWidget(parent), Ui::CDGraphics() { setupUi(this); da = new QMainWindow(); da->setWindowFlags(frame->windowFlags()); da->setDockNestingEnabled(true); layoutMain->addWidget(da); } CDGraphics::~CDGraphics() { } void CDGraphics::reset() { } GDockWidget * CDGraphics::graphicDock(Graphic * o) const { if (!o) return 0; foreach (GDockWidget * d, docks) if (d->widget() == o) return d; return 0; } void CDGraphics::addGraphic() { GDockWidget * dw = new GDockWidget(QString("area %1").arg(docks.size()), da); connect(dw, SIGNAL(removeRequest()), this, SLOT(removeGraphic())); da->addDockWidget(Qt::RightDockWidgetArea, dw); docks << dw; } void CDGraphics::receivedX() { } void CDGraphics::removeGraphic() { GDockWidget * d = qobject_cast(sender()); if (!d) return; docks.removeAll(d); d->deleteLater(); } void CDGraphics::on_buttonAdd_clicked() { addGraphic(); } void CDGraphics::on_buttonClear_clicked() { foreach (GDockWidget * d, docks) d->graphic->clear(); } void CDGraphics::on_buttonRemoveAll_clicked() { qDeleteAll(docks); docks.clear(); }