Skip to content

Commit

Permalink
Switch to using painter->drawText() in some more graphics items, define
Browse files Browse the repository at this point in the history
drop zones in all directions of each element
  • Loading branch information
aelliott committed Feb 16, 2012
1 parent 5b55b40 commit 4288ed6
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 47 deletions.
27 changes: 17 additions & 10 deletions GraphicsItems/alternationgraphicsitem.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -29,11 +29,8 @@ AlternationGraphicsItem::AlternationGraphicsItem(QGraphicsLinearLayout *initialL
double horizontalPadding = settings.value("Visualisation/Alternation/HorizontalPadding", 8.0).toDouble(); double horizontalPadding = settings.value("Visualisation/Alternation/HorizontalPadding", 8.0).toDouble();
double verticalPadding = settings.value("Visualisation/Alternation/VerticalPadding", 6.0).toDouble(); double verticalPadding = settings.value("Visualisation/Alternation/VerticalPadding", 6.0).toDouble();


_title = new QGraphicsTextItem("Alternation", this);
_title->setPos(horizontalPadding, verticalPadding);

_mainLayout = new QGraphicsLinearLayout(Qt::Vertical); _mainLayout = new QGraphicsLinearLayout(Qt::Vertical);
_mainLayout->setContentsMargins(horizontalPadding, 2*verticalPadding + _title->boundingRect().height(), horizontalPadding, verticalPadding); _mainLayout->setContentsMargins(horizontalPadding, 2*verticalPadding + _metrics.height(), horizontalPadding, verticalPadding);
_mainLayout->setSpacing(itemSpacing); _mainLayout->setSpacing(itemSpacing);
setLayout(_mainLayout); setLayout(_mainLayout);


Expand Down Expand Up @@ -62,7 +59,7 @@ QRectF AlternationGraphicsItem::boundingRect() const
double horizontalPadding = settings.value("Visualisation/Alternation/HorizontalPadding", 8.0).toDouble(); double horizontalPadding = settings.value("Visualisation/Alternation/HorizontalPadding", 8.0).toDouble();
QSizeF childrenRect = _mainLayout->sizeHint(Qt::PreferredSize); QSizeF childrenRect = _mainLayout->sizeHint(Qt::PreferredSize);


return QRectF(0, 0, qMax(childrenRect.width(), 2*horizontalPadding + _title->boundingRect().width()), childrenRect.height()); return QRectF(0, 0, qMax(childrenRect.width(), 2*horizontalPadding + _metrics.width(tr("Alternation"))), childrenRect.height());
} }


void AlternationGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void AlternationGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Expand All @@ -71,12 +68,14 @@ void AlternationGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphic
Q_UNUSED(widget) Q_UNUSED(widget)


QSettings settings; QSettings settings;
double itemSpacing = settings.value("Visualisation/VerticalSpacing", 12.0).toDouble(); _font = settings.value("Visualisation/Font", QFont("sans-serif", 10)).value<QFont>();
double itemSpacing = settings.value("Visualisation/VerticalSpacing", 12.0).toDouble();
double horizontalPadding = settings.value("Visualisation/Alternation/HorizontalPadding", 8.0).toDouble(); double horizontalPadding = settings.value("Visualisation/Alternation/HorizontalPadding", 8.0).toDouble();
double verticalPadding = settings.value("Visualisation/Alternation/VerticalPadding", 6.0).toDouble(); double verticalPadding = settings.value("Visualisation/Alternation/VerticalPadding", 6.0).toDouble();
double cornerRadius = settings.value("Visualisation/Alternation/CornerRadius", 5.0).toDouble(); double cornerRadius = settings.value("Visualisation/Alternation/CornerRadius", 5.0).toDouble();
QColor bgColor = settings.value("Visualisation/Alternation/Color", QColor(255,255,225)).value<QColor>(); QColor bgColor = settings.value("Visualisation/Alternation/Color", QColor(255,255,225)).value<QColor>();


