diff --git a/Valentina.pro b/Valentina.pro index 2dd2a5464..90541aca6 100644 --- a/Valentina.pro +++ b/Valentina.pro @@ -31,7 +31,10 @@ SOURCES += main.cpp\ tools/vtoolendline.cpp \ tools/vtoolline.cpp \ tools/vabstracttool.cpp \ - dialogs/dialogline.cpp + dialogs/dialogline.cpp \ + tools/vtoolalongline.cpp \ + dialogs/dialogtool.cpp \ + dialogs/dialogalongline.cpp HEADERS += mainwindow.h \ widgets/vmaingraphicsscene.h \ @@ -53,14 +56,26 @@ HEADERS += mainwindow.h \ tools/vtoolendline.h \ tools/vtoolline.h \ tools/vabstracttool.h \ - dialogs/dialogline.h + dialogs/dialogline.h \ + tools/vtoolalongline.h \ + dialogs/dialogtool.h \ + dialogs/dialogalongline.h FORMS += mainwindow.ui \ dialogs/dialogsinglepoint.ui \ dialogs/dialogincrements.ui \ dialogs/dialogendline.ui \ - dialogs/dialogline.ui + dialogs/dialogline.ui \ + dialogs/dialogalongline.ui RESOURCES += \ icon.qrc \ cursor.qrc + +CONFIG(debug, debug|release){ + # Debug + QMAKE_CXXFLAGS += -O0 -Wall -Wextra -pedantic -std=c++0x +}else{ + # Release + QMAKE_CXXFLAGS += -O1 -std=c++0x +} diff --git a/cursor.qrc b/cursor.qrc index eda5c9def..453c3545d 100644 --- a/cursor.qrc +++ b/cursor.qrc @@ -3,5 +3,6 @@ cursor/spoint_cursor.png cursor/endline_cursor.png cursor/line_cursor.png + cursor/alongline_cursor.png diff --git a/cursor/alongline_cursor.png b/cursor/alongline_cursor.png new file mode 100644 index 000000000..3fac66a28 Binary files /dev/null and b/cursor/alongline_cursor.png differ diff --git a/dialogs/dialogalongline.cpp b/dialogs/dialogalongline.cpp new file mode 100644 index 000000000..e89bad390 --- /dev/null +++ b/dialogs/dialogalongline.cpp @@ -0,0 +1,142 @@ +#include "dialogalongline.h" +#include "ui_dialogalongline.h" + +DialogAlongLine::DialogAlongLine(const VContainer *data, QWidget *parent) : + DialogTool(data, parent), ui(new Ui::DialogAlongLine) +{ + ui->setupUi(this); + number = 0; + listWidget = ui->listWidget; + labelResultCalculation = ui->labelResultCalculation; + labelDescription = ui->labelDescription; + radioButtonSizeGrowth = ui->radioButtonSizeGrowth; + radioButtonStandartTable = ui->radioButtonStandartTable; + radioButtonIncrements = ui->radioButtonIncrements; + radioButtonLengthLine = ui->radioButtonLengthLine; + lineEditFormula = ui->lineEditFormula; + flagFormula = false; + bOk = ui->buttonBox->button(QDialogButtonBox::Ok); + connect(bOk, &QPushButton::clicked, this, &DialogAlongLine::DialogAccepted); + flagName = false; + CheckState(); + QPushButton *bCansel = ui->buttonBox->button(QDialogButtonBox::Cancel); + connect(bCansel, &QPushButton::clicked, this, &DialogAlongLine::DialogRejected); + FillComboBoxTypeLine(ui->comboBoxLineType); + FillComboBoxPoints(ui->comboBoxFirstPoint); + FillComboBoxPoints(ui->comboBoxSecondPoint); + + connect(ui->toolButtonPutHere, &QPushButton::clicked, this, &DialogAlongLine::PutHere); + connect(ui->listWidget, &QListWidget::itemDoubleClicked, this, &DialogAlongLine::PutVal); + connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogAlongLine::ValChenged); + + ShowBase(); + connect(ui->radioButtonSizeGrowth, &QRadioButton::clicked, this, &DialogAlongLine::SizeGrowth); + connect(ui->radioButtonStandartTable, &QRadioButton::clicked, this, &DialogAlongLine::StandartTable); + connect(ui->radioButtonIncrements, &QRadioButton::clicked, this, &DialogAlongLine::Increments); + connect(ui->radioButtonLengthLine, &QRadioButton::clicked, this, &DialogAlongLine::LengthLines); + connect(ui->toolButtonEqual, &QPushButton::clicked, this, &DialogAlongLine::EvalFormula); + connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogAlongLine::NamePointChanged); + connect(ui->lineEditFormula, &QLineEdit::textChanged, this, &DialogAlongLine::FormulaChanged); +} + +DialogAlongLine::~DialogAlongLine() +{ + delete ui; +} + +void DialogAlongLine::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(); + } + } + } +} + +void DialogAlongLine::DialogAccepted(){ + pointName = ui->lineEditNamePoint->text(); + typeLine = GetTypeLine(ui->comboBoxLineType); + formula = ui->lineEditFormula->text(); + qint32 index = ui->comboBoxFirstPoint->currentIndex(); + firstPointId = qvariant_cast(ui->comboBoxFirstPoint->itemData(index)); + index = ui->comboBoxSecondPoint->currentIndex(); + secondPointId = qvariant_cast(ui->comboBoxSecondPoint->itemData(index)); + emit DialogClosed(QDialog::Accepted); +} + +qint64 DialogAlongLine::getSecondPointId() const{ + return secondPointId; +} + +void DialogAlongLine::setSecondPointId(const qint64 &value){ + secondPointId = value; + qint32 index = ui->comboBoxSecondPoint->findData(secondPointId); + if(index != -1){ + ui->comboBoxSecondPoint->setCurrentIndex(index); + } +} + +qint64 DialogAlongLine::getFirstPointId() const{ + return firstPointId; +} + +void DialogAlongLine::setFirstPointId(const qint64 &value){ + firstPointId = value; + qint32 index = ui->comboBoxFirstPoint->findData(firstPointId); + if(index != -1){ + ui->comboBoxFirstPoint->setCurrentIndex(index); + } +} + +QString DialogAlongLine::getFormula() const{ + return formula; +} + +void DialogAlongLine::setFormula(const QString &value){ + formula = value; + ui->lineEditFormula->setText(formula); +} + +QString DialogAlongLine::getTypeLine() const{ + return typeLine; +} + +void DialogAlongLine::setTypeLine(const QString &value){ + typeLine = value; + if(typeLine == "hair"){ + qint32 index = ui->comboBoxLineType->findText("Лінія"); + if(index != -1){ + ui->comboBoxLineType->setCurrentIndex(index); + } + } + if(typeLine == "none"){ + qint32 index = ui->comboBoxLineType->findText("Без лінії"); + if(index != -1){ + ui->comboBoxLineType->setCurrentIndex(index); + } + } +} + +QString DialogAlongLine::getPointName() const{ + return pointName; +} + +void DialogAlongLine::setPointName(const QString &value){ + pointName = value; + ui->lineEditNamePoint->setText(pointName); +} diff --git a/dialogs/dialogalongline.h b/dialogs/dialogalongline.h new file mode 100644 index 000000000..2c8c64e62 --- /dev/null +++ b/dialogs/dialogalongline.h @@ -0,0 +1,42 @@ +#ifndef DIALOGALONGLINE_H +#define DIALOGALONGLINE_H + +#include "dialogtool.h" +#include "../options.h" +#include "../container/vcontainer.h" +#include "../container/calculator.h" + +namespace Ui { +class DialogAlongLine; +} + +class DialogAlongLine : public DialogTool +{ + Q_OBJECT +public: + explicit DialogAlongLine(const VContainer *data, QWidget *parent = 0); + ~DialogAlongLine(); + QString getPointName() const; + void setPointName(const QString &value); + QString getTypeLine() const; + void setTypeLine(const QString &value); + QString getFormula() const; + void setFormula(const QString &value); + qint64 getFirstPointId() const; + void setFirstPointId(const qint64 &value); + qint64 getSecondPointId() const; + void setSecondPointId(const qint64 &value); +public slots: + virtual void ChoosedPoint(qint64 id, Scene::Type type); + virtual void DialogAccepted(); +private: + Ui::DialogAlongLine *ui; + qint32 number; + QString pointName; + QString typeLine; + QString formula; + qint64 firstPointId; + qint64 secondPointId; +}; + +#endif // DIALOGALONGLINE_H diff --git a/dialogs/dialogalongline.ui b/dialogs/dialogalongline.ui new file mode 100644 index 000000000..5ad3ff2c1 --- /dev/null +++ b/dialogs/dialogalongline.ui @@ -0,0 +1,281 @@ + + + DialogAlongLine + + + + 0 + 0 + 470 + 454 + + + + Dialog + + + + + + + + + 0 + 0 + + + + Відстань + + + + + + + + + + ... + + + + :/icon/24x24/equal.png:/icon/24x24/equal.png + + + + 24 + 24 + + + + + + + + + 0 + 0 + + + + + 87 + 0 + + + + + 0 + 0 + + + + _ + + + + + + + + + + + + + + + Ім'я нової точки + + + + + + + + + + ... + + + + :/icon/24x24/putHere.png:/icon/24x24/putHere.png + + + + 24 + 24 + + + + + + + + + + + + Перша точка + + + + + + + + + + + + + + Друга точка + + + + + + + + + + + + + + Тип лінії + + + + + + + + + + + + + + Вхідні данні + + + + + + + Розмір і зріст + + + true + + + + + + + Стандартна таблиця + + + + + + + Прибавки + + + + + + + Довжини ліній + + + + + + + false + + + Довжини дуг + + + + + + + false + + + Довжини сплайнів + + + + + + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + + buttonBox + accepted() + DialogAlongLine + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + DialogAlongLine + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/dialogs/dialogendline.cpp b/dialogs/dialogendline.cpp index 8e3c7e11c..664d5eb22 100644 --- a/dialogs/dialogendline.cpp +++ b/dialogs/dialogendline.cpp @@ -7,19 +7,27 @@ #include "../container/calculator.h" DialogEndLine::DialogEndLine(const VContainer *data, QWidget *parent) : - QDialog(parent), ui(new Ui::DialogEndLine) + DialogTool(data, parent), ui(new Ui::DialogEndLine) { ui->setupUi(this); + spinBoxAngle = ui->spinBoxAngle; + listWidget = ui->listWidget; + labelResultCalculation = ui->labelResultCalculation; + labelDescription = ui->labelDescription; + radioButtonSizeGrowth = ui->radioButtonSizeGrowth; + radioButtonStandartTable = ui->radioButtonStandartTable; + radioButtonIncrements = ui->radioButtonIncrements; + radioButtonLengthLine = ui->radioButtonLengthLine; + lineEditFormula = ui->lineEditFormula; flagFormula = false; - flagName = false; - this->data = data; bOk = ui->buttonBox->button(QDialogButtonBox::Ok); connect(bOk, &QPushButton::clicked, this, &DialogEndLine::DialogAccepted); - bOk->setEnabled(false); - FillComboBoxBasePoint(); - QStringList list; - list<<"Лінія"<<"Без лінії"; - ui->comboBoxLineType->addItems(list); + flagName = false; + CheckState(); + QPushButton *bCansel = ui->buttonBox->button(QDialogButtonBox::Cancel); + connect(bCansel, &QPushButton::clicked, this, &DialogEndLine::DialogRejected); + FillComboBoxPoints(ui->comboBoxBasePoint); + FillComboBoxTypeLine(ui->comboBoxLineType); connect(ui->toolButtonArrowDown, &QPushButton::clicked, this, &DialogEndLine::ArrowDown); @@ -37,107 +45,18 @@ DialogEndLine::DialogEndLine(const VContainer *data, QWidget *parent) : &DialogEndLine::ArrowRightUp); connect(ui->toolButtonArrowRightDown, &QPushButton::clicked, this, &DialogEndLine::ArrowRightDown); - connect(ui->toolButtonPutHere, &QPushButton::clicked, this, - &DialogEndLine::ClickedToolButtonPutHere); + connect(ui->toolButtonPutHere, &QPushButton::clicked, this, &DialogEndLine::PutHere); connect(ui->listWidget, &QListWidget::itemDoubleClicked, this, &DialogEndLine::PutVal); connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); ShowBase(); - connect(ui->radioButtonSizeGrowth, &QRadioButton::clicked, this, - &DialogEndLine::ClickedSizeGrowth); - connect(ui->radioButtonStandartTable, &QRadioButton::clicked, this, - &DialogEndLine::ClickedStandartTable); - connect(ui->radioButtonIncrements, &QRadioButton::clicked, this, - &DialogEndLine::ClickedIncrements); - connect(ui->radioButtonLengthLine, &QRadioButton::clicked, this, - &DialogEndLine::ClickedLengthLines); - connect(ui->toolButtonEqual, &QPushButton::clicked, this, - &DialogEndLine::ClickedToolButtonEqual); - connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogEndLine::NameChanged); + connect(ui->radioButtonSizeGrowth, &QRadioButton::clicked, this, &DialogEndLine::SizeGrowth); + connect(ui->radioButtonStandartTable, &QRadioButton::clicked, this, &DialogEndLine::StandartTable); + connect(ui->radioButtonIncrements, &QRadioButton::clicked, this, &DialogEndLine::Increments); + connect(ui->radioButtonLengthLine, &QRadioButton::clicked, this, &DialogEndLine::LengthLines); + connect(ui->toolButtonEqual, &QPushButton::clicked, this, &DialogEndLine::EvalFormula); + connect(ui->lineEditNamePoint, &QLineEdit::textChanged, this, &DialogEndLine::NamePointChanged); connect(ui->lineEditFormula, &QLineEdit::textChanged, this, &DialogEndLine::FormulaChanged); - - timerFormula = new QTimer(this); - connect(timerFormula, &QTimer::timeout, this, &DialogEndLine::ClickedToolButtonEqual); -} - -void DialogEndLine::ShowBase(){ - disconnect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - ui->listWidget->clear(); - connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - const QMap *base = data->DataBase(); - QMapIterator i(*base); - while (i.hasNext()) { - i.next(); - QListWidgetItem *item = new QListWidgetItem(i.key()); - item->setFont(QFont("Times", 12, QFont::Bold)); - ui->listWidget->addItem(item); - } - ui->listWidget->setCurrentRow (0); -} - -void DialogEndLine::ShowStandartTable(){ - disconnect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - ui->listWidget->clear(); - connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - const QMap *standartTable = data->DataStandartTable(); - QMapIterator i(*standartTable); - while (i.hasNext()) { - i.next(); - QListWidgetItem *item = new QListWidgetItem(i.key()); - item->setFont(QFont("Times", 12, QFont::Bold)); - ui->listWidget->addItem(item); - } - ui->listWidget->setCurrentRow (0); -} - -void DialogEndLine::ShowIncrementTable(){ - disconnect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - ui->listWidget->clear(); - connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - const QMap *incrementTable = data->DataIncrementTable(); - QMapIterator i(*incrementTable); - while (i.hasNext()) { - i.next(); - QListWidgetItem *item = new QListWidgetItem(i.key()); - item->setFont(QFont("Times", 12, QFont::Bold)); - ui->listWidget->addItem(item); - } - ui->listWidget->setCurrentRow (0); -} - -void DialogEndLine::ShowLengthLines(){ - disconnect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - ui->listWidget->clear(); - connect(ui->listWidget, &QListWidget::currentRowChanged, this, &DialogEndLine::ValChenged); - const QMap *linesTable = data->DataLengthLines(); - QMapIterator i(*linesTable); - while (i.hasNext()) { - i.next(); - QListWidgetItem *item = new QListWidgetItem(i.key()); - item->setFont(QFont("Times", 12, QFont::Bold)); - ui->listWidget->addItem(item); - } - ui->listWidget->setCurrentRow (0); -} - -void DialogEndLine::CheackState(){ - bOk->setEnabled(flagFormula & flagName); -} - -void DialogEndLine::ClickedSizeGrowth(){ - ShowBase(); -} - -void DialogEndLine::ClickedStandartTable(){ - ShowStandartTable(); -} - -void DialogEndLine::ClickedLengthLines(){ - ShowLengthLines(); -} - -void DialogEndLine::ClickedIncrements(){ - ShowIncrementTable(); } void DialogEndLine::ChoosedPoint(qint64 id, Scene::Type type){ @@ -198,11 +117,6 @@ void DialogEndLine::setAngle(const qint32 &value){ ui->spinBoxAngle->setValue(angle); } -void DialogEndLine::closeEvent ( QCloseEvent * event ){ - DialogClosed(QDialog::Rejected); - event->accept(); -} - qint64 DialogEndLine::getBasePointId() const { return basePointId; @@ -217,150 +131,14 @@ void DialogEndLine::setBasePointId(const qint64 &value) } } -void DialogEndLine::FillComboBoxBasePoint(){ - const QMap *points = data->DataPoints(); - QMapIterator i(*points); - while (i.hasNext()) { - i.next(); - VPointF point = i.value(); - ui->comboBoxBasePoint->addItem(point.name(), i.key()); - } -} - -void DialogEndLine::ArrowUp(){ - ui->spinBoxAngle->setValue(90); -} - -void DialogEndLine::ArrowDown(){ - ui->spinBoxAngle->setValue(270); -} - -void DialogEndLine::ArrowLeft(){ - ui->spinBoxAngle->setValue(180); -} - -void DialogEndLine::ArrowRight(){ - ui->spinBoxAngle->setValue(0); -} - -void DialogEndLine::ArrowLeftUp(){ - ui->spinBoxAngle->setValue(135); -} - -void DialogEndLine::ArrowLeftDown(){ - ui->spinBoxAngle->setValue(225); -} - -void DialogEndLine::ArrowRightUp(){ - ui->spinBoxAngle->setValue(45); -} - -void DialogEndLine::ArrowRightDown(){ - ui->spinBoxAngle->setValue(315); -} - -void DialogEndLine::ClickedToolButtonPutHere(){ - QListWidgetItem *item = ui->listWidget->currentItem(); - QString val = item->text(); - ui->lineEditFormula->setText(ui->lineEditFormula->text().append(val)); -} - -void DialogEndLine::PutVal(QListWidgetItem *item){ - QString val = item->text(); - ui->lineEditFormula->setText(ui->lineEditFormula->text().append(val)); -} - -void DialogEndLine::ValChenged(int row){ - if(ui->listWidget->count() == 0){ - return; - } - QListWidgetItem *item = ui->listWidget->item( row ); - if(ui->radioButtonSizeGrowth->isChecked()){ - if(item->text()=="Р"){ - QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->growth()).arg("Зріст"); - ui->labelDescription->setText(desc); - } - if(item->text()=="Сг"){ - QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->size()).arg("Розмір"); - ui->labelDescription->setText(desc); - } - } - if(ui->radioButtonStandartTable->isChecked()){ - VStandartTableCell stable = data->GetStandartTableCell(item->text()); - QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->GetValueStandartTableCell(item->text())) - .arg(stable.GetDescription()); - ui->labelDescription->setText(desc); - } - if(ui->radioButtonIncrements->isChecked()){ - VIncrementTableRow itable = data->GetIncrementTableRow(item->text()); - QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->GetValueIncrementTableRow(item->text())) - .arg(itable.getDescription()); - ui->labelDescription->setText(desc); - } -} - -void DialogEndLine::ClickedToolButtonEqual(){ - if(ui->lineEditFormula->text().isEmpty()){ - flagFormula = false; - } else { - Calculator cal(data); - QString errorMsg; - qreal result = cal.eval(ui->lineEditFormula->text(),&errorMsg); - if(!errorMsg.isEmpty()){ - ui->labelResultCalculation->setText("Помилка."); - flagFormula = false; - } else { - ui->labelResultCalculation->setText(QString().setNum(result)); - flagFormula = true; - } - } - CheackState(); - timerFormula->stop(); -} - -void DialogEndLine::NameChanged(){ - QString name = ui->lineEditNamePoint->text(); - if(name.isEmpty() || name.contains(" ")){ - flagName = false; - } else { - flagName = true; - } - CheackState(); -} - -void DialogEndLine::FormulaChanged(){ - if(ui->lineEditFormula->text().isEmpty()){ - flagFormula = false; - CheackState(); - return; - } - timerFormula->start(1000); -} - void DialogEndLine::DialogAccepted(){ pointName = ui->lineEditNamePoint->text(); - if(ui->comboBoxLineType->currentText()=="Лінія"){ - typeLine = QString("hair"); - } else { - typeLine = QString("none"); - } + typeLine = GetTypeLine(ui->comboBoxLineType); formula = ui->lineEditFormula->text(); angle = ui->spinBoxAngle->value(); qint32 index = ui->comboBoxBasePoint->currentIndex(); basePointId = qvariant_cast(ui->comboBoxBasePoint->itemData(index)); - DialogClosed(QDialog::Accepted); -} - -void DialogEndLine::UpdateList(){ - if(ui->radioButtonSizeGrowth->isChecked()){ - ShowBase(); - } - if(ui->radioButtonStandartTable->isChecked()){ - ShowStandartTable(); - } - if(ui->radioButtonIncrements->isChecked()){ - ShowIncrementTable(); - } + emit DialogClosed(QDialog::Accepted); } DialogEndLine::~DialogEndLine() diff --git a/dialogs/dialogendline.h b/dialogs/dialogendline.h index 9166f4704..04449e3df 100644 --- a/dialogs/dialogendline.h +++ b/dialogs/dialogendline.h @@ -1,7 +1,7 @@ #ifndef DIALOGENDLINE_H #define DIALOGENDLINE_H -#include +#include "dialogtool.h" #include #include #include @@ -14,71 +14,32 @@ namespace Ui { class DialogEndLine; } -class DialogEndLine : public QDialog +class DialogEndLine : public DialogTool { - Q_OBJECT - + Q_OBJECT public: - explicit DialogEndLine(const VContainer *data, QWidget *parent = 0); - ~DialogEndLine(); - QString getPointName() const; - void setPointName(const QString &value); - - QString getTypeLine() const; - void setTypeLine(const QString &value); - - QString getFormula() const; - void setFormula(const QString &value); - - qint32 getAngle() const; - void setAngle(const qint32 &value); - - qint64 getBasePointId() const; - void setBasePointId(const qint64 &value); -signals: - void DialogClosed(int result); + explicit DialogEndLine(const VContainer *data, QWidget *parent = 0); + ~DialogEndLine(); + QString getPointName() const; + void setPointName(const QString &value); + QString getTypeLine() const; + void setTypeLine(const QString &value); + QString getFormula() const; + void setFormula(const QString &value); + qint32 getAngle() const; + void setAngle(const qint32 &value); + qint64 getBasePointId() const; + void setBasePointId(const qint64 &value); public slots: - void ChoosedPoint(qint64 id, Scene::Type type); - void ArrowUp(); - void ArrowDown(); - void ArrowLeft(); - void ArrowRight(); - void ArrowLeftUp(); - void ArrowLeftDown(); - void ArrowRightUp(); - void ArrowRightDown(); - void ClickedSizeGrowth(); - void ClickedStandartTable(); - void ClickedLengthLines(); - void ClickedIncrements(); - void ClickedToolButtonPutHere(); - void PutVal(QListWidgetItem * item); - void ValChenged(int row); - void ClickedToolButtonEqual(); - void NameChanged(); - void FormulaChanged(); - void DialogAccepted(); - void UpdateList(); -protected: - void closeEvent ( QCloseEvent * event ); + virtual void ChoosedPoint(qint64 id, Scene::Type type); + virtual void DialogAccepted(); private: Ui::DialogEndLine *ui; - const VContainer *data; - QPushButton *bOk; - QTimer *timerFormula; - bool flagFormula; - bool flagName; - QString pointName; - QString typeLine; - QString formula; - qint32 angle; - qint64 basePointId; - void FillComboBoxBasePoint(); - void ShowBase(); - void ShowStandartTable(); - void ShowIncrementTable(); - void ShowLengthLines(); - void CheackState(); + QString pointName; + QString typeLine; + QString formula; + qint32 angle; + qint64 basePointId; }; #endif // DIALOGENDLINE_H diff --git a/dialogs/dialogendline.ui b/dialogs/dialogendline.ui index badf97c3c..b0ab33ffb 100644 --- a/dialogs/dialogendline.ui +++ b/dialogs/dialogendline.ui @@ -361,7 +361,7 @@ - Вихідні данні + Вхідні данні diff --git a/dialogs/dialogincrements.cpp b/dialogs/dialogincrements.cpp index 0a4fc3ccb..0e1a7dbee 100644 --- a/dialogs/dialogincrements.cpp +++ b/dialogs/dialogincrements.cpp @@ -8,10 +8,10 @@ #include "../widgets/doubledelegate.h" DialogIncrements::DialogIncrements(VContainer *data, VDomDocument *doc, QWidget *parent) : - QDialog(parent), ui(new Ui::DialogIncrements){ + DialogTool(data, parent), ui(new Ui::DialogIncrements){ ui->setupUi(this); - this->data = data; this->doc = doc; + this->data = data; InitialStandartTable(); InitialIncrementTable(); InitialLinesTable(); @@ -33,8 +33,8 @@ DialogIncrements::DialogIncrements(VContainer *data, VDomDocument *doc, QWidget connect(this->doc, &VDomDocument::FullUpdateFromFile, this, &DialogIncrements::FullUpdateFromFile); - QPushButton *bOk = ui->buttonBox->button(QDialogButtonBox::Ok); - connect(bOk, &QPushButton::clicked, this, &DialogIncrements::clickedButtonOk); + bOk = ui->buttonBox->button(QDialogButtonBox::Ok); + connect(bOk, &QPushButton::clicked, this, &DialogIncrements::DialogAccepted); } void DialogIncrements::FillStandartTable(){ @@ -335,11 +335,6 @@ void DialogIncrements::cellChanged ( qint32 row, qint32 column ){ } } -void DialogIncrements::closeEvent ( QCloseEvent * event ){ - emit closedActionTable(); - event->accept(); -} - void DialogIncrements::InitialStandartTable(){ ui->tableWidgetStandart->resizeColumnsToContents(); ui->tableWidgetStandart->resizeRowsToContents(); @@ -372,8 +367,8 @@ void DialogIncrements::InitialLinesTable(){ ui->tableWidgetLines->setHorizontalHeaderItem(1, new QTableWidgetItem("Довжина")); } -void DialogIncrements::clickedButtonOk(){ - emit closedActionTable(); +void DialogIncrements::DialogAccepted(){ + emit DialogClosed(QDialog::Accepted); } DialogIncrements::~DialogIncrements(){ diff --git a/dialogs/dialogincrements.h b/dialogs/dialogincrements.h index cf57cc331..86e77c889 100644 --- a/dialogs/dialogincrements.h +++ b/dialogs/dialogincrements.h @@ -1,7 +1,7 @@ #ifndef DIALOGINCREMENTS_H #define DIALOGINCREMENTS_H -#include +#include "dialogtool.h" #include #include "../container/vcontainer.h" @@ -11,10 +11,9 @@ namespace Ui { class DialogIncrements; } -class DialogIncrements : public QDialog +class DialogIncrements : public DialogTool { - Q_OBJECT - + Q_OBJECT public: explicit DialogIncrements(VContainer *data, VDomDocument *doc, QWidget *parent = 0); ~DialogIncrements(); @@ -23,13 +22,10 @@ public slots: void clickedToolButtonRemove(); void cellChanged ( qint32 row, qint32 column ); void FullUpdateFromFile(); - void clickedButtonOk(); + virtual void DialogAccepted(); signals: void FullUpdateTree(); void haveLiteChange(); - void closedActionTable(); -protected: - void closeEvent ( QCloseEvent * event ); private: Ui::DialogIncrements *ui; VContainer *data; diff --git a/dialogs/dialogline.cpp b/dialogs/dialogline.cpp index db8f7ab3b..1fd7a6356 100644 --- a/dialogs/dialogline.cpp +++ b/dialogs/dialogline.cpp @@ -4,14 +4,15 @@ #include DialogLine::DialogLine(const VContainer *data, QWidget *parent) : - QDialog(parent), ui(new Ui::DialogLine) + DialogTool(data, parent), ui(new Ui::DialogLine) { ui->setupUi(this); - this->data = data; - QPushButton *bOk = ui->buttonBox->button(QDialogButtonBox::Ok); + bOk = ui->buttonBox->button(QDialogButtonBox::Ok); connect(bOk, &QPushButton::clicked, this, &DialogLine::DialogAccepted); - FillComboBox(ui->comboBoxFirstPoint); - FillComboBox(ui->comboBoxSecondPoint); + QPushButton *bCansel = ui->buttonBox->button(QDialogButtonBox::Cancel); + connect(bCansel, &QPushButton::clicked, this, &DialogLine::DialogRejected); + FillComboBoxPoints(ui->comboBoxFirstPoint); + FillComboBoxPoints(ui->comboBoxSecondPoint); number = 0; } @@ -45,26 +46,6 @@ void DialogLine::setFirstPoint(const qint64 &value){ } } -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(); @@ -74,17 +55,6 @@ void DialogLine::DialogAccepted(){ 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); diff --git a/dialogs/dialogline.h b/dialogs/dialogline.h index 470c33ed1..65cbf996f 100644 --- a/dialogs/dialogline.h +++ b/dialogs/dialogline.h @@ -1,7 +1,7 @@ #ifndef DIALOGLINE_H #define DIALOGLINE_H -#include +#include "dialogtool.h" #include "../container/vcontainer.h" #include "../options.h" #include @@ -10,35 +10,24 @@ namespace Ui { class DialogLine; } -class DialogLine : public QDialog +class DialogLine : public DialogTool { Q_OBJECT - public: explicit DialogLine(const VContainer *data, QWidget *parent = 0); - ~DialogLine(); - + ~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 ); + virtual void DialogAccepted(); 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/dialogsinglepoint.cpp b/dialogs/dialogsinglepoint.cpp index 530f72ba7..72bb47530 100644 --- a/dialogs/dialogsinglepoint.cpp +++ b/dialogs/dialogsinglepoint.cpp @@ -6,20 +6,19 @@ #include "../options.h" -DialogSinglePoint::DialogSinglePoint(QWidget *parent) : - QDialog(parent), - ui(new Ui::DialogSinglePoint) +DialogSinglePoint::DialogSinglePoint(const VContainer *data, QWidget *parent) : + DialogTool(data, parent), ui(new Ui::DialogSinglePoint) { ui->setupUi(this); - isInitialized = false; ui->doubleSpinBoxX->setRange(0,PaperSize/PrintDPI*25.4); ui->doubleSpinBoxY->setRange(0,PaperSize/PrintDPI*25.4); - QPushButton* pOkButton = ui->buttonBox->button(QDialogButtonBox::Ok); - pOkButton->setEnabled(false); - connect(pOkButton, &QPushButton::clicked, this, &DialogSinglePoint::OkOperation); - connect(ui->lineEditName, &QLineEdit::textChanged, this, &DialogSinglePoint::NameChanged); - QPushButton* pCanselButton = ui->buttonBox->button(QDialogButtonBox::Cancel); - connect(pCanselButton, &QPushButton::clicked, this, &DialogSinglePoint::CanselOperation); + bOk = ui->buttonBox->button(QDialogButtonBox::Ok); + flagName = false; + CheckState(); + connect(bOk, &QPushButton::clicked, this, &DialogSinglePoint::DialogAccepted); + QPushButton *bCansel = ui->buttonBox->button(QDialogButtonBox::Cancel); + connect(bCansel, &QPushButton::clicked, this, &DialogSinglePoint::DialogRejected); + connect(ui->lineEditName,&QLineEdit::textChanged, this, &DialogSinglePoint::NamePointChanged); } void DialogSinglePoint::mousePress(QPointF scenePos){ @@ -33,46 +32,11 @@ void DialogSinglePoint::mousePress(QPointF scenePos){ } } -void DialogSinglePoint::showEvent( QShowEvent *event ){ - QDialog::showEvent( event ); - if( event->spontaneous() ){ - return; - } - - if(isInitialized){ - return; - } - - // do your init stuff here - - isInitialized = true;//перший показ вікна вже відбувся -} - -void DialogSinglePoint::NameChanged(){ - QString name = ui->lineEditName->text(); - if(name.isEmpty() || name.contains(" ")){ - QPushButton* pOkButton = ui->buttonBox->button(QDialogButtonBox::Ok); - pOkButton->setEnabled(false); - } else { - QPushButton* pOkButton = ui->buttonBox->button(QDialogButtonBox::Ok); - pOkButton->setEnabled(true); - } -} - -void DialogSinglePoint::CanselOperation(){ - emit ToolCanseled(); -} - -void DialogSinglePoint::OkOperation(){ +void DialogSinglePoint::DialogAccepted(){ point = QPointF(ui->doubleSpinBoxX->value()*PrintDPI/25.4, ui->doubleSpinBoxY->value()*PrintDPI/25.4); name = ui->lineEditName->text(); - emit SinglePointCreated(ui->lineEditName->text(), point); -} - -void DialogSinglePoint::closeEvent ( QCloseEvent * event ){ - emit ToolCanseled(); - event->accept(); + emit DialogClosed(QDialog::Accepted); } void DialogSinglePoint::setData(const QString name, const QPointF point){ diff --git a/dialogs/dialogsinglepoint.h b/dialogs/dialogsinglepoint.h index 3b948b44f..e624ddaec 100644 --- a/dialogs/dialogsinglepoint.h +++ b/dialogs/dialogsinglepoint.h @@ -1,35 +1,27 @@ #ifndef DIALOGSINGLEPOINT_H #define DIALOGSINGLEPOINT_H -#include +#include "dialogtool.h" +#include "../container/vcontainer.h" namespace Ui { class DialogSinglePoint; } -class DialogSinglePoint : public QDialog +class DialogSinglePoint : public DialogTool { Q_OBJECT public: - explicit DialogSinglePoint(QWidget *parent = 0); + explicit DialogSinglePoint(const VContainer *data, QWidget *parent = 0); void setData(const QString name, const QPointF point); QString getName()const; QPointF getPoint()const; ~DialogSinglePoint(); -signals: - void ToolCanseled(); - void SinglePointCreated(const QString name, const QPointF point); public slots: void mousePress(QPointF scenePos); - void NameChanged(); - void CanselOperation(); - void OkOperation(); -protected: - void showEvent( QShowEvent *event ); - void closeEvent ( QCloseEvent * event ); + virtual void DialogAccepted(); private: Ui::DialogSinglePoint *ui; - bool isInitialized; QString name; QPointF point; }; diff --git a/dialogs/dialogtool.cpp b/dialogs/dialogtool.cpp new file mode 100644 index 000000000..0f6cf09b2 --- /dev/null +++ b/dialogs/dialogtool.cpp @@ -0,0 +1,320 @@ +#include "dialogtool.h" +#include +#include +#include "../container/calculator.h" + +DialogTool::DialogTool(const VContainer *data, QWidget *parent):QDialog(parent){ + Q_CHECK_PTR(data); + this->data = data; + flagName = true; + flagFormula = true; + timerFormula = new QTimer(this); + connect(timerFormula, &QTimer::timeout, this, &DialogTool::EvalFormula); + isInitialized = false; + + bOk = 0; + spinBoxAngle = 0; + lineEditFormula = 0; + listWidget = 0; + labelResultCalculation = 0; + labelDescription = 0; + radioButtonSizeGrowth = 0; + radioButtonStandartTable = 0; + radioButtonIncrements = 0; + radioButtonLengthLine = 0; +} + +DialogTool::~DialogTool() +{ +} + +void DialogTool::closeEvent(QCloseEvent *event){ + DialogClosed(QDialog::Rejected); + event->accept(); +} + +void DialogTool::showEvent(QShowEvent *event){ + QDialog::showEvent( event ); + if( event->spontaneous() ){ + return; + } + + if(isInitialized){ + return; + } + + // do your init stuff here + isInitialized = true;//перший показ вікна вже відбувся +} + +void DialogTool::FillComboBoxPoints(QComboBox *box) const{ + const QMap *points = data->DataPoints(); + QMapIterator i(*points); + while (i.hasNext()) { + i.next(); + VPointF point = i.value(); + box->addItem(point.name(), i.key()); + } +} + +void DialogTool::FillComboBoxTypeLine(QComboBox *box) const{ + QStringList list; + list<<"Лінія"<<"Без лінії"; + box->addItems(list); +} + +QString DialogTool::GetTypeLine(const QComboBox *box) const{ + if(box->currentText()=="Лінія"){ + return QString("hair"); + } else { + return QString("none"); + } +} + +void DialogTool::ShowBase(){ + Q_CHECK_PTR(listWidget); + disconnect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + listWidget->clear(); + connect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + const QMap *base = data->DataBase(); + QMapIterator i(*base); + while (i.hasNext()) { + i.next(); + QListWidgetItem *item = new QListWidgetItem(i.key()); + item->setFont(QFont("Times", 12, QFont::Bold)); + listWidget->addItem(item); + } + listWidget->setCurrentRow (0); +} + +void DialogTool::ShowStandartTable(){ + Q_CHECK_PTR(listWidget); + disconnect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + listWidget->clear(); + connect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + const QMap *standartTable = data->DataStandartTable(); + QMapIterator i(*standartTable); + while (i.hasNext()) { + i.next(); + QListWidgetItem *item = new QListWidgetItem(i.key()); + item->setFont(QFont("Times", 12, QFont::Bold)); + listWidget->addItem(item); + } + listWidget->setCurrentRow (0); +} + +void DialogTool::ShowIncrementTable(){ + Q_CHECK_PTR(listWidget); + disconnect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + listWidget->clear(); + connect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + const QMap *incrementTable = data->DataIncrementTable(); + QMapIterator i(*incrementTable); + while (i.hasNext()) { + i.next(); + QListWidgetItem *item = new QListWidgetItem(i.key()); + item->setFont(QFont("Times", 12, QFont::Bold)); + listWidget->addItem(item); + } + listWidget->setCurrentRow (0); +} + +void DialogTool::ShowLengthLines(){ + Q_CHECK_PTR(listWidget); + disconnect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + listWidget->clear(); + connect(listWidget, &QListWidget::currentRowChanged, this, &DialogTool::ValChenged); + const QMap *linesTable = data->DataLengthLines(); + QMapIterator i(*linesTable); + while (i.hasNext()) { + i.next(); + QListWidgetItem *item = new QListWidgetItem(i.key()); + item->setFont(QFont("Times", 12, QFont::Bold)); + listWidget->addItem(item); + } + listWidget->setCurrentRow (0); +} + +void DialogTool::CheckState(){ + Q_CHECK_PTR(bOk); + bOk->setEnabled(flagFormula & flagName); +} + + +void DialogTool::ChoosedPoint(qint64 id, Scene::Type type){ + Q_UNUSED(id); + Q_UNUSED(type); +} + +void DialogTool::NamePointChanged(){ + QLineEdit* edit = qobject_cast(sender()); + if (edit){ + QString name = edit->text(); + if(name.isEmpty() || name.contains(" ")){ + flagName = false; + } else { + flagName = true; + } + } + CheckState(); +} + +void DialogTool::DialogAccepted(){ + emit DialogClosed(QDialog::Accepted); +} + +void DialogTool::DialogRejected(){ + emit DialogClosed(QDialog::Rejected); +} + +void DialogTool::FormulaChanged(){ + QLineEdit* edit = qobject_cast(sender()); + if(edit){ + if(edit->text().isEmpty()){ + flagFormula = false; + CheckState(); + return; + } + timerFormula->start(1000); + } +} + +void DialogTool::ArrowUp(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(90); +} + +void DialogTool::ArrowDown(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(270); +} + +void DialogTool::ArrowLeft(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(180); +} + +void DialogTool::ArrowRight(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(0); +} + +void DialogTool::ArrowLeftUp(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(135); +} + +void DialogTool::ArrowLeftDown(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(225); +} + +void DialogTool::ArrowRightUp(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(45); +} + +void DialogTool::ArrowRightDown(){ + Q_CHECK_PTR(spinBoxAngle); + spinBoxAngle->setValue(315); +} + +void DialogTool::EvalFormula(){ + Q_CHECK_PTR(lineEditFormula); + Q_CHECK_PTR(labelResultCalculation); + if(lineEditFormula->text().isEmpty()){ + flagFormula = false; + } else { + Calculator cal(data); + QString errorMsg; + qreal result = cal.eval(lineEditFormula->text(),&errorMsg); + if(!errorMsg.isEmpty()){ + labelResultCalculation->setText("Помилка."); + flagFormula = false; + } else { + labelResultCalculation->setText(QString().setNum(result)); + flagFormula = true; + } + } + CheckState(); + timerFormula->stop(); +} + +void DialogTool::SizeGrowth(){ + ShowBase(); +} + +void DialogTool::StandartTable(){ + ShowStandartTable(); +} + +void DialogTool::LengthLines(){ + ShowLengthLines(); +} + +void DialogTool::Increments(){ + ShowIncrementTable(); +} + +void DialogTool::PutHere(){ + Q_CHECK_PTR(lineEditFormula); + Q_CHECK_PTR(listWidget); + QListWidgetItem *item = listWidget->currentItem(); + QString val = item->text(); + lineEditFormula->setText(lineEditFormula->text().append(val)); +} + +void DialogTool::PutVal(QListWidgetItem *item){ + Q_CHECK_PTR(lineEditFormula); + QString val = item->text(); + lineEditFormula->setText(lineEditFormula->text().append(val)); +} + +void DialogTool::ValChenged(int row){ + Q_CHECK_PTR(listWidget); + Q_CHECK_PTR(labelDescription); + Q_CHECK_PTR(radioButtonSizeGrowth); + Q_CHECK_PTR(radioButtonStandartTable); + Q_CHECK_PTR(radioButtonIncrements); + if(listWidget->count() == 0){ + return; + } + QListWidgetItem *item = listWidget->item( row ); + if(radioButtonSizeGrowth->isChecked()){ + if(item->text()=="Р"){ + QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->growth()).arg("Зріст"); + labelDescription->setText(desc); + } + if(item->text()=="Сг"){ + QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->size()).arg("Розмір"); + labelDescription->setText(desc); + } + } + if(radioButtonStandartTable->isChecked()){ + VStandartTableCell stable = data->GetStandartTableCell(item->text()); + QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->GetValueStandartTableCell(item->text())) + .arg(stable.GetDescription()); + labelDescription->setText(desc); + } + if(radioButtonIncrements->isChecked()){ + VIncrementTableRow itable = data->GetIncrementTableRow(item->text()); + QString desc = QString("%1(%2) - %3").arg(item->text()).arg(data->GetValueIncrementTableRow(item->text())) + .arg(itable.getDescription()); + labelDescription->setText(desc); + } +} + +void DialogTool::UpdateList(){ + Q_CHECK_PTR(radioButtonSizeGrowth); + Q_CHECK_PTR(radioButtonStandartTable); + Q_CHECK_PTR(radioButtonIncrements); + if(radioButtonSizeGrowth->isChecked()){ + ShowBase(); + } + if(radioButtonStandartTable->isChecked()){ + ShowStandartTable(); + } + if(radioButtonIncrements->isChecked()){ + ShowIncrementTable(); + } +} diff --git a/dialogs/dialogtool.h b/dialogs/dialogtool.h new file mode 100644 index 000000000..42260b699 --- /dev/null +++ b/dialogs/dialogtool.h @@ -0,0 +1,75 @@ +#ifndef DIALOGTOOL_H +#define DIALOGTOOL_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../container/vcontainer.h" +#include "../options.h" + +class DialogTool : public QDialog +{ + Q_OBJECT +public: + DialogTool(const VContainer *data, QWidget *parent = 0); + virtual ~DialogTool(); +signals: + void DialogClosed(int result); +public slots: + virtual void ChoosedPoint(qint64 id, Scene::Type type); + void NamePointChanged(); + virtual void DialogAccepted(); + virtual void DialogRejected(); + void FormulaChanged(); + void ArrowUp(); + void ArrowDown(); + void ArrowLeft(); + void ArrowRight(); + void ArrowLeftUp(); + void ArrowLeftDown(); + void ArrowRightUp(); + void ArrowRightDown(); + void EvalFormula(); + void SizeGrowth(); + void StandartTable(); + void LengthLines(); + void Increments(); + void PutHere(); + void PutVal(QListWidgetItem * item); + void ValChenged(int row); + void UpdateList(); +protected: + const VContainer *data; + bool isInitialized; + bool flagName; + bool flagFormula; + QTimer *timerFormula; + QPushButton *bOk; + QSpinBox *spinBoxAngle; + QLineEdit *lineEditFormula; + QListWidget *listWidget; + QLabel *labelResultCalculation; + QLabel *labelDescription; + QRadioButton *radioButtonSizeGrowth; + QRadioButton *radioButtonStandartTable; + QRadioButton *radioButtonIncrements; + QRadioButton *radioButtonLengthLine; + void closeEvent ( QCloseEvent * event ); + void showEvent( QShowEvent *event ); + void FillComboBoxPoints(QComboBox *box)const; + void FillComboBoxTypeLine(QComboBox *box) const; + void CheckState(); + QString GetTypeLine(const QComboBox *box)const; + void ShowBase(); + void ShowStandartTable(); + void ShowIncrementTable(); + void ShowLengthLines(); +}; + +#endif // DIALOGTOOL_H diff --git a/icon.qrc b/icon.qrc index e5c34325d..66955c589 100644 --- a/icon.qrc +++ b/icon.qrc @@ -20,5 +20,6 @@ icon/24x24/equal.png icon/32x32/segment.png icon/32x32/line.png + icon/32x32/along_line.png diff --git a/icon/32x32/along_line.png b/icon/32x32/along_line.png new file mode 100644 index 000000000..5a1fca3ba Binary files /dev/null and b/icon/32x32/along_line.png differ diff --git a/mainwindow.cpp b/mainwindow.cpp index 1d7e17920..a5662ba15 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -13,6 +13,7 @@ #include "options.h" #include "tools/vtoolendline.h" #include "tools/vtoolline.h" +#include "tools/vtoolalongline.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) @@ -46,6 +47,8 @@ MainWindow::MainWindow(QWidget *parent) : &MainWindow::ToolEndLine); connect(ui->toolButtonLine, &QToolButton::clicked, this, &MainWindow::ToolLine); + connect(ui->toolButtonAlongLine, &QToolButton::clicked, this, + &MainWindow::ToolAlongLine); data = new VContainer; CreateManTableIGroup (); @@ -145,14 +148,12 @@ void MainWindow::ToolSinglePoint(bool checked){ QCursor cur(pixmap, 2, 3); ui->graphicsView->setCursor(cur); helpLabel->setText("Виберіть розташування для точки."); - dialogSinglePoint = new DialogSinglePoint; + dialogSinglePoint = new DialogSinglePoint(data); //покажемо вікно як тільки буде вибрано місце розташування для точки connect(scene, &VMainGraphicsScene::mousePress, dialogSinglePoint, &DialogSinglePoint::mousePress); - //головне вікно отримає сигнал відміни створення точки - connect(dialogSinglePoint, &DialogSinglePoint::ToolCanseled, this, &MainWindow::ToolCanseled); - connect(dialogSinglePoint, &DialogSinglePoint::SinglePointCreated, this, - &MainWindow::SinglePointCreated); + connect(dialogSinglePoint, &DialogSinglePoint::DialogClosed, this, + &MainWindow::ClosedDialogSinglePoint); } else { //не даємо користувачу зняти виділення кнопки ui->toolButtonSinglePoint->setChecked(true); } @@ -234,6 +235,48 @@ void MainWindow::ClosedDialogLine(int result){ ArrowTool(); } +void MainWindow::ToolAlongLine(bool checked){ + if(checked){ + CanselTool(); + tool = Tools::AlongLineTool; + QPixmap pixmap(":/cursor/alongline_cursor.png"); + QCursor cur(pixmap, 2, 3); + ui->graphicsView->setCursor(cur); + helpLabel->setText("Виберіть точки."); + dialogAlongLine = new DialogAlongLine(data, this); + connect(scene, &VMainGraphicsScene::ChoosedObject, dialogAlongLine, &DialogAlongLine::ChoosedPoint); + connect(dialogAlongLine, &DialogLine::DialogClosed, this, &MainWindow::ClosedDialogAlongLine); + } else { + ui->toolButtonAlongLine->setChecked(true); + } +} + +void MainWindow::ClosedDialogAlongLine(int result){ + if(result == QDialog::Accepted){ + QString formula = dialogAlongLine->getFormula(); + qint64 firstPointId = dialogAlongLine->getFirstPointId(); + qint64 secondPointId = dialogAlongLine->getSecondPointId(); + QString typeLine = dialogAlongLine->getTypeLine(); + QString pointName = dialogAlongLine->getPointName(); + + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + QLineF line = QLineF(firstPoint.toQPointF(), secondPoint.toQPointF()); + Calculator cal(data); + QString errorMsg; + qreal result = cal.eval(formula, &errorMsg); + if(errorMsg.isEmpty()){ + line.setLength(result*PrintDPI/25.4); + qint64 id = data->AddPoint(VPointF(line.p2().x(), line.p2().y(), pointName, 5, 10)); + VToolAlongLine *point = new VToolAlongLine(doc, data, id, formula, firstPointId, secondPointId, + typeLine, Tool::FromGui); + scene->addItem(point); + connect(point, &VToolAlongLine::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem); + } + } + ArrowTool(); +} + void MainWindow::showEvent( QShowEvent *event ){ QMainWindow::showEvent( event ); if( event->spontaneous() ){ @@ -352,6 +395,11 @@ void MainWindow::CanselTool(){ ui->toolButtonLine->setChecked(false); scene->clearFocus(); break; + case Tools::AlongLineTool: + delete dialogAlongLine; + ui->toolButtonAlongLine->setChecked(false); + scene->clearFocus(); + break; } } @@ -377,23 +425,24 @@ void MainWindow::keyPressEvent ( QKeyEvent * event ){ QMainWindow::keyPressEvent ( event ); } -void MainWindow::ToolCanseled(){ +void MainWindow::ClosedDialogSinglePoint(int result){ + if(result == QDialog::Accepted){ + QPointF point = dialogSinglePoint->getPoint(); + QString name = dialogSinglePoint->getName(); + qint64 id = data->AddPoint(VPointF(point.x(), point.y(), name, 5, 10)); + VToolSimplePoint *spoint = new VToolSimplePoint(doc, data, id, Tool::FromGui); + scene->addItem(spoint); + connect(spoint, &VToolPoint::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem); + ArrowTool(); + ui->toolButtonSinglePoint->setEnabled(false); + qint32 index = comboBoxDraws->currentIndex(); + comboBoxDraws->setItemData(index, false); + ui->actionSave->setEnabled(true); + SetEnableTool(true); + } ArrowTool(); } -void MainWindow::SinglePointCreated(const QString name, const QPointF point){ - qint64 id = data->AddPoint(VPointF(point.x(), point.y(), name, 5, 10)); - VToolSimplePoint *spoint = new VToolSimplePoint(doc, data, id, Tool::FromGui); - scene->addItem(spoint); - connect(spoint, &VToolPoint::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem); - ArrowTool(); - ui->toolButtonSinglePoint->setEnabled(false); - qint32 index = comboBoxDraws->currentIndex(); - comboBoxDraws->setItemData(index, false); - ui->actionSave->setEnabled(true); - SetEnableTool(true); -} - void MainWindow::ActionDraw(bool checked){ if(checked){ ui->actionDetails->setChecked(false); @@ -590,8 +639,8 @@ void MainWindow::SetEnableWidgets(bool enable){ void MainWindow::ActionTable(bool checked){ if(checked){ - dialogTable = new DialogIncrements(data, doc, 0); - connect(dialogTable, &DialogIncrements::closedActionTable, this, + dialogTable = new DialogIncrements(data, doc, this); + connect(dialogTable, &DialogIncrements::DialogClosed, this, &MainWindow::ClosedActionTable); dialogTable->show(); } else { @@ -605,16 +654,10 @@ void MainWindow::ClosedActionTable(){ delete dialogTable; } -void MainWindow::closeEvent ( QCloseEvent * event ){ - if(ui->actionTable->isChecked()==true){ - delete dialogTable; - } - event->accept(); -} - void MainWindow::SetEnableTool(bool enable){ ui->toolButtonEndLine->setEnabled(enable); ui->toolButtonLine->setEnabled(enable); + ui->toolButtonAlongLine->setEnabled(enable); } MainWindow::~MainWindow(){ diff --git a/mainwindow.h b/mainwindow.h index 1702fb86c..29b091442 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -5,11 +5,13 @@ #include #include #include +#include #include "widgets/vmaingraphicsscene.h" #include "dialogs/dialogsinglepoint.h" #include "dialogs/dialogincrements.h" #include "dialogs/dialogline.h" +#include "dialogs/dialogalongline.h" #include "tools/vtoolsimplepoint.h" #include "xml/vdomdocument.h" #include "container/vcontainer.h" @@ -25,7 +27,8 @@ namespace Tools{ ArrowTool, SinglePointTool, EndLineTool, - LineTool + LineTool, + AlongLineTool }; } @@ -41,8 +44,7 @@ public slots: void ActionAroowTool(); void ActionDraw(bool checked); void ActionDetails(bool checked); - void ToolCanseled(); - void SinglePointCreated(const QString name, const QPointF point); + void ClosedDialogSinglePoint(int result); void ActionNewDraw(); void currentDrawChanged( int index ); void OptionDraw(); @@ -59,10 +61,11 @@ public slots: void ClosedDialogEndLine(int result); void ToolLine(bool checked); void ClosedDialogLine(int result); + void ToolAlongLine(bool checked); + void ClosedDialogAlongLine(int result); protected: virtual void keyPressEvent ( QKeyEvent * event ); virtual void showEvent( QShowEvent *event ); - virtual void closeEvent ( QCloseEvent * event ); private: Ui::MainWindow *ui; Tools::Enum tool; @@ -74,6 +77,7 @@ private: DialogIncrements *dialogTable; DialogEndLine *dialogEndLine; DialogLine *dialogLine; + DialogAlongLine *dialogAlongLine; VDomDocument *doc; VContainer *data; QComboBox *comboBoxDraws; diff --git a/mainwindow.ui b/mainwindow.ui index 81db520a6..12f1da402 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -57,7 +57,7 @@ - 1 + 0 @@ -109,10 +109,26 @@ - + + + false + ... + + + :/icon/32x32/along_line.png:/icon/32x32/along_line.png + + + + 24 + 24 + + + + true + @@ -202,7 +218,7 @@ 0 0 - 154 + 117 45 @@ -230,7 +246,7 @@ 0 0 - 154 + 117 45 @@ -474,11 +490,4 @@ - - - - false - - - diff --git a/options.h b/options.h index 68633c0a4..3c3c170f3 100644 --- a/options.h +++ b/options.h @@ -3,8 +3,8 @@ #define PrintDPI 96 #define PaperSize 50000 -#define WidthMainLine 0.8*PrintDPI/25.4 -#define widthHairLine WidthMainLine/3 +#define widthMainLine 0.8*PrintDPI/25.4 +#define widthHairLine widthMainLine/3 namespace Scene{ enum Type diff --git a/tools/vabstracttool.cpp b/tools/vabstracttool.cpp index 1b3fd8340..38d73ecd0 100644 --- a/tools/vabstracttool.cpp +++ b/tools/vabstracttool.cpp @@ -54,9 +54,15 @@ void VAbstractTool::AddAttribute(QDomElement &domElement, const QString &name, c VAbstractTool::~VAbstractTool(){ } -QString VAbstractTool::GetNameLine(qint64 firstPoint, qint64 secondPoint) const{ +QString VAbstractTool::GetNameLine(const qint64 &firstPoint, const 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; + return QString("Line_%1_%2").arg(first.name(), second.name()); +} + +void VAbstractTool::AddLine(const qint64 &firstPointId, const qint64 &secondPointId) const{ + QString nameLine = GetNameLine(firstPointId, secondPointId); + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + data->AddLine(nameLine, QLineF(firstPoint.toQPointF(), secondPoint.toQPointF()).length()); } diff --git a/tools/vabstracttool.h b/tools/vabstracttool.h index 1eb4615e8..40dd50412 100644 --- a/tools/vabstracttool.h +++ b/tools/vabstracttool.h @@ -24,6 +24,7 @@ public slots: virtual void FullUpdateFromFile()=0; void ChangedNameDraw(const QString oldName, const QString newName); virtual void ChangedActivDraw(const QString newName); + virtual void FullUpdateFromGui(int result)=0; signals: void haveLiteChange(); void ChoosedPoint(qint64 id, Scene::Type type); @@ -39,6 +40,7 @@ protected: 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; + QString GetNameLine(const qint64 &firstPoint, const qint64 &secondPoint) const; + void AddLine(const qint64 &firstPointId, const qint64 &secondPointId) const; }; #endif // VABSTRACTTOOL_H diff --git a/tools/vtoolalongline.cpp b/tools/vtoolalongline.cpp new file mode 100644 index 000000000..721d2c10e --- /dev/null +++ b/tools/vtoolalongline.cpp @@ -0,0 +1,142 @@ +#include "vtoolalongline.h" +#include "../container/calculator.h" +#include +#include +#include + +VToolAlongLine::VToolAlongLine(VDomDocument *doc, VContainer *data, qint64 id, const QString &formula, + const qint64 &firstPointId, const qint64 &secondPointId, + const QString &typeLine, Tool::Enum typeCreation, + QGraphicsItem *parent):VToolPoint(doc, data, id, parent){ + connect(this, &VToolAlongLine::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree); + this->typeLine = typeLine; + this->formula = formula; + this->firstPointId = firstPointId; + this->secondPointId = secondPointId; + + //Лінія, якщо потрібно. + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + QLineF line = QLineF(firstPoint.toQPointF(), secondPoint.toQPointF()); + Calculator cal(data); + QString errorMsg; + qreal result = cal.eval(formula, &errorMsg); + if(errorMsg.isEmpty()){ + line.setLength(result*PrintDPI/25.4); + mainLine = new QGraphicsLineItem(line, this); + mainLine->setFlag(QGraphicsItem::ItemStacksBehindParent, true); + if(typeLine == "none"){ + mainLine->setVisible(false); + } else { + mainLine->setVisible(true); + } + + AddLine(firstPointId, id); + AddLine(id, secondPointId); + + if(typeCreation == Tool::FromGui){ + AddToFile(); + } + } +} + +void VToolAlongLine::FullUpdateFromFile(){ + QString name; + qreal mx, my; + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + name = domElement.attribute("name", ""); + mx = domElement.attribute("mx", "").toDouble()*PrintDPI/25.4; + my = domElement.attribute("my", "").toDouble()*PrintDPI/25.4; + typeLine = domElement.attribute("typeLine", ""); + formula = domElement.attribute("length", ""); + firstPointId = domElement.attribute("firstPoint", "").toLongLong(); + secondPointId = domElement.attribute("secondPoint", "").toLongLong(); + } + VPointF point = VAbstractTool::data->GetPoint(id); + RefreshBaseGeometry(name, point.x(), point.y(), mx, my); + VPointF firstPoint = VAbstractTool::data->GetPoint(firstPointId); + VPointF secondPoint = VAbstractTool::data->GetPoint(secondPointId); + mainLine->setLine(QLineF(firstPoint.toQPointF(), secondPoint.toQPointF())); + + AddLine(firstPointId, id); + AddLine(id, secondPointId); +} + +void VToolAlongLine::FullUpdateFromGui(int result){ + if(result == QDialog::Accepted){ + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + domElement.setAttribute("name", dialogAlongLine->getPointName()); + domElement.setAttribute("typeLine", dialogAlongLine->getTypeLine()); + domElement.setAttribute("length", dialogAlongLine->getFormula()); + domElement.setAttribute("firstPoint", QString().setNum(dialogAlongLine->getFirstPointId())); + domElement.setAttribute("secondPoint", QString().setNum(dialogAlongLine->getSecondPointId())); + emit FullUpdateTree(); + } + + } + dialogAlongLine.clear(); +} + +void VToolAlongLine::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 VToolAlongLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ + if(!ignoreContextMenuEvent){ + QMenu menu; + QAction *actionOption = menu.addAction("Властивості"); + QAction *selectedAction = menu.exec(event->screenPos()); + if(selectedAction == actionOption){ + dialogAlongLine = QSharedPointer(new DialogAlongLine(VAbstractTool::data)); + + connect(qobject_cast< VMainGraphicsScene * >(this->scene()), &VMainGraphicsScene::ChoosedObject, + dialogAlongLine.data(), &DialogAlongLine::ChoosedPoint); + connect(dialogAlongLine.data(), &DialogAlongLine::DialogClosed, this, + &VToolAlongLine::FullUpdateFromGui); + connect(doc, &VDomDocument::FullUpdateFromFile, dialogAlongLine.data(), + &DialogAlongLine::UpdateList); + + VPointF p = VAbstractTool::data->GetPoint(id); + + dialogAlongLine->setTypeLine(typeLine); + dialogAlongLine->setFormula(formula); + dialogAlongLine->setFirstPointId(firstPointId); + dialogAlongLine->setSecondPointId(secondPointId); + dialogAlongLine->setPointName(p.name()); + + dialogAlongLine->show(); + } + } +} + +void VToolAlongLine::AddToFile(){ + VPointF point = VAbstractTool::data->GetPoint(id); + QDomElement domElement = doc->createElement("point"); + + AddAttribute(domElement, "id", id); + AddAttribute(domElement, "type", "alongLine"); + AddAttribute(domElement, "name", point.name()); + AddAttribute(domElement, "mx", point.mx()/PrintDPI*25.4); + AddAttribute(domElement, "my", point.my()/PrintDPI*25.4); + + AddAttribute(domElement, "typeLine", typeLine); + AddAttribute(domElement, "length", formula); + AddAttribute(domElement, "firstPoint", firstPointId); + AddAttribute(domElement, "secondPoint", secondPointId); + + QDomElement calcElement; + bool ok = doc->GetActivCalculationElement(calcElement); + if(ok){ + calcElement.appendChild(domElement); + } else { + qCritical()<<"Не можу знайти тег калькуляції."<< Q_FUNC_INFO; + } +} diff --git a/tools/vtoolalongline.h b/tools/vtoolalongline.h new file mode 100644 index 000000000..a4ad20571 --- /dev/null +++ b/tools/vtoolalongline.h @@ -0,0 +1,30 @@ +#ifndef VTOOLALONGLINE_H +#define VTOOLALONGLINE_H + +#include "vtoolpoint.h" +#include "../dialogs/dialogalongline.h" + +class VToolAlongLine : public VToolPoint +{ + Q_OBJECT +public: + VToolAlongLine(VDomDocument *doc, VContainer *data, qint64 id, const QString &formula, + const qint64 &firstPointId, const qint64 &secondPointId, const QString &typeLine, + Tool::Enum typeCreation, QGraphicsItem * parent = 0); +public slots: + virtual void FullUpdateFromFile(); + virtual void ChangedActivDraw(const QString newName); + virtual void FullUpdateFromGui(int result); +protected: + virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); + virtual void AddToFile(); +private: + QString typeLine; + QString formula; + qint64 firstPointId; + qint64 secondPointId; + QGraphicsLineItem *mainLine; + QSharedPointer dialogAlongLine; +}; + +#endif // VTOOLALONGLINE_H diff --git a/tools/vtoolendline.cpp b/tools/vtoolendline.cpp index 6b6245692..6ee187261 100644 --- a/tools/vtoolendline.cpp +++ b/tools/vtoolendline.cpp @@ -25,9 +25,7 @@ VToolEndLine::VToolEndLine(VDomDocument *doc, VContainer *data, const qint64 &id mainLine->setVisible(true); } - QString nameLine = GetNameLine(basePointId, id); - QLineF line = QLineF(basePoint.toQPointF(), point.toQPointF()); - data->AddLine(nameLine, line.length()); + AddLine(basePointId, id); if(typeCreation == Tool::FromGui){ AddToFile(); @@ -52,9 +50,7 @@ void VToolEndLine::FullUpdateFromFile(){ 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()); - VAbstractTool::data->AddLine(nameLine, line.length()); + AddLine(basePointId, id); } void VToolEndLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ @@ -67,7 +63,8 @@ void VToolEndLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ connect(qobject_cast< VMainGraphicsScene * >(this->scene()), &VMainGraphicsScene::ChoosedObject, dialogEndLine.data(), &DialogEndLine::ChoosedPoint); - connect(dialogEndLine.data(), &DialogEndLine::DialogClosed, this, &VToolEndLine::ClosedDialogEndLine); + connect(dialogEndLine.data(), &DialogEndLine::DialogClosed, this, + &VToolEndLine::FullUpdateFromGui); connect(doc, &VDomDocument::FullUpdateFromFile, dialogEndLine.data(), &DialogEndLine::UpdateList); VPointF p = VAbstractTool::data->GetPoint(id); @@ -83,26 +80,17 @@ void VToolEndLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ } } -void VToolEndLine::ClosedDialogEndLine(int result){ +void VToolEndLine::FullUpdateFromGui(int result){ if(result == QDialog::Accepted){ - QString pointName = dialogEndLine->getPointName(); - QString typeLine = dialogEndLine->getTypeLine(); - QString formula = dialogEndLine->getFormula(); - qint32 angle = dialogEndLine->getAngle(); - qint64 basePointId = dialogEndLine->getBasePointId(); - - VPointF basePoint = VAbstractTool::data->GetPoint(basePointId); - QLineF line = QLineF(basePoint.toQPointF(), QPointF(basePoint.x()+100, basePoint.y())); - Calculator cal(VAbstractTool::data); - QString errorMsg; - qreal result = cal.eval(formula, &errorMsg); - if(errorMsg.isEmpty()){ - line.setLength(result/PrintDPI*25.4); - line.setAngle(angle); - - FullUpdateFromGui(pointName, typeLine, formula, angle, basePointId); + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + domElement.setAttribute("name", dialogEndLine->getPointName()); + domElement.setAttribute("typeLine", dialogEndLine->getTypeLine()); + domElement.setAttribute("length", dialogEndLine->getFormula()); + domElement.setAttribute("angle", QString().setNum(dialogEndLine->getAngle())); + domElement.setAttribute("basePoint", QString().setNum(dialogEndLine->getBasePointId())); + emit FullUpdateTree(); } - } dialogEndLine.clear(); } @@ -140,22 +128,3 @@ void VToolEndLine::AddToFile(){ qCritical()<<"Не можу знайти тег калькуляції."<< Q_FUNC_INFO; } } - -void VToolEndLine::FullUpdateFromGui(const QString &name, const QString &typeLine, const QString &formula, - const qreal &angle, const qint64 &basePointId){ - QDomElement domElement = doc->elementById(QString().setNum(id)); - if(domElement.isElement()){ - this->typeLine = typeLine; - this->formula = formula; - this->angle = angle; - this->basePointId = basePointId; - - domElement.setAttribute("name", name); - - domElement.setAttribute("typeLine", typeLine); - domElement.setAttribute("length", formula); - domElement.setAttribute("angle", QString().setNum(angle)); - domElement.setAttribute("basePoint", QString().setNum(basePointId)); - emit FullUpdateTree(); - } -} diff --git a/tools/vtoolendline.h b/tools/vtoolendline.h index 97c4dd2cc..fb2f3d7d9 100644 --- a/tools/vtoolendline.h +++ b/tools/vtoolendline.h @@ -16,7 +16,7 @@ public: QGraphicsItem * parent = 0); public slots: virtual void FullUpdateFromFile(); - void ClosedDialogEndLine(int result); + virtual void FullUpdateFromGui(int result); virtual void ChangedActivDraw(const QString newName); protected: virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); @@ -28,8 +28,6 @@ private: qint64 basePointId; QGraphicsLineItem *mainLine; QSharedPointer dialogEndLine; - void FullUpdateFromGui(const QString &name, const QString &typeLine, const QString &formula, - const qreal &angle, const qint64 &basePointId); }; #endif // VTOOLENDLINE_H diff --git a/tools/vtoolline.cpp b/tools/vtoolline.cpp index 92fe893b0..6d966b0fc 100644 --- a/tools/vtoolline.cpp +++ b/tools/vtoolline.cpp @@ -3,7 +3,8 @@ #include VToolLine::VToolLine(VDomDocument *doc, VContainer *data, qint64 id, qint64 firstPoint, qint64 secondPoint, - Tool::Enum typeCreation):VAbstractTool(doc, data, id){ + Tool::Enum typeCreation, QGraphicsItem *parent):VAbstractTool(doc, data, id), + QGraphicsLineItem(parent){ connect(this, &VToolLine::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree); this->firstPoint = firstPoint; this->secondPoint = secondPoint; @@ -14,9 +15,9 @@ VToolLine::VToolLine(VDomDocument *doc, VContainer *data, qint64 id, qint64 firs this->setLine(QLineF(first.toQPointF(), second.toQPointF())); this->setFlag(QGraphicsItem::ItemStacksBehindParent, true); this->setFlag(QGraphicsItem::ItemIsSelectable, true); + this->setAcceptHoverEvents(true); - QString nameLine = GetNameLine(firstPoint, secondPoint); - data->AddLine(nameLine, QLineF(first.toQPointF(), second.toQPointF()).length()); + AddLine(firstPoint, secondPoint); if(typeCreation == Tool::FromGui){ AddToFile(); @@ -32,15 +33,17 @@ void VToolLine::FullUpdateFromFile(){ 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()); + AddLine(firstPoint, secondPoint); } -void VToolLine::ClosedDialogLine(int result){ +void VToolLine::FullUpdateFromGui(int result){ if(result == QDialog::Accepted){ - qint64 firstPoint = dialogLine->getFirstPoint(); - qint64 secondPoint = dialogLine->getSecondPoint(); - FullUpdateFromGui(firstPoint, secondPoint); + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + domElement.setAttribute("firstPoint", QString().setNum(dialogLine->getFirstPoint())); + domElement.setAttribute("secondPoint", QString().setNum(dialogLine->getSecondPoint())); + emit FullUpdateTree(); + } } dialogLine.clear(); } @@ -48,9 +51,11 @@ void VToolLine::ClosedDialogLine(int result){ void VToolLine::ChangedActivDraw(const QString newName){ if(nameActivDraw == newName){ this->setPen(QPen(Qt::black, widthHairLine)); + this->setAcceptHoverEvents (true); VAbstractTool::ChangedActivDraw(newName); } else { this->setPen(QPen(Qt::gray, widthHairLine)); + this->setAcceptHoverEvents (false); VAbstractTool::ChangedActivDraw(newName); } } @@ -65,7 +70,7 @@ void VToolLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ connect(qobject_cast< VMainGraphicsScene * >(this->scene()), &VMainGraphicsScene::ChoosedObject, dialogLine.data(), &DialogLine::ChoosedPoint); - connect(dialogLine.data(), &DialogLine::DialogClosed, this, &VToolLine::ClosedDialogLine); + connect(dialogLine.data(), &DialogLine::DialogClosed, this, &VToolLine::FullUpdateFromGui); dialogLine->setFirstPoint(firstPoint); dialogLine->setSecondPoint(secondPoint); @@ -78,9 +83,7 @@ void VToolLine::contextMenuEvent(QGraphicsSceneContextMenuEvent *event){ void VToolLine::AddToFile(){ QDomElement domElement = doc->createElement("line"); - AddAttribute(domElement, "id", id); - AddAttribute(domElement, "firstPoint", firstPoint); AddAttribute(domElement, "secondPoint", secondPoint); @@ -93,14 +96,13 @@ void VToolLine::AddToFile(){ } } -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(); - } +void VToolLine::hoverMoveEvent(QGraphicsSceneHoverEvent *event){ + Q_UNUSED(event); + this->setPen(QPen(Qt::black, widthMainLine)); } + +void VToolLine::hoverLeaveEvent(QGraphicsSceneHoverEvent *event){ + Q_UNUSED(event); + this->setPen(QPen(Qt::black, widthHairLine)); +} + diff --git a/tools/vtoolline.h b/tools/vtoolline.h index f2dcf8131..a4f1b5fa4 100644 --- a/tools/vtoolline.h +++ b/tools/vtoolline.h @@ -10,19 +10,20 @@ class VToolLine: public VAbstractTool, public QGraphicsLineItem Q_OBJECT public: VToolLine(VDomDocument *doc, VContainer *data, qint64 id, qint64 firstPoint, qint64 secondPoint, - Tool::Enum typeCreation); + Tool::Enum typeCreation, QGraphicsItem * parent = 0); public slots: virtual void FullUpdateFromFile(); - void ClosedDialogLine(int result); virtual void ChangedActivDraw(const QString newName); + virtual void FullUpdateFromGui(int result); protected: virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); virtual void AddToFile(); + virtual void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); + virtual void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); 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 2488bca86..d3b44a6f8 100644 --- a/tools/vtoolpoint.cpp +++ b/tools/vtoolpoint.cpp @@ -19,6 +19,7 @@ VToolPoint::VToolPoint(VDomDocument *doc, VContainer *data, qint64 id, this->setPen(QPen(Qt::black, widthHairLine)); this->setBrush(QBrush(Qt::NoBrush)); this->setFlag(QGraphicsItem::ItemIsSelectable, true); + this->setAcceptHoverEvents(true); //Тексто мітка точки namePoint = new VGraphicsSimpleTextItem(point.name(), this); @@ -166,7 +167,9 @@ void VToolPoint::ChangedActivDraw(const QString newName){ namePoint->setFlag(QGraphicsItem::ItemIsSelectable, true); namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); namePoint->setBrush(QBrush(Qt::black)); + namePoint->setAcceptHoverEvents(true); lineName->setPen(QPen(Qt::black, widthHairLine)); + this->setAcceptHoverEvents(true); VAbstractTool::ChangedActivDraw(newName); } else { this->setPen(QPen(Qt::gray, widthHairLine)); @@ -175,7 +178,9 @@ void VToolPoint::ChangedActivDraw(const QString newName){ namePoint->setFlag(QGraphicsItem::ItemIsSelectable, false); namePoint->setFlag(QGraphicsItem::ItemSendsGeometryChanges, false); namePoint->setBrush(QBrush(Qt::gray)); + namePoint->setAcceptHoverEvents(false); lineName->setPen(QPen(Qt::gray, widthHairLine)); + this->setAcceptHoverEvents (false); VAbstractTool::ChangedActivDraw(newName); } } @@ -200,6 +205,16 @@ void VToolPoint::RefreshBaseGeometry(const QString &name, const qreal &x, const RefreshLine(); } +void VToolPoint::hoverMoveEvent(QGraphicsSceneHoverEvent *event){ + Q_UNUSED(event); + this->setPen(QPen(Qt::black, widthMainLine)); +} + +void VToolPoint::hoverLeaveEvent(QGraphicsSceneHoverEvent *event){ + Q_UNUSED(event); + this->setPen(QPen(Qt::black, widthHairLine)); +} + VToolPoint::~VToolPoint(){ } diff --git a/tools/vtoolpoint.h b/tools/vtoolpoint.h index 16601fd1a..c907b487a 100644 --- a/tools/vtoolpoint.h +++ b/tools/vtoolpoint.h @@ -17,6 +17,7 @@ public: public slots: void NameChangePosition(const QPointF pos); virtual void ChangedActivDraw(const QString newName); + virtual void FullUpdateFromGui(int result) = 0; protected: qreal radius; VGraphicsSimpleTextItem *namePoint; @@ -24,7 +25,8 @@ protected: virtual void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event ); void RefreshBaseGeometry(const QString &name, const qreal &x, const qreal &y, const qreal &mx, const qreal &my); - + virtual void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); + virtual void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); 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 496a48c45..eecfd5da4 100644 --- a/tools/vtoolsimplepoint.cpp +++ b/tools/vtoolsimplepoint.cpp @@ -9,11 +9,9 @@ #include "../options.h" #include "../container/vpointf.h" -#include "../dialogs/dialogsinglepoint.h" VToolSimplePoint::VToolSimplePoint (VDomDocument *doc, VContainer *data, qint64 id, Tool::Enum typeCreation, QGraphicsItem * parent ):VToolPoint(doc, data, id, parent){ - ignoreContextMenuEvent = false;//don't ignore context menu events; connect(this, &VToolSimplePoint::FullUpdateTree, this->doc, &VDomDocument::FullUpdateTree); if(typeCreation == Tool::FromGui){ AddToFile(); @@ -41,14 +39,18 @@ void VToolSimplePoint::AddToFile(){ } } -void VToolSimplePoint::FullUpdateFromGui(const QString &name, qreal x, qreal y){ - QDomElement domElement = doc->elementById(QString().setNum(id)); - if(domElement.isElement()){ - domElement.setAttribute("name", name); - domElement.setAttribute("x", QString().setNum(x/PrintDPI*25.4)); - domElement.setAttribute("y", QString().setNum(y/PrintDPI*25.4)); - emit FullUpdateTree(); +void VToolSimplePoint::FullUpdateFromGui(int result){ + if(result == QDialog::Accepted){ + QPointF p = dialogSinglePoint->getPoint(); + QDomElement domElement = doc->elementById(QString().setNum(id)); + if(domElement.isElement()){ + domElement.setAttribute("name", dialogSinglePoint->getName()); + domElement.setAttribute("x", QString().setNum(p.x()/PrintDPI*25.4)); + domElement.setAttribute("y", QString().setNum(p.y()/PrintDPI*25.4)); + emit FullUpdateTree(); + } } + dialogSinglePoint.clear(); } void VToolSimplePoint::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ){ @@ -57,15 +59,12 @@ void VToolSimplePoint::contextMenuEvent ( QGraphicsSceneContextMenuEvent * event QAction *actionOption = menu.addAction("Властивості"); QAction *selectedAction = menu.exec(event->screenPos()); if(selectedAction == actionOption){ - DialogSinglePoint *dialogSinglePoint = new DialogSinglePoint; + dialogSinglePoint = QSharedPointer(new DialogSinglePoint(VAbstractTool::data)); + connect(dialogSinglePoint.data(), &DialogSinglePoint::DialogClosed, this, + &VToolSimplePoint::FullUpdateFromGui); VPointF p = VAbstractTool::data->GetPoint(id); dialogSinglePoint->setData(p.name(), p.toQPointF()); - qint32 result = dialogSinglePoint->exec(); - if(result == QDialog::Accepted){ - QPointF p = dialogSinglePoint->getPoint(); - FullUpdateFromGui(dialogSinglePoint->getName(), p.x(), p.y()); - } - delete dialogSinglePoint; + dialogSinglePoint->exec(); } } } diff --git a/tools/vtoolsimplepoint.h b/tools/vtoolsimplepoint.h index 0d0bc4f41..11e1938bb 100644 --- a/tools/vtoolsimplepoint.h +++ b/tools/vtoolsimplepoint.h @@ -4,6 +4,7 @@ #include "../container/vcontainer.h" #include "../xml/vdomdocument.h" #include "vtoolpoint.h" +#include "../dialogs/dialogsinglepoint.h" class VToolSimplePoint : public VToolPoint { @@ -13,11 +14,12 @@ public: Tool::Enum typeCreation, QGraphicsItem * parent = 0 ); public slots: virtual void FullUpdateFromFile(); + virtual void FullUpdateFromGui(int result); protected: virtual void contextMenuEvent ( QGraphicsSceneContextMenuEvent * event ); virtual void AddToFile(); private: - void FullUpdateFromGui(const QString& name, qreal x, qreal y); + QSharedPointer dialogSinglePoint; }; #endif // VTOOLSIMPLEPOINT_H diff --git a/widgets/vgraphicssimpletextitem.cpp b/widgets/vgraphicssimpletextitem.cpp index 339654831..b0302f349 100644 --- a/widgets/vgraphicssimpletextitem.cpp +++ b/widgets/vgraphicssimpletextitem.cpp @@ -8,6 +8,7 @@ VGraphicsSimpleTextItem::VGraphicsSimpleTextItem( const QString & text, QGraphic this->setFlag(QGraphicsItem::ItemIsMovable, true); this->setFlag(QGraphicsItem::ItemIsSelectable, true); this->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); + this->setAcceptHoverEvents(true); } QVariant VGraphicsSimpleTextItem::itemChange(GraphicsItemChange change, const QVariant &value){ @@ -25,4 +26,14 @@ QVariant VGraphicsSimpleTextItem::itemChange(GraphicsItemChange change, const QV emit NameChangePosition(newPos); } return QGraphicsItem::itemChange(change, value); - } +} + +void VGraphicsSimpleTextItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event){ + Q_UNUSED(event); + this->setBrush(Qt::green); +} + +void VGraphicsSimpleTextItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event){ + Q_UNUSED(event); + this->setBrush(Qt::black); +} diff --git a/widgets/vgraphicssimpletextitem.h b/widgets/vgraphicssimpletextitem.h index 4a07edccc..ef8073d78 100644 --- a/widgets/vgraphicssimpletextitem.h +++ b/widgets/vgraphicssimpletextitem.h @@ -7,12 +7,14 @@ class VGraphicsSimpleTextItem : public QObject, public QGraphicsSimpleTextItem { Q_OBJECT public: - VGraphicsSimpleTextItem(QGraphicsItem * parent = 0); - VGraphicsSimpleTextItem( const QString & text, QGraphicsItem * parent = 0 ); + VGraphicsSimpleTextItem(QGraphicsItem * parent = 0); + VGraphicsSimpleTextItem( const QString & text, QGraphicsItem * parent = 0 ); signals: - void NameChangePosition(const QPointF pos); + void NameChangePosition(const QPointF pos); protected: - QVariant itemChange ( GraphicsItemChange change, const QVariant &value ); + QVariant itemChange ( GraphicsItemChange change, const QVariant &value ); + virtual void hoverMoveEvent ( QGraphicsSceneHoverEvent * event ); + virtual void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event ); }; #endif // VGRAPHICSSIMPLETEXTITEM_H diff --git a/xml/vdomdocument.cpp b/xml/vdomdocument.cpp index 19258f4c6..331fcfe50 100644 --- a/xml/vdomdocument.cpp +++ b/xml/vdomdocument.cpp @@ -4,6 +4,7 @@ #include "../tools/vtoolsimplepoint.h" #include "../tools/vtoolendline.h" #include "../tools/vtoolline.h" +#include "../tools/vtoolalongline.h" #include "../options.h" #include "../container/calculator.h" @@ -367,6 +368,7 @@ void VDomDocument::ParsePointElement(VMainGraphicsScene *scene, const QDomElemen } } } + return; } if(type == "endLine"){ if(!domElement.isNull()){ @@ -403,6 +405,43 @@ void VDomDocument::ParsePointElement(VMainGraphicsScene *scene, const QDomElemen } } } + return; + } + if(type == "alongLine"){ + if(!domElement.isNull()){ + QString name, typeLine, formula; + qreal mx=5, my=10; + qint64 id, firstPointId, secondPointId; + if(!domElement.isNull()){ + id = domElement.attribute("id", "").toLongLong(); + name = domElement.attribute("name", ""); + mx = domElement.attribute("mx","").toDouble()*PrintDPI/25.4; + my = domElement.attribute("my","").toDouble()*PrintDPI/25.4; + + typeLine = domElement.attribute("typeLine", ""); + formula = domElement.attribute("length", ""); + firstPointId = domElement.attribute("firstPoint", "").toLongLong(); + secondPointId = domElement.attribute("secondPoint", "").toLongLong(); + + VPointF firstPoint = data->GetPoint(firstPointId); + VPointF secondPoint = data->GetPoint(secondPointId); + QLineF line = QLineF(firstPoint.toQPointF(), secondPoint.toQPointF()); + Calculator cal(data); + QString errorMsg; + qreal result = cal.eval(formula, &errorMsg); + if(errorMsg.isEmpty()){ + line.setLength(result*PrintDPI/25.4); + data->UpdatePoint(id, VPointF(line.p2().x(), line.p2().y(), name, mx, my)); + if(parse == Document::FullParse){ + VToolAlongLine *point = new VToolAlongLine(this, data, id, formula, firstPointId, + secondPointId, typeLine, Tool::FromGui); + scene->addItem(point); + connect(point, &VToolAlongLine::ChoosedPoint, scene, &VMainGraphicsScene::ChoosedItem); + } + } + } + } + return; } }