> The attached patch: > Here it is.
Bo
Index: src/insets/InsetGraphicsParams.h =================================================================== --- src/insets/InsetGraphicsParams.h (revision 20282) +++ src/insets/InsetGraphicsParams.h (working copy) @@ -17,6 +17,7 @@ #include "graphics/GraphicsTypes.h" #include "Length.h" #include "support/FileName.h" +#include "EmbeddedFiles.h" namespace lyx { @@ -31,7 +32,7 @@ { public: /// Image filename. - support::DocFileName filename; + EmbeddedFile filename; /// Scaling the Screen inside Lyx unsigned int lyxscale; /// How to display the image inside LyX Index: src/insets/InsetGraphics.cpp =================================================================== --- src/insets/InsetGraphics.cpp (revision 20282) +++ src/insets/InsetGraphics.cpp (working copy) @@ -192,9 +192,9 @@ Buffer const & buffer = cur.buffer(); InsetGraphicsParams p; InsetGraphicsMailer::string2params(to_utf8(cmd.argument()), buffer, p); - if (!p.filename.empty()) + if (!p.filename.empty()) { setParams(p); - else + } else cur.noUpdate(); break; } @@ -243,13 +243,11 @@ EmbeddedFile const & file) { BOOST_ASSERT(buf.embeddedFiles().enabled()); - LYXERR(Debug::FILES) << "Update InsetGraphics file from " - << params_.filename.toFilesystemEncoding() << std::endl; - params_.filename.set(file.availableFile(&buf), buf.filePath()); - LYXERR(Debug::FILES) << " to " - << params_.filename.toFilesystemEncoding() << std::endl; - // FIXME: graphics dialog is not updated even if the underlying - // filename is updated. What should I do? + params_.filename = file; + LYXERR(Debug::FILES) << "Update InsetGraphic with File " + << params_.filename.toFilesystemEncoding() + << ", embedding status: " + << params_.filename.embedded() << std::endl; } @@ -305,7 +303,7 @@ if (it != buf.embeddedFiles().end()) // using available file, embedded or external, depending on file availability and // embedding status. - params_.filename = DocFileName(it->availableFile(&buf)); + params_.filename = *it; } graphic_->update(params().as_grfxParams()); } Index: src/insets/InsetGraphicsParams.cpp =================================================================== --- src/insets/InsetGraphicsParams.cpp (revision 20282) +++ src/insets/InsetGraphicsParams.cpp (working copy) @@ -18,7 +18,6 @@ #include "Lexer.h" #include "LyXRC.h" #include "Buffer.h" -#include "EmbeddedFiles.h" #include "graphics/GraphicsParams.h" @@ -154,15 +153,10 @@ void InsetGraphicsParams::Write(ostream & os, Buffer const & buffer) const { // Do not write the default values - if (!filename.empty()) { - // when we save, we still use the original filename - EmbeddedFiles::EmbeddedFileList::const_iterator it = - buffer.embeddedFiles().find(filename.toFilesystemEncoding()); - if (it != buffer.embeddedFiles().end()) - os << "\tfilename " << DocFileName(it->absFilename()).outputFilename(buffer.filePath()) << '\n'; - else - os << "\tfilename " << filename.outputFilename(buffer.filePath()) << '\n'; + os << "\tfilename " << filename.outputFilename(buffer.filePath()) << '\n'; + os << "\tinzipName " << filename.inzipName() << '\n'; + os << "\tembed " << (filename.embedded() ? "true" : "false") << '\n'; } if (lyxscale != 100) os << "\tlyxscale " << lyxscale << '\n'; @@ -211,6 +205,12 @@ if (token == "filename") { lex.eatLine(); filename.set(lex.getString(), bufpath); + } else if (token == "inzipName") { + lex.eatLine(); + filename.setInzipName(lex.getString()); + } else if (token == "embed") { + lex.next(); + filename.setEmbed(lex.getBool()); } else if (token == "lyxscale") { lex.next(); lyxscale = lex.getInteger(); Index: src/EmbeddedFiles.cpp =================================================================== --- src/EmbeddedFiles.cpp (revision 20282) +++ src/EmbeddedFiles.cpp (working copy) @@ -468,7 +468,9 @@ EmbeddedFiles::EmbeddedFileList::const_iterator it = begin(); EmbeddedFiles::EmbeddedFileList::const_iterator it_end = end(); for (; it != it_end; ++it) { - if (!it->valid()) + // only saved 'extra' files. Other embedded files are saved + // with insets. + if (!it->valid() || it->refCount() > 0) continue; // save the relative path os << "\\filename " Index: src/frontends/qt4/GuiGraphics.cpp =================================================================== --- src/frontends/qt4/GuiGraphics.cpp (revision 20282) +++ src/frontends/qt4/GuiGraphics.cpp (working copy) @@ -256,6 +256,7 @@ controller().browse(qstring_to_ucs4(filename->text())); if(!str.empty()){ filename->setText(toqstr(str)); + embedCB->setCheckState(Qt::Unchecked); changed(); } } @@ -425,6 +426,7 @@ string const name = igp.filename.outputFilename(controller().bufferFilepath()); filename->setText(toqstr(name)); + embedCB->setCheckState(igp.filename.embedded() ? Qt::Checked : Qt::Unchecked); // set the bounding box values if (igp.bb.empty()) { @@ -571,6 +573,7 @@ igp.filename.set(internal_path(fromqstr(filename->text())), controller().bufferFilepath()); + igp.filename.setEmbed(embedCB->checkState() == Qt::Checked); // the bb section igp.bb.erase(); Index: src/frontends/qt4/ui/GraphicsUi.ui =================================================================== --- src/frontends/qt4/ui/GraphicsUi.ui (revision 20282) +++ src/frontends/qt4/ui/GraphicsUi.ui (working copy) @@ -49,7 +49,7 @@ <property name="spacing" > <number>6</number> </property> - <item row="0" column="3" > + <item row="0" column="4" > <widget class="QPushButton" name="editPB" > <property name="text" > <string>&Edit</string> @@ -62,7 +62,7 @@ </property> </widget> </item> - <item row="0" column="2" > + <item row="0" column="3" > <widget class="QPushButton" name="browsePB" > <property name="toolTip" > <string>Select an image file</string> @@ -72,6 +72,13 @@ </property> </widget> </item> + <item row="0" column="2"> + <widget class="QCheckBox" name="embedCB" > + <property name="text" > + <string></string> + </property> + </widget> + </item> <item row="0" column="1" > <widget class="QLineEdit" name="filename" > <property name="toolTip" > @@ -92,7 +99,7 @@ </property> </widget> </item> - <item row="1" column="0" colspan="4" > + <item row="1" column="0" colspan="5" > <widget class="QGroupBox" name="sizeGB" > <property name="title" > <string>Output Size</string> @@ -214,7 +221,7 @@ </layout> </widget> </item> - <item row="2" column="0" colspan="4" > + <item row="2" column="0" colspan="5" > <widget class="QGroupBox" name="rotationGB" > <property name="title" > <string>Rotate Graphics</string> Index: src/frontends/controllers/ControlEmbeddedFiles.cpp =================================================================== --- src/frontends/controllers/ControlEmbeddedFiles.cpp (revision 20282) +++ src/frontends/controllers/ControlEmbeddedFiles.cpp (working copy) @@ -111,6 +111,9 @@ else item.extract(&buffer()); item.updateInsets(&buffer()); + // FIXME: unless we record the type of file item, we will + // need to update all possible dialogs (bibtex etc). + updateDialog("graphics"); } if (embed) dispatchMessage("Embed file " + item.outputFilename(buffer().filePath())); Index: src/EmbeddedFiles.h =================================================================== --- src/EmbeddedFiles.h (revision 20282) +++ src/EmbeddedFiles.h (working copy) @@ -113,11 +113,14 @@ class EmbeddedFile : public support::DocFileName { public: + EmbeddedFile() {}; + EmbeddedFile(std::string const & file, std::string const & inzip_name, bool embedded, Inset const * inset); /// filename in the zip file, usually the relative path std::string inzipName() const { return inzip_name_; } + void setInzipName(std::string name) { inzip_name_ = name; } /// embedded file, equals to temppath()/inzipName() std::string embeddedFile(Buffer const * buf) const; /// embeddedFile() or absFilename() depending on embedding status Index: lib/lyx2lyx/lyx_1_6.py =================================================================== --- lib/lyx2lyx/lyx_1_6.py (revision 20282) +++ lib/lyx2lyx/lyx_1_6.py (working copy) @@ -179,6 +179,26 @@ document.manifest = None +def remove_inzip_options(document): + "Remove inzipName and embed options from the Graphics inset" + i = 0 + while 1: + i = find_token(document.body, "\\begin_inset Graphics", i) + if i == -1: + return + j = find_end_of_inset(document.body, i + 1) + if j == -1: + # should not happen + document.warning("Malformed LyX document: Could not find end of graphics inset.") + # If there's a inzip param, just remove that + k = find_token(document.body, "\tinzipName", i + 1, j) + if k != -1: + del document.body[k] + # embed option must follow the inzipName option + del document.body[k+1] + i = i + 1 + + ## # Conversion hub # @@ -197,7 +217,7 @@ ] revert = [ - [284, [remove_manifest]], + [284, [remove_manifest, remove_inzip_options]], [283, []], [282, [revert_flex]], [281, []],