diff --git a/src/backend/worksheet/plots/cartesian/CartesianPlot.h b/src/backend/worksheet/plots/cartesian/CartesianPlot.h --- a/src/backend/worksheet/plots/cartesian/CartesianPlot.h +++ b/src/backend/worksheet/plots/cartesian/CartesianPlot.h @@ -236,7 +236,7 @@ void xDataChanged(); void yDataChanged(); - void HistogramdataChanged(); + void HistogramDataChanged(); void xHistogramDataChanged(); void yHistogramDataChanged(); void curveVisibilityChanged(); 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 @@ -522,7 +522,7 @@ addNewMenu = new QMenu(i18n("Add new")); addNewMenu->addAction(addCurveAction); -// addNewMenu->addAction(addHistogramPlot); + addNewMenu->addAction(addHistogramPlot); addNewMenu->addAction(addEquationCurveAction); addNewMenu->addSeparator(); addNewMenu->addAction(addDataReductionCurveAction); @@ -1276,7 +1276,7 @@ } else { const Histogram* histo = qobject_cast(child); if (histo) { - connect(histo, SIGNAL(HistogramdataChanged()), this, SLOT(HistogramdataChanged())); + connect(histo, SIGNAL(HistogramDataChanged()), this, SLOT(HistogramDataChanged())); connect(histo, SIGNAL(xHistogramDataChanged()), this, SLOT(xHistogramDataChanged())); connect(histo, SIGNAL(yHistogramDataChanged()), this, SLOT(yHistogramDataChanged())); connect(histo, SIGNAL(visibilityChanged(bool)), this, SLOT(curveVisibilityChanged())); @@ -1383,7 +1383,7 @@ } } -void CartesianPlot::HistogramdataChanged() { +void CartesianPlot::HistogramDataChanged() { Q_D(CartesianPlot); d->curvesXMinMaxIsDirty = true; d->curvesYMinMaxIsDirty = true; @@ -1393,17 +1393,15 @@ this->scaleAutoY(); else if (d->autoScaleY) this->scaleAutoY(); + Histogram* curve = dynamic_cast(QObject::sender()); + if (curve) + curve->retransform(); else { - Histogram* curve = dynamic_cast(QObject::sender()); - if (curve) - curve->retransform(); - else { - //no sender available, the function was called in CartesianPlot::dataChanged() (live data source got new data) - //-> retransform all available curves since we don't know which curves are affected. - //TODO: this logic can be very expensive - for (auto c : children()) - c->retransform(); - } + //no sender available, the function was called in CartesianPlot::dataChanged() (live data source got new data) + //-> retransform all available curves since we don't know which curves are affected. + //TODO: this logic can be very expensive + for (auto c : children()) + c->retransform(); } } @@ -1437,9 +1435,9 @@ return; d->curvesXMinMaxIsDirty = true; - if (d->autoScaleX) + if (d->autoScaleX) { this->scaleAutoX(); - else { + } else { Histogram* curve = dynamic_cast(QObject::sender()); curve->retransform(); } @@ -1669,7 +1667,6 @@ d->yMax = d->curvesYMax; update = true; } - if (update) { if (d->yMax == d->yMin) { //in case min and max are equal (e.g. if we plot a single point), subtract/add 10% of the value diff --git a/src/backend/worksheet/plots/cartesian/Histogram.h b/src/backend/worksheet/plots/cartesian/Histogram.h --- a/src/backend/worksheet/plots/cartesian/Histogram.h +++ b/src/backend/worksheet/plots/cartesian/Histogram.h @@ -45,6 +45,7 @@ enum ValuesPosition {ValuesAbove, ValuesUnder, ValuesLeft, ValuesRight}; enum FillingPosition {NoFilling, FillingAbove, FillingBelow, FillingZeroBaseline, FillingLeft, FillingRight}; enum HistogramType {Ordinary,Cumulative, AvgShift}; + enum BarsType {Vertical, Horizontal}; struct HistogramData { HistogramData() : type(Ordinary),binsOption(Number), binValue(10) {}; @@ -102,8 +103,10 @@ void setPrinting(bool on) override; void suppressRetransform(bool); double getYMaximum() const; - void setHistrogramType(Histogram::HistogramType); + void setHistogramType(Histogram::HistogramType); + void setBarsType(Histogram::BarsType); Histogram::HistogramType getHistrogramType(); + Histogram::BarsType getBarsType(); void setbinsOption(Histogram::BinsOption); void setBinValue(int); @@ -136,7 +139,7 @@ signals: //General-Tab - void HistogramdataChanged(); + void HistogramDataChanged(); void xHistogramDataChanged(); void yHistogramDataChanged(); void visibilityChanged(bool); diff --git a/src/backend/worksheet/plots/cartesian/Histogram.cpp b/src/backend/worksheet/plots/cartesian/Histogram.cpp --- a/src/backend/worksheet/plots/cartesian/Histogram.cpp +++ b/src/backend/worksheet/plots/cartesian/Histogram.cpp @@ -1,10 +1,10 @@ /*************************************************************************** - File : Histogram.cpp - Project : LabPlot - Description : Histogram - -------------------------------------------------------------------- - Copyright : (C) 2016 Anu Mittal (anu22mittal@gmail.com) - Copyright : (C) 2016-2017 by Alexander Semke (alexander.semke@web.de) +File : Histogram.cpp +Project : LabPlot +Description : Histogram +-------------------------------------------------------------------- +Copyright : (C) 2016 Anu Mittal (anu22mittal@gmail.com) +Copyright : (C) 2016-2017 by Alexander Semke (alexander.semke@web.de) ***************************************************************************/ @@ -32,7 +32,7 @@ \brief A 2D-curve, provides an interface for editing many properties of the curve. \ingroup worksheet -*/ + */ #include "Histogram.h" #include "HistogramPrivate.h" #include "backend/core/column/Column.h" @@ -43,6 +43,7 @@ #include "backend/worksheet/Worksheet.h" #include "backend/lib/XmlStreamReader.h" #include "tools/ImageTools.h" +#include "backend/lib/trace.h" #include #include @@ -59,13 +60,13 @@ Histogram::Histogram(const QString &name) : WorksheetElement(name), d_ptr(new HistogramPrivate(this)) { - init(); -} + init(); + } Histogram::Histogram(const QString &name, HistogramPrivate *dd) : WorksheetElement(name), d_ptr(dd) { - init(); -} + init(); + } void Histogram::init() { Q_D(Histogram); @@ -76,6 +77,7 @@ d->xColumn = NULL; d->histogramType = (Histogram::HistogramType) group.readEntry("histogramType", (int)Histogram::Ordinary); + d->m_barsType = (Histogram::BarsType) group.readEntry("barsType", (int)Histogram::Vertical); d->binsOption = (Histogram::BinsOption) group.readEntry("binOption", (int)Histogram::Number); d->lineSkipGaps = group.readEntry("SkipLineGaps", false); d->lineInterpolationPointsCount = group.readEntry("LineInterpolationPointsCount", 1); @@ -124,8 +126,8 @@ } /*! - Returns an icon to be used in the project explorer. -*/ + Returns an icon to be used in the project explorer. + */ QIcon Histogram::icon() const { return QIcon::fromTheme("labplot-xy-curve"); } @@ -135,10 +137,10 @@ } STD_SWAP_METHOD_SETTER_CMD_IMPL(Histogram, SetVisible, bool, swapVisible) -void Histogram::setVisible(bool on) { - Q_D(Histogram); - exec(new HistogramSetVisibleCmd(d, on, on ? i18n("%1: set visible") : i18n("%1: set invisible"))); -} + void Histogram::setVisible(bool on) { + Q_D(Histogram); + exec(new HistogramSetVisibleCmd(d, on, on ? i18n("%1: set visible") : i18n("%1: set invisible"))); + } bool Histogram::isVisible() const { Q_D(const Histogram); @@ -150,61 +152,75 @@ d->m_printing = on; } -void Histogram::setHistrogramType(Histogram::HistogramType histogramType) { +void Histogram::setHistogramType(Histogram::HistogramType histogramType) { d_ptr->histogramType = histogramType; + emit HistogramDataChanged(); DEBUG(histogramType); } +void Histogram::setBarsType(Histogram::BarsType barsType) { + Q_D(Histogram); + d->m_barsType = barsType; + emit HistogramDataChanged(); + DEBUG(barsType); +} + Histogram::HistogramType Histogram::getHistrogramType() { return d_ptr->histogramType; } +Histogram::BarsType Histogram::getBarsType() { + return d_ptr->m_barsType; +} + void Histogram::setbinsOption(Histogram::BinsOption binsOption) { d_ptr->histogramData.binsOption = binsOption; + emit HistogramDataChanged(); } void Histogram::setBinValue(int binValue) { d_ptr->histogramData.binValue= binValue; + emit HistogramDataChanged(); } //############################################################################## //########################## getter methods ################################## //############################################################################## BASIC_SHARED_D_READER_IMPL(Histogram, const AbstractColumn*, xColumn, xColumn) -QString& Histogram::xColumnPath() const { - return d_ptr->xColumnPath; -} -CLASS_SHARED_D_READER_IMPL(Histogram, QPen, linePen, linePen) + QString& Histogram::xColumnPath() const { + return d_ptr->xColumnPath; + } + CLASS_SHARED_D_READER_IMPL(Histogram, QPen, linePen, linePen) BASIC_SHARED_D_READER_IMPL(Histogram, Histogram::HistogramData, histogramData, histogramData) -//values -BASIC_SHARED_D_READER_IMPL(Histogram, Histogram::ValuesType, valuesType, valuesType) + //values + BASIC_SHARED_D_READER_IMPL(Histogram, Histogram::ValuesType, valuesType, valuesType) BASIC_SHARED_D_READER_IMPL(Histogram, const AbstractColumn *, valuesColumn, valuesColumn) -QString& Histogram::valuesColumnPath() const { - return d_ptr->valuesColumnPath; -} -BASIC_SHARED_D_READER_IMPL(Histogram, Histogram::ValuesPosition, valuesPosition, valuesPosition) -BASIC_SHARED_D_READER_IMPL(Histogram, qreal, valuesDistance, valuesDistance) -BASIC_SHARED_D_READER_IMPL(Histogram, qreal, valuesRotationAngle, valuesRotationAngle) -BASIC_SHARED_D_READER_IMPL(Histogram, qreal, valuesOpacity, valuesOpacity) -CLASS_SHARED_D_READER_IMPL(Histogram, QString, valuesPrefix, valuesPrefix) -CLASS_SHARED_D_READER_IMPL(Histogram, QString, valuesSuffix, valuesSuffix) -CLASS_SHARED_D_READER_IMPL(Histogram, QColor, valuesColor, valuesColor) + QString& Histogram::valuesColumnPath() const { + return d_ptr->valuesColumnPath; + } + BASIC_SHARED_D_READER_IMPL(Histogram, Histogram::ValuesPosition, valuesPosition, valuesPosition) + BASIC_SHARED_D_READER_IMPL(Histogram, qreal, valuesDistance, valuesDistance) + BASIC_SHARED_D_READER_IMPL(Histogram, qreal, valuesRotationAngle, valuesRotationAngle) + BASIC_SHARED_D_READER_IMPL(Histogram, qreal, valuesOpacity, valuesOpacity) + CLASS_SHARED_D_READER_IMPL(Histogram, QString, valuesPrefix, valuesPrefix) + CLASS_SHARED_D_READER_IMPL(Histogram, QString, valuesSuffix, valuesSuffix) + CLASS_SHARED_D_READER_IMPL(Histogram, QColor, valuesColor, valuesColor) CLASS_SHARED_D_READER_IMPL(Histogram, QFont, valuesFont, valuesFont) -//filling -BASIC_SHARED_D_READER_IMPL(Histogram, Histogram::FillingPosition, fillingPosition, fillingPosition) -BASIC_SHARED_D_READER_IMPL(Histogram, PlotArea::BackgroundType, fillingType, fillingType) -BASIC_SHARED_D_READER_IMPL(Histogram, PlotArea::BackgroundColorStyle, fillingColorStyle, fillingColorStyle) -BASIC_SHARED_D_READER_IMPL(Histogram, PlotArea::BackgroundImageStyle, fillingImageStyle, fillingImageStyle) -CLASS_SHARED_D_READER_IMPL(Histogram, Qt::BrushStyle, fillingBrushStyle, fillingBrushStyle) -CLASS_SHARED_D_READER_IMPL(Histogram, QColor, fillingFirstColor, fillingFirstColor) -CLASS_SHARED_D_READER_IMPL(Histogram, QColor, fillingSecondColor, fillingSecondColor) -CLASS_SHARED_D_READER_IMPL(Histogram, QString, fillingFileName, fillingFileName) + //filling + BASIC_SHARED_D_READER_IMPL(Histogram, Histogram::FillingPosition, fillingPosition, fillingPosition) + BASIC_SHARED_D_READER_IMPL(Histogram, PlotArea::BackgroundType, fillingType, fillingType) + BASIC_SHARED_D_READER_IMPL(Histogram, PlotArea::BackgroundColorStyle, fillingColorStyle, fillingColorStyle) + BASIC_SHARED_D_READER_IMPL(Histogram, PlotArea::BackgroundImageStyle, fillingImageStyle, fillingImageStyle) + CLASS_SHARED_D_READER_IMPL(Histogram, Qt::BrushStyle, fillingBrushStyle, fillingBrushStyle) + CLASS_SHARED_D_READER_IMPL(Histogram, QColor, fillingFirstColor, fillingFirstColor) + CLASS_SHARED_D_READER_IMPL(Histogram, QColor, fillingSecondColor, fillingSecondColor) + CLASS_SHARED_D_READER_IMPL(Histogram, QString, fillingFileName, fillingFileName) BASIC_SHARED_D_READER_IMPL(Histogram, qreal, fillingOpacity, fillingOpacity) -double Histogram::getYMaximum() const { - return d_ptr->getYMaximum(); -} + double Histogram::getYMaximum() const { + return d_ptr->getYMaximum(); + } bool Histogram::isSourceDataChangedSinceLastPlot() const { Q_D(const Histogram); return d->sourceDataChangedSinceLastPlot; @@ -216,179 +232,178 @@ STD_SETTER_CMD_IMPL_F_S(Histogram, SetHistogramData, Histogram::HistogramData, histogramData, recalculate); void Histogram::setHistogramData(const Histogram::HistogramData& histogramData) { Q_D(Histogram); - if ((histogramData.binValue != d->histogramData.binValue) - || (histogramData.binsOption != d->histogramData.binsOption) ) - exec(new HistogramSetHistogramDataCmd(d, histogramData, i18n("%1: set equation"))); + std::cout << "inside sethistogramdata\n"; + exec(new HistogramSetHistogramDataCmd(d, histogramData, i18n("%1: set equation"))); } STD_SETTER_CMD_IMPL_F_S(Histogram, SetXColumn, const AbstractColumn*, xColumn, retransform) -void Histogram::setXColumn(const AbstractColumn* column) { - Q_D(Histogram); - if (column != d->xColumn) { - exec(new HistogramSetXColumnCmd(d, column, i18n("%1: assign x values"))); - emit sourceDataChangedSinceLastPlot(); - - //emit xHistogramDataChanged() in order to notify the plot about the changes - emit xHistogramDataChanged(); - if (column) { - connect(column, &AbstractColumn::dataChanged, this, &Histogram::xHistogramDataChanged); - connect(column, &AbstractColumn::dataChanged, this, &Histogram::handleSourceDataChanged); - //update the curve itself on changes - connect(column, &AbstractColumn::dataChanged, this, &Histogram::retransform); - connect(column->parentAspect(), &AbstractAspect::aspectAboutToBeRemoved, - this, &Histogram::xColumnAboutToBeRemoved); - //TODO: add disconnect in the undo-function + void Histogram::setXColumn(const AbstractColumn* column) { + Q_D(Histogram); + if (column != d->xColumn) { + exec(new HistogramSetXColumnCmd(d, column, i18n("%1: assign x values"))); + emit sourceDataChangedSinceLastPlot(); + + //emit xHistogramDataChanged() in order to notify the plot about the changes + emit HistogramDataChanged(); + if (column) { + connect(column, &AbstractColumn::dataChanged, this, &Histogram::xHistogramDataChanged); + connect(column, &AbstractColumn::dataChanged, this, &Histogram::handleSourceDataChanged); + //update the curve itself on changes + connect(column, &AbstractColumn::dataChanged, this, &Histogram::retransform); + connect(column->parentAspect(), &AbstractAspect::aspectAboutToBeRemoved, + this, &Histogram::xColumnAboutToBeRemoved); + //TODO: add disconnect in the undo-function + } } } -} STD_SETTER_CMD_IMPL_F_S(Histogram, SetLinePen, QPen, linePen, recalcShapeAndBoundingRect) -void Histogram::setLinePen(const QPen &pen) { - Q_D(Histogram); - if (pen != d->linePen) - exec(new HistogramSetLinePenCmd(d, pen, i18n("%1: set line style"))); -} + void Histogram::setLinePen(const QPen &pen) { + Q_D(Histogram); + if (pen != d->linePen) + exec(new HistogramSetLinePenCmd(d, pen, i18n("%1: set line style"))); + } //Values-Tab STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesType, Histogram::ValuesType, valuesType, updateValues) -void Histogram::setValuesType(Histogram::ValuesType type) { - Q_D(Histogram); - if (type != d->valuesType) - exec(new HistogramSetValuesTypeCmd(d, type, i18n("%1: set values type"))); -} + void Histogram::setValuesType(Histogram::ValuesType type) { + Q_D(Histogram); + if (type != d->valuesType) + exec(new HistogramSetValuesTypeCmd(d, type, i18n("%1: set values type"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesColumn, const AbstractColumn*, valuesColumn, updateValues) -void Histogram::setValuesColumn(const AbstractColumn* column) { - Q_D(Histogram); - if (column != d->valuesColumn) { - exec(new HistogramSetValuesColumnCmd(d, column, i18n("%1: set values column"))); - if (column) { - connect(column, &AbstractColumn::dataChanged, this, &Histogram::updateValues); - connect(column->parentAspect(), &AbstractAspect::aspectAboutToBeRemoved, - this, &Histogram::valuesColumnAboutToBeRemoved); + void Histogram::setValuesColumn(const AbstractColumn* column) { + Q_D(Histogram); + if (column != d->valuesColumn) { + exec(new HistogramSetValuesColumnCmd(d, column, i18n("%1: set values column"))); + if (column) { + connect(column, &AbstractColumn::dataChanged, this, &Histogram::updateValues); + connect(column->parentAspect(), &AbstractAspect::aspectAboutToBeRemoved, + this, &Histogram::valuesColumnAboutToBeRemoved); + } } } -} STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesPosition, Histogram::ValuesPosition, valuesPosition, updateValues) -void Histogram::setValuesPosition(ValuesPosition position) { - Q_D(Histogram); - if (position != d->valuesPosition) - exec(new HistogramSetValuesPositionCmd(d, position, i18n("%1: set values position"))); -} + void Histogram::setValuesPosition(ValuesPosition position) { + Q_D(Histogram); + if (position != d->valuesPosition) + exec(new HistogramSetValuesPositionCmd(d, position, i18n("%1: set values position"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesDistance, qreal, valuesDistance, updateValues) -void Histogram::setValuesDistance(qreal distance) { - Q_D(Histogram); - if (distance != d->valuesDistance) - exec(new HistogramSetValuesDistanceCmd(d, distance, i18n("%1: set values distance"))); -} + void Histogram::setValuesDistance(qreal distance) { + Q_D(Histogram); + if (distance != d->valuesDistance) + exec(new HistogramSetValuesDistanceCmd(d, distance, i18n("%1: set values distance"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesRotationAngle, qreal, valuesRotationAngle, updateValues) -void Histogram::setValuesRotationAngle(qreal angle) { - Q_D(Histogram); - if (!qFuzzyCompare(1 + angle, 1 + d->valuesRotationAngle)) - exec(new HistogramSetValuesRotationAngleCmd(d, angle, i18n("%1: rotate values"))); -} + void Histogram::setValuesRotationAngle(qreal angle) { + Q_D(Histogram); + if (!qFuzzyCompare(1 + angle, 1 + d->valuesRotationAngle)) + exec(new HistogramSetValuesRotationAngleCmd(d, angle, i18n("%1: rotate values"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesOpacity, qreal, valuesOpacity, updatePixmap) -void Histogram::setValuesOpacity(qreal opacity) { - Q_D(Histogram); - if (opacity != d->valuesOpacity) - exec(new HistogramSetValuesOpacityCmd(d, opacity, i18n("%1: set values opacity"))); -} + void Histogram::setValuesOpacity(qreal opacity) { + Q_D(Histogram); + if (opacity != d->valuesOpacity) + exec(new HistogramSetValuesOpacityCmd(d, opacity, i18n("%1: set values opacity"))); + } //TODO: Format, Precision STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesPrefix, QString, valuesPrefix, updateValues) -void Histogram::setValuesPrefix(const QString& prefix) { - Q_D(Histogram); - if (prefix!= d->valuesPrefix) - exec(new HistogramSetValuesPrefixCmd(d, prefix, i18n("%1: set values prefix"))); -} + void Histogram::setValuesPrefix(const QString& prefix) { + Q_D(Histogram); + if (prefix!= d->valuesPrefix) + exec(new HistogramSetValuesPrefixCmd(d, prefix, i18n("%1: set values prefix"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesSuffix, QString, valuesSuffix, updateValues) -void Histogram::setValuesSuffix(const QString& suffix) { - Q_D(Histogram); - if (suffix!= d->valuesSuffix) - exec(new HistogramSetValuesSuffixCmd(d, suffix, i18n("%1: set values suffix"))); -} + void Histogram::setValuesSuffix(const QString& suffix) { + Q_D(Histogram); + if (suffix!= d->valuesSuffix) + exec(new HistogramSetValuesSuffixCmd(d, suffix, i18n("%1: set values suffix"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesFont, QFont, valuesFont, updateValues) -void Histogram::setValuesFont(const QFont& font) { - Q_D(Histogram); - if (font!= d->valuesFont) - exec(new HistogramSetValuesFontCmd(d, font, i18n("%1: set values font"))); -} + void Histogram::setValuesFont(const QFont& font) { + Q_D(Histogram); + if (font!= d->valuesFont) + exec(new HistogramSetValuesFontCmd(d, font, i18n("%1: set values font"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetValuesColor, QColor, valuesColor, updatePixmap) -void Histogram::setValuesColor(const QColor& color) { - Q_D(Histogram); - if (color != d->valuesColor) - exec(new HistogramSetValuesColorCmd(d, color, i18n("%1: set values color"))); -} + void Histogram::setValuesColor(const QColor& color) { + Q_D(Histogram); + if (color != d->valuesColor) + exec(new HistogramSetValuesColorCmd(d, color, i18n("%1: set values color"))); + } //Filling STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingPosition, Histogram::FillingPosition, fillingPosition, updateFilling) -void Histogram::setFillingPosition(FillingPosition position) { - Q_D(Histogram); - if (position != d->fillingPosition) - exec(new HistogramSetFillingPositionCmd(d, position, i18n("%1: filling position changed"))); -} + void Histogram::setFillingPosition(FillingPosition position) { + Q_D(Histogram); + if (position != d->fillingPosition) + exec(new HistogramSetFillingPositionCmd(d, position, i18n("%1: filling position changed"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingType, PlotArea::BackgroundType, fillingType, updatePixmap) -void Histogram::setFillingType(PlotArea::BackgroundType type) { - Q_D(Histogram); - if (type != d->fillingType) - exec(new HistogramSetFillingTypeCmd(d, type, i18n("%1: filling type changed"))); -} + void Histogram::setFillingType(PlotArea::BackgroundType type) { + Q_D(Histogram); + if (type != d->fillingType) + exec(new HistogramSetFillingTypeCmd(d, type, i18n("%1: filling type changed"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingColorStyle, PlotArea::BackgroundColorStyle, fillingColorStyle, updatePixmap) -void Histogram::setFillingColorStyle(PlotArea::BackgroundColorStyle style) { - Q_D(Histogram); - if (style != d->fillingColorStyle) - exec(new HistogramSetFillingColorStyleCmd(d, style, i18n("%1: filling color style changed"))); -} + void Histogram::setFillingColorStyle(PlotArea::BackgroundColorStyle style) { + Q_D(Histogram); + if (style != d->fillingColorStyle) + exec(new HistogramSetFillingColorStyleCmd(d, style, i18n("%1: filling color style changed"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingImageStyle, PlotArea::BackgroundImageStyle, fillingImageStyle, updatePixmap) -void Histogram::setFillingImageStyle(PlotArea::BackgroundImageStyle style) { - Q_D(Histogram); - if (style != d->fillingImageStyle) - exec(new HistogramSetFillingImageStyleCmd(d, style, i18n("%1: filling image style changed"))); -} + void Histogram::setFillingImageStyle(PlotArea::BackgroundImageStyle style) { + Q_D(Histogram); + if (style != d->fillingImageStyle) + exec(new HistogramSetFillingImageStyleCmd(d, style, i18n("%1: filling image style changed"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingBrushStyle, Qt::BrushStyle, fillingBrushStyle, updatePixmap) -void Histogram::setFillingBrushStyle(Qt::BrushStyle style) { - Q_D(Histogram); - if (style != d->fillingBrushStyle) - exec(new HistogramSetFillingBrushStyleCmd(d, style, i18n("%1: filling brush style changed"))); -} + void Histogram::setFillingBrushStyle(Qt::BrushStyle style) { + Q_D(Histogram); + if (style != d->fillingBrushStyle) + exec(new HistogramSetFillingBrushStyleCmd(d, style, i18n("%1: filling brush style changed"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingFirstColor, QColor, fillingFirstColor, updatePixmap) -void Histogram::setFillingFirstColor(const QColor& color) { - Q_D(Histogram); - if (color!= d->fillingFirstColor) - exec(new HistogramSetFillingFirstColorCmd(d, color, i18n("%1: set filling first color"))); -} + void Histogram::setFillingFirstColor(const QColor& color) { + Q_D(Histogram); + if (color!= d->fillingFirstColor) + exec(new HistogramSetFillingFirstColorCmd(d, color, i18n("%1: set filling first color"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingSecondColor, QColor, fillingSecondColor, updatePixmap) -void Histogram::setFillingSecondColor(const QColor& color) { - Q_D(Histogram); - if (color!= d->fillingSecondColor) - exec(new HistogramSetFillingSecondColorCmd(d, color, i18n("%1: set filling second color"))); -} + void Histogram::setFillingSecondColor(const QColor& color) { + Q_D(Histogram); + if (color!= d->fillingSecondColor) + exec(new HistogramSetFillingSecondColorCmd(d, color, i18n("%1: set filling second color"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingFileName, QString, fillingFileName, updatePixmap) -void Histogram::setFillingFileName(const QString& fileName) { - Q_D(Histogram); - if (fileName!= d->fillingFileName) - exec(new HistogramSetFillingFileNameCmd(d, fileName, i18n("%1: set filling image"))); -} + void Histogram::setFillingFileName(const QString& fileName) { + Q_D(Histogram); + if (fileName!= d->fillingFileName) + exec(new HistogramSetFillingFileNameCmd(d, fileName, i18n("%1: set filling image"))); + } STD_SETTER_CMD_IMPL_F_S(Histogram, SetFillingOpacity, qreal, fillingOpacity, updatePixmap) -void Histogram::setFillingOpacity(qreal opacity) { - Q_D(Histogram); - if (opacity != d->fillingOpacity) - exec(new HistogramSetFillingOpacityCmd(d, opacity, i18n("%1: set filling opacity"))); -} + void Histogram::setFillingOpacity(qreal opacity) { + Q_D(Histogram); + if (opacity != d->fillingOpacity) + exec(new HistogramSetFillingOpacityCmd(d, opacity, i18n("%1: set filling opacity"))); + } //############################################################################## //################################# SLOTS #################################### @@ -448,9 +463,9 @@ //############################################################################## HistogramPrivate::HistogramPrivate(Histogram *owner) : m_printing(false), m_hovered(false), m_suppressRecalc(false), m_suppressRetransform(false), m_hoverEffectImageIsDirty(false), m_selectionEffectImageIsDirty(false), q(owner) { - setFlag(QGraphicsItem::ItemIsSelectable, true); - setAcceptHoverEvents(true); -} + setFlag(QGraphicsItem::ItemIsSelectable, true); + setAcceptHoverEvents(true); + } QString HistogramPrivate::name() const { return q->name(); @@ -461,22 +476,33 @@ } double HistogramPrivate::getYMaximum() { - if (histogram) { + if (m_histogram) { double yMaxRange = 0.0; switch(histogramType) { - case Histogram::Ordinary: { - size_t maxYAddes = gsl_histogram_max_bin(histogram); - yMaxRange = gsl_histogram_get(histogram, maxYAddes); + case Histogram::Ordinary: { + size_t maxYAddes = gsl_histogram_max_bin(m_histogram); + yMaxRange = gsl_histogram_get(m_histogram, maxYAddes); break; } - case Histogram::Cumulative: { - yMaxRange = xColumn->rowCount(); + case Histogram::Cumulative: { + size_t maxYAddes = gsl_histogram_max_bin(m_histogram); + yMaxRange = gsl_histogram_get(m_histogram, maxYAddes); + double point =0.0; + for(size_t i=0; i < m_bins; ++i) { + point+= gsl_histogram_get(m_histogram,i); + if (point > yMaxRange) { + yMaxRange = point; + } + } + std::cout << "checking y max " << maxYAddes << " " <rowCount(); break; } - case Histogram::AvgShift: { + case Histogram::AvgShift: { //TODO } } + std::cout << "checking y max " << " " <isValid(row) && !xColumn->isMasked(row)) { switch(xColMode) { - case AbstractColumn::Numeric: - tempPoint.setX(xColumn->valueAt(row)); - break; - case AbstractColumn::Integer: - //TODO - case AbstractColumn::Text: - //TODO - case AbstractColumn::DateTime: - case AbstractColumn::Month: - case AbstractColumn::Day: - //TODO - break; + case AbstractColumn::Numeric: + tempPoint.setX(xColumn->valueAt(row)); + break; + case AbstractColumn::Integer: + //TODO + case AbstractColumn::Text: + //TODO + case AbstractColumn::DateTime: + case AbstractColumn::Month: + case AbstractColumn::Day: + //TODO + break; } symbolPointsLogical.append(tempPoint); @@ -572,7 +598,7 @@ /*! recalculates the painter path for the lines connecting the data points. Called each time when the type of this connection is changed. -*/ + */ void HistogramPrivate::updateLines() { linePath = QPainterPath(); lines.clear(); @@ -591,120 +617,129 @@ double xAxisMin = xColumn->minimum(); double xAxisMax = xColumn->maximum(); switch (histogramData.binsOption) { - case Histogram::Number: - bins = (size_t)histogramData.binValue; - break; - case Histogram::SquareRoot: - bins = (size_t)sqrt(histogramData.binValue); - break; - case Histogram::RiceRule: - bins = (size_t)2*cbrt(histogramData.binValue); - break; - case Histogram::Width: - bins = (size_t) (xAxisMax-xAxisMin)/histogramData.binValue; - break; - case Histogram::SturgisRule: - bins =(size_t) 1 + 3.33*log(histogramData.binValue); - break; + case Histogram::Number: + m_bins = (size_t)histogramData.binValue; + break; + case Histogram::SquareRoot: + m_bins = (size_t)sqrt(histogramData.binValue); + break; + case Histogram::RiceRule: + m_bins = (size_t)2*cbrt(histogramData.binValue); + break; + case Histogram::Width: + m_bins = (size_t) (xAxisMax-xAxisMin)/histogramData.binValue; + break; + case Histogram::SturgisRule: + m_bins =(size_t) 1 + 3.33*log(histogramData.binValue); + break; } - double width = (xAxisMax-xAxisMin)/bins; - histogram = gsl_histogram_alloc (bins); // demo- number of bins - gsl_histogram_set_ranges_uniform (histogram, xAxisMin,xAxisMax+1); - - //checking height of each column - /*for(int i=0;i < bins; ++i) { - qDebug() <isValid(row) && !xColumn->isMasked(row) ) - gsl_histogram_increment(histogram, xColumn->valueAt(row)); - } - for(size_t i=0; i < bins; ++i) { - tempPoint.setX(xAxisMin); - tempPoint.setY(0.0); + double width = (xAxisMax-xAxisMin)/m_bins; + m_histogram = gsl_histogram_alloc (m_bins); // demo- number of bins + gsl_histogram_set_ranges_uniform (m_histogram, xAxisMin,xAxisMax+1); + + std::cout << "let's see if this called or not?\n"; + switch(m_barsType) { + case Histogram::Vertical: + { + std::cout << "Vertically painting histogram\n"; + qDebug() << "let's see if this printef"; + switch(histogramType) { + case Histogram::Ordinary: { + for (int row = startRow; row <= endRow; row++ ) { + if ( xColumn->isValid(row) && !xColumn->isMasked(row) ) + gsl_histogram_increment(m_histogram, xColumn->valueAt(row)); + } + for(size_t i=0; i < m_bins; ++i) { + tempPoint.setX(xAxisMin); + tempPoint.setY(0.0); - tempPoint1.setX(xAxisMin); - tempPoint1.setY(gsl_histogram_get(histogram,i)); + tempPoint1.setX(xAxisMin); + tempPoint1.setY(gsl_histogram_get(m_histogram,i)); - lines.append(QLineF(tempPoint, tempPoint1)); + lines.append(QLineF(tempPoint, tempPoint1)); - tempPoint.setX(xAxisMin); - tempPoint.setY(gsl_histogram_get(histogram,i)); + tempPoint.setX(xAxisMin); + tempPoint.setY(gsl_histogram_get(m_histogram,i)); - tempPoint1.setX(xAxisMin+width); - tempPoint1.setY(gsl_histogram_get(histogram,i)); + tempPoint1.setX(xAxisMin+width); + tempPoint1.setY(gsl_histogram_get(m_histogram,i)); - lines.append(QLineF(tempPoint,tempPoint1)); + lines.append(QLineF(tempPoint,tempPoint1)); - tempPoint.setX(xAxisMin+width); - tempPoint.setY(gsl_histogram_get(histogram,i)); + tempPoint.setX(xAxisMin+width); + tempPoint.setY(gsl_histogram_get(m_histogram,i)); - tempPoint1.setX(xAxisMin+width); - tempPoint1.setY(0.0); + tempPoint1.setX(xAxisMin+width); + tempPoint1.setY(0.0); - lines.append(QLineF(tempPoint, tempPoint1)); + lines.append(QLineF(tempPoint, tempPoint1)); - tempPoint.setX(xAxisMin+width); - tempPoint.setY(0.0); + tempPoint.setX(xAxisMin+width); + tempPoint.setY(0.0); - tempPoint1.setX(xAxisMin); - tempPoint1.setY(0.0); + tempPoint1.setX(xAxisMin); + tempPoint1.setY(0.0); - lines.append(QLineF(tempPoint, tempPoint1)); - xAxisMin+= width; - } - break; - } - case Histogram::Cumulative: { - double point =0.0; - for (int row = startRow; row <= endRow; row++ ) { - if ( xColumn->isValid(row) && !xColumn->isMasked(row)) - gsl_histogram_increment(histogram, xColumn->valueAt(row)); - } - for(size_t i=0; i < bins; ++i) { - point+= gsl_histogram_get(histogram,i); - tempPoint.setX(xAxisMin); - tempPoint.setY(0.0); + lines.append(QLineF(tempPoint, tempPoint1)); + xAxisMin+= width; + } + break; + } + case Histogram::Cumulative: { + double point =0.0; + for (int row = startRow; row <= endRow; row++ ) { + if ( xColumn->isValid(row) && !xColumn->isMasked(row)) + gsl_histogram_increment(m_histogram, xColumn->valueAt(row)); + } + for(size_t i=0; i < m_bins; ++i) { + point+= gsl_histogram_get(m_histogram,i); + tempPoint.setX(xAxisMin); + tempPoint.setY(0.0); - tempPoint1.setX(xAxisMin); - tempPoint1.setY(point); + tempPoint1.setX(xAxisMin); + tempPoint1.setY(point); - lines.append(QLineF(tempPoint, tempPoint1)); + lines.append(QLineF(tempPoint, tempPoint1)); - tempPoint.setX(xAxisMin); - tempPoint.setY(point); + tempPoint.setX(xAxisMin); + tempPoint.setY(point); - tempPoint1.setX(xAxisMin+width); - tempPoint1.setY(point); + tempPoint1.setX(xAxisMin+width); + tempPoint1.setY(point); - lines.append(QLineF(tempPoint,tempPoint1)); + lines.append(QLineF(tempPoint,tempPoint1)); - tempPoint.setX(xAxisMin+width); - tempPoint.setY(point); + tempPoint.setX(xAxisMin+width); + tempPoint.setY(point); - tempPoint1.setX(xAxisMin+width); - tempPoint1.setY(0.0); + tempPoint1.setX(xAxisMin+width); + tempPoint1.setY(0.0); - lines.append(QLineF(tempPoint, tempPoint1)); + lines.append(QLineF(tempPoint, tempPoint1)); - tempPoint.setX(xAxisMin+width); - tempPoint.setY(0.0); + tempPoint.setX(xAxisMin+width); + tempPoint.setY(0.0); - tempPoint1.setX(xAxisMin); - tempPoint1.setY(0.0); + tempPoint1.setX(xAxisMin); + tempPoint1.setY(0.0); - lines.append(QLineF(tempPoint, tempPoint1)); - xAxisMin+= width; + lines.append(QLineF(tempPoint, tempPoint1)); + xAxisMin+= width; + } + break; + } + case Histogram::AvgShift: { + //TODO + break; + } } break; } - case Histogram::AvgShift: { - //TODO - break; + case Histogram::Horizontal: + { + qDebug() << "horizonal trying"; + std::cout << "tying horizontal\n"; } } @@ -730,7 +765,7 @@ } /*! recreates the value strings to be shown and recalculates their draw position. -*/ + */ void HistogramPrivate::updateValues() { valuesPath = QPainterPath(); valuesPoints.clear(); @@ -744,29 +779,29 @@ //determine the value string for all points that are currently visible in the plot if (valuesType == Histogram::ValuesY || valuesType == Histogram::ValuesYBracketed) { switch(histogramType) { - case Histogram::Ordinary: - for(size_t i=0; ivalueAt(i)) + valuesSuffix; - break; - case AbstractColumn::Text: - valuesStrings << valuesPrefix + valuesColumn->textAt(i) + valuesSuffix; - case AbstractColumn::Integer: - case AbstractColumn::DateTime: - case AbstractColumn::Month: - case AbstractColumn::Day: - //TODO - break; + case AbstractColumn::Numeric: + valuesStrings << valuesPrefix + QString::number(valuesColumn->valueAt(i)) + valuesSuffix; + break; + case AbstractColumn::Text: + valuesStrings << valuesPrefix + valuesColumn->textAt(i) + valuesSuffix; + case AbstractColumn::Integer: + case AbstractColumn::DateTime: + case AbstractColumn::Month: + case AbstractColumn::Day: + //TODO + break; } } } @@ -806,43 +841,43 @@ qreal h = fm.ascent(); double xAxisMin = xColumn->minimum(); double xAxisMax = xColumn->maximum(); - double width = (xAxisMax-xAxisMin)/bins; + double width = (xAxisMax-xAxisMin)/m_bins; switch(valuesPosition) { - case Histogram::ValuesAbove: - for (int i = 0; i < valuesStrings.size(); i++) { - w=fm.width(valuesStrings.at(i)); - tempPoint.setX( symbolPointsScene.at(i).x() -w/2 +xAxisMin); - tempPoint.setY( symbolPointsScene.at(i).y() - valuesDistance ); - valuesPoints.append(tempPoint); - xAxisMin+= 9*width; - } - break; - case Histogram::ValuesUnder: - for (int i = 0; i < valuesStrings.size(); i++) { - w=fm.width(valuesStrings.at(i)); - tempPoint.setX( symbolPointsScene.at(i).x() -w/2+xAxisMin ); - tempPoint.setY( symbolPointsScene.at(i).y() + valuesDistance + h/2); - valuesPoints.append(tempPoint); - xAxisMin+= 9*width; - } - break; - case Histogram::ValuesLeft: - for (int i = 0; i < valuesStrings.size(); i++) { - w=fm.width(valuesStrings.at(i)); - tempPoint.setX( symbolPointsScene.at(i).x() - valuesDistance - w - 1 +xAxisMin); - tempPoint.setY( symbolPointsScene.at(i).y()); - valuesPoints.append(tempPoint); - xAxisMin+= 9*width; - } - break; - case Histogram::ValuesRight: - for (int i = 0; i < valuesStrings.size(); i++) { - tempPoint.setX( symbolPointsScene.at(i).x() + valuesDistance - 1 +xAxisMin); - tempPoint.setY( symbolPointsScene.at(i).y() ); - valuesPoints.append(tempPoint); - xAxisMin+= 9*width; - } - break; + case Histogram::ValuesAbove: + for (int i = 0; i < valuesStrings.size(); i++) { + w=fm.width(valuesStrings.at(i)); + tempPoint.setX( symbolPointsScene.at(i).x() -w/2 +xAxisMin); + tempPoint.setY( symbolPointsScene.at(i).y() - valuesDistance ); + valuesPoints.append(tempPoint); + xAxisMin+= 9*width; + } + break; + case Histogram::ValuesUnder: + for (int i = 0; i < valuesStrings.size(); i++) { + w=fm.width(valuesStrings.at(i)); + tempPoint.setX( symbolPointsScene.at(i).x() -w/2+xAxisMin ); + tempPoint.setY( symbolPointsScene.at(i).y() + valuesDistance + h/2); + valuesPoints.append(tempPoint); + xAxisMin+= 9*width; + } + break; + case Histogram::ValuesLeft: + for (int i = 0; i < valuesStrings.size(); i++) { + w=fm.width(valuesStrings.at(i)); + tempPoint.setX( symbolPointsScene.at(i).x() - valuesDistance - w - 1 +xAxisMin); + tempPoint.setY( symbolPointsScene.at(i).y()); + valuesPoints.append(tempPoint); + xAxisMin+= 9*width; + } + break; + case Histogram::ValuesRight: + for (int i = 0; i < valuesStrings.size(); i++) { + tempPoint.setX( symbolPointsScene.at(i).x() + valuesDistance - 1 +xAxisMin); + tempPoint.setY( symbolPointsScene.at(i).y() ); + valuesPoints.append(tempPoint); + xAxisMin+= 9*width; + } + break; } QTransform trafo; @@ -1096,7 +1131,7 @@ /*! recalculates the outer bounds and the shape of the curve. -*/ + */ void HistogramPrivate::recalcShapeAndBoundingRect() { //if (m_suppressRecalc) // return; @@ -1168,7 +1203,7 @@ /*! Reimplementation of QGraphicsItem::paint(). This function does the actual painting of the curve. \sa QGraphicsItem::paint(). -*/ + */ void HistogramPrivate::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(option); Q_UNUSED(widget); @@ -1209,9 +1244,9 @@ } /*! - Drawing of symbolsPath is very slow, so we draw every symbol in the loop - which us much faster (factor 10) -*/ + Drawing of symbolsPath is very slow, so we draw every symbol in the loop + which us much faster (factor 10) + */ void HistogramPrivate::drawValues(QPainter* painter) { QTransform trafo; QPainterPath path; @@ -1233,81 +1268,81 @@ QRectF rect = pol.boundingRect(); if (fillingType == PlotArea::Color) { switch (fillingColorStyle) { - case PlotArea::SingleColor: { - painter->setBrush(QBrush(fillingFirstColor)); - break; - } - case PlotArea::HorizontalLinearGradient: { - QLinearGradient linearGrad(rect.topLeft(), rect.topRight()); - linearGrad.setColorAt(0, fillingFirstColor); - linearGrad.setColorAt(1, fillingSecondColor); - painter->setBrush(QBrush(linearGrad)); - break; - } - case PlotArea::VerticalLinearGradient: { - QLinearGradient linearGrad(rect.topLeft(), rect.bottomLeft()); - linearGrad.setColorAt(0, fillingFirstColor); - linearGrad.setColorAt(1, fillingSecondColor); - painter->setBrush(QBrush(linearGrad)); - break; - } - case PlotArea::TopLeftDiagonalLinearGradient: { - QLinearGradient linearGrad(rect.topLeft(), rect.bottomRight()); - linearGrad.setColorAt(0, fillingFirstColor); - linearGrad.setColorAt(1, fillingSecondColor); - painter->setBrush(QBrush(linearGrad)); - break; - } - case PlotArea::BottomLeftDiagonalLinearGradient: { - QLinearGradient linearGrad(rect.bottomLeft(), rect.topRight()); - linearGrad.setColorAt(0, fillingFirstColor); - linearGrad.setColorAt(1, fillingSecondColor); - painter->setBrush(QBrush(linearGrad)); - break; - } - case PlotArea::RadialGradient: { - QRadialGradient radialGrad(rect.center(), rect.width()/2); - radialGrad.setColorAt(0, fillingFirstColor); - radialGrad.setColorAt(1, fillingSecondColor); - painter->setBrush(QBrush(radialGrad)); - break; - } + case PlotArea::SingleColor: { + painter->setBrush(QBrush(fillingFirstColor)); + break; + } + case PlotArea::HorizontalLinearGradient: { + QLinearGradient linearGrad(rect.topLeft(), rect.topRight()); + linearGrad.setColorAt(0, fillingFirstColor); + linearGrad.setColorAt(1, fillingSecondColor); + painter->setBrush(QBrush(linearGrad)); + break; + } + case PlotArea::VerticalLinearGradient: { + QLinearGradient linearGrad(rect.topLeft(), rect.bottomLeft()); + linearGrad.setColorAt(0, fillingFirstColor); + linearGrad.setColorAt(1, fillingSecondColor); + painter->setBrush(QBrush(linearGrad)); + break; + } + case PlotArea::TopLeftDiagonalLinearGradient: { + QLinearGradient linearGrad(rect.topLeft(), rect.bottomRight()); + linearGrad.setColorAt(0, fillingFirstColor); + linearGrad.setColorAt(1, fillingSecondColor); + painter->setBrush(QBrush(linearGrad)); + break; + } + case PlotArea::BottomLeftDiagonalLinearGradient: { + QLinearGradient linearGrad(rect.bottomLeft(), rect.topRight()); + linearGrad.setColorAt(0, fillingFirstColor); + linearGrad.setColorAt(1, fillingSecondColor); + painter->setBrush(QBrush(linearGrad)); + break; + } + case PlotArea::RadialGradient: { + QRadialGradient radialGrad(rect.center(), rect.width()/2); + radialGrad.setColorAt(0, fillingFirstColor); + radialGrad.setColorAt(1, fillingSecondColor); + painter->setBrush(QBrush(radialGrad)); + break; + } } } else if (fillingType == PlotArea::Image) { if ( !fillingFileName.trimmed().isEmpty() ) { QPixmap pix(fillingFileName); switch (fillingImageStyle) { - case PlotArea::ScaledCropped: - pix = pix.scaled(rect.size().toSize(),Qt::KeepAspectRatioByExpanding,Qt::SmoothTransformation); - painter->setBrush(QBrush(pix)); - painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); - break; - case PlotArea::Scaled: - pix = pix.scaled(rect.size().toSize(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); - painter->setBrush(QBrush(pix)); - painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); - break; - case PlotArea::ScaledAspectRatio: - pix = pix.scaled(rect.size().toSize(),Qt::KeepAspectRatio,Qt::SmoothTransformation); - painter->setBrush(QBrush(pix)); - painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); - break; - case PlotArea::Centered: { - QPixmap backpix(rect.size().toSize()); - backpix.fill(); - QPainter p(&backpix); - p.drawPixmap(QPointF(0,0),pix); - p.end(); - painter->setBrush(QBrush(backpix)); - painter->setBrushOrigin(-pix.size().width()/2,-pix.size().height()/2); + case PlotArea::ScaledCropped: + pix = pix.scaled(rect.size().toSize(),Qt::KeepAspectRatioByExpanding,Qt::SmoothTransformation); + painter->setBrush(QBrush(pix)); + painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); break; - } - case PlotArea::Tiled: - painter->setBrush(QBrush(pix)); - break; - case PlotArea::CenterTiled: - painter->setBrush(QBrush(pix)); - painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); + case PlotArea::Scaled: + pix = pix.scaled(rect.size().toSize(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); + painter->setBrush(QBrush(pix)); + painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); + break; + case PlotArea::ScaledAspectRatio: + pix = pix.scaled(rect.size().toSize(),Qt::KeepAspectRatio,Qt::SmoothTransformation); + painter->setBrush(QBrush(pix)); + painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); + break; + case PlotArea::Centered: { + QPixmap backpix(rect.size().toSize()); + backpix.fill(); + QPainter p(&backpix); + p.drawPixmap(QPointF(0,0),pix); + p.end(); + painter->setBrush(QBrush(backpix)); + painter->setBrushOrigin(-pix.size().width()/2,-pix.size().height()/2); + break; + } + case PlotArea::Tiled: + painter->setBrush(QBrush(pix)); + break; + case PlotArea::CenterTiled: + painter->setBrush(QBrush(pix)); + painter->setBrushOrigin(pix.size().width()/2,pix.size().height()/2); } } } else if (fillingType == PlotArea::Pattern) @@ -1336,7 +1371,8 @@ } void HistogramPrivate::recalculate() { - emit q->HistogramdataChanged(); + std::cout << "yaha to aya hai fir dikkat kya hai?\n"; + emit q->HistogramDataChanged(); } //############################################################################## diff --git a/src/backend/worksheet/plots/cartesian/HistogramPrivate.h b/src/backend/worksheet/plots/cartesian/HistogramPrivate.h --- a/src/backend/worksheet/plots/cartesian/HistogramPrivate.h +++ b/src/backend/worksheet/plots/cartesian/HistogramPrivate.h @@ -70,6 +70,7 @@ double getYMaximum(); bool autoScaleX, autoScaleY; Histogram::HistogramType histogramType; + Histogram::BarsType m_barsType; Histogram::BinsOption binsOption; void paint(QPainter*, const QStyleOptionGraphicsItem*, QWidget* widget = 0) override; @@ -79,7 +80,7 @@ QString xColumnPath; QString yColumnPath; - void recalculate(); + void recalculate(); Histogram::HistogramData histogramData; //line @@ -139,8 +140,8 @@ bool sourceDataChangedSinceLastPlot; //setEnabled(m_curve->isSourceDataChangedSinceLastPlot()); //Slots - connect(m_curve, SIGNAL(aspectDescriptionChanged(const AbstractAspect*)), this, SLOT(curveDescriptionChanged(const AbstractAspect*))); connect(m_curve, SIGNAL(histogramDataChanged(Histogram::HistogramData)), @@ -409,25 +407,6 @@ //**** SLOTs for changes triggered in HistogramDock ***** //************************************************************* -void HistogramDock::recalculateClicked() { - Histogram::HistogramData data; - if( data.type != (Histogram::HistogramType)uiGeneralTab.cbHistogramType->currentIndex()) - data.type = (Histogram::HistogramType)uiGeneralTab.cbHistogramType->currentIndex(); - - data.binsOption= (Histogram::BinsOption)uiGeneralTab.cbBins->currentIndex(); - data.binValue = uiGeneralTab.sbBins->value(); -// m_curve->retransform(); - for (auto* curve : m_curvesList) - dynamic_cast(curve)->setHistogramData(data); - - uiGeneralTab.pbRecalculate->setEnabled(false); -} - -void HistogramDock::enableRecalculate() const { - if (m_initializing) - return; - uiGeneralTab.pbRecalculate->setEnabled(true); -} void HistogramDock::curveLinePenChanged(const QPen& pen) { m_initializing = true; uiGeneralTab.kcbLineColor->setColor( pen.color()); @@ -958,7 +937,9 @@ uiGeneralTab.cbHistogramType->addItem(i18n("Cumulative Histogram")); uiGeneralTab.cbHistogramType->addItem(i18n("AvgShifted Histogram")); - uiGeneralTab.pbRecalculate->setIcon(QIcon::fromTheme("run-build")); + // Bars types + uiGeneralTab.cbBarsType->addItem(i18n("Vertical")); + uiGeneralTab.cbBarsType->addItem(i18n("Horizontal")); //General connect(uiGeneralTab.leName, &QLineEdit::textChanged, this, &HistogramDock::nameChanged); @@ -968,28 +949,31 @@ connect( uiGeneralTab.kcbLineColor, SIGNAL(changed(QColor)), this, SLOT(lineColorChanged(QColor)) ); connect( cbXColumn, SIGNAL(currentModelIndexChanged(QModelIndex)), this, SLOT(xColumnChanged(QModelIndex)) ); connect( uiGeneralTab.cbHistogramType, SIGNAL(currentIndexChanged(int)), this, SLOT(histogramTypeChanged(int)) ); + connect( uiGeneralTab.cbBarsType, SIGNAL(currentIndexChanged(int)), this, SLOT(barsTypeChanged(int))); connect( uiGeneralTab.cbBins, SIGNAL(currentIndexChanged(int)), this, SLOT(binsOptionChanged(int)) ); connect( uiGeneralTab.sbBins, SIGNAL(valueChanged(int)), this, SLOT(binValueChanged(int)) ); - connect( uiGeneralTab.pbRecalculate, SIGNAL(clicked()), this, SLOT(recalculateClicked()) ); } void HistogramDock::histogramTypeChanged(int index) { Histogram::HistogramType histogramType = Histogram::HistogramType(index); - m_curve->setHistrogramType(histogramType); - enableRecalculate(); + m_curve->setHistogramType(histogramType); +} + +void HistogramDock::barsTypeChanged(int index) { + Histogram::BarsType barsType = Histogram::BarsType(index); + m_curve->setBarsType(barsType); } void HistogramDock::binValueChanged(int value) { - m_curve->setBinValue(value); - enableRecalculate(); + m_curve->setBinValue(value); } void HistogramDock::binsOptionChanged(int index){ Histogram::BinsOption binsOption = Histogram::BinsOption(index); m_curve->setbinsOption(binsOption); - enableRecalculate(); } + void HistogramDock::lineColorChanged(const QColor& color){ if (m_initializing) return; diff --git a/src/kdefrontend/ui/dockwidgets/histogramdockgeneraltab.ui b/src/kdefrontend/ui/dockwidgets/histogramdockgeneraltab.ui --- a/src/kdefrontend/ui/dockwidgets/histogramdockgeneraltab.ui +++ b/src/kdefrontend/ui/dockwidgets/histogramdockgeneraltab.ui @@ -1,228 +1,261 @@ - HistogramDockGeneralTab - - - - 0 - 0 - 367 - 291 - - - - - 2 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - Name - + HistogramDockGeneralTab + + + + 0 + 0 + 367 + 291 + + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + Name + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 23 + + + + + + + + + + + Comment + + + + + + + + + + x-data + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 32 + 18 + + + + + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + Bin Settings: + + + + + + + Bins + + + + + + + + + + 30 + + + 1 + + + 10 + + + + + + + Color + + + + + + + + 0 + 0 + + + + + + + + Histogram type: + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 32 + 8 + + + + + + + + Qt::Horizontal + + + + + + + + 75 + true + + + + Bars Settings: + + + + + + + Bars type: + + + + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 32 + 8 + + + + + + + + Qt::Horizontal + + + + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 24 + 18 + + + + + + + + visible + + + + - - - - - - - - - 0 - 0 - - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 32 - 18 - - - - - - - - visible - - - - - - - Color - - - - - - - - - - Bins - - - - - - - x-data - - - - - - - Recalculate - - - - - - - - - - - 75 - true - - - - Histogram type: - - - - - - - Comment - - - - - - - Qt::Horizontal - - - - - - - - 75 - true - - - - Bin Settings: - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 32 - 8 - - - - - - - - Qt::Horizontal - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 23 - - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 24 - 18 - - - - - - - - 30 - - - 1 - - - 10 - - - - - - - - KColorButton - QPushButton -
kcolorbutton.h
-
-
- - + + + KColorButton + QPushButton +
kcolorbutton.h
+
+
+ +