mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-11 05:33:33 +00:00
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:
parent
8d7fe83bf5
commit
9a70b28af5
@ -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.
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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_);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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:
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user