[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-active
Subject:    Re: previews generation
From:       Sebastian =?ISO-8859-1?Q?K=FCgler?= <sebas () kde ! org>
Date:       2011-11-29 21:35:24
Message-ID: 4717622.XfnQbZhAEq () marvin ! vizzzion ! net
[Download RAW message or body]

[not sure why kmail doesn't include the text I reply to, ow well...]

For webpages, everything we need is now in kdelibs. We also need a patch to 
kde-runtime, which I didn't finish in time for the freeze. It's attached (I've 
already added it to the balsam packages).

Otherwise, great work!

-- sebas
["kde-runtime-webthumbnails.diff" (kde-runtime-webthumbnails.diff)]

diff --git a/kioslave/thumbnail/CMakeLists.txt b/kioslave/thumbnail/CMakeLists.txt
index b20c41b..8b079d3 100644
--- a/kioslave/thumbnail/CMakeLists.txt
+++ b/kioslave/thumbnail/CMakeLists.txt
@@ -154,6 +154,20 @@ if (UNIX)
 endif (UNIX)
 install(TARGETS comicbookthumbnail DESTINATION ${PLUGIN_INSTALL_DIR})
 
+########### next target ###############
+
+set(webthumbnail_SRCS webcreator.cpp)
+kde4_add_plugin(webthumbnail ${webthumbnail_SRCS})
+target_link_libraries(webthumbnail
+    ${KDE4_KIO_LIBS}
+    ${QT_QTWEBKIT_LIBRARY}
+    ${KDE4_KDEWEBKIT_LIBRARY}
+)
+#if (UNIX)
+#   target_link_libraries(webthumbnail ${KDE4_KPTY_LIBRARY})
+#endif (UNIX)
+install(TARGETS webthumbnail DESTINATION ${PLUGIN_INSTALL_DIR})
+
 ########### install files ###############
 
 install(FILES thumbcreator.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR})
@@ -167,4 +181,5 @@ install(FILES
     djvuthumbnail.desktop
     desktopthumbnail.desktop
     comicbookthumbnail.desktop
+    webthumbnail.desktop
     DESTINATION ${SERVICES_INSTALL_DIR})
diff --git a/kioslave/thumbnail/thumbcreator.desktop \
b/kioslave/thumbnail/thumbcreator.desktop index 5fc7672..a8d7622 100644
--- a/kioslave/thumbnail/thumbcreator.desktop
+++ b/kioslave/thumbnail/thumbcreator.desktop
@@ -95,3 +95,6 @@ Type=bool
 
 [PropertyDef::IgnoreMaximumSize]
 Type=bool
+
+[PropertyDef::X-KDE-Protocol]
+Type=QStringList
\ No newline at end of file
diff --git a/kioslave/thumbnail/webcreator.cpp b/kioslave/thumbnail/webcreator.cpp
new file mode 100644
index 0000000..cc76817
--- /dev/null
+++ b/kioslave/thumbnail/webcreator.cpp
@@ -0,0 +1,202 @@
+/*
+    Copyright 2011 Sebastian Kügler <sebas@kde.org>
+    Copyright 2010 Richard Moore <rich@kde.org>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+#include "webcreator.h"
+
+#include <time.h>
+
+#include <KDebug>
+#include <KUrl>
+#include <KWebPage>
+
+#include <QPixmap>
+#include <QImage>
+#include <QPainter>
+#include <QTimer>
+#include <QUrl>
+#include <QWebPage>
+#include <QWebFrame>
+/*
+class WebCreatorPrivate
+{
+public:
+    WebCreatorPrivate() :
+        page(0)
+    {
+        kDebug() << " === PRIVATE";
+    }
+
+    QWebPage *page;
+    QImage thumbnail;
+    QSize size;
+    QUrl url;
+    QEventLoop eventLoop;
+
+};
+*/
+extern "C"
+{
+    KDE_EXPORT ThumbCreator *new_creator()
+    {
+        return new WebCreator;
+    }
+}
+
+WebCreator::WebCreator()
+    : m_page(0)
+{
+}
+
+WebCreator::~WebCreator()
+{
+    delete m_page;
+}
+
+bool WebCreator::create(const QString &path, int width, int height, QImage &img)
+{
+    kDebug() << "WEBCREATOR URL: " << path << width << "x" << height;
+    if (!m_page) {
+        //m_url = QUrl("http://lwn.net");
+        m_url = QUrl(path);
+        kDebug() << " === NEW PAGE";
+        m_page = new KWebPage(this);
+        kDebug() << " === SIZE";
+        m_page->setViewportSize(QSize(width, height));
+        m_page->mainFrame()->setScrollBarPolicy( Qt::Horizontal, \
Qt::ScrollBarAlwaysOff ); +        m_page->mainFrame()->setScrollBarPolicy( \
Qt::Vertical, Qt::ScrollBarAlwaysOff ); +        qreal zoomFactor = (qreal)width / \
800.0; // assume pages render well enough at 600px width +        kDebug() << \
"ZoOOOMFACTOR: " << zoomFactor; +        \
m_page->mainFrame()->setZoomFactor(zoomFactor); +        kDebug() << " === LOAD:  " \
<< m_url; +        m_page->mainFrame()->load( m_url );
+        connect(m_page, SIGNAL(loadFinished(bool)), this, SLOT(completed(bool)));
+
+        /*
+        m_html = new KHTMLPart;
+        connect(m_html, SIGNAL(completed()), SLOT(slotCompleted()));
+        m_html->setJScriptEnabled(false);
+        m_html->setJavaEnabled(false);
+        m_html->setPluginsEnabled(false);
+        m_html->setMetaRefreshEnabled(false);
+        m_html->setOnlyLocalReferences(true);
+        */
+    }
+
+    // 30 sec timeout
+    int t = startTimer(30000);
+    m_failed = false;
+
+    // The event loop will either be terminated by the page loadFinished(),
+    // or by the timeout
+    m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
+
+    killTimer(t);
+
+    if (m_failed) {
+        return false;
+    }
+
+    // Render QImage from WebPage
+    QPixmap pix(width, height);
+    pix.fill( Qt::transparent );
+
+    kDebug() <<  " ++++++++++++++ NOW PAINTING ++++++++++++" << \
m_page->mainFrame()->contentsSize() << pix.size(); +    // render and rescale
+    QPainter p;
+    p.begin(&pix);
+
+    m_page->setViewportSize(m_page->mainFrame()->contentsSize());
+    m_page->mainFrame()->render(&p);
+
+    //p.setPen(Qt::blue);
+    //p.setFont(QFont("Arial", 30));
+    //p.drawText(QRect(0, 0, width, height), Qt::AlignCenter, "Poep.");
+    p.end();
+
+    kDebug() <<  " ++++++++++++++ DONE PAINTING ++++++++++++";
+
+    delete m_page;
+    m_page = 0;
+    //delete d;
+    //d = 0;
+
+    //img = img.scaled(d->size, Qt::KeepAspectRatioByExpanding,
+    //                          Qt::SmoothTransformation);
+    kDebug() <<  " ++++++++++++++ toImage ++++++++++++";
+
+    pix.save("/tmp/webcreatorpreviewpix.png");
+    img = pix.toImage();
+    kDebug() << "SAVING ........";
+    img.save("/tmp/webcreatorpreview.png");
+
+    /*
+    // render the HTML page on a bigger pixmap and use smoothScale,
+    // looks better than directly scaling with the QPainter (malte)
+    QPixmap pix;
+    if (width > 400 || height > 600)
+    {
+        if (height * 3 > width * 4)
+            pix = QPixmap(width, width * 4 / 3);
+        else
+            pix = QPixmap(height * 3 / 4, height);
+    }
+    else
+        pix = QPixmap(400, 600);
+
+    // light-grey background, in case loadind the page failed
+    pix.fill( QColor( 245, 245, 245 ) );
+
+    int borderX = pix.width() / width,
+        borderY = pix.height() / height;
+    QRect rc(borderX, borderY, pix.width() - borderX * 2, pix.height() - borderY * \
2); +
+    QPainter p;
+    p.begin(&pix);
+    m_html->paint(&p, rc);
+    p.end();
+
+    img = pix.toImage();
+    m_html->closeUrl();
+    */
+
+    return true;
+}
+
+void WebCreator::timerEvent(QTimerEvent *)
+{
+    kDebug() << " WEBCREATOR:timerEvent";
+    m_failed = true;
+    m_eventLoop.quit();
+}
+
+void WebCreator::completed(bool sucess)
+{
+    kDebug() << " WEBCREATOR:completed" << sucess;
+    m_failed = !sucess;
+    m_eventLoop.quit();
+}
+
+ThumbCreator::Flags WebCreator::flags() const
+{
+    return DrawFrame;
+}
+
+#include "webcreator.moc"
+
diff --git a/kioslave/thumbnail/webcreator.h b/kioslave/thumbnail/webcreator.h
new file mode 100644
index 0000000..b4c71ef
--- /dev/null
+++ b/kioslave/thumbnail/webcreator.h
@@ -0,0 +1,56 @@
+/*
+    Copyright 2011 Sebastian Kügler <sebas@kde.org>
+    Copyright 2010 Richard Moore <rich@kde.org>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+*/
+
+#ifndef WEBCREATOR_H
+#define WEBCREATOR_H
+
+#include <QEventLoop>
+#include <QObject>
+#include <kio/thumbcreator.h>
+#include <QTimerEvent>
+#include <QUrl>
+
+class KWebPage;
+class WebCreatorPrivate;
+
+class WebCreator : public QObject, public ThumbCreator
+{
+    Q_OBJECT
+public:
+    WebCreator();
+    virtual ~WebCreator();
+    virtual bool create(const QString &path, int width, int height, QImage &img);
+    virtual Flags flags() const;
+
+protected:
+    virtual void timerEvent(QTimerEvent *);
+
+private Q_SLOTS:
+    void completed(bool);
+
+private:
+    KWebPage *m_page;
+    QUrl m_url;
+    QEventLoop m_eventLoop;
+    bool m_failed;
+
+};
+
+#endif
diff --git a/kioslave/thumbnail/webthumbnail.desktop \
b/kioslave/thumbnail/webthumbnail.desktop new file mode 100644
index 0000000..c187fa4
--- /dev/null
+++ b/kioslave/thumbnail/webthumbnail.desktop
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Type=Service
+Name=Web pages
+X-KDE-ServiceTypes=ThumbCreator
+MimeType=text/html;
+X-KDE-Protocol=http,https
+X-KDE-Library=webthumbnail
+CacheThumbnail=true



_______________________________________________
Active mailing list
Active@kde.org
https://mail.kde.org/mailman/listinfo/active


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic