From d8f63bcfd10301f3d1e141cced4370f0782238d0 Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 1 May 2015 02:08:06 +0200 Subject: [PATCH] + fix broken brush selection --- src/Gui/GLPainter.cpp | 48 ++++++++++--- src/Gui/GLPainter.h | 5 +- src/Gui/MouseSelection.cpp | 133 +++++++++++++++++++++++++++++-------- src/Gui/MouseSelection.h | 12 ++-- 4 files changed, 154 insertions(+), 44 deletions(-) diff --git a/src/Gui/GLPainter.cpp b/src/Gui/GLPainter.cpp index d04d39081..d87a2e827 100644 --- a/src/Gui/GLPainter.cpp +++ b/src/Gui/GLPainter.cpp @@ -293,11 +293,14 @@ void Rubberband::paintGL() glDisable(GL_BLEND); } +// ----------------------------------------------------------------------------------- + Polyline::Polyline(View3DInventorViewer* v) : viewer(v) { x_new = y_new = 0; working = false; closed = true; + stippled = false; line = 2.0; } @@ -306,6 +309,7 @@ Polyline::Polyline() x_new = y_new = 0; working = false; closed = true; + stippled = false; line = 2.0; } @@ -318,7 +322,7 @@ void Polyline::setWorking(bool on) working = on; } -bool Polyline::isWorking() +bool Polyline::isWorking() const { return working; } @@ -347,6 +351,11 @@ void Polyline::setClosed(bool c) closed = c; } +void Polyline::setCloseStippled(bool c) +{ + stippled = c; +} + void Polyline::setLineWidth(float l) { line = l; @@ -383,17 +392,38 @@ void Polyline::paintGL() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLineWidth(line); glColor4f(rgb_r, rgb_g, rgb_b, rgb_a); - glBegin(GL_LINE_LOOP); - QPoint start = _cNodeVector.front(); + if (closed && !stippled) { + glBegin(GL_LINE_LOOP); - for (std::vector::iterator it = _cNodeVector.begin(); it != _cNodeVector.end(); ++it) { - glVertex2i(it->x(), it->y()); + for (std::vector::iterator it = _cNodeVector.begin(); it != _cNodeVector.end(); ++it) { + glVertex2i(it->x(), it->y()); + } + + glEnd(); + } + else { + glBegin(GL_LINES); + + QPoint start = _cNodeVector.front(); + for (std::vector::iterator it = _cNodeVector.begin(); it != _cNodeVector.end(); ++it) { + glVertex2i(start.x(), start.y()); + start = *it; + glVertex2i(it->x(), it->y()); + } + + glEnd(); + + if (closed && stippled) { + glEnable(GL_LINE_STIPPLE); + glLineStipple(2, 0x3F3F); + glBegin(GL_LINES); + glVertex2i(_cNodeVector.back().x(), _cNodeVector.back().y()); + glVertex2i(_cNodeVector.front().x(), _cNodeVector.front().y()); + glEnd(); + glDisable(GL_LINE_STIPPLE); + } } - if (!_cNodeVector.empty()) - glVertex2i(x_new, y_new); - - glEnd(); glDisable(GL_BLEND); } diff --git a/src/Gui/GLPainter.h b/src/Gui/GLPainter.h index bee57b7fa..765c0a010 100644 --- a/src/Gui/GLPainter.h +++ b/src/Gui/GLPainter.h @@ -119,7 +119,7 @@ class Polyline : public Gui::GLGraphicsItem std::vector _cNodeVector; int x_new, y_new; float rgb_r, rgb_g, rgb_b, rgb_a, line; - bool working, closed; + bool working, closed, stippled; GLPainter p; public: @@ -127,12 +127,13 @@ public: Polyline(); ~Polyline(); void setWorking(bool on); - bool isWorking(); + bool isWorking() const; void setViewer(View3DInventorViewer* v); void setCoords(int x, int y); void setColor(int r, int g, int b, int a=0); void setLineWidth(float l); void setClosed(bool c); + void setCloseStippled(bool c); void addNode(const QPoint& p); void clear(); void paintGL(); diff --git a/src/Gui/MouseSelection.cpp b/src/Gui/MouseSelection.cpp index 73e7d876f..5eb4bd4bd 100644 --- a/src/Gui/MouseSelection.cpp +++ b/src/Gui/MouseSelection.cpp @@ -251,6 +251,16 @@ PolyPickerSelection::PolyPickerSelection() { } +void PolyPickerSelection::setColor(float r, float g, float b, float a) +{ + polyline.setColor(r,g,b,a); +} + +void PolyPickerSelection::setLineWidth(float l) +{ + polyline.setLineWidth(l); +} + void PolyPickerSelection::initialize() { QPixmap p(cursor_cut_scissors); @@ -258,8 +268,7 @@ void PolyPickerSelection::initialize() _pcView3D->getWidget()->setCursor(cursor); polyline.setViewer(_pcView3D); - polyline.setColor(0.0,0.0,1.0,1.0); - + _pcView3D->addGraphicsItem(&polyline); _pcView3D->setRenderType(View3DInventorViewer::Image); _pcView3D->redraw(); @@ -456,25 +465,15 @@ BrushSelection::BrushSelection() { } - BrushSelection::~BrushSelection() { } -void BrushSelection::setColor(float r, float g, float b, float a) -{ - polyline.setColor(r,g,b,a); -} - -void BrushSelection::setLineWidth(float l) -{ - polyline.setLineWidth(l); -} - void BrushSelection::setClosed(bool on) { - //TODO: closed = false is not supported yet + polyline.setClosed(on); + polyline.setCloseStippled(true); } int BrushSelection::popupMenu() @@ -484,11 +483,10 @@ int BrushSelection::popupMenu() menu.addAction(QObject::tr("Clear")); QAction* ca = menu.addAction(QObject::tr("Cancel")); - if(getPositions().size() < 3) + if (getPositions().size() < 3) fi->setEnabled(false); QAction* id = menu.exec(QCursor::pos()); - if (id == fi) return Finish; else if (id == ca) @@ -497,6 +495,80 @@ int BrushSelection::popupMenu() return Restart; } +int BrushSelection::mouseButtonEvent(const SoMouseButtonEvent* const e, const QPoint& pos) +{ + const int button = e->getButton(); + const SbBool press = e->getState() == SoButtonEvent::DOWN ? TRUE : FALSE; + + if (press) { + switch(button) + { + case SoMouseButtonEvent::BUTTON1: + { + if (!polyline.isWorking()) { + polyline.setWorking(true); + polyline.clear(); + }; + polyline.addNode(pos); + polyline.setCoords(pos.x(), pos.y()); + m_iXnew = pos.x(); m_iYnew = pos.y(); + m_iXold = pos.x(); m_iYold = pos.y(); + } + break; + + case SoMouseButtonEvent::BUTTON2: + { + polyline.addNode(pos); + m_iXnew = pos.x(); m_iYnew = pos.y(); + m_iXold = pos.x(); m_iYold = pos.y(); + } + break; + + default: + { + } break; + } + } + // release + else { + switch(button) + { + case SoMouseButtonEvent::BUTTON1: + if (polyline.isWorking()) { + releaseMouseModel(); + return Finish; + } + case SoMouseButtonEvent::BUTTON2: + { + QCursor cur = _pcView3D->getWidget()->cursor(); + _pcView3D->getWidget()->setCursor(m_cPrevCursor); + + // The pop-up menu should be shown when releasing mouse button because + // otherwise the navigation style doesn't get the UP event and gets into + // an inconsistent state. + int id = popupMenu(); + + if (id == Finish || id == Cancel) { + releaseMouseModel(); + } + else if (id == Restart) { + _pcView3D->getWidget()->setCursor(cur); + } + + polyline.setWorking(false); + return id; + } + break; + + default: + { + } break; + } + } + + return Continue; +} + int BrushSelection::locationEvent(const SoLocation2Event* const e, const QPoint& pos) { // do all the drawing stuff for us @@ -541,30 +613,24 @@ int BrushSelection::locationEvent(const SoLocation2Event* const e, const QPoint& // ----------------------------------------------------------------------------------- -RectangleSelection::RectangleSelection() : RubberbandSelection() -{ - rubberband.setColor(0.0,0.0,1.0,1.0); -} - -RectangleSelection::~RectangleSelection() -{ -} - -// ----------------------------------------------------------------------------------- - RubberbandSelection::RubberbandSelection() { + rubberband.setColor(1.0, 1.0, 0.0, 0.5); } RubberbandSelection::~RubberbandSelection() { } +void RubberbandSelection::setColor(float r, float g, float b, float a) +{ + rubberband.setColor(r,g,b,a); +} + void RubberbandSelection::initialize() { rubberband.setViewer(_pcView3D); rubberband.setWorking(false); - rubberband.setColor(1.0, 1.0, 0.0, 0.5); _pcView3D->addGraphicsItem(&rubberband); if (QGLFramebufferObject::hasOpenGLFramebufferObjects()) { _pcView3D->setRenderType(View3DInventorViewer::Image); @@ -645,6 +711,17 @@ int RubberbandSelection::keyboardEvent(const SoKeyboardEvent* const e) // ----------------------------------------------------------------------------------- +RectangleSelection::RectangleSelection() : RubberbandSelection() +{ + rubberband.setColor(0.0,0.0,1.0,1.0); +} + +RectangleSelection::~RectangleSelection() +{ +} + +// ----------------------------------------------------------------------------------- + BoxZoomSelection::BoxZoomSelection() { } diff --git a/src/Gui/MouseSelection.h b/src/Gui/MouseSelection.h index b48e91cf4..7c8c544a7 100644 --- a/src/Gui/MouseSelection.h +++ b/src/Gui/MouseSelection.h @@ -113,7 +113,7 @@ class GuiExport BaseMouseSelection : public AbstractMouseSelection { public: BaseMouseSelection(); - virtual ~BaseMouseSelection() {}; + virtual ~BaseMouseSelection(){} }; // ----------------------------------------------------------------------------------- @@ -129,6 +129,9 @@ public: PolyPickerSelection(); virtual ~PolyPickerSelection(); + void setLineWidth(float l); + void setColor(float r, float g, float b, float a = 1.0); + virtual void initialize(); virtual void terminate(); @@ -173,12 +176,11 @@ public: BrushSelection(); virtual ~BrushSelection(); - void setLineWidth(float l); void setClosed(bool c); - void setColor(float r, float g, float b, float a = 1.0); protected: virtual int popupMenu(); + virtual int mouseButtonEvent(const SoMouseButtonEvent* const e, const QPoint& pos); virtual int locationEvent(const SoLocation2Event* const e, const QPoint& pos); }; @@ -195,9 +197,9 @@ public: RubberbandSelection(); virtual ~RubberbandSelection(); - /// do nothing + void setColor(float r, float g, float b, float a = 1.0); + virtual void initialize(); - /// do nothing virtual void terminate(); protected: