git-svn-id: svn://db.shs.com.ru/libs@383 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2018-05-23 12:18:47 +00:00
parent 1f81d2dadd
commit e76a5fde23
16 changed files with 276 additions and 89 deletions

View File

@@ -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();
}

View File

@@ -5,27 +5,50 @@
#include <QDockWidget>
#include <QMenu>
#include "ui_cdgraphics.h"
#include <pistring.h>
namespace CDUtils {
class CDType;
class CDSection;
}
class QMainWindow;
class Graphic;
class GDockWidget: public QDockWidget {
Q_OBJECT
public:
GDockWidget(QString title = QString(), QMainWindow * p = 0);
void addX(const CDUtils::CDType & t);
Graphic * graphic;
private:
bool eventFilter(QObject * o, QEvent * e);
void contextMenuEvent(QContextMenuEvent * e);
QMenu * menu;
Graphic * viewportGraphic(QObject * o) const;
QMenu * menu, * menu_x;
QList<QAction*> dactions;
QMainWindow * da;
PIVector<PIDeque<int> > x_list;
private slots:
void rename();
void removeX();
signals:
void removeRequest();
};
class CDGraphics : public QWidget, public Ui::CDGraphics
{
Q_OBJECT
@@ -36,16 +59,16 @@ public:
void reset();
private:
bool eventFilter(QObject * o, QEvent * e);
Graphic * viewportGraphic(QObject * o) const;
GDockWidget * graphicDock(Graphic * o) const;
void addXToGraphic(const QString & xp, Graphic * g);
void addGraphic();
QList<Graphic * > graphics;
QList<GDockWidget * > docks;
QMainWindow * da;
public slots:
void receivedX();
private slots:
void removeGraphic();
void on_buttonAdd_clicked();

View File

@@ -3,6 +3,7 @@
#include "cdutils_k.h"
#include "cdutils_core.h"
#include "qcd_core.h"
#include "qcd_view.h"
#include "qcd_model.h"
#include "qcd_modedialog.h"
#include "chunkstream.h"
@@ -34,6 +35,7 @@ CDPultWindow::CDPultWindow(QWidget *parent) : EMainWindow(parent), Ui::CDPultWin
connect(widgetK, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString)));
connect(widgetX, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString)));
connect(widgetC, SIGNAL(addToLog(CDViewWidget::LogIcon,QString)), this, SLOT(addToLog(CDViewWidget::LogIcon,QString)));
connect(widgetX->view, SIGNAL(receivedX()), widgetGraphics, SLOT(receivedX()));
if (windowState() == Qt::WindowMinimized)
setWindowState(Qt::WindowNoState);
}
@@ -160,6 +162,7 @@ void CDPultWindow::on_buttonSessionApply_clicked() {
dockCDKView->setVisible(checkHasK->isChecked());
dockCDXView->setVisible(checkHasX->isChecked());
dockCDCView->setVisible(checkHasC->isChecked());
widgetX->view->startX();
}

View File

@@ -17,7 +17,7 @@
<bool>true</bool>
</property>
<property name="dockOptions">
<set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::VerticalTabs</set>
<set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks</set>
</property>
<widget class="QWidget" name="central"/>
<widget class="QMenuBar" name="menuBar">

View File

