• 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
kalgebra.cpp
Go to the documentation of this file.
1 /*************************************************************************************
2  * Copyright (C) 2007 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 "kalgebra.h"
20 #include "varedit.h"
21 #include "consolehtml.h"
22 #include "dictionary.h"
23 #include "askname.h"
24 #include "variablesdelegate.h"
25 #include "viewportwidget.h"
26 #include "functionedit.h"
27 #ifdef HAVE_OPENGL
28 # include <analitzagui//plotsview3d.h>
29 #endif
30 
31 #include <analitzagui/operatorsmodel.h>
32 #include <analitzagui/expressionedit.h>
33 #include <analitzagui/variablesmodel.h>
34 #include <analitzagui/plotsview2d.h>
35 #include <analitzaplot/plotsmodel.h>
36 #include <analitzaplot/functiongraph.h>
37 #include <analitzaplot/planecurve.h>
38 #include <analitza/variables.h>
39 #include <analitza/value.h>
40 
41 #include <QVBoxLayout>
42 #include <QHeaderView>
43 #include <QDockWidget>
44 #include <QTableView>
45 #include <QPrinter>
46 #include <KAction>
47 #include <KHTMLView>
48 #include <KHelpMenu>
49 #include <KFileDialog>
50 #include <KMenu>
51 #include <KMenuBar>
52 #include <KStatusBar>
53 #include <KLocale>
54 #include <KStandardAction>
55 #include <KProcess>
56 #include <KRecentFilesAction>
57 #include <KApplication>
58 #include <KToggleFullScreenAction>
59 #include <kabstractfilewidget.h>
60 #include <analitzaplot/plotsfactory.h>
61 
62 class Add2DOption : public InlineOptions
63 {
64  public:
65  Add2DOption(KAlgebra* c)
66  : m_kalgebra(c)
67  {}
68 
69  virtual QString id() const { return "add2d"; }
70  virtual bool matchesExpression(const Analitza::Expression& exp, const Analitza::ExpressionType& functype) const {
71  return Analitza::PlotsFactory::self()->requestPlot(exp, Analitza::Dim2D).canDraw();
72  }
73 
74  virtual QString caption() const { return i18n("Plot 2D"); }
75 
76  virtual void triggerOption(const Analitza::Expression& exp) { m_kalgebra->add2D(exp); }
77 
78  private:
79  KAlgebra* m_kalgebra;
80 };
81 
82 #ifdef HAVE_OPENGL
83 class Add3DOption : public InlineOptions
84 {
85  public:
86  Add3DOption(KAlgebra* c)
87  : m_kalgebra(c)
88  {}
89 
90  virtual QString id() const { return "add3d"; }
91  virtual bool matchesExpression(const Analitza::Expression& exp, const Analitza::ExpressionType& functype) const
92  {
93  return Analitza::PlotsFactory::self()->requestPlot(exp, Analitza::Dim3D).canDraw();
94  }
95 
96  virtual QString caption() const { return i18n("Plot 3D"); }
97 
98  virtual void triggerOption(const Analitza::Expression& exp) { m_kalgebra->add3D(exp); }
99 
100  private:
101  KAlgebra* m_kalgebra;
102 };
103 #endif
104 
105 QColor randomFunctionColor() { return QColor::fromHsv(qrand()%255, 255, 255); }
106 
107 KAlgebra::KAlgebra(QWidget *parent) : KMainWindow(parent)
108 {
109  resize(900, 500);
110 
111  m_tabs = new QTabWidget;
112  setCentralWidget(m_tabs);
113 
114  setStatusBar(new KStatusBar(this));
115  setMenuBar(new KMenuBar(this));
116 
117  KToggleFullScreenAction* fullScreenAction = KStandardAction::fullScreen(this, SLOT(fullScreen(bool)), this, this);
118 
119  QMenu* g_menu = menuBar()->addMenu(i18n("Session"));
120  g_menu->addAction(KStandardAction::openNew(this, SLOT(newInstance()), this));
121  g_menu->addAction(fullScreenAction);
122  g_menu->addAction(KStandardAction::quit(this, SLOT(close()), this));
123 
124  QToolButton* fullScreenButton = new QToolButton(this);
125  fullScreenButton->setDefaultAction(fullScreenAction);
126  m_tabs->setCornerWidget(fullScreenButton);
127 
128  m_status = new QLabel(this);
129  statusBar()->insertWidget(0, m_status);
130  menuBar()->addMenu("|")->setEnabled(false);
131 
133  QWidget *console = new QWidget(m_tabs);
134  QVBoxLayout *c_layo = new QVBoxLayout(console);
135  c_results = new ConsoleHtml(console);
136  c_results->setFocusPolicy(Qt::NoFocus);
137  c_dock_vars = new QDockWidget(i18n("Variables"), this);
138  c_dock_vars->setFeatures(QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable);
139  addDockWidget(Qt::RightDockWidgetArea, c_dock_vars);
140 
141  c_varsModel=new Analitza::VariablesModel(c_results->analitza()->variables());
142  c_varsModel->setEditable(false);
143 
144  c_variables = new QTreeView(c_dock_vars);
145  c_variables->setModel(c_varsModel);
146  c_variables->setRootIsDecorated(false);
147  c_variables->header()->setStretchLastSection(true);
148  c_variables->setSelectionBehavior(QAbstractItemView::SelectRows);
149  c_variables->setSelectionMode(QAbstractItemView::SingleSelection);
150 
151  c_exp = new Analitza::ExpressionEdit(console);
152  c_exp->setAnalitza(c_results->analitza());
153  c_exp->setExamples(QStringList() << "square:=x->x**2" << "fib:=n->piecewise { eq(n,0)?0, eq(n,1)?1, ?fib(n-1)+fib(n-2) }");
154  c_dock_vars->setWidget(c_variables);
155 
156  m_tabs->addTab(console, i18n("&Console"));
157  console->setLayout(c_layo);
158  c_layo->addWidget(c_results);
159  c_layo->addWidget(c_exp);
160 
161  connect(c_exp, SIGNAL(returnPressed()), this, SLOT(operate()));
162  connect(c_results, SIGNAL(status(QString)), this, SLOT(changeStatusBar(QString)));
163  connect(c_results, SIGNAL(changed()), this, SLOT(updateInformation()));
164  connect(c_results, SIGNAL(changed()), c_exp, SLOT(updateCompleter()));
165  connect(c_results, SIGNAL(paste(QString)), c_exp, SLOT(insertText(QString)));
166  connect(c_variables, SIGNAL(clicked(QModelIndex)), this, SLOT(edit_var(QModelIndex)));
168  c_menu = menuBar()->addMenu(i18n("C&onsole"));
169 
170  c_menu->addAction(KIcon("document-open"), i18nc("@item:inmenu", "&Load Script..."),
171  this, SLOT(loadScript()), Qt::CTRL+Qt::Key_L);
172  c_recentScripts=new KRecentFilesAction(KIcon("document-open-recent"), i18n("Recent Scripts"), this);
173  connect(c_recentScripts, SIGNAL(urlSelected(KUrl)), this, SLOT(loadScript(KUrl)));
174  c_menu->addAction(c_recentScripts);
175 
176  c_menu->addAction(KIcon("document-save"), i18nc("@item:inmenu", "&Save Script..."),
177  this, SLOT(saveScript()), Qt::CTRL+Qt::Key_G);
178  c_menu->addAction(KIcon("document-save"), i18nc("@item:inmenu", "&Export Log..."),
179  this, SLOT(saveLog()), QKeySequence::Save);
180  c_menu->addSeparator()->setText(i18n("Execution Mode"));
181  QActionGroup *execGroup = new QActionGroup(c_menu);
182  QAction* calc = c_menu->addAction(i18nc("@item:inmenu", "Calculate"), this, SLOT(consoleCalculate()));
183  QAction* eval = c_menu->addAction(i18nc("@item:inmenu", "Evaluate"), this, SLOT(consoleEvaluate()));
184 
185  calc->setCheckable(true);
186  eval->setCheckable(true);
187  eval->setChecked(true);
188  execGroup->addAction(calc);
189  execGroup->addAction(eval);
190  c_menu->addSeparator();
191  c_menu->addAction(KStandardAction::clear(c_results, SLOT(clear()), this));
192  initializeRecentScripts();
195 
197  b_funcsModel=new Analitza::PlotsModel(this);
198 
199  m_graph2d = new Analitza::PlotsView2D(m_tabs);
200  m_graph2d->setTicksShown(0);
201  m_graph2d->setModel(b_funcsModel);
202 
203  b_dock_funcs = new QDockWidget(i18n("Functions"), this);
204  b_tools = new QTabWidget(b_dock_funcs);
205  b_tools->setTabPosition(QTabWidget::South);
206  addDockWidget(Qt::RightDockWidgetArea, b_dock_funcs);
207 
208  b_funcs = new QTreeView(b_tools);
209  b_funcs->setRootIsDecorated(false);
210  b_funcs->setModel(b_funcsModel);
211  b_funcs->header()->resizeSections(QHeaderView::ResizeToContents);
212  b_funcs->setSelectionMode(QAbstractItemView::SingleSelection);
213  m_graph2d->setSelectionModel(b_funcs->selectionModel());
214 
215  b_tools->addTab(b_funcs, i18n("List"));
216 
217  b_funced = new FunctionEdit(b_tools);
218  b_funced->setVariables(c_varsModel->variables());
219  connect(b_funced, SIGNAL(accept()), this, SLOT(new_func()));
220  connect(b_funced, SIGNAL(removeEditingPlot()), this, SLOT(remove_func()));
221  b_tools->addTab(b_funced, KIcon("list-add"), i18n("&Add"));
222 
223  QTableView* b_varsView=new QTableView(b_tools);
224  b_varsModel=new Analitza::VariablesModel(b_funced->variables());
225  b_varsView->setModel(b_varsModel);
226  b_varsView->setShowGrid(false);
227  b_varsView->verticalHeader()->hide();
228  b_varsView->horizontalHeader()->setStretchLastSection(true);
229  b_varsView->setSelectionBehavior(QAbstractItemView::SelectRows);
230  b_varsView->setContextMenuPolicy(Qt::CustomContextMenu);
231  VariablesDelegate* delegate=new VariablesDelegate(b_varsView);
232  b_varsView->setItemDelegate(delegate);
233  b_tools->addTab(b_varsView, i18n("Variables"));
234 
235  ViewportWidget* b_viewport = new ViewportWidget(this);
236  b_viewport->setViewport(m_graph2d->definedViewport());
237  b_tools->addTab(b_viewport, i18n("Viewport"));
238 
239  b_dock_funcs->setWidget(b_tools);
240  b_dock_funcs->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
241  m_tabs->addTab(m_graph2d, i18n("&2D Graph"));
242  c_results->addOptionsObserver(new Add2DOption(this));
243 
244  connect(b_varsModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(valueChanged()));
245  connect(b_funcs, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(edit_func(QModelIndex)));
246  connect(b_tools, SIGNAL(currentChanged(int)), this, SLOT(functools(int)));
247  connect(m_graph2d, SIGNAL(status(QString)), this, SLOT(changeStatusBar(QString)));
248  connect(m_graph2d, SIGNAL(viewportChanged(QRectF)), b_viewport, SLOT(setViewport(QRectF)));
249  connect(b_viewport, SIGNAL(viewportChange(QRectF)), m_graph2d, SLOT(changeViewport(QRectF)));
250  connect(b_varsView, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(varsContextMenu(QPoint)));
251 
253  b_menu = menuBar()->addMenu(i18n("2&D Graph"));
254  QAction* b_actions[6];
255  b_actions[0] = b_menu->addAction(i18n("&Grid"), this, SLOT(toggleSquares()));
256  b_actions[1] = b_menu->addAction(i18n("&Keep Aspect Ratio"), this, SLOT(toggleKeepAspect()));
257  b_menu->addAction(KStandardAction::save(this, SLOT(saveGraph()), this));
258  b_menu->addSeparator();
259  b_menu->addAction(KStandardAction::zoomIn(m_graph2d, SLOT(zoomIn()), this));
260  b_menu->addAction(KStandardAction::zoomOut(m_graph2d, SLOT(zoomOut()), this));
261  KAction* ac=KStandardAction::actualSize(m_graph2d, SLOT(resetViewport()), this);
262  ac->setShortcut(Qt::ControlModifier + Qt::Key_0);
263  b_menu->addAction(ac);
264  b_menu->addSeparator()->setText(i18n("Resolution"));
265  b_actions[2] = b_menu->addAction(i18nc("@item:inmenu", "Poor"), this, SLOT(set_res_low()));
266  b_actions[3] = b_menu->addAction(i18nc("@item:inmenu", "Normal"), this, SLOT(set_res_std()));
267  b_actions[4] = b_menu->addAction(i18nc("@item:inmenu", "Fine"), this, SLOT(set_res_fine()));
268  b_actions[5] = b_menu->addAction(i18nc("@item:inmenu", "Very Fine"), this, SLOT(set_res_vfine()));
269  m_graph2d->setContextMenuPolicy(Qt::ActionsContextMenu);
270  m_graph2d->addActions(b_menu->actions());
271 
272  QActionGroup *res = new QActionGroup(b_menu);
273  res->addAction(b_actions[2]);
274  res->addAction(b_actions[3]);
275  res->addAction(b_actions[4]);
276  res->addAction(b_actions[5]);
277 
278  b_actions[0]->setCheckable(true);
279  b_actions[0]->setChecked(true);
280  b_actions[1]->setCheckable(true);
281  b_actions[1]->setChecked(true);
282  b_actions[2]->setCheckable(true);
283  b_actions[3]->setCheckable(true);
284  b_actions[3]->setChecked(true);
285  b_actions[4]->setCheckable(true);
286  b_actions[5]->setCheckable(true);
287  set_res_std();
289 
291 #ifdef HAVE_OPENGL
292  QWidget *tridim = new QWidget(m_tabs);
293  QVBoxLayout *t_layo = new QVBoxLayout(tridim);
294  t_exp = new Analitza::ExpressionEdit(tridim);
295  t_exp->setExamples(QStringList() << "sin x+sin y" << "(x,y)->x" << "x*y");
296  t_exp->setAns("x");
297  t_model3d = new Analitza::PlotsModel(this);
298  m_graph3d = new Analitza::PlotsView3D(tridim);
299  m_graph3d->setModel(t_model3d);
300  m_graph3d->setUseSimpleRotation(true);
301 
302  tridim->setLayout(t_layo);
303  m_tabs->addTab(tridim, i18n("&3D Graph"));
304  t_layo->addWidget(m_graph3d);
305  t_layo->addWidget(t_exp);
306 
307  connect(t_exp, SIGNAL(returnPressed()), this, SLOT(new_func3d()));
308  c_results->addOptionsObserver(new Add3DOption(this));
309 
311  t_menu = menuBar()->addMenu(i18n("3D &Graph"));
312  QAction* t_actions[5];
313  t_menu->addAction(KStandardAction::save(this, SLOT(save3DGraph()), this));
314  t_menu->addAction(KIcon("zoom-original"), i18n("&Reset View"), m_graph3d, SLOT(resetView()));
315  t_menu->addSeparator();
316  t_actions[2] = t_menu->addAction(i18n("Dots"), this, SLOT(set_dots()));
317  t_actions[3] = t_menu->addAction(i18n("Lines"), this, SLOT(set_lines()));
318  t_actions[4] = t_menu->addAction(i18n("Solid"), this, SLOT(set_solid()));
319 
320  QActionGroup *t_type = new QActionGroup(t_menu);
321  t_type->addAction(t_actions[2]);
322  t_type->addAction(t_actions[3]);
323  t_type->addAction(t_actions[4]);
324 
325  t_actions[2]->setCheckable(true);
326  t_actions[3]->setCheckable(true);
327  t_actions[4]->setCheckable(true);
328  t_actions[4]->setChecked(true);
329 #endif
330  menuBar()->addMenu("|")->setEnabled(false);
333 
334  //Dictionary tab
335  d_dock = new QDockWidget(i18n("Operations"), this);
336  d_dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
337  addDockWidget(Qt::RightDockWidgetArea, d_dock);
338  Dictionary *dic = new Dictionary(m_tabs);
339  m_tabs->addTab(dic, i18n("&Dictionary"));
340 
341  QWidget *w=new QWidget;
342  QLayout *leftLayo=new QVBoxLayout(w);
343  d_filter=new KLineEdit(w);
344  d_filter->setClearButtonShown(true);
345  d_filter->setSizePolicy(QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed));
346  connect(d_filter, SIGNAL(textChanged(QString)), dic, SLOT(setFilter(QString)));
347  connect(d_filter, SIGNAL(textChanged(QString)), this, SLOT(dictionaryFilterChanged(QString)));
348  d_list = new QListView(w);
349  d_list->setModel(dic->model());
350  d_list->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding));
351  leftLayo->addWidget(new QLabel(i18n("Look for:"), d_dock));
352  leftLayo->addWidget(d_filter);
353  leftLayo->addWidget(d_list);
354  d_dock->setWidget(w);
355 
356  connect(d_list->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
357  dic, SLOT(activated(QModelIndex,QModelIndex)));
358 
359  //EODictionary
360  //Ego's reminder
361  KHelpMenu* help = new KHelpMenu(this, KGlobal::mainComponent().aboutData());
362  menuBar()->addMenu(help->menu());
363 
364 #warning TODO: Port to PlotsModel
365 // connect(b_funcsModel, SIGNAL(functionModified(QString,Analitza::Expression)),
366 // c_results, SLOT(modifyVariable(QString,Analitza::Expression)));
367 // connect(b_funcsModel, SIGNAL(functionRemoved(QString)),
368 // c_results, SLOT(removeVariable(QString)));
369 
370  connect(m_tabs, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)));
371  tabChanged(0);
372 }
373 
374 KAlgebra::~KAlgebra()
375 {
376  KConfig conf("kalgebrarc");
377  KConfigGroup config(&conf, "Default");
378  QStringList urls;
379  foreach(const KUrl& url, c_recentScripts->urls())
380  urls += url.prettyUrl();
381 
382  config.writeEntry("recent", urls);
383 }
384 
385 void KAlgebra::initializeRecentScripts()
386 {
387  KConfig conf("kalgebrarc");
388  KConfigGroup config(&conf, "Default");
389 
390  QStringList urls=config.readEntry("recent", QStringList());
391  foreach(const QString& url, urls) {
392  c_recentScripts->addUrl(KUrl(url));
393  }
394 }
395 
396 void KAlgebra::newInstance()
397 {
398  KProcess::startDetached(QApplication::applicationFilePath());
399 }
400 
401 void KAlgebra::add2D(const Analitza::Expression& exp)
402 {
403  qDebug() << "adding" << exp.toString();
404 
405  Analitza::PlotBuilder req = Analitza::PlotsFactory::self()->requestPlot(exp, Analitza::Dim2D, c_results->analitza()->variables());
406  Analitza::PlotItem* curve = req.create(randomFunctionColor(), b_funcsModel->freeId());
407  b_funcsModel->addPlot(curve);
408 
409  m_tabs->setCurrentIndex(1);
410 }
411 
412 void KAlgebra::new_func()
413 {
414  Analitza::FunctionGraph* f=b_funced->createFunction();
415 
416  if(b_funced->editing()) {
417  QModelIndex idx = b_funcsModel->indexForName(f->name());
418  b_funcsModel->updatePlot(idx.row(), f);
419  } else {
420  b_funcsModel->addPlot(f);
421  }
422 
423  b_funced->setEditing(false);
424  b_funced->clear();
425  b_tools->setCurrentIndex(0);
426  b_funcs->setCurrentIndex(b_funcsModel->indexForName(f->name()));
427  m_graph2d->setFocus();
428 }
429 
430 void KAlgebra::remove_func()
431 {
432  Q_ASSERT(b_funced->editing());
433  b_funcsModel->removeRow(b_funcs->currentIndex().row());
434 
435  b_funced->setEditing(false);
436  b_funced->clear();
437  b_tools->setCurrentIndex(0);
438  b_funcs->setCurrentIndex(QModelIndex());
439  m_graph2d->setFocus();
440 }
441 
442 void KAlgebra::edit_func(const QModelIndex &idx)
443 {
444  b_tools->setTabText(1, i18n("&Editing"));
445  b_tools->setCurrentIndex(1);
446  b_funced->setName(b_funcsModel->data(idx.sibling(idx.row(), 0)).toString());
447  b_funced->setFunction(b_funcsModel->data(idx.sibling(idx.row(), 1)).toString());
448  b_funced->setEditing(true);
449  b_funced->setFocus();
450 }
451 
452 void KAlgebra::functools(int i)
453 {
454  if(i==0)
455  b_tools->setTabText(1, i18n("&Add"));
456  else {
457  b_funced->setName(b_funcsModel->freeId());
458  b_funced->setColor(randomFunctionColor());
459  b_funced->setEditing(false);
460  b_funced->setFocus();
461  }
462 }
463 
464 void KAlgebra::edit_var(const QModelIndex &idx)
465 {
466  if(idx.column()==0) {
467  c_exp->insertText(idx.data().toString());
468  } else {
469  QModelIndex idxName=idx.sibling(idx.row(), 0);
470 
471  QPointer<VarEdit> e(new VarEdit(this, false));
472  QString var = c_variables->model()->data(idxName, Qt::DisplayRole).toString();
473 
474  e->setAnalitza(c_results->analitza());
475  e->setName(var);
476 
477  if(e->exec() == QDialog::Accepted) {
478  QString str=var+" := "+e->val().toString();
479  c_results->addOperation(Analitza::Expression(str, false), str);
480  }
481  delete e;
482  }
483 }
484 
485 void KAlgebra::operate()
486 {
487  if(!c_exp->text().isEmpty()){
488  c_exp->setCorrect(c_results->addOperation(c_exp->expression(), c_exp->toPlainText()));
489  c_exp->selectAll();
490  }
491 }
492 
493 void KAlgebra::changeStatusBar(const QString& msg)
494 {
495 // statusBar()->showMessage(msg);
496  m_status->setText(msg);
497 }
498 
499 void KAlgebra::loadScript()
500 {
501  KUrl path = KFileDialog::getOpenUrl(KUrl(), "*.kal|"+i18n("Script (*.kal)"), this, i18n("Choose a script"));
502 
503  if(!path.isEmpty())
504  loadScript(path);
505 }
506 
507 void KAlgebra::loadScript(const KUrl& path)
508 {
509  bool loaded=c_results->loadScript(path);
510 
511  if(loaded)
512  c_recentScripts->addUrl(path);
513 }
514 
515 void KAlgebra::saveScript()
516 {
517  KUrl path = KFileDialog::getSaveUrl(KUrl(), "*.kal|"+i18n("Script (*.kal)"), this, QString(), KFileDialog::ConfirmOverwrite);
518  bool loaded=false;
519  if(!path.isEmpty())
520  loaded=c_results->saveScript(path);
521 
522  if(loaded)
523  c_recentScripts->addUrl(path);
524 }
525 
526 void KAlgebra::saveLog()
527 {
528  KUrl path = KFileDialog::getSaveUrl(KUrl(), "*.html|"+i18n("HTML File (*.html)"), this, QString(), KFileDialog::ConfirmOverwrite);
529  if(!path.isEmpty())
530  c_results->saveLog(path);
531 }
532 
533 void KAlgebra::set_res_low() { b_funcsModel->setResolution(416); }
534 void KAlgebra::set_res_std() { b_funcsModel->setResolution(832); }
535 void KAlgebra::set_res_fine() { b_funcsModel->setResolution(1664);}
536 void KAlgebra::set_res_vfine() { b_funcsModel->setResolution(3328);}
537 
538 void KAlgebra::new_func3d()
539 {
540 #ifdef HAVE_OPENGL
541  Analitza::Expression exp = t_exp->expression();
542  Analitza::PlotBuilder plot = Analitza::PlotsFactory::self()->requestPlot(exp, Analitza::Dim3D, c_results->analitza()->variables());
543  if(plot.canDraw()) {
544  t_model3d->clear();
545  t_model3d->addPlot(plot.create(Qt::yellow, "func3d"));
546  } else
547  changeStatusBar(i18n("Errors: %1", plot.errors().join(i18n(", "))));
548 #endif
549 }
550 
551 void KAlgebra::set_dots()
552 {
553 #ifdef HAVE_OPENGL
554  m_graph3d->setPlotStyle(Analitza::Dots);
555 #endif
556 }
557 
558 void KAlgebra::set_lines()
559 {
560 #ifdef HAVE_OPENGL
561  m_graph3d->setPlotStyle(Analitza::Wired);
562 #endif
563 }
564 
565 void KAlgebra::set_solid()
566 {
567 #ifdef HAVE_OPENGL
568  m_graph3d->setPlotStyle(Analitza::Solid);
569 #endif
570 }
571 
572 void KAlgebra::save3DGraph()
573 {
574 #ifdef HAVE_OPENGL
575  QString path = KFileDialog::getSaveFileName(KUrl(), i18n("*.png|PNG File\n*.pdf|PDF Document"), this, QString(), KFileDialog::ConfirmOverwrite);
576  if(!path.isEmpty()) {
577  QPixmap px = m_graph3d->renderPixmap();
578  if(path.endsWith(".pdf")) {
579  QPrinter printer;
580  printer.setOutputFormat(QPrinter::PdfFormat);
581  printer.setOutputFileName(path);
582  printer.setPaperSize(px.size(), QPrinter::DevicePixel);
583  printer.setPageMargins(0,0,0,0, QPrinter::DevicePixel);
584  QPainter painter;
585  painter.begin(&printer);
586  painter.drawPixmap(QPoint(0,0), px);
587  painter.end();
588  } else {
589  px.save(path);
590  }
591  }
592 #endif
593 }
594 
595 void KAlgebra::toggleSquares()
596 {
597  m_graph2d->setShowGrid(!m_graph2d->showGrid());
598 }
599 
600 void KAlgebra::toggleKeepAspect()
601 {
602  m_graph2d->setKeepAspectRatio(!m_graph2d->keepAspectRatio());
603 }
604 
605 void KAlgebra::saveGraph()
606 {
607  QPointer<KFileDialog> dialog=new KFileDialog(KUrl(), i18n("*.png|Image File\n*.svg|SVG File"), this);
608  dialog->setOperationMode(KFileDialog::Saving);
609  dialog->setConfirmOverwrite(true);
610 
611  if(dialog->exec()) {
612  QString filter = dialog->fileWidget()->currentFilter();
613  QString filename = dialog->selectedFile();
614 
615  bool isSvg = filename.endsWith(".svg") || (!filename.endsWith(".png") && filter.mid(2, 3)=="svg");
616  Analitza::PlotsView2D::Format f = isSvg ? Analitza::PlotsView2D::SVG : Analitza::PlotsView2D::PNG;
617  m_graph2d->toImage(filename, f);
618  }
619  delete dialog;
620 }
621 
622 void menuEnabledHelper(QMenu* m, bool enabled)
623 {
624  m->setEnabled(enabled);
625  foreach(QAction* action, m->actions()) {
626  action->setEnabled(enabled);
627  }
628 }
629 
630 void KAlgebra::tabChanged(int n)
631 {
632  c_dock_vars->hide();
633  b_dock_funcs->hide();
634  d_dock->hide();
635 
636  menuEnabledHelper(c_menu, n==0);
637  menuEnabledHelper(b_menu, n==1);
638 #ifdef HAVE_OPENGL
639  menuEnabledHelper(t_menu, n==2);
640 #endif
641  m_status->clear();
642 
643  switch(n) {
644  case 0:
645  c_dock_vars->show();
646  c_dock_vars->raise();
647  c_exp->setFocus();
648  break;
649  case 1:
650  b_dock_funcs->show();
651  b_dock_funcs->raise();
652 
653  if(b_funcsModel->rowCount()==0)
654  b_tools->setCurrentIndex(1); //We set the Add tab
655 // b_add->setFocus();
656  break;
657 #ifdef HAVE_OPENGL
658  case 2:
659  t_exp->setFocus();
660  break;
661 #endif
662  case 3:
663  d_filter->setFocus();
664  d_dock->show();
665  d_dock->raise();
666  default:
667  break;
668  }
669  changeStatusBar(i18nc("@info:status", "Ready"));
670 }
671 
672 void KAlgebra::select(const QModelIndex & idx)
673 {
674  b_funcs->selectionModel()->setCurrentIndex(idx, QItemSelectionModel::ClearAndSelect);
675 }
676 
677 void KAlgebra::updateInformation()
678 {
679  c_varsModel->updateInformation();
680  c_variables->header()->resizeSections(QHeaderView::ResizeToContents);
681 }
682 
683 void KAlgebra::consoleCalculate()
684 {
685  c_results->setMode(ConsoleHtml::Calculation);
686 }
687 
688 void KAlgebra::consoleEvaluate()
689 {
690  c_results->setMode(ConsoleHtml::Evaluation);
691 }
692 
693 void KAlgebra::valueChanged()
694 {
695  //FIXME: Should only repaint the affected ones.
696  if(b_funcsModel->rowCount()>0)
697  m_graph2d->updateFunctions(QModelIndex(), 0, b_funcsModel->rowCount()-1);
698 }
699 
700 void KAlgebra::varsContextMenu(const QPoint& p)
701 {
702  QPointer<QMenu> m=new QMenu;
703  m->addAction(i18n("Add variable"));
704  QAction* ac=m->exec(b_dock_funcs->widget()->mapToGlobal(p));
705 
706  if(ac) {
707  QPointer<AskName> a=new AskName(i18n("Enter a name for the new variable"), 0);
708 
709  if(a->exec()==QDialog::Accepted)
710  b_varsModel->insertVariable(a->name(), Analitza::Expression(Analitza::Cn(0)));
711  delete a;
712  }
713  delete m;
714 }
715 
716 void KAlgebra::add3D(const Analitza::Expression& exp)
717 {
718 #ifdef HAVE_OPENGL
719  t_model3d->clear();
720  Analitza::PlotBuilder plot = Analitza::PlotsFactory::self()->requestPlot(exp, Analitza::Dim3D, c_results->analitza()->variables());
721  Q_ASSERT(plot.canDraw());
722  t_model3d->addPlot(plot.create(Qt::yellow, "func3d_console"));
723  m_tabs->setCurrentIndex(2);
724 #endif
725 }
726 
727 void KAlgebra::dictionaryFilterChanged(const QString&)
728 {
729  if(d_list->model()->rowCount()==1)
730  d_list->setCurrentIndex(d_list->model()->index(0,0));
731 }
732 
733 void KAlgebra::fullScreen(bool isFull)
734 {
735  m_tabs->setDocumentMode(isFull);
736  m_tabs->setTabEnabled(3, !isFull);
737  if(isFull) {
738  hide();
739  m_tabs->setParent(0);
740  setCentralWidget(0);
741  m_tabs->showFullScreen();
742  } else {
743  setCentralWidget(m_tabs);
744  show();
745  }
746 }
QAction::setText
void setText(const QString &text)
QHeaderView::resizeSections
void resizeSections(QHeaderView::ResizeMode mode)
AskName
Definition: askname.h:29
QModelIndex
QPixmap::size
QSize size() const
ViewportWidget
Definition: viewportwidget.h:25
QWidget
QAbstractItemModel::rowCount
virtual int rowCount(const QModelIndex &parent) const =0
randomFunctionColor
QColor randomFunctionColor()
Definition: kalgebra.cpp:105
QAbstractItemModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const =0
QPainter::end
bool end()
varedit.h
KAlgebra::add3D
void add3D(const Analitza::Expression &exp)
Definition: kalgebra.cpp:716
QAbstractItemView::setCurrentIndex
void setCurrentIndex(const QModelIndex &index)
QAbstractItemView::setSelectionMode
void setSelectionMode(QAbstractItemView::SelectionMode mode)
QActionGroup
InlineOptions::id
virtual QString id() const =0
QAbstractItemView::selectionModel
QItemSelectionModel * selectionModel() const
QDockWidget
VarEdit
The VarEdit provides a dialog to allow users to edit/create a variable.
Definition: varedit.h:42
QPrinter::setOutputFileName
void setOutputFileName(const QString &fileName)
QPrinter
QToolButton::setDefaultAction
void setDefaultAction(QAction *action)
QWidget::setFocusPolicy
void setFocusPolicy(Qt::FocusPolicy policy)
QTabWidget::setCornerWidget
void setCornerWidget(QWidget *widget, Qt::Corner corner)
QAction::setChecked
void setChecked(bool)
QAbstractItemView::setModel
virtual void setModel(QAbstractItemModel *model)
QSizePolicy
QLayout
QMenu::addAction
void addAction(QAction *action)
QPointer
ConsoleHtml::analitza
Analitza::Analyzer * analitza()
Retrieves a pointer to the Analitza calculator associated.
Definition: consolehtml.h:62
QTabWidget::setDocumentMode
void setDocumentMode(bool set)
QWidget::mapToGlobal
QPoint mapToGlobal(const QPoint &pos) const
KAlgebra::~KAlgebra
~KAlgebra()
Definition: kalgebra.cpp:374
QActionGroup::addAction
QAction * addAction(QAction *action)
QTabWidget::setTabPosition
void setTabPosition(TabPosition)
QPoint
QTableView::verticalHeader
QHeaderView * verticalHeader() const
ConsoleHtml::addOperation
bool addOperation(const Analitza::Expression &e, const QString &input)
Adds the operation defined by the expression e.
Definition: consolehtml.cpp:97
QLabel::clear
void clear()
QAbstractItemView::setSelectionBehavior
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
functionedit.h
QTabWidget::setTabEnabled
void setTabEnabled(int index, bool enable)
VariablesDelegate
Definition: variablesdelegate.h:24
QWidget::setParent
void setParent(QWidget *parent)
ConsoleHtml::addOptionsObserver
void addOptionsObserver(InlineOptions *opt)
Definition: consolehtml.h:70
QTabWidget
QTabWidget::setTabText
void setTabText(int index, const QString &label)
QColor::fromHsv
QColor fromHsv(int h, int s, int v, int a)
QListView
consolehtml.h
QTabWidget::setCurrentIndex
void setCurrentIndex(int index)
Dictionary::model
QSortFilterProxyModel * model() const
Definition: dictionary.h:46
QWidget::setEnabled
void setEnabled(bool)
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
ConsoleHtml
The Console widget is able to receive an operation, solve it and show the value.
Definition: consolehtml.h:45
QTableView::setModel
virtual void setModel(QAbstractItemModel *model)
QPixmap::save
bool save(const QString &fileName, const char *format, int quality) const
Dictionary
Definition: dictionary.h:39
QDockWidget::setFeatures
void setFeatures(QFlags< QDockWidget::DockWidgetFeature > features)
QWidget::setLayout
void setLayout(QLayout *layout)
KMainWindow
FunctionEdit::setEditing
void setEditing(bool m)
Sets whether we are editing or adding a function.
Definition: functionedit.cpp:319
QWidget::setFocus
void setFocus()
ViewportWidget::setViewport
void setViewport(const QRectF &current)
Definition: viewportwidget.cpp:64
menuEnabledHelper
void menuEnabledHelper(QMenu *m, bool enabled)
Definition: kalgebra.cpp:622
QPainter::drawPixmap
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)
QPainter
FunctionEdit::clear
void clear()
Clears the dialog.
Definition: functionedit.cpp:143
QWidget::raise
void raise()
QString::isEmpty
bool isEmpty() const
QAbstractItemView::setItemDelegate
void setItemDelegate(QAbstractItemDelegate *delegate)
QModelIndex::row
int row() const
ConsoleHtml::setMode
void setMode(ConsoleMode newMode)
Sets a newMode console mode.
Definition: consolehtml.h:65
QTabWidget::addTab
int addTab(QWidget *page, const QString &label)
QVBoxLayout
QString::endsWith
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const
KAlgebra::add2D
void add2D(const Analitza::Expression &exp)
Definition: kalgebra.cpp:401
viewportwidget.h
QAbstractItemModel::data
virtual QVariant data(const QModelIndex &index, int role) const =0
QLabel::setText
void setText(const QString &)
QMenu::addSeparator
QAction * addSeparator()
QString
QTableView::setShowGrid
void setShowGrid(bool show)
QWidget::hide
void hide()
QPrinter::setPaperSize
void setPaperSize(PaperSize newPaperSize)
QColor
InlineOptions::matchesExpression
virtual bool matchesExpression(const Analitza::Expression &exp, const Analitza::ExpressionType &functype) const =0
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QLayout::addWidget
void addWidget(QWidget *w)
QStringList
QPixmap
ConsoleHtml::loadScript
bool loadScript(const KUrl &path)
Loads a script from path.
Definition: consolehtml.cpp:169
ConsoleHtml::saveLog
bool saveLog(const KUrl &path) const
Saves a log to path.
Definition: consolehtml.cpp:216
ConsoleHtml::saveScript
bool saveScript(const KUrl &path) const
Save a script yo path.
Definition: consolehtml.cpp:194
QToolButton
QTableView
QMenu
QWidget::setContextMenuPolicy
void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
FunctionEdit
The FunctionEdit dialog provides a way to specify functions.
Definition: functionedit.h:46
QPrinter::setPageMargins
void setPageMargins(qreal left, qreal top, qreal right, qreal bottom, Unit unit)
QAction::setCheckable
void setCheckable(bool)
QDockWidget::setWidget
void setWidget(QWidget *widget)
InlineOptions::caption
virtual QString caption() const =0
InlineOptions
Definition: consolehtml.h:28
FunctionEdit::setName
void setName(const QString &name)
Sets a name to the function.
Definition: functionedit.h:77
variablesdelegate.h
QString::mid
QString mid(int position, int n) const
QModelIndex::data
QVariant data(int role) const
QTreeView
QRectF
QModelIndex::sibling
QModelIndex sibling(int row, int column) const
QTreeView::setModel
virtual void setModel(QAbstractItemModel *model)
QMenu::addMenu
QAction * addMenu(QMenu *menu)
KAlgebra::KAlgebra
KAlgebra(QWidget *parent=0)
Definition: kalgebra.cpp:107
QAction
KAlgebra
Definition: kalgebra.h:45
QWidget::showFullScreen
void showFullScreen()
kalgebra.h
FunctionEdit::variables
Analitza::Variables * variables() const
Definition: functionedit.h:85
InlineOptions::triggerOption
virtual void triggerOption(const Analitza::Expression &exp)=0
QModelIndex::column
int column() const
QItemSelectionModel::setCurrentIndex
void setCurrentIndex(const QModelIndex &index, QFlags< QItemSelectionModel::SelectionFlag > command)
QTreeView::header
QHeaderView * header() const
FunctionEdit::setVariables
void setVariables(Analitza::Variables *v)
Sets the variables class to be used with the graph functions.
Definition: functionedit.h:83
ConsoleHtml::Calculation
Calculates everything, if it finds a not defined variable shows an error.
Definition: consolehtml.h:52
QWidget::show
void show()
QtConcurrent::filter
QFuture< void > filter(Sequence &sequence, FilterFunction filterFunction)
FunctionEdit::setFunction
void setFunction(const QString &newText)
Sets an expression text to the ExpressionEdit widget.
Definition: functionedit.cpp:150
FunctionEdit::createFunction
Analitza::PlaneCurve * createFunction() const
Definition: functionedit.cpp:291
QAbstractItemView::model
QAbstractItemModel * model() const
QAbstractItemView::currentIndex
QModelIndex currentIndex() const
QTreeView::setRootIsDecorated
void setRootIsDecorated(bool show)
FunctionEdit::setColor
void setColor(const QColor &newColor)
Sets the selected color for the function.
Definition: functionedit.cpp:156
QHeaderView::setStretchLastSection
void setStretchLastSection(bool stretch)
QWidget::actions
QList< QAction * > actions() const
QLabel
QPrinter::setOutputFormat
void setOutputFormat(OutputFormat format)
QPainter::begin
bool begin(QPaintDevice *device)
QTableView::horizontalHeader
QHeaderView * horizontalHeader() const
QVariant::toString
QString toString() const
askname.h
QDockWidget::widget
QWidget * widget() const
QAction::setEnabled
void setEnabled(bool)
dictionary.h
FunctionEdit::editing
bool editing() const
Returns whether we are editing or adding a function.
Definition: functionedit.h:71
QCoreApplication::applicationFilePath
QString applicationFilePath()
ConsoleHtml::Evaluation
Simplifies the expression, tries to simplify when sees a variable not defined.
Definition: consolehtml.h:51
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