Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ add_executable(CyberiadaInspector
dialogs/open_file_dialog.h dialogs/open_file_dialog.cpp dialogs/open_file_dialog.ui
dialogs/preferences_dialog.h dialogs/preferences_dialog.cpp dialogs/preferences_dialog.ui
settings_manager.h settings_manager.cpp
temporary_transition.h temporary_transition.cpp

)

target_include_directories(CyberiadaInspector PUBLIC
Expand Down
27 changes: 16 additions & 11 deletions cyberiadasm_editor_comment_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ CyberiadaSMEditorCommentItem::CyberiadaSMEditorCommentItem(QObject *parent_objec
}

body = new EditableTextItem(comment->get_body().c_str(), this);
body->setPos(-boundingRect().width() / 2 + 15, - boundingRect().height() / 2);
// connect(body, EditableTextItem::editingFinished, this, CyberiadaSMEditorCommentItem::onBodyChanged);
body->setPos(-boundingRect().width() / 2 + margin, - boundingRect().height() / 2);
body->setTextAlignment(Qt::AlignLeft);
body->setTextMargin(2 * margin);
connect(body, &EditableTextItem::editingFinished, this, &CyberiadaSMEditorCommentItem::onBodyChanged);

if (element->get_type() == Cyberiada::elementFormalComment) {
int fontId = QFontDatabase::addApplicationFont(":/Fonts/fonts/courier.ttf");
Expand All @@ -72,8 +74,6 @@ CyberiadaSMEditorCommentItem::CyberiadaSMEditorCommentItem(QObject *parent_objec
setAcceptHoverEvents(true);
setFlags(ItemIsSelectable | ItemSendsGeometryChanges);

setTextPosition();

initializeDots();
setDotsPosition();
hideDots();
Expand Down Expand Up @@ -143,22 +143,27 @@ void CyberiadaSMEditorCommentItem::paint(QPainter* painter, const QStyleOptionGr
painter->drawConvexPolygon(triangle, 3);
}

// TODO
void CyberiadaSMEditorCommentItem::onBodyChanged()
void CyberiadaSMEditorCommentItem::updateBody()
{
model->updateCommentBody(model->elementToIndex(element), body->toPlainText());
if (body->toPlainText() != comment->get_body().c_str()) {
body->setPlainText(comment->get_body().c_str());
}
body->updateTextWidth();
body->setPos(-boundingRect().width() / 2 + margin, - boundingRect().height() / 2);
}

void CyberiadaSMEditorCommentItem::setTextPosition()
// TODO
void CyberiadaSMEditorCommentItem::onBodyChanged()
{
QRectF oldRect = boundingRect();
QRectF titleRect = body->boundingRect();
body->setPos(oldRect.x() + (oldRect.width() - titleRect.width()) / 2 , oldRect.y());
model->updateCommentBody(model->elementToIndex(element), body->toPlainText());
}

void CyberiadaSMEditorCommentItem::syncFromModel()
{
// TODO
Cyberiada::Rect model_rect = comment->get_geometry_rect();
setPos(QPointF(model_rect.x, model_rect.y));
updateBody();
CyberiadaSMEditorAbstractItem::syncFromModel();
}

6 changes: 4 additions & 2 deletions cyberiadasm_editor_comment_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,21 @@ class CyberiadaSMEditorCommentItem : public CyberiadaSMEditorAbstractItem //, pu

QRectF boundingRect() const override;

void setTextPosition();

void syncFromModel() override;

protected:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;

private:
void updateBody();

private slots:
void onBodyChanged();

private:
EditableTextItem* body;
QBrush commentBrush;
int margin = 10;

const Cyberiada::Comment* comment;
QMap<Cyberiada::ID, QGraphicsItem*>& elementIdToItemMap;
Expand Down
29 changes: 21 additions & 8 deletions cyberiadasm_editor_scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -562,27 +562,40 @@ void CyberiadaSMEditorScene::addSMItem(Cyberiada::ElementType type)
}
}

CyberiadaSMEditorTransitionItem* CyberiadaSMEditorScene::addTransition(CyberiadaSMEditorAbstractItem *source,
CyberiadaSMEditorAbstractItem *target)
void CyberiadaSMEditorScene::addTransitionFromTempopary(TemporaryTransition* ttrans, bool valid)
{
if (!valid) {
delete ttrans;
return;
}

try {
Cyberiada::Element* element = model->newTransition(currentSM, Cyberiada::transitionExternal,
source->getElement(), target->getElement(),
Cyberiada::Action(Cyberiada::actionTransition));
CyberiadaSMEditorTransitionItem* transition = new CyberiadaSMEditorTransitionItem(
this, model, element, NULL, elementIdToItemMap);
ttrans->getSourceElement(), ttrans->getTargetElement(),
Cyberiada::Action(Cyberiada::actionTransition), Cyberiada::Polyline(),
ttrans->getSourcePoint(), ttrans->getTargetPoint());
delete ttrans;
CyberiadaSMEditorTransitionItem* transition =
new CyberiadaSMEditorTransitionItem(this, model, element, NULL, elementIdToItemMap);
elementIdToItemMap.insert(element->get_id(), transition);
addItem(transition);
transition->setSelected(true);
return transition;
} catch (const Cyberiada::ParametersException& e){
delete ttrans;
QMessageBox::critical(NULL, tr("Create new transition"),
tr("Parameters error:\n") + QString(e.str().c_str()));
// error = true;
return nullptr;
}
}

