Files
newspark110/lib/gui/rs_graphicview.h
Chenwenxuan edac2715f0 init
2024-03-06 14:54:30 +08:00

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