diff options
Diffstat (limited to 'kmplot/kmplot/View.h')
-rw-r--r-- | kmplot/kmplot/View.h | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/kmplot/kmplot/View.h b/kmplot/kmplot/View.h new file mode 100644 index 00000000..a3079c92 --- /dev/null +++ b/kmplot/kmplot/View.h @@ -0,0 +1,273 @@ +/* +* KmPlot - a math. function plotter for the KDE-Desktop +* +* Copyright (C) 1998, 1999 Klaus-Dieter Möller +* 2000, 2002 kd.moeller@t-online.de +* +* This file is part of the KDE Project. +* KmPlot is part of the KDE-EDU Project. +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +* +*/ + +#ifndef View_included +#define View_included +#undef GrayScale + +// Qt includes +#include <qpixmap.h> + +// KDE includes +#include <dcopclient.h> +#include <kactionclasses.h> +#include <kdebug.h> +#include <kpopupmenu.h> +#include <kprinter.h> +#include <kprogress.h> +#include <kpushbutton.h> + + +// local includes +#include "diagr.h" +#include "Viewiface.h" +#include "xparser.h" + +class XParser; +class KMinMax; +class KSliderWindow; + +enum ZoomMode +{ + Z_Normal = 0, + Z_Rectangular = 1, + Z_ZoomIn = 2, + Z_ZoomOut = 3, + Z_Center = 4 +}; + +/** + * @short This class contains the plots. + * + * It is the central widget of MainDlg. + * @see MainDlg, MainDlg::view + */ +class View : public QWidget, virtual public ViewIface +{ + Q_OBJECT +public: + /// Contructor sets up the parser, too. + View(bool, bool &, KPopupMenu *, QWidget* parent=NULL, const char* name=NULL ); + void setMinMaxDlg(KMinMax *); + virtual ~View(); + + /// Reimplemented to draw all stuff to the view. + void draw(QPaintDevice *, int const); + /// Getting all relevant settings using KConfig XT class Settings. + void getSettings(); + /// Clears all functions in the parser and gets default settings. + /// @see getSettings + void init(); + /// Finding the minimum or maximum value + void findMinMaxValue(Ufkt *, char, bool, double &, double &,const QString &); + /// get a y-value from a x-value + void getYValue(Ufkt * , char, double , double &,const QString &); + /// draw and calculate the area between the graph and the x-axis. + void areaUnderGraph(Ufkt *, char const, double &, double &, const QString &, QPainter* ); + /// the calculation was cancelled by the user + bool isCalculationStopped(); + + /// Returns a pointer to the private parser instance m_parser. + /// @see m_parser + XParser* parser(); + + /** Current plot range endge. */ + static double xmin; + static double xmax; + + /// trace mode stuff, must be accessible in KMinMax + int csmode, csparam; + char cstype; + + /// for areadrawing when printing + bool areaDraw; + Ufkt * areaUfkt; + char areaPMode; + double areaMin, areaMax; + QString areaParameter; + + /// Slider controlling parameter values + KSliderWindow* sliders[ SLIDER_COUNT ]; + /// Menu actions for the sliders + KToggleAction *mnuSliders[ SLIDER_COUNT ]; + void updateSliders(); /// show only needed sliders + +public slots: + /// Called when the user want to cancel the drawing + void stopDrawing(); + /// A slider window has been closed + void sliderWindowClosed(int); + + /// Called when the graph should be updated + void drawPlot(); + ///Slots for the three first items in popup menu + void mnuCopy_clicked(); + void mnuMove_clicked(); + void mnuHide_clicked(); + void mnuRemove_clicked(); + void mnuEdit_clicked(); + ///Slots for the zoom menu + void mnuNoZoom_clicked(); + void mnuRectangular_clicked(); + void mnuZoomIn_clicked(); + void mnuZoomOut_clicked(); + void mnuCenter_clicked(); + void mnuTrig_clicked(); + +protected slots: + void paintEvent(QPaintEvent *); + void resizeEvent(QResizeEvent *); + /// Updating the cross hair. + void mouseMoveEvent(QMouseEvent *); + /// Toggles the trace mode if the cursor is near to a plot. + void mousePressEvent(QMouseEvent *); + /// when a key is pressed and the graph widget has focus + void keyPressEvent(QKeyEvent * ); + /// called when a mouse key is released + void mouseReleaseEvent ( QMouseEvent * e ); + /// Is needed to be reimplement so that the user can stop a preview-drawing + bool event( QEvent * e ); + +signals: + void setStatusBarText(const QString &); + void resetZoom(); + +private: + /// Print out table with additional information. + /// Only for printing. + void drawHeaderTable(QPainter *); + /// Draw the function plots. + void plotfkt(Ufkt *ufkt, QPainter*); + /// Gets the greek pi symbol. + void setpi(QString *); + /// in trace mode checks, if the function is (near by) zero + bool root(double *, Ufkt *); + ///return the inverted color + void invertColor(QColor &, QColor &); + /// Restore the mouse cursor when a drawing is finished + void restoreCursor(); + /// Changes the text in the statusbar + void setStatusBar(const QString &text, const int id); + /// Functions for the progressbar + bool stopProgressBar(); + void startProgressBar(int); + void increaseProgressBar(); + + /// The central parser instance. + /// @see parser() + XParser *m_parser; + + int w, h; + float s; + + /// @name Crosshair + /// Crosshair support. + //@{ + int fcx; ///< x-position of the crosshais (pixel) + int fcy; ///< y-position of the crosshais (pixel) + float csxpos; ///< y-position of the cross hair (real coordinates) + float csypos; ///< x-position of the cross hair (real coordinates) + //@} + /// trace mode stuff + int csflg; + bool rootflg; + + CDiagr dgr; ///< Coordinate system + QPoint ref; + QRect area, + PlotArea; + QPixmap hline, + vline; + QWMatrix wm; + + double tlgx, tlgy, drskalx, drskaly; + QString tlgxstr, tlgystr, drskalxstr, drskalystr; + double stepWidth; ///< Absolute step width + + /** @name Plotrange + * There are 4 predefined plot ranges: + * @li 0: -8..8 + * @li 1: -5..5 + * @li 2: 0..16 + * @li 3: 0..10 + * @li 4: custom + */ + //@{ + ///Convert axes range predefinition index to boundaries. + void getMinMax(int koord, QString &mini, QString &maxi); + /** Handle predefiend axes ranges. + * + * @p koord can have the values 0 to 4 which have the following meanings: + * + * In the last case @p minstr and @p maxstr are evaluated. + */ + void coordToMinMax( const int koord, const QString &minStr, const QString &maxStr, + double &min, double &max ); + /// Sets the plot range from Settings + void setPlotRange(); + //@{ + /** Current plot range endge. */ + double ymin; + double ymax; + //@} + //@} + + void setScaling(); + /// represents the KPrinter option app-kmplot-printtable. + /// @see KPrinterDlg + bool m_printHeaderTable; + /// if stop_calculating is true, the user has canceled drawing of an integral graph + bool stop_calculating; + /// the background color of the graph + QColor backgroundcolor; + /// the inverted background color used by the "Fadenkreuz" + QColor inverted_backgroundcolor; + /// pointer to KMinMax + KMinMax *m_minmax; + ///buffer the current window so all functions don't need to be re-drawed + QPixmap buffer; + /// the popup menu + KPopupMenu *m_popupmenu; + /// is set to true if an integral is calculated + bool isDrawing; + ///status of the popup menu + char m_popupmenushown; /// 0==no popup 1==popup 2==popup+trace mode before + /// for zoom-mode + QPoint rectangle_point; + /*char zoom_mode;*/ ///0=normal 1=rectangular zoom, 2=zoom in, 3=zoom out ,4=drawing a rectangle, 5=center + ZoomMode zoom_mode; + /// true == modifications not saved + bool &m_modified; + /// False if KmPlot is started as a program, otherwise true + bool const m_readonly; + + DCOPClient *m_dcop_client; + QString m_statusbartext1; + QString m_statusbartext2; + QString m_statusbartext3; + QString m_statusbartext4; +}; + +#endif // View_included |