Warning, file /education/kmplot/kmplot/calculator.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 KmPlot - a math. function plotter for the KDE-Desktop 0003 0004 SPDX-FileCopyrightText: 2007 David Saxton <david@bluehaze.org> 0005 0006 This file is part of the KDE Project. 0007 KmPlot is part of the KDE-EDU Project. 0008 0009 SPDX-License-Identifier: GPL-2.0-or-later 0010 0011 */ 0012 0013 #include "calculator.h" 0014 #include "equationedit.h" 0015 #include "equationeditorwidget.h" 0016 #include "xparser.h" 0017 0018 #include <KConfigGroup> 0019 #include <KTextEdit> 0020 0021 #include <QDialogButtonBox> 0022 #include <QScrollBar> 0023 #include <QVBoxLayout> 0024 0025 // BEGIN class Calculator 0026 Calculator::Calculator(QWidget *parent) 0027 : QDialog(parent) 0028 { 0029 setModal(false); 0030 QWidget *widget = new QWidget(this); 0031 setWindowTitle(i18nc("@title:window", "Calculator")); 0032 0033 QVBoxLayout *layout = new QVBoxLayout(this); 0034 0035 m_display = new KTextEdit(widget); 0036 QSizePolicy displaySizePolicy = m_display->sizePolicy(); 0037 displaySizePolicy.setVerticalStretch(10); 0038 displaySizePolicy.setVerticalPolicy(QSizePolicy::MinimumExpanding); 0039 m_display->setSizePolicy(displaySizePolicy); 0040 layout->addWidget(m_display); 0041 0042 m_input = new EquationEditorWidget(this); 0043 layout->addWidget(m_input); 0044 0045 m_display->setReadOnly(true); 0046 0047 QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); 0048 connect(buttonBox, &QDialogButtonBox::accepted, this, &Calculator::accept); 0049 connect(buttonBox, &QDialogButtonBox::rejected, this, &Calculator::reject); 0050 layout->addWidget(buttonBox); 0051 0052 connect(m_input->edit, &EquationEdit::returnPressed, this, &Calculator::calculate); 0053 0054 // Set minimum size and margin to avoid cutting the right side 0055 resize(1.05 * layout->minimumSize()); 0056 m_input->edit->setFocus(); 0057 } 0058 0059 Calculator::~Calculator() 0060 { 0061 m_input->deleteLater(); 0062 } 0063 0064 void Calculator::calculate() 0065 { 0066 Parser::Error error; 0067 double value = XParser::self()->eval(m_input->edit->text(), &error); 0068 0069 m_displayText += m_input->edit->text().replace('<', "<"); 0070 0071 if (error == Parser::ParseSuccess) 0072 m_displayText += " = <b>" + Parser::number(value) + "</b>"; 0073 else 0074 m_displayText += " = ? <font color=\"blue\">(" + Parser::errorString(error) + ")</font>"; 0075 0076 m_displayText += "<br>"; 0077 0078 m_display->document()->setHtml(m_displayText); 0079 m_display->verticalScrollBar()->setValue(m_display->verticalScrollBar()->maximum()); 0080 m_input->edit->selectAll(); 0081 } 0082 // END class Calculator