473 lines
12 KiB
C++
473 lines
12 KiB
C++
/****************************************************************************
|
|
**
|
|
** This file is part of the LibreCAD project, a 2D CAD program
|
|
**
|
|
** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl)
|
|
** Copyright (C) 2001-2003 RibbonSoft. All rights reserved.
|
|
**
|
|
**
|
|
** This file may be distributed and/or modified under the terms of the
|
|
** GNU General Public License version 2 as published by the Free Software
|
|
** Foundation and appearing in the file gpl-2.0.txt included in the
|
|
** packaging of this file.
|
|
**
|
|
** 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
|
|
**
|
|
** This copyright notice MUST APPEAR in all copies of the script!
|
|
**
|
|
**********************************************************************/
|
|
|
|
|
|
#ifndef RS_GRAPHICVIEW_H
|
|
#define RS_GRAPHICVIEW_H
|
|
|
|
#include "rs_entitycontainer.h"
|
|
#include "rs_snapper.h"
|
|
#include "lc_rect.h"
|
|
|
|
#include <QDateTime>
|
|
#include <QMap>
|
|
#include <tuple>
|
|
#include <memory>
|
|
#include <QAction>
|
|
|
|
|
|
class QMouseEvent;
|
|
class QKeyEvent;
|
|
class RS_ActionInterface;
|
|
class RS_EventHandler;
|
|
class RS_CommandEvent;
|
|
class RS_Grid;
|
|
struct RS_LineTypePattern;
|
|
|
|
|
|
/**
|
|
* This class is a common GUI interface for the graphic viewer
|
|
* widget which has to be implemented by real GUI classes such
|
|
* as the Qt graphical view.
|
|
*
|
|
* Note that this is just an interface used as a slot to
|
|
* communicate with the LibreCAD from a GUI level.
|
|
*/
|
|
class RS_GraphicView : public QWidget
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
RS_GraphicView(QWidget * parent = 0, Qt::WindowFlags f = 0);
|
|
virtual ~RS_GraphicView();
|
|
|
|
void cleanUp();
|
|
|
|
/**
|
|
* @return Pointer to the graphic entity if the entity container
|
|
* connected to this view is a graphic and valid.
|
|
* NULL otherwise.
|
|
*/
|
|
RS_Graphic* getGraphic() const;
|
|
|
|
/**
|
|
* \brief setDrawingMode Sets the drawing mode.
|
|
*/
|
|
void setDrawingMode(RS2::DrawingMode m) {
|
|
drawingMode = m;
|
|
}
|
|
|
|
/**
|
|
* @return Current drawing mode.
|
|
*/
|
|
RS2::DrawingMode getDrawingMode() const {
|
|
return drawingMode;
|
|
}
|
|
|
|
/**
|
|
* Activates or deactivates the delete mode.
|
|
*/
|
|
void setDeleteMode(bool m) {
|
|
deleteMode = m;
|
|
}
|
|
|
|
/**
|
|
* @reval true Deleting instead of drawing.
|
|
* false Normal drawing mode.
|
|
*/
|
|
bool getDeleteMode() const{
|
|
return deleteMode;
|
|
}
|
|
|
|
/** This virtual method must be overwritten to return
|
|
the width of the widget the graphic is shown in */
|
|
virtual int getWidth() const= 0;
|
|
/** This virtual method must be overwritten to return
|
|
the height of the widget the graphic is shown in */
|
|
virtual int getHeight() const= 0;
|
|
/** This virtual method must be overwritten to redraw
|
|
the widget. */
|
|
virtual void redraw(RS2::RedrawMethod method=RS2::RedrawAll) = 0;
|
|
/** This virtual method must be overwritten and is then
|
|
called whenever the view changed */
|
|
virtual void adjustOffsetControls() = 0;
|
|
/** This virtual method must be overwritten and is then
|
|
called whenever the view changed */
|
|
virtual void adjustZoomControls() = 0;
|
|
|
|
/**
|
|
* Sets the background color. Note that applying the background
|
|
* color for the widget is up to the implementing class.
|
|
*/
|
|
virtual void setBackground(const RS_Color& bg);
|
|
|
|
/**
|
|
* @return Current background color.
|
|
*/
|
|
RS_Color getBackground() const{
|
|
return background;
|
|
}
|
|
|
|
/**
|
|
* @return Current foreground color.
|
|
*/
|
|
RS_Color getForeground() const{
|
|
return foreground;
|
|
}
|
|
|
|
/**
|
|
* Sets the grid color.
|
|
*/
|
|
void setGridColor(const RS_Color& c) {
|
|
gridColor = c;
|
|
}
|
|
|
|
/**
|
|
* Sets the meta grid color.
|
|
*/
|
|
void setMetaGridColor(const RS_Color& c) {
|
|
metaGridColor = c;
|
|
}
|
|
|
|
/**
|
|
* Sets the selection color.
|
|
*/
|
|
void setSelectedColor(const RS_Color& c) {
|
|
selectedColor = c;
|
|
}
|
|
|
|
/**
|
|
* Sets the highlight color.
|
|
*/
|
|
void setHighlightedColor(const RS_Color& c) {
|
|
highlightedColor = c;
|
|
}
|
|
|
|
/**
|
|
* Sets the color for the first handle (start vertex)
|
|
*/
|
|
void setStartHandleColor(const RS_Color& c) {
|
|
startHandleColor = c;
|
|
}
|
|
|
|
/**
|
|
* Sets the color for handles, that are neither start nor end vertices
|
|
*/
|
|
void setHandleColor(const RS_Color& c) {
|
|
handleColor = c;
|
|
}
|
|
|
|
/**
|
|
* Sets the color for the last handle (end vertex)
|
|
*/
|
|
void setEndHandleColor(const RS_Color& c) {
|
|
endHandleColor = c;
|
|
}
|
|
|
|
/**
|
|
* This virtual method can be overwritten to set the mouse
|
|
* cursor to the given type.
|
|
*/
|
|
virtual void setMouseCursor(RS2::CursorType /*c*/) = 0;
|
|
|
|
void setContainer(RS_EntityContainer* container);
|
|
RS_EntityContainer* getContainer() const;
|
|
void setFactor(double f);
|
|
void setFactorX(double f);
|
|
void setFactorY(double f);
|
|
RS_Vector getFactor() const;
|
|
/**
|
|
* @brief setOffset
|
|
* @param ox, offset X
|
|
* @param oy, offset Y
|
|
*/
|
|
virtual void setOffset(int ox, int oy);
|
|
void setOffsetX(int ox);
|
|
void setOffsetY(int oy);
|
|
int getOffsetX() const;
|
|
int getOffsetY() const;
|
|
void centerOffsetX();
|
|
void centerOffsetY();
|
|
void centerX(double x);
|
|
void centerY(double y);
|
|
/**
|
|
* Sets a fixed border in pixel around the graphic. This border
|
|
* specifies how far the user can scroll outside the graphic
|
|
* area.
|
|
*/
|
|
void setBorders(int left, int top, int right, int bottom);
|
|
|
|
int getBorderLeft() const;
|
|
int getBorderTop() const;
|
|
int getBorderRight() const;
|
|
int getBorderBottom() const;
|
|
|
|
void freezeZoom(bool freeze);
|
|
bool isZoomFrozen() const;
|
|
|
|
void setDefaultAction(RS_ActionInterface* action);
|
|
RS_ActionInterface* getDefaultAction();
|
|
void setCurrentAction(RS_ActionInterface* action);
|
|
RS_ActionInterface* getCurrentAction();
|
|
|
|
void killSelectActions();
|
|
void killAllActions();
|
|
|
|
void back();
|
|
void enter();
|
|
|
|
void commandEvent(RS_CommandEvent* e);
|
|
void enableCoordinateInput();
|
|
void disableCoordinateInput();
|
|
|
|
virtual void zoomIn(double f=1.5, const RS_Vector& center=RS_Vector(false));
|
|
virtual void zoomInX(double f=1.5);
|
|
virtual void zoomInY(double f=1.5);
|
|
virtual void zoomOut(double f=1.5, const RS_Vector& center=RS_Vector(false));
|
|
virtual void zoomOutX(double f=1.5);
|
|
virtual void zoomOutY(double f=1.5);
|
|
virtual void zoomAuto(bool axis=true, bool keepAspectRatio=true);
|
|
virtual void zoomAutoY(bool axis=true);
|
|
virtual void zoomPrevious();
|
|
virtual void saveView();
|
|
virtual void restoreView();
|
|
virtual void zoomWindow(RS_Vector v1, RS_Vector v2,
|
|
bool keepAspectRatio=true);
|
|
//virtual void zoomPan(RS_Vector v1);
|
|
virtual void zoomPan(int dx, int dy);
|
|
virtual void zoomScroll(RS2::Direction direction);
|
|
virtual void zoomPage();
|
|
|
|
virtual void drawWindow_DEPRECATED(RS_Vector v1, RS_Vector v2);
|
|
virtual void drawLayer1(RS_Painter *painter);
|
|
virtual void drawLayer2(RS_Painter *painter);
|
|
virtual void drawLayer3(RS_Painter *painter);
|
|
virtual void deleteEntity(RS_Entity* e);
|
|
virtual void drawEntity(RS_Painter *painter, RS_Entity* e, double& patternOffset);
|
|
virtual void drawEntity(RS_Painter *painter, RS_Entity* e);
|
|
virtual void drawEntity(RS_Entity* e, double& patternOffset);
|
|
virtual void drawEntity(RS_Entity* e);
|
|
virtual void drawEntityPlain(RS_Painter *painter, RS_Entity* e);
|
|
virtual void drawEntityPlain(RS_Painter *painter, RS_Entity* e, double& patternOffset);
|
|
virtual void setPenForEntity(RS_Painter *painter, RS_Entity* e );
|
|
virtual RS_Vector getMousePosition() const = 0;
|
|
|
|
virtual const RS_LineTypePattern* getPattern(RS2::LineType t);
|
|
|
|
virtual void drawAbsoluteZero(RS_Painter *painter);
|
|
virtual void drawRelativeZero(RS_Painter *painter);
|
|
virtual void drawPaper(RS_Painter *painter);
|
|
virtual void drawGrid(RS_Painter *painter);
|
|
virtual void drawMetaGrid(RS_Painter *painter);
|
|
virtual void drawOverlay(RS_Painter *painter);
|
|
|
|
RS_Grid* getGrid() const;
|
|
virtual void updateGridStatusWidget(const QString& /*text*/) = 0;
|
|
|
|
void setDefaultSnapMode(RS_SnapMode sm);
|
|
RS_SnapMode getDefaultSnapMode() const;
|
|
void setSnapRestriction(RS2::SnapRestriction sr);
|
|
RS2::SnapRestriction getSnapRestriction() const;
|
|
|
|
bool isGridOn() const;
|
|
bool isGridIsometric() const;
|
|
void setCrosshairType(RS2::CrosshairType chType);
|
|
RS2::CrosshairType getCrosshairType() const;
|
|
|
|
RS_Vector toGui(RS_Vector v) const;
|
|
double toGuiX(double x) const;
|
|
double toGuiY(double y) const;
|
|
double toGuiDX(double d) const;
|
|
double toGuiDY(double d) const;
|
|
|
|
RS_Vector toGraph(RS_Vector v) const;
|
|
RS_Vector toGraph(int x, int y) const;
|
|
double toGraphX(int x) const;
|
|
double toGraphY(int y) const;
|
|
double toGraphDX(int d) const;
|
|
double toGraphDY(int d) const;
|
|
|
|
/**
|
|
* (Un-)Locks the position of the relative zero.
|
|
*
|
|
* @param lock true: lock, false: unlock
|
|
*/
|
|
void lockRelativeZero(bool lock);
|
|
|
|
/**
|
|
* @return true if the position of the relative zero point is
|
|
* locked.
|
|
*/
|
|
bool isRelativeZeroLocked() const;
|
|
|
|
/**
|
|
* @return Relative zero coordinate.
|
|
*/
|
|
RS_Vector const& getRelativeZero() const;
|
|
|
|
void setRelativeZero(const RS_Vector& pos);
|
|
void moveRelativeZero(const RS_Vector& pos);
|
|
|
|
RS_EventHandler* getEventHandler() const;
|
|
|
|
/**
|
|
* Enables or disables print preview.
|
|
*/
|
|
void setPrintPreview(bool pv);
|
|
|
|
/**
|
|
* @retval true This is a print preview graphic view.
|
|
* @retval false Otherwise.
|
|
*/
|
|
bool isPrintPreview() const;
|
|
|
|
/**
|
|
* Enables or disables printing.
|
|
*/
|
|
void setPrinting(bool p);
|
|
|
|
/**
|
|
* @retval true This is a graphic view for printing.
|
|
* @retval false setSnapOtherwise.
|
|
*/
|
|
bool isPrinting() const;
|
|
|
|
/**
|
|
* @retval true Draft mode is on for this view (all lines with 1 pixel / no style scaling).
|
|
* @retval false Otherwise.
|
|
*/
|
|
bool isDraftMode() const;
|
|
|
|
void setDraftMode(bool dm);
|
|
bool isCleanUp(void) const;
|
|
|
|
virtual RS_EntityContainer* getOverlayContainer(RS2::OverlayGraphics position);
|
|
|
|
const LC_Rect& getViewRect() {
|
|
return view_rect;
|
|
}
|
|
|
|
bool isPanning() const;
|
|
void setPanning(bool state);
|
|
|
|
void setLineWidthScaling(bool state){
|
|
scaleLineWidth = state;
|
|
}
|
|
|
|
bool getLineWidthScaling(){
|
|
return scaleLineWidth;
|
|
}
|
|
|
|
|
|
protected:
|
|
|
|
RS_EntityContainer* container{nullptr}; // Holds a pointer to all the enties
|
|
RS_EventHandler* eventHandler;
|
|
|
|
/** background color (any color) */
|
|
RS_Color background;
|
|
/** foreground color (black or white) */
|
|
RS_Color foreground;
|
|
/** grid color */
|
|
RS_Color gridColor;
|
|
/** meta grid color */
|
|
RS_Color metaGridColor;
|
|
/** selected color */
|
|
RS_Color selectedColor;
|
|
/** highlighted color */
|
|
RS_Color highlightedColor;
|
|
/** Start handle color */
|
|
RS_Color startHandleColor;
|
|
/** Intermediate (not start/end vertex) handle color */
|
|
RS_Color handleColor;
|
|
/** End handle color */
|
|
RS_Color endHandleColor;
|
|
/** Grid */
|
|
std::unique_ptr<RS_Grid> grid;
|
|
/**
|
|
* Current default snap mode for this graphic view. Used for new
|
|
* actions.
|
|
*/
|
|
RS_SnapMode defaultSnapMode;
|
|
/**
|
|
* Current default snap restriction for this graphic view. Used for new
|
|
* actions.
|
|
*/
|
|
RS2::SnapRestriction defaultSnapRes;
|
|
|
|
RS2::DrawingMode drawingMode;
|
|
|
|
/**
|
|
* Delete mode. If true, all drawing actions will delete in background color
|
|
* instead.
|
|
*/
|
|
bool deleteMode=false;
|
|
|
|
LC_Rect view_rect;
|
|
|
|
private:
|
|
|
|
bool zoomFrozen=false;
|
|
bool draftMode=false;
|
|
|
|
RS_Vector factor=RS_Vector(1.,1.);
|
|
int offsetX=0;
|
|
int offsetY=0;
|
|
|
|
//circular buffer for saved views
|
|
std::vector<std::tuple<int, int, RS_Vector> > savedViews;
|
|
unsigned short savedViewIndex=0;
|
|
unsigned short savedViewCount=0;
|
|
QDateTime previousViewTime;
|
|
|
|
int borderLeft=0;
|
|
int borderTop=0;
|
|
int borderRight=0;
|
|
int borderBottom=0;
|
|
|
|
RS_Vector relativeZero{false};
|
|
bool relativeZeroLocked=false;
|
|
//! Print preview flag
|
|
bool printPreview=false;
|
|
//! Active when printing only:
|
|
bool printing=false;
|
|
|
|
// Map that will be used for overlaying additional items on top of the main CAD drawing
|
|
QMap<int, RS_EntityContainer *> overlayEntities;
|
|
/** if true, graphicView is under cleanup */
|
|
bool m_bIsCleanUp=false;
|
|
|
|
bool panning;
|
|
|
|
bool scaleLineWidth;
|
|
|
|
signals:
|
|
void relative_zero_changed(const RS_Vector&);
|
|
void previous_zoom_state(bool);
|
|
};
|
|
|
|
#endif
|