diff --git a/Valentina.pro b/Valentina.pro
index 98eeaa0e4..2dd2a5464 100644
--- a/Valentina.pro
+++ b/Valentina.pro
@@ -28,7 +28,10 @@ SOURCES += main.cpp\
widgets/delegate.cpp \
widgets/doubledelegate.cpp \
dialogs/dialogendline.cpp \
- tools/vtoolendline.cpp
+ tools/vtoolendline.cpp \
+ tools/vtoolline.cpp \
+ tools/vabstracttool.cpp \
+ dialogs/dialogline.cpp
HEADERS += mainwindow.h \
widgets/vmaingraphicsscene.h \
@@ -47,12 +50,16 @@ HEADERS += mainwindow.h \
widgets/delegate.h \
widgets/doubledelegate.h \
dialogs/dialogendline.h \
- tools/vtoolendline.h
+ tools/vtoolendline.h \
+ tools/vtoolline.h \
+ tools/vabstracttool.h \
+ dialogs/dialogline.h
FORMS += mainwindow.ui \
dialogs/dialogsinglepoint.ui \
dialogs/dialogincrements.ui \
- dialogs/dialogendline.ui
+ dialogs/dialogendline.ui \
+ dialogs/dialogline.ui
RESOURCES += \
icon.qrc \
diff --git a/cursor.qrc b/cursor.qrc
index faa2ed138..eda5c9def 100644
--- a/cursor.qrc
+++ b/cursor.qrc
@@ -2,5 +2,6 @@
cursor/spoint_cursor.png
cursor/endline_cursor.png
+ cursor/line_cursor.png
diff --git a/cursor/line_cursor.png b/cursor/line_cursor.png
new file mode 100644
index 000000000..fb75b237a
Binary files /dev/null and b/cursor/line_cursor.png differ
diff --git a/dialogs/dialogline.cpp b/dialogs/dialogline.cpp
new file mode 100644
index 000000000..db8f7ab3b
--- /dev/null
+++ b/dialogs/dialogline.cpp
@@ -0,0 +1,110 @@
+#include "dialogline.h"
+#include "ui_dialogline.h"
+#include
+#include
+
+DialogLine::DialogLine(const VContainer *data, QWidget *parent) :
+ QDialog(parent), ui(new Ui::DialogLine)
+{
+ ui->setupUi(this);
+ this->data = data;
+ QPushButton *bOk = ui->buttonBox->button(QDialogButtonBox::Ok);
+ connect(bOk, &QPushButton::clicked, this, &DialogLine::DialogAccepted);
+ FillComboBox(ui->comboBoxFirstPoint);
+ FillComboBox(ui->comboBoxSecondPoint);
+ number = 0;
+}
+
+DialogLine::~DialogLine(){
+ delete ui;
+}
+
+qint64 DialogLine::getSecondPoint() const{
+ return secondPoint;
+}
+
+void DialogLine::setSecondPoint(const qint64 &value){
+ secondPoint = value;
+ VPointF point = data->GetPoint(value);
+ qint32 index = ui->comboBoxSecondPoint->findText(point.name());
+ if(index != -1){
+ ui->comboBoxSecondPoint->setCurrentIndex(index);
+ }
+}
+
+qint64 DialogLine::getFirstPoint() const{
+ return firstPoint;
+}
+
+void DialogLine::setFirstPoint(const qint64 &value){
+ firstPoint = value;
+ VPointF point = data->GetPoint(value);
+ qint32 index = ui->comboBoxFirstPoint->findText(point.name());
+ if(index != -1){
+ ui->comboBoxFirstPoint->setCurrentIndex(index);
+ }
+}
+
+void DialogLine::closeEvent(QCloseEvent *event){
+ DialogClosed(QDialog::Rejected);
+ event->accept();
+}
+
+void DialogLine::showEvent(QShowEvent *event){
+ QDialog::showEvent( event );
+ if( event->spontaneous() ){
+ return;
+ }
+
+ if(isInitialized){
+ return;
+ }
+
+ // do your init stuff here
+
+ isInitialized = true;//перший показ вікна вже відбувся
+}
+
+
+void DialogLine::DialogAccepted(){
+ qint32 index = ui->comboBoxFirstPoint->currentIndex();
+ firstPoint = qvariant_cast(ui->comboBoxFirstPoint->itemData(index));
+ index = ui->comboBoxSecondPoint->currentIndex();
+ secondPoint = qvariant_cast(ui->comboBoxSecondPoint->itemData(index));
+ DialogClosed(QDialog::Accepted);
+}
+
+void DialogLine::FillComboBox(QComboBox *box){
+ const QMap *points = data->DataPoints();
+ QMapIterator i(*points);
+ while (i.hasNext()) {
+ i.next();
+ VPointF point = i.value();
+ box->addItem(point.name(), i.key());
+ }
+}
+
+
+void DialogLine::ChoosedPoint(qint64 id, Scene::Type type){
+ if(type == Scene::Point){
+ VPointF point = data->GetPoint(id);
+ if(number == 0){
+ qint32 index = ui->comboBoxFirstPoint->findText(point.name());
+ if ( index != -1 ) { // -1 for not found
+ ui->comboBoxFirstPoint->setCurrentIndex(index);
+ number++;
+ return;
+ }
+ }
+ if(number == 1){
+ qint32 index = ui->comboBoxSecondPoint->findText(point.name());
+ if ( index != -1 ) { // -1 for not found
+ ui->comboBoxSecondPoint->setCurrentIndex(index);
+ number = 0;
+ }
+ if(!isInitialized){
+ this->show();
+ }
+ }
+ }
+}
diff --git a/dialogs/dialogline.h b/dialogs/dialogline.h
new file mode 100644
index 000000000..470c33ed1
--- /dev/null
+++ b/dialogs/dialogline.h
@@ -0,0 +1,44 @@
+#ifndef DIALOGLINE_H
+#define DIALOGLINE_H
+
+#include
+#include "../container/vcontainer.h"
+#include "../options.h"
+#include
+
+namespace Ui {
+class DialogLine;
+}
+
+class DialogLine : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit DialogLine(const VContainer *data, QWidget *parent = 0);
+ ~DialogLine();
+
+ qint64 getFirstPoint() const;
+ void setFirstPoint(const qint64 &value);
+
+ qint64 getSecondPoint() const;
+ void setSecondPoint(const qint64 &value);
+signals:
+ void DialogClosed(int result);
+public slots:
+ void ChoosedPoint(qint64 id, Scene::Type type);
+ void DialogAccepted();
+protected:
+ void closeEvent ( QCloseEvent * event );
+ void showEvent( QShowEvent *event );
+private:
+ Ui::DialogLine *ui;
+ const VContainer *data;
+ qint32 number;
+ qint64 firstPoint;
+ qint64 secondPoint;
+ bool isInitialized;
+ void FillComboBox(QComboBox *box);
+};
+
+#endif // DIALOGLINE_H
diff --git a/dialogs/dialogline.ui b/dialogs/dialogline.ui
new file mode 100644
index 000000000..7b049d23e
--- /dev/null
+++ b/dialogs/dialogline.ui
@@ -0,0 +1,92 @@
+
+
+ DialogLine
+
+
+
+ 0
+ 0
+ 217
+ 137
+
+
+
+ Dialog
+
+
+ -
+
+
-
+
+
+ Перша точка
+
+
+
+ -
+
+
+
+
+ -
+
+
-
+
+
+ Друга точка
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+
+
+
+
+
+ buttonBox
+ accepted()
+ DialogLine
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ DialogLine
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/icon.qrc b/icon.qrc
index 83f15dfdf..e5c34325d 100644
--- a/icon.qrc
+++ b/icon.qrc
@@ -19,5 +19,6 @@
icon/24x24/arrowLeft.png
icon/24x24/equal.png
icon/32x32/segment.png
+ icon/32x32/line.png
diff --git a/icon/32x32/line.png b/icon/32x32/line.png
new file mode 100644
index 000000000..ddf0a9772
Binary files /dev/null and b/icon/32x32/line.png differ
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 36d958703..1d7e17920 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -12,6 +12,7 @@
#include "options.h"
#include "tools/vtoolendline.h"
+#include "tools/vtoolline.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
@@ -43,6 +44,8 @@ MainWindow::MainWindow(QWidget *parent) :
connect(ui->actionTable, &QAction::triggered, this, &MainWindow::ActionTable);
connect(ui->toolButtonEndLine, &QToolButton::clicked, this,
&MainWindow::ToolEndLine);
+ connect(ui->toolButtonLine, &QToolButton::clicked, this,
+ &MainWindow::ToolLine);
data = new VContainer;
CreateManTableIGroup ();
@@ -201,6 +204,36 @@ void MainWindow::ClosedDialogEndLine(int result){
ArrowTool();
}
+void MainWindow::ToolLine(bool checked){
+ if(checked){
+ CanselTool();
+ tool = Tools::LineTool;
+ QPixmap pixmap(":/cursor/line_cursor.png");
+ QCursor cur(pixmap, 2, 3);
+ ui->graphicsView->setCursor(cur);
+ helpLabel->setText("Виберіть точки.");
+ dialogLine = new DialogLine(data, this);
+ connect(scene, &VMainGraphicsScene::ChoosedObject, dialogLine, &DialogLine::ChoosedPoint);
+ connect(dialogLine, &DialogLine::DialogClosed, this, &MainWindow::ClosedDialogLine);
+ } else {
+ ui->toolButtonLine->setChecked(true);
+ }
+}
+
+void MainWindow::ClosedDialogLine(int result){
+ if(result == QDialog::Accepted){
+ qint64 firstPoint = dialogLine->getFirstPoint();
+ qint64 secondPoint = dialogLine->getSecondPoint();
+
+ qint64 id = data->getNextId();
+ VToolLine *line = new VToolLine(doc, data, id, firstPoint, secondPoint, Tool::FromGui);
+ scene->addItem(line);
+ connect(line, &VToolLine::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem);
+
+ }
+ ArrowTool();
+}
+
void MainWindow::showEvent( QShowEvent *event ){
QMainWindow::showEvent( event );
if( event->spontaneous() ){
@@ -314,6 +347,11 @@ void MainWindow::CanselTool(){
ui->toolButtonEndLine->setChecked(false);
scene->clearSelection();
break;
+ case Tools::LineTool:
+ delete dialogLine;
+ ui->toolButtonLine->setChecked(false);
+ scene->clearFocus();
+ break;
}
}
@@ -576,6 +614,7 @@ void MainWindow::closeEvent ( QCloseEvent * event ){
void MainWindow::SetEnableTool(bool enable){
ui->toolButtonEndLine->setEnabled(enable);
+ ui->toolButtonLine->setEnabled(enable);
}
MainWindow::~MainWindow(){
diff --git a/mainwindow.h b/mainwindow.h
index 14a6ec2de..1702fb86c 100644
--- a/mainwindow.h
+++ b/mainwindow.h
@@ -9,6 +9,7 @@
#include "widgets/vmaingraphicsscene.h"
#include "dialogs/dialogsinglepoint.h"
#include "dialogs/dialogincrements.h"
+#include "dialogs/dialogline.h"
#include "tools/vtoolsimplepoint.h"
#include "xml/vdomdocument.h"
#include "container/vcontainer.h"
@@ -23,7 +24,8 @@ namespace Tools{
{
ArrowTool,
SinglePointTool,
- EndLineTool
+ EndLineTool,
+ LineTool
};
}
@@ -55,6 +57,8 @@ public slots:
void ClosedActionTable();
void ToolEndLine(bool checked);
void ClosedDialogEndLine(int result);
+ void ToolLine(bool checked);
+ void ClosedDialogLine(int result);
protected:
virtual void keyPressEvent ( QKeyEvent * event );
virtual void showEvent( QShowEvent *event );
@@ -69,6 +73,7 @@ private:
DialogSinglePoint *dialogSinglePoint;
DialogIncrements *dialogTable;
DialogEndLine *dialogEndLine;
+ DialogLine *dialogLine;
VDomDocument *doc;
VContainer *data;
QComboBox *comboBoxDraws;
diff --git a/mainwindow.ui b/mainwindow.ui
index af4b2be80..81db520a6 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -57,7 +57,7 @@
- 0
+ 1
@@ -159,7 +159,7 @@
0
0
154
- 111
+ 50
@@ -173,33 +173,26 @@
-
-
-
- PushButton
+
+
+ false
-
- buttonGroup_2
-
-
-
- -
-
- PushButton
+ ...
-
- buttonGroup_2
-
-
-
- -
-
-
- PushButton
+
+
+ :/icon/32x32/line.png:/icon/32x32/line.png
+
+
+
+ 24
+ 24
+
+
+
+ true
-
- buttonGroup_2
-
diff --git a/tools/vabstracttool.cpp b/tools/vabstracttool.cpp
new file mode 100644
index 000000000..1b3fd8340
--- /dev/null
+++ b/tools/vabstracttool.cpp
@@ -0,0 +1,62 @@
+#include "vabstracttool.h"
+
+VAbstractTool::VAbstractTool(VDomDocument *doc, VContainer *data, qint64 id){
+ this->doc = doc;
+ this->data = data;
+ this->id = id;
+ nameActivDraw = doc->GetNameActivDraw();
+ ignoreContextMenuEvent = false;//don't ignore context menu events;
+
+ connect(this->doc, &VDomDocument::ChangedActivDraw, this, &VAbstractTool::ChangedActivDraw);
+ connect(this->doc, &VDomDocument::ChangedNameDraw, this, &VAbstractTool::ChangedNameDraw);
+ connect(this, &VAbstractTool::haveLiteChange, this->doc, &VDomDocument::haveLiteChange);
+ connect(this->doc, &VDomDocument::FullUpdateFromFile, this, &VAbstractTool::FullUpdateFromFile);
+}
+
+void VAbstractTool::ChangedNameDraw(const QString oldName, const QString newName){
+ if(nameActivDraw == oldName){
+ nameActivDraw = newName;
+ }
+}
+
+void VAbstractTool::ChangedActivDraw(const QString newName){
+ if(nameActivDraw == newName){
+ ignoreContextMenuEvent = false;
+ } else {
+ ignoreContextMenuEvent = true;
+ }
+}
+
+void VAbstractTool::AddAttribute(QDomElement &domElement, const QString &name, const qint64 &value){
+ QDomAttr domAttr = doc->createAttribute(name);
+ domAttr.setValue(QString().setNum(value));
+ domElement.setAttributeNode(domAttr);
+}
+
+void VAbstractTool::AddAttribute(QDomElement &domElement, const QString &name, const qint32 &value){
+ QDomAttr domAttr = doc->createAttribute(name);
+ domAttr.setValue(QString().setNum(value));
+ domElement.setAttributeNode(domAttr);
+}
+
+void VAbstractTool::AddAttribute(QDomElement &domElement, const QString &name, const qreal &value){
+ QDomAttr domAttr = doc->createAttribute(name);
+ domAttr.setValue(QString().setNum(value));
+ domElement.setAttributeNode(domAttr);
+}
+
+void VAbstractTool::AddAttribute(QDomElement &domElement, const QString &name, const QString &value){
+ QDomAttr domAttr = doc->createAttribute(name);
+ domAttr.setValue(value);
+ domElement.setAttributeNode(domAttr);
+}
+
+VAbstractTool::~VAbstractTool(){
+}
+
+QString VAbstractTool::GetNameLine(qint64 firstPoint, qint64 secondPoint) const{
+ VPointF first = data->GetPoint(firstPoint);
+ VPointF second = data->GetPoint(secondPoint);
+ QString name = QString("Line_%1_%2").arg(first.name(), second.name());
+ return name;
+}
diff --git a/tools/vabstracttool.h b/tools/vabstracttool.h
new file mode 100644
index 000000000..1eb4615e8
--- /dev/null
+++ b/tools/vabstracttool.h
@@ -0,0 +1,44 @@
+#ifndef VABSTRACTTOOL_H
+#define VABSTRACTTOOL_H
+
+#include
+
+#include "../container/vcontainer.h"
+#include "../xml/vdomdocument.h"
+
+namespace Tool{
+ enum Enum
+ {
+ FromGui,
+ FromFile
+ };
+}
+
+class VAbstractTool:public QObject
+{
+ Q_OBJECT
+public:
+ VAbstractTool(VDomDocument *doc, VContainer *data, qint64 id);
+ virtual ~VAbstractTool();
+public slots:
+ virtual void FullUpdateFromFile()=0;
+ void ChangedNameDraw(const QString oldName, const QString newName);
+ virtual void ChangedActivDraw(const QString newName);
+signals:
+ void haveLiteChange();
+ void ChoosedPoint(qint64 id, Scene::Type type);
+ void FullUpdateTree();
+protected:
+ VDomDocument *doc;
+ VContainer *data;
+ qint64 id;
+ bool ignoreContextMenuEvent;
+ QString nameActivDraw;
+ virtual void AddToFile()=0;
+ void AddAttribute(QDomElement &domElement, const QString &name, const qint64 &value);
+ void AddAttribute(QDomElement &domElement, const QString &name, const qint32 &value);
+ void AddAttribute(QDomElement &domElement, const QString &name, const qreal &value);
+ void AddAttribute(QDomElement &domElement, const QString &name, const QString &value);
+ QString GetNameLine(qint64 firstPoint, qint64 secondPoint) const;
+};
+#endif // VABSTRACTTOOL_H
diff --git a/tools/vtoolendline.cpp b/tools/vtoolendline.cpp
index add4001c9..6b6245692 100644
--- a/tools/vtoolendline.cpp
+++ b/tools/vtoolendline.cpp
@@ -8,7 +8,6 @@ VToolEndLine::VToolEndLine(VDomDocument *doc, VContainer *data, const qint64 &id
const QString &typeLine, const QString &formula, const qint32 &angle,
const qint64 &basePointId, Tool::Enum typeCreation,
QGraphicsItem *parent):VToolPoint(doc, data, id, parent){
- ignoreContextMenuEvent = false;//don't ignore context menu events;
connect(this, &VToolEndLine::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree);
this->typeLine = typeLine;
this->formula = formula;
@@ -48,14 +47,14 @@ void VToolEndLine::FullUpdateFromFile(){
basePointId = domElement.attribute("basePoint", "").toLongLong();
angle = domElement.attribute("angle", "").toInt();
}
- VPointF point = data->GetPoint(id);
+ VPointF point = VAbstractTool::data->GetPoint(id);
RefreshBaseGeometry(name, point.x(), point.y(), mx, my);
- VPointF basePoint = data->GetPoint(basePointId);
+ VPointF basePoint = VAbstractTool::data->GetPoint(basePointId);
mainLine->setLine(QLineF(basePoint.toQPointF(), point.toQPointF()));
QString nameLine = GetNameLine(basePointId, id);
QLineF line = QLineF(basePoint.toQPointF(), point.toQPointF());
- data->AddLine(nameLine, line.length());
+ VAbstractTool::data->AddLine(nameLine, line.length());
}
void VToolEndLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){
@@ -64,14 +63,14 @@ void VToolEndLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){
QAction *actionOption = menu.addAction("Властивості");
QAction *selectedAction = menu.exec(event->screenPos());
if(selectedAction == actionOption){
- dialogEndLine = QSharedPointer(new DialogEndLine(data));
+ dialogEndLine = QSharedPointer(new DialogEndLine(VAbstractTool::data));
connect(qobject_cast< VMainGraphicsScene * >(this->scene()), &VMainGraphicsScene::ChoosedObject,
dialogEndLine.data(), &DialogEndLine::ChoosedPoint);
connect(dialogEndLine.data(), &DialogEndLine::DialogClosed, this, &VToolEndLine::ClosedDialogEndLine);
connect(doc, &VDomDocument::FullUpdateFromFile, dialogEndLine.data(), &DialogEndLine::UpdateList);
- VPointF p = data->GetPoint(id);
+ VPointF p = VAbstractTool::data->GetPoint(id);
dialogEndLine->setTypeLine(typeLine);
dialogEndLine->setFormula(formula);
@@ -92,9 +91,9 @@ void VToolEndLine::ClosedDialogEndLine(int result){
qint32 angle = dialogEndLine->getAngle();
qint64 basePointId = dialogEndLine->getBasePointId();
- VPointF basePoint = data->GetPoint(basePointId);
+ VPointF basePoint = VAbstractTool::data->GetPoint(basePointId);
QLineF line = QLineF(basePoint.toQPointF(), QPointF(basePoint.x()+100, basePoint.y()));
- Calculator cal(data);
+ Calculator cal(VAbstractTool::data);
QString errorMsg;
qreal result = cal.eval(formula, &errorMsg);
if(errorMsg.isEmpty()){
@@ -108,8 +107,18 @@ void VToolEndLine::ClosedDialogEndLine(int result){
dialogEndLine.clear();
}
+void VToolEndLine::ChangedActivDraw(const QString newName){
+ if(nameActivDraw == newName){
+ mainLine->setPen(QPen(Qt::black, widthHairLine));
+ VToolPoint::ChangedActivDraw(newName);
+ } else {
+ mainLine->setPen(QPen(Qt::gray, widthHairLine));
+ VToolPoint::ChangedActivDraw(newName);
+ }
+}
+
void VToolEndLine::AddToFile(){
- VPointF point = data->GetPoint(id);
+ VPointF point = VAbstractTool::data->GetPoint(id);
QDomElement domElement = doc->createElement("point");
AddAttribute(domElement, "id", id);
diff --git a/tools/vtoolendline.h b/tools/vtoolendline.h
index 322b692d3..97c4dd2cc 100644
--- a/tools/vtoolendline.h
+++ b/tools/vtoolendline.h
@@ -17,6 +17,7 @@ public:
public slots:
virtual void FullUpdateFromFile();
void ClosedDialogEndLine(int result);
+ virtual void ChangedActivDraw(const QString newName);
protected:
virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event );
virtual void AddToFile();
diff --git a/tools/vtoolline.cpp b/tools/vtoolline.cpp
new file mode 100644
index 000000000..92fe893b0
--- /dev/null
+++ b/tools/vtoolline.cpp
@@ -0,0 +1,106 @@
+#include "vtoolline.h"
+#include
+#include
+
+VToolLine::VToolLine(VDomDocument *doc, VContainer *data, qint64 id, qint64 firstPoint, qint64 secondPoint,
+ Tool::Enum typeCreation):VAbstractTool(doc, data, id){
+ connect(this, &VToolLine::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree);
+ this->firstPoint = firstPoint;
+ this->secondPoint = secondPoint;
+
+ //Лінія
+ VPointF first = data->GetPoint(firstPoint);
+ VPointF second = data->GetPoint(secondPoint);
+ this->setLine(QLineF(first.toQPointF(), second.toQPointF()));
+ this->setFlag(QGraphicsItem::ItemStacksBehindParent, true);
+ this->setFlag(QGraphicsItem::ItemIsSelectable, true);
+
+ QString nameLine = GetNameLine(firstPoint, secondPoint);
+ data->AddLine(nameLine, QLineF(first.toQPointF(), second.toQPointF()).length());
+
+ if(typeCreation == Tool::FromGui){
+ AddToFile();
+ }
+}
+
+void VToolLine::FullUpdateFromFile(){
+ QDomElement domElement = doc->elementById(QString().setNum(id));
+ if(domElement.isElement()){
+ firstPoint = domElement.attribute("firstPoint", "").toLongLong();
+ secondPoint = domElement.attribute("secondPoint", "").toLongLong();
+ }
+ VPointF first = VAbstractTool::data->GetPoint(firstPoint);
+ VPointF second = VAbstractTool::data->GetPoint(secondPoint);
+ this->setLine(QLineF(first.toQPointF(), second.toQPointF()));
+ QString nameLine = GetNameLine(firstPoint, secondPoint);
+ VAbstractTool::data->AddLine(nameLine, QLineF(first.toQPointF(), second.toQPointF()).length());
+}
+
+void VToolLine::ClosedDialogLine(int result){
+ if(result == QDialog::Accepted){
+ qint64 firstPoint = dialogLine->getFirstPoint();
+ qint64 secondPoint = dialogLine->getSecondPoint();
+ FullUpdateFromGui(firstPoint, secondPoint);
+ }
+ dialogLine.clear();
+}
+
+void VToolLine::ChangedActivDraw(const QString newName){
+ if(nameActivDraw == newName){
+ this->setPen(QPen(Qt::black, widthHairLine));
+ VAbstractTool::ChangedActivDraw(newName);
+ } else {
+ this->setPen(QPen(Qt::gray, widthHairLine));
+ VAbstractTool::ChangedActivDraw(newName);
+ }
+}
+
+void VToolLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){
+ if(!ignoreContextMenuEvent){
+ QMenu menu;
+ QAction *actionOption = menu.addAction("Властивості");
+ QAction *selectedAction = menu.exec(event->screenPos());
+ if(selectedAction == actionOption){
+ dialogLine = QSharedPointer(new DialogLine(VAbstractTool::data));
+
+ connect(qobject_cast< VMainGraphicsScene * >(this->scene()), &VMainGraphicsScene::ChoosedObject,
+ dialogLine.data(), &DialogLine::ChoosedPoint);
+ connect(dialogLine.data(), &DialogLine::DialogClosed, this, &VToolLine::ClosedDialogLine);
+
+ dialogLine->setFirstPoint(firstPoint);
+ dialogLine->setSecondPoint(secondPoint);
+
+ dialogLine->show();
+ }
+ }
+}
+
+
+void VToolLine::AddToFile(){
+ QDomElement domElement = doc->createElement("line");
+
+ AddAttribute(domElement, "id", id);
+
+ AddAttribute(domElement, "firstPoint", firstPoint);
+ AddAttribute(domElement, "secondPoint", secondPoint);
+
+ QDomElement calcElement;
+ bool ok = doc->GetActivCalculationElement(calcElement);
+ if(ok){
+ calcElement.appendChild(domElement);
+ } else {
+ qCritical()<<"Не можу знайти тег калькуляції."<< Q_FUNC_INFO;
+ }
+}
+
+void VToolLine::FullUpdateFromGui(qint64 firstPoint, qint64 secondPoint){
+ QDomElement domElement = doc->elementById(QString().setNum(id));
+ if(domElement.isElement()){
+ this->firstPoint = firstPoint;
+ this->secondPoint = secondPoint;
+
+ domElement.setAttribute("firstPoint", QString().setNum(firstPoint));
+ domElement.setAttribute("secondPoint", QString().setNum(secondPoint));
+ emit FullUpdateTree();
+ }
+}
diff --git a/tools/vtoolline.h b/tools/vtoolline.h
new file mode 100644
index 000000000..f2dcf8131
--- /dev/null
+++ b/tools/vtoolline.h
@@ -0,0 +1,28 @@
+#ifndef VTOOLLINE_H
+#define VTOOLLINE_H
+
+#include "vabstracttool.h"
+#include "QGraphicsLineItem"
+#include "../dialogs/dialogline.h"
+
+class VToolLine: public VAbstractTool, public QGraphicsLineItem
+{
+ Q_OBJECT
+public:
+ VToolLine(VDomDocument *doc, VContainer *data, qint64 id, qint64 firstPoint, qint64 secondPoint,
+ Tool::Enum typeCreation);
+public slots:
+ virtual void FullUpdateFromFile();
+ void ClosedDialogLine(int result);
+ virtual void ChangedActivDraw(const QString newName);
+protected:
+ virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event );
+ virtual void AddToFile();
+private:
+ qint64 firstPoint;
+ qint64 secondPoint;
+ QSharedPointer dialogLine;
+ void FullUpdateFromGui(qint64 firstPoint, qint64 secondPoint);
+};
+
+#endif // VTOOLLINE_H
diff --git a/tools/vtoolpoint.cpp b/tools/vtoolpoint.cpp
index d0028e4e2..2488bca86 100644
--- a/tools/vtoolpoint.cpp
+++ b/tools/vtoolpoint.cpp
@@ -9,12 +9,8 @@
#include "../widgets/vmaingraphicsscene.h"
VToolPoint::VToolPoint(VDomDocument *doc, VContainer *data, qint64 id,
- QGraphicsItem *parent):QGraphicsEllipseItem(parent){
- this->doc = doc;
- this->data = data;
+ QGraphicsItem *parent):VAbstractTool(doc, data, id), QGraphicsEllipseItem(parent){
radius = 1.5*PrintDPI/25.4;
- this->id = id;
- nameActivDraw = doc->GetNameActivDraw();
//create circle
VPointF point = data->GetPoint(id);
QRectF rec = QRectF(point.x(), point.y(), radius*2, radius*2);
@@ -36,28 +32,23 @@ VToolPoint::VToolPoint(VDomDocument *doc, VContainer *data, qint64 id,
QPointF p1, p2;
LineIntersectCircle(rec.center(), radius, QLineF(rec.center(), nameRec.center()), p1, p2);
QPointF pRec = LineIntersectRect(nameRec, QLineF(rec.center(), nameRec.center()));
- line = new QGraphicsLineItem(QLineF(p1, pRec), this);
- line->setFlag(QGraphicsItem::ItemStacksBehindParent, true);
+ lineName = new QGraphicsLineItem(QLineF(p1, pRec), this);
+ lineName->setFlag(QGraphicsItem::ItemStacksBehindParent, true);
if(QLineF(p1, pRec).length() <= 4*PrintDPI/25.4){
- line->setVisible(false);
+ lineName->setVisible(false);
} else {
- line->setVisible(true);
+ lineName->setVisible(true);
}
-
- connect(this->doc, &VDomDocument::ChangedActivDraw, this, &VToolPoint::ChangedActivDraw);
- connect(this->doc, &VDomDocument::ChangedNameDraw, this, &VToolPoint::ChangedNameDraw);
- connect(this, &VToolPoint::haveLiteChange, this->doc, &VDomDocument::haveLiteChange);
- connect(this->doc, &VDomDocument::FullUpdateFromFile, this, &VToolPoint::FullUpdateFromFile);
}
void VToolPoint::NameChangePosition(const QPointF pos){
- VPointF point = data->GetPoint(id);
+ VPointF point = VAbstractTool::data->GetPoint(id);
QRectF rec = this->rect();
point.setMx(pos.x() - rec.center().x());
point.setMy(pos.y() - rec.center().y());
RefreshLine();
LiteUpdateFromGui(point.mx(), point.my());
- data->UpdatePoint(id, point);
+ VAbstractTool::data->UpdatePoint(id, point);
}
/*
@@ -150,11 +141,11 @@ void VToolPoint::RefreshLine(){
QRectF rec = this->rect();
LineIntersectCircle(rec.center(), radius, QLineF(rec.center(), nameRec.center()), p1, p2);
QPointF pRec = LineIntersectRect(nameRec, QLineF(rec.center(), nameRec.center()));
- line->setLine(QLineF(p1, pRec));
+ lineName->setLine(QLineF(p1, pRec));
if(QLineF(p1, pRec).length() <= 4*PrintDPI/25.4){
- line->setVisible(false);
+ lineName->setVisible(false);
} else {
- line->setVisible(true);
+ lineName->setVisible(true);
}
}
@@ -167,12 +158,6 @@ void VToolPoint::LiteUpdateFromGui(qreal mx, qreal my){
}
}
-void VToolPoint::ChangedNameDraw(const QString oldName, const QString newName){
- if(nameActivDraw == oldName){
- nameActivDraw = newName;
- }
-}
-
void VToolPoint::ChangedActivDraw(const QString newName){
if(nameActivDraw == newName){
this->setPen(QPen(Qt::black, widthHairLine));
@@ -181,8 +166,8 @@ void VToolPoint::ChangedActivDraw(const QString newName){
namePoint->setFlag(QGraphicsItem::ItemIsSelectable, true);
namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
namePoint->setBrush(QBrush(Qt::black));
- line->setPen(QPen(Qt::black, widthHairLine));
- ignoreContextMenuEvent = false;
+ lineName->setPen(QPen(Qt::black, widthHairLine));
+ VAbstractTool::ChangedActivDraw(newName);
} else {
this->setPen(QPen(Qt::gray, widthHairLine));
this->setFlag(QGraphicsItem::ItemIsSelectable, false);
@@ -190,8 +175,8 @@ void VToolPoint::ChangedActivDraw(const QString newName){
namePoint->setFlag(QGraphicsItem::ItemIsSelectable, false);
namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, false);
namePoint->setBrush(QBrush(Qt::gray));
- line->setPen(QPen(Qt::gray, widthHairLine));
- ignoreContextMenuEvent = true;
+ lineName->setPen(QPen(Qt::gray, widthHairLine));
+ VAbstractTool::ChangedActivDraw(newName);
}
}
@@ -202,30 +187,6 @@ void VToolPoint::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event ){
QGraphicsItem::mouseReleaseEvent(event);
}
-void VToolPoint::AddAttribute(QDomElement &domElement, const QString &name, const qint64 &value){
- QDomAttr domAttr = doc->createAttribute(name);
- domAttr.setValue(QString().setNum(value));
- domElement.setAttributeNode(domAttr);
-}
-
-void VToolPoint::AddAttribute(QDomElement &domElement, const QString &name, const qint32 &value){
- QDomAttr domAttr = doc->createAttribute(name);
- domAttr.setValue(QString().setNum(value));
- domElement.setAttributeNode(domAttr);
-}
-
-void VToolPoint::AddAttribute(QDomElement &domElement, const QString &name, const qreal &value){
- QDomAttr domAttr = doc->createAttribute(name);
- domAttr.setValue(QString().setNum(value));
- domElement.setAttributeNode(domAttr);
-}
-
-void VToolPoint::AddAttribute(QDomElement &domElement, const QString &name, const QString &value){
- QDomAttr domAttr = doc->createAttribute(name);
- domAttr.setValue(value);
- domElement.setAttributeNode(domAttr);
-}
-
void VToolPoint::RefreshBaseGeometry(const QString &name, const qreal &x, const qreal &y, const qreal &mx,
const qreal &my){
QRectF rec = QRectF(x, y, radius*2, radius*2);
@@ -239,13 +200,6 @@ void VToolPoint::RefreshBaseGeometry(const QString &name, const qreal &x, const
RefreshLine();
}
-QString VToolPoint::GetNameLine(qint64 firstPoint, qint64 secondPoint) const{
- VPointF first = data->GetPoint(firstPoint);
- VPointF second = data->GetPoint(secondPoint);
- QString name = QString("Line_%1_%2").arg(first.name(), second.name());
- return name;
-}
-
VToolPoint::~VToolPoint(){
}
diff --git a/tools/vtoolpoint.h b/tools/vtoolpoint.h
index d64776b40..16601fd1a 100644
--- a/tools/vtoolpoint.h
+++ b/tools/vtoolpoint.h
@@ -5,19 +5,10 @@
#include
#include "../widgets/vgraphicssimpletextitem.h"
-#include "../container/vcontainer.h"
-#include "../xml/vdomdocument.h"
#include "../options.h"
+#include "vabstracttool.h"
-namespace Tool{
- enum Enum
- {
- FromGui,
- FromFile
- };
-}
-
-class VToolPoint: public QObject, public QGraphicsEllipseItem
+class VToolPoint: public VAbstractTool, public QGraphicsEllipseItem
{
Q_OBJECT
public:
@@ -26,30 +17,14 @@ public:
public slots:
void NameChangePosition(const QPointF pos);
virtual void ChangedActivDraw(const QString newName);
- virtual void FullUpdateFromFile()=0;
- void ChangedNameDraw(const QString oldName, const QString newName);
-signals:
- void haveLiteChange();
- void ChoosedPoint(qint64 id, Scene::Type type);
- void FullUpdateTree();
protected:
qreal radius;
- VDomDocument *doc;
- VContainer *data;
VGraphicsSimpleTextItem *namePoint;
- QGraphicsLineItem *line;
- qint64 id;
- QString nameActivDraw;
- bool ignoreContextMenuEvent;
- virtual void AddToFile()=0;
+ QGraphicsLineItem *lineName;
virtual void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event );
- void AddAttribute(QDomElement &domElement, const QString &name, const qint64 &value);
- void AddAttribute(QDomElement &domElement, const QString &name, const qint32 &value);
- void AddAttribute(QDomElement &domElement, const QString &name, const qreal &value);
- void AddAttribute(QDomElement &domElement, const QString &name, const QString &value);
void RefreshBaseGeometry(const QString &name, const qreal &x, const qreal &y,
const qreal &mx, const qreal &my);
- QString GetNameLine(qint64 firstPoint, qint64 secondPoint) const;
+
private:
qint32 LineIntersectCircle(QPointF center, qreal radius, QLineF line, QPointF &p1,
QPointF &p2) const;
diff --git a/tools/vtoolsimplepoint.cpp b/tools/vtoolsimplepoint.cpp
index bfd8cc807..496a48c45 100644
--- a/tools/vtoolsimplepoint.cpp
+++ b/tools/vtoolsimplepoint.cpp
@@ -21,7 +21,7 @@ VToolSimplePoint::VToolSimplePoint (VDomDocument *doc, VContainer *data, qint64
}
void VToolSimplePoint::AddToFile(){
- VPointF point = data->GetPoint(id);
+ VPointF point = VAbstractTool::data->GetPoint(id);
QDomElement domElement = doc->createElement("point");
AddAttribute(domElement, "id", id);
@@ -58,7 +58,7 @@ void VToolSimplePoint::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event
QAction *selectedAction = menu.exec(event->screenPos());
if(selectedAction == actionOption){
DialogSinglePoint *dialogSinglePoint = new DialogSinglePoint;
- VPointF p = data->GetPoint(id);
+ VPointF p = VAbstractTool::data->GetPoint(id);
dialogSinglePoint->setData(p.name(), p.toQPointF());
qint32 result = dialogSinglePoint->exec();
if(result == QDialog::Accepted){
diff --git a/xml/vdomdocument.cpp b/xml/vdomdocument.cpp
index 43a32ed82..19258f4c6 100644
--- a/xml/vdomdocument.cpp
+++ b/xml/vdomdocument.cpp
@@ -3,6 +3,7 @@
#include "../tools/vtoolsimplepoint.h"
#include "../tools/vtoolendline.h"
+#include "../tools/vtoolline.h"
#include "../options.h"
#include "../container/calculator.h"
@@ -336,6 +337,9 @@ void VDomDocument::ParseCalculationElement(VMainGraphicsScene *scene, const QDom
if(domElement.tagName() == "point"){
ParsePointElement(scene, domElement, parse, domElement.attribute("type", ""));
}
+ if(domElement.tagName() == "line"){
+ ParseLineElement(scene, domElement, parse);
+ }
}
}
}
@@ -402,6 +406,24 @@ void VDomDocument::ParsePointElement(VMainGraphicsScene *scene, const QDomElemen
}
}
+void VDomDocument::ParseLineElement(VMainGraphicsScene *scene, const QDomElement &domElement,
+ Document::Enum parse){
+ if(!domElement.isNull()){
+ qint64 firstPoint;
+ qint64 secondPoint;
+ if(!domElement.isNull()){
+ firstPoint = domElement.attribute("firstPoint", "").toLongLong();
+ secondPoint = domElement.attribute("secondPoint", "").toLongLong();
+ if(parse == Document::FullParse){
+ qint64 id = data->getNextId();
+ VToolLine *line = new VToolLine(this, data, id, firstPoint, secondPoint, Tool::FromFile);
+ scene->addItem(line);
+ connect(line, &VToolLine::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem);
+ }
+ }
+ }
+}
+
void VDomDocument::FullUpdateTree(){
VMainGraphicsScene *scene = new VMainGraphicsScene();
QComboBox *comboBoxDraws = new QComboBox();
diff --git a/xml/vdomdocument.h b/xml/vdomdocument.h
index ebc1c5228..07e713c9a 100644
--- a/xml/vdomdocument.h
+++ b/xml/vdomdocument.h
@@ -57,6 +57,8 @@ private:
Document::Enum parse);
void ParsePointElement(VMainGraphicsScene *scene, const QDomElement& domElement,
Document::Enum parse, const QString &type);
+ void ParseLineElement(VMainGraphicsScene *scene, const QDomElement& domElement,
+ Document::Enum parse);
void ParseIncrementsElement(const QDomNode& node);
void AddNewDraw(const QDomElement &node, QComboBox *comboBoxDraws)const;
};