painter->setFont(_font);
painter->setBrush(bgColor); painter->setBrush(bgColor);
painter->setPen(Qt::black); painter->setPen(Qt::black);


Expand All @@ -94,7 +93,15 @@ void AlternationGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphic
} }
painter->drawRoundedRect(drawRect, cornerRadius, cornerRadius); painter->drawRoundedRect(drawRect, cornerRadius, cornerRadius);


double offset = 2*verticalPadding + _title->boundingRect().height(); painter->drawText(QRectF(
horizontalPadding,
verticalPadding,
drawRect.width()-2*horizontalPadding,
_metrics.height()),
Qt::AlignCenter,
tr("Alternation"));

double offset = 2*verticalPadding + _metrics.height();
for(int i = 0; (i+1) < _mainLayout->count(); ++i) for(int i = 0; (i+1) < _mainLayout->count(); ++i)
{ {
if(i > 0) if(i > 0)
Expand Down
36 changes: 26 additions & 10 deletions GraphicsItems/anchorgraphicsitem.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -24,21 +24,17 @@
AnchorGraphicsItem::AnchorGraphicsItem(Token *token, int tokenPos, QGraphicsItem *parent) AnchorGraphicsItem::AnchorGraphicsItem(Token *token, int tokenPos, QGraphicsItem *parent)
: RegexGraphicsItem(token, tokenPos, parent) : RegexGraphicsItem(token, tokenPos, parent)
{ {
_text = new QGraphicsTextItem(this);

switch(token->type()) switch(token->type())
{ {
case T_STARTING_POSITION: case T_STARTING_POSITION:
_text->setHtml("<center>Starting<br>Position"); _text = tr("Starting\nPosition");
break; break;
case T_ENDING_POSITION: case T_ENDING_POSITION:
_text->setHtml("<center>Ending<br>Position"); _text = tr("Ending\nPosition");
break; break;
default: default:
_text->setHtml("Unhandled token"); _text = tr("Unhandled\ntoken");
} }

_text->setTextWidth(_text->boundingRect().width());
} }


QRectF AnchorGraphicsItem::boundingRect() const QRectF AnchorGraphicsItem::boundingRect() const
Expand All @@ -47,9 +43,14 @@ QRectF AnchorGraphicsItem::boundingRect() const
double horizontalPadding = settings.value("Visualisation/Anchor/HorizontalPadding", 6.0).toDouble(); double horizontalPadding = settings.value("Visualisation/Anchor/HorizontalPadding", 6.0).toDouble();
double verticalPadding = settings.value("Visualisation/Anchor/VerticalPadding", 5.0).toDouble(); double verticalPadding = settings.value("Visualisation/Anchor/VerticalPadding", 5.0).toDouble();


QRectF textRect = _text->boundingRect(); int lines = _text.count("\n")+1;
double textWidth = 0.0;
QStringList words = _text.split("\n");
for(int i = 0; i < words.size(); ++i)
if(_metrics.width(words.at(i)) > textWidth)
textWidth = _metrics.width(words.at(i));


return QRectF(0, 0, textRect.width() + 2*horizontalPadding, textRect.height() + 2*verticalPadding); return QRectF(0, 0, textWidth + 2*horizontalPadding, lines*_metrics.height() + 2*verticalPadding);
} }


void AnchorGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void AnchorGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Expand All @@ -58,11 +59,13 @@ void AnchorGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
Q_UNUSED(widget) Q_UNUSED(widget)


QSettings settings; QSettings settings;
_font = settings.value("Visualisation/Font", QFont("sans-serif", 10)).value<QFont>();
double horizontalPadding = settings.value("Visualisation/Anchor/HorizontalPadding", 6.0).toDouble(); double horizontalPadding = settings.value("Visualisation/Anchor/HorizontalPadding", 6.0).toDouble();
double verticalPadding = settings.value("Visualisation/Anchor/VerticalPadding", 5.0).toDouble(); double verticalPadding = settings.value("Visualisation/Anchor/VerticalPadding", 5.0).toDouble();
double cornerRadius = settings.value("Visualisation/Anchor/CornerRadius", 5.0).toDouble(); double cornerRadius = settings.value("Visualisation/Anchor/CornerRadius", 5.0).toDouble();
QColor bgColor = settings.value("Visualisation/Anchor/Color", QColor(220,255,255)).value<QColor>(); QColor bgColor = settings.value("Visualisation/Anchor/Color", QColor(220,255,255)).value<QColor>();