TemporaryTransition *CyberiadaSMEditorScene::addTemporaryTransition(CyberiadaSMEditorAbstractItem* source, QPointF targetPoint)
{
TemporaryTransition* ttrans = new TemporaryTransition(this, model, NULL, elementIdToItemMap, source, targetPoint);
addItem(ttrans);
connect(ttrans, &TemporaryTransition::signalReady, this, &CyberiadaSMEditorScene::addTransitionFromTempopary);
return ttrans;
}

void CyberiadaSMEditorScene::drawBackground(QPainter* painter, const QRectF &)
{
SettingsManager& sm = SettingsManager::instance();
Expand Down
4 changes: 3 additions & 1 deletion cyberiadasm_editor_scene.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include "cyberiadasm_editor_items.h"
#include "cyberiadasm_editor_state_item.h"
#include "cyberiadasm_editor_transition_item.h"
#include "temporary_transition.h"
#include "cyberiada_constants.h"

class CyberiadaSMEditorScene: public QGraphicsScene {
Expand Down Expand Up @@ -69,7 +70,8 @@ Q_OBJECT
ToolType getCurrentTool() { return currentTool; }

void addSMItem(Cyberiada::ElementType type);
CyberiadaSMEditorTransitionItem* addTransition(CyberiadaSMEditorAbstractItem* source, CyberiadaSMEditorAbstractItem* target);
void addTransitionFromTempopary(TemporaryTransition* ttrans, bool valid);
TemporaryTransition* addTemporaryTransition(CyberiadaSMEditorAbstractItem* source, QPointF targetPoint);

void deleteItemsRecursively(Cyberiada::Element* element);

Expand Down
22 changes: 14 additions & 8 deletions cyberiadasm_editor_state_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ CyberiadaSMEditorStateItem::CyberiadaSMEditorStateItem(QObject *parent_object,

isHighlighted = false;
creatingOfTrans = false;
trans = nullptr;
ttrans = nullptr;

initializeDots();
setDotsPosition();
Expand Down Expand Up @@ -221,6 +221,7 @@ void CyberiadaSMEditorStateItem::setTextPosition()
{
// TODO refactor
QRectF oldRect = rect();
title->updateTextWidth();
QRectF titleRect = title->boundingRect();
title->setPos(oldRect.x() + (oldRect.width() - titleRect.width()) / 2 , oldRect.y());

Expand Down Expand Up @@ -272,6 +273,11 @@ void CyberiadaSMEditorStateItem::syncFromModel()
}
updateRegion();
}
// else {
// if (region != nullptr) {
// // TODO set actions on center (change parent from region to state)
// }
// }

CyberiadaSMEditorAbstractItem* cParent = dynamic_cast<CyberiadaSMEditorAbstractItem*>(parentItem());
if (cParent == nullptr) {
Expand Down Expand Up @@ -493,13 +499,13 @@ void CyberiadaSMEditorStateItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
// TODO create transition
if (creatingOfTrans) {
if (!trans) {
if (!ttrans) {
CyberiadaSMEditorScene* cScene = dynamic_cast<CyberiadaSMEditorScene*>(scene());
if (!cScene) return;
trans = cScene->addTransition(this, this);
trans->setSelected(true);
trans->getDot(1)->setVisible(true);
trans->getDot(1)->grabMouse();
ttrans = cScene->addTemporaryTransition(this, event->pos());
ttrans->setSelected(true);
ttrans->getDot(1)->setVisible(true);
ttrans->getDot(1)->grabMouse();
}
return;
}
Expand All @@ -524,9 +530,9 @@ void CyberiadaSMEditorStateItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
void CyberiadaSMEditorStateItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
// TODO create transition
if (creatingOfTrans && trans) {
if (creatingOfTrans && ttrans) {
creatingOfTrans = false;
trans = nullptr;
ttrans = nullptr;

CyberiadaSMEditorAbstractItem::mouseReleaseEvent(event);
return;
Expand Down
4 changes: 2 additions & 2 deletions cyberiadasm_editor_state_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
#include "dotsignal.h"
#include "editable_text_item.h"
#include "cyberiadasm_editor_items.h"
#include "cyberiadasm_editor_transition_item.h"
#include "temporary_transition.h"

/* -----------------------------------------------------------------------------
* State Item
Expand Down Expand Up @@ -120,7 +120,7 @@ private slots:
std::vector<StateAction*> actions;

bool creatingOfTrans;
CyberiadaSMEditorTransitionItem* trans;
TemporaryTransition* ttrans;

void updateParent(CyberiadaSMEditorAbstractItem* newParent);

Expand Down
61 changes: 41 additions & 20 deletions cyberiadasm_editor_transition_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -510,15 +510,20 @@ void CyberiadaSMEditorTransitionItem::updateAction()
}

void CyberiadaSMEditorTransitionItem::updateActionPosition() {
if (!actionItem) return;

QPointF lastPoint = sourcePoint();
if(transition->has_polyline() && transition->get_geometry_polyline().size() > 0) {
QPointF firstPoint = sourcePoint();
QPointF lastPoint = targetPoint() + targetCenter();
if (isSourceTraking) {
firstPoint = prevPosition;
}
if (source() != target() && transition->has_polyline() && transition->get_geometry_polyline().size() > 0) {
Cyberiada::Polyline polyline = transition->get_geometry_polyline();
Cyberiada::Point lastPolylinePoint = *(std::next(polyline.begin(), polyline.size() - 1));
lastPoint = QPointF(lastPolylinePoint.x, lastPolylinePoint.y);
firstPoint = QPointF(lastPolylinePoint.x, lastPolylinePoint.y);
}
QPointF textPos = (lastPoint + (targetPoint() + targetCenter() - sourceCenter())) / 2 + sourceCenter() - actionItem->boundingRect().center();
if (isTargetTraking) {
lastPoint = prevPosition;
}
QPointF textPos = (firstPoint + (lastPoint - sourceCenter())) / 2 + sourceCenter() - actionItem->boundingRect().center();

actionItem->setPos(textPos);
update();
Expand All @@ -531,9 +536,7 @@ void CyberiadaSMEditorTransitionItem::setActionVisibility(bool visible) {
void CyberiadaSMEditorTransitionItem::syncFromModel()
{
prepareGeometryChange();
if (transition->has_action()) {
updateAction();
}
updateAction();
updateDots();
setDotsPosition();
CyberiadaSMEditorAbstractItem::syncFromModel();
Expand Down Expand Up @@ -591,7 +594,6 @@ void CyberiadaSMEditorTransitionItem::slotMoveDot(QGraphicsItem *signalOwner, qr

// loop
if (cItem == target()) {
qDebug() << "1";
setSource(cItem);
hasIntersections = false;
QPointF newPoint = findIntersectionWithItem(source(), p, sourceCenter(), &hasIntersections) -
Expand All @@ -603,7 +605,6 @@ void CyberiadaSMEditorTransitionItem::slotMoveDot(QGraphicsItem *signalOwner, qr

//
if (cItem == source()) {
qDebug() << "2";
hasIntersections = false;
QPointF newPoint = findIntersectionWithItem(source(), p, nextPoint, &hasIntersections) -
sourceCenter();
Expand All @@ -618,14 +619,11 @@ void CyberiadaSMEditorTransitionItem::slotMoveDot(QGraphicsItem *signalOwner, qr
cItem->sceneBoundingRect().center();
// intersectoin with item under cursor
if (hasIntersections) {
qDebug() << "3";
isSourceTraking = false;
setSource(cItem);
setSourcePoint(newPoint);
return;
}

qDebug() << "3.5";
return;
}
bool hasIntersections = false;
Expand All @@ -640,16 +638,14 @@ void CyberiadaSMEditorTransitionItem::slotMoveDot(QGraphicsItem *signalOwner, qr
// intersection with source in adjusted bounding rect
if (hasIntersections) {
isSourceTraking = false;
qDebug() << "4" << isSourceTraking << isTargetTraking;
setSourcePoint(newPoint);
return;
}

qDebug() << "5";

// mouse traking
isSourceTraking = true;
setDotsPosition();
updateActionPosition();
break;
}
// last point
Expand Down Expand Up @@ -715,6 +711,7 @@ void CyberiadaSMEditorTransitionItem::slotMoveDot(QGraphicsItem *signalOwner, qr

isTargetTraking = true;
setDotsPosition();
updateActionPosition();
break;
}

Expand All @@ -732,8 +729,15 @@ void CyberiadaSMEditorTransitionItem::slotMoveDot(QGraphicsItem *signalOwner, qr

void CyberiadaSMEditorTransitionItem::slotMouseReleaseDot()
{
isSourceTraking = false;
isTargetTraking = false;
if (isSourceTraking || isTargetTraking) {
isSourceTraking = false;
isTargetTraking = false;
prepareGeometryChange();
updateActionPosition();
}
if (source() == target() && transition->has_polyline() && transition->get_geometry_polyline().size() > 0) {
model->updateGeometry(model->elementToIndex(element), Cyberiada::Polyline());
}
}

void CyberiadaSMEditorTransitionItem::slotDeleteDot(QGraphicsItem *signalOwner)
Expand All @@ -759,6 +763,15 @@ void CyberiadaSMEditorTransitionItem::slotDeleteDot(QGraphicsItem *signalOwner)

void CyberiadaSMEditorTransitionItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
if (!SettingsManager::instance().getPolylineMode()) {
if (actionText().isEmpty()) {
actionItem->setTextInteractionFlags(Qt::TextEditorInteraction);
actionItem->setFocus(Qt::MouseFocusReason);
}
QGraphicsItem::mouseDoubleClickEvent(event);
return;
}

if (source() == target()) { return; }

QPointF clickPos = event->pos();
Expand Down Expand Up @@ -972,12 +985,20 @@ void CyberiadaSMEditorTransitionItem::hideDots()

void CyberiadaSMEditorTransitionItem::setDotsPosition()
{
QPainterPath linePath = path();
if (isSourceTraking) {
listDots.first()->setPos(prevPosition);
return;
}
if (isTargetTraking) {
listDots.last()->setPos(prevPosition);
return;
}
if (source() == target()) {
listDots.at(0)->setPos(sourcePoint() + sourceCenter());
listDots.at(1)->setPos(targetPoint() + targetCenter());
return;
}
QPainterPath linePath = path();
for(int i = 0; i < linePath.elementCount(); i++) {
QPointF point = linePath.elementAt(i);
listDots.at(i)->setPos(point);
Expand Down
2 changes: 1 addition & 1 deletion cyberiadasm_editor_transition_item.h
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ private slots:

const Cyberiada::Transition* transition;

TransitionAction *actionItem = nullptr;
TransitionAction *actionItem;
QPointF textPosition;

QPointF prevPosition;
Expand Down
Loading