From 8be95376f1ec56238072d85cc2434a8b40c43bbd Mon Sep 17 00:00:00 2001 From: Ronan Le Tiec Date: Sun, 19 Apr 2020 11:58:43 +0200 Subject: [PATCH] work on units, layout and reader --- src/app/puzzle/puzzlemainwindow.cpp | 96 ++++++++++++++++- src/app/puzzle/puzzlemainwindow.h | 19 ++++ src/app/puzzle/vpuzzlelayout.cpp | 60 +++++++++++ src/app/puzzle/vpuzzlelayout.h | 102 +++++++++++++++++++ src/app/puzzle/xml/vpuzzlelayoutfilereader.h | 3 + 5 files changed, 276 insertions(+), 4 deletions(-) diff --git a/src/app/puzzle/puzzlemainwindow.cpp b/src/app/puzzle/puzzlemainwindow.cpp index ae062dd68..4c529dac3 100644 --- a/src/app/puzzle/puzzlemainwindow.cpp +++ b/src/app/puzzle/puzzlemainwindow.cpp @@ -38,7 +38,7 @@ PuzzleMainWindow::PuzzleMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::PuzzleMainWindow), pieceCarrousel(new VPieceCarrousel), - m_layout (new VPuzzleLayout) + m_layout (nullptr) { ui->setupUi(this); @@ -47,9 +47,13 @@ PuzzleMainWindow::PuzzleMainWindow(QWidget *parent) : InitPieceCarrousel(); - // for test purposes, to be removed when we can edit the size / margins through the UI: - m_layout->SetLayoutMargins(1.5, 2.00, 4.21, 0.25); - m_layout->SetLayoutSize(21.0, 29.7); + // ----- for test purposes, to be removed------------------ + m_layout = new VPuzzleLayout(); + m_layout->SetLayoutMarginsConverted(1.5, 2.00, 4.21, 0.25); + m_layout->SetLayoutSizeConverted(21.0, 29.7); + m_layout->SetPiecesGapConverted(1); + m_layout->SetUnit(Unit::Cm); + SetPropertiesData(); } //--------------------------------------------------------------------------------------------------------------------- @@ -233,6 +237,90 @@ void PuzzleMainWindow::InitPieceCarrousel() } +//--------------------------------------------------------------------------------------------------------------------- +void PuzzleMainWindow::SetPropertiesData() +{ + if(m_layout == nullptr) + { + // TODO : hide the tabs when there is no layout + } + else + { + SetPropertyTabCurrentPieceData(); + SetPropertyTabLayoutData(); + SetPropertyTabTilesData(); + SetPropertyTabLayersData(); + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void PuzzleMainWindow::SetPropertyTabCurrentPieceData() +{ + if(m_selectedPiece == nullptr) + { + if(false) // check for multiple piece selection + { + // TODO in the future + } + else + { + // TODO : update current piece data to show a "no current piece selected" + } + } + else + { + // TODO set the values of the piece currently selected + } +} + +//--------------------------------------------------------------------------------------------------------------------- +void PuzzleMainWindow::SetPropertyTabLayoutData() +{ + // set Unit + int index = ui->comboBoxLayoutUnit->findData(QVariant(UnitsToStr(m_layout->getUnit()))); + if(index != -1) + { + ui->comboBoxLayoutUnit->blockSignals(true); // FIXME: is there a better way to block the signals? + ui->comboBoxLayoutUnit->setCurrentIndex(index); + ui->comboBoxLayoutUnit->blockSignals(false); + } + + // set Width / Length + QSizeF size = m_layout->GetLayoutSizeConverted(); + SetDoubleSpinBoxValue(ui->doubleSpinBoxLayoutWidth, size.width()); + SetDoubleSpinBoxValue(ui->doubleSpinBoxLayoutLength, size.height()); + + // set margins + QMarginsF margins = m_layout->GetLayoutMarginsConverted(); + SetDoubleSpinBoxValue(ui->doubleSpinBoxLayoutMarginLeft, margins.left()); + SetDoubleSpinBoxValue(ui->doubleSpinBoxLayoutMarginTop, margins.top()); + SetDoubleSpinBoxValue(ui->doubleSpinBoxLayoutMarginRight, margins.right()); + SetDoubleSpinBoxValue(ui->doubleSpinBoxLayoutMarginBottom, margins.bottom()); + + // set pieces gap + SetDoubleSpinBoxValue(ui->doubleSpinBoxLayoutPiecesGap, m_layout->GetPiecesGapConverted()); +} + +//--------------------------------------------------------------------------------------------------------------------- +void PuzzleMainWindow::SetPropertyTabTilesData() +{ + +} + +//--------------------------------------------------------------------------------------------------------------------- +void PuzzleMainWindow::SetPropertyTabLayersData() +{ + +} + + +//--------------------------------------------------------------------------------------------------------------------- +void PuzzleMainWindow::SetDoubleSpinBoxValue(QDoubleSpinBox *spinBox, qreal value) +{ + spinBox->blockSignals(true); + spinBox->setValue(value); + spinBox->blockSignals(false); +} //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/puzzle/puzzlemainwindow.h b/src/app/puzzle/puzzlemainwindow.h index ae99ecd94..a991176df 100644 --- a/src/app/puzzle/puzzlemainwindow.h +++ b/src/app/puzzle/puzzlemainwindow.h @@ -30,10 +30,12 @@ #include #include +#include #include "../vmisc/def.h" #include "vpiececarrousel.h" #include "vpuzzlelayout.h" +#include "vpuzzlepiece.h" namespace Ui { @@ -62,6 +64,8 @@ private: VPuzzleLayout *m_layout; + VPuzzlePiece *m_selectedPiece; + void InitMenuBar(); void InitProperties(); @@ -71,6 +75,21 @@ private: void InitPropertyTabLayers(); void InitPieceCarrousel(); + + void SetPropertiesData(); + void SetPropertyTabCurrentPieceData(); + void SetPropertyTabLayoutData(); + void SetPropertyTabTilesData(); + void SetPropertyTabLayersData(); + + /** + * @brief SetDoubleSpinBoxValue sets the given spinbox to the given value + * the signals are blocked before changing the value and unblocked after + * @param spinbox + * @param value + */ + void SetDoubleSpinBoxValue(QDoubleSpinBox *spinBox, qreal value); + private slots: void Open(); void Save(); diff --git a/src/app/puzzle/vpuzzlelayout.cpp b/src/app/puzzle/vpuzzlelayout.cpp index 31bd4dca6..94a17547d 100644 --- a/src/app/puzzle/vpuzzlelayout.cpp +++ b/src/app/puzzle/vpuzzlelayout.cpp @@ -95,18 +95,45 @@ void VPuzzleLayout::SetLayoutSize(qreal width, qreal height) m_size.setHeight(height); } +//--------------------------------------------------------------------------------------------------------------------- +void VPuzzleLayout::SetLayoutSizeConverted(qreal width, qreal height) +{ + m_size.setWidth(UnitConvertor(width, m_unit,Unit::Px)); + m_size.setHeight(UnitConvertor(height, m_unit,Unit::Px)); +} + //--------------------------------------------------------------------------------------------------------------------- void VPuzzleLayout::SetLayoutSize(QSizeF size) { m_size = size; } +//--------------------------------------------------------------------------------------------------------------------- +void VPuzzleLayout::SetLayoutSizeConverted(QSizeF size) +{ + m_size = QSizeF( + UnitConvertor(size.width(), m_unit,Unit::Px), + UnitConvertor(size.height(), m_unit,Unit::Px) + ); +} + //--------------------------------------------------------------------------------------------------------------------- QSizeF VPuzzleLayout::GetLayoutSize() { return m_size; } +//--------------------------------------------------------------------------------------------------------------------- +QSizeF VPuzzleLayout::GetLayoutSizeConverted() +{ + QSizeF convertedSize = QSizeF( + UnitConvertor(m_size.width(), Unit::Px, m_unit), + UnitConvertor(m_size.height(), Unit::Px, m_unit) + ); + + return convertedSize; +} + //--------------------------------------------------------------------------------------------------------------------- void VPuzzleLayout::SetLayoutMargins(qreal left, qreal top, qreal right, qreal bottom) { @@ -115,6 +142,14 @@ void VPuzzleLayout::SetLayoutMargins(qreal left, qreal top, qreal right, qreal b m_margins.setRight(right); m_margins.setBottom(bottom); } +//--------------------------------------------------------------------------------------------------------------------- +void VPuzzleLayout::SetLayoutMarginsConverted(qreal left, qreal top, qreal right, qreal bottom) +{ + m_margins.setLeft(UnitConvertor(left, m_unit, Unit::Px)); + m_margins.setTop(UnitConvertor(top, m_unit, Unit::Px)); + m_margins.setRight(UnitConvertor(right, m_unit, Unit::Px)); + m_margins.setBottom(UnitConvertor(bottom, m_unit, Unit::Px)); +} //--------------------------------------------------------------------------------------------------------------------- void VPuzzleLayout::SetLayoutMargins(QMarginsF margins) @@ -122,12 +157,24 @@ void VPuzzleLayout::SetLayoutMargins(QMarginsF margins) m_margins = margins; } +//--------------------------------------------------------------------------------------------------------------------- +void VPuzzleLayout::SetLayoutMarginsConverted(QMarginsF margins) +{ + m_margins = UnitConvertor(margins, m_unit, Unit::Px); +} + //--------------------------------------------------------------------------------------------------------------------- QMarginsF VPuzzleLayout::GetLayoutMargins() { return m_margins; } +//--------------------------------------------------------------------------------------------------------------------- +QMarginsF VPuzzleLayout::GetLayoutMarginsConverted() +{ + return UnitConvertor(m_margins, Unit::Px, m_unit); +} + //--------------------------------------------------------------------------------------------------------------------- void VPuzzleLayout::SetFollowGrainline(FollowGrainline state) { @@ -146,12 +193,25 @@ void VPuzzleLayout::SetPiecesGap(qreal value) m_piecesGap = value; } +//--------------------------------------------------------------------------------------------------------------------- +void VPuzzleLayout::SetPiecesGapConverted(qreal value) +{ + m_piecesGap = UnitConvertor(value, m_unit, Unit::Px); +} + //--------------------------------------------------------------------------------------------------------------------- qreal VPuzzleLayout::GetPiecesGap() { return m_piecesGap; } +//--------------------------------------------------------------------------------------------------------------------- +qreal VPuzzleLayout::GetPiecesGapConverted() +{ + return UnitConvertor(m_piecesGap, Unit::Px, m_unit); +} + + //--------------------------------------------------------------------------------------------------------------------- void VPuzzleLayout::SetWarningSuperpositionOfPieces(bool state) { diff --git a/src/app/puzzle/vpuzzlelayout.h b/src/app/puzzle/vpuzzlelayout.h index 2f35c6e73..be8e198f8 100644 --- a/src/app/puzzle/vpuzzlelayout.h +++ b/src/app/puzzle/vpuzzlelayout.h @@ -53,20 +53,112 @@ public: void SetUnit(Unit unit); Unit getUnit(); + /** + * @brief SetLayoutSize sets the size of the layout, the values have to be in Unit::Px + * @param width + * @param height + */ void SetLayoutSize(qreal width, qreal height); + + /** + * @brief SetLayoutSize sets the size of the layout, the values have to be in the layout's unit + * @param width + * @param height + */ + void SetLayoutSizeConverted(qreal width, qreal height); + + /** + * @brief SetLayoutSize sets the size of the layout, the values have to be in Unit::Px + * @param size + */ void SetLayoutSize(QSizeF size); + /** + * @brief SetLayoutSizeConverted sets the size of the layout, the values have to be in the layout's unit + * @param size + */ + void SetLayoutSizeConverted(QSizeF size); + + /** + * @brief GetLayoutSize Returns the size in Unit::Px + * @return + */ QSizeF GetLayoutSize(); + /** + * @brief GetLayoutSizeConverted Returns the size in the layout's unit + * @return + */ + QSizeF GetLayoutSizeConverted(); + + /** + * @brief SetLayoutMargins, set the margins of the layout, the values have to be in Unit::Px + * @param left in Unit::Px + * @param top in Unit::Px + * @param right in Unit::Px + * @param bottom in Unit::Px + */ void SetLayoutMargins(qreal left, qreal top, qreal right, qreal bottom); + + /** + * @brief SetLayoutMargins, set the margins of the layout, the values have to be in the unit of the layout + * @param left in Unit::Px + * @param top in Unit::Px + * @param right in Unit::Px + * @param bottom in Unit::Px + */ + void SetLayoutMarginsConverted(qreal left, qreal top, qreal right, qreal bottom); + + /** + * @brief SetLayoutMargins set the margins of the layout, the values have to be in Unit::Px + * @param margins + */ void SetLayoutMargins(QMarginsF margins); + + /** + * @brief SetLayoutMargins set the margins of the layout, the values have to be in the unit of the layout + * @param margins + */ + void SetLayoutMarginsConverted(QMarginsF margins); + + /** + * @brief GetLayoutMargins Returns the size in Unit::Px + * @return + */ QMarginsF GetLayoutMargins(); + /** + * @brief GetLayoutMarginsConverted Returns the margins in the layout's unit + * @return + */ + QMarginsF GetLayoutMarginsConverted(); + void SetFollowGrainline(FollowGrainline state); FollowGrainline SetFollowGrainline(); + /** + * @brief SetPiecesGap sets the pieces gap to the given value, the unit has to be in Unit::Px + * @param value + */ void SetPiecesGap(qreal value); + + /** + * @brief SetPiecesGapConverted sets the pieces gap to the given value, the unit has to be in the layout's unit + * @param value + */ + void SetPiecesGapConverted(qreal value); + + /** + * @brief GetPiecesGap returns the pieces gap in Unit::Px + * @return + */ qreal GetPiecesGap(); + /** + * @brief GetPiecesGapConverted returns the pieces gap in the layout's unit + * @return + */ + qreal GetPiecesGapConverted(); + void SetWarningSuperpositionOfPieces(bool state); bool GetWarningSuperpositionOfPieces(); @@ -83,13 +175,23 @@ private: // format Unit m_unit; + /** + * @brief m_size the Size in Unit::Px + */ QSizeF m_size; // margins + /** + * @brief m_margins the margins in Unit::Px + */ QMarginsF m_margins; // control FollowGrainline m_followGrainLine; + + /** + * @brief m_piecesGap the pieces gap in Unit::Px + */ qreal m_piecesGap; bool m_warningSuperpositionOfPieces; bool m_warningPiecesOutOfBound; diff --git a/src/app/puzzle/xml/vpuzzlelayoutfilereader.h b/src/app/puzzle/xml/vpuzzlelayoutfilereader.h index 8ec5eb5ce..4a97f1b39 100644 --- a/src/app/puzzle/xml/vpuzzlelayoutfilereader.h +++ b/src/app/puzzle/xml/vpuzzlelayoutfilereader.h @@ -44,6 +44,9 @@ public: bool ReadFile(VPuzzleLayout *layout, QFile *file); private: + /** + * @brief m_layoutFormatVersion holds the version of the layout currently being read + */ int m_layoutFormatVersion; void ReadLayout(VPuzzleLayout *layout);