painter->setFont(_font);
painter->setBrush(bgColor); painter->setBrush(bgColor);
painter->setPen(Qt::black); painter->setPen(Qt::black);


Expand All @@ -80,7 +83,20 @@ void AnchorGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem
} }
painter->drawRoundedRect(drawRect, cornerRadius, cornerRadius); painter->drawRoundedRect(drawRect, cornerRadius, cornerRadius);


_text->setPos(horizontalPadding, verticalPadding); int lines = _text.count("\n")+1;
double textWidth = 0.0;
QStringList words = _text.split("\n");
for(int i = 0; i < words.size(); ++i)
if(_metrics.width(words.at(i)) > textWidth)
textWidth = _metrics.width(words.at(i));

painter->drawText(QRectF(
horizontalPadding,
verticalPadding,
textWidth,
lines*_metrics.height()),
Qt::AlignCenter | Qt::TextWordWrap,
_text);
} }


QSizeF AnchorGraphicsItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const QSizeF AnchorGraphicsItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
Expand Down
2 changes: 1 addition & 1 deletion GraphicsItems/anchorgraphicsitem.hpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class AnchorGraphicsItem : public RegexGraphicsItem
QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const; QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const;


private: private:
QGraphicsTextItem *_text; QString _text;
}; };


#endif // ANCHORITEM_HPP #endif // ANCHORITEM_HPP
60 changes: 48 additions & 12 deletions GraphicsItems/bracketexpressiongraphicsitem.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ BracketExpressionGraphicsItem::BracketExpressionGraphicsItem(Token *token, int t
: RegexGraphicsItem(token, tokenPos, parent) : RegexGraphicsItem(token, tokenPos, parent)
{ {
_negated = (token->type() == T_NEGATED_BRACKET_EXPRESSION_OPEN); _negated = (token->type() == T_NEGATED_BRACKET_EXPRESSION_OPEN);
_text = new QGraphicsTextItem(this);
} }


void BracketExpressionGraphicsItem::addToken(Token *token) void BracketExpressionGraphicsItem::addToken(Token *token)
Expand Down Expand Up @@ -88,7 +87,7 @@ void BracketExpressionGraphicsItem::readTokens()


if(characters.length() > 0) if(characters.length() > 0)
{ {
QString chars = "Any one of: "; QString chars = "Characters: ";
bool first = true; bool first = true;
for(stringIter = characters.begin(); stringIter != characters.end(); ++stringIter) for(stringIter = characters.begin(); stringIter != characters.end(); ++stringIter)
{ {
Expand All @@ -103,18 +102,23 @@ void BracketExpressionGraphicsItem::readTokens()
items.push_back(chars); items.push_back(chars);
} }


QString text;
if(_negated) if(_negated)
text = "Any Character Except:"; _heading = "Any Character Except:";
else else
text = "Any One Of:"; _heading = "Any One Of:";


_text = "";
bool first = true;
for(stringIter = items.begin(); stringIter != items.end(); ++stringIter) for(stringIter = items.begin(); stringIter != items.end(); ++stringIter)
{ {
text += QString("<br> - ") + (*stringIter); if(first)
{
_text = QString(" - ") + (*stringIter);
first = false;
}
else
_text += QString("\n - ") + (*stringIter);
} }

_text->setHtml(text);
} }


QRectF BracketExpressionGraphicsItem::boundingRect() const QRectF BracketExpressionGraphicsItem::boundingRect() const
Expand All @@ -123,9 +127,17 @@ QRectF BracketExpressionGraphicsItem::boundingRect() const
double horizontalPadding = settings.value("Visualisation/BracketExpression/HorizontalPadding", 6.0).toDouble(); double horizontalPadding = settings.value("Visualisation/BracketExpression/HorizontalPadding", 6.0).toDouble();
double verticalPadding = settings.value("Visualisation/BracketExpression/VerticalPadding", 5.0).toDouble(); double verticalPadding = settings.value("Visualisation/BracketExpression/VerticalPadding", 5.0).toDouble();


QRectF textRect = _text->boundingRect(); // +2 in this case because of the extra heading in paint()

// This also means 3 sets of vertical padding
return QRectF(0, 0, textRect.width() + 2*horizontalPadding, textRect.height() + 2*verticalPadding); int lines = _text.count("\n")+2;
double textWidth = 0.0;
QStringList words = _text.split("\n");
for(int i = 0; i < words.size(); ++i)
if(_metrics.width(words.at(i)) > textWidth)
textWidth = _metrics.width(words.at(i));
textWidth = qMax(textWidth, static_cast<double>(_metrics.width(_heading)));

return QRectF(0, 0, textWidth + 2*horizontalPadding, lines*_metrics.height() + 3*verticalPadding);
} }


void BracketExpressionGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void BracketExpressionGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Expand All @@ -134,11 +146,13 @@ void BracketExpressionGraphicsItem::paint(QPainter *painter, const QStyleOptionG
Q_UNUSED(widget) Q_UNUSED(widget)


QSettings settings; QSettings settings;
_font = settings.value("Visualisation/Font", QFont("sans-serif", 10)).value<QFont>();
double horizontalPadding = settings.value("Visualisation/BracketExpression/HorizontalPadding", 6.0).toDouble(); double horizontalPadding = settings.value("Visualisation/BracketExpression/HorizontalPadding", 6.0).toDouble();
double verticalPadding = settings.value("Visualisation/BracketExpression/VerticalPadding", 5.0).toDouble(); double verticalPadding = settings.value("Visualisation/BracketExpression/VerticalPadding", 5.0).toDouble();
double cornerRadius = settings.value("Visualisation/BracketExpression/CornerRadius", 5.0).toDouble(); double cornerRadius = settings.value("Visualisation/BracketExpression/CornerRadius", 5.0).toDouble();
QColor bgColor = settings.value("Visualisation/BracketExpression/Color", QColor(225,225,255)).value<QColor>(); QColor bgColor = settings.value("Visualisation/BracketExpression/Color", QColor(225,225,255)).value<QColor>();


painter->setFont(_font);
painter->setBrush(bgColor); painter->setBrush(bgColor);
painter->setPen(Qt::black); painter->setPen(Qt::black);


Expand All @@ -156,7 +170,29 @@ void BracketExpressionGraphicsItem::paint(QPainter *painter, const QStyleOptionG
} }
painter->drawRoundedRect(drawRect, cornerRadius, cornerRadius); painter->drawRoundedRect(drawRect, cornerRadius, cornerRadius);


_text->setPos(horizontalPadding, verticalPadding); int lines = _text.count("\n")+1;
double textWidth = 0.0;
QStringList words = _text.split("\n");
for(int i = 0; i < words.size(); ++i)
if(_metrics.width(words.at(i)) > textWidth)
textWidth = _metrics.width(words.at(i));
textWidth = qMax(textWidth, static_cast<double>(_metrics.width(_heading)));

painter->drawText(QRectF(
horizontalPadding,
verticalPadding,
textWidth,
_metrics.height()),
Qt::AlignCenter,
_heading);

painter->drawText(QRectF(
horizontalPadding,
_metrics.height() + 2*verticalPadding,
textWidth,
lines*_metrics.height()),
Qt::AlignVCenter | Qt::AlignLeft | Qt::TextWordWrap,
_text);
} }


QSizeF BracketExpressionGraphicsItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const QSizeF BracketExpressionGraphicsItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
Expand Down
3 changes: 2 additions & 1 deletion GraphicsItems/bracketexpressiongraphicsitem.hpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ class BracketExpressionGraphicsItem : public RegexGraphicsItem


