diff --git a/src/Mod/TechDraw/App/DrawViewImage.cpp b/src/Mod/TechDraw/App/DrawViewImage.cpp index ec87ad1216..71618f0a2f 100644 --- a/src/Mod/TechDraw/App/DrawViewImage.cpp +++ b/src/Mod/TechDraw/App/DrawViewImage.cpp @@ -34,7 +34,9 @@ #include #include #include +#include +#include "DrawUtil.h" #include "DrawViewImage.h" using namespace TechDraw; @@ -53,8 +55,10 @@ DrawViewImage::DrawViewImage(void) static const char *vgroup = "Image"; ADD_PROPERTY_TYPE(ImageFile,(""),vgroup,App::Prop_None,"The file containing this bitmap"); - ADD_PROPERTY_TYPE(Width ,(100),vgroup,App::Prop_None,"The width of the image view"); - ADD_PROPERTY_TYPE(Height ,(100),vgroup,App::Prop_None,"The height of the view"); + ADD_PROPERTY_TYPE(ImageIncluded, (""), vgroup,App::Prop_None, + "Embedded image file. System use only."); // n/a to end users + ADD_PROPERTY_TYPE(Width ,(100),vgroup,App::Prop_None,"The width of cropped image"); + ADD_PROPERTY_TYPE(Height ,(100),vgroup,App::Prop_None,"The height of cropped image"); ScaleType.setValue("Custom"); std::string imgFilter("Image files (*.jpg *.jpeg *.png);;All files (*)"); @@ -67,14 +71,36 @@ DrawViewImage::~DrawViewImage() void DrawViewImage::onChanged(const App::Property* prop) { - if (prop == &ImageFile) { - if (!isRestoring()) { + App::Document* doc = getDocument(); + if (!isRestoring()) { + if ((prop == &ImageFile) && + (doc != nullptr) ) { + if (!ImageFile.isEmpty()) { + replaceImageIncluded(ImageFile.getValue()); + } + requestPaint(); + } else if (prop == &Scale) { requestPaint(); } } + TechDraw::DrawView::onChanged(prop); } +short DrawViewImage::mustExecute() const +{ + short result = 0; + if (!isRestoring()) { + result = (Height.isTouched() || + Width.isTouched()); + } + + if (result) { + return result; + } + return App::DocumentObject::mustExecute(); +} + App::DocumentObjectExecReturn *DrawViewImage::execute(void) { requestPaint(); @@ -87,6 +113,41 @@ QRectF DrawViewImage::getRect() const return result; } +void DrawViewImage::replaceImageIncluded(std::string newFileName) +{ + Base::Console().Message("DVI::replaceImageIncluded(%s)\n", newFileName.c_str()); + if (ImageIncluded.isEmpty()) { + setupImageIncluded(); + } else { + std::string tempName = ImageIncluded.getExchangeTempFile(); + DrawUtil::copyFile(newFileName, tempName); + ImageIncluded.setValue(tempName.c_str()); + } +} + +void DrawViewImage::setupImageIncluded(void) +{ + Base::Console().Message("DVI::setupImageIncluded()\n"); + App::Document* doc = getDocument(); + std::string dir = doc->TransientDir.getValue(); + std::string special = getNameInDocument(); + special += "Image.bitmap"; + std::string imageName = dir + "/" + special; + + //setupImageIncluded is only called when ImageIncluded is empty, so + //just set up the empty file first + DrawUtil::copyFile(std::string(), imageName); + ImageIncluded.setValue(imageName.c_str()); + + if (!ImageFile.isEmpty()) { + Base::FileInfo fi(ImageFile.getValue()); + if (fi.isReadable()) { + std::string exchName = ImageIncluded.getExchangeTempFile(); + DrawUtil::copyFile(ImageFile.getValue(), exchName); + ImageIncluded.setValue(exchName.c_str(), special.c_str()); + } + } +} // Python Drawing feature --------------------------------------------------------- diff --git a/src/Mod/TechDraw/App/DrawViewImage.h b/src/Mod/TechDraw/App/DrawViewImage.h index 4a64903154..d9aaa4919f 100644 --- a/src/Mod/TechDraw/App/DrawViewImage.h +++ b/src/Mod/TechDraw/App/DrawViewImage.h @@ -23,6 +23,8 @@ #ifndef _DrawViewImage_h_ #define _DrawViewImage_h_ +#include + #include #include #include @@ -36,31 +38,37 @@ namespace TechDraw class TechDrawExport DrawViewImage : public TechDraw::DrawView { - PROPERTY_HEADER(TechDraw::DrawViewImage); + PROPERTY_HEADER_WITH_OVERRIDE(TechDraw::DrawViewImage); public: /// Constructor DrawViewImage(void); virtual ~DrawViewImage(); - App::PropertyFile ImageFile; - App::PropertyFloat Width; - App::PropertyFloat Height; + App::PropertyFile ImageFile; + App::PropertyFileIncluded ImageIncluded; + App::PropertyFloat Width; + App::PropertyFloat Height; /** @name methods override Feature */ //@{ /// recalculate the Feature - virtual App::DocumentObjectExecReturn *execute(void); + App::DocumentObjectExecReturn *execute(void) override; //@} + short mustExecute() const override; + /// returns the type name of the ViewProvider - virtual const char* getViewProviderName(void) const { + const char* getViewProviderName(void) const override { return "TechDrawGui::ViewProviderImage"; } - virtual QRectF getRect() const; + QRectF getRect() const override; protected: - virtual void onChanged(const App::Property* prop); + void setupImageIncluded(void); + void replaceImageIncluded(std::string newFileName); + + void onChanged(const App::Property* prop) override; Base::BoundBox3d bbox; }; diff --git a/src/Mod/TechDraw/Gui/QGCustomClip.h b/src/Mod/TechDraw/Gui/QGCustomClip.h index 54c0342ad9..ba64ee74db 100644 --- a/src/Mod/TechDraw/Gui/QGCustomClip.h +++ b/src/Mod/TechDraw/Gui/QGCustomClip.h @@ -23,6 +23,8 @@ #ifndef DRAWINGGUI_QGCUSTOMCLIP_H #define DRAWINGGUI_QGCUSTOMCLIP_H +#include + #include #include #include diff --git a/src/Mod/TechDraw/Gui/QGCustomImage.cpp b/src/Mod/TechDraw/Gui/QGCustomImage.cpp index fb3b451259..de42d4cb9f 100644 --- a/src/Mod/TechDraw/Gui/QGCustomImage.cpp +++ b/src/Mod/TechDraw/Gui/QGCustomImage.cpp @@ -85,7 +85,7 @@ bool QGCustomImage::load(QPixmap map) QSize QGCustomImage::imageSize(void) { - QSize result = m_px.size(); + QSize result = m_px.size() * scale(); return result; } diff --git a/src/Mod/TechDraw/Gui/QGCustomImage.h b/src/Mod/TechDraw/Gui/QGCustomImage.h index dce9116b4d..d1616858e1 100644 --- a/src/Mod/TechDraw/Gui/QGCustomImage.h +++ b/src/Mod/TechDraw/Gui/QGCustomImage.h @@ -23,6 +23,8 @@ #ifndef DRAWINGGUI_QGCUSTOMIMAGE_H #define DRAWINGGUI_QGCUSTOMIMAGE_H +#include + #include #include #include diff --git a/src/Mod/TechDraw/Gui/QGIViewImage.cpp b/src/Mod/TechDraw/Gui/QGIViewImage.cpp index 5dc0add9da..93b9957953 100644 --- a/src/Mod/TechDraw/Gui/QGIViewImage.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewImage.cpp @@ -145,8 +145,8 @@ void QGIViewImage::drawImage() return; } - if (!viewImage->ImageFile.isEmpty()) { - QString fileSpec = QString::fromUtf8(viewImage->ImageFile.getValue(),strlen(viewImage->ImageFile.getValue())); + if (!viewImage->ImageIncluded.isEmpty()) { + QString fileSpec = QString::fromUtf8(viewImage->ImageIncluded.getValue(),strlen(viewImage->ImageIncluded.getValue())); m_imageItem->load(fileSpec); m_imageItem->setScale(viewImage->getScale()); QRectF br = m_cliparea->rect(); @@ -164,5 +164,3 @@ void QGIViewImage::rotateView(void) double rot = getViewObject()->Rotation.getValue(); m_cliparea->setRotation(-rot); } - - diff --git a/src/Mod/TechDraw/Gui/ViewProviderImage.cpp b/src/Mod/TechDraw/Gui/ViewProviderImage.cpp index 8d3d4cafc6..2458fd4fd5 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderImage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderImage.cpp @@ -70,6 +70,15 @@ std::vector ViewProviderImage::getDisplayModes(void) const void ViewProviderImage::updateData(const App::Property* prop) { + if (prop == &(getViewObject()->Width) || + prop == &(getViewObject()->Height) || + prop == &(getViewObject()->Scale) ) { + QGIView* qgiv = getQView(); + if (qgiv) { + qgiv->QGIView::updateView(true); + } + } + ViewProviderDrawingView::updateData(prop); }