@@ -20,6 +20,7 @@ CDItem::CDItem(CDUtils::Interface * i, int _index, CDItem::CDItemType type, CDIt
index_ = _index;
parent_ = parent;
type_ = type;
item_count = 0;
}
@@ -387,12 +388,13 @@ void CDItemModel::rebuildModel() {
}
void CDItemModel::buildItem(CDItem *it, CDSection & r) {
void CDItemModel::buildItem(CDItem * it, CDSection & r) {
//piCout << "build item" << r.name << r.alias;
PIMap<int, CDType>::iterator i;
for (i = r.cd.begin(); i != r.cd.end(); ++i) {
it->childs << new CDItem(interface, i.key(), CDItem::ItemCDType, it);
}
it->item_count = it->childs.size();
PIMap<int, CDSection>::iterator j;
for (j = r.s.begin(); j != r.s.end(); ++j) {
it->childs << new CDItem(interface, j.key(), CDItem::ItemCDSection, it);
@@ -423,3 +425,32 @@ CDItem * CDItemModel::getItem(const QModelIndex &index) const {
}
return root;
}
QModelIndex CDItemModel::indexByPath(const PIDeque<int> & path, int column) const {
if (path.isEmpty()) return QModelIndex();
CDItem * item = root;
//piCout << path << "...";
bool ok = false;
for (int i = 0; i < path.size_s() - 1; ++i) {
ok = false;
foreach (CDItem * j, item->childs)
if (j->type_ == CDItem::ItemCDSection && j->index_ == path[i]) {
item = j;
ok = true;
break;
}
if (!ok) return QModelIndex();
}
ok = false;
foreach (CDItem * j, item->childs)
if (j->type_ == CDItem::ItemCDType && j->index_ == path.back()) {
item = j;
ok = true;
break;
}
if (!ok || !item->parent_) return QModelIndex();
QModelIndex ret = createIndex(item->parent_->childs.indexOf(item), column, item);
//piCout << path << Q2PIString(item->data(cName_Cmd, Qt::DisplayRole).toString()) << getItem(ret)->buildPath();
return ret;
}

View File

@@ -33,6 +33,7 @@ class CDItemModel;
class CDItem {
friend class CDItemModel;
friend class CDView;
public:
enum CDItemType{ItemCDType, ItemCDSection};
CDItem(CDUtils::Interface * interface, int _index, CDItemType type, CDItem * parent);
@@ -51,7 +52,7 @@ private:
QAD::Enum xModeEnum(int v) const;
CDItem * parent_;
int index_;
int index_, item_count;
CDItemType type_;
QList<CDItem *> childs;
};
@@ -80,9 +81,9 @@ public:
explicit CDItemModel(int type_, QObject *parent = 0);
~CDItemModel();
QVariant data(const QModelIndex &index, int role) const;
QVariant data(const QModelIndex & index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const;
QModelIndex parent(const QModelIndex &index) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const;
int columnCount(const QModelIndex &parent = QModelIndex()) const;
@@ -90,6 +91,7 @@ public:
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
QMimeData * mimeData(const QModelIndexList & indexes) const;
CDItem * getItem(const QModelIndex & index) const;
QModelIndex indexByPath(const PIDeque<int> & path, int column = CDUtils::cID) const;
void buildItem(CDItem * it, CDUtils::CDSection &r);

View File

@@ -20,6 +20,7 @@ CDView::CDView(QWidget * parent) : QTreeView(parent) {
connect(this, SIGNAL(_qcd_sendSucceed()), this, SLOT(cd_sendSucceed()), Qt::QueuedConnection);
connect(this, SIGNAL(_qcd_receiveFailed()), this, SLOT(cd_receiveFailed()), Qt::QueuedConnection);
connect(this, SIGNAL(_qcd_receiveSucceed()), this, SLOT(cd_receiveSucceed()), Qt::QueuedConnection);
connect(this, SIGNAL(_qcd_receivedX()), this, SLOT(cd_receivedX()), Qt::QueuedConnection);
}
@@ -45,6 +46,7 @@ void CDView::setType(int cdt) {
CONNECTU(&X, sendFailed, this, pi_cd_sendFailed);
CONNECTU(&X, received, this, pi_cd_receiveSucceed);
CONNECTU(&X, receiveFailed, this, pi_cd_receiveFailed);
CONNECTU(&X, receivedX, this, pi_cd_receivedX);
break;
case CDType::cdC:
CONNECTU(&C, sended, this, pi_cd_sendSucceed);
@@ -286,3 +288,19 @@ void CDView::cd_receiveSucceed() {
emit messageStatus("receive success");
emit receiveSucceed();
}
void CDView::cd_receivedX() {
X.lock();
PIVector<PIDeque<int> > xl = X.enabledList();
//piCout << "X" << xl.size();
piForeachC (PIDeque<int> & x, xl) {
CDType & t(X[x]);
//piCout << t;
//piCout << t.path();
if (t.cd_type() != CDType::cdX) continue;
update(model_->indexByPath(t.path(), cValue));
}
X.unlock();
emit receivedX();
}

View File

@@ -49,12 +49,14 @@ private slots:
void cd_sendSucceed();
void cd_receiveFailed();
void cd_receiveSucceed();
void cd_receivedX();
private:
EVENT_HANDLER(void, pi_cd_sendFailed) {emit _qcd_sendFailed();}
EVENT_HANDLER(void, pi_cd_sendSucceed) {emit _qcd_sendSucceed();}
EVENT_HANDLER(void, pi_cd_receiveFailed) {emit _qcd_receiveFailed();}
EVENT_HANDLER(void, pi_cd_receiveSucceed) {emit _qcd_receiveSucceed();}
EVENT_HANDLER(void, pi_cd_receivedX) {emit _qcd_receivedX();}
CDItemModel * model_;
int type_;
@@ -64,6 +66,7 @@ signals:
void sendSucceed();
void receiveFailed();
void receiveSucceed();
void receivedX();
void messageStatus(QString msg);
void commandSended(QString msg);
void busyStatusChanged(bool busy);
@@ -72,6 +75,7 @@ signals:
void _qcd_sendSucceed(); // PRIVATE
void _qcd_receiveFailed(); // PRIVATE
void _qcd_receiveSucceed(); // PRIVATE
void _qcd_receivedX(); // PRIVATE
};