Embedding: add a check box to InsetGraphic and show/change embedding status

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@20297 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Bo Peng 2007-09-15 18:31:32 +00:00
parent d348b0183b
commit 93196b1f73
9 changed files with 61 additions and 24 deletions

View File

@ -179,6 +179,26 @@ def remove_manifest(document):
document.manifest = None 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 # Conversion hub
# #
@ -197,7 +217,7 @@ convert = [
] ]
revert = [ revert = [
[284, [remove_manifest]], [284, [remove_manifest, remove_inzip_options]],
[283, []], [283, []],
[282, [revert_flex]], [282, [revert_flex]],
[281, []], [281, []],

View File

@ -468,7 +468,9 @@ void EmbeddedFiles::writeManifest(ostream & os) const
EmbeddedFiles::EmbeddedFileList::const_iterator it = begin(); EmbeddedFiles::EmbeddedFileList::const_iterator it = begin();
EmbeddedFiles::EmbeddedFileList::const_iterator it_end = end(); EmbeddedFiles::EmbeddedFileList::const_iterator it_end = end();
for (; it != it_end; ++it) { 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; continue;
// save the relative path // save the relative path
os << "\\filename " os << "\\filename "

View File

@ -113,11 +113,14 @@ class ErrorList;
class EmbeddedFile : public support::DocFileName class EmbeddedFile : public support::DocFileName
{ {
public: public:
EmbeddedFile() {};
EmbeddedFile(std::string const & file, std::string const & inzip_name, EmbeddedFile(std::string const & file, std::string const & inzip_name,
bool embedded, Inset const * inset); bool embedded, Inset const * inset);
/// filename in the zip file, usually the relative path /// filename in the zip file, usually the relative path
std::string inzipName() const { return inzip_name_; } std::string inzipName() const { return inzip_name_; }
void setInzipName(std::string name) { inzip_name_ = name; }
/// embedded file, equals to temppath()/inzipName() /// embedded file, equals to temppath()/inzipName()
std::string embeddedFile(Buffer const * buf) const; std::string embeddedFile(Buffer const * buf) const;
/// embeddedFile() or absFilename() depending on embedding status /// embeddedFile() or absFilename() depending on embedding status

View File

@ -111,6 +111,9 @@ void ControlEmbeddedFiles::setEmbed(EmbeddedFile & item, bool embed, bool update
else else
item.extract(&buffer()); item.extract(&buffer());
item.updateInsets(&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) if (embed)
dispatchMessage("Embed file " + item.outputFilename(buffer().filePath())); dispatchMessage("Embed file " + item.outputFilename(buffer().filePath()));

View File

@ -285,6 +285,7 @@ void GuiGraphicsDialog::on_browsePB_clicked()
controller().browse(qstring_to_ucs4(filename->text())); controller().browse(qstring_to_ucs4(filename->text()));
if(!str.empty()){ if(!str.empty()){
filename->setText(toqstr(str)); filename->setText(toqstr(str));
embedCB->setCheckState(Qt::Unchecked);
changed(); changed();
} }
} }
@ -454,6 +455,7 @@ void GuiGraphicsDialog::updateContents()
string const name = string const name =
igp.filename.outputFilename(controller().bufferFilepath()); igp.filename.outputFilename(controller().bufferFilepath());
filename->setText(toqstr(name)); filename->setText(toqstr(name));
embedCB->setCheckState(igp.filename.embedded() ? Qt::Checked : Qt::Unchecked);
// set the bounding box values // set the bounding box values
if (igp.bb.empty()) { if (igp.bb.empty()) {
@ -600,6 +602,7 @@ void GuiGraphicsDialog::applyView()
igp.filename.set(internal_path(fromqstr(filename->text())), igp.filename.set(internal_path(fromqstr(filename->text())),
controller().bufferFilepath()); controller().bufferFilepath());
igp.filename.setEmbed(embedCB->checkState() == Qt::Checked);
// the bb section // the bb section
igp.bb.erase(); igp.bb.erase();

View File

@ -49,7 +49,7 @@
<property name="spacing" > <property name="spacing" >
<number>6</number> <number>6</number>
</property> </property>
<item row="0" column="3" > <item row="0" column="4" >
<widget class="QPushButton" name="editPB" > <widget class="QPushButton" name="editPB" >
<property name="text" > <property name="text" >
<string>&amp;Edit</string> <string>&amp;Edit</string>
@ -62,7 +62,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="2" > <item row="0" column="3" >
<widget class="QPushButton" name="browsePB" > <widget class="QPushButton" name="browsePB" >
<property name="toolTip" > <property name="toolTip" >
<string>Select an image file</string> <string>Select an image file</string>
@ -71,6 +71,13 @@
<string>&amp;Browse...</string> <string>&amp;Browse...</string>
</property> </property>
</widget> </widget>
</item>
<item row="0" column="2">
<widget class="QCheckBox" name="embedCB" >
<property name="text" >
<string></string>
</property>
</widget>
</item> </item>
<item row="0" column="1" > <item row="0" column="1" >
<widget class="QLineEdit" name="filename" > <widget class="QLineEdit" name="filename" >
@ -92,7 +99,7 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0" colspan="4" > <item row="1" column="0" colspan="5" >
<widget class="QGroupBox" name="sizeGB" > <widget class="QGroupBox" name="sizeGB" >
<property name="title" > <property name="title" >
<string>Output Size</string> <string>Output Size</string>
@ -214,7 +221,7 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="4" > <item row="2" column="0" colspan="5" >
<widget class="QGroupBox" name="rotationGB" > <widget class="QGroupBox" name="rotationGB" >
<property name="title" > <property name="title" >
<string>Rotate Graphics</string> <string>Rotate Graphics</string>

View File

@ -243,13 +243,11 @@ void InsetGraphics::updateEmbeddedFile(Buffer const & buf,
EmbeddedFile const & file) EmbeddedFile const & file)
{ {
BOOST_ASSERT(buf.embeddedFiles().enabled()); BOOST_ASSERT(buf.embeddedFiles().enabled());
LYXERR(Debug::FILES) << "Update InsetGraphics file from " params_.filename = file;
<< params_.filename.toFilesystemEncoding() << std::endl; LYXERR(Debug::FILES) << "Update InsetGraphic with File "
params_.filename.set(file.availableFile(&buf), buf.filePath()); << params_.filename.toFilesystemEncoding()
LYXERR(Debug::FILES) << " to " << ", embedding status: "
<< params_.filename.toFilesystemEncoding() << std::endl; << params_.filename.embedded() << std::endl;
// FIXME: graphics dialog is not updated even if the underlying
// filename is updated. What should I do?
} }
@ -305,7 +303,7 @@ void InsetGraphics::read(Buffer const & buf, Lexer & lex)
if (it != buf.embeddedFiles().end()) if (it != buf.embeddedFiles().end())
// using available file, embedded or external, depending on file availability and // using available file, embedded or external, depending on file availability and
// embedding status. // embedding status.
params_.filename = DocFileName(it->availableFile(&buf)); params_.filename = *it;
} }
graphic_->update(params().as_grfxParams()); graphic_->update(params().as_grfxParams());
} }

View File

@ -18,7 +18,6 @@
#include "Lexer.h" #include "Lexer.h"
#include "LyXRC.h" #include "LyXRC.h"
#include "Buffer.h" #include "Buffer.h"
#include "EmbeddedFiles.h"
#include "graphics/GraphicsParams.h" #include "graphics/GraphicsParams.h"
@ -154,15 +153,10 @@ bool operator!=(InsetGraphicsParams const & left,
void InsetGraphicsParams::Write(ostream & os, Buffer const & buffer) const void InsetGraphicsParams::Write(ostream & os, Buffer const & buffer) const
{ {
// Do not write the default values // Do not write the default values
if (!filename.empty()) { 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) if (lyxscale != 100)
os << "\tlyxscale " << lyxscale << '\n'; os << "\tlyxscale " << lyxscale << '\n';
@ -211,6 +205,12 @@ bool InsetGraphicsParams::Read(Lexer & lex, string const & token, string const &
if (token == "filename") { if (token == "filename") {
lex.eatLine(); lex.eatLine();
filename.set(lex.getString(), bufpath); 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") { } else if (token == "lyxscale") {
lex.next(); lex.next();
lyxscale = lex.getInteger(); lyxscale = lex.getInteger();

View File

@ -17,6 +17,7 @@
#include "graphics/GraphicsTypes.h" #include "graphics/GraphicsTypes.h"
#include "Length.h" #include "Length.h"
#include "support/FileName.h" #include "support/FileName.h"
#include "EmbeddedFiles.h"
namespace lyx { namespace lyx {
@ -31,7 +32,7 @@ class InsetGraphicsParams
{ {
public: public:
/// Image filename. /// Image filename.
support::DocFileName filename; EmbeddedFile filename;
/// Scaling the Screen inside Lyx /// Scaling the Screen inside Lyx
unsigned int lyxscale; unsigned int lyxscale;
/// How to display the image inside LyX /// How to display the image inside LyX