From 6e0524f820fa51bc28c57f544708eaf35827e7a6 Mon Sep 17 00:00:00 2001 From: Denes Matetelki Date: Thu, 9 Jun 2011 14:11:35 +0200 Subject: [PATCH] nodes are selectable with vimperator-like follow keys --- edge.cpp | 5 +- graphwidget.cpp | 158 ++++++++++++++++++++++++++++++++++++++++++++---- graphwidget.h | 8 ++- mainwindow.ui | 12 ++++ node.cpp | 38 ++++++++---- node.h | 8 ++- 6 files changed, 200 insertions(+), 29 deletions(-) diff --git a/edge.cpp b/edge.cpp index e602999..4b8535e 100644 --- a/edge.cpp +++ b/edge.cpp @@ -32,7 +32,10 @@ Node *Edge::destNode() const return m_destNode; } -/// @note This is brute force. Isn't there a simple fv for this? +/** @note This is brute force. Isn't there a simple fv for this? + * The precision is not the best either + */ + QPointF firstNotContainedPoint(const QLineF &line, const QRectF &rect, bool reverse = false) diff --git a/graphwidget.cpp b/graphwidget.cpp index 6f65cf7..985f15e 100644 --- a/graphwidget.cpp +++ b/graphwidget.cpp @@ -8,7 +8,6 @@ GraphWidget::GraphWidget(QWidget *parent) : QGraphicsView(parent), - m_activeNode(0), m_showingNodeNumbers(false) { qDebug() << __PRETTY_FUNCTION__; @@ -59,14 +58,58 @@ GraphWidget::GraphWidget(QWidget *parent) : node6->setPos(-10, 100); m_nodeList.append(node6); + Node *node7 = new Node(this); + node7->setHtml(QString("node

important

