]> Shamusworld >> Repos - architektonas/blobdiff - src/forms/librarywidget.cpp
Phase two of adding polyline functionality...
[architektonas] / src / forms / librarywidget.cpp
index ebb8acb0319e19d11b904f0ba68558da7baa426e..19a194dd1feff2c60931e27edad4fcf00e5b8485 100644 (file)
 // ---  ----------  -----------------------------------------------------------
 // JLH  05/10/2010  Created this file. :-)
 // JLH  08/28/2010  Restored functionality to library browser
+// JLH  09/06/2010  Partially fixed thumbnail rendering
+// JLH  09/07/2010  Fully fixed thumbnail rendering
 //
 
+/*
+Note that this is basically just a way to get a block from a file; it's unclear
+that it does so and the doco (such as it was) didn't mention it either. So what
+we need is to make it very clear that inserting is to the BLOCK list and not
+the document--perhaps we need to fold it into the block list, and make the
+insert function insert into the block list only...
+Also, it would be useful to have some information like base unit, dimensions, etc.
+*/
+
 #include "librarywidget.h"
 
 #include "actionhandler.h"
 #include "actionlibraryinsert.h"
 #include "drawing.h"
-#include "rs_staticgraphicview.h"
-#include "rs_system.h"
+#include "staticgraphicview.h"
+#include "system.h"
 #include "paintinterface.h"
 
 LibraryWidget::LibraryWidget(QWidget * parent/*= 0*/, Qt::WindowFlags flags/*= 0*/):
@@ -33,7 +44,7 @@ std::cout << "LibraryWidget::LibraryWidget()" << std::endl;
        ui.setupUi(this);
        ui.lvDirectory->setColumnCount(1);
 
-       QStringList directoryList = RS_SYSTEM->getDirectoryList("library");
+       QStringList directoryList = SYSTEM->getDirectoryList("library");
 #if 0
 std::cout << "directorySize = " << directoryList.size() << std::endl;
 
@@ -94,14 +105,14 @@ void LibraryWidget::insert()
                        }
                        else
                        {
-                               RS_DEBUG->print(RS_Debug::D_ERROR, "LibraryWidget::insert:"
+                               DEBUG->print(Debug::D_ERROR, "LibraryWidget::insert:"
                                        "Cannot create action ActionLibraryInsert");
                        }
                }
        }
        else
        {
-               RS_DEBUG->print(RS_Debug::D_ERROR,
+               DEBUG->print(Debug::D_ERROR,
                        "LibraryWidget::insert: Can't read file: '%s'", dxfPath.toLatin1().data());
        }
 }
@@ -150,6 +161,11 @@ void LibraryWidget::appendTree(QTreeWidgetItem * item, QString directory)
                                newItem = (item ? new QTreeWidgetItem(item, list) : new QTreeWidgetItem(ui.lvDirectory, list));
                        }
 
+//This is picking up the directory tree TWICE, but ONLY if there are no thumbnails!
+//Actually, only if there is no corresponding thumbnail DIRECTORY under .architektonas...
+//Dunno why...
+//It was picking up .architektonas from the home directory in rs_system.cpp, that's why!
+//printf("LibraryWidget::appendTree: *it=\"%s\"\n", (*it).toAscii().data());
                        appendTree(newItem, directory + "/" + (*it));
                }
        }
@@ -170,7 +186,7 @@ void LibraryWidget::updatePreview(QTreeWidgetItem * item, int /*column*/)
        ui.ivPreview->clear();
 
        // List of all directories that contain part libraries:
-       QStringList directoryList = RS_SYSTEM->getDirectoryList("library");
+       QStringList directoryList = SYSTEM->getDirectoryList("library");
        QStringList::Iterator it;
        QDir itemDir;
        QStringList itemPathList;
@@ -207,6 +223,7 @@ void LibraryWidget::updatePreview(QTreeWidgetItem * item, int /*column*/)
                newItem = new QListWidgetItem(QIcon(pixmap), label, ui.ivPreview);
 //Doesn't do what we want...
 //             newItem->setSizeHint(QSize(64, 64));
+//printf("LibraryWidget: label = \"%s\"\n", label.toAscii().data());
        }
 
        QApplication::restoreOverrideCursor();
