diff --git a/Modules/Chart/include/QmitkChartWidget.h b/Modules/Chart/include/QmitkChartWidget.h index e79ce6d4c2..58d7da031b 100644 --- a/Modules/Chart/include/QmitkChartWidget.h +++ b/Modules/Chart/include/QmitkChartWidget.h @@ -1,196 +1,196 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkC3jsWidget_h #define QmitkC3jsWidget_h #include +#include #include #include /*! \brief QmitkChartWidget is a widget to display various charts based on the javascript chart library C3js. Currently, bar charts, line charts and pie charts are supported. * \details Data is added via AddData1D() or AddData2D().\n * There can be multiple charts (of the same type) created by calling AddData1D or AddData2D multiple times.\n\n * The following chart types are supported: * * line chart: http://c3js.org/samples/simple_multiple.html * * bar chart: http://c3js.org/samples/chart_bar.html * * spline chart: http://c3js.org/samples/chart_spline.html * * pie chart: http://c3js.org/samples/chart_pie.html * \n Technical details: The javascript code is embedded in a QWebEngineView. The actual js code is implemented in resource\Chart.js. * \sa http://c3js.org for further information about the used javaScript library. * \warning Pie is significantly different than the other types. Here, the data given by AddData1D is summed. Each entry represents a different category. * \ingroup Modules/Chart */ class MITKCHART_EXPORT QmitkChartWidget : public QWidget { Q_OBJECT public: /*! * \brief enum of diagram types. Supported are bar, line, spline (a smoothed line) and pie. */ enum class ChartType { bar, /*!< bar chart, see http://c3js.org/samples/chart_bar.html */ line, /*!< line chart, see http://c3js.org/samples/simple_multiple.html */ spline, /*!< spline chart (smoothed line chart), see http://c3js.org/samples/chart_spline.html */ pie, /*!< pie chart, see http://c3js.org/samples/chart_pie.html*/ area, /*!< area chart, see http://c3js.org/samples/chart_area.html*/ area_spline /*!< area-spline chart, see http://c3js.org/samples/chart_area.html*/ }; enum class ChartStyle { darkstyle, lightstyle }; enum class LineStyle { solid, dashed }; enum class AxisScale { linear, log }; /*! * \brief enum of legend position. Supported are bottom, right, inset. * See http://c3js.org/reference.html#legend-position */ enum class LegendPosition { bottom, right, inset }; explicit QmitkChartWidget(QWidget* parent = nullptr); ~QmitkChartWidget() override; /*! * \brief Adds 1D data to the widget * \details internally, the list is converted to a map with increasing integers keys starting at 0. * \param label the name of the data that is also used as identifier. * \param type the chart type that should be used for this data entry * \note the data can be cleared with ClearDiagram() * \note If the label name already exists, the name is replaced with a unique one by concatenating numbers to it. */ void AddData1D(const std::vector& data1D, const std::string& label, ChartType type = ChartType::bar); /*! * \brief Adds 2D data to the widget. Call repeatedly for displaying multiple charts. * \details each entry represents a data point: key: value --> x-value: y-value. * \param label the name of the data that is also used as identifier. * \param type the chart type that should be used for this data entry * \note the data can be cleared with ClearDiagram() * \note If the label name already exists, the name is replaced with a unique one by concatenating numbers to it. */ void AddData2D(const std::map& data2D, const std::string& label, ChartType type = ChartType::bar); /*! * \brief Removes data from the widget, works for 1D and 2D Data * \param label the name of the data that is also used as identifier. * \note the data can be cleared with ClearDiagram() * \throws Invalid Argument Exception when the label cannot be found */ void RemoveData(const std::string& label); /*! * \brief sets the color of one data entry (identifier is previously assigned label) * \details the color name can be "red" or a hex number (#FF0000). * Either define all data entries with a color or none. If a mixed approach is used, different data entries could have the same color. * If an unknown label is given, nothing happens. * \sa https://www.w3schools.com/cssref/css_colors.asp */ void SetColor(const std::string& label, const std::string& colorName); /*! * \brief sets the line style of one data entry (identifier is previously assigned label) * \details two line styles are possible: LineStyle::solid and LineStyle::dashed. * The default linestyle is solid. * If an unknown label is given, nothing happens. * \warning only sets the line style if the current chart type is ChartType::line. However, the line style remains also if the chart changes (e.g. new chart type) */ void SetLineStyle(const std::string& label, LineStyle style); void SetYAxisScale(AxisScale scale); void SetXAxisLabel(const std::string& label); std::string GetXAxisLabel() const; void SetYAxisLabel(const std::string& label); std::string GetYAxisLabel() const; void SetTitle(const std::string &title); std::string GetTitle() const; + /*! + * \brief Changes the chart type for all data entries and reloads the chart + */ + void SetChartTypeForAllDataAndReload(ChartType type); /*! * \brief sets the chart type for a data entry * \details for available types, see ChartType * If an unknown label is given, nothing happens. * \sa DiagramType for available types */ void SetChartType(const std::string& label, ChartType type); void SetLegendPosition(LegendPosition position); LegendPosition GetLegendPosition() const; - /*! - * \brief Changes the chart type for all data entries and reloads the chart - */ - void SetChartTypeForAllDataAndReload(ChartType type); - /*! * \brief Displays the chart in the widget * \param showSubChart if a subchart is displayed inside the widget or not (see http://c3js.org/samples/options_subchart.html). * \exception if no data has been provided (\sa AddData1D AddData2D) */ void Show(bool showSubChart=false); /*! * \brief Displays the dataPoints or not * \param showDataPoints if dataPoints are displayed inside the widget or not. */ void SetShowDataPoints(bool showDataPoints); bool GetShowDataPoints() const; /*! * \brief Clears all data inside and resets the widget. */ void Clear(); /*! * \brief Changes the theme of the widget. */ void SetTheme(ChartStyle themeEnabled); /*! * \brief Reloads the chart in the widget * \details reloading may be needed to display added data in an existing chart * \param showSubChart if a subchart is displayed inside the widget or not. */ void Reload(bool showSubChart); private: class Impl; - Impl* m_Impl; + std::unique_ptr m_Impl; public slots: void OnLoadFinished(bool isLoadSuccessfull); signals: void PageSuccessfullyLoaded(); }; #endif diff --git a/Modules/Chart/src/QmitkChartWidget.cpp b/Modules/Chart/src/QmitkChartWidget.cpp index 8819aeecd0..3ca7f4c511 100644 --- a/Modules/Chart/src/QmitkChartWidget.cpp +++ b/Modules/Chart/src/QmitkChartWidget.cpp @@ -1,499 +1,496 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #include #include #include #include #include #include #include "mitkExceptionMacro.h" class QmitkChartWidget::Impl final { public: explicit Impl(QWidget* parent); ~Impl(); Impl(const Impl&) = delete; Impl& operator=(const Impl&) = delete; void AddData1D(const std::vector& data1D, const std::string& label, QmitkChartWidget::ChartType chartType); void AddData2D(const std::map& data2D, const std::string& label, QmitkChartWidget::ChartType chartType); void RemoveData(const std::string& label); void ClearData(); void SetColor(const std::string& label, const std::string& colorName); void SetLineStyle(const std::string& label, LineStyle style); void SetYAxisScale(AxisScale scale); void SetXAxisLabel(const std::string& label); std::string GetXAxisLabel() const; void SetYAxisLabel(const std::string& label); std::string GetYAxisLabel() const; void SetTitle(const std::string &title); std::string GetTitle() const; void SetLegendPosition(LegendPosition position); LegendPosition GetLegendPosition() const; std::string GetLegendPositionAsString() const; void SetShowDataPoints(bool showDataPoints = false); bool GetShowDataPoints() const; + void Show(bool showSubChart); - void SetChartType(const std::string& label, QmitkChartWidget::ChartType chartType); + void SetChartType(QmitkChartWidget::ChartType chartType); + void SetChartTypeByLabel(const std::string& label, QmitkChartWidget::ChartType chartType); std::string ConvertChartTypeToString(QmitkChartWidget::ChartType chartType) const; void ClearJavaScriptChart(); void InitializeJavaScriptChart(); void CallJavaScriptFuntion(const QString& command); - QmitkChartData* GetC3Data() const; - std::vector* GetC3xyData() const; - private: std::string GetUniqueLabelName(const QList& labelList, const std::string& label) const; - QmitkChartxyData* GetDataElementByLabel(const std::vector* c3xyData, const std::string& label) const; - QList GetDataLabels(const std::vector* c3xyData) const; + QmitkChartxyData* GetDataElementByLabel(const std::string& label) const; + QList GetDataLabels(const std::vector>& c3xyData) const; QWebChannel* m_WebChannel; QWebEngineView* m_WebEngineView; - QmitkChartData * m_C3Data; - std::vector * m_C3xyData; + QmitkChartData m_C3Data; + std::vector> m_C3xyData; std::map m_ChartTypeToName; std::map m_LegendPositionToName; std::map m_LineStyleToName; std::map m_AxisScaleToName; }; QmitkChartWidget::Impl::Impl(QWidget* parent) : m_WebChannel(new QWebChannel(parent)) , m_WebEngineView(new QWebEngineView(parent)) { //disable context menu for QWebEngineView m_WebEngineView->setContextMenuPolicy(Qt::NoContextMenu); //Set the webengineview to an initial empty page. The actual chart will be loaded once the data is calculated. m_WebEngineView->setUrl(QUrl(QStringLiteral("qrc:///C3js/empty.html"))); m_WebEngineView->page()->setWebChannel(m_WebChannel); connect(m_WebEngineView, SIGNAL(loadFinished(bool)), parent, SLOT(OnLoadFinished(bool))); auto layout = new QGridLayout(parent); layout->setMargin(0); layout->addWidget(m_WebEngineView); parent->setLayout(layout); m_ChartTypeToName.emplace(ChartType::bar, "bar"); m_ChartTypeToName.emplace(ChartType::line, "line"); m_ChartTypeToName.emplace(ChartType::spline, "spline"); m_ChartTypeToName.emplace(ChartType::pie, "pie"); m_ChartTypeToName.emplace(ChartType::area, "area"); m_ChartTypeToName.emplace(ChartType::area_spline , "area-spline"); m_LegendPositionToName.emplace(LegendPosition::bottom, "bottom"); m_LegendPositionToName.emplace(LegendPosition::right, "right"); m_LegendPositionToName.emplace(LegendPosition::inset, "inset"); m_LineStyleToName.emplace(LineStyle::solid, "solid"); m_LineStyleToName.emplace(LineStyle::dashed, "dashed"); m_AxisScaleToName.emplace(AxisScale::linear, ""); m_AxisScaleToName.emplace(AxisScale::log, "log"); - - m_C3Data = new QmitkChartData(); - m_C3xyData = new std::vector(); } QmitkChartWidget::Impl::~Impl() { - delete m_C3Data; - qDeleteAll(*m_C3xyData); - - delete m_C3xyData; } void QmitkChartWidget::Impl::AddData1D(const std::vector& data1D, const std::string& label, QmitkChartWidget::ChartType type) { std::map transformedData2D; unsigned int count = 0; //transform the 1D data to 2D data for (const auto& ele : data1D) { transformedData2D[count] = ele; count++; } this->AddData2D(transformedData2D, label, type); } void QmitkChartWidget::Impl::AddData2D(const std::map& data2D, const std::string& label, QmitkChartWidget::ChartType type) { QMap data2DConverted; for (const auto& aValue : data2D) { data2DConverted.insert(aValue.first, aValue.second); } const std::string chartTypeName(m_ChartTypeToName.at(type)); - auto definedLabels = GetDataLabels(GetC3xyData()); + auto definedLabels = GetDataLabels(m_C3xyData); auto uniqueLabel = GetUniqueLabelName(definedLabels, label); - GetC3xyData()->push_back(new QmitkChartxyData(data2DConverted, QVariant(QString::fromStdString(uniqueLabel)), QVariant(QString::fromStdString(chartTypeName)))); + m_C3xyData.push_back(std::make_unique(data2DConverted, QVariant(QString::fromStdString(uniqueLabel)), QVariant(QString::fromStdString(chartTypeName)))); } void QmitkChartWidget::Impl::RemoveData(const std::string& label) { - for (std::vector::iterator iter = GetC3xyData()->begin(); iter != GetC3xyData()->end(); ++iter) + for (std::vector>::iterator iter = m_C3xyData.begin(); iter != m_C3xyData.end(); ++iter) { - const auto &temp = *iter; - if (temp->GetLabel().toString().toStdString() == label) + if ((*iter)->GetLabel().toString().toStdString() == label) { - delete temp; - GetC3xyData()->erase(iter); + m_C3xyData.erase(iter); return; } } throw std::invalid_argument("Cannot Remove Data because the label does not exist."); } void QmitkChartWidget::Impl::ClearData() { - for (auto& xyData : *m_C3xyData) + for (auto& xyData : m_C3xyData) { - m_WebChannel->deregisterObject(xyData); - delete xyData; - xyData = nullptr; + m_WebChannel->deregisterObject(xyData.get()); } - GetC3xyData()->clear(); + m_C3xyData.clear(); } void QmitkChartWidget::Impl::SetColor(const std::string& label, const std::string& colorName) { - auto element = GetDataElementByLabel(GetC3xyData(), label); - if (element) { + auto element = GetDataElementByLabel(label); + if (element) + { element->SetColor(QVariant(QString::fromStdString(colorName))); } } void QmitkChartWidget::Impl::SetLineStyle(const std::string& label, LineStyle style) { - auto element = GetDataElementByLabel(GetC3xyData(), label); + auto element = GetDataElementByLabel(label); //only has effect with chart type line - if (element && element->GetChartType()==QVariant(QString::fromStdString(ConvertChartTypeToString(ChartType::line)))) { + if (element && element->GetChartType()==QVariant(QString::fromStdString(ConvertChartTypeToString(ChartType::line)))) + { const std::string lineStyleName(m_LineStyleToName.at(style)); element->SetLineStyle(QVariant(QString::fromStdString(lineStyleName))); } } void QmitkChartWidget::Impl::SetYAxisScale(AxisScale scale) { const std::string axisScaleName(m_AxisScaleToName.at(scale)); - GetC3Data()->SetYAxisScale(QString::fromStdString(axisScaleName)); + m_C3Data.SetYAxisScale(QString::fromStdString(axisScaleName)); } -QmitkChartxyData* QmitkChartWidget::Impl::GetDataElementByLabel(const std::vector* c3xyData, const std::string& label) const +QmitkChartxyData* QmitkChartWidget::Impl::GetDataElementByLabel(const std::string& label) const { - for (auto element = c3xyData->begin(); element != c3xyData->end(); ++element) { - if ((*element)->GetLabel().toString().toStdString() == label) { - return *element; - } + for (const auto &qmitkChartxyData : m_C3xyData) + { + if (qmitkChartxyData->GetLabel().toString() == label.c_str()) + return qmitkChartxyData.get(); } + MITK_WARN << "label " << label << " not found in QmitkChartWidget"; return nullptr; } -QList QmitkChartWidget::Impl::GetDataLabels(const std::vector* c3xyData) const { +QList QmitkChartWidget::Impl::GetDataLabels(const std::vector>& c3xyData) const { QList dataLabels; - for (auto element = c3xyData->begin(); element != c3xyData->end(); ++element) { + for (auto element = c3xyData.begin(); element != c3xyData.end(); ++element) { dataLabels.push_back((*element)->GetLabel()); } return dataLabels; } void QmitkChartWidget::Impl::SetXAxisLabel(const std::string& label) { - GetC3Data()->SetXAxisLabel(QString::fromStdString(label)); + m_C3Data.SetXAxisLabel(QString::fromStdString(label)); } std::string QmitkChartWidget::Impl::GetXAxisLabel() const { - return GetC3Data()->GetXAxisLabel().toString().toStdString(); + return m_C3Data.GetXAxisLabel().toString().toStdString(); } void QmitkChartWidget::Impl::SetYAxisLabel(const std::string& label) { - GetC3Data()->SetYAxisLabel(QString::fromStdString(label)); + m_C3Data.SetYAxisLabel(QString::fromStdString(label)); } std::string QmitkChartWidget::Impl::GetYAxisLabel() const { - return GetC3Data()->GetYAxisLabel().toString().toStdString(); + return m_C3Data.GetYAxisLabel().toString().toStdString(); } void QmitkChartWidget::Impl::SetTitle(const std::string& title) { - GetC3Data()->SetTitle(QString::fromStdString(title)); + m_C3Data.SetTitle(QString::fromStdString(title)); } std::string QmitkChartWidget::Impl::GetTitle() const { - return GetC3Data()->GetTitle().toString().toStdString(); + return m_C3Data.GetTitle().toString().toStdString(); } void QmitkChartWidget::Impl::SetLegendPosition(QmitkChartWidget::LegendPosition legendPosition) { const std::string legendPositionName(m_LegendPositionToName.at(legendPosition)); - GetC3Data()->SetLegendPosition(QString::fromStdString(legendPositionName)); + m_C3Data.SetLegendPosition(QString::fromStdString(legendPositionName)); } QmitkChartWidget::LegendPosition QmitkChartWidget::Impl::GetLegendPosition() const { for (const auto& aLegendPosition : m_LegendPositionToName) { if (aLegendPosition.second == GetLegendPositionAsString()) { return aLegendPosition.first; } } mitkThrow() << "can't find legend position!"; } std::string QmitkChartWidget::Impl::GetLegendPositionAsString() const { - return GetC3Data()->GetLegendPosition().toString().toStdString(); + return m_C3Data.GetLegendPosition().toString().toStdString(); } void QmitkChartWidget::Impl::SetShowDataPoints(bool showDataPoints) { if (showDataPoints == true) { - GetC3Data()->SetDataPointSize(3); + m_C3Data.SetDataPointSize(3); } else { - GetC3Data()->SetDataPointSize(0); + m_C3Data.SetDataPointSize(0); } } bool QmitkChartWidget::Impl::GetShowDataPoints() const{ - int value = GetC3Data()->GetDataPointSize().toInt(); + int value = m_C3Data.GetDataPointSize().toInt(); if (value > 0) { return true; } else { return false; } } -void QmitkChartWidget::Impl::SetChartType(const std::string& label, QmitkChartWidget::ChartType chartType) { - auto element = GetDataElementByLabel(GetC3xyData(), label); - if (element) { - const std::string chartTypeName(m_ChartTypeToName.at(chartType)); - element->SetChartType(QVariant(QString::fromStdString(chartTypeName))); +void QmitkChartWidget::Impl::Show(bool showSubChart) +{ + if (m_C3xyData.empty()) + { + mitkThrow() << "no data available for display in chart"; } + + m_C3Data.SetAppearance(showSubChart, m_C3xyData.front()->GetChartType() == QVariant("pie")); + InitializeJavaScriptChart(); } +void QmitkChartWidget::Impl::SetChartType(QmitkChartWidget::ChartType chartType) +{ + for (auto iterator = m_C3xyData.begin(); iterator != m_C3xyData.end(); ++iterator) + { + SetChartTypeByLabel((*iterator)->GetLabel().toString().toStdString(), chartType); + } -std::string QmitkChartWidget::Impl::ConvertChartTypeToString(QmitkChartWidget::ChartType chartType) const { - return m_ChartTypeToName.at(chartType); + auto chartTypeName = ConvertChartTypeToString(chartType); + const QString command = QString::fromStdString("transformView('" + chartTypeName + "')"); + CallJavaScriptFuntion(command); } -QmitkChartData* QmitkChartWidget::Impl::GetC3Data() const { - return m_C3Data; +void QmitkChartWidget::Impl::SetChartTypeByLabel(const std::string& label, QmitkChartWidget::ChartType chartType) +{ + auto element = GetDataElementByLabel(label); + if (element) + { + const std::string chartTypeName(m_ChartTypeToName.at(chartType)); + element->SetChartType(QVariant(QString::fromStdString(chartTypeName))); + } } -std::vector* QmitkChartWidget::Impl::GetC3xyData() const { - return m_C3xyData; +std::string QmitkChartWidget::Impl::ConvertChartTypeToString(QmitkChartWidget::ChartType chartType) const { + return m_ChartTypeToName.at(chartType); } void QmitkChartWidget::Impl::CallJavaScriptFuntion(const QString& command) { m_WebEngineView->page()->runJavaScript(command); } void QmitkChartWidget::Impl::ClearJavaScriptChart() { m_WebEngineView->setUrl(QUrl(QStringLiteral("qrc:///C3js/empty.html"))); } void QmitkChartWidget::Impl::InitializeJavaScriptChart() { - m_WebChannel->registerObject(QStringLiteral("chartData"), m_C3Data); + m_WebChannel->registerObject(QStringLiteral("chartData"), &m_C3Data); unsigned count = 0; - for (auto& xyData : *m_C3xyData) { - QString variableName = "xyData" + QString::number(count); - m_WebChannel->registerObject(variableName, xyData); + for (auto& xyData : m_C3xyData) + { + QString variableName = "xyData" + QString::number(count); + m_WebChannel->registerObject(variableName, xyData.get()); count++; } m_WebEngineView->load(QUrl(QStringLiteral("qrc:///C3js/QmitkChartWidget.html"))); } std::string QmitkChartWidget::Impl::GetUniqueLabelName(const QList& labelList, const std::string& label) const { QString currentLabel = QString::fromStdString(label); int counter = 0; while (labelList.contains(currentLabel)) { currentLabel = QString::fromStdString(label + std::to_string(counter)); counter++; } return currentLabel.toStdString(); } QmitkChartWidget::QmitkChartWidget(QWidget* parent) - : QWidget(parent), - m_Impl(new Impl(this)) + : QWidget(parent) + , m_Impl(new Impl(this)) { } QmitkChartWidget::~QmitkChartWidget() { - delete m_Impl; } void QmitkChartWidget::AddData2D(const std::map& data2D, const std::string& label, ChartType type) { m_Impl->AddData2D(data2D, label, type); } void QmitkChartWidget::SetColor(const std::string& label, const std::string& colorName) { m_Impl->SetColor(label, colorName); } void QmitkChartWidget::SetLineStyle(const std::string& label, LineStyle style) { m_Impl->SetLineStyle(label, style); } void QmitkChartWidget::SetYAxisScale(AxisScale scale) { m_Impl->SetYAxisScale(scale); } void QmitkChartWidget::AddData1D(const std::vector& data1D, const std::string& label, ChartType type) { m_Impl->AddData1D(data1D, label, type); } void QmitkChartWidget::RemoveData(const std::string& label) { m_Impl->RemoveData(label); } void QmitkChartWidget::SetXAxisLabel(const std::string & label) { m_Impl->SetXAxisLabel(label); } std::string QmitkChartWidget::GetXAxisLabel() const { return m_Impl->GetXAxisLabel(); } void QmitkChartWidget::SetYAxisLabel(const std::string & label) { m_Impl->SetYAxisLabel(label); } std::string QmitkChartWidget::GetYAxisLabel() const { return m_Impl->GetYAxisLabel(); } void QmitkChartWidget::SetTitle(const std::string & title) { m_Impl->SetTitle(title); } std::string QmitkChartWidget::GetTitle() const { return m_Impl->GetTitle(); } void QmitkChartWidget::SetShowDataPoints(bool showDataPoints) { m_Impl->SetShowDataPoints(showDataPoints); } bool QmitkChartWidget::GetShowDataPoints() const { return m_Impl->GetShowDataPoints(); } +void QmitkChartWidget::SetChartTypeForAllDataAndReload(ChartType type) +{ + m_Impl->SetChartType(type); +} + void QmitkChartWidget::SetChartType(const std::string& label, ChartType type) { - m_Impl->SetChartType(label, type); + m_Impl->SetChartTypeByLabel(label, type); } void QmitkChartWidget::SetLegendPosition(LegendPosition position) { m_Impl->SetLegendPosition(position); } QmitkChartWidget::LegendPosition QmitkChartWidget::GetLegendPosition() const { return m_Impl->GetLegendPosition(); } void QmitkChartWidget::Show(bool showSubChart) { - if (m_Impl->GetC3xyData()->empty()) { - mitkThrow() << "no data available for display in chart"; - } - this->m_Impl->GetC3Data()->SetAppearance(showSubChart, m_Impl->GetC3xyData()->front()->GetChartType()== QVariant("pie")); - m_Impl->InitializeJavaScriptChart(); + m_Impl->Show(showSubChart); } void QmitkChartWidget::Clear() { m_Impl->ClearData(); m_Impl->ClearJavaScriptChart(); } void QmitkChartWidget::OnLoadFinished(bool isLoadSuccessfull) { if(isLoadSuccessfull) { emit PageSuccessfullyLoaded(); } } -void QmitkChartWidget::SetChartTypeForAllDataAndReload(ChartType type) -{ - auto allData = this->m_Impl->GetC3xyData(); - for (auto iterator = allData->begin(); iterator != allData->end(); ++iterator) { - SetChartType((*iterator)->GetLabel().toString().toStdString(), type); - } - auto chartTypeName = m_Impl->ConvertChartTypeToString(type); - const QString command = QString::fromStdString("transformView('" + chartTypeName + "')"); - m_Impl->CallJavaScriptFuntion(command); -} - void QmitkChartWidget::SetTheme(ChartStyle themeEnabled) { QString command; if (themeEnabled == ChartStyle::darkstyle) { command = QString("changeTheme('dark')"); } else { command = QString("changeTheme('light')"); } m_Impl->CallJavaScriptFuntion(command); } void QmitkChartWidget::Reload(bool showSubChart) { QString subChartString; if (showSubChart) { subChartString = "true"; } else { subChartString = "false"; } const QString command = QString("ReloadChart(" + subChartString + ")"); m_Impl->CallJavaScriptFuntion(command); }