/*
QAD - Qt ADvanced
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see .
*/
#ifndef GRAPHIC_H
#define GRAPHIC_H
#include "evalspinbox.h"
#include "graphic_conf.h"
#include "qad_graphic_export.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace Ui {
class Graphic;
}
class UGLWidget;
class GraphicPlugin;
Q_DECLARE_METATYPE(QVector)
class QAD_GRAPHIC_EXPORT Graphic: public QFrame {
Q_OBJECT
Q_FLAGS(Buttons)
Q_ENUMS(Alignment Graduation AxisType FloatingAxisType)
Q_PROPERTY(QString caption READ caption WRITE setCaption)
Q_PROPERTY(QString labelX READ labelX WRITE setLabelX)
Q_PROPERTY(QString labelY READ labelY WRITE setLabelY)
Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)
Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor)
Q_PROPERTY(int currentGraphic READ currentGraphic WRITE setCurrentGraphic)
Q_PROPERTY(int graphicsCount READ graphicsCount WRITE setGraphicsCount)
Q_PROPERTY(QString graphicName READ graphicName WRITE setGraphicName)
Q_PROPERTY(QPen graphicPen READ graphicPen WRITE setGraphicPen)
Q_PROPERTY(QColor graphicColor READ graphicColor WRITE setGraphicColor)
Q_PROPERTY(Qt::PenStyle graphicStyle READ graphicStyle WRITE setGraphicStyle)
Q_PROPERTY(double graphicLineWidth READ graphicLineWidth WRITE setGraphicLineWidth)
Q_PROPERTY(double graphicPointWidth READ graphicPointWidth WRITE setGraphicPointWidth)
Q_PROPERTY(QColor graphicFillColor READ graphicFillColor WRITE setGraphicFillColor)
Q_PROPERTY(bool graphicLinesEnabled READ graphicLinesEnabled WRITE setGraphicLinesEnabled)
Q_PROPERTY(bool graphicPointsEnabled READ graphicPointsEnabled WRITE setGraphicPointsEnabled)
Q_PROPERTY(bool graphicFillEnabled READ graphicFillEnabled WRITE setGraphicFillEnabled)
Q_PROPERTY(bool gridEnabled READ gridEnabled WRITE setGridEnabled)
Q_PROPERTY(QPen gridPen READ gridPen WRITE setGridPen)
Q_PROPERTY(QColor gridColor READ gridColor WRITE setGridColor)
Q_PROPERTY(Qt::PenStyle gridStyle READ gridStyle WRITE setGridStyle)
Q_PROPERTY(QPen selectionPen READ selectionPen WRITE setSelectionPen)
Q_PROPERTY(QColor selectionColor READ selectionColor WRITE setSelectionColor)
Q_PROPERTY(Qt::PenStyle selectionStyle READ selectionStyle WRITE setSelectionStyle)
Q_PROPERTY(QBrush selectionBrush READ selectionBrush WRITE setSelectionBrush)
Q_PROPERTY(Alignment buttonsPosition READ buttonsPosition WRITE setButtonsPosition)
Q_PROPERTY(Buttons buttons READ buttons WRITE setButtons)
Q_PROPERTY(bool navigationEnabled READ navigationEnabled WRITE setNavigationEnabled)
Q_PROPERTY(bool openGL READ openGL WRITE setOpenGL)
Q_PROPERTY(bool antialiasing READ antialiasing WRITE setAntialiasing)
Q_PROPERTY(bool autoUpdate READ autoUpdate WRITE setAutoUpdate)
Q_PROPERTY(bool borderInputsVisible READ borderInputsVisible WRITE setBorderInputsVisible)
Q_PROPERTY(bool statusVisible READ statusVisible WRITE setStatusVisible)
Q_PROPERTY(bool legendVisible READ legendVisible WRITE setLegendVisible)
Q_PROPERTY(bool paused READ paused WRITE setPaused)
Q_PROPERTY(bool onlyExpandY READ onlyExpandY WRITE setOnlyExpandY)
Q_PROPERTY(bool onlyExpandX READ onlyExpandX WRITE setOnlyExpandX)
Q_PROPERTY(bool gesturesNavigation READ gesturesNavigation WRITE setGesturesNavigation)
Q_PROPERTY(bool LODOptimization READ LODOptimization WRITE setLODOptimization)
Q_PROPERTY(double historySize READ historySize WRITE setHistorySize)
Q_PROPERTY(double maxVisibleTime READ maxVisibleTime WRITE setMaxVisibleTime)
Q_PROPERTY(double autoXIncrement READ autoXIncrement WRITE setAutoXIncrement)
Q_PROPERTY(QRectF limit READ limit WRITE setLimit)
Q_PROPERTY(QRect margins READ margins WRITE setMargins)
Q_PROPERTY(QRectF visualRect READ visualRect WRITE setVisualRect)
Q_PROPERTY(QRectF defaultRect READ defaultRect WRITE setDefaultRect)
Q_PROPERTY(int minimumRepaintInterval READ minimumRepaintInterval WRITE setMinimumRepaintInterval)
Q_PROPERTY(double gridNumbersMultiplierX READ gridNumbersMultiplierX WRITE setGridNumbersMultiplierX)
Q_PROPERTY(double gridNumbersMultiplierY READ gridNumbersMultiplierY WRITE setGridNumbersMultiplierY)
Q_PROPERTY(Graduation graduationX READ graduationX WRITE setGraduationX)
Q_PROPERTY(Graduation graduationY READ graduationY WRITE setGraduationY)
Q_PROPERTY(double graduationStepX READ graduationStepX WRITE setGraduationStepX)
Q_PROPERTY(double graduationStepY READ graduationStepY WRITE setGraduationStepY)
Q_PROPERTY(AxisType axisType READ axisType WRITE setAxisType)
Q_PROPERTY(FloatingAxisType floatingAxisType READ floatingAxisType WRITE setFloatingAxisType)
Q_PROPERTY(Graphic::GraphicsData graphicsData READ graphicsData WRITE setGraphicsData)
Q_PROPERTY(QByteArray graphicsDataRaw READ graphicsDataRaw WRITE setGraphicsDataRaw)
friend class GraphicPlugin;
public:
Graphic(QWidget * parent = 0);
virtual ~Graphic();
typedef QVector> GraphicsData;
enum GraphicAction {
gaNone,
gaZoomInRect,
gaZoomRangeX,
gaZoomRangeY,
gaMove
};
enum Button {
NoButtons = 0x0,
AllButtons = 0xFFFFFFFF,
Autofit = 0x01,
Grid = 0x02,
CursorAxis = 0x04,
Fullscreen = 0x20,
BorderInputs = 0x40,
Legend = 0x80,
Configure = 0x100,
Save = 0x200,
Export = 0x400,
Clear = 0x800,
Close = 0x1000,
Pause = 0x2000,
Record = 0x4000,
StandartButtons = 0x2BFF
};
enum Alignment {
Left,
Right
};
enum Graduation {
Auto,
Fixed
};
enum AxisType {
Numeric,
DateTime
};
enum FloatingAxisType {
Free,
Trace
};
Q_DECLARE_FLAGS(Buttons, Button)
QString caption() const;
QString labelX() const { return label_x; }
QString labelY() const { return label_y; }
QString graphicName() const { return graphicName(curGraphic); }
QString graphicName(int index) const;
QColor backgroundColor() const { return back_color; }
QColor textColor() const { return text_color; }
QColor graphicColor() const { return graphicColor(curGraphic); }
QColor graphicColor(int index) const;
QColor gridColor() const { return grid_pen.color(); }
QColor selectionColor() const { return selpen.color(); }
Qt::PenStyle graphicStyle() const { return graphicStyle(curGraphic); }
Qt::PenStyle graphicStyle(int index) const;
Qt::PenStyle gridStyle() const { return grid_pen.style(); }
Qt::PenStyle selectionStyle() const { return selpen.style(); }
double graphicLineWidth() const { return graphicLineWidth(curGraphic); }
double graphicLineWidth(int index) const;
double graphicPointWidth() const { return graphicPointWidth(curGraphic); }
double graphicPointWidth(int index) const;
QColor graphicFillColor() const { return graphicFillColor(curGraphic); }
QColor graphicFillColor(int index) const;
bool graphicVisible() const { return graphicVisible(curGraphic); }
bool graphicVisible(int index) const;
bool graphicLinesEnabled() const { return graphicLinesEnabled(curGraphic); }
bool graphicLinesEnabled(int index) const;
bool graphicPointsEnabled() const { return graphicPointsEnabled(curGraphic); }
bool graphicPointsEnabled(int index) const;
bool graphicFillEnabled() const { return graphicFillEnabled(curGraphic); }
bool graphicFillEnabled(int index) const;
QPen graphicPen() const { return graphicPen(curGraphic); }
QPen graphicPen(int index) const;
QPen gridPen() const { return grid_pen; }
QPen selectionPen() const { return selpen; }
QBrush selectionBrush() const { return selbrush; }
bool navigationEnabled() const { return navigation; }
bool openGL() const { return isOGL; }
bool antialiasing() const { return aalias; }
bool autoUpdate() const { return aupdate; }
bool gridEnabled() const { return grid; }
bool borderInputsVisible() const;
bool statusVisible() const;
bool legendVisible() const;
bool paused() const { return pause_; }
bool onlyExpandY() const { return only_expand_y; }
bool onlyExpandX() const { return only_expand_x; }
bool gesturesNavigation() const { return gestures; }
bool LODOptimization() const { return m_LODOptimization; }
bool isAutofitted() const { return isFit; }
int currentGraphic() const { return curGraphic; }
int graphicsCount() const { return graphics.size(); }
Graphic::Buttons buttons() const { return buttons_; }
Graphic::Alignment buttonsPosition() const { return align; }
double historySize() const { return history; }
double maxVisibleTime() const { return visible_time; }
double autoXIncrement() const { return inc_x; }
QRectF visualRect() const { return selrect; }
QRectF defaultRect() const { return def_rect; }
QRectF limit() const { return limit_; }
QRect margins() const { return margins_; }
int minimumRepaintInterval() const { return min_repaint_int; }
double gridNumbersMultiplierX() const { return grid_numbers_x; }
double gridNumbersMultiplierY() const { return grid_numbers_y; }
Graduation graduationX() const { return grad_x; }
Graduation graduationY() const { return grad_y; }
double graduationStepX() const { return gridx; }
double graduationStepY() const { return gridy; }
AxisType axisType() const { return axis_type_x; }
FloatingAxisType floatingAxisType() const { return floating_axis_type; }
QVector graphicData() const { return graphicData(curGraphic); }
QVector graphicData(int index) const;
GraphicsData graphicsData() const;
QByteArray graphicsDataRaw() const;
QWidget * viewport() const { return canvas; }
QByteArray save();
void load(QByteArray ba);
GraphicType graphic(int arg);
const QVector & allGraphics() const { return graphics; }
void setAllGraphics(const QVector & g, bool update = true);
double canvas2realX(double px) const;
double canvas2realY(double py) const;
double real2canvasX(double px) const;
double real2canvasY(double py) const;
QPointF canvas2real(QPointF canvas_point) const { return QPointF(canvas2realX(canvas_point.x()), canvas2realY(canvas_point.y())); }
QPointF real2canvas(QPointF real_point) const { return QPointF(real2canvasX(real_point.x()), real2canvasY(real_point.y())); }
QPolygonF real2canvas(const QPolygonF & real_polygon) const;
QPolygonF canvas2real(const QPolygonF & canvas_polygon) const;
double getScaleX() const;
double getScaleY() const;
QPointF getScale() const { return QPointF(getScaleX(), getScaleY()); }
public slots:
void setCaption(const QString & str);
void setLabelX(const QString & str);
void setLabelY(const QString & str);
void setGraphicName(const QString & str, int index);
void setGraphicName(const QString & str);
void setBackgroundColor(const QColor & color);
void setTextColor(const QColor & color);
void setGraphicColor(const QColor & color, int index);
void setGraphicColor(const QColor & color);
void setGridColor(const QColor & color);
void setSelectionColor(const QColor & color);
void setGraphicStyle(const Qt::PenStyle & style, int index);
void setGraphicStyle(const Qt::PenStyle & style);
void setGridStyle(const Qt::PenStyle & style);
void setSelectionStyle(const Qt::PenStyle & style);
void setGraphicVisible(bool visible, int index);
void setGraphicVisible(bool visible);
void setGraphicLineWidth(double w, int index);
void setGraphicLineWidth(double w);
void setGraphicPointWidth(double w, int index);
void setGraphicPointWidth(double w);
void setGraphicFillColor(const QColor & w, int index);
void setGraphicFillColor(const QColor & w);
void setGraphicLinesEnabled(bool w, int index);
void setGraphicLinesEnabled(bool w);
void setGraphicPointsEnabled(bool w, int index);
void setGraphicPointsEnabled(bool w);
void setGraphicFillEnabled(bool w, int index);
void setGraphicFillEnabled(bool w);
void setGraphicPen(const QPen & pen, int index);
void setGraphicPen(const QPen & pen);
void setGridPen(const QPen & pen);
void setSelectionPen(const QPen & pen);
void setSelectionBrush(const QBrush & brush);
void setNavigationEnabled(bool on);
void setLODOptimization(bool yes);
void setOpenGL(bool on);
void setAntialiasing(bool enabled);
void setAutoUpdate(bool enabled);
void setGridEnabled(bool enabled);
void setBorderInputsVisible(bool visible);
void setStatusVisible(bool visible);
void setLegendVisible(bool visible);
void setPaused(bool yes);
void setButtons(Graphic::Buttons b);
void setButtonsPosition(Graphic::Alignment a);
void setHistorySize(double val);
void setMaxVisibleTime(double val);
void setAutoXIncrement(double val);
void setLimit(const QRectF & val);
void setMargins(const QRect & val);
void setMargins(int left_, int right_, int top_, int bottom_);
void setLeftMargin(int value);
void setRightMargin(int value);
void setTopMargin(int value);
void setBottomMargin(int value);
void setMinimumRepaintInterval(const int & val);
void setOnlyExpandY(bool yes);
void setOnlyExpandX(bool yes);
void setGesturesNavigation(bool yes);
void setGraphicsData(const GraphicsData & gd);
void setGraphicsDataRaw(const QByteArray & ba);
void setGridNumbersMultiplierX(double value);
void setGridNumbersMultiplierY(double value);
void setGraduationX(Graduation value);
void setGraduationY(Graduation value);
void setGraduationStepX(double sx);
void setGraduationStepY(double sy);
void setGraduationSteps(double sx, double sy);
void setAxisType(AxisType t);
void setFloatingAxisType(FloatingAxisType t);
void setFloatingAxisEnabled(bool on);
void addPoint(const QPointF & p, int graphic, bool update_ = true);
void addPoint(const QPointF & p, bool update = true);
void addPoint(double x, double y, int graphic, bool update = true);
void addPoint(double x, double y, bool update = true);
void addPoint(double y, int graphic, bool update = true);
void addPoint(double y, bool update = true);
void addPoints(const QPolygonF & pts, int graphic, bool update_ = true);
void addPoints(const QPolygonF & pts, bool update = true);
void addPoints(const QVector & pts, int graphic, bool update_ = true);
void addPoints(const QVector & pts, bool update = true);
void setGraphicData(const QVector & g, int graphic, bool update_ = true);
void setGraphicData(const QVector & g);
void setGraphicProperties(const QString & name,
const QColor & color = Qt::darkRed,
Qt::PenStyle style = Qt::SolidLine,
double width = 0.,
bool visible = true);
void setGraphicProperties(int graphic,
const QString & name,
const QColor & color = Qt::darkRed,
Qt::PenStyle style = Qt::SolidLine,
double width = 0.,
bool visible = true);
void addGraphic(const QString & name,
const QColor & color = Qt::darkRed,
Qt::PenStyle style = Qt::SolidLine,
double width = 0.,
bool visible = true);
void addGraphic(const GraphicType & gd);
void setVisualRect(const QRectF & rect);
void setDefaultRect(const QRectF & rect);
void autofit();
void saveImage(QString filename);
void exportGraphics(QString filename, QChar decimal_point, bool view_only = false);
void clear();
void update();
void updateGraphics();
void setCurrentGraphic(int arg);
void setGraphicsCount(int arg, bool update = true);
void removeGraphic(int arg, bool update = true);
void setCustomGridMarkFuncs(std::function fx, std::function fy);
void setCustomSaveImageTitleFunc(std::function func);
void zoom(float factor);
void zoomIn() { zoom(1. / 1.2); }
void zoomOut() { zoom(1.2); }
void fullscreen();
protected:
struct DateFormats {
QString upper;
QString center;
QString lower;
};
void changeEvent(QEvent * e) override;
void resizeEvent(QResizeEvent *) override;
void showEvent(QShowEvent *) override;
QSize sizeHint() const override { return QSize(400, 300); }
void timerEvent(QTimerEvent * e) override;
bool eventFilter(QObject * o, QEvent * e) override;
void prepareCanvas(QWidget * w);
void procGesture(QGesture * g);
void procZoom(QPointF view_center, double dzoom, Qt::KeyboardModifiers km = Qt::NoModifier);
void totalUpdate();
void setCurrentAction(GraphicAction action);
void findGraphicsRect(double start_x = 0., double end_x = 0., double start_y = 0., double end_y = 0.);
void tick(int index, bool slide = true, bool update = true);
void calcLOD(int index);
void repaintCanvas(bool force = false);
void drawGraphics();
void drawGrid();
void drawGuides();
void drawPause();
void drawAction();
void updateLegend(bool es = true);
void updateLegendChecks();
void setCanvasCursor(QCursor cursor);
void setGuidesCursor();
void swapToBuffer();
void swapToNormal() { bufferActive = false; }
void setRectToLines();
void checkLines();
double splitRange(double range, int count = 1);
double splitRangeDate(double range, int count, DateFormats & formats, int step[7]);
double roundTo(double value, double round_to);
void roundDateTime(QDateTime & dt, int * c);
void addDateTime(QDateTime & dt, int * c, qint64 mul = 1);
QPointF absPoint(QPointF point) { return QPointF(qAbs(point.x()), qAbs(point.y())); }
QString pointCoords(QPointF point, bool x = true, bool y = true);
QPair gridMark(double v) const;
void fillDateFormats();
void askForExport(bool view_only);
bool checkGraphicIndex(int index) const;
void graphicVisibleChanged();
Ui::Graphic * ui;
UGLWidget * canvas_gl;
QWidget * canvas;
QPixmap buffer;
QPainter * painter;
QBrush selbrush;
QPen grid_pen, selpen;
QColor back_color, text_color;
QVector graphics, loaded_configs;
int curGraphic;
GraphicAction curaction, prevaction;
QRectF grect, selrect, limit_, def_rect;
QRect margins_;
QSize font_sz;
QPoint startpos, curpos, prevpos, gridborder;
QPointF startpos_r, curpos_r;
QString label_x, label_y, ppath, fp_size;
Graphic::Buttons buttons_;
Graphic::Alignment align;
GraphicConf * conf;
EvalSpinBox line_x_min, line_x_max, line_y_min, line_y_max;
QElapsedTimer tm;
QMenu * buttons_menu = nullptr;
QCheckBox * action_source = nullptr;
#ifdef Q_OS_ANDROID
QElapsedTimer tm_fscr;
#endif
QIcon icon_exp_x, icon_exp_y, icon_exp_sx, icon_exp_sy;
QImage icon_pause_b, icon_pause_f;
Graduation grad_x, grad_y;
AxisType axis_type_x;
FloatingAxisType floating_axis_type;
double gridx, gridy, history, visible_time, inc_x, grid_numbers_x, grid_numbers_y, LN10;
double eminx, eminy, emaxx, emaxy, pause_phase, gesture_angle;
int lastw, lasth, min_repaint_int, thick;
int timer_pause, timer_record;
bool aalias, aupdate, grid, guides, isFit, isOGL, isHover, bufferActive, cancel, pause_, gestures, m_LODOptimization, m_fakeGL,
need_createGL;
bool hasLblX, hasLblY, navigation, only_expand_y, only_expand_x, is_lines_update, leg_update, visible_update, fullscr, need_mouse_pan,
was_trace;
std::function func_gridMarkX, func_gridMarkY;
std::function func_image_title;
QVector date_formats;
QList record_imgs;
protected slots:
void canvasPaintEvent();
void canvasMouseMoveEvent(QMouseEvent *);
void canvasMousePressEvent(QMouseEvent *);
void canvasMouseReleaseEvent(QMouseEvent *);
void canvasMouseDoubleClickEvent(QMouseEvent *);
void canvasWheelEvent(QWheelEvent *);
void canvasLeaveEvent(QEvent *);
void graphicVisibleChange(bool checked);
void lineXMinChanged(double value);
void lineXMaxChanged(double value);
void lineYMinChanged(double value);
void lineYMaxChanged(double value);
void on_actionCheck_all_triggered();
void on_actionUncheck_all_triggered();
void on_actionInvert_selection_triggered();
void on_actionSelect_only_this_triggered();
void on_graphic_buttonClose_clicked();
void on_graphic_buttonClear_clicked();
void on_graphic_buttonAutofit_clicked();
void on_graphic_buttonConfigure_clicked();
void on_graphic_buttonFullscreen_clicked();
void on_graphic_actionSaveImage_triggered();
void on_graphic_actionExportCSV_triggered();
void on_graphic_actionExportCSV_View_triggered();
void on_graphic_buttonRecord_clicked(bool checked);
void on_graphic_checkGuides_toggled(bool checked);
void on_graphic_actionExpandX_triggered(bool checked);
void on_graphic_actionExpandY_triggered(bool checked);
void on_graphic_checkBorderInputs_toggled(bool checked);
void on_graphic_checkLegend_toggled(bool checked);
void on_graphic_checkPause_toggled(bool checked);
void actionGuidesTriggered(QAction * a);
void enterFullscreen();
void leaveFullscreen();
void showMenu();
signals:
void beforeGraphicPaintEvent(QPainter *);
void graphicPaintEvent(QPainter *);
void graphicMouseMoveEvent(QPointF point, int buttons);
void graphicMousePressEvent(QPointF point, int buttons);
void graphicMouseReleaseEvent(QPointF point, int buttons);
void graphicWheelEvent(QPointF point, int delta);
void graphicTraceEvent(int graphic, QPointF point);
void closeRequest(QWidget *);
void cleared();
void visualRectChanged();
void graphicSettingsChanged();
};
Q_DECLARE_METATYPE(Graphic::GraphicsData)
Q_DECLARE_OPERATORS_FOR_FLAGS(Graphic::Buttons)
inline QDataStream & operator<<(QDataStream & s, const Graphic::Graduation & v) {
s << (int)v;
return s;
}
inline QDataStream & operator>>(QDataStream & s, Graphic::Graduation & v) {
s >> *((int *)(&v));
return s;
}
class QAD_GRAPHIC_EXPORT __GraphicRegistrator__ {
public:
__GraphicRegistrator__() {
qRegisterMetaType>("QVector");
qRegisterMetaType("Graphic::GraphicsData");
#if QT_VERSION_MAJOR <= 5
qRegisterMetaTypeStreamOperators("Graphic::GraphicsData");
#endif
}
};
#endif // GRAPHIC_H