@@ -236,7 +253,7 @@ QString LibraryWidget::getItemPath(QListWidgetItem * item)
        if (item)
        {
                // List of all directories that contain part libraries:
-               QStringList directoryList = RS_SYSTEM->getDirectoryList("library");
+               QStringList directoryList = SYSTEM->getDirectoryList("library");
                QStringList::Iterator it;
                QDir itemDir;
 
@@ -265,7 +282,7 @@ QString LibraryWidget::getItemPath(QListWidgetItem * item)
  * @param dir Library directory (e.g. "/mechanical/screws")
  * @param dxfFile File name (e.g. "screw1.dxf")
  * @param dxfPath Full path to the existing DXF file on disk
- *                          (e.g. /home/tux/.qcad/library/mechanical/screws/screw1.dxf)
+ *                (e.g. /home/tux/.architektonas/library/mechanical/screws/screw1.dxf)
  */
 QPixmap LibraryWidget::getPixmap(const QString & dir, const QString & dxfFile,
        const QString & dxfPath)
@@ -288,12 +305,12 @@ QPixmap LibraryWidget::getPixmap(const QString & dir, const QString & dxfFile,
 QString LibraryWidget::getPathToPixmap(const QString & dir, const QString & dxfFile,
        const QString & dxfPath)
 {
-       RS_DEBUG->print("LibraryWidget::getPathToPixmap: dir: '%s' dxfFile: '%s' dxfPath: '%s'",
+       DEBUG->print("LibraryWidget::getPathToPixmap: dir: '%s' dxfFile: '%s' dxfPath: '%s'",
                dir.toLatin1().data(), dxfFile.toLatin1().data(), dxfPath.toLatin1().data());
 
        // List of all directories that contain part libraries:
-       QStringList directoryList = RS_SYSTEM->getDirectoryList("library");
-       directoryList.prepend(RS_SYSTEM->getHomeDir() + "/.qcad/library");
+       QStringList directoryList = SYSTEM->getDirectoryList("library");
+       directoryList.prepend(SYSTEM->getHomeDir() + "/.architektonas/library");
        QStringList::Iterator it;
 
        QFileInfo fiDxf(dxfPath);
@@ -305,117 +322,82 @@ QString LibraryWidget::getPathToPixmap(const QString & dir, const QString & dxfF
        for(it=directoryList.begin(); it!=directoryList.end(); ++it)
        {
                itemDir = (*it) + dir;
-//             pngPath = itemDir + "/" + fiDxf.baseName(true) + ".png";
                pngPath = itemDir + "/" + fiDxf.completeBaseName() + ".png";
-               RS_DEBUG->print("LibraryWidget::getPathToPixmap: checking: '%s'",
+               DEBUG->print("LibraryWidget::getPathToPixmap: checking: '%s'",
                        pngPath.toLatin1().data());
                QFileInfo fiPng(pngPath);
 
                // the thumbnail exists:
                if (fiPng.isFile())
                {
-                       RS_DEBUG->print("LibraryWidget::getPathToPixmap: dxf date: %s, png date: %s",
+                       DEBUG->print("LibraryWidget::getPathToPixmap: dxf date: %s, png date: %s",
                                fiDxf.lastModified().toString().toLatin1().data(), fiPng.lastModified().toString().toLatin1().data());
 
                        if (fiPng.lastModified() > fiDxf.lastModified())
                        {
-                               RS_DEBUG->print("LibraryWidget::getPathToPixmap: thumbnail found: '%s'",
+                               DEBUG->print("LibraryWidget::getPathToPixmap: thumbnail found: '%s'",
                                        pngPath.toLatin1().data());
                                return pngPath;
                        }
                        else
                        {
-                               RS_DEBUG->print("LibraryWidget::getPathToPixmap: thumbnail needs to be updated: '%s'",
+                               DEBUG->print("LibraryWidget::getPathToPixmap: thumbnail needs to be updated: '%s'",
                                        pngPath.toLatin1().data());
                        }
                }
        }
 
-       // the thumbnail must be created in the user's home.
-
-       // create all directories needed:
-       RS_SYSTEM->createHomePath("/.qcad/library" + dir);
-       /*QString d = "/.qcad/library" + dir;
-       QDir dr;
-
-       QStringList dirs = QStringList::split('/', d, false);
-       QString created = RS_SYSTEM->getHomeDir();
-       for (it=dirs.begin(); it!=dirs.end(); ++it) {
-               created += QString("/%1").arg(*it);
-
-               if (created.isEmpty() || QFileInfo(created).isDir() || dr.mkdir(created, true)) {
-       RS_DEBUG->print("LibraryWidget: Created directory '%s'",
-       created.toLatin1().data());
-               }
-               else {
-       RS_DEBUG->print(RS_Debug::D_ERROR,
-       "LibraryWidget: Cannot create directory '%s'",
-       created.toLatin1().data());
-                       return "";
-               }
-}
-       */
-
-       QString d = RS_SYSTEM->getHomeDir() + "/.qcad/library" + dir;
-
-//     pngPath = d + "/" + fiDxf.baseName(true) + ".png";
+       // The thumbnail must be created in the user's home.
+       // So, create all directories needed:
+       SYSTEM->createHomePath("/.architektonas/library" + dir);
+       QString d = SYSTEM->getHomeDir() + "/.architektonas/library" + dir;
        pngPath = d + "/" + fiDxf.completeBaseName() + ".png";
 
-       QPixmap * buffer = new QPixmap(128, 128);
-//     RS_PainterQt * painter = new RS_PainterQt(buffer);
-       QPainter qpntr(buffer);
+       QPixmap buffer(128, 128);
+       QPainter qpntr(&buffer);
        PaintInterface * painter = new PaintInterface(&qpntr);
-//     painter->setBackgroundColor(RS_Color(255, 255, 255));
-//     painter->eraseRect(0, 0, 128, 128);
-//     qpntr.setBackgroundColor(RS_Color(255, 255, 255));
        qpntr.setBackground(Qt::white);
        qpntr.eraseRect(0, 0, 128, 128);
 
-       RS_StaticGraphicView gv(128, 128, painter);
-       Drawing graphic;
+       StaticGraphicView view(128, 128, painter);
+       Drawing drawing;
 
-       if (graphic.open(dxfPath, RS2::FormatUnknown))
+       if (drawing.open(dxfPath, RS2::FormatUnknown))
        {
-               RS_Color black(0, 0, 0);
+               Color black(0, 0, 0);
 
-               for(RS_Entity * e=graphic.firstEntity(RS2::ResolveAll); e!=NULL; e=graphic.nextEntity(RS2::ResolveAll))
+               // Set all pens in the drawing to BLACK
+               for(Entity * e=drawing.firstEntity(RS2::ResolveAll); e!=NULL; e=drawing.nextEntity(RS2::ResolveAll))
                {
-                       RS_Pen pen = e->getPen();
+                       Pen pen = e->getPen();
                        pen.setColor(black);
                        e->setPen(pen);
                }
 
-               gv.setContainer(&graphic);
-               gv.zoomAuto(false);
-               gv.drawEntity(&graphic, true);
+               view.setContainer(&drawing);
+               view.zoomAuto(false);
+               view.drawEntity(&drawing, true);
 
-#if 0
-               QImageIO iio;
-               QImage img;
-               img = *buffer;
-               img = img.smoothScale(64, 64);
-               iio.setImage(img);
-               iio.setFileName(pngPath);
-               iio.setFormat("PNG");
-
-               if (!iio.write())
+               QImageWriter writer;
+               QImage image = buffer.toImage();
+               image.scaled(64, 64, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
+               writer.setFileName(pngPath);
+               writer.setFormat("png");
+
+               if (!writer.write(image))
                {
-                       pngPath = "";
-                       RS_DEBUG->print(RS_Debug::D_ERROR,
+                       DEBUG->print(Debug::D_ERROR,
                                "LibraryWidget::getPathToPixmap: Cannot write thumbnail: '%s'",
                                pngPath.toLatin1().data());
+                       pngPath = "";
                }
-#else
-#warning "LibraryWidget::getPathToPixmap(): Needs porting to Qt4... !!! FIX !!!"
-#endif
        }
        else
        {
-               RS_DEBUG->print(RS_Debug::D_ERROR, "LibraryWidget::getPathToPixmap: Cannot open file: '%s'", dxfPath.toLatin1().data());
+               DEBUG->print(Debug::D_ERROR, "LibraryWidget::getPathToPixmap: Cannot open file: '%s'", dxfPath.toLatin1().data());
        }
 
        delete painter;
-       delete buffer;
 
        return pngPath;
 }