rev 8017 - in branches/kde4/packages/extragear-plasma/debian: . img patches

Armin Berres trigger-guest at alioth.debian.org
Wed Nov 21 19:11:20 UTC 2007


Author: trigger-guest
Date: 2007-11-21 19:11:20 +0000 (Wed, 21 Nov 2007)
New Revision: 8017

Added:
   branches/kde4/packages/extragear-plasma/debian/img/
   branches/kde4/packages/extragear-plasma/debian/img/dilbert.png.uu
   branches/kde4/packages/extragear-plasma/debian/img/garfield.png.uu
   branches/kde4/packages/extragear-plasma/debian/img/snoopy.png.uu
   branches/kde4/packages/extragear-plasma/debian/img/userfriendly.png.uu
   branches/kde4/packages/extragear-plasma/debian/img/xkcd.png.uu
   branches/kde4/packages/extragear-plasma/debian/patches/
   branches/kde4/packages/extragear-plasma/debian/patches/01_r739662.diff
   branches/kde4/packages/extragear-plasma/debian/patches/series
Modified:
   branches/kde4/packages/extragear-plasma/debian/changelog
   branches/kde4/packages/extragear-plasma/debian/control
   branches/kde4/packages/extragear-plasma/debian/copyright
   branches/kde4/packages/extragear-plasma/debian/extragear-plasma-data.install
   branches/kde4/packages/extragear-plasma/debian/extragear-plasma.install
   branches/kde4/packages/extragear-plasma/debian/rules
Log:
* Update to r739712.
* Build depend on kdebase-workspace 4:3.96.0-2
* Build depend on sharutils for uudecoding the new images.


Modified: branches/kde4/packages/extragear-plasma/debian/changelog
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/changelog	2007-11-21 19:04:50 UTC (rev 8016)
+++ branches/kde4/packages/extragear-plasma/debian/changelog	2007-11-21 19:11:20 UTC (rev 8017)
@@ -1,6 +1,14 @@
+extragear-plasma (4:3.96.0-2) experimental; urgency=low
+
+  * Update to r739712.
+  * Build depend on kdebase-workspace 4:3.96.0-2
+  * Build depend on sharutils for uudecoding the new images.
+
+ -- Armin Berres <trigger+debian at space-based.de>  Wed, 21 Nov 2007 17:09:17 +0000
+
 extragear-plasma (4:3.96.0-1) experimental; urgency=low
 
-  * New upstream release. 
+  * New upstream release.
   * Update *.install files.
   * Move Homepage into control field.
   * Build depend on kdebase-workspace-dev >= 4:3.96.0.

Modified: branches/kde4/packages/extragear-plasma/debian/control
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/control	2007-11-21 19:04:50 UTC (rev 8016)
+++ branches/kde4/packages/extragear-plasma/debian/control	2007-11-21 19:11:20 UTC (rev 8017)
@@ -3,7 +3,7 @@
 Priority: optional
 Maintainer: Debian Qt/KDE Maintainers <debian-qt-kde at lists.debian.org>
 Uploaders: Ana Beatriz Guerrero Lopez <ana at debian.org>, Sune Vuorela <debian at pusling.com>, Fathi Boudra <fboudra at free.fr>, Armin Berres <trigger+debian at space-based.de>
-Build-Depends: cdbs, debhelper (>= 5), cmake, quilt, kdebase-workspace-dev (>= 4:3.96.0)
+Build-Depends: cdbs, debhelper (>= 5), cmake, quilt, kdebase-workspace-dev (>= 4:3.96.0-2), sharutils
 Standards-Version: 3.7.2
 Homepage: http://plasma.kde.org/
 

Modified: branches/kde4/packages/extragear-plasma/debian/copyright
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/copyright	2007-11-21 19:04:50 UTC (rev 8016)
+++ branches/kde4/packages/extragear-plasma/debian/copyright	2007-11-21 19:11:20 UTC (rev 8017)
@@ -15,6 +15,10 @@
     Copyright (C) 2007 André Duffeck <andre at duffeck.de>
     License: GPLv2
 
+Dataengine and applet comic:
+    Copyright (C) 2007 by Tobias Koenig <tokoe at kde.org>
+    License: GPLv2
+
 Applet bluemarble:
     Copyright (C) 2007 Rivo Laks <rivolaks at hot.ee>
     License: GPLv2

Modified: branches/kde4/packages/extragear-plasma/debian/extragear-plasma-data.install
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/extragear-plasma-data.install	2007-11-21 19:04:50 UTC (rev 8016)
+++ branches/kde4/packages/extragear-plasma/debian/extragear-plasma-data.install	2007-11-21 19:11:20 UTC (rev 8017)
@@ -1,3 +1,5 @@
+usr/share/kde4/apps/desktoptheme/default/lancelot/main-panel.svg
+usr/share/kde4/services/plasma-comic-default.desktop
 usr/share/dbus-1/services/org.kde.lancelot.service
 usr/share/icons/hicolor/16x16/apps/lancelot.png
 usr/share/icons/hicolor/22x22/apps/lancelot.png

Modified: branches/kde4/packages/extragear-plasma/debian/extragear-plasma.install
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/extragear-plasma.install	2007-11-21 19:04:50 UTC (rev 8016)
+++ branches/kde4/packages/extragear-plasma/debian/extragear-plasma.install	2007-11-21 19:11:20 UTC (rev 8017)
@@ -1,4 +1,4 @@
-
+usr/lib/kde4/plasma_applet_comic.so
 usr/bin/lancelot
 usr/lib/kde4/plasma_applet_bluemarble.so
 usr/lib/kde4/plasma_applet_dict.so

