diff --git a/src/backend/worksheet/WorksheetElement.h b/src/backend/worksheet/WorksheetElement.h --- a/src/backend/worksheet/WorksheetElement.h +++ b/src/backend/worksheet/WorksheetElement.h @@ -79,8 +79,14 @@ signals: friend class AbstractPlotSetHorizontalPaddingCmd; friend class AbstractPlotSetVerticalPaddingCmd; + friend class AbstractPlotSetRightPaddingCmd; + friend class AbstractPlotSetBottomPaddingCmd; + friend class AbstractPlotSetSymmetricPaddingCmd; void horizontalPaddingChanged(float); void verticalPaddingChanged(float); + void rightPaddingChanged(double); + void bottomPaddingChanged(double); + void symmetricPaddingChanged(double); void hovered(); void unhovered(); diff --git a/src/backend/worksheet/plots/AbstractPlot.h b/src/backend/worksheet/plots/AbstractPlot.h --- a/src/backend/worksheet/plots/AbstractPlot.h +++ b/src/backend/worksheet/plots/AbstractPlot.h @@ -52,6 +52,9 @@ BASIC_D_ACCESSOR_DECL(float, horizontalPadding, HorizontalPadding) BASIC_D_ACCESSOR_DECL(float, verticalPadding, VerticalPadding) + BASIC_D_ACCESSOR_DECL(double, rightPadding, RightPadding) + BASIC_D_ACCESSOR_DECL(double, bottomPadding, BottomPadding) + BASIC_D_ACCESSOR_DECL(bool, symmetricPadding, SymmetricPadding) typedef AbstractPlotPrivate Private; diff --git a/src/backend/worksheet/plots/AbstractPlot.cpp b/src/backend/worksheet/plots/AbstractPlot.cpp --- a/src/backend/worksheet/plots/AbstractPlot.cpp +++ b/src/backend/worksheet/plots/AbstractPlot.cpp @@ -96,6 +96,9 @@ BASIC_SHARED_D_READER_IMPL(AbstractPlot, float, horizontalPadding, horizontalPadding) BASIC_SHARED_D_READER_IMPL(AbstractPlot, float, verticalPadding, verticalPadding) +BASIC_SHARED_D_READER_IMPL(AbstractPlot, double, rightPadding, rightPadding) +BASIC_SHARED_D_READER_IMPL(AbstractPlot, double, bottomPadding, bottomPadding) +BASIC_SHARED_D_READER_IMPL(AbstractPlot, bool, symmetricPadding, symmetricPadding) /* ============================ setter methods and undo commands ================= */ STD_SETTER_CMD_IMPL_F_S(AbstractPlot, SetHorizontalPadding, float, horizontalPadding, retransform) @@ -112,6 +115,27 @@ exec(new AbstractPlotSetVerticalPaddingCmd(d, padding, ki18n("%1: set vertical padding"))); } +STD_SETTER_CMD_IMPL_F_S(AbstractPlot, SetRightPadding, double, rightPadding, retransform) +void AbstractPlot::setRightPadding(double padding) { + Q_D(AbstractPlot); + if (padding != d->rightPadding) + exec(new AbstractPlotSetRightPaddingCmd(d, padding, ki18n("%1: set horizontal padding"))); +} + +STD_SETTER_CMD_IMPL_F_S(AbstractPlot, SetBottomPadding, double, bottomPadding, retransform) +void AbstractPlot::setBottomPadding(double padding) { + Q_D(AbstractPlot); + if (padding != d->bottomPadding) + exec(new AbstractPlotSetBottomPaddingCmd(d, padding, ki18n("%1: set vertical padding"))); +} + +STD_SETTER_CMD_IMPL_F_S(AbstractPlot, SetSymmetricPadding, bool, symmetricPadding, retransform) +void AbstractPlot::setSymmetricPadding(bool symmetric) { + Q_D(AbstractPlot); + if (symmetric != d->symmetricPadding) + exec(new AbstractPlotSetSymmetricPaddingCmd(d, symmetric, ki18n("%1: set horizontal padding"))); +} + //################################################################ //################### Private implementation ##################### //################################################################ diff --git a/src/backend/worksheet/plots/AbstractPlotPrivate.h b/src/backend/worksheet/plots/AbstractPlotPrivate.h --- a/src/backend/worksheet/plots/AbstractPlotPrivate.h +++ b/src/backend/worksheet/plots/AbstractPlotPrivate.h @@ -41,6 +41,9 @@ float horizontalPadding; //horiz. offset between the plot area and the area defining the coordinate system, in scene units float verticalPadding; //vert. offset between the plot area and the area defining the coordinate system, in scene units + double rightPadding; + double bottomPadding; + bool symmetricPadding; }; #endif diff --git a/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp b/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp --- a/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp +++ b/src/backend/worksheet/plots/cartesian/CartesianPlot.cpp @@ -149,6 +149,9 @@ //offset between the plot area and the area defining the coordinate system, in scene units. d->horizontalPadding = Worksheet::convertToSceneUnits(1.5, Worksheet::Centimeter); d->verticalPadding = Worksheet::convertToSceneUnits(1.5, Worksheet::Centimeter); + d->rightPadding = Worksheet::convertToSceneUnits(1.5, Worksheet::Centimeter); + d->bottomPadding = Worksheet::convertToSceneUnits(1.5, Worksheet::Centimeter); + d->symmetricPadding = true; connect(this, &AbstractAspect::aspectAdded, this, &CartesianPlot::childAdded); connect(this, &AbstractAspect::aspectRemoved, this, &CartesianPlot::childRemoved); @@ -2191,9 +2194,6 @@ auto* plot = dynamic_cast(q); QVector scales; - //perform the mapping from the scene coordinates to the plot's coordinates here. - QRectF itemRect = mapRectFromScene(rect); - //check ranges for log-scales if (xScale != CartesianPlot::ScaleLinear) checkXRange(); @@ -2205,8 +2205,8 @@ double sceneStart, sceneEnd, logicalStart, logicalEnd; //create x-scales - int plotSceneStart = itemRect.x() + horizontalPadding; - int plotSceneEnd = itemRect.x() + itemRect.width() - horizontalPadding; + int plotSceneStart = dataRect.x(); + int plotSceneEnd = dataRect.x() + dataRect.width(); if (!hasValidBreak) { //no breaks available -> range goes from the plot beginning to the end of the plot sceneStart = plotSceneStart; @@ -2260,8 +2260,8 @@ //create y-scales scales.clear(); - plotSceneStart = itemRect.y()+itemRect.height()-verticalPadding; - plotSceneEnd = itemRect.y()+verticalPadding; + plotSceneStart = dataRect.y() + dataRect.height(); + plotSceneEnd = dataRect.y(); if (!hasValidBreak) { //no breaks available -> range goes from the plot beginning to the end of the plot sceneStart = plotSceneStart; @@ -2392,10 +2392,28 @@ */ void CartesianPlotPrivate::updateDataRect() { dataRect = mapRectFromScene(rect); - dataRect.setX(dataRect.x() + horizontalPadding); - dataRect.setY(dataRect.y() + verticalPadding); - dataRect.setWidth(dataRect.width() - horizontalPadding); - dataRect.setHeight(dataRect.height() - verticalPadding); + + double paddingLeft = horizontalPadding; + double paddingRight = rightPadding; + double paddingTop = verticalPadding; + double paddingBottom = bottomPadding; + if (symmetricPadding) { + paddingRight = horizontalPadding; + paddingBottom = verticalPadding; + } + + dataRect.setX(dataRect.x() + paddingLeft); + dataRect.setY(dataRect.y() + paddingTop); + + double newHeight = dataRect.height() - paddingBottom; + if (newHeight < 0) + newHeight = 0; + dataRect.setHeight(newHeight); + + double newWidth = dataRect.width() - paddingRight; + if (newWidth < 0) + newWidth = 0; + dataRect.setWidth(newWidth); } void CartesianPlotPrivate::rangeChanged() { diff --git a/src/kdefrontend/dockwidgets/CartesianPlotDock.h b/src/kdefrontend/dockwidgets/CartesianPlotDock.h --- a/src/kdefrontend/dockwidgets/CartesianPlotDock.h +++ b/src/kdefrontend/dockwidgets/CartesianPlotDock.h @@ -123,8 +123,11 @@ void borderWidthChanged(double); void borderCornerRadiusChanged(double); void borderOpacityChanged(int); + void symmetricPaddingChanged(bool); void horizontalPaddingChanged(double); + void rightPaddingChanged(double); void verticalPaddingChanged(double); + void bottomPaddingChanged(double); //SLOTs for changes triggered in CartesianPlot //general @@ -169,6 +172,9 @@ void plotBorderOpacityChanged(float); void plotHorizontalPaddingChanged(float); void plotVerticalPaddingChanged(float); + void plotRightPaddingChanged(double); + void plotBottomPaddingChanged(double); + void plotSymmetricPaddingChanged(bool); //save/load template void loadConfigFromTemplate(KConfig&); diff --git a/src/kdefrontend/dockwidgets/CartesianPlotDock.cpp b/src/kdefrontend/dockwidgets/CartesianPlotDock.cpp --- a/src/kdefrontend/dockwidgets/CartesianPlotDock.cpp +++ b/src/kdefrontend/dockwidgets/CartesianPlotDock.cpp @@ -177,6 +177,9 @@ //Padding connect( ui.sbPaddingHorizontal, SIGNAL(valueChanged(double)), this, SLOT(horizontalPaddingChanged(double)) ); connect( ui.sbPaddingVertical, SIGNAL(valueChanged(double)), this, SLOT(verticalPaddingChanged(double)) ); + connect( ui.sbPaddingRight, QOverload::of(&QDoubleSpinBox::valueChanged), this, &CartesianPlotDock::rightPaddingChanged); + connect( ui.sbPaddingBottom, QOverload::of(&QDoubleSpinBox::valueChanged), this, &CartesianPlotDock::bottomPaddingChanged); + connect( ui.cbPaddingSymmetric, &QCheckBox::toggled, this, &CartesianPlotDock::symmetricPaddingChanged); //theme and template handlers auto* frame = new QFrame(this); @@ -286,6 +289,19 @@ ui.leComment->setText(QString()); } + bool symmectric = m_plot->symmetricPadding(); + ui.lPaddingHorizontalRight->setVisible(!symmectric); + ui.sbPaddingRight->setVisible(!symmectric); + ui.lPaddingVerticalDown->setVisible(!symmectric); + ui.sbPaddingBottom->setVisible(!symmectric); + if (symmectric) { + ui.lPaddingHorizontal->setText(i18n("Horizontal")); + ui.lPaddingVertical->setText(i18n("Vertical")); + } else { + ui.lPaddingHorizontal->setText(i18n("Left")); + ui.lPaddingVertical->setText(i18n("Top")); + } + ui.leName->setStyleSheet(""); ui.leName->setToolTip(""); @@ -347,6 +363,9 @@ connect( m_plot->plotArea(), SIGNAL(borderOpacityChanged(float)), this, SLOT(plotBorderOpacityChanged(float)) ); connect( m_plot, SIGNAL(horizontalPaddingChanged(float)), this, SLOT(plotHorizontalPaddingChanged(float)) ); connect( m_plot, SIGNAL(verticalPaddingChanged(float)), this, SLOT(plotVerticalPaddingChanged(float)) ); + connect(m_plot, &CartesianPlot::rightPaddingChanged, this, &CartesianPlotDock::plotRightPaddingChanged); + connect(m_plot, &CartesianPlot::bottomPaddingChanged, this, &CartesianPlotDock::plotBottomPaddingChanged); + connect(m_plot, &CartesianPlot::symmetricPaddingChanged, this, &CartesianPlotDock::plotSymmetricPaddingChanged); m_initializing = false; } @@ -1141,38 +1160,76 @@ plot->plotArea()->setBorderOpacity(opacity); } +void CartesianPlotDock::symmetricPaddingChanged(bool checked) { + if (m_initializing) + return; + + ui.lPaddingHorizontalRight->setVisible(!checked); + ui.sbPaddingRight->setVisible(!checked); + ui.lPaddingVerticalDown->setVisible(!checked); + ui.sbPaddingBottom->setVisible(!checked); + + if (checked) { + ui.lPaddingHorizontal->setText(i18n("Horizontal")); + ui.lPaddingVertical->setText(i18n("Vertical")); + } else { + ui.lPaddingHorizontal->setText(i18n("Left")); + ui.lPaddingVertical->setText(i18n("Top")); + } + + for (auto* plot : m_plotList) + plot->setSymmetricPadding(checked); + + if (checked) { + rightPaddingChanged(ui.sbPaddingHorizontal->value()); + bottomPaddingChanged(ui.sbPaddingVertical->value()); + } +} + void CartesianPlotDock::horizontalPaddingChanged(double value) { if (m_initializing) return; double padding = Worksheet::convertToSceneUnits(value, Worksheet::Centimeter); - for (auto* plot : m_plotList) { - if (plot->rect().width() > 2*padding) { + for (auto* plot : m_plotList) plot->setHorizontalPadding(padding); - } else { // preventing that padding is bigger than the size of the plot - m_initializing = true; - ui.sbPaddingHorizontal->setValue(Worksheet::convertFromSceneUnits(plot->horizontalPadding(), Worksheet::Centimeter)); - m_initializing = false; - } + + if (m_plot->symmetricPadding()) { + for (auto* plot: m_plotList) + plot->setRightPadding(padding); } } +void CartesianPlotDock::rightPaddingChanged(double value) { + if (m_initializing) + return; + double padding = Worksheet::convertToSceneUnits(value, Worksheet::Centimeter); + for (auto* plot : m_plotList) + plot->setRightPadding(padding); +} + void CartesianPlotDock::verticalPaddingChanged(double value) { if (m_initializing) return; // TODO: find better solution (set spinbox range). When plot->rect().width() does change? double padding = Worksheet::convertToSceneUnits(value, Worksheet::Centimeter); - for (auto* plot : m_plotList) { - if (plot->rect().height() > 2 * padding) { - plot->setVerticalPadding(padding); - } else { // preventing that padding is bigger than the size of the plot - m_initializing = true; - ui.sbPaddingVertical->setValue(Worksheet::convertFromSceneUnits(plot->verticalPadding(), Worksheet::Centimeter)); - m_initializing = false; - } + for (auto* plot : m_plotList) + plot->setVerticalPadding(padding); + + if (m_plot->symmetricPadding()) { + for (auto* plot: m_plotList) + plot->setBottomPadding(padding); } } +void CartesianPlotDock::bottomPaddingChanged(double value) { + if (m_initializing) + return; + double padding = Worksheet::convertToSceneUnits(value, Worksheet::Centimeter); + for (auto* plot : m_plotList) + plot->setBottomPadding(padding); +} + //************************************************************* //****** SLOTs for changes triggered in CartesianPlot ********* //************************************************************* @@ -1402,6 +1459,24 @@ m_initializing = false; } +void CartesianPlotDock::plotRightPaddingChanged(double value) { + m_initializing = true; + ui.sbPaddingRight->setValue(Worksheet::convertFromSceneUnits(value, Worksheet::Centimeter)); + m_initializing = false; +} + +void CartesianPlotDock::plotBottomPaddingChanged(double value) { + m_initializing = true; + ui.sbPaddingBottom->setValue(Worksheet::convertFromSceneUnits(value, Worksheet::Centimeter)); + m_initializing = false; +} + +void CartesianPlotDock::plotSymmetricPaddingChanged(bool symmetric) { + m_initializing = true; + ui.cbPaddingSymmetric->setChecked(symmetric); + m_initializing = false; +} + //************************************************************* //******************** SETTINGS ******************************* //************************************************************* @@ -1515,6 +1590,9 @@ //Padding ui.sbPaddingHorizontal->setValue( Worksheet::convertFromSceneUnits(m_plot->horizontalPadding(), Worksheet::Centimeter) ); ui.sbPaddingVertical->setValue( Worksheet::convertFromSceneUnits(m_plot->verticalPadding(), Worksheet::Centimeter) ); + ui.sbPaddingRight->setValue(Worksheet::convertFromSceneUnits(m_plot->rightPadding(), Worksheet::Centimeter)); + ui.sbPaddingBottom->setValue(Worksheet::convertFromSceneUnits(m_plot->bottomPadding(), Worksheet::Centimeter)); + ui.cbPaddingSymmetric->setChecked(m_plot->symmetricPadding()); //Border ui.kcbBorderColor->setColor( m_plot->plotArea()->borderPen().color() ); @@ -1551,6 +1629,9 @@ ui.sbBackgroundOpacity->setValue( round(group.readEntry("BackgroundOpacity", m_plot->plotArea()->backgroundOpacity())*100.0) ); ui.sbPaddingHorizontal->setValue(Worksheet::convertFromSceneUnits(group.readEntry("HorizontalPadding", m_plot->horizontalPadding()), Worksheet::Centimeter)); ui.sbPaddingVertical->setValue(Worksheet::convertFromSceneUnits(group.readEntry("VerticalPadding", m_plot->verticalPadding()), Worksheet::Centimeter)); + ui.sbPaddingRight->setValue(Worksheet::convertFromSceneUnits(group.readEntry("RightPadding", m_plot->rightPadding()), Worksheet::Centimeter)); + ui.sbPaddingBottom->setValue(Worksheet::convertFromSceneUnits(group.readEntry("BottomPadding", m_plot->bottomPadding()), Worksheet::Centimeter)); + ui.cbPaddingSymmetric->setChecked(group.readEntry("SymmetricPadding", m_plot->symmetricPadding())); //Border-tab ui.kcbBorderColor->setColor( group.readEntry("BorderColor", m_plot->plotArea()->borderPen().color()) ); @@ -1589,6 +1670,9 @@ group.writeEntry("BackgroundOpacity", ui.sbBackgroundOpacity->value()/100.0); group.writeEntry("HorizontalPadding", Worksheet::convertToSceneUnits(ui.sbPaddingHorizontal->value(), Worksheet::Centimeter)); group.writeEntry("VerticalPadding", Worksheet::convertToSceneUnits(ui.sbPaddingVertical->value(), Worksheet::Centimeter)); + group.writeEntry("RightPadding", Worksheet::convertToSceneUnits(ui.sbPaddingRight->value(), Worksheet::Centimeter)); + group.writeEntry("BottomPadding", Worksheet::convertToSceneUnits(ui.sbPaddingBottom->value(), Worksheet::Centimeter)); + group.writeEntry("SymmetricPadding", ui.cbPaddingSymmetric->isChecked()); //Border group.writeEntry("BorderStyle", ui.cbBorderStyle->currentIndex()); diff --git a/src/kdefrontend/ui/dockwidgets/cartesianplotdock.ui b/src/kdefrontend/ui/dockwidgets/cartesianplotdock.ui --- a/src/kdefrontend/ui/dockwidgets/cartesianplotdock.ui +++ b/src/kdefrontend/ui/dockwidgets/cartesianplotdock.ui @@ -7,7 +7,7 @@ 0 0 528 - 1406 + 1059 @@ -17,7 +17,7 @@ - 0 + 3 @@ -49,7 +49,7 @@ - + true @@ -63,7 +63,7 @@ - + true @@ -311,7 +311,7 @@ Auto - + true @@ -328,7 +328,7 @@ Auto - + true @@ -429,7 +429,7 @@ Auto - + true @@ -446,7 +446,7 @@ Auto - + true @@ -725,7 +725,16 @@ 0 - + + 0 + + + 0 + + + 0 + + 0 @@ -838,144 +847,85 @@ Plot Area - - - - - 75 - true - + + + + pt - - Background + + 0.500000000000000 - - + + - Type: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 23 - - - - - - - - - 0 - 0 - + Style: - - + + - File name: + Opacity: - - - - Specify the name of the image file. - - - true + + + + - - - - - - - 0 - 0 - + + cm - - Select the file to import + + 1000.000000000000000 - - + + 0.100000000000000 - - + + - Style: + Opacity: - - - - - + + - Style: + Type: - - - Style: - - - - - - - First color: + + + + Qt::Vertical - - - - - - - - - Second color: + + QSizePolicy::Fixed - - - - - - - - - Opacity: + + + 72 + 18 + - + - - + + 0 @@ -1021,6 +971,59 @@ + + + + Horizontal: + + + + + + + + 0 + 0 + + + + + + + + Width: + + + + + + + cm + + + 1000.000000000000000 + + + 0.100000000000000 + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 23 + + + + @@ -1034,20 +1037,29 @@ - - + + + + + 75 + true + + - Style: + Padding - - - - - 0 - 0 - + + + + + 75 + true + + + + Background @@ -1058,37 +1070,56 @@ - - - - - 0 - 0 - + + + + Right - - + + + + cm + + + 1000.000000000000000 + + + 0.100000000000000 + + + + + - Width: + First color: - - - - pt + + + + + + + + 0 + 0 + - - 0.500000000000000 + + Select the file to import + + + - - + + - Corner radius: + Style: @@ -1102,15 +1133,25 @@ - - + + + + Specify the name of the image file. + + + true + + + + + - Opacity: + Corner radius: - - + + 0 @@ -1140,66 +1181,84 @@ - - + + Qt::Vertical - - QSizePolicy::Fixed - - 72 - 18 + 20 + 79 - - - - - 75 - true - + + + + + + + + + + + + + + 0 + 0 + + + + + - Padding + Style: - - + + - Horizontal: + Second color: - - - - - - - cm - - - 1000.000000000000000 + + + + Vertical: - - 0.100000000000000 + + + + + + Bottom - - + + - Vertical: + File name: - + + + + + 0 + 0 + + + + + @@ -1215,18 +1274,22 @@ - - - - Qt::Vertical + + + + + + + Symmetric - - - 20 - 79 - + + + + + + - + @@ -1241,6 +1304,69 @@
kcolorbutton.h
+ + tabWidget + leName + leComment + sbLeft + sbTop + sbWidth + sbHeight + rbRangeLast + leRangeLast + rbRangeFirst + leRangeFirst + rbRangeFree + chkAutoScaleX + cbXRangeFormat + leXMin + leXMax + dateTimeEditXMin + dateTimeEditXMax + cbXScaling + chkAutoScaleY + cbYRangeFormat + leYMin + leYMax + dateTimeEditYMin + dateTimeEditYMax + cbYScaling + chkVisible + chkXBreak + bAddXBreak + bRemoveXBreak + cbXBreak + leXBreakStart + leXBreakEnd + sbXBreakPosition + cbXBreakStyle + chkYBreak + bAddYBreak + bRemoveYBreak + cbYBreak + leYBreakStart + leYBreakEnd + sbYBreakPosition + cbYBreakStyle + cbBackgroundType + leBackgroundFileName + bOpen + cbBackgroundColorStyle + cbBackgroundImageStyle + cbBackgroundBrushStyle + kcbBackgroundFirstColor + kcbBackgroundSecondColor + sbBackgroundOpacity + cbBorderStyle + kcbBorderColor + sbBorderWidth + sbBorderCornerRadius + sbBorderOpacity + sbPaddingHorizontal + sbPaddingVertical + sbPaddingRight + sbPaddingBottom +