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);
}