Added: branches/kde4/packages/extragear-plasma/debian/img/dilbert.png.uu
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/img/dilbert.png.uu	                        (rev 0)
+++ branches/kde4/packages/extragear-plasma/debian/img/dilbert.png.uu	2007-11-21 19:11:20 UTC (rev 8017)
@@ -0,0 +1,20 @@
+begin 644 dilbert.png
+MB5!.1PT*&@H````-24A$4@```!`````0"`8````?\_]A`````7-21T(`KLX<
+MZ0````9B2T=$`/\`_P#_H+VGDP````EP2%ES```/80``#V$!J#^G:0````=T
+M24U%!]<+#1$.*8>`$UX````9=$58=$-O;6UE;G0`0W)E871E9"!W:71H($=)
+M35!7 at 0X7```"34E$050XRZ7336C<91#'\<^S_]VL1JQB6ZH%HVYI2FN+E15!
+MJE94)!</K:C at 2="JMQZ\>/#4F[UX%?'BU05OTI)(JB at 2)/$%LR:I)LU+*]+6
+M+K%UF^WN_L?#KFERZL&Y##/S/#]FGN<[*2+"_[#BINC:969&F3LC%B?%Q7D1
+MV+:+!ZO2\&%I_XATY_;U*VF]@^DOF/B4Z5.T6W3:(H@@U_=!VC\B>_J8K'IT
+M0P<_UA@]R94E=F<,%ZFTN9?H$N?Q.ZE._LMI^?DZU_^6/?FZHI4IOON$?R[R
+MS`"'"FR!#GG;U5$B9_`YHHIQ8GQ%^]1):<=N17-?<F61Q\J,)%(+H5%;L_0V
+MW49OUATGV':<>!%-8F)&=^IS!<O?DV4\7"8-H.S/#UH67FDI5Y*ACVZ^<002
+M#O;B?&9<T5_G>MFA$G*MA=R%]U:5*YGAL:+"72UI"^4#&WZKTA?XXU<%6Q]"
+ML-Q&5Z.V"@:KF4L?=YQ[E:77F']J@\!"SQ5V[E,T]#@7IJEWJ"3;W[I=<^HV
+MC=J:1JUW\.Z7V'K\OSGP4U]@[[.*]CS/W#B3LY1RV:&.RF=W($-3W at UYAVZ;
+MO$'ZBI@@[=PKJQ[M@[3.P3(/M!GN]#BX;TV>R*^3?T/4R<^2[KE?Z<B)/@?P
+MZ,N4!GLDUD\SV^UA%P/2D1L\0>H0OY$=&)$=ODEBVK1,URXS,\;9KUGY at 4OS
+M-%?%P:[N+O)O'U%Z=VS3+HA;V>R9R-\I1>=-T3I6BGSYYTWE6PM$1"Q.1O[A
+B"]%^0]QX?U]$<W6]]"_8\ES[4V/<S`````!)14Y$KD)@@@``
+`
+end

Added: branches/kde4/packages/extragear-plasma/debian/img/garfield.png.uu
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/img/garfield.png.uu	                        (rev 0)
+++ branches/kde4/packages/extragear-plasma/debian/img/garfield.png.uu	2007-11-21 19:11:20 UTC (rev 8017)
@@ -0,0 +1,12 @@
+begin 644 garfield.png
+MB5!.1PT*&@H````-24A$4@```!`````0"`8````?\_]A`````7-21T(`KLX<
+MZ0````9B2T=$`/\`_P#_H+VGDP````EP2%ES```/80``#V$!J#^G:0````=T
+M24U%!]<+#1$0&748'"T```$4241!5#C+G9-=D80P$(3[U@!Q`!(B826LA$B(
+MA)42"3C`PCI(3D$'!7T/@?`7KNINJG@@S/3T?!. at 7X*D.'HEYT2RF8.[XA2"
+M!-0G.=?,>Z`1.6?TSAW..F/0C,WJ*(YCL>[]H3NM%4G%&(L30#$41R`I6KM9
+M3:D(+>^?UZO,/TT'T347'/VA4V60DE)*&]!=$P&B+[E88:V=2(I^(>^]2!:A
+M77$<!L48KULXDQ<@/5%%Z6T5O:PQ!G<MWLVZ'^TBT.Q\$B at N-@[KQB!)<1AN
+MB^G+"L\0]7XO$$^`[N:_""]C/+JN:UZP;"TP33#&8,[Y\.T[!)CU9E8&SYWE
+L$^EM"_[R4WU)TGK_YWE&W_?X2U2!_\8/=8]9Y`:U,O``````245.1*Y"8((`
+`
+end

Added: branches/kde4/packages/extragear-plasma/debian/img/snoopy.png.uu
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/img/snoopy.png.uu	                        (rev 0)
+++ branches/kde4/packages/extragear-plasma/debian/img/snoopy.png.uu	2007-11-21 19:11:20 UTC (rev 8017)
@@ -0,0 +1,20 @@
+begin 644 snoopy.png
+MB5!.1PT*&@H````-24A$4@```!`````0"`8````?\_]A`````7-21T(`KLX<
+MZ0````9B2T=$`/\`_P#_H+VGDP````EP2%ES```/80``#V$!J#^G:0````=T
+M24U%!]<+#1$.*8>`$UX````9=$58=$-O;6UE;G0`0W)E871E9"!W:71H($=)
+M35!7 at 0X7```"34E$050XRZ7336C<91#'\<^S_]VL1JQB6ZH%HVYI2FN+E15!
+MJE94)!</K:C at 2="JMQZ\>/#4F[UX%?'BU05OTI)(JB at 2)/$%LR:I)LU+*]+6
+M+K%UF^WN_L?#KFERZL&Y##/S/#]FGN<[*2+"_[#BINC:969&F3LC%B?%Q7D1
+MV+:+!ZO2\&%I_XATY_;U*VF]@^DOF/B4Z5.T6W3:(H@@U_=!VC\B>_J8K'IT
+M0P<_UA@]R94E=F<,%ZFTN9?H$N?Q.ZE._LMI^?DZU_^6/?FZHI4IOON$?R[R
+MS`"'"FR!#GG;U5$B9_`YHHIQ8GQ%^]1):<=N17-?<F61Q\J,)%(+H5%;L_0V
+MW49OUATGV':<>!%-8F)&=^IS!<O?DV4\7"8-H.S/#UH67FDI5Y*ACVZ^<002
+M#O;B?&9<T5_G>MFA$G*MA=R%]U:5*YGAL:+"72UI"^4#&WZKTA?XXU<%6Q]"
+ML-Q&5Z.V"@:KF4L?=YQ[E:77F']J@\!"SQ5V[E,T]#@7IJEWJ"3;W[I=<^HV
+MC=J:1JUW\.Z7V'K\OSGP4U]@[[.*]CS/W#B3LY1RV:&.RF=W($-3W at UYAVZ;
+MO$'ZBI@@[=PKJQ[M@[3.P3(/M!GN]#BX;TV>R*^3?T/4R<^2[KE?Z<B)/@?P
+MZ,N4!GLDUD\SV^UA%P/2D1L\0>H0OY$=&)$=ODEBVK1,URXS,\;9KUGY at 4OS
+M-%?%P:[N+O)O'U%Z=VS3+HA;V>R9R-\I1>=-T3I6BGSYYTWE6PM$1"Q.1O[A
+B"]%^0]QX?U]$<W6]]"_8\ES[4V/<S`````!)14Y$KD)@@@``
+`
+end

Added: branches/kde4/packages/extragear-plasma/debian/img/userfriendly.png.uu
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/img/userfriendly.png.uu	                        (rev 0)
+++ branches/kde4/packages/extragear-plasma/debian/img/userfriendly.png.uu	2007-11-21 19:11:20 UTC (rev 8017)
@@ -0,0 +1,23 @@
+begin 644 userfriendly.png
+MB5!.1PT*&@H````-24A$4@```!`````0"`8````?\_]A````"7!(67,```]A
+M```/80&H/Z=I````"71%6'18+4EN9&5X`#"TPYQB```#$4E$050XC6V3ST\C
+M=0#%/]]V9CH62J?VQS1&(8!UC27$DP>A&SF86/'$S1B-!XP)!^*1K#<.G+AX
+MW3]A->[!Q)-9 at BX_UM2$\*O&+>RTF&5VVDYW*?W!S'3&`XG!'^_\WDM>\GG"
+M]_V`&Q)"X+HNS6:#\W,3QW&(1E\BF4R23*90%.6F'>G?X5ZOAV$\86=G!\=Q
+ML2R+7J_+V- at 8DB0Q.3E!/C]%.IU!"($DA,!Q'$SS',,PJ-?K5*M5=G=W\;P!
+MH5`((02&4261T#!-DQ<O+B at 4;J-I&I+G>7B>A^NZE,ME]O?W,4V3=KM-J]7"
+M=0<HBDPT&N7RLHWK>@0!7%Q<4"P6D5S7I67;/-I]1*GT&X>'!S2;380($0J%
+M2"02*(I"O6[1[7:HU6I4*A46%A8PS6=(!P?7@:/C(ZZN>H3#$JE4FD*AP-+2
+M$LED$MNV:;5L[MSYFFZWR_CX.!L;#XC%A at G)L at 0$V+9-K7:&83Q!UW565E98
+M75UE?7V=M;4U4JDTL[,S!('/Z>D)J50:7<\BU>L-7-<CG\\3#H?I]_O(LDPD
+M$F%Y>9F]O3URN1R)1`+;;@&02J7(9#*HJHHT/3U-J]6BT:CC^SZJJE(U#+Y8
+M7"27R_&X<D*E\IC[][^G5JOA^P&ZKI/-ZFA:'"F;S1(.AU&4"+'8"*JJ8ED6
+MAT='')>/Z70Z.(Z#XS@,#46)1J/$XQJZGF5\?.(:)$W3F)M[C]'1U]#U#*52
+MB4KEA&:S@>=YR+*,[P_P?9^AH6$F)R>9F7F76"R&N(FR$`++LMC>WN*[>_=X
+M>G:&D&3"LH33[?#QIY^1R[V!IFGD\WD41?DGRD$0D,ED*,S.<FD_P_KSE'CF
+M589C<9Y7]RB^/\?HQ*V_O?_[!3\`[ZI#6NWPRNMQMO;+M/L^7WURF[MWO\&Z
+M""A^.,]'\_,((?X[86MS at X<__8`>%\B*RM-&F]\K5=Y\:XH/WAG%]>#;'W_A
+MTHOP^>*7UP6#P8!^OT>OWV=K\P&_;O^,(DL,JR&<0`9))3,BV'Q8(OWR"&]/
+=W<(/1?C#,/D+<`UKA%,(,8\`````245.1*Y"8((`
+`
+end

Added: branches/kde4/packages/extragear-plasma/debian/img/xkcd.png.uu
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/img/xkcd.png.uu	                        (rev 0)
+++ branches/kde4/packages/extragear-plasma/debian/img/xkcd.png.uu	2007-11-21 19:11:20 UTC (rev 8017)
@@ -0,0 +1,16 @@
+begin 644 xkcd.png
+MB5!.1PT*&@H````-24A$4@```!`````0"`8````?\_]A`````7-21T(`KLX<
+MZ0````9B2T=$`/\`_P#_H+VGDP````EP2%ES```/80``#V$!J#^G:0````=T
+M24U%!]<+#1$/+W?XARH```'#241!5#C+G9,QKN(P$(8_\RB at XR`<(`42IL*Y
+M at PO:U!0D%4Y%<HHG1>(&2($&A2H at 4=!'.0=TL\5[R>*W*ZVT(UGRC#7CW___
+M6VFM16O-_T155>"<$Q&1+,MD-!H)(*/12+(LDW^%<TX&`-?KE3B."8(`YQQ!
+M$!#',=?K%8`HBE!*H90BBB(/Q8?6VK5MB]::S\]/M-:L5BN44K1MR^UV(\NR
+MON%^OS,>CYG-9EPN%P;=P7P^]R9W^>OU`B#+,D0$YUQ?`[X&+)=+TC3](N6;
+MG#1-62Z7??-FLP%@N]UZ%PT`@B#`&$,8ABBE",,08PQ!$'@H`-(T]:7H5.B4
+M`#P%K+4">,M:ZZL`D.<YQ^,1 at ./Q2)[G`&BM>??)SQSGG-1U+9/)1.JZ%L#+
+MN_VWX?IZAV`(D"0)<1Q[3XOCF"1)>#P>E&7)Z70"8+?;$88A95D",.Q@;38;
+MQN,QSCD6BP7/YY/7Z\5NMV,ZG;)8+`!8K]>49?F;V'<K:ZU%1,08XQ%9%(48
+M8\08(T51_&GE3GMC3$]4YPF`\_F,M19K+8?#X>\R`MY'><\!:9I&FJ;QZLXY
+G&595U=_VTR3=NP'V^[U7[U#^`LC><!$+S-/Z`````$E%3D2N0F""
+`
+end

Added: branches/kde4/packages/extragear-plasma/debian/patches/01_r739662.diff
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/patches/01_r739662.diff	                        (rev 0)
+++ branches/kde4/packages/extragear-plasma/debian/patches/01_r739662.diff	2007-11-21 19:11:20 UTC (rev 8017)
@@ -0,0 +1,3704 @@
+Index: dataengines/twitter/plasma-engine-twitter.desktop
+===================================================================
+--- dataengines/twitter/plasma-engine-twitter.desktop	(revision 736572)
++++ dataengines/twitter/plasma-engine-twitter.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=Twitter Data Engine
+ Name[bg]=Ядро за Twitter
+ Name[es]=Motor de datos Twitter
+@@ -8,7 +7,7 @@
+ Name[pt]=Motor de Dados do Twitter
+ Name[pt_BR]=Motor de Dados do Twitter
+ Name[sv]=Datagränssnitt för Twitter
+-ServiceTypes=Plasma/DataEngine
++X-KDE-ServiceTypes=Plasma/DataEngine
+ Type=Service
+ Icon=im
+ X-KDE-Library=plasma_engine_twitter
+Index: dataengines/ebn/plasma-engine-ebn.desktop
+===================================================================
+--- dataengines/ebn/plasma-engine-ebn.desktop	(revision 736572)
++++ dataengines/ebn/plasma-engine-ebn.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=EBN Data Engine
+ Name[bg]=EBN ядро
+ Name[es]=Motor de datos EBN
+@@ -17,7 +16,7 @@
+ Comment[pt]=Motor de dados dos testes automáticos de qualidade do KDE
+ Comment[pt_BR]=Motor de dados dos testes automáticos de qualidade do KDE
+ Comment[sv]=KDE:s datagränssnitt för automatiserad kvalitetstest
+-ServiceTypes=Plasma/DataEngine
++X-KDE-ServiceTypes=Plasma/DataEngine
+ Type=Service
+ Icon=kteatime
+ X-KDE-Library=plasma_engine_ebn
+Index: dataengines/comic/plasma-engine-comic.desktop
+===================================================================
+--- dataengines/comic/plasma-engine-comic.desktop	(revision 0)
++++ dataengines/comic/plasma-engine-comic.desktop	(revision 739687)
+@@ -0,0 +1,17 @@
++[Desktop Entry]
++Encoding=UTF-8
++Name=Comic Data Engine
++Name[et]=Koomiksi andmete mootor
++Name[pt]=Motor de Dados de Banda Desenhada
++Name[pt_BR]=Motor de Dados de Banda Desenhada
++Name[sv]=Datagränssnitt för serier
++Comment=Data Engine for comic strips
++Comment[et]=Koomiksi andmemootor
++Comment[pt]=Motor de Dados para bandas desenhadas
++Comment[pt_BR]=Motor de Dados para bandas desenhadas
++Comment[sv]=Datagränssnitt för tecknade serier
++ServiceTypes=Plasma/DataEngine
++Type=Service
++Icon=face-smile-big
++X-KDE-Library=plasma_engine_comic
++X-EngineName=comic
+Index: dataengines/comic/comic.h
+===================================================================
+--- dataengines/comic/comic.h	(revision 0)
++++ dataengines/comic/comic.h	(revision 739687)
+@@ -0,0 +1,59 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef COMIC_DATAENGINE_H
++#define COMIC_DATAENGINE_H
++
++#include "plasma/dataengine.h"
++
++class ComicProvider;
++
++/**
++ * This class provides the comic strip.
++ *
++ * The query keys have the following structure:
++ *   <comic_identifier>:<date>
++ * e.g.
++ *   userfriendly:2007-07-19
++ *
++ */
++class ComicEngine : public Plasma::DataEngine
++{
++    Q_OBJECT
++
++    public:
++        ComicEngine( QObject* parent, const QVariantList& args );
++        ~ComicEngine();
++
++    protected:
++        void init();
++        bool sourceRequested( const QString &identifier );
++
++    protected Q_SLOTS:
++        bool updateSource( const QString &identifier );
++
++    private Q_SLOTS:
++        void finished( ComicProvider* );
++        void error( ComicProvider* );
++
++    private:
++};
++
++K_EXPORT_PLASMA_DATAENGINE(comic, ComicEngine)
++
++#endif
+Index: dataengines/comic/dilbertprovider.cpp
+===================================================================
+--- dataengines/comic/dilbertprovider.cpp	(revision 0)
++++ dataengines/comic/dilbertprovider.cpp	(revision 739687)
+@@ -0,0 +1,121 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include <QtCore/QDate>
++#include <QtCore/QRegExp>
++#include <QtCore/QUrl>
++#include <QtGui/QImage>
++#include <QtNetwork/QHttp>
++#include <QtNetwork/QHttpRequestHeader>
++
++#include "dilbertprovider.h"
++
++class DilbertProvider::Private
++{
++  public:
++    Private( DilbertProvider *parent, const QDate &date )
++      : mParent( parent ), mDate( date )
++    {
++      mHttp = new QHttp( "dilbert.com", 80, mParent );
++      connect( mHttp, SIGNAL( done( bool ) ), mParent, SLOT( pageRequestFinished( bool ) ) );
++    }
++
++    void pageRequestFinished( bool );
++    void imageRequestFinished( bool );
++    void parsePage();
++
++    DilbertProvider *mParent;
++    QByteArray mPage;
++    QDate mDate;
++    QImage mImage;
++
++    QHttp *mHttp;
++    QHttp *mImageHttp;
++};
++
++void DilbertProvider::Private::pageRequestFinished( bool err )
++{
++  if ( err ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  const QString pattern( "<IMG SRC=\"/comics/dilbert/archive/images/dilbert" );
++  const QRegExp exp( pattern );
++
++  const QString data = QString::fromUtf8( mHttp->readAll() );
++
++  int pos = exp.indexIn( data ) + pattern.length();
++
++  const QString sub = data.mid( pos, data.indexOf( '"', pos ) - pos );
++
++  QUrl url( QString( "http://dilbert.com/comics/dilbert/archive/images/dilbert%1" ).arg( sub ) );
++
++  mImageHttp = new QHttp( "dilbert.com", 80, mParent );
++  mImageHttp->setHost( url.host() );
++  mImageHttp->get( url.path() );
++
++  mParent->connect( mImageHttp, SIGNAL( done( bool ) ), mParent, SLOT( imageRequestFinished( bool ) ) );
++}
++
++void DilbertProvider::Private::imageRequestFinished( bool error )
++{
++  if ( error ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  QByteArray data = mImageHttp->readAll();
++  mImage = QImage::fromData( data );
++  emit mParent->finished( mParent );
++}
++
++DilbertProvider::DilbertProvider( const QDate &date, QObject *parent )
++    : ComicProvider( parent ), d( new Private( this, date ) )
++{
++    QUrl url( QString( "http://dilbert.com/comics/dilbert/archive/dilbert-%1.html" ).arg( date.toString( "yyyyMMdd" ) ) );
++
++    QHttpRequestHeader header( "GET", url.path() );
++    header.setValue( "User-Agent", "Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.6 (like Gecko)" );
++    header.setValue( "Accept", "text/html, image/jpeg, image/png, text/*, image/*, */*" );
++    header.setValue( "Accept-Encoding", "deflate" );
++    header.setValue( "Accept-Charset", "iso-8859-15, utf-8;q=0.5, *;q=0.5" );
++    header.setValue( "Accept-Language", "en" );
++    header.setValue( "Host", "dilbert.com" );
++    header.setValue( "Connection", "Keep-Alive" );
++
++    d->mHttp->setHost( url.host() );
++    d->mHttp->request( header );
++}
++
++DilbertProvider::~DilbertProvider()
++{
++    delete d;
++}
++
++QImage DilbertProvider::image() const
++{
++    return d->mImage;
++}
++
++QString DilbertProvider::identifier() const
++{
++    return QString( "dilbert:%1" ).arg( d->mDate.toString( Qt::ISODate ) );
++}
++
++#include "dilbertprovider.moc"
+Index: dataengines/comic/snoopyprovider.cpp
+===================================================================
+--- dataengines/comic/snoopyprovider.cpp	(revision 0)
++++ dataengines/comic/snoopyprovider.cpp	(revision 739687)
+@@ -0,0 +1,121 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include <QtCore/QDate>
++#include <QtCore/QRegExp>
++#include <QtCore/QUrl>
++#include <QtGui/QImage>
++#include <QtNetwork/QHttp>
++#include <QtNetwork/QHttpRequestHeader>
++
++#include "snoopyprovider.h"
++
++class SnoopyProvider::Private
++{
++  public:
++    Private( SnoopyProvider *parent, const QDate &date )
++      : mParent( parent ), mDate( date )
++    {
++      mHttp = new QHttp( "snoopy.com", 80, mParent );
++      connect( mHttp, SIGNAL( done( bool ) ), mParent, SLOT( pageRequestFinished( bool ) ) );
++    }
++
++    void pageRequestFinished( bool );
++    void imageRequestFinished( bool );
++    void parsePage();
++
++    SnoopyProvider *mParent;
++    QByteArray mPage;
++    QDate mDate;
++    QImage mImage;
++
++    QHttp *mHttp;
++    QHttp *mImageHttp;
++};
++
++void SnoopyProvider::Private::pageRequestFinished( bool err )
++{
++  if ( err ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  const QString pattern( "<IMG SRC=\"/comics/peanuts/archive/images/peanuts" );
++  const QRegExp exp( pattern );
++
++  const QString data = QString::fromUtf8( mHttp->readAll() );
++
++  int pos = exp.indexIn( data ) + pattern.length();
++
++  const QString sub = data.mid( pos, data.indexOf( '.', pos ) - pos );
++
++  QUrl url( QString( "http://snoopy.com/comics/peanuts/archive/images/peanuts%1.gif" ).arg( sub ) );
++
++  mImageHttp = new QHttp( "snoopy.com", 80, mParent );
++  mImageHttp->setHost( url.host() );
++  mImageHttp->get( url.path() );
++
++  mParent->connect( mImageHttp, SIGNAL( done( bool ) ), mParent, SLOT( imageRequestFinished( bool ) ) );
++}
++
++void SnoopyProvider::Private::imageRequestFinished( bool error )
++{
++  if ( error ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  QByteArray data = mImageHttp->readAll();
++  mImage = QImage::fromData( data );
++  emit mParent->finished( mParent );
++}
++
++SnoopyProvider::SnoopyProvider( const QDate &date, QObject *parent )
++    : ComicProvider( parent ), d( new Private( this, date ) )
++{
++    QUrl url( QString( "http://snoopy.com/comics/peanuts/archive/peanuts-%1.html" ).arg( date.toString( "yyyyMMdd" ) ) );
++
++    QHttpRequestHeader header( "GET", url.path() );
++    header.setValue( "User-Agent", "Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.6 (like Gecko)" );
++    header.setValue( "Accept", "text/html, image/jpeg, image/png, text/*, image/*, */*" );
++    header.setValue( "Accept-Encoding", "deflate" );
++    header.setValue( "Accept-Charset", "iso-8859-15, utf-8;q=0.5, *;q=0.5" );
++    header.setValue( "Accept-Language", "en" );
++    header.setValue( "Host", "snoopy.com" );
++    header.setValue( "Connection", "Keep-Alive" );
++
++    d->mHttp->setHost( url.host() );
++    d->mHttp->request( header );
++}
++
++SnoopyProvider::~SnoopyProvider()
++{
++    delete d;
++}
++
++QImage SnoopyProvider::image() const
++{
++    return d->mImage;
++}
++
++QString SnoopyProvider::identifier() const
++{
++    return QString( "snoopy:%1" ).arg( d->mDate.toString( Qt::ISODate ) );
++}
++
++#include "snoopyprovider.moc"
+Index: dataengines/comic/xkcdprovider.cpp
+===================================================================
+--- dataengines/comic/xkcdprovider.cpp	(revision 0)
++++ dataengines/comic/xkcdprovider.cpp	(revision 739687)
+@@ -0,0 +1,124 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include <QtCore/QDate>
++#include <QtCore/QRegExp>
++#include <QtCore/QUrl>
++#include <QtGui/QImage>
++#include <QtNetwork/QHttp>
++#include <QtNetwork/QHttpRequestHeader>
++
++#include "xkcdprovider.h"
++
++class XkcdProvider::Private
++{
++  public:
++    Private( XkcdProvider *parent, const QDate &date )
++      : mParent( parent ), mDate( date )
++    {
++      mHttp = new QHttp( "xkcd.com", 80, mParent );
++      connect( mHttp, SIGNAL( done( bool ) ), mParent, SLOT( pageRequestFinished( bool ) ) );
++    }
++
++    void pageRequestFinished( bool );
++    void imageRequestFinished( bool );
++    void parsePage();
++
++    XkcdProvider *mParent;
++    QByteArray mPage;
++    QDate mDate;
++    QImage mImage;
++
++    QHttp *mHttp;
++    QHttp *mImageHttp;
++};
++
++static QString dateToId( const QDate &date )
++{
++    static QDate initialDate = QDate( 2006, 12, 6 ); // when everything started...
++
++    if ( date < initialDate )
++        return QString();
++
++    int days = initialDate.daysTo( date );
++
++    return QString::number( days );
++}
++
++void XkcdProvider::Private::pageRequestFinished( bool err )
++{
++  if ( err ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  const QString pattern( "<img src=\"http://imgs.xkcd.com/comics/" );
++  const QRegExp exp( pattern );
++
++  const QString data = QString::fromUtf8( mHttp->readAll() );
++
++  int pos = exp.indexIn( data ) + pattern.length();
++
++  const QString sub = data.mid( pos, data.indexOf( '.', pos ) - pos );
++
++  QUrl url( QString( "http://imgs.xkcd.com/comics/%1.png" ).arg( sub ) );
++
++  mImageHttp = new QHttp( "imgs.xkcd.com", 80, mParent );
++  mImageHttp->setHost( url.host() );
++  mImageHttp->get( url.path() );
++
++  mParent->connect( mImageHttp, SIGNAL( done( bool ) ), mParent, SLOT( imageRequestFinished( bool ) ) );
++}
++
++void XkcdProvider::Private::imageRequestFinished( bool error )
++{
++  if ( error ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  QByteArray data = mImageHttp->readAll();
++  mImage = QImage::fromData( data );
++  emit mParent->finished( mParent );
++}
++
++XkcdProvider::XkcdProvider( const QDate &date, QObject *parent )
++    : ComicProvider( parent ), d( new Private( this, date ) )
++{
++    QUrl url( QString( "http://xkcd.com/%1/" ).arg( dateToId( date ) ) );
++
++    d->mHttp->setHost( url.host() );
++    d->mHttp->get( url.path() );
++}
++
++XkcdProvider::~XkcdProvider()
++{
++    delete d;
++}
++
++QImage XkcdProvider::image() const
++{
++    return d->mImage;
++}
++
++QString XkcdProvider::identifier() const
++{
++    return QString( "xkcd:%1" ).arg( d->mDate.toString( Qt::ISODate ) );
++}
++
++#include "xkcdprovider.moc"
+Index: dataengines/comic/dilbertprovider.h
+===================================================================
+--- dataengines/comic/dilbertprovider.h	(revision 0)
++++ dataengines/comic/dilbertprovider.h	(revision 739687)
+@@ -0,0 +1,66 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef DILBERTPROVIDER_H
++#define DILBERTPROVIDER_H
++
++#include "comicprovider.h"
++
++/**
++ * This class provides the comic strip image for dilbert.com.
++ */
++class DilbertProvider : public ComicProvider
++{
++    Q_OBJECT
++
++    public:
++        /**
++         * Creates a new dilbert provider.
++         *
++         * @param date The date for which the image shall be fetched.
++         * @param parent The parent object.
++         */
++        DilbertProvider( const QDate &date, QObject *parent = 0 );
++
++        /**
++         * Destroys the dilbert provider.
++         */
++        ~DilbertProvider();
++
++        /**
++         * Returns the requested image.
++         *
++         * Note: This method returns only a valid image after the
++         *       finished() signal has been emitted.
++         */
++        virtual QImage image() const;
++
++        /**
++         * Returns the identifier of the comic request (name + date).
++         */
++        virtual QString identifier() const;
++
++    private:
++      class Private;
++      Private* const d;
++
++      Q_PRIVATE_SLOT( d, void pageRequestFinished( bool ) )
++      Q_PRIVATE_SLOT( d, void imageRequestFinished( bool ) )
++};
++
++#endif
+Index: dataengines/comic/comicprovider.cpp
+===================================================================
+--- dataengines/comic/comicprovider.cpp	(revision 0)
++++ dataengines/comic/comicprovider.cpp	(revision 739687)
+@@ -0,0 +1,30 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include "comicprovider.h"
++
++ComicProvider::ComicProvider( QObject *parent )
++    : QObject( parent )
++{
++}
++
++ComicProvider::~ComicProvider()
++{
++}
++
++#include "comicprovider.moc"
+Index: dataengines/comic/snoopyprovider.h
+===================================================================
+--- dataengines/comic/snoopyprovider.h	(revision 0)
++++ dataengines/comic/snoopyprovider.h	(revision 739687)
+@@ -0,0 +1,66 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef SNOOPYPROVIDER_H
++#define SNOOPYPROVIDER_H
++
++#include "comicprovider.h"
++
++/**
++ * This class provides the comic strip image for snoopy.com.
++ */
++class SnoopyProvider : public ComicProvider
++{
++    Q_OBJECT
++
++    public:
++        /**
++         * Creates a new snoopy provider.
++         *
++         * @param date The date for which the image shall be fetched.
++         * @param parent The parent object.
++         */
++        SnoopyProvider( const QDate &date, QObject *parent = 0 );
++
++        /**
++         * Destroys the snoopy provider.
++         */
++        ~SnoopyProvider();
++
++        /**
++         * Returns the requested image.
++         *
++         * Note: This method returns only a valid image after the
++         *       finished() signal has been emitted.
++         */
++        virtual QImage image() const;
++
++        /**
++         * Returns the identifier of the comic request (name + date).
++         */
++        virtual QString identifier() const;
++
++    private:
++      class Private;
++      Private* const d;
++
++      Q_PRIVATE_SLOT( d, void pageRequestFinished( bool ) )
++      Q_PRIVATE_SLOT( d, void imageRequestFinished( bool ) )
++};
++
++#endif
+Index: dataengines/comic/xkcdprovider.h
+===================================================================
+--- dataengines/comic/xkcdprovider.h	(revision 0)
++++ dataengines/comic/xkcdprovider.h	(revision 739687)
+@@ -0,0 +1,66 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef XKCDPROVIDER_H
++#define XKCDPROVIDER_H
++
++#include "comicprovider.h"
++
++/**
++ * This class provides the comic strip image for xkcd.com.
++ */
++class XkcdProvider : public ComicProvider
++{
++    Q_OBJECT
++
++    public:
++        /**
++         * Creates a new xkcd provider.
++         *
++         * @param date The date for which the image shall be fetched.
++         * @param parent The parent object.
++         */
++        XkcdProvider( const QDate &date, QObject *parent = 0 );
++
++        /**
++         * Destroys the xkcd provider.
++         */
++        ~XkcdProvider();
++
++        /**
++         * Returns the requested image.
++         *
++         * Note: This method returns only a valid image after the
++         *       finished() signal has been emitted.
++         */
++        virtual QImage image() const;
++
++        /**
++         * Returns the identifier of the comic request (name + date).
++         */
++        virtual QString identifier() const;
++
++    private:
++      class Private;
++      Private* const d;
++
++      Q_PRIVATE_SLOT( d, void pageRequestFinished( bool ) )
++      Q_PRIVATE_SLOT( d, void imageRequestFinished( bool ) )
++};
++
++#endif
+Index: dataengines/comic/comicprovider.h
+===================================================================
+--- dataengines/comic/comicprovider.h	(revision 0)
++++ dataengines/comic/comicprovider.h	(revision 739687)
+@@ -0,0 +1,77 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef COMICPROVIDER_H
++#define COMICPROVIDER_H
++
++#include <QtCore/QObject>
++
++class QDate;
++class QImage;
++
++/**
++ * This class is an interface for comic providers.
++ */
++class ComicProvider : public QObject
++{
++    Q_OBJECT
++
++    public:
++        /**
++         * Creates a new comic provider.
++         *
++         * @param parent The parent object.
++         */
++        ComicProvider( QObject *parent = 0 );
++
++        /**
++         * Destroys the comic provider.
++         */
++        virtual ~ComicProvider();
++
++        /**
++         * Returns the requested image.
++         *
++         * Note: This method returns only a valid image after the
++         *       finished() signal has been emitted.
++         */
++        virtual QImage image() const = 0;
++
++        /**
++         * Returns the identifier of the comic request (name + date).
++         */
++        virtual QString identifier() const = 0;
++
++    Q_SIGNALS:
++        /**
++         * This signal is emitted whenever a request has been finished
++         * successfully.
++         *
++         * @param provider The provider which emitted the signal.
++         */
++        void finished( ComicProvider *provider );
++
++        /**
++         * This signal is emitted whenever an error has occured.
++         *
++         * @param provider The provider which emitted the signal.
++         */
++        void error( ComicProvider *provider );
++};
++
++#endif
+Index: dataengines/comic/cachedprovider.cpp
+===================================================================
+--- dataengines/comic/cachedprovider.cpp	(revision 0)
++++ dataengines/comic/cachedprovider.cpp	(revision 739687)
+@@ -0,0 +1,74 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include <QtCore/QFile>
++#include <QtCore/QTimer>
++#include <QtGui/QImage>
++
++#include <kstandarddirs.h>
++
++#include "cachedprovider.h"
++
++static QString identifierToPath( const QString &identifier )
++{
++    const QString dataDir = KStandardDirs::locateLocal( "data", "plasma_engine_comic/" );
++
++    return QString( dataDir + identifier );
++}
++
++
++CachedProvider::CachedProvider( const QString &identifier, QObject *parent )
++    : ComicProvider( parent ), mIdentifier( identifier )
++{
++    QTimer::singleShot( 0, this, SLOT( triggerFinished() ) );
++}
++
++CachedProvider::~CachedProvider()
++{
++}
++
++QImage CachedProvider::image() const
++{
++    if ( !QFile::exists( identifierToPath( mIdentifier ) ) )
++        return QImage();
++
++    QImage img;
++    img.load( identifierToPath( mIdentifier ), "PNG" );
++
++    return img;
++}
++
++QString CachedProvider::identifier() const
++{
++    return mIdentifier;
++}
++
++void CachedProvider::triggerFinished()
++{
++    emit finished( this );
++}
++
++bool CachedProvider::isCached( const QString &identifier )
++{
++    return QFile::exists( identifierToPath( identifier ) );
++}
++
++bool CachedProvider::storeInCache( const QString &identifier, const QImage &comic )
++{
++    return comic.save( identifierToPath( identifier ), "PNG" );
++}
+Index: dataengines/comic/userfriendlyprovider.cpp
+===================================================================
+--- dataengines/comic/userfriendlyprovider.cpp	(revision 0)
++++ dataengines/comic/userfriendlyprovider.cpp	(revision 739687)
+@@ -0,0 +1,122 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include <QtCore/QDate>
++#include <QtCore/QRegExp>
++#include <QtCore/QUrl>
++#include <QtGui/QImage>
++#include <QtNetwork/QHttp>
++#include <QtNetwork/QHttpRequestHeader>
++
++#include "userfriendlyprovider.h"
++
++class UserFriendlyProvider::Private
++{
++  public:
++    Private( UserFriendlyProvider *parent, const QDate &date )
++      : mParent( parent ), mDate( date )
++    {
++      mHttp = new QHttp( "ars.userfriendly.org", 80, mParent );
++      connect( mHttp, SIGNAL( done( bool ) ), mParent, SLOT( pageRequestFinished( bool ) ) );
++    }
++
++    void pageRequestFinished( bool );
++    void imageRequestFinished( bool );
++    void parsePage();
++
++    UserFriendlyProvider *mParent;
++    QByteArray mPage;
++    QDate mDate;
++    QImage mImage;
++
++    QHttp *mHttp;
++    QHttp *mImageHttp;
++};
++
++void UserFriendlyProvider::Private::pageRequestFinished( bool err )
++{
++  if ( err ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  const QString pattern( "<img border=\"0\" src=\"http://www.userfriendly.org/cartoons/archives/" );
++  const QRegExp exp( pattern );
++
++  const QString data = QString::fromUtf8( mHttp->readAll() );
++
++  int pos = exp.indexIn( data ) + pattern.length();
++
++  const QString sub = data.mid( pos, data.indexOf( ' ', pos ) - pos - 1 );
++
++  QUrl url( QString( "http://www.userfriendly.org/cartoons/archives/%1" ).arg( sub ) );
++
++  mImageHttp = new QHttp( "ars.userfriendly.org", 80, mParent );
++  mImageHttp->setHost( url.host() );
++  mImageHttp->get( url.path() );
++
++  mParent->connect( mImageHttp, SIGNAL( done( bool ) ), mParent, SLOT( imageRequestFinished( bool ) ) );
++}
++
++void UserFriendlyProvider::Private::imageRequestFinished( bool error )
++{
++  if ( error ) {
++    emit mParent->error( mParent );
++    return;
++  }
++
++  mImage = QImage::fromData( mImageHttp->readAll() );
++  emit mParent->finished( mParent );
++}
++
++UserFriendlyProvider::UserFriendlyProvider( const QDate &date, QObject *parent )
++    : ComicProvider( parent ), d( new Private( this, date ) )
++{
++    QString path( QString( "/cartoons/?id=" ) + date.toString( "yyyyMMdd" ) );
++
++    QHttpRequestHeader header( "GET", path );
++    header.setValue( "User-Agent", "Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.6 (like Gecko)" );
++    header.setValue( "Accept", "text/html, image/jpeg, image/png, text/*, image/*, */*" );
++    header.setValue( "Accept-Encoding", "deflate" );
++    header.setValue( "Accept-Charset", "iso-8859-15, utf-8;q=0.5, *;q=0.5" );
++    header.setValue( "Accept-Language", "en" );
++    header.setValue( "Host", "ars.userfriendly.org" );
++    header.setValue( "Referer", QString( "http://ars.userfriendly.org/cartoons/?id=%1" )
++                                   .arg( date.addDays( -1 ).toString( "yyyyMMdd" ) ) );
++    header.setValue( "Connection", "Keep-Alive" );
++
++    d->mHttp->setHost( "ars.userfriendly.org" );
++    d->mHttp->request( header );
++}
++
++UserFriendlyProvider::~UserFriendlyProvider()
++{
++    delete d;
++}
++
++QImage UserFriendlyProvider::image() const
++{
++    return d->mImage;
++}
++
++QString UserFriendlyProvider::identifier() const
++{
++    return QString( "userfriendly:%1" ).arg( d->mDate.toString( Qt::ISODate ) );
++}
++
++#include "userfriendlyprovider.moc"
+Index: dataengines/comic/cachedprovider.h
+===================================================================
+--- dataengines/comic/cachedprovider.h	(revision 0)
++++ dataengines/comic/cachedprovider.h	(revision 739687)
+@@ -0,0 +1,75 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef CACHEDPROVIDER_H
++#define CACHEDPROVIDER_H
++
++#include "comicprovider.h"
++
++/**
++ * This class provides comics from the local cache.
++ */
++class CachedProvider : public ComicProvider
++{
++    Q_OBJECT
++
++    public:
++        /**
++         * Creates a new cached provider.
++         *
++         * @param identifier The identifier of the cached comic.
++         * @param parent The parent object.
++         */
++        CachedProvider( const QString &identifier, QObject *parent = 0 );
++
++        /**
++         * Destroys the cached provider.
++         */
++        ~CachedProvider();
++
++        /**
++         * Returns the requested image.
++         *
++         * Note: This method returns only a valid image after the
++         *       finished() signal has been emitted.
++         */
++        virtual QImage image() const;
++
++        /**
++         * Returns the identifier of the comic request (name + date).
++         */
++        virtual QString identifier() const;
++
++        /**
++         * Returns whether a comic with the given @p identifier is cached.
++         */
++        static bool isCached( const QString &identifier );
++
++        /**
++         * Stores the given @p comic with the given @p identifier in the cache.
++         */
++        static bool storeInCache( const QString &identifier, const QImage &comic );
++
++    private Q_SLOTS:
++        void triggerFinished();
++
++    private:
++        QString mIdentifier;
++};
++
++#endif
+Index: dataengines/comic/garfieldprovider.cpp
+===================================================================
+--- dataengines/comic/garfieldprovider.cpp	(revision 0)
++++ dataengines/comic/garfieldprovider.cpp	(revision 739687)
+@@ -0,0 +1,84 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include <QtCore/QDate>
++#include <QtCore/QRegExp>
++#include <QtCore/QUrl>
++#include <QtGui/QImage>
++#include <QtNetwork/QHttp>
++#include <QtNetwork/QHttpRequestHeader>
++
++#include "garfieldprovider.h"
++
++class GarfieldProvider::Private
++{
++  public:
++    Private( GarfieldProvider *parent, const QDate &date )
++      : mParent( parent ), mDate( date )
++    {
++      mHttp = new QHttp( "images.ucomics.com", 80, mParent );
++      connect( mHttp, SIGNAL( done( bool ) ), mParent, SLOT( imageRequestFinished( bool ) ) );
++    }
++
++    void imageRequestFinished( bool );
++
++    GarfieldProvider *mParent;
++    QByteArray mPage;
++    QDate mDate;
++    QImage mImage;
++
++    QHttp *mHttp;
++};
++
++void GarfieldProvider::Private::imageRequestFinished( bool error )
++{
++    if ( error ) {
++        emit mParent->error( mParent );
++        return;
++    }
++
++    QByteArray data = mHttp->readAll();
++    mImage = QImage::fromData( data );
++    emit mParent->finished( mParent );
++}
++
++GarfieldProvider::GarfieldProvider( const QDate &date, QObject *parent )
++    : ComicProvider( parent ), d( new Private( this, date ) )
++{
++    QUrl url( QString( "http://images.ucomics.com/comics/ga/2007/ga%1.gif" ).arg( date.toString( "yyMMdd" ) ) );
++
++    d->mHttp->setHost( url.host() );
++    d->mHttp->get( url.path() );
++}
++
++GarfieldProvider::~GarfieldProvider()
++{
++    delete d;
++}
++
++QImage GarfieldProvider::image() const
++{
++    return d->mImage;
++}
++
++QString GarfieldProvider::identifier() const
++{
++    return QString( "garfield:%1" ).arg( d->mDate.toString( Qt::ISODate ) );
++}
++
++#include "garfieldprovider.moc"
+Index: dataengines/comic/comic.cpp
+===================================================================
+--- dataengines/comic/comic.cpp	(revision 0)
++++ dataengines/comic/comic.cpp	(revision 739687)
+@@ -0,0 +1,107 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#include <QtCore/QDate>
++
++#include "comic.h"
++
++// comic providers
++#include "cachedprovider.h"
++#include "dilbertprovider.h"
++#include "garfieldprovider.h"
++#include "snoopyprovider.h"
++#include "userfriendlyprovider.h"
++#include "xkcdprovider.h"
++
++ComicEngine::ComicEngine( QObject* parent, const QVariantList& args )
++    : Plasma::DataEngine( parent )
++{
++    Q_UNUSED(args)
++}
++
++ComicEngine::~ComicEngine()
++{
++}
++
++void ComicEngine::init()
++{
++}
++
++bool ComicEngine::updateSource( const QString &identifier )
++{
++    // check whether it is cached already...
++    if ( CachedProvider::isCached( identifier ) ) {
++        ComicProvider *provider = new CachedProvider( identifier, this );
++        connect( provider, SIGNAL( finished( ComicProvider* ) ), this, SLOT( finished( ComicProvider* ) ) );
++        connect( provider, SIGNAL( error( ComicProvider* ) ), this, SLOT( error( ComicProvider* ) ) );
++        return true;
++    }
++
++    // ... start a new query otherwise
++    const QStringList parts = identifier.split( ':', QString::SkipEmptyParts );
++
++    const QDate date = QDate::fromString( parts[ 1 ], Qt::ISODate );
++    if ( !date.isValid() ) {
++        return false;
++    }
++
++    ComicProvider *provider = 0;
++    if ( parts[ 0 ] == "userfriendly" )
++      provider = new UserFriendlyProvider( date, this );
++    else if ( parts[ 0 ] == "dilbert" )
++      provider = new DilbertProvider( date, this );
++    else if ( parts[ 0 ] == "garfield" )
++      provider = new GarfieldProvider( date, this );
++    else if ( parts[ 0 ] == "snoopy" )
++      provider = new SnoopyProvider( date, this );
++    else if ( parts[ 0 ] == "xkcd" )
++      provider = new XkcdProvider( date, this );
++
++    connect( provider, SIGNAL( finished( ComicProvider* ) ), this, SLOT( finished( ComicProvider* ) ) );
++    connect( provider, SIGNAL( error( ComicProvider* ) ), this, SLOT( error( ComicProvider* ) ) );
++
++    return true;
++}
++
++bool ComicEngine::sourceRequested( const QString &identifier )
++{
++    setData( identifier, QImage() );
++
++    return updateSource( identifier );
++}
++
++void ComicEngine::finished( ComicProvider *provider )
++{
++    setData( provider->identifier(), provider->image() );
++
++    // store in cache if it's not the response of a CachedProvider
++    if ( dynamic_cast<CachedProvider*>( provider ) == 0 && !provider->image().isNull() ) {
++        CachedProvider::storeInCache( provider->identifier(), provider->image() );
++    }
++
++    provider->deleteLater();
++}
++
++void ComicEngine::error( ComicProvider *provider )
++{
++    setData( provider->identifier(), QImage() );
++
++    provider->deleteLater();
++}
++
++#include "comic.moc"
+Index: dataengines/comic/userfriendlyprovider.h
+===================================================================
+--- dataengines/comic/userfriendlyprovider.h	(revision 0)
++++ dataengines/comic/userfriendlyprovider.h	(revision 739687)
+@@ -0,0 +1,66 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef USERFRIENDLYPROVIDER_H
++#define USERFRIENDLYPROVIDER_H
++
++#include "comicprovider.h"
++
++/**
++ * This class provides the comic strip image for userfriendly.org.
++ */
++class UserFriendlyProvider : public ComicProvider
++{
++    Q_OBJECT
++
++    public:
++        /**
++         * Creates a new userfriendly provider.
++         *
++         * @param date The date for which the image shall be fetched.
++         * @param parent The parent object.
++         */
++        UserFriendlyProvider( const QDate &date, QObject *parent = 0 );
++
++        /**
++         * Destroys the userfriendly provider.
++         */
++        ~UserFriendlyProvider();
++
++        /**
++         * Returns the requested image.
++         *
++         * Note: This method returns only a valid image after the
++         *       finished() signal has been emitted.
++         */
++        virtual QImage image() const;
++
++        /**
++         * Returns the identifier of the comic request (name + date).
++         */
++        virtual QString identifier() const;
++
++    private:
++      class Private;
++      Private* const d;
++
++      Q_PRIVATE_SLOT( d, void pageRequestFinished( bool ) )
++      Q_PRIVATE_SLOT( d, void imageRequestFinished( bool ) )
++};
++
++#endif
+Index: dataengines/comic/CMakeLists.txt
+===================================================================
+--- dataengines/comic/CMakeLists.txt	(revision 0)
++++ dataengines/comic/CMakeLists.txt	(revision 739687)
+@@ -0,0 +1,16 @@
++set(comic_engine_SRCS
++    cachedprovider.cpp
++    comic.cpp
++    comicprovider.cpp
++    dilbertprovider.cpp
++    garfieldprovider.cpp
++    snoopyprovider.cpp
++    userfriendlyprovider.cpp
++    xkcdprovider.cpp
++)
++
++kde4_add_plugin(plasma_engine_comic ${comic_engine_SRCS})
++target_link_libraries(plasma_engine_comic ${KDE4_KDEUI_LIBS} ${PLASMA_LIBS})
++
++install(TARGETS plasma_engine_comic DESTINATION ${PLUGIN_INSTALL_DIR})
++install(FILES plasma-engine-comic.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
+Index: dataengines/comic/garfieldprovider.h
+===================================================================
+--- dataengines/comic/garfieldprovider.h	(revision 0)
++++ dataengines/comic/garfieldprovider.h	(revision 739687)
+@@ -0,0 +1,65 @@
++/*
++ *   Copyright (C) 2007 Tobias Koenig <tokoe at kde.org>
++ *
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU Library General Public License version 2 as
++ *   published by the Free Software Foundation
++ *
++ *   This program 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 General Public License for more details
++ *
++ *   You should have received a copy of the GNU Library General Public
++ *   License along with this program; if not, write to the
++ *   Free Software Foundation, Inc.,
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
++ */
++
++#ifndef GARFIELDPROVIDER_H
++#define GARFIELDPROVIDER_H
++
++#include "comicprovider.h"
++
++/**
++ * This class provides the comic strip image for garfield.com.
++ */
++class GarfieldProvider : public ComicProvider
++{
++    Q_OBJECT
++
++    public:
++        /**
++         * Creates a new garfield provider.
++         *
++         * @param date The date for which the image shall be fetched.
++         * @param parent The parent object.
++         */
++        GarfieldProvider( const QDate &date, QObject *parent = 0 );
++
++        /**
++         * Destroys the garfield provider.
++         */
++        ~GarfieldProvider();
++
++        /**
++         * Returns the requested image.
++         *
++         * Note: This method returns only a valid image after the
++         *       finished() signal has been emitted.
++         */
++        virtual QImage image() const;
++
++        /**
++         * Returns the identifier of the comic request (name + date).
++         */
++        virtual QString identifier() const;
++
++    private:
++      class Private;
++      Private* const d;
++
++      Q_PRIVATE_SLOT( d, void imageRequestFinished( bool ) )
++};
++
++#endif
+Index: applets/lancelot/app/themes/blue/theme.desktop
+===================================================================
+--- applets/lancelot/app/themes/blue/theme.desktop	(revision 736572)
++++ applets/lancelot/app/themes/blue/theme.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=Lancelot Blue
+ Comment=Default theme for Lancelot
+ Author=Ivan Čukić
+Index: applets/lancelot/app/themes/black/main-panel.svg
+===================================================================
+--- applets/lancelot/app/themes/black/main-panel.svg	(revision 0)
++++ applets/lancelot/app/themes/black/main-panel.svg	(revision 739687)
+@@ -0,0 +1,380 @@
++<?xml version="1.0" encoding="UTF-8" standalone="no"?>
++<!-- Created with Inkscape (http://www.inkscape.org/) -->
++<svg
++   xmlns:dc="http://purl.org/dc/elements/1.1/"
++   xmlns:cc="http://web.resource.org/cc/"
++   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
++   xmlns:svg="http://www.w3.org/2000/svg"
++   xmlns="http://www.w3.org/2000/svg"
++   xmlns:xlink="http://www.w3.org/1999/xlink"
++   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
++   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
++   width="744.09448819"
++   height="1052.3622047"
++   id="svg8985"
++   sodipodi:version="0.32"
++   inkscape:version="0.45.1"
++   sodipodi:docbase="/home/kde-devel/src/plasma/extragear/applets/lancelot/app/themes/black"
++   sodipodi:docname="main-panel.svg"
++   inkscape:output_extension="org.inkscape.output.svg.inkscape">
++  <defs
++     id="defs8987">
++    <linearGradient
++       id="linearGradient4217">
++      <stop
++         style="stop-color:#383838;stop-opacity:1;"
++         offset="0"
++         id="stop4219" />
++      <stop
++         style="stop-color:#222222;stop-opacity:1;"
++         offset="1"
++         id="stop4221" />
++    </linearGradient>
++    <linearGradient
++       inkscape:collect="always"
++       id="linearGradient4622">
++      <stop
++         style="stop-color:#000000;stop-opacity:1;"
++         offset="0"
++         id="stop4624" />
++      <stop
++         style="stop-color:#000000;stop-opacity:0;"
++         offset="1"
++         id="stop4626" />
++    </linearGradient>
++    <linearGradient
++       id="linearGradient3222">
++      <stop
++         style="stop-color:#9cacce;stop-opacity:1;"
++         offset="0"
++         id="stop3224" />
++      <stop
++         style="stop-color:#496194;stop-opacity:1;"
++         offset="1"
++         id="stop3226" />
++    </linearGradient>
++    <linearGradient
++       id="linearGradient9007">
++      <stop
++         style="stop-color:#cccccc;stop-opacity:1;"
++         offset="0"
++         id="stop9009" />
++      <stop
++         style="stop-color:#e0e0e0;stop-opacity:1;"
++         offset="1"
++         id="stop9011" />
++    </linearGradient>
++    <linearGradient
++       id="linearGradient8995">
++      <stop
++         style="stop-color:#f2f2f2;stop-opacity:1;"
++         offset="0"
++         id="stop8997" />
++      <stop
++         style="stop-color:#ffffff;stop-opacity:1;"
++         offset="1"
++         id="stop8999" />
++    </linearGradient>
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="linearGradient4630"
++       x1="59.304985"
++       y1="286.08841"
++       x2="59.304985"
++       y2="298.75751"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(10.011074,0,0,1.0570488,-714.13639,463.3171)" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4632"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343"
++       gradientUnits="userSpaceOnUse" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4642"
++       gradientUnits="userSpaceOnUse"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4646"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4650"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4654"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343" />
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="linearGradient4660"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(9.3954322,0,0,1.0570488,-1049.3689,-223.24714)"
++       x1="59.304985"
++       y1="286.08841"
++       x2="59.304985"
++       y2="298.75751" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4664"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343" />
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="linearGradient4685"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(10.011074,0,0,1.0570488,-714.13639,463.3171)"
++       x1="59.304985"
++       y1="286.08841"
++       x2="59.304985"
++       y2="298.75751" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4687"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343" />
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="linearGradient4691"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(9.3954322,0,0,1.0570488,-1049.3689,-223.24714)"
++       x1="59.304985"
++       y1="286.08841"
++       x2="59.304985"
++       y2="298.75751" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient4693"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343" />
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="linearGradient4699"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(9.4899162,0,0,1.0570488,-1056.6262,340.02823)"
++       x1="59.304985"
++       y1="286.08841"
++       x2="59.304985"
++       y2="298.75751" />
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="linearGradient4704"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(10.076183,0,0,1.0570488,-156.02048,468.08467)"
++       x1="59.304985"
++       y1="286.08841"
++       x2="59.304985"
++       y2="298.75751" />
++    <radialGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4622"
++       id="radialGradient3214"
++       gradientUnits="userSpaceOnUse"
++       gradientTransform="matrix(-1.7549212e-6,-1.0000008,1.000001,-1.7712606e-6,-219.51369,378.0021)"
++       cx="79.243988"
++       cy="298.75754"
++       fx="79.243988"
++       fy="298.75754"
++       r="12.651343" />
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4217"
++       id="linearGradient4223"
++       x1="388.8877"
++       y1="777.24744"
++       x2="388.8877"
++       y2="736.78137"
++       gradientUnits="userSpaceOnUse" />
++    <linearGradient
++       inkscape:collect="always"
++       xlink:href="#linearGradient4217"
++       id="linearGradient4231"
++       x1="388.89868"
++       y1="287.49463"
++       x2="388.89868"
++       y2="317.46738"
++       gradientUnits="userSpaceOnUse" />
++  </defs>
++  <sodipodi:namedview
++     id="base"
++     pagecolor="#ffffff"
++     bordercolor="#666666"
++     borderopacity="1.0"
++     gridtolerance="10000"
++     guidetolerance="10"
++     objecttolerance="10"
++     inkscape:pageopacity="0.0"
++     inkscape:pageshadow="2"
++     inkscape:zoom="1.1659935"
++     inkscape:cx="388.88612"
++     inkscape:cy="519.9866"
++     inkscape:document-units="px"
++     inkscape:current-layer="background"
++     inkscape:window-width="1440"
++     inkscape:window-height="806"
++     inkscape:window-x="0"
++     inkscape:window-y="24"
++     showguides="true"
++     inkscape:guide-bbox="true">
++    <sodipodi:guide
++       orientation="vertical"
++       position="118.59055"
++       id="guide3184" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="774.89379"
++       id="guide3186" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="764.86756"
++       id="guide3190" />
++    <sodipodi:guide
++       orientation="vertical"
++       position="128.61679"
++       id="guide3192" />
++    <sodipodi:guide
++       orientation="vertical"
++       position="659.177"
++       id="guide3194" />
++    <sodipodi:guide
++       orientation="vertical"
++       position="649.15077"
++       id="guide3198" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="265.15238"
++       id="guide3200" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="275.11476"
++       id="guide3204" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="784.89129"
++       id="guide3222" />
++    <sodipodi:guide
++       orientation="vertical"
++       position="108.56392"
++       id="guide3224" />
++    <sodipodi:guide
++       orientation="vertical"
++       position="669.08977"
++       id="guide3226" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="255.12521"
++       id="guide3230" />
++    <sodipodi:guide
++       orientation="vertical"
++       position="664.17855"
++       id="guide3234" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="779.85082"
++       id="guide3236" />
++    <sodipodi:guide
++       orientation="vertical"
++       position="113.59367"
++       id="guide3240" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="260.12235"
++       id="guide3242" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="734.87947"
++       id="guide3246" />
++    <sodipodi:guide
++       orientation="horizontal"
++       position="315.61068"
++       id="guide3199" />
++  </sodipodi:namedview>
++  <metadata
++     id="metadata8990">
++    <rdf:RDF>
++      <cc:Work
++         rdf:about="">
++        <dc:format>image/svg+xml</dc:format>
++        <dc:type
++           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
++      </cc:Work>
++    </rdf:RDF>
++  </metadata>
++  <g
++     inkscape:label="Layer 1"
++     inkscape:groupmode="layer"
++     id="layer1">
++    <g
++       id="background"
++       inkscape:label="#g9062">
++      <rect
++         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
++         id="disabled"
++         width="391.05399"
++         height="419.26874"
++         x="-649.20294"
++         y="317.48273"
++         transform="scale(-1,1)"
++         rx="9.4340153"
++         ry="9.4340153"
++         inkscape:label="#rect3195" />
++    </g>
++  </g>
++</svg>
+Index: applets/lancelot/app/themes/black/theme.svg
+===================================================================
+--- applets/lancelot/app/themes/black/theme.svg	(revision 736572)
++++ applets/lancelot/app/themes/black/theme.svg	(revision 739687)
+@@ -403,16 +403,6 @@
+          rx="6.2632709"
+          ry="6.2632709" />
+       <rect
+-         style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+-         id="rect3195"
+-         width="391.05399"
+-         height="419.26874"
+-         x="-649.20294"
+-         y="317.48273"
+-         transform="scale(-1,1)"
+-         rx="9.4340153"
+-         ry="9.4340153" />
+-      <rect
+          style="fill:url(#linearGradient4704);fill-opacity:1;stroke:none;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0;stroke-opacity:1"
+          id="rect3639"
+          width="494.68781"
+Index: applets/lancelot/app/themes/black/theme.config
+===================================================================
+--- applets/lancelot/app/themes/black/theme.config	(revision 736572)
++++ applets/lancelot/app/themes/black/theme.config	(revision 739687)
+@@ -85,3 +85,7 @@
+ background.type=svg
+ background.svg=lancelot/launch-applet-button
+ 
++[Group-MainPanel]
++background.type=svg
++background.svg=lancelot/main-panel
++
+Index: applets/lancelot/app/themes/black/theme.desktop
+===================================================================
+--- applets/lancelot/app/themes/black/theme.desktop	(revision 736572)
++++ applets/lancelot/app/themes/black/theme.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=Black night
+ Comment=Dark theme for Lancelot
+ Author=Ivan Čukić
+Index: applets/lancelot/app/themes/black/CMakeLists.txt
+===================================================================
+--- applets/lancelot/app/themes/black/CMakeLists.txt	(revision 736572)
++++ applets/lancelot/app/themes/black/CMakeLists.txt	(revision 739687)
+@@ -19,6 +19,7 @@
+ 
+     extender-button-icon.svg
+     launch-applet-button.svg
++    main-panel.svg
+     
+     DESTINATION ${DATA_INSTALL_DIR}/desktoptheme/default/lancelot/
+ )
+\ No newline at end of file
+Index: applets/lancelot/app/src/LancelotWindow.h
+===================================================================
+--- applets/lancelot/app/src/LancelotWindow.h	(revision 736572)
++++ applets/lancelot/app/src/LancelotWindow.h	(revision 739687)
+@@ -76,6 +76,7 @@
+ 
+ private:
+     void createModels();
++    bool showWindow();
+ 
+     // Computer models
+     Lancelot::MergedActionListViewModel * m_systemLeftModel;
+Index: applets/lancelot/app/src/Panel.h
+===================================================================
+--- applets/lancelot/app/src/Panel.h	(revision 736572)
++++ applets/lancelot/app/src/Panel.h	(revision 739687)
+@@ -21,7 +21,7 @@
+ #define LANCELOT_PANEL_H_
+ 
+ #include "Widget.h"
+-#include <plasma/widgets/layout.h>
++#include <plasma/layouts/layout.h>
+ #include "BaseActionWidget.h"
+ 
+ #include <QIcon>
+@@ -55,10 +55,6 @@
+     void setWidget(Widget * widget);
+     Widget * widget();
+ 
+-    void setVisible(bool visible);
+-    void show();
+-    void hide();
+-
+     void setGroup(WidgetGroup * group = NULL);
+ 
+ private:
+Index: applets/lancelot/app/src/applet/plasma-applet-lancelot.desktop
+===================================================================
+--- applets/lancelot/app/src/applet/plasma-applet-lancelot.desktop	(revision 736572)
++++ applets/lancelot/app/src/applet/plasma-applet-lancelot.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Icon=lancelot
+ 
+ Name=Lancelot Launcher
+@@ -19,8 +18,8 @@
+ Comment[zh_CN]=启动应用程序的启动器
+ Comment[zh_TW]=應用程式啟動器
+ Type=Service
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_lancelot
+ X-KDE-PluginInfo-Author=Ivan Cukic
+ X-KDE-PluginInfo-Email=ivan.cukic+kde at gmail.com
+Index: applets/lancelot/app/src/applet/LancelotApplet.h
+===================================================================
+--- applets/lancelot/app/src/applet/LancelotApplet.h	(revision 736572)
++++ applets/lancelot/app/src/applet/LancelotApplet.h	(revision 739687)
+@@ -21,7 +21,7 @@
+ #define LANCELOT_PARTS_H
+ 
+ #include <plasma/applet.h>
+-#include <plasma/widgets/nodelayout.h>
++#include <plasma/layouts/nodelayout.h>
+ 
+ #include "../src/Global.h"
+ #include "../src/ExtenderButton.h"
+Index: applets/lancelot/app/src/CardLayout.cpp
+===================================================================
+--- applets/lancelot/app/src/CardLayout.cpp	(revision 736572)
++++ applets/lancelot/app/src/CardLayout.cpp	(revision 739687)
+@@ -37,20 +37,12 @@
+     return Qt::Horizontal | Qt::Vertical;
+ }
+ 
+-QRectF CardLayout::geometry() const {
+-    return m_geometry;
+-}
+-
+-void CardLayout::setGeometry(const QRectF& geometry)
++void CardLayout::relayout()
+ {
+-    if (!geometry.isValid() || geometry.isEmpty()) {
+-        return;
+-    }
++    QRectF g = geometry();
++    g.setTopLeft(g.topLeft() + QPointF(margin(TopMargin), margin(LeftMargin)));
++    g.setBottomRight(g.bottomRight() - QPointF(margin(RightMargin), margin(BottomMargin)));
+ 
+-    QRectF g = geometry;
+-    g.setTopLeft(g.topLeft() + QPointF(margin(), margin()));
+-    g.setBottomRight(g.bottomRight() - QPointF(margin(), margin()));
+-
+     foreach (Plasma::LayoutItem * l, m_items) {
+         l->setGeometry(g);
+     }
+@@ -60,8 +52,6 @@
+         l->setGeometry(g);
+         if (m_shown != l) l->hide();
+     }
+-
+-    m_geometry = geometry;
+ }
+ 
+ QSizeF CardLayout::sizeHint() const
+Index: applets/lancelot/app/src/parts/plasma-applet-lancelot-part.desktop
+===================================================================
+--- applets/lancelot/app/src/parts/plasma-applet-lancelot-part.desktop	(revision 736572)
++++ applets/lancelot/app/src/parts/plasma-applet-lancelot-part.desktop	(revision 739687)
+@@ -1,13 +1,12 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Icon=lancelot
+ 
+ Name=Lancelot Part
+ 
+ Comment=Parts of Lancelot menu on the desktop
+ Type=Service
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_lancelot_part
+ X-KDE-PluginInfo-Author=Ivan Cukic
+ X-KDE-PluginInfo-Email=ivan.cukic+kde at gmail.com
+Index: applets/lancelot/app/src/LancelotWindow.cpp
+===================================================================
+--- applets/lancelot/app/src/LancelotWindow.cpp	(revision 736572)
++++ applets/lancelot/app/src/LancelotWindow.cpp	(revision 739687)
+@@ -164,11 +164,35 @@
+ }
+ 
+ bool LancelotWindow::lancelotShow() {
++    panelSections->show();
++    layoutMain->setSize(sectionsWidth, Plasma::LeftPositioned);
++    layoutMain->updateGeometry();
++    resizeWindow(this, QSize(mainWidth + sectionsWidth, 500));
++    
++    return showWindow();    
++}
++
++bool LancelotWindow::lancelotShowItem(QString name) {
++    sectionActivated(name);
++    
++    panelSections->hide();
++    layoutMain->setSize(0, Plasma::LeftPositioned);
++    layoutMain->setGeometry(layoutMain->geometry());
++    resizeWindow(this, QSize(mainWidth, 500));
++    
++    if (!isVisible()) {
++        return showWindow();
++    }
++    return true;
++}
++
++bool LancelotWindow::showWindow() {
+     show();
+     KWindowSystem::setState( winId(), NET::SkipTaskbar | NET::SkipPager | NET::KeepAbove );
+     m_hideTimer.stop();
+     setFocus();
+     editSearch->setFocus();
++    
+     return true;
+ }
+ 
+@@ -183,16 +207,6 @@
+     return true;
+ }
+ 
+-bool LancelotWindow::lancelotShowItem(QString name) {
+-    //Q_UNUSED(name);
+-    //return false;
+-    sectionActivated(name);
+-    if (!isVisible()) {
+-        lancelotShow();
+-    }
+-    return true;
+-}
+-
+ void LancelotWindow::createModels() {
+     // Computer models
+ 
+Index: applets/lancelot/app/src/ui_LancelotWindow.h
+===================================================================
+--- applets/lancelot/app/src/ui_LancelotWindow.h	(revision 736572)
++++ applets/lancelot/app/src/ui_LancelotWindow.h	(revision 739687)
+@@ -35,8 +35,8 @@
+ #include <plasma/widgets/pushbutton.h>
+ #include <plasma/widgets/label.h>
+ 
+-#include <plasma/widgets/borderlayout.h>
+-#include <plasma/widgets/nodelayout.h>
++#include <plasma/layouts/borderlayout.h>
++#include <plasma/layouts/nodelayout.h>
+ //#include <plasma/widgets/boxlayout.h>
+ 
+ #include <plasma/containment.h>
+@@ -61,6 +61,9 @@
+ #define sectDocuments    "Documents"
+ #define sectSearch       "Search"
+ 
++#define sectionsWidth 128
++#define mainWidth 422
++
+ #define AddSectionData(Name, Icon, Caption) \
+     sectionsOrder << Name; \
+     sectionsData[Name] = QPair < QString, QString > (Icon, Caption);
+@@ -72,6 +75,7 @@
+ 
+ protected:
+     // Plasma shell
++
+     class CustomGraphicsView : public QGraphicsView {
+     public:
+         CustomGraphicsView  ( QWidget * parent = 0 )
+@@ -81,10 +85,12 @@
+         void drawBackground (QPainter * painter, const QRectF & rect)
+         {
+             Q_UNUSED(rect); // Q_UNUSED(painter);
++            painter->setCompositionMode(QPainter::CompositionMode_Clear);
++            painter->fillRect(QRectF(rect.x()-2,rect.y()-2,rect.width()+2,rect.height()+2).toRect(), Qt::transparent);
+             painter->setCompositionMode(QPainter::CompositionMode_Source);
+-            painter->fillRect(QRectF(rect.x()-2,rect.y()-2,rect.width()+2,rect.height()+2).toRect(), Qt::transparent);
+             if (m_background) {
+-                m_background->resize(QSizeF(550, 500));
++                //m_background->resize(QSizeF(mainWidth + sectionsWidth, 500));
++                m_background->resize(size());
+                 m_background->paint(painter, 0, 0, "background");
+             }
+         }
+@@ -104,7 +110,7 @@
+     Plasma::Corona     * m_corona;
+     QVBoxLayout        * m_layout;
+ 
+-    Plasma::Containment * testContainment;
++    //Plasma::Containment * testContainment;
+ 
+     // Components
+     Lancelot::FlipLayout < Plasma::BorderLayout > * layoutMain;
+@@ -140,6 +146,7 @@
+ 
+     // Center area
+ 
++    Lancelot::Widget * centerBackground;
+     Lancelot::CardLayout * layoutCenter;
+     Lancelot::PassagewayView * panelSectionApplications;
+ 
+@@ -153,16 +160,13 @@
+         // First of all we MUST create a Lancelot::Instance
+         instance = new Lancelot::Instance();
+         
+-        Lancelot::FlipLayoutGlobal::setFlip(Lancelot::FlipLayoutGlobal::Both);
++        //Lancelot::FlipLayoutGlobal::setFlip(Lancelot::FlipLayoutGlobal::Both);
+         
+         AddSectionData(sectApplications, "applications-other",  i18n("Applications"));
+         AddSectionData(sectComputer,     "computer-laptop",     i18n("Computer"));
+         AddSectionData(sectContacts,     "kontact",             i18n("Contacts"));
+         AddSectionData(sectDocuments,    "applications-office", i18n("Documents"));
+         AddSectionData(sectSearch,       "edit-find",           i18n("Search"));
+-        
+-        kDebug() << "Sections: " << sectionsOrder;
+-        kDebug() << "Sections: " << sectionsData;
+       
+         setupShell(object);
+         createObjects(object);
+@@ -170,20 +174,35 @@
+         setupGroups(object);
+         setupTests(object);
+ 
+-        object->resize(550, 500);
+-
+         instance->activateAll();
+ 
+-        layoutMain->setGeometry(QRectF(0, 0, 550, 500));
++        m_view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
++        
++        resizeWindow(object, QSize(mainWidth + sectionsWidth, 500));
++    }
++    
++    void resizeWindow(QFrame * object, QSize newSize)
++    {
++        m_view->resetCachedContent();
++        
++        object->resize(newSize.width(), newSize.height());
++        m_view->resize(newSize.width(), newSize.height());
++        
++        m_corona->setSceneRect(QRectF(0, 0, newSize.width(), newSize.height()));
++        layoutMain->setGeometry(QRectF(0, 0, newSize.width(), newSize.height()));
++        layoutMain->updateGeometry();
+ 
+-        m_corona->setSceneRect(QRectF(0, 0, 550, 500));
++        m_view->invalidateScene();
++        m_view->update();
++        
++        object->update();
+     }
+ 
+     void createObjects(QFrame * object)
+     {
+         Q_UNUSED(object);
+ 
+-        testContainment = new Plasma::Containment();
++        //testContainment = new Plasma::Containment();
+ 
+         // Components
+         layoutMain = new Lancelot::FlipLayout < Plasma::BorderLayout > ();
+@@ -204,6 +223,7 @@
+         panelSections = new Lancelot::Panel("panelSections");
+ 
+         layoutCenter = new Lancelot::CardLayout();
++        centerBackground = new Lancelot::Widget("centerBackground");
+ 
+         foreach (QString section, sectionsOrder) {
+             sectionLayouts[section] = new Plasma::NodeLayout();
+@@ -264,7 +284,7 @@
+         layoutMain->addItem(layoutSystem, Plasma::BottomPositioned);
+         layoutMain->setSize(40.0, Plasma::BottomPositioned);
+         layoutMain->setSize(30.0, Plasma::TopPositioned);
+-        layoutMain->setSize(128.0, Plasma::LeftPositioned);
++        layoutMain->setSize(sectionsWidth, Plasma::LeftPositioned);
+ 
+         layoutSystem->setSpacing(0);
+         layoutSystem->setMargin(6);
+@@ -298,7 +318,7 @@
+         layoutSections->setSpacing(0);
+         layoutSections->setMargin(0);
+ 
+-        qreal top = 0;
++        qreal top = 1.0;
+         qreal increase = 1.0 / sectionButtons.size();
+ 
+         foreach (Lancelot::ToggleExtenderButton * button, sectionButtons) {
+@@ -308,10 +328,10 @@
+             button->setInnerOrientation(Lancelot::BaseActionWidget::Vertical);
+ 
+             layoutSections->addItem(button,
+-                Plasma::NodeLayout::NodeCoordinate(0, top),
+-                Plasma::NodeLayout::NodeCoordinate(1.0, top + increase)
++                Plasma::NodeLayout::NodeCoordinate(0, top - increase),
++                Plasma::NodeLayout::NodeCoordinate(1.0, top)
+             );
+-            top += increase;
++            top -= increase;
+         }
+         panelSections->setLayout(layoutSections);
+         m_corona->addItem(panelSections);
+@@ -342,10 +362,10 @@
+ 
+         //layoutCenter->addItem(testContainment);
+         //m_corona->addItem(testContainment);
+-        testContainment->setFormFactor(Plasma::Planar);
+-        testContainment->setLocation(Plasma::Desktop);
+-        testContainment->addApplet("digital-clock");
+-        testContainment->setGeometry(QRectF(0, 0, 500, 500));
++        //testContainment->setFormFactor(Plasma::Planar);
++        //testContainment->setLocation(Plasma::Desktop);
++        //testContainment->addApplet("digital-clock");
++        //testContainment->setGeometry(QRectF(0, 0, 500, 500));
+ 
+         /*Plasma::Applet * applet = Plasma::Applet::loadApplet("digital-clock");
+         //m_corona->addItem(applet);
+@@ -365,6 +385,11 @@
+         applet->setDrawStandardBackground(false);
+         applet->setGeometry(QRectF(300, 100, 120, 70));*/
+ 
++        layoutCenter->addItem(centerBackground);
++        m_corona->addItem(centerBackground);
++        centerBackground->setGroupByName("MainPanel");
++        centerBackground->disable();
++        
+         QMapIterator<QString, Lancelot::Panel *> i(sectionPanels);
+         while (i.hasNext()) {
+             i.next();
+Index: applets/lancelot/app/src/models/Devices.cpp
+===================================================================
+--- applets/lancelot/app/src/models/Devices.cpp	(revision 736572)
++++ applets/lancelot/app/src/models/Devices.cpp	(revision 739687)
+@@ -19,6 +19,8 @@
+  */
+ 
+ #include "Devices.h"
++
++#include <QMessageBox>
+ #include <KRun>
+ #include <KLocalizedString>
+ 
+@@ -94,10 +96,10 @@
+     }
+ 
+     connect (
+-        access, SIGNAL(accessibilityChanged(bool)),
+-        this, SLOT(udiAccessibilityChanged(bool))
++        access, SIGNAL(accessibilityChanged(bool, const QString &)),
++        this, SLOT(udiAccessibilityChanged(bool, const QString &))
+     );
+-    m_udis[access] = device.udi();
++    //m_udis[access] = device.udi();
+ 
+     add(
+         device.product(),
+@@ -107,15 +109,15 @@
+     );
+ }
+ 
+-void Devices::udiAccessibilityChanged(bool accessible)
++void Devices::udiAccessibilityChanged(bool accessible, const QString & udi)
+ {
+     Q_UNUSED(accessible);
+ 
+-    Solid::StorageAccess * access = (Solid::StorageAccess *) sender();
+-    if (!m_udis.contains(access)) {
+-        return;
+-    }
+-    QString udi = m_udis[access];
++    Solid::StorageAccess * access = Solid::Device(udi).as<Solid::StorageAccess>();
++    //if (!m_udis.contains(access)) {
++    //    return;
++    //}
++    
+     QMutableListIterator<Item> i(m_items);
+     int index = 0;
+ 
+@@ -154,17 +156,39 @@
+ void Devices::activate(int index)
+ {
+     if (index > m_items.size() - 1) return;
+-    Solid::StorageAccess * access = Solid::Device(m_items.at(index).data.toString()).as<Solid::StorageAccess>();
++    QString udi = m_items.at(index).data.toString();
++    Solid::StorageAccess * access = Solid::Device(udi).as<Solid::StorageAccess>();
+ 
+     if (!access) return;
+ 
+     if (!access->isAccessible()) {
++        //m_devicesMounting << udi;
++        connect(access, SIGNAL(setupDone(Solid::ErrorType, QVariant, const QString &)),
++            this, SLOT(deviceSetupDone(Solid::ErrorType, QVariant, const QString &)));
+         access->setup();
++        return;
+     }
+ 
+     new KRun(KUrl(access->filePath()), 0);
+     hideLancelotWindow();
+ }
+ 
++void Devices::deviceSetupDone(Solid::ErrorType error, QVariant errorData, const QString & udi)
++{
++    //m_devicesMounting.removeAll(udi);
++    
++    Solid::StorageAccess * access = Solid::Device(udi).as<Solid::StorageAccess>();
++    access->disconnect(this, SLOT(deviceSetupDone(Solid::ErrorType, QVariant, const QString &)));
++
++    if (!access || !access->isAccessible()) {
++        QMessageBox::critical(NULL, i18n("Failed to open"), i18n("The requested device can not be accessed."));
++        return;
++    }
++
++    new KRun(KUrl(access->filePath()), 0);
++    hideLancelotWindow();
+ }
++
++
+ }
++}
+Index: applets/lancelot/app/src/models/Devices.h
+===================================================================
+--- applets/lancelot/app/src/models/Devices.h	(revision 736572)
++++ applets/lancelot/app/src/models/Devices.h	(revision 739687)
+@@ -44,7 +44,9 @@
+     void deviceRemoved(const QString & udi);
+     void deviceAdded(const QString & udi);
+     void freeSpaceInfoAvailable(const QString & mountPoint, quint64 kbSize, quint64 kbUsed, quint64 kbAvailable);
+-    void udiAccessibilityChanged(bool accessible);
++    void udiAccessibilityChanged(bool accessible, const QString & udi);
++    
++    void deviceSetupDone(Solid::ErrorType error, QVariant errorData, const QString & udi);
+ 
+ protected:
+     void activate(int index);
+@@ -54,7 +56,8 @@
+     void addDevice(const Solid::Device & device);
+ 
+     Type m_filter;
+-    QMap < const Solid::StorageAccess *, QString> m_udis;
++    //QMap < const Solid::StorageAccess *, QString> m_udis;
++    //QStringList m_devicesMounting;
+ };
+ 
+ }
+Index: applets/lancelot/app/src/PassagewayView.h
+===================================================================
+--- applets/lancelot/app/src/PassagewayView.h	(revision 736572)
++++ applets/lancelot/app/src/PassagewayView.h	(revision 739687)
+@@ -28,7 +28,7 @@
+ #include "ActionListViewModels.h"
+ #include "PassagewayView.h"
+ #include "PassagewayViewModels.h"
+-#include <plasma/widgets/nodelayout.h>
++#include <plasma/layouts/nodelayout.h>
+ 
+ namespace Lancelot
+ {
+Index: applets/lancelot/app/src/CardLayout.h
+===================================================================
+--- applets/lancelot/app/src/CardLayout.h	(revision 736572)
++++ applets/lancelot/app/src/CardLayout.h	(revision 739687)
+@@ -20,7 +20,7 @@
+ #ifndef LANCELOT_CARDLAYOUT_H_
+ #define LANCELOT_CARDLAYOUT_H_
+ 
+-#include <plasma/widgets/layout.h>
++#include <plasma/layouts/layout.h>
+ #include <plasma/widgets/widget.h>
+ #include <cmath>
+ #include <QMap>
+@@ -38,9 +38,6 @@
+     explicit CardLayout(LayoutItem * parent = 0);
+     virtual ~CardLayout();
+ 
+-    virtual QRectF geometry() const;
+-    void setGeometry(const QRectF& geometry);
+-
+     QSizeF sizeHint() const;
+ 
+     void addItem (Plasma::LayoutItem * item);
+@@ -57,11 +54,13 @@
+     void show(const QString & id);
+     void hideAll();
+ 
++protected:
++    void relayout();
++
+ private:
+     QList < Plasma::LayoutItem * > m_items;
+     QMap < QString, Plasma::Widget * > m_widgets;
+     Plasma::Widget * m_shown;
+-    QRectF m_geometry;
+ };
+ 
+ }
+Index: applets/lancelot/app/src/BaseActionWidget.h
+===================================================================
+--- applets/lancelot/app/src/BaseActionWidget.h	(revision 736572)
++++ applets/lancelot/app/src/BaseActionWidget.h	(revision 739687)
+@@ -67,9 +67,6 @@
+     Qt::Alignment alignment() const;
+ 
+ protected:
+-    //void resizeSvg();
+-    //Plasma::Svg * m_svg;
+-    //QString m_svgElementPrefix, m_svgElementSufix;
+ 
+     void paintForeground (QPainter * painter);
+ 
+Index: applets/lancelot/app/src/LancelotApplication.h
+===================================================================
+--- applets/lancelot/app/src/LancelotApplication.h	(revision 736572)
++++ applets/lancelot/app/src/LancelotApplication.h	(revision 739687)
+@@ -25,6 +25,7 @@
+ #include <kuniqueapplication.h>
+ #include <QTimer>
+ #include <QSet>
++#include <QStringList>
+ 
+ class LancelotWindow;
+ 
+Index: applets/lancelot/app/src/FlipLayout.h
+===================================================================
+--- applets/lancelot/app/src/FlipLayout.h	(revision 736572)
++++ applets/lancelot/app/src/FlipLayout.h	(revision 739687)
+@@ -20,7 +20,7 @@
+ #ifndef LANCELOT_FLIPLAYOUT_H_
+ #define LANCELOT_FLIPLAYOUT_H_
+ 
+-#include <plasma/widgets/layout.h>
++#include <plasma/layouts/layout.h>
+ #include <plasma/widgets/widget.h>
+ #include <cmath>
+ #include <QMap>
+@@ -56,17 +56,11 @@
+ 
+ template <typename SuperLayout>
+ class FlipLayout : public SuperLayout { //Plasma::Layout
+-public:
+-    
+-    void setGeometry(const QRectF & geometry)
++protected:
++    void relayout()
+     {
+-        if (
+-            !geometry.isValid() ||
+-            this->geometry() == geometry
+-        ) return;
+-
+-        kDebug() << "Master" << geometry;
+-        SuperLayout::setGeometry(geometry);
++        QRectF rect = SuperLayout::geometry();
++        kDebug() << "Master" << rect;
+         
+         if (FlipLayoutGlobal::flip() == FlipLayoutGlobal::No) return;
+         
+@@ -80,17 +74,17 @@
+             childGeometry = item->geometry();
+             kDebug() << "Pre flip" << childGeometry;
+             if (FlipLayoutGlobal::flip() & FlipLayoutGlobal::Horizontal) {
+-                // 2 * geometry.left() - twice because we already have one
+-                // value of geometry.left() inside the childGeometry.left()
++                // 2 * rect.left() - twice because we already have one
++                // value of rect.left() inside the childGeometry.left()
+                 childGeometry.moveLeft(
+-                    2 * geometry.left()       + geometry.width()
++                    2 * rect.left()       + rect.width()
+                       - childGeometry.left()  - childGeometry.width()
+                 );
+             }
+             if (FlipLayoutGlobal::flip() & FlipLayoutGlobal::Vertical) {
+-                // 2 * geometry.top() - same reason as aforemontioned
++                // 2 * rect.top() - same reason as aforemontioned
+                 childGeometry.moveTop(
+-                    2 * geometry.top()      + geometry.height()
++                    2 * rect.top()      + rect.height()
+                       - childGeometry.top() - childGeometry.height()
+                 );
+             }
+Index: applets/lancelot/plasma-applet-lancelot.desktop
+===================================================================
+--- applets/lancelot/plasma-applet-lancelot.desktop	(revision 736572)
++++ applets/lancelot/plasma-applet-lancelot.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Icon=lancelot
+ 
+ Name=Lancelot Launcher
+@@ -19,8 +18,8 @@
+ Comment[zh_CN]=启动应用程序的启动器
+ Comment[zh_TW]=應用程式啟動器
+ Type=Service
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_lancelot
+ X-KDE-PluginInfo-Author=Ivan Cukic
+ X-KDE-PluginInfo-Email=ivan.cukic+kde at gmail.com
+Index: applets/twitter/twitter.cpp
+===================================================================
+--- applets/twitter/twitter.cpp	(revision 736572)
++++ applets/twitter/twitter.cpp	(revision 739687)
+@@ -25,10 +25,10 @@
+ #include <QPushButton>
+ #include <QSpinBox>
+ #include <QTextDocument>
+-#include <QTcpSocket>
+ #include <QCheckBox>
+ #include <QTimer>
+ #include <QGradient>
++#include <QFontMetrics>
+ 
+ #include <KDebug>
+ #include <KIcon>
+@@ -43,7 +43,7 @@
+ #include <plasma/dataengine.h>
+ #include <plasma/widgets/lineedit.h>
+ #include <plasma/widgets/flash.h>
+-#include <plasma/widgets/boxlayout.h>
++#include <plasma/layouts/boxlayout.h>
+ #include <plasma/widgets/icon.h>
+ 
+ Twitter::Twitter(QObject *parent, const QVariantList &args)
+@@ -75,15 +75,18 @@
+ 
+     m_flash = new Plasma::Flash( this );
+     m_flash->setColor( Qt::gray );
+-    m_flash->setSize( QSize(145, 20) );
+     QFont fnt = qApp->font();
+     fnt.setBold( true );
++    QFontMetrics fm( fnt );
++    m_flash->resize( QSize(200, fm.height()) );
++    m_flash->setMaximumSize( QSizeF(200, fm.height()+10 ) );
+     m_flash->setFont( fnt );
+     m_layout->addItem( m_flash );
+ 
+ 
+     m_headerLayout = new Plasma::HBoxLayout( m_layout );
+-    m_headerLayout->setMargin( 0 );
++    m_headerLayout->setMargin( 5 );
++    m_headerLayout->setSpacing( 5 );
+     m_layout->addItem( m_headerLayout );
+ 
+ 
+@@ -99,7 +102,7 @@
+         m_statusEdit->hide();
+     }
+     m_statusEdit->setStyled( true );
+-    m_statusEdit->setTextWidth( 200 );
++    m_statusEdit->setTextWidth( 250 );
+     connect( m_statusEdit->document(), SIGNAL(contentsChanged()), SLOT(geometryChanged()) );
+     connect( m_statusEdit, SIGNAL(editingFinished()), SLOT(updateStatus()) );
+     m_headerLayout->addItem( m_statusEdit );
+@@ -143,6 +146,8 @@
+         if( !pm.isNull() ) {
+             if( user == m_username ) {
+                 m_icon->setIcon( QIcon( pm ) );
++                m_icon->resize( 55, 55 );
++                m_icon->setMaximumSize( QSizeF( 55, 55 ) );
+             }
+             m_pictureMap[user] = pm;
+         }
+@@ -187,8 +192,8 @@
+         QString user = tweetData.value( "User" ).toString();
+ 
+         Plasma::HBoxLayout *tweetLayout = new Plasma::HBoxLayout( 0 );
+-        tweetLayout->setMargin( 0 );
+-        tweetLayout->setSpacing( 0 );
++        tweetLayout->setMargin( 5 );
++        tweetLayout->setSpacing( 5 );
+         m_layout->addItem( tweetLayout );
+ 
+         Plasma::LineEdit *e = new Plasma::LineEdit( this );
+@@ -201,9 +206,12 @@
+         Plasma::Icon *icon = new Plasma::Icon( this );
+         icon->setIcon( QIcon(m_pictureMap[user]) );
+         icon->setText( user );
++        icon->resize( 60, 60 );
++        icon->setMaximumSize( QSizeF( 60, 60 ) );
++        icon->setMinimumSize( QSizeF( 60, 60 ) );
+         tweetLayout->addItem( icon );
+         tweetLayout->addItem( e );
+-        tweetLayout->update();
++        tweetLayout->updateGeometry();
+ 
+         Tweet t;
+         t.layout = tweetLayout;
+@@ -223,6 +231,8 @@
+         ++i;
+         --pos;
+     }
++
++    m_layout->invalidate();
+     updateGeometry();
+ }
+ 
+Index: applets/dict/dict.cpp
+===================================================================
+--- applets/dict/dict.cpp	(revision 736572)
++++ applets/dict/dict.cpp	(revision 739687)
+@@ -124,7 +124,7 @@
+     fnt.setBold( true );
+     m_flash->setFont( fnt );
+     m_flash->setPos(25,-10);
+-    m_flash->setSize(QSize(200,20));
++    m_flash->resize(QSize(200,20));
+ }
+ 
+ void Dict::pageRight()
+Index: applets/dict/plasma-dict-default.desktop
+===================================================================
+--- applets/dict/plasma-dict-default.desktop	(revision 736572)
++++ applets/dict/plasma-dict-default.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=Dictionary
+ Name[bg]=Речник
+ Name[de]=Wörterbuch
+@@ -19,8 +18,8 @@
+ Comment[sv]=Slå upp ords betydelse
+ Type=Service
+ Icon=accessories-dictionary
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_dict
+ X-KDE-PluginInfo-Author=The Plasma Team
+ X-KDE-PluginInfo-Email=panel-devel at kde.org
+Index: applets/dict/dict.h
+===================================================================
+--- applets/dict/dict.h	(revision 736572)
++++ applets/dict/dict.h	(revision 739687)
+@@ -36,7 +36,7 @@
+ 
+ #include <plasma/applet.h>
+ #include <plasma/dataengine.h>
+-#include <plasma/widgets/vboxlayout.h>
++#include <plasma/layouts/vboxlayout.h>
+ #include <plasma/widgets/lineedit.h>
+ #include <plasma/widgets/flash.h>
+ #include <plasma/widgets/pushbutton.h>
+Index: applets/ebn/ebnapplet.h
+===================================================================
+--- applets/ebn/ebnapplet.h	(revision 736572)
++++ applets/ebn/ebnapplet.h	(revision 739687)
+@@ -22,7 +22,7 @@
+ 
+ #include <plasma/applet.h>
+ #include <plasma/dataengine.h>
+-#include <plasma/widgets/vboxlayout.h>
++#include <plasma/layouts/vboxlayout.h>
+ #include <plasma/widgets/lineedit.h>
+ #include <plasma/widgets/pushbutton.h>
+ 
+Index: applets/ebn/plasma-applet-ebn.desktop
+===================================================================
+--- applets/ebn/plasma-applet-ebn.desktop	(revision 736572)
++++ applets/ebn/plasma-applet-ebn.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=English Breakfast Network
+ Name[bg]=Мрежа English Breakfast
+ Name[es]=Red de desayuno inglés
+@@ -13,8 +12,8 @@
+ Comment[sv]=Hämta information från KDE:s automatiska kvalitetskontroll
+ Type=Service
+ Icon=kteatime
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_ebn
+ X-KDE-PluginInfo-Author=Alex Merry
+ X-KDE-PluginInfo-Email=alex.merry at kdemail.net
+Index: applets/notes/plasma-notes-default.desktop
+===================================================================
+--- applets/notes/plasma-notes-default.desktop	(revision 736572)
++++ applets/notes/plasma-notes-default.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=Notes
+ Name[bg]=Бележки
+ Name[de]=Notizen
+@@ -19,8 +18,8 @@
+ Comment[sv]=Postit-liknande anteckningar
+ Icon=knotes
+ Type=Service
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_notes
+ X-KDE-PluginInfo-Author=Lukas Kropatschek
+ X-KDE-PluginInfo-Email=lukas.krop at gmail.com
+Index: applets/kolourpicker/kolourpicker.cpp
+===================================================================
+--- applets/kolourpicker/kolourpicker.cpp	(revision 736572)
++++ applets/kolourpicker/kolourpicker.cpp	(revision 739687)
+@@ -27,7 +27,7 @@
+ #include <klocale.h>
+ #include <kmenu.h>
+ 
+-#include <plasma/widgets/boxlayout.h>
++#include <plasma/layouts/boxlayout.h>
+ #include <plasma/widgets/pushbutton.h>
+ 
+ static KMenu* buildMenuForColor(const QColor &color)
+Index: applets/bluemarble/plasma-applet-bluemarble.desktop
+===================================================================
+--- applets/bluemarble/plasma-applet-bluemarble.desktop	(revision 736572)
++++ applets/bluemarble/plasma-applet-bluemarble.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=3D Earth Model
+ Name[bg]=3D модел на земята
+ Name[es]=Modelo 3D de la Tierra
+@@ -18,8 +17,8 @@
+ Comment[sv]=Visar jorden på skrivbordet
+ Icon=world
+ Type=Service
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_bluemarble
+ X-KDE-PluginInfo-Author=Rivo Laks
+ X-KDE-PluginInfo-Email=rivolaks at hot.ee
+Index: applets/comic/plasma-comic-default.desktop
+===================================================================
+--- applets/comic/plasma-comic-default.desktop	(revision 0)
++++ applets/comic/plasma-comic-default.desktop	(revision 739687)
+@@ -0,0 +1,25 @@
++[Desktop Entry]
++Name=Comic Strip
++Name[et]=Koomiks
++Name[pt]=Banda Desenhada
++Name[pt_BR]=Banda Desenhada
++Name[sv]=Tecknad serie
++Comment=Shows a comic strip from the internet.
++Comment[et]=Internetist hangitud koomiksi näitamine
++Comment[pt]=Mostra uma banda desenhada da Internet.
++Comment[pt_BR]=Mostra uma banda desenhada da Internet.
++Comment[sv]=Visar en tecknad serie från Internet.
++Icon=face-smile-big
++Type=Service
++ServiceTypes=Plasma/Applet
++
++X-KDE-Library=plasma_applet_comic
++X-KDE-PluginInfo-Author=Tobias Koenig
++X-KDE-PluginInfo-Email=tokoe at kde.org
++X-KDE-PluginInfo-Name=comic
++X-KDE-PluginInfo-Version=0.1
++X-KDE-PluginInfo-Website=http://plasma.kde.org/
++X-KDE-PluginInfo-Category=Graphics
++X-KDE-PluginInfo-Depends=
++X-KDE-PluginInfo-License=GPL
++X-KDE-PluginInfo-EnabledByDefault=true
+Index: applets/comic/Messages.sh
+===================================================================
+--- applets/comic/Messages.sh	(revision 0)
++++ applets/comic/Messages.sh	(revision 739687)
+@@ -0,0 +1,2 @@
++#! /usr/bin/env bash
++$XGETTEXT *.cpp -o $podir/plasma_applet_comic.pot
+
+Property changes on: applets/comic/Messages.sh
+___________________________________________________________________
+Name: svn:executable
+   + *
+
+Index: applets/comic/comic.h
+===================================================================
+--- applets/comic/comic.h	(revision 0)
++++ applets/comic/comic.h	(revision 739687)
+@@ -0,0 +1,71 @@
++/***************************************************************************
++ *   Copyright (C) 2007 by Tobias Koenig <tokoe at kde.org>                   *
++ *                                                                         *
++ *   This program is free software; you can redistribute it and/or modify  *
++ *   it under the terms of the GNU General Public License as published by  *
++ *   the Free Software Foundation; either version 2 of the License, or     *
++ *   (at your option) any later version.                                   *
++ *                                                                         *
++ *   This program 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 General Public License for more details.                          *
++ *                                                                         *
++ *   You should have received a copy of the GNU General Public License     *
++ *   along with this program; if not, write to the                         *
++ *   Free Software Foundation, Inc.,                                       *
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
++ ***************************************************************************/
++
++#ifndef COMIC_H
++#define COMIC_H
++
++#include <QtCore/QDate>
++#include <QtCore/QStringList>
++#include <QtGui/QImage>
++
++#include <plasma/applet.h>
++#include <plasma/dataengine.h>
++
++class ConfigDialog;
++
++class ComicApplet : public Plasma::Applet
++{
++    Q_OBJECT
++
++    public:
++        ComicApplet( QObject *parent, const QVariantList &args );
++        ~ComicApplet();
++
++        QSizeF contentSizeHint() const;
++        void paintInterface( QPainter *painter, const QStyleOptionGraphicsItem *option, const QRect &contentsRect );
++
++    public Q_SLOTS:
++        void dataUpdated( const QString &name, const Plasma::DataEngine::Data &data );
++        void showConfigurationInterface();
++
++    private Q_SLOTS:
++        void slotNextDay();
++        void slotPreviousDay();
++        void applyConfig();
++
++    protected:
++        void mousePressEvent( QGraphicsSceneMouseEvent* );
++
++    private:
++        void updateComic();
++        void updateButtons();
++        void loadConfig();
++        void saveConfig();
++
++        QImage mImage;
++        QDate mCurrentDate;
++        QString mComicIdentifier;
++        ConfigDialog *mConfigDialog;
++        bool mShowPreviousButton;
++        bool mShowNextButton;
++};
++
++K_EXPORT_PLASMA_APPLET(comic, ComicApplet)
++
++#endif
+Index: applets/comic/configdialog.cpp
+===================================================================
+--- applets/comic/configdialog.cpp	(revision 0)
++++ applets/comic/configdialog.cpp	(revision 739687)
+@@ -0,0 +1,123 @@
++/***************************************************************************
++ *   Copyright (C) 2007 by Tobias Koenig <tokoe at kde.org>                   *
++ *                                                                         *
++ *   This program is free software; you can redistribute it and/or modify  *
++ *   it under the terms of the GNU General Public License as published by  *
++ *   the Free Software Foundation; either version 2 of the License, or     *
++ *   (at your option) any later version.                                   *
++ *                                                                         *
++ *   This program 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 General Public License for more details.                          *
++ *                                                                         *
++ *   You should have received a copy of the GNU General Public License     *
++ *   along with this program; if not, write to the                         *
++ *   Free Software Foundation, Inc.,                                       *
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
++ ***************************************************************************/
++
++#include <QtCore/QAbstractListModel>
++#include <QtGui/QComboBox>
++#include <QtGui/QGridLayout>
++#include <QtGui/QLabel>
++
++#include <klocale.h>
++
++#include "configdialog.h"
++
++class ComicModel : public QAbstractListModel
++{
++    public:
++        ComicModel( QObject *parent = 0 )
++            : QAbstractListModel( parent )
++        {
++          mComics << ComicEntry( "userfriendly", i18n( "Userfriendly" ), QPixmap( ":userfriendly" ) );
++          mComics << ComicEntry( "dilbert", i18n( "Dilbert" ), QPixmap( ":dilbert" ) );
++          mComics << ComicEntry( "garfield", i18n( "Garfield" ), QPixmap( ":garfield" ) );
++          mComics << ComicEntry( "snoopy", i18n( "Snoopy" ), QPixmap( ":snoopy" ) );
++          mComics << ComicEntry( "xkcd", i18n( "XKCD" ), QPixmap( ":xkcd" ) );
++        }
++
++        virtual int rowCount( const QModelIndex &index = QModelIndex() ) const
++        {
++            if ( !index.isValid() )
++                return mComics.count();
++            else
++                return 0;
++        }
++
++        virtual QVariant data( const QModelIndex &index, int role = Qt::DisplayRole ) const
++        {
++            if ( !index.isValid() || index.row() >= mComics.count() )
++                return QVariant();
++
++            if ( role == Qt::DisplayRole )
++                return mComics[ index.row() ].title;
++            else if ( role == Qt::DecorationRole )
++                return mComics[ index.row() ].icon;
++            else if ( role == Qt::UserRole )
++                return mComics[ index.row() ].identifier;
++            else
++                return QVariant();
++        }
++
++    private:
++        class ComicEntry
++        {
++            public:
++                ComicEntry( const QString &_identifier, const QString &_title, const QPixmap &_icon )
++                    : identifier( _identifier ), title( _title ), icon( _icon )
++                {
++                }
++
++                QString identifier;
++                QString title;
++                QPixmap icon;
++        };
++
++        QList<ComicEntry> mComics;
++};
++
++
++ConfigDialog::ConfigDialog( QWidget *parent )
++    : KDialog( parent )
++{
++    setCaption( i18n( "Comic Configuration" ) );
++
++    setButtons( Ok | Apply | Cancel );
++    setDefaultButton( Ok );
++    showButtonSeparator( true );
++
++    QGridLayout *layout = new QGridLayout( mainWidget() );
++    mComicIdentifier = new QComboBox( mainWidget() );
++
++    QLabel *label = new QLabel( i18n( "Comic:" ), mainWidget() );
++    label->setBuddy( mComicIdentifier );
++    layout->addWidget( label, 0, 0 );
++    layout->addWidget( mComicIdentifier, 0, 1 );
++
++    mModel = new ComicModel( this );
++    mComicIdentifier->setModel( mModel );
++}
++
++ConfigDialog::~ConfigDialog()
++{
++}
++
++void ConfigDialog::setComicIdentifier( const QString &comic )
++{
++    for ( int i = 0; i < mModel->rowCount(); ++i ) {
++        const QModelIndex index = mModel->index( i, 0 );
++        if ( index.data( Qt::UserRole ).toString() == comic ) {
++            mComicIdentifier->setCurrentIndex( i );
++            break;
++        }
++    }
++}
++
++QString ConfigDialog::comicIdentifier() const
++{
++    const QModelIndex index = mModel->index( mComicIdentifier->currentIndex(), 0 );
++    return index.data( Qt::UserRole ).toString();
++}
+Index: applets/comic/configimg.qrc
+===================================================================
+--- applets/comic/configimg.qrc	(revision 0)
++++ applets/comic/configimg.qrc	(revision 739687)
+@@ -0,0 +1,9 @@
++<!DOCTYPE RCC><RCC version="1.0">
++<qresource>
++ <file alias="dilbert.png">pics/dilbert.png</file>
++ <file alias="garfield.png">pics/garfield.png</file>
++ <file alias="snoopy.png">pics/snoopy.png</file>
++ <file alias="userfriendly.png">pics/userfriendly.png</file>
++ <file alias="xkcd.png">pics/xkcd.png</file>
++</qresource>
++</RCC>
+Index: applets/comic/comic.cpp
+===================================================================
+--- applets/comic/comic.cpp	(revision 0)
++++ applets/comic/comic.cpp	(revision 739687)
+@@ -0,0 +1,182 @@
++/***************************************************************************
++ *   Copyright (C) 2007 by Tobias Koenig <tokoe at kde.org>                   *
++ *                                                                         *
++ *   This program is free software; you can redistribute it and/or modify  *
++ *   it under the terms of the GNU General Public License as published by  *
++ *   the Free Software Foundation; either version 2 of the License, or     *
++ *   (at your option) any later version.                                   *
++ *                                                                         *
++ *   This program 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 General Public License for more details.                          *
++ *                                                                         *
++ *   You should have received a copy of the GNU General Public License     *
++ *   along with this program; if not, write to the                         *
++ *   Free Software Foundation, Inc.,                                       *
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
++ ***************************************************************************/
++
++#include <QtGui/QGraphicsSceneMouseEvent>
++#include <QtGui/QPainter>
++
++#include "comic.h"
++#include "configdialog.h"
++
++static const int s_arrowWidth = 30;
++
++ComicApplet::ComicApplet( QObject *parent, const QVariantList &args )
++    : Plasma::Applet( parent, args ),
++      mCurrentDate( QDate::currentDate() ),
++      mConfigDialog( 0 ),
++      mShowPreviousButton( true ),
++      mShowNextButton( false )
++{
++    setHasConfigurationInterface( true );
++
++    loadConfig();
++
++    updateComic();
++    updateButtons();
++}
++
++ComicApplet::~ComicApplet()
++{
++    delete mConfigDialog;
++}
++
++void ComicApplet::dataUpdated( const QString &name, const Plasma::DataEngine::Data &data )
++{
++    prepareGeometryChange();
++    mImage = data[ name ].value<QImage>();
++    updateGeometry();
++    update();
++}
++
++void ComicApplet::showConfigurationInterface()
++{
++    if ( !mConfigDialog ) {
++        mConfigDialog = new ConfigDialog( 0 );
++        connect( mConfigDialog, SIGNAL( applyClicked() ), this, SLOT( applyConfig() ) );
++        connect( mConfigDialog, SIGNAL( okClicked() ), this, SLOT( applyConfig() ) );
++    }
++
++    mConfigDialog->setComicIdentifier( mComicIdentifier );
++
++    mConfigDialog->show();
++    mConfigDialog->raise();
++}
++
++void ComicApplet::applyConfig()
++{
++    mComicIdentifier = mConfigDialog->comicIdentifier();
++
++    saveConfig();
++
++    updateComic();
++    updateButtons();
++}
++
++void ComicApplet::loadConfig()
++{
++    KConfigGroup cg = config();
++    mComicIdentifier = cg.readEntry( "comic", "userfriendly" );
++}
++
++void ComicApplet::saveConfig()
++{
++    KConfigGroup cg = config();
++    cg.writeEntry( "comic", mComicIdentifier );
++}
++
++void ComicApplet::slotNextDay()
++{
++    mCurrentDate = mCurrentDate.addDays( 1 );
++    updateComic();
++    updateButtons();
++}
++
++void ComicApplet::slotPreviousDay()
++{
++    mCurrentDate = mCurrentDate.addDays( -1 );
++    updateComic();
++    updateButtons();
++}
++
++void ComicApplet::mousePressEvent( QGraphicsSceneMouseEvent *event )
++{
++    if ( event->button() == Qt::LeftButton ) {
++        if ( event->pos().x() < s_arrowWidth ) {
++            slotPreviousDay();
++        } else if ( mShowNextButton && event->pos().x() > contentSizeHint().width() - s_arrowWidth ) {
++            slotNextDay();
++        }
++    }
++}
++
++QSizeF ComicApplet::contentSizeHint() const
++{
++    if ( !mImage.isNull() ) {
++        const QSizeF size = mImage.size();
++        return QSizeF( size.width() + 2*s_arrowWidth, size.height() );
++    } else
++        return QSizeF( 300, 100 );
++}
++
++void ComicApplet::paintInterface( QPainter *p, const QStyleOptionGraphicsItem*, const QRect& )
++{
++    int imageWidth = ( mImage.isNull() ? 300 - 2*s_arrowWidth : mImage.width() );
++    int height = ( mImage.isNull() ? 100 : mImage.height() );
++
++    p->save();
++    p->setRenderHint( QPainter::Antialiasing );
++    if ( mShowPreviousButton ) {
++        QPolygon arrow( 3 );
++        arrow.setPoint( 0, QPoint( 3, height / 2 ) );
++        arrow.setPoint( 1, QPoint( s_arrowWidth - 5, height / 2 - 15 ) );
++        arrow.setPoint( 2, QPoint( s_arrowWidth - 5, height / 2 + 15 ) );
++
++        p->setBrush( Qt::white );
++        p->drawPolygon( arrow );
++    }
++    if ( mShowNextButton ) {
++        QPolygon arrow( 3 );
++        arrow.setPoint( 0, QPoint( s_arrowWidth + imageWidth + s_arrowWidth - 3, height / 2 ) );
++        arrow.setPoint( 1, QPoint( s_arrowWidth + imageWidth + 5, height / 2 - 15 ) );
++        arrow.setPoint( 2, QPoint( s_arrowWidth + imageWidth + 5, height / 2 + 15 ) );
++
++        p->setBrush( Qt::white );
++        p->drawPolygon( arrow );
++    }
++    p->restore();
++
++    p->drawImage( s_arrowWidth, 0, mImage );
++}
++
++void ComicApplet::updateComic()
++{
++    Plasma::DataEngine *engine = dataEngine( "comic" );
++    if ( !engine )
++        return;
++
++    const QString identifier = mComicIdentifier + ":" + mCurrentDate.toString( Qt::ISODate );
++
++    engine->disconnectSource( identifier, this );
++    engine->connectSource( identifier, this );
++
++    const Plasma::DataEngine::Data data = engine->query( identifier );
++    mImage = data[ identifier ].value<QImage>();
++
++    if ( !mImage.isNull() )
++        update();
++}
++
++void ComicApplet::updateButtons()
++{
++    if ( mCurrentDate == QDate::currentDate() )
++        mShowNextButton = false;
++    else
++        mShowNextButton = true;
++}
++
++#include "comic.moc"
+Index: applets/comic/configdialog.h
+===================================================================
+--- applets/comic/configdialog.h	(revision 0)
++++ applets/comic/configdialog.h	(revision 739687)
+@@ -0,0 +1,42 @@
++/***************************************************************************
++ *   Copyright (C) 2007 by Tobias Koenig <tokoe at kde.org>                   *
++ *                                                                         *
++ *   This program is free software; you can redistribute it and/or modify  *
++ *   it under the terms of the GNU General Public License as published by  *
++ *   the Free Software Foundation; either version 2 of the License, or     *
++ *   (at your option) any later version.                                   *
++ *                                                                         *
++ *   This program 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 General Public License for more details.                          *
++ *                                                                         *
++ *   You should have received a copy of the GNU General Public License     *
++ *   along with this program; if not, write to the                         *
++ *   Free Software Foundation, Inc.,                                       *
++ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
++ ***************************************************************************/
++
++#ifndef CONFIGDIALOG_H
++#define CONFIGDIALOG_H
++
++#include <kdialog.h>
++
++class ComicModel;
++class QComboBox;
++
++class ConfigDialog : public KDialog
++{
++    public:
++        ConfigDialog( QWidget *parent );
++        ~ConfigDialog();
++
++        void setComicIdentifier( const QString &comic );
++        QString comicIdentifier() const;
++
++    private:
++        QComboBox *mComicIdentifier;
++        ComicModel *mModel;
++};
++
++#endif
+Index: applets/comic/CMakeLists.txt
+===================================================================
+--- applets/comic/CMakeLists.txt	(revision 0)
++++ applets/comic/CMakeLists.txt	(revision 739687)
+@@ -0,0 +1,13 @@
++project(plasma-comic)
++
++set(comic_SRCS
++    comic.cpp
++    configdialog.cpp)
++
++qt4_add_resources( comic_SRCS configimg.qrc )
++
++kde4_add_plugin(plasma_applet_comic ${comic_SRCS})
++target_link_libraries(plasma_applet_comic ${KDE4_KDEUI_LIBS} ${PLASMA_LIBS})
++
++install(TARGETS plasma_applet_comic DESTINATION ${PLUGIN_INSTALL_DIR})
++install(FILES plasma-comic-default.desktop DESTINATION ${SERVICES_INSTALL_DIR})
+Index: applets/comic/pics/garfield.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+
+Property changes on: applets/comic/pics/garfield.png
+___________________________________________________________________
+Name: svn:mime-type
+   + application/octet-stream
+
+Index: applets/comic/pics/dilbert.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+
+Property changes on: applets/comic/pics/dilbert.png
+___________________________________________________________________
+Name: svn:mime-type
+   + application/octet-stream
+
+Index: applets/comic/pics/snoopy.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+
+Property changes on: applets/comic/pics/snoopy.png
+___________________________________________________________________
+Name: svn:mime-type
+   + application/octet-stream
+
+Index: applets/comic/pics/xkcd.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+
+Property changes on: applets/comic/pics/xkcd.png
+___________________________________________________________________
+Name: svn:mime-type
+   + application/octet-stream
+
+Index: applets/comic/pics/userfriendly.png
+===================================================================
+Cannot display: file marked as a binary type.
+svn:mime-type = application/octet-stream
+
+Property changes on: applets/comic/pics/userfriendly.png
+___________________________________________________________________
+Name: svn:mime-type
+   + application/octet-stream
+
+Index: applets/frame/plasma-frame-default.desktop
+===================================================================
+--- applets/frame/plasma-frame-default.desktop	(revision 736572)
++++ applets/frame/plasma-frame-default.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=Picture Frame
+ Name[ja]=写真フレーム
+ Name[pt]=Moldura de Imagens
+@@ -14,8 +13,8 @@
+ Comment[zh_TW]=顯示您最愛的圖片
+ Icon=image-jpeg2000
+ Type=Service
+-ServiceTypes=Plasma/Applet
+ 
++X-KDE-ServiceTypes=Plasma/Applet
+ X-KDE-Library=plasma_applet_frame
+ X-KDE-PluginInfo-Author=Anne-Marie Mahfouf
+ X-KDE-PluginInfo-Email=panel-devel at kde.org
+Index: applets/frame/frame.h
+===================================================================
+--- applets/frame/frame.h	(revision 736572)
++++ applets/frame/frame.h	(revision 739687)
+@@ -63,12 +63,6 @@
+     protected Q_SLOTS:
+ 	void dropEvent(QGraphicsSceneDragDropEvent *event);
+         void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
+-	//void dragMoveEvent(QGraphicsSceneDragDropEvent *event);
+-        void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+-        void mousePressEvent ( QGraphicsSceneMouseEvent * event );
+-        void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event );
+-        void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+-        void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+ 	void resizeEvent( QResizeEvent * );
+ 	void configAccepted();
+ 	void choosePicture(const KUrl& currentUrl);
+@@ -110,12 +104,6 @@
+ 	//Plasma::Layout *m_layout;
+ 	/// The size of the picture, it's max(width, height) that is set
+ 	int m_pixelSize;
+-	/// Rotation angle & transformation matrix
+-	int m_rotation;
+-        /// If true, the user is rotating/scaling the frame.
+-        bool m_liveTransform;
+-        int m_ltReferenceRotation;
+-        int m_ltReferencePixelSize;
+         /// Pixmap rect
+         QRect m_pixmapRect;
+         /// Pixmap rect + frame/shadow outline
+@@ -127,9 +115,6 @@
+         int m_swOutline;
+         /// Max Picture Dimension
+         static const int m_maxDimension=800;
+-        /// handles
+-        QPixmap m_handle1;
+-        Plasma::Phase::AnimId m_handle1AnimId;
+         /// Utility functions
+         double angleForPos(QPointF in);
+         double distanceForPos(QPointF in);
+Index: applets/frame/frame.cpp
+===================================================================
+--- applets/frame/frame.cpp	(revision 736572)
++++ applets/frame/frame.cpp	(revision 739687)
+@@ -51,7 +51,7 @@
+ #include <kurl.h>
+ #include <QPicture>
+ #include <plasma/dataenginemanager.h>
+-#include <plasma/widgets/vboxlayout.h>
++#include <plasma/layouts/vboxlayout.h>
+ #include <plasma/phase.h>
+ #include <plasma/theme.h>
+ #include "math.h"
+@@ -59,8 +59,7 @@
+ 
+ Frame::Frame(QObject *parent, const QVariantList &args)
+     : Plasma::Applet(parent, args), 
+-      m_dialog(0),
+-      m_liveTransform(false)
++      m_dialog(0)
+ {
+     setHasConfigurationInterface(true);
+     setAcceptDrops(true);
+@@ -70,7 +69,6 @@
+     m_dialog = 0;
+     m_slideNumber = 0;
+     m_skipPaint = 0;
+-    m_handle1AnimId = 0;
+     // Get config values
+     KConfigGroup cg = config();
+     m_frameColor = cg.readEntry("frameColor", QColor(70, 90, 130));
+@@ -79,23 +77,15 @@
+     m_squareCorners = cg.readEntry("squareCorners", true);
+     m_roundCorners = cg.readEntry("roundCorners", false);
+     m_pixelSize = cg.readEntry("size", 350);
+-    m_rotation = cg.readEntry("rotation",0);
+     m_slideShow = cg.readEntry("slideshow", false);
+     m_slideShowUrl = cg.readEntry("slideshow url");
+     m_slideshowTime = cg.readEntry("slideshow time", 10); // default to 10 seconds
+     m_currentUrl = cg.readEntry("url", "default");
+-    /*/ m_layout is unused for now.
+-    m_layout = new Plasma::VBoxLayout(0);
+-    m_layout->setGeometry(QRectF(0, 0, 400, 800));
+-    m_layout->setMargin(12);*/
+  
+     //Frame & Shadow dimensions
+     m_frameOutline = 8;
+     m_swOutline = 8;
+ 
+-    //Initialize handles
+-    m_handle1 = KIcon("transform-rotate").pixmap(32,32);
+-
+     //Initialize the slideshow timer
+     slideShowTimer = new QTimer(this);
+     connect(slideShowTimer, SIGNAL(timeout()), this, SLOT(setSlideShow()));
+@@ -244,7 +234,6 @@
+     m_shadow = ui.shadowCheckBox->isChecked();
+     cg.writeEntry("shadow", m_shadow);
+     cg.writeEntry("size", m_pixelSize);
+-    cg.writeEntry("rotation", m_rotation);
+     m_squareCorners = ui.squareButton->isChecked();
+     cg.writeEntry("squareCorners", m_squareCorners);
+     m_roundCorners = ui.roundButton->isChecked();
+@@ -275,16 +264,6 @@
+ 
+ QRectF Frame::boundingRect() const
+ {
+-    // return m_layout->geometry();
+-    if (m_liveTransform) {
+-        //If the user is transforming the picture, this set the bouding rect to the widest area
+-        //So we don't need to call prepareGeometryChange each mouse movement.
+-        QSize tmp = myPicture.size();
+-        tmp.scale(m_maxDimension,m_maxDimension,Qt::KeepAspectRatio);
+-        tmp+=QSize(2*(m_swOutline+m_frameOutline),2*(m_swOutline+m_frameOutline));
+-        qreal diagonal = sqrt(tmp.width()*tmp.width()+tmp.height()*tmp.height());
+-        return QRectF(-diagonal/2,-diagonal/2,diagonal,diagonal);
+-    }
+     return m_boundingRect;
+ }
+ 
+@@ -368,8 +347,8 @@
+     framePath.addRoundRect(frameRect, roundingFactor);
+ 
+     p->save();
+-    p->setRenderHint(QPainter::SmoothPixmapTransform, !m_liveTransform); 
+-    p->setRenderHint(QPainter::Antialiasing,!m_liveTransform); 
++    p->setRenderHint(QPainter::SmoothPixmapTransform, true); 
++    p->setRenderHint(QPainter::Antialiasing,true); 
+ 
+     //If we draw on the pixmap, we can't use negative coordinates, so ...
+     if (painter==NULL) {
+@@ -377,11 +356,11 @@
+ 	}
+     
+     //Rotation
+-    p->rotate(m_rotation);
++    p->rotate(0);
+ 
+     //Shadow 
+     //TODO faster. I'd like to use it on liveTransform.
+-    if (m_shadow && !m_liveTransform) {
++    if (m_shadow) {
+         p->setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap,Qt::RoundJoin));
+         p->setBrush(Qt::NoBrush);
+         for (int i = 0; i <= m_swOutline; i+=1) {
+@@ -434,22 +413,8 @@
+ void Frame::paintInterface(QPainter *p, const QStyleOptionGraphicsItem *option, const QRect &contentsRect)
+ {
+     Q_UNUSED(option);
+- 
+-    if (m_liveTransform) {
+-        //if true draw directly  
+-        composePicture(p);
+-    }
+-    else {
+-        //draw the cached pixmap
+-        p->drawPixmap (m_boundingRect.x(),m_boundingRect.y(), *m_cmpPicture);
+-    }
+ 
+-    if (m_handle1AnimId) {
+-        p->setRenderHint(QPainter::SmoothPixmapTransform, !m_liveTransform); 
+-        p->rotate(m_rotation);
+-        QPoint pos = QPoint(m_pixmapRect.right()-32,m_pixmapRect.bottom()-32);
+-        p->drawPixmap(pos.x(), pos.y(), Plasma::Phase::self()->animationResult(m_handle1AnimId));
+-    }
++    p->drawPixmap (m_boundingRect.x(),m_boundingRect.y(), *m_cmpPicture);
+ }
+ 	
+ double Frame::angleForPos(QPointF in)
+@@ -487,100 +452,9 @@
+ QPolygon Frame::mapToPicture(const QPolygon in) const
+ {
+     QMatrix matrix;
+-    matrix.rotate(m_rotation);
++    matrix.rotate(0);
+     return matrix.map(in);
+ }
+ 
+-void Frame::mousePressEvent ( QGraphicsSceneMouseEvent * event ) 
+-{
+ 
+-
+-    //Start the live transformation mode if the user clicks on bottom right corner
+-    QPolygon activeArea = QPolygon(QRect(m_pixmapRect.right() - 32, m_pixmapRect.bottom() - 32, 32,32));
+-
+-    activeArea = mapToPicture(activeArea);
+-
+-    if ((event->button() ==  Qt::LeftButton) && (activeArea.containsPoint(event->pos().toPoint(),Qt::OddEvenFill)))
+-    {
+-        m_liveTransform = true;
+-        m_ltReferenceRotation = m_rotation;
+-        m_ltReferencePixelSize = m_pixelSize;
+-    }
+-
+-}
+-
+-void Frame::mouseReleaseEvent ( QGraphicsSceneMouseEvent * event )
+-{
+-    if (!m_liveTransform) {
+-        return QGraphicsItem::mouseReleaseEvent(event);
+-    }
+-    //Exit from live transformation mode and store the changes
+-    m_liveTransform = false;
+-    //If the rotation is small is set to zero
+-    m_rotation = m_rotation%360;
+-    if (m_rotation < 5 && m_rotation > -5) {
+-        m_rotation = 0;
+-    }
+-    KConfigGroup cg = config();
+-    cg.writeEntry("rotation", m_rotation);
+-    cg.writeEntry("size", m_pixelSize);
+-    cg.config()->sync();
+-    updateSizes();
+-    composePicture(); //Cache the composed & transformed pixmap.
+-    update();
+-}
+-
+-void Frame::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
+-{
+-    Q_UNUSED(event);
+-    m_handle1AnimId = Plasma::Phase::self()->animateElement(this, Plasma::Phase::ElementAppear);
+-    Plasma::Phase::self()->setAnimationPixmap(m_handle1AnimId, m_handle1);
+-}
+-
+-void Frame::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
+-{
+-    Q_UNUSED(event);
+-    
+-    if (m_handle1AnimId) {
+-        m_handle1AnimId = Plasma::Phase::self()->animateElement(this, Plasma::Phase::ElementDisappear);
+-        Plasma::Phase::self()->setAnimationPixmap(m_handle1AnimId, m_handle1);
+-    }
+-}
+-void Frame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+-{
+-
+-    if (!m_liveTransform) {
+-        return QGraphicsItem::mouseMoveEvent(event);
+-    }
+-    //The hand is faster than the eye. So we skip some mouse movements ^^''
+-    if (m_skipPaint != 4){
+-        m_skipPaint++;
+-        return;
+-    } 
+-    else {
+-      m_skipPaint = 0;
+-    }
+-
+-    // Map the original button-down position back to local coordinates.
+-    // Since transformations aren't done by setTransform(), it is redundant now, 
+-    // But it works anyway and could be useful in the future.
+-    QPointF buttonDownPos = mapFromScene(event->buttonDownScenePos(Qt::LeftButton));
+-
+-    const double pi = 3.14159265;
+-    qreal oldAngle = (180 * angleForPos(buttonDownPos)) / pi;
+-    qreal newAngle = (180 * angleForPos(event->pos())) / pi;
+-    qreal scaleFactor = distanceForPos(event->pos()) /  distanceForPos(buttonDownPos);
+-
+-    // Determine the item's new rotation
+-    m_rotation = (int)(m_ltReferenceRotation - newAngle + oldAngle);
+-    m_pixelSize = (int) (m_ltReferencePixelSize * scaleFactor);
+-    // Don't allow to go over maxDimension
+-    if (m_pixelSize > m_maxDimension) {
+-      m_pixelSize = m_maxDimension;
+-    }
+-    // Update pixmap geometry & redraw. 
+-    updateSizes();
+-    update();
+-}
+-
+ #include "frame.moc"
+Index: applets/CMakeLists.txt
+===================================================================
+--- applets/CMakeLists.txt	(revision 736572)
++++ applets/CMakeLists.txt	(revision 739687)
+@@ -13,3 +13,4 @@
+ add_subdirectory(lancelot)
+ add_subdirectory(notes)
+ add_subdirectory(twitter)
++add_subdirectory(comic)
+Index: applets/fileWatcher/plasma-fileWatcher-default.desktop
+===================================================================
+--- applets/fileWatcher/plasma-fileWatcher-default.desktop	(revision 736572)
++++ applets/fileWatcher/plasma-fileWatcher-default.desktop	(revision 739687)
+@@ -1,5 +1,4 @@
+ [Desktop Entry]
+-Encoding=UTF-8
+ Name=File Watcher
+ Name[bg]=Наблюдение на файлове
+ Name[de]=Dateibetrachter
+@@ -10,7 +9,7 @@
+ Name[pt_BR]=Vigilante de Ficheiros
+ Name[sv]=Filövervakning
+ Type=Service
+-ServiceTypes=Plasma/Applet
++X-KDE-ServiceTypes=Plasma/Applet
+ Icon=application-octet-stream
+ 
+ X-KDE-Library=plasma_applet_fileWatcher
+Index: applets/fileWatcher/fileWatcher.h
+===================================================================
+--- applets/fileWatcher/fileWatcher.h	(revision 736572)
++++ applets/fileWatcher/fileWatcher.h	(revision 739687)
+@@ -29,7 +29,7 @@
+ 
+ #include <plasma/applet.h>
+ #include <plasma/widgets/pushbutton.h>
+-#include <plasma/widgets/boxlayout.h>
++#include <plasma/layouts/boxlayout.h>
+ 
+ #include "fileWatcherConfig.h"
+ 

Added: branches/kde4/packages/extragear-plasma/debian/patches/series
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/patches/series	                        (rev 0)
+++ branches/kde4/packages/extragear-plasma/debian/patches/series	2007-11-21 19:11:20 UTC (rev 8017)
@@ -0,0 +1 @@
+01_r739662.diff -p0

Modified: branches/kde4/packages/extragear-plasma/debian/rules
===================================================================
--- branches/kde4/packages/extragear-plasma/debian/rules	2007-11-21 19:04:50 UTC (rev 8016)
+++ branches/kde4/packages/extragear-plasma/debian/rules	2007-11-21 19:11:20 UTC (rev 8017)
@@ -2,3 +2,13 @@
 
 include debian/cdbs/kde.mk
 
+makebuilddir::
+	mkdir -p applets/comic/pics/
+	uudecode -o applets/comic/pics/dilbert.png debian/img/dilbert.png.uu
+	uudecode -o applets/comic/pics/garfield.png debian/img/garfield.png.uu
+	uudecode -o applets/comic/pics/snoopy.png debian/img/snoopy.png.uu
+	uudecode -o applets/comic/pics/userfriendly.png debian/img/userfriendly.png.uu
+	uudecode -o applets/comic/pics/xkcd.png debian/img/xkcd.png.uu
+
+clean::
+	rm -rf applets/comic/pics/




More information about the pkg-kde-commits mailing list