Howdy, A colleague asked me if there was anything that MS word could do well, that LyX couldn't, and all I could think of was drag-n-dropping image files into the document. That got me to thinking what it would take to implement it in LyX. Here's one solution, albeit somewhat naive perhaps, as I've not been hacking LyX for quite some time, so there may be unaccounted side-effects.
The strategy was to build on the current drag-n-drop support, which allows you to open a lyx file by dropping it in the main window. Now QWorkArea::dropEvent() checks each entry in the QStringList::Iterator, and if it represents an image file, dispatch sends an LFUN_INSET_INSERT graphics request. If it isn't a graphics file, then dispatch requests an LFUN_FILE_OPEN. Then in factory.C, createInset() handles the LFUN_INSET_INSERT "graphics" by adding the filename obtained from the dropEvent to the InsetGraphicsParams structure before InsetGraphics::setParams() is called. I've patched 1.3.5-qt (3.3.3) for drag-n-drop of graphics files, and it works great. Also have a patch for 1.4.0 cvs, but it's buggy, and I'm not sure whether it's my doing or just a result of the current state of cvs. In 1.3.5, the image is placed at the cursor, already showing, and clipped. But in 1.4.0, the image is always inserted at the top of the document, and there are bizarre redraws with multiple images (e.g. some are missing until you resize the window a certain way). Is anyone working on dnd image support? The 1.4.0 current cvs patch follows. Let me know if you want the patch for 1.3.5. JB -- Johnathan K. Burchill, Ph.D. [EMAIL PROTECTED] Patch for 1.4.0 current cvs: Index: src/frontends/qt2/QWorkArea.h =================================================================== RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QWorkArea.h,v retrieving revision 1.15 diff -u -3 -p -u -r1.15 QWorkArea.h --- src/frontends/qt2/QWorkArea.h 2004/04/28 17:22:04 1.15 +++ src/frontends/qt2/QWorkArea.h 2005/01/28 04:29:20 @@ -64,6 +64,8 @@ public: /// get the content pane widget QWidget * getContent() const { return content_; } private: + /// Test whether str is a loadable image + bool decodeGraphics( QString const & str ); /// scroll bar QScrollBar * scrollbar_; /// content Index: src/frontends/qt2/QWorkArea.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/frontends/qt2/QWorkArea.C,v retrieving revision 1.28 diff -u -3 -p -u -r1.28 QWorkArea.C --- src/frontends/qt2/QWorkArea.C 2004/05/20 09:36:28 1.28 +++ src/frontends/qt2/QWorkArea.C 2005/01/28 04:29:20 @@ -225,7 +225,24 @@ void QWorkArea::dropEvent(QDropEvent* ev lyxerr[Debug::GUI] << "QWorkArea::dropEvent: got URIs!" << endl; for (QStringList::Iterator i = files.begin(); - i!=files.end(); ++i) - dispatch(FuncRequest(LFUN_FILE_OPEN, fromqstr(*i))); + i!=files.end(); ++i) { + //First see if a graphic was dropped + if ( decodeGraphics(*i) ) { + dispatch(FuncRequest(LFUN_INSET_INSERT, + "graphics \"" + fromqstr(*i) + "\"")); + } else { + dispatch(FuncRequest(LFUN_FILE_OPEN, fromqstr(*i))); + } + } } } + +bool QWorkArea::decodeGraphics( QString const & str ) +{ + //Allow ps, eps, and allowable QT formats + QString name(str); + return (name.endsWith(".ps", false) || + name.endsWith(".eps", false) || + (QImageIO::imageFormat(name) != 0)); +} + Index: src/factory.C =================================================================== RCS file: /cvs/lyx/lyx-devel/src/factory.C,v retrieving revision 1.95 diff -u -3 -p -u -r1.95 factory.C --- src/factory.C 2004/08/14 15:55:17 1.95 +++ src/factory.C 2005/01/28 04:29:20 @@ -252,6 +252,12 @@ InsetBase * createInset(BufferView * bv, InsetGraphicsMailer::string2params(cmd.argument, buffer, igp); auto_ptr<InsetGraphics> inset(new InsetGraphics); + string const & filename = cmd.getArg( 1 ); + if (!filename.empty()) { + igp.filename = filename; + //automatically clip the image + igp.clip = true; + } inset->setParams(igp); return inset.release();
pgp8tErWqNiaY.pgp
Description: PGP signature