git-svn-id: svn://db.shs.com.ru/libs@383 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -25,13 +25,76 @@ GDockWidget::GDockWidget(QString title, QMainWindow * p): QDockWidget(title, p)
|
||||
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<int> 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());
|
||||
@@ -39,6 +102,14 @@ void GDockWidget::contextMenuEvent(QContextMenuEvent * e) {
|
||||
}
|
||||
|
||||
|
||||
Graphic * GDockWidget::viewportGraphic(QObject * o) const {
|
||||
if (!o) return 0;
|
||||
while (!qobject_cast<Graphic*>(o) && o)
|
||||
o = o->parent();
|
||||
return qobject_cast<Graphic*>(o);
|
||||
}
|
||||
|
||||
|
||||
void GDockWidget::rename() {
|
||||
QString nn = QInputDialog::getText(this, trUtf8("Rename area"), trUtf8("New area name:"),
|
||||
QLineEdit::Normal, windowTitle());
|
||||
@@ -47,6 +118,16 @@ void GDockWidget::rename() {
|
||||
}
|
||||
|
||||
|
||||
void GDockWidget::removeX() {
|
||||
QAction * a = qobject_cast<QAction * >(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() {
|
||||
@@ -66,44 +147,6 @@ void CDGraphics::reset() {
|
||||
}
|
||||
|
||||
|
||||
bool CDGraphics::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;
|
||||
addXToGraphic(mime->text(), viewportGraphic(o));
|
||||
de->accept();
|
||||
return true;
|
||||
} break;
|
||||
default: break;
|
||||
}
|
||||
//}
|
||||
return QWidget::eventFilter(o, e);
|
||||
}
|
||||
|
||||
|
||||
Graphic * CDGraphics::viewportGraphic(QObject * o) const {
|
||||
if (!o) return 0;
|
||||
while (!qobject_cast<Graphic*>(o) && o)
|
||||
o = o->parent();
|
||||
return qobject_cast<Graphic*>(o);
|
||||
}
|
||||
|
||||
|
||||
GDockWidget * CDGraphics::graphicDock(Graphic * o) const {
|
||||
if (!o) return 0;
|
||||
foreach (GDockWidget * d, docks)
|
||||
@@ -114,57 +157,38 @@ GDockWidget * CDGraphics::graphicDock(Graphic * o) const {
|
||||
|
||||
|
||||
void CDGraphics::addGraphic() {
|
||||
Graphic * g = new Graphic();
|
||||
g->setGraphicsCount(0);
|
||||
g->setBorderInputsVisible(false);
|
||||
g->setLegendVisible(true);
|
||||
g->viewport()->setAcceptDrops(true);
|
||||
g->viewport()->installEventFilter(this);
|
||||
GDockWidget * dw = new GDockWidget(QString("graphics %1").arg(graphics.size()), da);
|
||||
GDockWidget * dw = new GDockWidget(QString("area %1").arg(docks.size()), da);
|
||||
connect(dw, SIGNAL(removeRequest()), this, SLOT(removeGraphic()));
|
||||
dw->setWidget(g);
|
||||
da->addDockWidget(Qt::RightDockWidgetArea, dw);
|
||||
docks << dw;
|
||||
graphics << g;
|
||||
}
|
||||
|
||||
|
||||
void CDGraphics::receivedX() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CDGraphics::removeGraphic() {
|
||||
GDockWidget * d = qobject_cast<GDockWidget * >(sender());
|
||||
if (!d) return;
|
||||
Graphic * g = qobject_cast<Graphic * >(d->widget());
|
||||
docks.removeAll(d);
|
||||
graphics.removeAll(g);
|
||||
g->deleteLater();
|
||||
d->deleteLater();
|
||||
}
|
||||
|
||||
|
||||
void CDGraphics::addXToGraphic(const QString & xp, Graphic * g) {
|
||||
qDebug() << "addGraphic" << xp << g;
|
||||
GDockWidget * d = graphicDock(g);
|
||||
if (xp.isEmpty() || !g || !d) return;
|
||||
CDType & t(X[CDCore::stringToPath(Q2PIString(xp))]);
|
||||
int gind = g->graphicsCount();
|
||||
g->setGraphicsCount(gind + 1);
|
||||
g->setGraphicName(PI2QString(t.pathString().join(".")), gind);
|
||||
}
|
||||
|
||||
|
||||
void CDGraphics::on_buttonAdd_clicked() {
|
||||
addGraphic();
|
||||
}
|
||||
|
||||
|
||||
void CDGraphics::on_buttonClear_clicked() {
|
||||
foreach (Graphic * g, graphics)
|
||||
g->clear();
|
||||
foreach (GDockWidget * d, docks)
|
||||
d->graphic->clear();
|
||||
}
|
||||
|
||||
|
||||
void CDGraphics::on_buttonRemoveAll_clicked() {
|
||||
qDeleteAll(graphics);
|
||||
qDeleteAll(docks);
|
||||
graphics.clear();
|
||||
docks.clear();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user