Implemented synchronous inline image viewing for InsetGraphics.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@1561 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Baruch Even 2001-02-20 09:08:56 +00:00
parent 8d7fe83bf5
commit 9a70b28af5
7 changed files with 61 additions and 64 deletions

View File

@ -1,3 +1,13 @@
2001-02-20 Baruch Even <baruch@ev-en.org>
* GraphicsCache.C: Cleared up the confusion on when and how it is
emptied.
* GraphicsCacheItem.C: Indentation change.
* GraphicsCacheItem_pimpl.C: Fixed the loading logic so that it will
figure correctly when the image has been loaded successfully.
2001-02-08 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr> 2001-02-08 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
* ImageLoader.C: add a "using" directive. * ImageLoader.C: add a "using" directive.

View File

@ -36,14 +36,8 @@ GraphicsCache::getInstance()
GraphicsCache::~GraphicsCache() GraphicsCache::~GraphicsCache()
{ {
// Free the map. // The map elements should have already been eliminated.
//std::foreach(map.begin(), map.end(), ...); Assert(cache.empty());
//#warning This is a bogus reason to not clean up after your self. (Lgb)
// TODO: Clean up here (BE)
// This is not really needed, it will only happen on program close and in
// any case the OS will release those resources (not doing it may have
// a good effect on closing time).
delete singleton; delete singleton;
} }
@ -78,6 +72,7 @@ GraphicsCache::removeFile(string const & filename)
// We do not destroy the GraphicsCacheItem since we are here because // We do not destroy the GraphicsCacheItem since we are here because
// the last copy of it is being erased. // the last copy of it is being erased.
if (cache.find(filename) != cache.end()) CacheType::iterator it = cache.find(filename);
cache.erase(filename); if (it != cache.end())
cache.erase(it);
} }

View File

@ -82,18 +82,16 @@ GraphicsCacheItem::copy(GraphicsCacheItem const & gci)
void void
GraphicsCacheItem::destroy() GraphicsCacheItem::destroy()
{ {
if (pimpl) { if (!pimpl)
--(pimpl->refCount); return;
if (pimpl->refCount == 0) {
{ // We are deleting the pimpl but we want to mark it deleted --(pimpl->refCount);
// even before it is deleted. if (pimpl->refCount == 0) {
GraphicsCacheItem_pimpl * temp = pimpl; delete pimpl;
pimpl = 0; pimpl = 0;
delete temp; temp = 0;
} GraphicsCache * gc = GraphicsCache::getInstance();
GraphicsCache * gc = GraphicsCache::getInstance(); gc->removeFile(filename_);
gc->removeFile(filename_);
}
} }
} }

View File