shit")); + m_scene->addItem(node7); + node7->setPos(-200, 50); + m_nodeList.append(node7); + + Node *node8 = new Node(this); + node8->setHtml(QString("more than\none lins")); + m_scene->addItem(node8); + node8->setPos(50, -80); + m_nodeList.append(node8); + + Node *node9 = new Node(this); + node9->setHtml(QString("iam a bald and italian guy")); + m_scene->addItem(node9); + node9->setPos(50, 40); + m_nodeList.append(node9); + + Node *node10 = new Node(this); + node10->setHtml(QString("no joke")); + m_scene->addItem(node10); + node10->setPos(-160, -10); + m_nodeList.append(node10); + + Node *node11 = new Node(this); + node11->setHtml(QString("salalal")); + m_scene->addItem(node11); + node11->setPos(-120, -120); + m_nodeList.append(node11); + + Node *node12 = new Node(this); + node12->setHtml(QString("lalalala")); + m_scene->addItem(node12); + node12->setPos(130, -10); + m_nodeList.append(node12);; + m_scene->addItem(new Edge(node1, node2)); m_scene->addItem(new Edge(node1, node3)); m_scene->addItem(new Edge(node3, node4)); m_scene->addItem(new Edge(node1, node5)); m_scene->addItem(new Edge(node5, node6)); + m_scene->addItem(new Edge(node4, node11)); + m_scene->addItem(new Edge(node2, node12)); + m_scene->addItem(new Edge(node3, node10)); + m_scene->addItem(new Edge(node10, node7)); + m_scene->addItem(new Edge(node5, node7)); + m_scene->addItem(new Edge(node2, node8)); + m_scene->addItem(new Edge(node2, node9)); + m_activeNode = m_nodeList.first(); - m_activeNode->setActive(true); + m_activeNode->setActive(); } QGraphicsScene *GraphWidget::getScene() @@ -77,7 +120,7 @@ QGraphicsScene *GraphWidget::getScene() void GraphWidget::keyPressEvent(QKeyEvent *event) { qDebug() << __PRETTY_FUNCTION__; -// qDebug() << event->key(); + qDebug() << event->key(); switch (event->key()) { case Qt::Key_Up: @@ -99,12 +142,15 @@ void GraphWidget::keyPressEvent(QKeyEvent *event) scaleView(1 / qreal(1.2)); break; case Qt::Key_F: - { // need brackets because of local variable m_showingNodeNumbers = !m_showingNodeNumbers; - int i =0; - for (QList::const_iterator it = m_nodeList.begin(); it != m_nodeList.end(); it++, i++) - dynamic_cast(*it)->showNumber(i,m_showingNodeNumbers); - } + if (m_showingNodeNumbers) + m_followNumber.clear(); + + showingAllNodeNumbers(m_showingNodeNumbers); + break; + + case Qt::Key_Insert: + insertNode(); break; case Qt::Key_0: @@ -117,11 +163,44 @@ void GraphWidget::keyPressEvent(QKeyEvent *event) case Qt::Key_7: case Qt::Key_8: case Qt::Key_9: + if (!m_showingNodeNumbers) + break; + + m_followNumber.append(QString::number(event->key()-48)); + showingAllNodeNumbers(false); + showingNodeNumbersBeginWithNumber(m_followNumber.toInt(), true); + + break; - m_activeNode->setActive(false); - m_activeNode = m_nodeList[3]; - m_activeNode->setActive(true); + case Qt::Key_Backspace: + if (!m_showingNodeNumbers) + break; + if (!m_followNumber.isEmpty()) + { + m_followNumber.remove(m_followNumber.length()-1,1); + if (m_followNumber.isEmpty()) + { + showingAllNodeNumbers(true); + } + else + { + showingAllNodeNumbers(false); + showingNodeNumbersBeginWithNumber(m_followNumber.toInt(), true); + } + } + break; + + case Qt::Key_Return: + case Qt::Key_Enter: + if (m_followNode) + { + showingAllNodeNumbers(false); + m_activeNode->setActive(false); + m_activeNode = m_followNode; + m_activeNode->setActive(); + m_showingNodeNumbers = false; + } break; default: @@ -158,7 +237,6 @@ void GraphWidget::scaleView(qreal scaleFactor) scale(scaleFactor, scaleFactor); } -/// @note this == 0? how is it possible? void GraphWidget::setActiveNode(Node *node) { qDebug() << __PRETTY_FUNCTION__; @@ -167,5 +245,59 @@ void GraphWidget::setActiveNode(Node *node) m_activeNode->setActive(false); m_activeNode = node; - m_activeNode->setActive(true); + m_activeNode->setActive(); +} + +void GraphWidget::insertNode() +{ + qDebug() << __PRETTY_FUNCTION__; +} + +void GraphWidget::showingAllNodeNumbers(const bool &show) +{ + int i =0; + for (QList::const_iterator it = m_nodeList.begin(); it != m_nodeList.end(); it++, i++) + dynamic_cast(*it)->showNumber(i,show); +} + +void GraphWidget::showingNodeNumbersBeginWithNumber(const int &number, const bool &show) +{ + int i(0); + int hit(0); + for (QList::const_iterator it = m_nodeList.begin(); it != m_nodeList.end(); it++, i++) + { + if (i == number) + { + hit++; + dynamic_cast(*it)->showNumber(i,show,true); + m_followNode = dynamic_cast(*it); + continue; + } + if (numberStartsWithNumber(i, number)) + { + hit++; + dynamic_cast(*it)->showNumber(i,show); + } + } + if (hit==1) + { + qDebug() << "set active"; + showingAllNodeNumbers(false); + m_activeNode->setActive(false); + m_activeNode = m_followNode; + m_activeNode->setActive(); + m_showingNodeNumbers = false; + } + + /// @bug handle this case +// else if (hit == 0) +// { + + +// } +} + +bool GraphWidget::numberStartsWithNumber(const int &number, const int &prefix) +{ + return (QString::number(number)).startsWith(QString::number(prefix)); } diff --git a/graphwidget.h b/graphwidget.h index f9cb66e..b420aed 100644 --- a/graphwidget.h +++ b/graphwidget.h @@ -17,6 +17,7 @@ public: GraphWidget(QWidget *parent = 0); QGraphicsScene *getScene(); void setActiveNode(Node *node); + void insertNode(); protected: @@ -28,11 +29,16 @@ protected: private: + void showingAllNodeNumbers(const bool &show = true); + void showingNodeNumbersBeginWithNumber(const int &number, const bool &show = true); + bool numberStartsWithNumber(const int &number, const int &prefix); + QList m_nodeList; Node *m_activeNode; QGraphicsScene *m_scene; bool m_showingNodeNumbers; - + QString m_followNumber; + Node *m_followNode; }; diff --git a/mainwindow.ui b/mainwindow.ui index 4485505..029f7d3 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -55,6 +55,9 @@ + + false + &New @@ -63,6 +66,9 @@ + + false + &Open @@ -71,6 +77,9 @@ + + false + &Save @@ -92,6 +101,9 @@ + + false + &Close diff --git a/node.cpp b/node.cpp index 779e00a..a121c27 100644 --- a/node.cpp +++ b/node.cpp @@ -8,8 +8,9 @@ Node::Node(GraphWidget *parent) : m_graph(parent), m_isActive(false), - m_activeEdge(0), - m_number(-1) +// m_activeEdge(0), + m_number(-1), + m_numberIsSpecial(false) { qDebug() << __PRETTY_FUNCTION__; @@ -72,7 +73,13 @@ QVariant Node::itemChange(GraphicsItemChange change, const QVariant &value) void Node::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *w) { - qDebug() << __PRETTY_FUNCTION__; +// qDebug() << __PRETTY_FUNCTION__; + + if (m_number != -1) + { + painter->setBackground(m_numberIsSpecial ? Qt::green : Qt::yellow); + painter->setBackgroundMode(Qt::OpaqueMode); + } QGraphicsTextItem::paint(painter, option, w); @@ -82,12 +89,10 @@ void Node::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWid boundingRect().bottomRight().toPoint() - QPoint(1,1))); - qDebug() << m_number; - if (m_number != -1) { - painter->setPen(Qt::yellow); - painter->setBackground(Qt::black); + painter->setPen(Qt::white); + painter->setBackground(Qt::red); painter->setBackgroundMode(Qt::OpaqueMode); painter->drawText(boundingRect().topLeft()+QPointF(0,11), QString("%1").arg(m_number)); } @@ -102,18 +107,28 @@ void Node::setActive(const bool &active) } +/// @note who shall set active: press or release? void Node::mousePressEvent(QGraphicsSceneMouseEvent *event) { qDebug() << __PRETTY_FUNCTION__; + m_graph->setActiveNode(this); + QGraphicsItem::mousePressEvent(event); } -void Node::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +void Node::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { qDebug() << __PRETTY_FUNCTION__; - m_graph->setActiveNode(this); + m_graph->insertNode(); + + QGraphicsItem::mouseDoubleClickEvent(event); +} + +void Node::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + qDebug() << __PRETTY_FUNCTION__; QGraphicsItem::mouseReleaseEvent(event); } @@ -125,10 +140,11 @@ void Node::mouseMoveEvent(QGraphicsSceneMouseEvent *event) QGraphicsItem::mouseMoveEvent(event); } -void Node::showNumber(const int &number, const bool& show) +void Node::showNumber(const int &number, const bool& show, const bool &numberIsSpecial) { - qDebug() << __PRETTY_FUNCTION__; +// qDebug() << __PRETTY_FUNCTION__; m_number = show ? number : -1; + m_numberIsSpecial = numberIsSpecial; update(); } diff --git a/node.h b/node.h index 113cfe2..6068fad 100644 --- a/node.h +++ b/node.h @@ -16,8 +16,8 @@ public: void addEdge(Edge *edge); // QList edges() const; - void setActive(const bool &active); - void showNumber(const int &number, const bool& show); + void setActive(const bool &active = true); + void showNumber(const int &number, const bool& show = true, const bool &numberIsSpecial = false); protected: @@ -25,6 +25,7 @@ protected: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); QVariant itemChange(GraphicsItemChange change, const QVariant &value); void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); @@ -33,8 +34,9 @@ private: QList m_edgeList; GraphWidget *m_graph; bool m_isActive; - Edge *m_activeEdge; +// Edge *m_activeEdge; int m_number; + bool m_numberIsSpecial; }; #endif // NODE_H