private: private:
std::vector<Token *> _tokens; std::vector<Token *> _tokens;
QGraphicsTextItem *_text; QString _text;
QString _heading;
bool _negated; bool _negated;
}; };


Expand Down
58 changes: 45 additions & 13 deletions expressiongraphicsscene.cpp
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@


#include <QGraphicsSceneDragDropEvent> #include <QGraphicsSceneDragDropEvent>
#include <QMimeData> #include <QMimeData>
#include <QSettings>
#include <QDebug> #include <QDebug>


ExpressionGraphicsScene::ExpressionGraphicsScene(QObject *parent) ExpressionGraphicsScene::ExpressionGraphicsScene(QObject *parent)
Expand All @@ -32,6 +33,9 @@ ExpressionGraphicsScene::ExpressionGraphicsScene(QObject *parent)


void ExpressionGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event) void ExpressionGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{ {
QSettings settings;
double itemSpacing = settings.value("Visualisation/HorizontalSpacing", 8.0).toDouble();

while(_dropZoneLabels.size() > 0) while(_dropZoneLabels.size() > 0)
{ {
removeItem(_dropZoneLabels.at(0)); removeItem(_dropZoneLabels.at(0));
Expand All @@ -45,21 +49,49 @@ void ExpressionGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
QPointF itemPos = item->scenePos(); QPointF itemPos = item->scenePos();
QRectF bounds = item->boundingRect(); QRectF bounds = item->boundingRect();


qDebug() << itemPos; QColor dropZoneColour(210, 210, 255, 80);
qDebug() << bounds; QBrush brush(dropZoneColour);
QPen pen(dropZoneColour);


QPointF topLeft = itemPos; QPointF topLeft = itemPos;
topLeft.setY(itemPos.y()-8.0); topLeft.setY(itemPos.y()-itemSpacing);


QPointF bottomRight = itemPos; QGraphicsRectItem *topLabel = new QGraphicsRectItem(0, 0, bounds.width(), itemSpacing);
bottomRight.setX(itemPos.x()+bounds.width()); topLabel->setPen(pen);

topLabel->setBrush(brush);
QGraphicsRectItem *dropZoneLabel = new QGraphicsRectItem(0, 0, bounds.width(), 8.0); topLabel->setPos(topLeft);
dropZoneLabel->setPos(topLeft); addItem(topLabel);
addItem(dropZoneLabel); _dropZoneLabels.append(topLabel);
_dropZoneLabels.append(dropZoneLabel);

topLeft = itemPos;
qDebug() << dropZoneLabel->boundingRect(); topLeft.setX(itemPos.x()-itemSpacing);

QGraphicsRectItem *leftLabel = new QGraphicsRectItem(0, 0, itemSpacing, bounds.height());
leftLabel->setPen(pen);
leftLabel->setBrush(brush);
leftLabel->setPos(topLeft);
addItem(leftLabel);
_dropZoneLabels.append(leftLabel);

topLeft = itemPos;
topLeft.setY(itemPos.y()+bounds.height());

QGraphicsRectItem *bottomLabel = new QGraphicsRectItem(0, 0, bounds.width(), itemSpacing);
bottomLabel->setPen(pen);
bottomLabel->setBrush(brush);
bottomLabel->setPos(topLeft);
addItem(bottomLabel);
_dropZoneLabels.append(bottomLabel);

topLeft = itemPos;
topLeft.setX(itemPos.x()+bounds.width());

QGraphicsRectItem *rightLabel = new QGraphicsRectItem(0, 0, itemSpacing, bounds.height());
rightLabel->setPen(pen);
rightLabel->setBrush(brush);
rightLabel->setPos(topLeft);
addItem(rightLabel);
_dropZoneLabels.append(rightLabel);
} }


event->accept(); event->accept();
Expand Down

0 comments on commit 4288ed6

Please sign in to comment.