• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kalgebra

  • sources
  • kde-4.14
  • kdeedu
  • kalgebra
  • src
functionedit.cpp
Go to the documentation of this file.
1 /*************************************************************************************
2  * Copyright (C) 2007-2009 by Aleix Pol <aleixpol@kde.org> *
3  * *
4  * This program is free software; you can redistribute it and/or *
5  * modify it under the terms of the GNU General Public License *
6  * as published by the Free Software Foundation; either version 2 *
7  * of the License, or (at your option) any later version. *
8  * *
9  * This program is distributed in the hope that it will be useful, *
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12  * GNU General Public License for more details. *
13  * *
14  * You should have received a copy of the GNU General Public License *
15  * along with this program; if not, write to the Free Software *
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA *
17  *************************************************************************************/
18 
19 #include "functionedit.h"
20 
21 #include <QVBoxLayout>
22 #include <QHBoxLayout>
23 #include <QLabel>
24 #include <QLineEdit>
25 
26 #include <KLocale>
27 #include <KTabWidget>
28 #include <KColorScheme>
29 
30 #include <analitzagui/expressionedit.h>
31 #include <analitza/analyzer.h>
32 #include <analitza/expression.h>
33 #include <analitza/variables.h>
34 #include <analitza/value.h>
35 #include <analitzagui/algebrahighlighter.h>
36 #include <analitzagui/plotsview2d.h>
37 #include <analitzaplot/planecurve.h>
38 #include <analitzaplot/plotsmodel.h>
39 #include <analitzaplot/plotsfactory.h>
40 
41 using namespace Analitza;
42 
43 namespace {
44  static const int resolution = 200;
45 }
46 
47 FunctionEdit::FunctionEdit(QWidget *parent)
48  : QWidget(parent), m_calcUplimit(0), m_calcDownlimit(0)
49 {
50  setWindowTitle(i18n("Add/Edit a function"));
51 
52  QVBoxLayout *topLayout = new QVBoxLayout(this);
53  topLayout->setMargin(2);
54  topLayout->setSpacing(5);
55 
56  m_name = new KLineEdit(this);
57 
58  m_func = new ExpressionEdit(this);
59  m_func->setExamples(PlotsFactory::self()->examples(Dim2D));
60  m_func->setAns("x");
61  connect(m_func, SIGNAL(textChanged()), this, SLOT(edit()));
62  connect(m_func, SIGNAL(returnPressed()), this, SLOT(ok()));
63 
64  m_valid = new QLabel(this);
65  m_valid->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
66 
67  QPalette p=palette();
68  p.setColor(QPalette::Active, QPalette::Base, Qt::white);
69  m_valid->setPalette(p);
70 
71  m_validIcon = new QLabel(this);
72  m_validIcon->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
73  QLayout* validLayout=new QHBoxLayout;
74  validLayout->addWidget(m_validIcon);
75  validLayout->addWidget(m_valid);
76 
77  m_color = new KColorCombo(this);
78  m_color->setColor(QColor(0,150,0));
79  connect(m_color, SIGNAL(currentIndexChanged(int)), this, SLOT(colorChange(int)));
80 
81  m_funcsModel=new PlotsModel(this);
82  m_funcsModel->setResolution(resolution);
83 
84  m_viewTabs=new KTabWidget(this);
85 
86  m_graph = new PlotsView2D(m_viewTabs);
87  m_graph->setModel(m_funcsModel);
88  m_graph->setViewport(QRectF(QPointF(-10.0, 10.0), QSizeF(20.0, -20.0)));
89  m_graph->setFocusPolicy(Qt::NoFocus);
90  m_graph->setMouseTracking(false);
91  m_graph->setFramed(true);
92  m_graph->setReadOnly(true);
93  m_graph->setShowGrid(false);
94  m_graph->setTicksShown(Qt::Orientation(0));
95 
96  m_viewTabs->addTab(m_graph, QIcon::fromTheme("document-preview"), i18n("Preview"));
97  QWidget *options=new QWidget(m_viewTabs);
98  options->setLayout(new QVBoxLayout);
99  m_uplimit=new ExpressionEdit(options);
100  m_downlimit=new ExpressionEdit(options);
101  m_uplimit->setText("2*pi");
102  m_downlimit->setText("0");
103  options->layout()->addWidget(new QLabel(i18n("From:"), options));
104  options->layout()->addWidget(m_downlimit);
105  options->layout()->addWidget(new QLabel(i18n("To:"), options));
106  options->layout()->addWidget(m_uplimit);
107  options->layout()->addItem(new QSpacerItem(0,0, QSizePolicy::Expanding, QSizePolicy::Expanding));
108  m_viewTabs->addTab(options, QIcon::fromTheme("configure"), i18n("Options"));
109  connect(m_uplimit, SIGNAL(textChanged()), this, SLOT(updateUplimit()));
110  connect(m_downlimit, SIGNAL(textChanged()), this, SLOT(updateDownlimit()));
111 
112  QHBoxLayout *m_butts = new QHBoxLayout;
113  m_ok = new QPushButton(i18n("OK"), this);
114  m_ok->setIcon(QIcon::fromTheme("dialog-ok"));
115  m_remove = new QPushButton(i18nc("@action:button", "Remove"), this);
116  m_remove->setIcon(QIcon::fromTheme("list-remove"));
117  connect(m_ok, SIGNAL(clicked()), this, SLOT(ok()));
118  connect(m_remove, SIGNAL(clicked()), this, SIGNAL(removeEditingPlot()));
119 
120  topLayout->addWidget(m_name);
121  topLayout->addWidget(m_func);
122  topLayout->addWidget(m_color);
123  topLayout->addLayout(validLayout);
124  topLayout->addWidget(m_viewTabs);
125  topLayout->addLayout(m_butts);
126 
127  m_name->hide(); //FIXME: Remove this when the name has any sense
128 
129  m_butts->addWidget(m_ok);
130  m_butts->addWidget(m_remove);
131 
132  m_func->setFocus();
133  m_ok->setEnabled(false);
134 
135  QFont errorFont=m_valid->font();
136  errorFont.setBold(true);
137  m_valid->setFont(errorFont);
138 }
139 
140 FunctionEdit::~FunctionEdit()
141 {}
142 
143 void FunctionEdit::clear()
144 {
145  m_func->setText(QString());
146  m_funcsModel->clear();
147  edit();
148 }
149 
150 void FunctionEdit::setFunction(const QString &newText)
151 {
152  m_func->setText(newText);
153  m_func->document()->setModified(true);
154 }
155 
156 void FunctionEdit::setColor(const QColor &newColor)
157 {
158  m_color->setColor(newColor);
159  if(m_funcsModel->rowCount()>0)
160  m_funcsModel->setData(m_funcsModel->index(0), newColor);
161 }
162 
163 void FunctionEdit::colorChange(int)
164 {
165  setColor(m_color->color());
166 }
167 
168 static double calcExp(const Analitza::Expression& exp, Analitza::Variables* v, bool* corr)
169 {
170  Q_ASSERT(exp.isCorrect());
171  Analitza::Analyzer d(v);
172  d.setExpression(exp);
173  Analitza::Expression r=d.calculate();
174 
175  *corr=r.isCorrect() && r.isReal();
176 
177  if(*corr)
178  return r.toReal().value();
179  else
180  return 0.;
181 }
182 
183 void FunctionEdit::updateUplimit()
184 {
185  bool corr = m_uplimit->isCorrect();
186  if(corr) {
187  Analitza::Expression e=m_uplimit->expression();
188  m_calcUplimit=calcExp(e, m_vars, &corr);
189  m_uplimit->setCorrect(corr);
190  if(corr)
191  edit();
192  }
193 }
194 
195 void FunctionEdit::updateDownlimit()
196 {
197  bool corr = m_downlimit->isCorrect();
198  if(corr) {
199  Analitza::Expression e=m_downlimit->expression();
200  m_calcDownlimit=calcExp(e, m_vars, &corr);
201  m_downlimit->setCorrect(corr);
202  if(corr)
203  edit();
204  }
205 }
206 
207 void FunctionEdit::setState(const QString& text, bool negative)
208 {
209  QFontMetrics fm(m_valid->font());
210  m_valid->setText(fm.elidedText(text, Qt::ElideRight, m_valid->width()));
211  m_valid->setToolTip(text);
212 
213  KColorScheme scheme(QPalette::Normal);
214  KColorScheme::ForegroundRole role = negative? KColorScheme::NegativeText : KColorScheme::PositiveText;
215 
216  QPalette p=m_valid->palette();
217  p.setColor(foregroundRole(), scheme.foreground(role).color());
218  m_valid->setPalette(p);
219 
220  if(negative)
221  m_validIcon->setPixmap(QIcon::fromTheme("flag-red").pixmap(QSize(16,16)));
222  else
223  m_validIcon->setPixmap(QIcon::fromTheme("flag-green").pixmap(QSize(16,16)));
224 }
225 
227 void FunctionEdit::edit()
228 {
229  if(m_func->text().isEmpty()) {
230  m_func->setCorrect(true);
231  m_ok->setEnabled(false);
232  m_valid->clear();
233  m_valid->setToolTip(QString());
234  m_validIcon->setPixmap(QIcon::fromTheme("flag-yellow").pixmap(QSize(16,16)));
235 
236  m_funcsModel->clear();
237  m_graph->forceRepaint();
238  return;
239  }
240 
241  if(!m_uplimit->isCorrect() || !m_downlimit->isCorrect()) {
242  setState(i18n("The options you specified are not correct"), true);
243  return;
244  }
245 
246  if(m_calcDownlimit>m_calcUplimit) {
247  setState(i18n("Downlimit cannot be greater than uplimit"), true);
248  return;
249  }
250  bool added = false;
251 
252  PlaneCurve* f = 0;
253  PlotBuilder req = PlotsFactory::self()->requestPlot(expression(), Dim2D, m_vars);
254  if(req.canDraw())
255  f = createFunction();
256 
257  if(f && f->isCorrect())
258  f->update(QRect(-10, 10, 20, -20));
259 
260  m_funcsModel->clear();
261  if(f && f->isCorrect()) {
262  m_funcsModel->addPlot(f);
263  added=true;
264  setState(QString("%1:=%2")
265  .arg(m_name->text()).arg(f->expression().toString()), false);
266  } else {
267  QStringList errors = req.errors();
268  if(f)
269  errors = f->errors();
270  Q_ASSERT(!errors.isEmpty());
271 
272  setState(errors.first(), true);
273  m_valid->setToolTip(errors.join("<br />"));
274  delete f;
275  }
276  m_func->setCorrect(added);
277  m_ok->setEnabled(added);
278 }
279 
280 void FunctionEdit::ok()
281 {
282  if(m_ok->isEnabled())
283  emit accept();
284 }
285 
286 void FunctionEdit::focusInEvent(QFocusEvent *)
287 {
288  m_func->setFocus();
289 }
290 
291 PlaneCurve* FunctionEdit::createFunction() const
292 {
293  PlotBuilder req = PlotsFactory::self()->requestPlot(expression(), Dim2D, m_vars);
294  PlaneCurve* curve = static_cast<PlaneCurve*>(req.create(color(), name()));
295  curve->setResolution(resolution);
296  if(m_calcUplimit != m_calcDownlimit) {
297  foreach(const QString& var, curve->parameters())
298  curve->setInterval(var, m_calcUplimit, m_calcDownlimit);
299  }
300  return curve;
301 }
302 
303 Analitza::Expression FunctionEdit::expression() const
304 {
305  return m_func->expression();
306 }
307 
308 void FunctionEdit::setOptionsShown(bool shown)
309 {
310  m_viewTabs->setVisible(shown);
311 }
312 
313 void FunctionEdit::resizeEvent(QResizeEvent*)
314 {
315  QFontMetrics fm(m_valid->font());
316  m_valid->setText(fm.elidedText(m_valid->toolTip(), Qt::ElideRight, m_valid->width()));
317 }
318 
319 void FunctionEdit::setEditing(bool m)
320 {
321  m_modmode=m;
322  m_remove->setVisible(m);
323 }
QWidget::layout
QLayout * layout() const
QSpacerItem
FunctionEdit::setOptionsShown
void setOptionsShown(bool shown)
Definition: functionedit.cpp:308
QResizeEvent
QWidget
calcExp
static double calcExp(const Analitza::Expression &exp, Analitza::Variables *v, bool *corr)
Definition: functionedit.cpp:168
QWidget::palette
const QPalette & palette() const
QLayout::addItem
virtual void addItem(QLayoutItem *item)=0
QPalette::setColor
void setColor(ColorGroup group, ColorRole role, const QColor &color)
QFont
QLabel::setPixmap
void setPixmap(const QPixmap &)
QLayout
QWidget::setVisible
virtual void setVisible(bool visible)
QHBoxLayout
QFontMetrics
FunctionEdit::FunctionEdit
FunctionEdit(QWidget *parent=0)
Constructor.
Definition: functionedit.cpp:47
QLabel::clear
void clear()
QStringList::join
QString join(const QString &separator) const
FunctionEdit::~FunctionEdit
~FunctionEdit()
Destructor.
Definition: functionedit.cpp:140
functionedit.h
FunctionEdit::expression
Analitza::Expression expression() const
Retrieves the resulting expression text.
Definition: functionedit.cpp:303
QAbstractButton::setIcon
void setIcon(const QIcon &icon)
QWidget::foregroundRole
QPalette::ColorRole foregroundRole() const
QPointF
QWidget::width
width
QFont::setBold
void setBold(bool enable)
QRect
QWidget::setEnabled
void setEnabled(bool)
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QWidget::setLayout
void setLayout(QLayout *layout)
FunctionEdit::setEditing
void setEditing(bool m)
Sets whether we are editing or adding a function.
Definition: functionedit.cpp:319
QList::isEmpty
bool isEmpty() const
FunctionEdit::clear
void clear()
Clears the dialog.
Definition: functionedit.cpp:143
QVBoxLayout
FunctionEdit::removeEditingPlot
void removeEditingPlot()
asks the currently edited plot to be removed.
QList::first
T & first()
QLabel::setText
void setText(const QString &)
QString
QColor
QLayout::setMargin
void setMargin(int margin)
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QLayout::addWidget
void addWidget(QWidget *w)
QStringList
QSize
QWidget::font
font
FunctionEdit::accept
void accept()
Tells that the result has been accepted.
QSizeF
QRectF
QWidget::setWindowTitle
void setWindowTitle(const QString &)
QWidget::QWidget
QWidget(QWidget *parent, QFlags< Qt::WindowType > f)
FunctionEdit::resizeEvent
virtual void resizeEvent(QResizeEvent *ev)
Definition: functionedit.cpp:313
FunctionEdit::color
QColor color() const
Retrieves the selected color for the function.
Definition: functionedit.h:65
QPushButton
QIcon::fromTheme
QIcon fromTheme(const QString &name, const QIcon &fallback)
FunctionEdit::setFunction
void setFunction(const QString &newText)
Sets an expression text to the ExpressionEdit widget.
Definition: functionedit.cpp:150
QWidget::setToolTip
void setToolTip(const QString &)
FunctionEdit::createFunction
Analitza::PlaneCurve * createFunction() const
Definition: functionedit.cpp:291
FunctionEdit::setColor
void setColor(const QColor &newColor)
Sets the selected color for the function.
Definition: functionedit.cpp:156
FunctionEdit::name
QString name() const
Retrieves a name for the function.
Definition: functionedit.h:80
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QLabel
QFocusEvent
QPalette
QBoxLayout::setSpacing
void setSpacing(int spacing)
QBoxLayout::addLayout
void addLayout(QLayout *layout, int stretch)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:11:49 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kalgebra

Skip menu "kalgebra"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal