OSDN Git Service

Cleanup of some of the thumbnail logic to be less resource intensive.
authorRandy Baumgarte <randy@fbn.cx>
Fri, 5 Nov 2010 14:17:19 +0000 (10:17 -0400)
committerRandy Baumgarte <randy@fbn.cx>
Wed, 15 Dec 2010 15:15:15 +0000 (10:15 -0500)
src/cx/fbn/nevernote/NeverNote.java
src/cx/fbn/nevernote/gui/Thumbnailer.java
src/cx/fbn/nevernote/sql/NoteTable.java
src/cx/fbn/nevernote/sql/NotebookTable.java
src/cx/fbn/nevernote/xml/NoteFormatter.java

index 0ad39eb..6c49b34 100644 (file)
@@ -412,7 +412,7 @@ public class NeverNote extends QMainWindow{
                thumbnailTimer = new QTimer();
                thumbnailTimer.timeout.connect(this, "thumbnailTimer()");
                thumbnailTimer();
-               thumbnailTimer.setInterval(5*1000);  // Thumbnail every 2 min
+               thumbnailTimer.setInterval(60*1000);  // Thumbnail every minute
                thumbnailTimer.start();
                
                logger.log(logger.EXTREME, "Starting authentication timer");
@@ -3486,6 +3486,7 @@ public class NeverNote extends QMainWindow{
                browserWindow.getBrowser().setContent(unicode);
        } 
        if (save) {
+               thumbnailRunner.addWork("GENERATE "+ guid);
                saveNote(guid, browser);
        }
        
@@ -3493,6 +3494,7 @@ public class NeverNote extends QMainWindow{
     private void saveNote() {
        if (noteDirty) {
                saveNote(currentNoteGuid, browserWindow);
+               thumbnailRunner.addWork("GENERATE "+ currentNoteGuid);
                noteDirty = false;
        }
     }
@@ -3551,6 +3553,7 @@ public class NeverNote extends QMainWindow{
                
                loadNoteBrowserInformation(browserWindow);
        }
+
        private void loadNoteBrowserInformation(BrowserWindow browser) {
                NoteFormatter formatter = new NoteFormatter(logger, conn, tempFiles);
                formatter.setNote(currentNote, Global.pdfPreview());
@@ -4181,7 +4184,6 @@ public class NeverNote extends QMainWindow{
                }
        }
        private void thumbnailHTMLReady(String guid, QByteArray html, Integer zoom) {
-               
                logger.log(logger.HIGH, "Entering thumnailHTMLReady()");
                logger.log(logger.HIGH, "Thumbnail ready for " +guid);
                // Find an idle preview object
@@ -4636,8 +4638,12 @@ public class NeverNote extends QMainWindow{
        }
 
        private void thumbnailTimer() {
-               if (Global.enableThumbnails())
+               if (Global.enableThumbnails() && conn.getNoteTable().getThumbnailNeededCount() > 1) {
+                       thumbnailTimer.setInterval(10*1000);
                        thumbnailRunner.addWork("SCAN");
+               } else {
+                       thumbnailTimer.setInterval(60*1000);
+               }
        }
        
        //**************************************************
index c9be297..4381275 100644 (file)
@@ -6,14 +6,16 @@ import com.trolltech.qt.core.QIODevice;
 import com.trolltech.qt.core.QMutex;\r
 import com.trolltech.qt.core.QObject;\r
 import com.trolltech.qt.core.QSize;\r
+import com.trolltech.qt.core.Qt.AspectRatioMode;\r
 import com.trolltech.qt.core.Qt.Orientation;\r
 import com.trolltech.qt.core.Qt.ScrollBarPolicy;\r
-import com.trolltech.qt.gui.QColor;\r
+import com.trolltech.qt.core.Qt.TransformationMode;\r
 import com.trolltech.qt.gui.QImage;\r
 import com.trolltech.qt.gui.QImage.Format;\r
 import com.trolltech.qt.gui.QPainter;\r
 import com.trolltech.qt.webkit.QWebPage;\r
 \r
+import cx.fbn.nevernote.Global;\r
 import cx.fbn.nevernote.sql.DatabaseConnection;\r
 import cx.fbn.nevernote.threads.ThumbnailRunner;\r
 import cx.fbn.nevernote.utilities.ApplicationLogger;\r
@@ -44,6 +46,9 @@ public class Thumbnailer extends QObject {
        listManager = l;\r
        this.conn = conn;\r
         size = new QSize(1024,768);\r
+//        size = new QSize();\r
+//        size.setWidth(Global.largeThumbnailSize.width());\r
+//        size.setHeight(Global.largeThumbnailSize.height());\r
         image = new QImage(size, Format.Format_ARGB32_Premultiplied);\r
        page.setViewportSize(size);\r
        page.loadFinished.connect(this, "loadFinished(Boolean)");\r
@@ -56,28 +61,19 @@ public class Thumbnailer extends QObject {
        this.guid = guid;\r
        page.mainFrame().setScrollBarPolicy(Orientation.Horizontal, ScrollBarPolicy.ScrollBarAlwaysOff);\r
        page.mainFrame().setScrollBarPolicy(Orientation.Vertical, ScrollBarPolicy.ScrollBarAlwaysOff);\r
-               page.mainFrame().setContent(html);\r
+       page.mainFrame().setContent(html);\r
     }\r
-       \r
-       \r
-       public String loadFinished(Boolean ok) {\r
+\r
+    \r
+       private String loadFinished(Boolean ok) {\r
                if (!ok) { \r
                        mutex.unlock();\r
                        return null;\r
                }\r
+//             page.setViewportSize(page.mainFrame().contentsSize());\r
+//             image = new QImage(size, Format.Format_ARGB32);\r
                logger.log(logger.EXTREME, "Creating painter");\r
                painter = new QPainter();\r
-               logger.log(logger.EXTREME, "Creating image");\r
-               if (image == null) {\r
-                       image = new QImage(size, Format.Format_ARGB32_Premultiplied);\r
-                       if (image.isNull()) {\r
-                               logger.log(logger.EXTREME, "Image is null.  Aborting");\r
-                               mutex.unlock();\r
-                               return null;\r
-                       }\r
-               }\r
-               logger.log(logger.EXTREME, "Filling image");\r
-               image.fill(QColor.white.rgb());\r
                logger.log(logger.EXTREME, "Beginning painter");\r
         painter.begin(image);\r
         page.mainFrame().setZoomFactor(new Double(zoom));\r
@@ -88,18 +84,14 @@ public class Thumbnailer extends QObject {
                        return null;\r
        }\r
                logger.log(logger.EXTREME, "Rendering image");\r
-        page.mainFrame().render(painter); \r
+        page.mainFrame().render(painter);\r
                logger.log(logger.EXTREME, "Closing painter");\r
         painter.end();\r
-        \r
         if (image.isNull()) {\r
                logger.log(logger.EXTREME, "Error rendering thumbnail image.  Aborting");\r
                mutex.unlock();\r
                return null;\r
         }\r
-               logger.log(logger.EXTREME, "Adding to listManager");\r
-//        listManager.getThumbnails().remove(guid);\r
-//             listManager.getThumbnails().put(guid, image.clone());\r
                logger.log(logger.EXTREME, "Saving image isNull=" +image.isNull() +" Size=" +image.size());\r
                logger.log(logger.EXTREME, "Adding image to runner");\r
                saveImage();\r
@@ -122,7 +114,9 @@ public class Thumbnailer extends QObject {
         }\r
                \r
                logger.log(logger.EXTREME, "Filling buffer");\r
-        if (!image.save(buffer, "PNG")) {\r
+               QImage img = image.scaled(Global.largeThumbnailSize,\r
+                               AspectRatioMode.KeepAspectRatio, TransformationMode.SmoothTransformation);\r
+        if (!img.save(buffer, "PNG")) {\r
                logger.log(logger.EXTREME, "Failure to write to buffer.  Aborting.");     \r
                mutex.unlock();\r
                return;\r
index c136300..00b1a8f 100644 (file)
@@ -1168,6 +1168,25 @@ public class NoteTable {
 \r
                return values;  \r
        }\r
+       // Get a count of thumbnails needed\r
+       public int getThumbnailNeededCount() {\r
+               \r
+               boolean check;\r
+        NSqlQuery query = new NSqlQuery(db.getConnection());\r
+                                       \r
+               check = query.prepare("select count(guid) from note where thumbnailneeded=true and isExpunged=false and DATEDIFF('MINUTE',updated,CURRENT_TIMESTAMP)>5 limit 2");\r
+               check = query.exec();\r
+               if (!check) \r
+                       logger.log(logger.EXTREME, "Note SQL findThumbnailNeededCount query failed: " +query.lastError().toString());\r
+               \r
+               if (query.next()) {\r
+                       return query.valueInteger(0); \r
+               }\r
+\r
+               return 0;       \r
+       }\r
+\r
+       \r
        \r
        // Update a note content's hash.  This happens if a resource is edited outside of NN\r
        public void updateResourceContentHash(String guid, String oldHash, String newHash) {\r
index 15742b5..fafd2eb 100644 (file)
@@ -47,9 +47,16 @@ public class NotebookTable {
                NSqlQuery query = new NSqlQuery(db.getConnection());\r
         logger.log(logger.HIGH, "Creating table Notebook...");\r
         if (!query.exec("Create table Notebook (guid varchar primary key, " +\r
-                       "sequence integer, name varchar, defaultNotebook varchar, "+\r
-                       "serviceCreated timestamp, serviceUpdated timestamp, published boolean, isDirty boolean, "+\r
-                       "autoEncrypt boolean, local boolean, archived boolean)"))                               \r
+                       "sequence integer, " +\r
+                       "name varchar, "+\r
+                       "defaultNotebook varchar, "+\r
+                       "serviceCreated timestamp, " +\r
+                       "serviceUpdated timestamp, "+\r
+                       "published boolean, "+\r
+                       "isDirty boolean, "+\r
+                       "autoEncrypt boolean, "+\r
+                       "local boolean, "+\r
+                       "archived boolean)"))                           \r
                logger.log(logger.HIGH, "Table Notebook creation FAILED!!!");   \r
         Notebook newnote = new Notebook();\r
         newnote.setDefaultNotebook(true);\r
index 0ddf904..0ec67ef 100644 (file)
@@ -144,7 +144,10 @@ public class NoteFormatter {
                        enmedia.setTagName("img");\r
                }\r
        }\r
-               enmedia.setAttribute("src", QUrl.fromLocalFile(tfile.fileName()).toString());\r
+       // Technically, we should do a file:// to have a proper url, but for some reason QWebPage hates\r
+       // them and won't generate a thumbnail image properly if we use them.\r
+//             enmedia.setAttribute("src", QUrl.fromLocalFile(tfile.fileName()).toString());\r
+               enmedia.setAttribute("src", tfile.fileName().toString());\r
                enmedia.setAttribute("en-tag", "en-media");\r
                enmedia.setAttribute("onContextMenu", "window.jambi.imageContextMenu('" +tfile.fileName()  +"');");\r
                enmedia.setNodeValue("");\r