diff --git a/scribus/plugins/scriptplugin/cmdmani.cpp b/scribus/plugins/scriptplugin/cmdmani.cpp index db30970e3..115388e79 100644 --- a/scribus/plugins/scriptplugin/cmdmani.cpp +++ b/scribus/plugins/scriptplugin/cmdmani.cpp @@ -649,6 +649,68 @@ PyObject *scribus_combinepolygons(PyObject * /* self */) Py_RETURN_NONE; } +PyObject *scribus_embedimage(PyObject* /* self */, PyObject* args) +{ + if (!checkHaveDocument()) + return nullptr; + char *name = const_cast(""); + if (!PyArg_ParseTuple(args, "|es", "utf-8", &name)) + return nullptr; + PageItem *item = GetUniqueItem(QString::fromUtf8(name)); + if (item == nullptr) + return nullptr; + + if (!item->isImageFrame()) + { + PyErr_SetString(WrongFrameTypeError, QObject::tr("Specified item not an image frame.","python error").toLocal8Bit().constData()); + return nullptr; + } + + if (item->isImageInline()) + { + PyErr_SetString(ScribusException, QObject::tr("The image is already embedded ","python error").toLocal8Bit().constData()); + return nullptr; + } + + ScCore->primaryMainWindow()->embedImageInFrame(item); + + Py_RETURN_NONE; +} + +PyObject *scribus_extractimage(PyObject* /* self */, PyObject* args) +{ + char *itemname = const_cast(""); + char *filename = const_cast(""); + if (!PyArg_ParseTuple(args, "es|es", "utf-8", &filename, "utf-8", &itemname)) + return nullptr; + if (!checkHaveDocument()) + return nullptr; + PageItem *item = GetUniqueItem(QString::fromUtf8(itemname)); + if (item == nullptr) + return nullptr; + if (!item->isImageFrame()) + { + PyErr_SetString(ScribusException, QObject::tr("Specified item not an image frame.","python error").toLocal8Bit().constData()); + return nullptr; + } + + if (!item->isImageInline()) + { + PyErr_SetString(ScribusException, QObject::tr("The image is not embedded ","python error").toLocal8Bit().constData()); + return nullptr; + } + + if (filename == "") + { + PyErr_SetString(ScribusException, QObject::tr("File name cannot be empty.","python error").toLocal8Bit().constData()); + return nullptr; + } + + ScCore->primaryMainWindow()->extractImageFromFrame(item, filename); + + Py_RETURN_NONE; +} + /*! HACK: this removes "warning: 'blah' defined but not used" compiler warnings with header files structure untouched (docstrings are kept near declarations) PV */ @@ -657,6 +719,8 @@ void cmdmanidocwarnings() QStringList s; s << scribus_combinepolygons__doc__ << scribus_deselect__doc__ + << scribus_embedimage__doc__ + << scribus_extractimage__doc__ << scribus_flipobject__doc__ << scribus_getselobjnam__doc__ << scribus_groupobj__doc__ diff --git a/scribus/plugins/scriptplugin/cmdmani.h b/scribus/plugins/scriptplugin/cmdmani.h index d8b8ecca9..0276bdc2e 100644 --- a/scribus/plugins/scriptplugin/cmdmani.h +++ b/scribus/plugins/scriptplugin/cmdmani.h @@ -278,4 +278,22 @@ Combine two or more selected Polygons\n\ ")); PyObject *scribus_combinepolygons(PyObject * /* self */); +PyDoc_STRVAR(scribus_embedimage__doc__, +QT_TR_NOOP("embedImage(name:str = None )\n\ +\n\ +Embed the linked image for the image frame \"name\".\n\ +If \"name\" is not given the currently selected item is used.\n\ +")); +/*! embed the linked image in the frame */ +PyObject *scribus_embedimage(PyObject * /*self*/, PyObject* args); + +PyDoc_STRVAR(scribus_extractimage__doc__, +QT_TR_NOOP("extractImage(filename:str, name:str = None )\n\ +\n\ +Extract the image embedded in the image frame \"name\" and store it in the \"filename\" file.\n\ +If \"name\" is not given the currently selected item is used.\n\ +")); +/*! extract the embedded image from the frame */ +PyObject *scribus_extractimage(PyObject * /*self*/, PyObject* args); + #endif diff --git a/scribus/plugins/scriptplugin/scriptplugin.cpp b/scribus/plugins/scriptplugin/scriptplugin.cpp index ced8c5e50..7a71994d5 100644 --- a/scribus/plugins/scriptplugin/scriptplugin.cpp +++ b/scribus/plugins/scriptplugin/scriptplugin.cpp @@ -327,6 +327,8 @@ PyMethodDef scribus_methods[] = { {const_cast("deselectAll"), (PyCFunction)scribus_deselect, METH_NOARGS, tr(scribus_deselect__doc__)}, {const_cast("docChanged"), scribus_docchanged, METH_VARARGS, tr(scribus_docchanged__doc__)}, {const_cast("editMasterPage"), scribus_editmasterpage, METH_VARARGS, tr(scribus_editmasterpage__doc__)}, + {const_cast("embedImage"), scribus_embedimage, METH_VARARGS, tr(scribus_embedimage__doc__)}, + {const_cast("extractImage"), scribus_extractimage, METH_VARARGS, tr(scribus_extractimage__doc__)}, {const_cast("fileDialog"), (PyCFunction)scribus_filedialog, METH_VARARGS|METH_KEYWORDS, tr(scribus_filedialog__doc__)}, {const_cast("fileQuit"), scribus_filequit, METH_VARARGS, tr(scribus_filequit__doc__)}, {const_cast("flipObject"), scribus_flipobject, METH_VARARGS, tr(scribus_flipobject__doc__)}, diff --git a/scribus/scribus.cpp b/scribus/scribus.cpp index 792763a73..529fda0c9 100644 --- a/scribus/scribus.cpp +++ b/scribus/scribus.cpp @@ -3903,56 +3903,70 @@ void ScribusMainWindow::toogleInlineState() if (!currItem->imageIsAvailable) return; if (currItem->isImageInline()) - { - QFileInfo fiB(currItem->Pfile); + extractImageFromFrame(currItem); + else + embedImageInFrame(currItem); + scrActions["itemToggleInlineImage"]->setChecked(currItem->isImageInline()); +} - PrefsContext* docContext = m_prefsManager.prefsFile->getContext("docdirs", false); - QString wdir = "."; - if (doc->hasName) - { - QFileInfo fi(doc->documentFileName()); - wdir = QDir::fromNativeSeparators( fi.path() ); - } - else - { - QString prefsDocDir = m_prefsManager.documentDir(); - if (!prefsDocDir.isEmpty()) - wdir = docContext->get("place_as", prefsDocDir); - else - wdir = docContext->get("place_as", "."); - wdir = QDir::fromNativeSeparators( wdir ); - } - QString fileName = CFileDialog(wdir, tr("Filename and Path for Image"), tr("All Files (*)"), fiB.fileName(), fdHidePreviewCheckBox); - if (!fileName.isEmpty()) - { - if (ScCore->fileWatcher->files().contains(currItem->Pfile) != 0) - ScCore->fileWatcher->removeFile(currItem->Pfile); - docContext->set("place_as", fileName.left(fileName.lastIndexOf("/"))); - if (overwrite(this, fileName)) - { - currItem->makeImageExternal(fileName); - ScCore->fileWatcher->addFile(currItem->Pfile); - bool fho = currItem->imageFlippedH(); - bool fvo = currItem->imageFlippedV(); - doc->loadPict(currItem->Pfile, currItem, true); - currItem->setImageFlippedH(fho); - currItem->setImageFlippedV(fvo); - } - } +void ScribusMainWindow::embedImageInFrame(PageItem* currItem) +{ + if (ScCore->fileWatcher->files().contains(currItem->Pfile) != 0) + ScCore->fileWatcher->removeFile(currItem->Pfile); + currItem->makeImageInline(); + ScCore->fileWatcher->addFile(currItem->Pfile); + bool fho = currItem->imageFlippedH(); + bool fvo = currItem->imageFlippedV(); + doc->loadPict(currItem->Pfile, currItem, true); + currItem->setImageFlippedH(fho); + currItem->setImageFlippedV(fvo); +} + +void ScribusMainWindow::extractImageFromFrame(PageItem* currItem) +{ + QFileInfo fiB(currItem->Pfile); + + PrefsContext* docContext = m_prefsManager.prefsFile->getContext("docdirs", false); + QString wdir = "."; + if (doc->hasName) + { + QFileInfo fi(doc->documentFileName()); + wdir = QDir::fromNativeSeparators( fi.path() ); } else { - if (ScCore->fileWatcher->files().contains(currItem->Pfile) != 0) - ScCore->fileWatcher->removeFile(currItem->Pfile); - currItem->makeImageInline(); - ScCore->fileWatcher->addFile(currItem->Pfile); - bool fho = currItem->imageFlippedH(); - bool fvo = currItem->imageFlippedV(); - doc->loadPict(currItem->Pfile, currItem, true); - currItem->setImageFlippedH(fho); - currItem->setImageFlippedV(fvo); + QString prefsDocDir = m_prefsManager.documentDir(); + if (!prefsDocDir.isEmpty()) + wdir = docContext->get("place_as", prefsDocDir); + else + wdir = docContext->get("place_as", "."); + wdir = QDir::fromNativeSeparators( wdir ); } - scrActions["itemToggleInlineImage"]->setChecked(currItem->isImageInline()); + QString fileName = CFileDialog(wdir, tr("Filename and Path for Image"), tr("All Files (*)"), fiB.fileName(), fdHidePreviewCheckBox); + + if (fileName.isEmpty()) + return; + + docContext->set("place_as", fileName.left(fileName.lastIndexOf("/"))); + + if (!overwrite(this, fileName)) + return; + + extractImageFromFrame(currItem, fileName); +} + +void ScribusMainWindow::extractImageFromFrame(PageItem* currItem, const QString& filename) +{ + if (ScCore->fileWatcher->files().contains(currItem->Pfile) != 0) + ScCore->fileWatcher->removeFile(currItem->Pfile); + + currItem->makeImageExternal(filename); + ScCore->fileWatcher->addFile(currItem->Pfile); + bool fho = currItem->imageFlippedH(); + bool fvo = currItem->imageFlippedV(); + doc->loadPict(currItem->Pfile, currItem, true); + currItem->setImageFlippedH(fho); + currItem->setImageFlippedV(fvo); } void ScribusMainWindow::slotFileAppend() diff --git a/scribus/scribus.h b/scribus/scribus.h index 91fc4c7df..0c66451f2 100644 --- a/scribus/scribus.h +++ b/scribus/scribus.h @@ -336,6 +336,9 @@ public slots: void slotGetContent2(); // kk2006 void slotGetClipboardImage(); void toogleInlineState(); + void embedImageInFrame(PageItem* currItem); + void extractImageFromFrame(PageItem* currItem); + void extractImageFromFrame(PageItem* currItem, const QString& filename); /*! \author Franz Schmid \brief Appends a Textfile to the Text in the selected Textframe at the Cursorposition