@ -108,8 +108,8 @@ GraphicsCacheItem_pimpl::renderXPM(string const & filename)
temp = ChangeExtension(filename, string()); temp = ChangeExtension(filename, string());
// Add some stuff to have it a unique temp file. // Add some stuff to have it a unique temp file.
// This tempfile is deleted in loadXPMImage after it is loaded to memory.
xpmfile = lyx::tempName(string(), temp); xpmfile = lyx::tempName(string(), temp);
#warning When is this tempfile unlinked? (Lgb)
xpmfile = ChangeExtension(xpmfile, ".xpm"); xpmfile = ChangeExtension(xpmfile, ".xpm");
command += xpmfile; command += xpmfile;
@ -136,7 +136,7 @@ GraphicsCacheItem_pimpl::loadXPMImage()
{ {
lyxerr << "Loading XPM Image... "; lyxerr << "Loading XPM Image... ";
if (imageLoader->loadImage(xpmfile)) { if (imageLoader->loadImage(xpmfile) == ImageLoader::OK) {
lyxerr << "Success." << endl; lyxerr << "Success." << endl;
image_ = imageLoader->getImage(); image_ = imageLoader->getImage();
imageStatus_ = GraphicsCacheItem::Loaded; imageStatus_ = GraphicsCacheItem::Loaded;

View File

@ -1,3 +1,9 @@
2001-02-20 Baruch Even <baruch@ev-en.org>
* insetgraphics.h:
* insetgraphisc.C: Changed to use better semantics when loading images
for inline view. Now it doesn't keep the pixmap itself but it's holder.
2001-02-19 Angus Leeming <a.leeming@ic.ac.uk> 2001-02-19 Angus Leeming <a.leeming@ic.ac.uk>
* insetcommand.h: * insetcommand.h:

View File

@ -42,12 +42,10 @@ Known BUGS:
* Bug in FileDlg class (src/filedlg.[hC]) when selecting a file and then * Bug in FileDlg class (src/filedlg.[hC]) when selecting a file and then
pressing ok, it counts as if no real selection done. Apparently pressing ok, it counts as if no real selection done. Apparently
when choosing a file it doesn't update the select file input line. when choosing a file it doesn't update the select file input line.
* Inline viewing is still not completely operational, in fact it is now
disabled. To enable it enable the define:
INSETGRAPHICS_INLINE_VIEW
* If we are trying to create a file in a read-only directory and there * If we are trying to create a file in a read-only directory and there
are graphics that need converting, the converting will fail because are graphics that need converting, the converting will fail because
it is done in-place, into the same directory as the original image. it is done in-place, into the same directory as the original image.
This needs to be fixed in the src/converter.C file
TODO Before initial production release: TODO Before initial production release:
* Replace insetfig everywhere * Replace insetfig everywhere
@ -61,6 +59,7 @@ TODO Before initial production release:
* Extract the general logic of the dialog in order to allow easier porting * Extract the general logic of the dialog in order to allow easier porting
to Gnome/KDE, and put the general logic in frontends and the inherited to Gnome/KDE, and put the general logic in frontends and the inherited
platform dependent code in the appropriate dirs. platform dependent code in the appropriate dirs.
(Something of this kind is getting done by the GUII guys)
TODO Extended features: TODO Extended features:
@ -129,8 +128,6 @@ TODO Extended features:
#pragma implementation #pragma implementation
#endif #endif
#define INSETGRAPHICS_INLINE_VIEW
#include "insets/insetgraphics.h" #include "insets/insetgraphics.h"
#include "insets/insetgraphicsParams.h" #include "insets/insetgraphicsParams.h"
#include "graphics/GraphicsCache.h" #include "graphics/GraphicsCache.h"
@ -170,7 +167,7 @@ string const RemoveExtension(string const & filename)
// Initialize only those variables that do not have a constructor. // Initialize only those variables that do not have a constructor.
InsetGraphics::InsetGraphics() InsetGraphics::InsetGraphics()
: cacheHandle(0), pixmap(0), updateImage(false) : cacheHandle(0), imageLoaded(false)
{} {}
InsetGraphics::~InsetGraphics() InsetGraphics::~InsetGraphics()
@ -184,7 +181,6 @@ InsetGraphics::statusMessage() const
{ {
char const * msg = 0; char const * msg = 0;
#ifdef INSETGRAPHICS_INLINE_VIEW
if (cacheHandle) { if (cacheHandle) {
switch (cacheHandle->getImageStatus()) { switch (cacheHandle->getImageStatus()) {
case GraphicsCacheItem::UnknownError: case GraphicsCacheItem::UnknownError:
@ -208,16 +204,14 @@ InsetGraphics::statusMessage() const
break; break;
} }
} }
#else
msg = _("Inline view disabled");
#endif
return msg; return msg;
} }
int InsetGraphics::ascent(BufferView *, LyXFont const &) const int InsetGraphics::ascent(BufferView *, LyXFont const &) const
{ {
if (pixmap) LyXImage * pixmap = 0;
if (cacheHandle && (pixmap = cacheHandle->getImage()))
return pixmap->getHeight(); return pixmap->getHeight();
else else
return 50; return 50;
@ -233,7 +227,9 @@ int InsetGraphics::descent(BufferView *, LyXFont const &) const
int InsetGraphics::width(BufferView *, LyXFont const & font) const int InsetGraphics::width(BufferView *, LyXFont const & font) const
{ {
if (pixmap) LyXImage * pixmap = 0;
if (cacheHandle && (pixmap = cacheHandle->getImage()))
return pixmap->getWidth(); return pixmap->getWidth();
else { else {
char const * msg = statusMessage(); char const * msg = statusMessage();
@ -261,17 +257,12 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
// This will draw the graphics. If the graphics has not been loaded yet, // This will draw the graphics. If the graphics has not been loaded yet,
// we draw just a rectangle. // we draw just a rectangle.
if (pixmap) { if (imageLoaded) {
paint.image(int(old_x) + 2, baseline - lascent, paint.image(int(old_x) + 2, baseline - lascent,
lwidth - 4, lascent + ldescent, lwidth - 4, lascent + ldescent,
pixmap); cacheHandle->getImage());
} else { } else {
#ifdef INSETGRAPHICS_INLINE_VIEW
if (!updateImage) {
updateImage = true;
updateInset();
}
// Get the image status, default to unknown error. // Get the image status, default to unknown error.
GraphicsCacheItem::ImageStatus status = GraphicsCacheItem::UnknownError; GraphicsCacheItem::ImageStatus status = GraphicsCacheItem::UnknownError;
@ -280,14 +271,12 @@ void InsetGraphics::draw(BufferView * bv, LyXFont const & font,
// Check if the image is now ready. // Check if the image is now ready.
if (status == GraphicsCacheItem::Loaded) { if (status == GraphicsCacheItem::Loaded) {
// It is, get it and inform the world. imageLoaded = true;
pixmap = cacheHandle->getImage();
// Tell BufferView we need to be updated! // Tell BufferView we need to be updated!
bv->text->status = LyXText::CHANGED_IN_DRAW; bv->text->status = LyXText::CHANGED_IN_DRAW;
return; return;
} }
#endif
char const * msg = statusMessage(); char const * msg = statusMessage();
@ -452,6 +441,11 @@ InsetGraphics::prepareFile(Buffer const *buf) const
if (!buf->niceFile) { if (!buf->niceFile) {
string const temp = AddName(buf->tmppath, params.filename); string const temp = AddName(buf->tmppath, params.filename);
outfile = RemoveExtension(temp); outfile = RemoveExtension(temp);
//lyxerr << "buf::tmppath = " << buf->tmppath << "\n";
//lyxerr << "filename = " << params.filename << "\n";
//lyxerr << "temp = " << temp << "\n";
//lyxerr << "outfile = " << outfile << endl;
} else { } else {
string const path = OnlyPath(buf->fileName()); string const path = OnlyPath(buf->fileName());
string const relname = MakeRelPath(params.filename, path); string const relname = MakeRelPath(params.filename, path);
@ -581,21 +575,18 @@ void InsetGraphics::Validate(LaTeXFeatures & features) const
// dialog. // dialog.
void InsetGraphics::updateInset() const void InsetGraphics::updateInset() const
{ {
#ifdef INSETGRAPHICS_INLINE_VIEW GraphicsCache * gc = GraphicsCache::getInstance();
if (updateImage) { GraphicsCacheItem * temp = 0;
GraphicsCache * gc = GraphicsCache::getInstance();
GraphicsCacheItem * temp = 0;
if (!params.filename.empty()) { if (!params.filename.empty()) {
temp = gc->addFile(params.filename); temp = gc->addFile(params.filename);
}
delete cacheHandle;
cacheHandle = temp;
} }
#else
cacheHandle = 0; // Mark the image as unloaded so that it gets updated.
#endif imageLoaded = false;
delete cacheHandle;
cacheHandle = temp;
} }
bool InsetGraphics::setParams(InsetGraphicsParams const & params) bool InsetGraphics::setParams(InsetGraphicsParams const & params)
@ -627,8 +618,7 @@ Inset * InsetGraphics::Clone(Buffer const &) const
newInset->cacheHandle = cacheHandle->Clone(); newInset->cacheHandle = cacheHandle->Clone();
else else
newInset->cacheHandle = 0; newInset->cacheHandle = 0;
newInset->pixmap = pixmap; newInset->imageLoaded = imageLoaded;
newInset->updateImage = updateImage;
newInset->setParams(getParams()); newInset->setParams(getParams());

View File

@ -115,10 +115,8 @@ private:
/// The graphics cache handle. /// The graphics cache handle.
mutable GraphicsCacheItem * cacheHandle; mutable GraphicsCacheItem * cacheHandle;
/// The pixmap
mutable LyXImage * pixmap;
/// is the pixmap initialized? /// is the pixmap initialized?
mutable bool updateImage; mutable bool imageLoaded;
InsetGraphicsParams params; InsetGraphicsParams params;
}; };