File indexing completed on 2024-04-21 03:42:04

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('<', "&lt;");
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
0083 
0084 #include "moc_calculator.cpp"