| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 4 | ** Contact: https://www.qt.io/licensing/ |
| 5 | ** |
| 6 | ** This file is part of the Qt Charts module of the Qt Toolkit. |
| 7 | ** |
| 8 | ** $QT_BEGIN_LICENSE:GPL$ |
| 9 | ** Commercial License Usage |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 11 | ** accordance with the commercial license agreement provided with the |
| 12 | ** Software or, alternatively, in accordance with the terms contained in |
| 13 | ** a written agreement between you and The Qt Company. For licensing terms |
| 14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 15 | ** information use the contact form at https://www.qt.io/contact-us. |
| 16 | ** |
| 17 | ** GNU General Public License Usage |
| 18 | ** Alternatively, this file may be used under the terms of the GNU |
| 19 | ** General Public License version 3 or (at your option) any later version |
| 20 | ** approved by the KDE Free Qt Foundation. The licenses are as published by |
| 21 | ** the Free Software Foundation and appearing in the file LICENSE.GPL3 |
| 22 | ** included in the packaging of this file. Please review the following |
| 23 | ** information to ensure the GNU General Public License requirements will |
| 24 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| 25 | ** |
| 26 | ** $QT_END_LICENSE$ |
| 27 | ** |
| 28 | ****************************************************************************/ |
| 29 | |
| 30 | #include "window.h" |
| 31 | #include "view.h" |
| 32 | #include "grid.h" |
| 33 | #include "charts.h" |
| 34 | #include <QtCharts/QChartView> |
| 35 | #include <QtCharts/QAreaSeries> |
| 36 | #include <QtCharts/QLegend> |
| 37 | #include <QtCharts/QValueAxis> |
| 38 | #include <QtWidgets/QGridLayout> |
| 39 | #include <QtWidgets/QFormLayout> |
| 40 | #include <QtWidgets/QComboBox> |
| 41 | #include <QtWidgets/QSpinBox> |
| 42 | #include <QtWidgets/QCheckBox> |
| 43 | #include <QtWidgets/QGroupBox> |
| 44 | #include <QtWidgets/QLabel> |
| 45 | #include <QtWidgets/QGraphicsScene> |
| 46 | #include <QtWidgets/QGraphicsLinearLayout> |
| 47 | #include <QtWidgets/QGraphicsProxyWidget> |
| 48 | #include <QtWidgets/QOpenGLWidget> |
| 49 | #include <QtWidgets/QApplication> |
| 50 | #include <QtCore/QDebug> |
| 51 | #include <QtCore/QRegularExpression> |
| 52 | #include <QtWidgets/QMenu> |
| 53 | #include <QtWidgets/QPushButton> |
| 54 | |
| 55 | Window::Window(const QVariantHash ¶meters, QWidget *parent) |
| 56 | : QMainWindow(parent), |
| 57 | m_scene(new QGraphicsScene(this)), |
| 58 | m_view(0), |
| 59 | m_form(0), |
| 60 | m_themeComboBox(0), |
| 61 | m_antialiasCheckBox(0), |
| 62 | m_animatedComboBox(0), |
| 63 | m_legendComboBox(0), |
| 64 | m_templateComboBox(0), |
| 65 | m_viewComboBox(0), |
| 66 | m_xTickSpinBox(0), |
| 67 | m_yTickSpinBox(0), |
| 68 | m_minorXTickSpinBox(0), |
| 69 | m_minorYTickSpinBox(0), |
| 70 | m_openGLCheckBox(0), |
| 71 | m_zoomCheckBox(0), |
| 72 | m_scrollCheckBox(0), |
| 73 | m_gridCheckBox(0), |
| 74 | m_baseLayout(new QGraphicsLinearLayout()), |
| 75 | m_menu(createMenu()), |
| 76 | m_template(0), |
| 77 | m_grid(new Grid(-1)) |
| 78 | { |
| 79 | createProxyWidgets(); |
| 80 | // create layout |
| 81 | QGraphicsLinearLayout *settingsLayout = new QGraphicsLinearLayout(); |
| 82 | |
| 83 | settingsLayout->setOrientation(Qt::Vertical); |
| 84 | settingsLayout->setSizePolicy(hPolicy: QSizePolicy::Maximum, vPolicy: QSizePolicy::Maximum); |
| 85 | settingsLayout->addItem(item: m_widgetHash["openGLCheckBox" ]); |
| 86 | settingsLayout->addItem(item: m_widgetHash["antialiasCheckBox" ]); |
| 87 | settingsLayout->addItem(item: m_widgetHash["viewLabel" ]); |
| 88 | settingsLayout->addItem(item: m_widgetHash["viewComboBox" ]); |
| 89 | settingsLayout->addItem(item: m_widgetHash["themeLabel" ]); |
| 90 | settingsLayout->addItem(item: m_widgetHash["themeComboBox" ]); |
| 91 | settingsLayout->addItem(item: m_widgetHash["animationsLabel" ]); |
| 92 | settingsLayout->addItem(item: m_widgetHash["animatedComboBox" ]); |
| 93 | settingsLayout->addItem(item: m_widgetHash["legendLabel" ]); |
| 94 | settingsLayout->addItem(item: m_widgetHash["legendComboBox" ]); |
| 95 | settingsLayout->addItem(item: m_widgetHash["templateLabel" ]); |
| 96 | settingsLayout->addItem(item: m_widgetHash["templateComboBox" ]); |
| 97 | settingsLayout->addItem(item: m_widgetHash["scrollCheckBox" ]); |
| 98 | settingsLayout->addItem(item: m_widgetHash["zoomCheckBox" ]); |
| 99 | settingsLayout->addItem(item: m_widgetHash["gridCheckBox" ]); |
| 100 | settingsLayout->addItem(item: m_widgetHash["xTickLabel" ]); |
| 101 | settingsLayout->addItem(item: m_widgetHash["xTickSpinBox" ]); |
| 102 | settingsLayout->addItem(item: m_widgetHash["yTickLabel" ]); |
| 103 | settingsLayout->addItem(item: m_widgetHash["yTickSpinBox" ]); |
| 104 | settingsLayout->addItem(item: m_widgetHash["minorXTickLabel" ]); |
| 105 | settingsLayout->addItem(item: m_widgetHash["minorXTickSpinBox" ]); |
| 106 | settingsLayout->addItem(item: m_widgetHash["minorYTickLabel" ]); |
| 107 | settingsLayout->addItem(item: m_widgetHash["minorYTickSpinBox" ]); |
| 108 | settingsLayout->addStretch(); |
| 109 | |
| 110 | m_baseLayout->setOrientation(Qt::Horizontal); |
| 111 | m_baseLayout->addItem(item: m_grid); |
| 112 | m_baseLayout->addItem(item: settingsLayout); |
| 113 | |
| 114 | m_form = new QGraphicsWidget(); |
| 115 | m_form->setLayout(m_baseLayout); |
| 116 | m_scene->addItem(item: m_form); |
| 117 | |
| 118 | m_view = new View(m_scene, m_form); |
| 119 | m_view->setMinimumSize(m_form->minimumSize().toSize()); |
| 120 | |
| 121 | // Set defaults |
| 122 | m_antialiasCheckBox->setChecked(true); |
| 123 | initializeFromParamaters(parameters); |
| 124 | updateUI(); |
| 125 | if(!m_category.isEmpty() && !m_subcategory.isEmpty() && !m_name.isEmpty()) |
| 126 | m_grid->createCharts(category: m_category,subcategory: m_subcategory,name: m_name); |
| 127 | |
| 128 | |
| 129 | handleGeometryChanged(); |
| 130 | setCentralWidget(m_view); |
| 131 | |
| 132 | connectSignals(); |
| 133 | } |
| 134 | |
| 135 | Window::~Window() |
| 136 | { |
| 137 | } |
| 138 | |
| 139 | void Window::connectSignals() |
| 140 | { |
| 141 | QObject::connect(sender: m_form, SIGNAL(geometryChanged()), receiver: this , SLOT(handleGeometryChanged())); |
| 142 | QObject::connect(sender: m_viewComboBox, SIGNAL(currentIndexChanged(int)), receiver: this, SLOT(updateUI())); |
| 143 | QObject::connect(sender: m_themeComboBox, SIGNAL(currentIndexChanged(int)), receiver: this, SLOT(updateUI())); |
| 144 | QObject::connect(sender: m_xTickSpinBox, SIGNAL(valueChanged(int)), receiver: this, SLOT(updateUI())); |
| 145 | QObject::connect(sender: m_yTickSpinBox, SIGNAL(valueChanged(int)), receiver: this, SLOT(updateUI())); |
| 146 | QObject::connect(sender: m_minorXTickSpinBox, SIGNAL(valueChanged(int)), receiver: this, SLOT(updateUI())); |
| 147 | QObject::connect(sender: m_minorYTickSpinBox, SIGNAL(valueChanged(int)), receiver: this, SLOT(updateUI())); |
| 148 | QObject::connect(sender: m_antialiasCheckBox, SIGNAL(toggled(bool)), receiver: this, SLOT(updateUI())); |
| 149 | QObject::connect(sender: m_openGLCheckBox, SIGNAL(toggled(bool)), receiver: this, SLOT(updateUI())); |
| 150 | QObject::connect(sender: m_zoomCheckBox, SIGNAL(toggled(bool)), receiver: this, SLOT(updateUI())); |
| 151 | QObject::connect(sender: m_scrollCheckBox, SIGNAL(toggled(bool)), receiver: this, SLOT(updateUI())); |
| 152 | QObject::connect(sender: m_gridCheckBox, SIGNAL(toggled(bool)), receiver: this, SLOT(updateUI())); |
| 153 | QObject::connect(sender: m_animatedComboBox, SIGNAL(currentIndexChanged(int)), receiver: this, SLOT(updateUI())); |
| 154 | QObject::connect(sender: m_legendComboBox, SIGNAL(currentIndexChanged(int)), receiver: this, SLOT(updateUI())); |
| 155 | QObject::connect(sender: m_templateComboBox, SIGNAL(currentIndexChanged(int)), receiver: this, SLOT(updateUI())); |
| 156 | QObject::connect(sender: m_grid, SIGNAL(chartSelected(QChart*)), receiver: this, SLOT(handleChartSelected(QChart*))); |
| 157 | } |
| 158 | |
| 159 | void Window::createProxyWidgets() |
| 160 | { |
| 161 | m_themeComboBox = createThemeBox(); |
| 162 | m_viewComboBox = createViewBox(); |
| 163 | m_xTickSpinBox = new QSpinBox(); |
| 164 | m_xTickSpinBox->setMinimum(2); |
| 165 | m_xTickSpinBox->setValue(5); |
| 166 | m_yTickSpinBox = new QSpinBox(); |
| 167 | m_yTickSpinBox->setMinimum(2); |
| 168 | m_yTickSpinBox->setValue(5); |
| 169 | m_minorXTickSpinBox = new QSpinBox(); |
| 170 | m_minorYTickSpinBox = new QSpinBox(); |
| 171 | m_antialiasCheckBox = new QCheckBox(tr(s: "Anti-aliasing" )); |
| 172 | m_animatedComboBox = createAnimationBox(); |
| 173 | m_legendComboBox = createLegendBox(); |
| 174 | m_openGLCheckBox = new QCheckBox(tr(s: "OpenGL" )); |
| 175 | m_zoomCheckBox = new QCheckBox(tr(s: "Zoom" )); |
| 176 | m_scrollCheckBox = new QCheckBox(tr(s: "Scroll" )); |
| 177 | m_gridCheckBox = new QCheckBox(tr(s: "Grid lines" )); |
| 178 | m_templateComboBox = createTempleteBox(); |
| 179 | m_widgetHash["viewLabel" ] = m_scene->addWidget(widget: new QLabel("View" )); |
| 180 | m_widgetHash["viewComboBox" ] = m_scene->addWidget(widget: m_viewComboBox); |
| 181 | m_widgetHash["themeComboBox" ] = m_scene->addWidget(widget: m_themeComboBox); |
| 182 | m_widgetHash["antialiasCheckBox" ] = m_scene->addWidget(widget: m_antialiasCheckBox); |
| 183 | m_widgetHash["animatedComboBox" ] = m_scene->addWidget(widget: m_animatedComboBox); |
| 184 | m_widgetHash["legendComboBox" ] = m_scene->addWidget(widget: m_legendComboBox); |
| 185 | m_widgetHash["xTickLabel" ] = m_scene->addWidget(widget: new QLabel("X Tick" )); |
| 186 | m_widgetHash["xTickSpinBox" ] = m_scene->addWidget(widget: m_xTickSpinBox); |
| 187 | m_widgetHash["yTickLabel" ] = m_scene->addWidget(widget: new QLabel("Y Tick" )); |
| 188 | m_widgetHash["yTickSpinBox" ] = m_scene->addWidget(widget: m_yTickSpinBox); |
| 189 | m_widgetHash["minorXTickLabel" ] = m_scene->addWidget(widget: new QLabel("Minor X Tick" )); |
| 190 | m_widgetHash["minorXTickSpinBox" ] = m_scene->addWidget(widget: m_minorXTickSpinBox); |
| 191 | m_widgetHash["minorYTickLabel" ] = m_scene->addWidget(widget: new QLabel("Minor Y Tick" )); |
| 192 | m_widgetHash["minorYTickSpinBox" ] = m_scene->addWidget(widget: m_minorYTickSpinBox); |
| 193 | m_widgetHash["openGLCheckBox" ] = m_scene->addWidget(widget: m_openGLCheckBox); |
| 194 | m_widgetHash["themeLabel" ] = m_scene->addWidget(widget: new QLabel("Theme" )); |
| 195 | m_widgetHash["animationsLabel" ] = m_scene->addWidget(widget: new QLabel("Animations" )); |
| 196 | m_widgetHash["legendLabel" ] = m_scene->addWidget(widget: new QLabel("Legend" )); |
| 197 | m_widgetHash["templateLabel" ] = m_scene->addWidget(widget: new QLabel("Chart template" )); |
| 198 | m_widgetHash["templateComboBox" ] = m_scene->addWidget(widget: m_templateComboBox); |
| 199 | m_widgetHash["zoomCheckBox" ] = m_scene->addWidget(widget: m_zoomCheckBox); |
| 200 | m_widgetHash["scrollCheckBox" ] = m_scene->addWidget(widget: m_scrollCheckBox); |
| 201 | m_widgetHash["gridCheckBox" ] = m_scene->addWidget(widget: m_gridCheckBox); |
| 202 | } |
| 203 | |
| 204 | QComboBox *Window::createThemeBox() |
| 205 | { |
| 206 | QComboBox *themeComboBox = new ComboBox(this); |
| 207 | themeComboBox->addItem(atext: "Light" , auserData: QChart::ChartThemeLight); |
| 208 | themeComboBox->addItem(atext: "Blue Cerulean" , auserData: QChart::ChartThemeBlueCerulean); |
| 209 | themeComboBox->addItem(atext: "Dark" , auserData: QChart::ChartThemeDark); |
| 210 | themeComboBox->addItem(atext: "Brown Sand" , auserData: QChart::ChartThemeBrownSand); |
| 211 | themeComboBox->addItem(atext: "Blue NCS" , auserData: QChart::ChartThemeBlueNcs); |
| 212 | themeComboBox->addItem(atext: "High Contrast" , auserData: QChart::ChartThemeHighContrast); |
| 213 | themeComboBox->addItem(atext: "Blue Icy" , auserData: QChart::ChartThemeBlueIcy); |
| 214 | themeComboBox->addItem(atext: "Qt" , auserData: QChart::ChartThemeQt); |
| 215 | return themeComboBox; |
| 216 | } |
| 217 | |
| 218 | QComboBox *Window::createViewBox() |
| 219 | { |
| 220 | QComboBox *viewComboBox = new ComboBox(this); |
| 221 | viewComboBox->addItem(atext: "1 chart" , auserData: 1); |
| 222 | viewComboBox->addItem(atext: "4 charts" , auserData: 2); |
| 223 | viewComboBox->addItem(atext: "9 charts" , auserData: 3); |
| 224 | viewComboBox->addItem(atext: "16 charts" , auserData: 4); |
| 225 | return viewComboBox; |
| 226 | } |
| 227 | |
| 228 | QComboBox *Window::createAnimationBox() |
| 229 | { |
| 230 | QComboBox *animationComboBox = new ComboBox(this); |
| 231 | animationComboBox->addItem(atext: "No Animations" , auserData: QChart::NoAnimation); |
| 232 | animationComboBox->addItem(atext: "GridAxis Animations" , auserData: QChart::GridAxisAnimations); |
| 233 | animationComboBox->addItem(atext: "Series Animations" , auserData: QChart::SeriesAnimations); |
| 234 | animationComboBox->addItem(atext: "All Animations" , auserData: QChart::AllAnimations); |
| 235 | return animationComboBox; |
| 236 | } |
| 237 | |
| 238 | QComboBox *Window::createLegendBox() |
| 239 | { |
| 240 | QComboBox *legendComboBox = new ComboBox(this); |
| 241 | legendComboBox->addItem(atext: "No Legend " , auserData: 0); |
| 242 | legendComboBox->addItem(atext: "Legend Top" , auserData: Qt::AlignTop); |
| 243 | legendComboBox->addItem(atext: "Legend Bottom" , auserData: Qt::AlignBottom); |
| 244 | legendComboBox->addItem(atext: "Legend Left" , auserData: Qt::AlignLeft); |
| 245 | legendComboBox->addItem(atext: "Legend Right" , auserData: Qt::AlignRight); |
| 246 | return legendComboBox; |
| 247 | } |
| 248 | |
| 249 | QComboBox *Window::createTempleteBox() |
| 250 | { |
| 251 | QComboBox *templateComboBox = new ComboBox(this); |
| 252 | templateComboBox->addItem(atext: "No Template" , auserData: 0); |
| 253 | |
| 254 | Charts::ChartList list = Charts::chartList(); |
| 255 | QMultiMap<QString, Chart *> categoryMap; |
| 256 | |
| 257 | foreach (Chart *chart, list) |
| 258 | categoryMap.insertMulti(key: chart->category(), value: chart); |
| 259 | |
| 260 | foreach (const QString &category, categoryMap.uniqueKeys()) |
| 261 | templateComboBox->addItem(atext: category, auserData: category); |
| 262 | |
| 263 | return templateComboBox; |
| 264 | } |
| 265 | |
| 266 | void Window::initializeFromParamaters(const QVariantHash ¶meters) |
| 267 | { |
| 268 | if (parameters.contains(akey: "view" )) { |
| 269 | int t = parameters["view" ].toInt(); |
| 270 | for (int i = 0; i < m_viewComboBox->count(); ++i) { |
| 271 | if (m_viewComboBox->itemData(index: i).toInt() == t) { |
| 272 | m_viewComboBox->setCurrentIndex(i); |
| 273 | break; |
| 274 | } |
| 275 | } |
| 276 | } |
| 277 | |
| 278 | if (parameters.contains(akey: "chart" )) { |
| 279 | QString t = parameters["chart" ].toString(); |
| 280 | |
| 281 | QRegularExpression rx("([a-zA-Z0-9_]*)::([a-zA-Z0-9_]*)::([a-zA-Z0-9_]*)" ); |
| 282 | QRegularExpressionMatch rmatch; |
| 283 | int pos = t.indexOf(re: rx, from: 0, rmatch: &rmatch); |
| 284 | |
| 285 | if (pos > -1) { |
| 286 | m_category = rmatch.captured(nth: 1); |
| 287 | m_subcategory = rmatch.captured(nth: 2); |
| 288 | m_name = rmatch.captured(nth: 3); |
| 289 | m_templateComboBox->setCurrentIndex(0); |
| 290 | } |
| 291 | else { |
| 292 | for (int i = 0; i < m_templateComboBox->count(); ++i) { |
| 293 | if (m_templateComboBox->itemText(index: i) == t) { |
| 294 | m_templateComboBox->setCurrentIndex(i); |
| 295 | break; |
| 296 | } |
| 297 | } |
| 298 | } |
| 299 | } |
| 300 | if (parameters.contains(akey: "opengl" )) { |
| 301 | bool checked = parameters["opengl" ].toBool(); |
| 302 | m_openGLCheckBox->setChecked(checked); |
| 303 | } |
| 304 | if (parameters.contains(akey: "theme" )) { |
| 305 | QString t = parameters["theme" ].toString(); |
| 306 | for (int i = 0; i < m_themeComboBox->count(); ++i) { |
| 307 | if (m_themeComboBox->itemText(index: i) == t) { |
| 308 | m_themeComboBox->setCurrentIndex(i); |
| 309 | break; |
| 310 | } |
| 311 | } |
| 312 | } |
| 313 | if (parameters.contains(akey: "animation" )) { |
| 314 | QString t = parameters["animation" ].toString(); |
| 315 | for (int i = 0; i < m_animatedComboBox->count(); ++i) { |
| 316 | if (m_animatedComboBox->itemText(index: i) == t) { |
| 317 | m_animatedComboBox->setCurrentIndex(i); |
| 318 | break; |
| 319 | } |
| 320 | } |
| 321 | } |
| 322 | if (parameters.contains(akey: "legend" )) { |
| 323 | QString t = parameters["legend" ].toString(); |
| 324 | for (int i = 0; i < m_legendComboBox->count(); ++i) { |
| 325 | if (m_legendComboBox->itemText(index: i) == t) { |
| 326 | m_legendComboBox->setCurrentIndex(i); |
| 327 | break; |
| 328 | } |
| 329 | } |
| 330 | } |
| 331 | } |
| 332 | |
| 333 | void Window::updateUI() |
| 334 | { |
| 335 | checkView(); |
| 336 | checkTemplate(); |
| 337 | checkOpenGL(); |
| 338 | checkTheme(); |
| 339 | checkAnimationOptions(); |
| 340 | checkLegend(); |
| 341 | checkState(); |
| 342 | checkXTick(); |
| 343 | checkYTick(); |
| 344 | checkMinorXTick(); |
| 345 | checkMinorYTick(); |
| 346 | } |
| 347 | |
| 348 | void Window::checkView() |
| 349 | { |
| 350 | int count(m_viewComboBox->itemData(index: m_viewComboBox->currentIndex()).toInt()); |
| 351 | if(m_grid->size()!=count){ |
| 352 | m_grid->setSize(count); |
| 353 | m_template = 0; |
| 354 | } |
| 355 | } |
| 356 | |
| 357 | void Window::checkXTick() |
| 358 | { |
| 359 | foreach (QChart *chart, m_grid->charts()) { |
| 360 | if (qobject_cast<QValueAxis *>(object: chart->axisX())) { |
| 361 | QValueAxis *valueAxis = qobject_cast<QValueAxis *>(object: chart->axisX()); |
| 362 | valueAxis->setGridLineVisible(m_gridCheckBox->isChecked()); |
| 363 | valueAxis->setTickCount(m_xTickSpinBox->value()); |
| 364 | } |
| 365 | } |
| 366 | } |
| 367 | |
| 368 | void Window::checkYTick() |
| 369 | { |
| 370 | foreach (QChart *chart, m_grid->charts()) { |
| 371 | if (qobject_cast<QValueAxis *>(object: chart->axisY())) { |
| 372 | QValueAxis *valueAxis = qobject_cast<QValueAxis *>(object: chart->axisY()); |
| 373 | valueAxis->setGridLineVisible(m_gridCheckBox->isChecked()); |
| 374 | valueAxis->setTickCount(m_yTickSpinBox->value()); |
| 375 | } |
| 376 | } |
| 377 | } |
| 378 | |
| 379 | void Window::checkMinorXTick() |
| 380 | { |
| 381 | foreach (QChart *chart, m_grid->charts()) { |
| 382 | if (qobject_cast<QValueAxis *>(object: chart->axisX())) { |
| 383 | QValueAxis *valueAxis = qobject_cast<QValueAxis *>(object: chart->axisX()); |
| 384 | valueAxis->setMinorGridLineVisible(m_gridCheckBox->isChecked()); |
| 385 | valueAxis->setGridLineVisible(m_gridCheckBox->isChecked()); |
| 386 | valueAxis->setMinorTickCount(m_minorXTickSpinBox->value()); |
| 387 | } |
| 388 | } |
| 389 | } |
| 390 | |
| 391 | void Window::checkMinorYTick() |
| 392 | { |
| 393 | foreach (QChart *chart, m_grid->charts()) { |
| 394 | if (qobject_cast<QValueAxis *>(object: chart->axisY())) { |
| 395 | QValueAxis *valueAxis = qobject_cast<QValueAxis *>(object: chart->axisY()); |
| 396 | valueAxis->setMinorGridLineVisible(m_gridCheckBox->isChecked()); |
| 397 | valueAxis->setGridLineVisible(m_gridCheckBox->isChecked()); |
| 398 | valueAxis->setMinorTickCount(m_minorYTickSpinBox->value()); |
| 399 | } |
| 400 | } |
| 401 | } |
| 402 | |
| 403 | void Window::checkLegend() |
| 404 | { |
| 405 | Qt::Alignment alignment(m_legendComboBox->itemData(index: m_legendComboBox->currentIndex()).toInt()); |
| 406 | |
| 407 | if (!alignment) { |
| 408 | foreach (QChart *chart, m_grid->charts()) |
| 409 | chart->legend()->hide(); |
| 410 | } else { |
| 411 | foreach (QChart *chart, m_grid->charts()) { |
| 412 | chart->legend()->setAlignment(alignment); |
| 413 | chart->legend()->show(); |
| 414 | } |
| 415 | } |
| 416 | } |
| 417 | |
| 418 | void Window::checkOpenGL() |
| 419 | { |
| 420 | bool opengl = m_openGLCheckBox->isChecked(); |
| 421 | bool isOpengl = qobject_cast<QOpenGLWidget *>(object: m_view->viewport()); |
| 422 | if ((isOpengl && !opengl) || (!isOpengl && opengl)) { |
| 423 | m_view->deleteLater(); |
| 424 | m_view = new View(m_scene, m_form); |
| 425 | m_view->setViewport(!opengl ? new QWidget() : new QOpenGLWidget()); |
| 426 | setCentralWidget(m_view); |
| 427 | } |
| 428 | |
| 429 | bool antialias = m_antialiasCheckBox->isChecked(); |
| 430 | |
| 431 | m_view->setRenderHint(hint: QPainter::Antialiasing, enabled: antialias); |
| 432 | } |
| 433 | |
| 434 | void Window::checkAnimationOptions() |
| 435 | { |
| 436 | QChart::AnimationOptions options( |
| 437 | m_animatedComboBox->itemData(index: m_animatedComboBox->currentIndex()).toInt()); |
| 438 | |
| 439 | QList<QChart *> charts = m_grid->charts(); |
| 440 | |
| 441 | if (!charts.isEmpty() && charts.at(i: 0)->animationOptions() != options) { |
| 442 | foreach (QChart *chart, charts) |
| 443 | chart->setAnimationOptions(options); |
| 444 | } |
| 445 | } |
| 446 | |
| 447 | void Window::checkState() |
| 448 | { |
| 449 | bool scroll = m_scrollCheckBox->isChecked(); |
| 450 | |
| 451 | |
| 452 | if (m_grid->state() != Grid::ScrollState && scroll) { |
| 453 | m_grid->setState(Grid::ScrollState); |
| 454 | m_zoomCheckBox->setChecked(false); |
| 455 | } else if (!scroll && m_grid->state() == Grid::ScrollState) { |
| 456 | m_grid->setState(Grid::NoState); |
| 457 | } |
| 458 | |
| 459 | bool zoom = m_zoomCheckBox->isChecked(); |
| 460 | |
| 461 | if (m_grid->state() != Grid::ZoomState && zoom) { |
| 462 | m_grid->setState(Grid::ZoomState); |
| 463 | m_scrollCheckBox->setChecked(false); |
| 464 | } else if (!zoom && m_grid->state() == Grid::ZoomState) { |
| 465 | m_grid->setState(Grid::NoState); |
| 466 | } |
| 467 | } |
| 468 | |
| 469 | void Window::checkTemplate() |
| 470 | { |
| 471 | int index = m_templateComboBox->currentIndex(); |
| 472 | if (m_template == index || index == 0) |
| 473 | return; |
| 474 | |
| 475 | m_template = index; |
| 476 | QString category = m_templateComboBox->itemData(index).toString(); |
| 477 | m_grid->createCharts(category); |
| 478 | } |
| 479 | |
| 480 | void Window::checkTheme() |
| 481 | { |
| 482 | QChart::ChartTheme theme = (QChart::ChartTheme) m_themeComboBox->itemData( |
| 483 | index: m_themeComboBox->currentIndex()).toInt(); |
| 484 | |
| 485 | foreach (QChart *chart, m_grid->charts()) |
| 486 | chart->setTheme(theme); |
| 487 | |
| 488 | QPalette pal = window()->palette(); |
| 489 | if (theme == QChart::ChartThemeLight) { |
| 490 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0xf0f0f0)); |
| 491 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0x404044)); |
| 492 | } else if (theme == QChart::ChartThemeDark) { |
| 493 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0x121218)); |
| 494 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0xd6d6d6)); |
| 495 | } else if (theme == QChart::ChartThemeBlueCerulean) { |
| 496 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0x40434a)); |
| 497 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0xd6d6d6)); |
| 498 | } else if (theme == QChart::ChartThemeBrownSand) { |
| 499 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0x9e8965)); |
| 500 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0x404044)); |
| 501 | } else if (theme == QChart::ChartThemeBlueNcs) { |
| 502 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0x018bba)); |
| 503 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0x404044)); |
| 504 | } else if (theme == QChart::ChartThemeHighContrast) { |
| 505 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0xffab03)); |
| 506 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0x181818)); |
| 507 | } else if (theme == QChart::ChartThemeBlueIcy) { |
| 508 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0xcee7f0)); |
| 509 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0x404044)); |
| 510 | } else if (theme == QChart::ChartThemeQt) { |
| 511 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0xf0f0f0)); |
| 512 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0x404044)); |
| 513 | } else { |
| 514 | pal.setColor(acr: QPalette::Window, acolor: QRgb(0xf0f0f0)); |
| 515 | pal.setColor(acr: QPalette::WindowText, acolor: QRgb(0x404044)); |
| 516 | } |
| 517 | foreach (QGraphicsProxyWidget *widget, m_widgetHash) |
| 518 | widget->setPalette(pal); |
| 519 | m_view->setBackgroundBrush(pal.color(cr: (QPalette::Window))); |
| 520 | m_grid->setRubberPen(pal.color(cr: (QPalette::WindowText))); |
| 521 | } |
| 522 | |
| 523 | void Window::comboBoxFocused(QComboBox *combobox) |
| 524 | { |
| 525 | foreach (QGraphicsProxyWidget *widget , m_widgetHash) { |
| 526 | if (widget->widget() == combobox) |
| 527 | widget->setZValue(2.0); |
| 528 | else |
| 529 | widget->setZValue(0.0); |
| 530 | } |
| 531 | } |
| 532 | |
| 533 | void Window::handleChartSelected(QChart *qchart) |
| 534 | { |
| 535 | if (m_templateComboBox->currentIndex() != 0) |
| 536 | return; |
| 537 | |
| 538 | QAction *chosen = m_menu->exec(pos: QCursor::pos()); |
| 539 | |
| 540 | if (chosen) { |
| 541 | Chart *chart = (Chart *) chosen->data().value<void *>(); |
| 542 | m_grid->replaceChart(oldChart: qchart, newChart: chart); |
| 543 | updateUI(); |
| 544 | } |
| 545 | } |
| 546 | |
| 547 | QMenu *Window::() |
| 548 | { |
| 549 | Charts::ChartList list = Charts::chartList(); |
| 550 | QMultiMap<QString, Chart *> categoryMap; |
| 551 | |
| 552 | QMenu *result = new QMenu(this); |
| 553 | |
| 554 | foreach (Chart *chart, list) |
| 555 | categoryMap.insertMulti(key: chart->category(), value: chart); |
| 556 | |
| 557 | foreach (const QString &category, categoryMap.uniqueKeys()) { |
| 558 | QMenu *(0); |
| 559 | QMultiMap<QString, Chart *> subCategoryMap; |
| 560 | if (category.isEmpty()) { |
| 561 | menu = result; |
| 562 | } else { |
| 563 | menu = new QMenu(category, this); |
| 564 | result->addMenu(menu); |
| 565 | } |
| 566 | |
| 567 | foreach (Chart *chart, categoryMap.values(category)) |
| 568 | subCategoryMap.insert(akey: chart->subCategory(), avalue: chart); |
| 569 | |
| 570 | foreach (const QString &subCategory, subCategoryMap.uniqueKeys()) { |
| 571 | QMenu *(0); |
| 572 | if (subCategory.isEmpty()) { |
| 573 | subMenu = menu; |
| 574 | } else { |
| 575 | subMenu = new QMenu(subCategory, this); |
| 576 | menu->addMenu(menu: subMenu); |
| 577 | } |
| 578 | |
| 579 | foreach (Chart *chart, subCategoryMap.values(subCategory)) { |
| 580 | createMenuAction(menu: subMenu, icon: QIcon(), text: chart->name(), |
| 581 | data: QVariant::fromValue(value: static_cast<void *>(chart))); |
| 582 | } |
| 583 | } |
| 584 | } |
| 585 | return result; |
| 586 | } |
| 587 | |
| 588 | QAction *Window::(QMenu *, const QIcon &icon, const QString &text, |
| 589 | const QVariant &data) |
| 590 | { |
| 591 | QAction *action = menu->addAction(icon, text); |
| 592 | action->setCheckable(false); |
| 593 | action->setData(data); |
| 594 | return action; |
| 595 | } |
| 596 | |
| 597 | void Window::handleGeometryChanged() |
| 598 | { |
| 599 | QSizeF size = m_baseLayout->sizeHint(which: Qt::MinimumSize); |
| 600 | m_view->scene()->setSceneRect(x: 0, y: 0, w: this->width(), h: this->height()); |
| 601 | m_view->setMinimumSize(size.toSize()); |
| 602 | } |
| 603 | |