[Qt] Implement the mimetype icon methods
authorallan.jensen@digia.com <allan.jensen@digia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Nov 2012 11:15:38 +0000 (11:15 +0000)
committerallan.jensen@digia.com <allan.jensen@digia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 27 Nov 2012 11:15:38 +0000 (11:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=103260

Reviewed by Simon Hausmann.

* platform/graphics/Icon.h:
(Icon):
* platform/graphics/qt/IconQt.cpp:
(WebCore::Icon::createIconForFiles):
(WebCore::Icon::paint):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@135842 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/Icon.h
Source/WebCore/platform/graphics/qt/IconQt.cpp

index 0ccaa05..cbe986b 100644 (file)
@@ -1,3 +1,16 @@
+2012-11-26  Allan Sandfeld Jensen  <allan.jensen@digia.com>
+
+        [Qt] Implement the mimetype icon methods
+        https://bugs.webkit.org/show_bug.cgi?id=103260
+
+        Reviewed by Simon Hausmann.
+
+        * platform/graphics/Icon.h:
+        (Icon):
+        * platform/graphics/qt/IconQt.cpp:
+        (WebCore::Icon::createIconForFiles):
+        (WebCore::Icon::paint):
+
 2012-09-17  Allan Sandfeld Jensen  <allan.jensen@nokia.com>
 
         Incorrect rect-based hit-test result when hit-test region includes culled inlines
index b703c71..781a08c 100644 (file)
@@ -32,7 +32,7 @@ OBJC_CLASS NSImage;
 #elif PLATFORM(WIN)
 typedef struct HICON__* HICON;
 #elif PLATFORM(QT)
-#include <QImage>
+#include <QIcon>
 #elif PLATFORM(GTK)
 typedef struct _GdkPixbuf GdkPixbuf;
 #elif PLATFORM(EFL)
@@ -70,7 +70,7 @@ private:
     HICON m_hIcon;
 #elif PLATFORM(QT)
     Icon();
-    QImage m_image;
+    QIcon m_icon;
 #elif PLATFORM(GTK)
     Icon();
     GdkPixbuf* m_icon;
index adc3bdb..b6cc612 100644 (file)
@@ -24,6 +24,7 @@
 #include "GraphicsContext.h"
 #include "IntRect.h"
 #include "NotImplemented.h"
+#include <QMimeDatabase>
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -37,16 +38,49 @@ Icon::~Icon()
 }
 
 // FIXME: Move the code to ChromeClient::iconForFiles().
-PassRefPtr<Icon> Icon::createIconForFiles(const Vector<String>&)
+PassRefPtr<Icon> Icon::createIconForFiles(const Vector<String>& filenames)
 {
-    // FIXME: Should use QMimeType in Qt 5.
-    notImplemented();
-    return 0;
+    if (filenames.isEmpty())
+        return 0;
+
+    QMimeType mimeType = QMimeDatabase().mimeTypeForFile(filenames[0], QMimeDatabase::MatchExtension);
+
+    QString iconName = mimeType.iconName();
+    QString genericIconName = mimeType.genericIconName();
+
+    // We try to match one of three cases:
+    // 1. All the files have the same type.
+    // 2. All the files are of the same generic type.
+    // 3. The files are not even of the same generic type.
+    const int count = filenames.size();
+    for (int i = 1; i < count; ++i) {
+        mimeType = QMimeDatabase().mimeTypeForFile(filenames[i], QMimeDatabase::MatchExtension);
+        if (iconName != mimeType.iconName())
+            iconName.clear();
+        if (genericIconName != mimeType.genericIconName()) {
+            genericIconName.clear();
+            break;
+        }
+    }
+
+    // FIXME: By default, only X11 will support themed icons.
+    RefPtr<Icon> icon = adoptRef(new Icon);
+    if (!iconName.isEmpty())
+        icon->m_icon = QIcon::fromTheme(iconName, QIcon::fromTheme(genericIconName));
+    else if (!genericIconName.isEmpty())
+        icon->m_icon = QIcon::fromTheme(genericIconName);
+
+    if (icon->m_icon.isNull())
+        return 0;
+    return icon.release();
 }
 
-void Icon::paint(GraphicsContext*, const IntRect&)
+void Icon::paint(GraphicsContext* context, const IntRect& rect)
 {
-    notImplemented();
+    if (m_icon.isNull())
+        return;
+
+    m_icon.paint(context->platformContext(), rect);
 }
 
 }