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

List:       kde-panel-devel
Subject:    Re: Comic dataengine
From:       Matthias Fuchs <mat69 () gmx ! net>
Date:       2008-08-21 0:09:15
Message-ID: 48ACB22B.5020201 () gmx ! net
[Download RAW message or body]

Thank you for your answer Aaron, that helped me a lot. :)

I'm a Qt and KDE coding newbie, so could someone of you please look at 
my code and comit -- I have no svn account -- it if everything is alright?

I also attached the correspondence I had with the creator of "Shit 
Happens!" as you (Aaron) suggested in another thread on this topic.


["shithappens.patch" (text/plain)]

Index: shithappensprovider.cpp
===================================================================
--- shithappensprovider.cpp	(Revision 0)
+++ shithappensprovider.cpp	(Revision 0)
@@ -0,0 +1,204 @@
+/*
+*   Copyright (C) 2008 Matthias Fuchs <mat69@gmx.net>
+*
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU Library General Public License as
+*   published by the Free Software Foundation; either version 2, 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 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/QRegExp>
+#include <QtGui/QPainter>
+#include <QtGui/QImage>
+#include <QtNetwork/QHttp>
+
+#include <KUrl>
+#include <KStandardDirs>
+
+#include "shithappensprovider.h"
+
+COMICPROVIDER_EXPORT_PLUGIN( ShitHappensProvider, "ShitHappensProvider", "" )
+
+class ShitHappensProvider::Private
+{
+    public:
+        Private( ShitHappensProvider *parent )
+        : mParent( parent ), mGotMaxId ( false )
+        {
+            mHttp = new QHttp( "ruthe.com", 80, mParent );
+            connect( mHttp, SIGNAL( done( bool ) ), mParent, SLOT( \
pageRequestFinished( bool ) ) ); +        }
+        
+        void pageRequestFinished( bool );
+        void imageRequestFinished( bool );
+        
+        ShitHappensProvider *mParent;
+        QImage mImage;
+        int mRequestedId;
+        int mMaxId;
+        int mModifiedId;
+        bool mGotMaxId;
+        
+        QHttp *mHttp;
+        QHttp *mImageHttp;
+};
+
+void ShitHappensProvider::Private::pageRequestFinished( bool err )
+{
+    if ( err ) {
+        emit mParent->error( mParent );
+        return;
+    }
+    
+    const QString data = QString::fromUtf8( mHttp->readAll() );
+    
+    KUrl url;
+    
+    if (!mGotMaxId) {
+        QRegExp expMaxId( "\\b\\w+\\b (\\d+)/(\\d+)" );
+        const int pos = expMaxId.indexIn( data );
+        
+        if (pos > -1) {
+            mMaxId = expMaxId.cap( 2 ).toInt();
+            mGotMaxId = true;
+            mParent->setWebsiteHttp();
+            return;
+        } else {
+            emit mParent->error( mParent );
+            return;
+        }
+    } else {
+        QRegExp exp( "<img \
src=\"albums/userpics/(\\d+)/normal_strip_(\\d+)(\\S*\\d*)\\.jpg\"" ); +        const \
int pos = exp.indexIn( data ); +        
+        if (pos > -1) {
+            url = KUrl( QString( \
"http://ruthe.de/gallery/cpg1410/albums/userpics/%1/strip_%2%3.jpg" ) +            \
.arg( exp.cap( 1 ) ).arg( exp.cap( 2 ) ).arg( exp.cap( 3 ) ) ); +        } else {
+            url = KUrl( QString( "http://ruthe.de/bilder/shit_happens_header.gif" ) \
); +        }
+    }
+    
+    mImageHttp = new QHttp( "ruthe.de", 80, mParent );
+    mImageHttp->setHost( url.host() );
+    mImageHttp->get( url.path() );
+    
+    mParent->connect( mImageHttp, SIGNAL( done( bool ) ), mParent, SLOT( \
imageRequestFinished( bool ) ) ); +    
+}
+
+void ShitHappensProvider::Private::imageRequestFinished( bool error )
+{
+    if ( error ) {
+        emit mParent->error( mParent );
+        return;
+    }
+    
+    QString headerRelLoc( "plasma-comic/plasma_comic_shithappens-header.png" );
+    QImage header( KStandardDirs::locate( "data",  headerRelLoc) );
+    QImage comic = QImage::fromData( mImageHttp->readAll() );
+    
+    int spaceTop = 8;
+    int spaceMid = 20;
+    int spaceBot = 13;
+    
+    int height = header.height() + comic.height() + spaceTop + spaceMid + spaceBot;
+    int width = ( header.width() >= comic.width() ) ? header.width() : \
comic.width(); +
+    mImage = QImage( QSize(width, height), QImage::Format_RGB32 );
+    mImage.fill( header.pixel( QPoint( 0, 0 ) ) );
+    
+    QPainter painter( &mImage );
+    
+    //center and draw the Images
+    QPoint headerPos( ( ( width - header.width() ) / 2 ), spaceTop );
+    QPoint comicPos( ( ( width - comic.width() ) / 2 ), spaceTop + header.height() + \
spaceMid ); +    painter.drawImage( headerPos, header );
+    painter.drawImage( comicPos, comic );
+
+    emit mParent->finished( mParent );
+}
+
+ShitHappensProvider::ShitHappensProvider( QObject *parent, const QVariantList &args \
) +: ComicProvider( parent, args ), d( new Private( this ) )
+{
+    d->mRequestedId = requestedNumber();
+    
+    setWebsiteHttp();
+}
+
+void ShitHappensProvider::setWebsiteHttp()
+{
+    KUrl url ( QString( "http://ruthe.de/" ) );
+
+    if ( d->mGotMaxId ) {
+        if ( ( d->mRequestedId < 1 ) || ( d->mRequestedId > d->mMaxId ) ) {
+            d->mRequestedId = d->mMaxId;
+        }
+        
+        d->mModifiedId = d->mMaxId - d->mRequestedId;
+        
+        url.setPath( QString( "/gallery/cpg1410/displayimage.php?album=4&pos=%1" )
+        .arg( d->mModifiedId ) );
+    } else {
+        url.setPath( QString( "/gallery/cpg1410/displayimage.php?album=4&pos=0" ) );
+    }
+    
+    d->mHttp->setHost( url.host() );
+    d->mHttp->get( url.path() );
+}
+
+ShitHappensProvider::~ShitHappensProvider()
+{
+    delete d;
+}
+
+ComicProvider::IdentifierType ShitHappensProvider::identifierType() const
+{
+    return NumberIdentifier;
+}
+
+QImage ShitHappensProvider::image() const
+{
+    return d->mImage;
+}
+
+QString ShitHappensProvider::identifier() const
+{
+    return QString( "shithappens:%1" ).arg( d->mRequestedId );
+}
+
+KUrl ShitHappensProvider::websiteUrl() const
+{
+    return QString( "http://www.ruthe.de/" );
+}
+
+QString ShitHappensProvider::nextIdentifier() const
+{
+    if ( d->mRequestedId < d->mMaxId ) {
+        return QString::number( d->mRequestedId + 1 );
+    } else {
+        return QString();
+    }
+}
+
+QString ShitHappensProvider::previousIdentifier() const
+{
+    if ( d->mRequestedId > 1 ) {
+        return QString::number( d->mRequestedId - 1 );
+    } else {
+        return QString();
+    }
+}
+
+#include "shithappensprovider.moc"
Index: pics/plasma_comic_shithappens.png
===================================================================
Kann nicht anzeigen: Dateityp ist als binär angegeben.
svn:mime-type = application/octet-stream

Eigenschaftsänderungen: pics/plasma_comic_shithappens.png
___________________________________________________________________
Hinzugefügt: svn:mime-type
   + application/octet-stream

Index: pics/plasma_comic_shithappens-header.png
===================================================================
Kann nicht anzeigen: Dateityp ist als binär angegeben.
svn:mime-type = application/octet-stream

Eigenschaftsänderungen: pics/plasma_comic_shithappens-header.png
___________________________________________________________________
Hinzugefügt: svn:mime-type
   + application/octet-stream

Index: shithappensprovider.desktop
===================================================================
--- shithappensprovider.desktop	(Revision 0)
+++ shithappensprovider.desktop	(Revision 0)
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Type=Service
+X-KDE-ServiceTypes=PlasmaComic/Plugin
+X-KDE-Library=plasma_comic_shithappensprovider
+X-KDE-PlasmaComicProvider-SuffixType=Number
+X-KDE-PlasmaComicProvider-Identifier=shithappens
+Icon=plasma_comic_shithappens
+
+Name=Shit Happens!
Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(Revision 849897)
+++ CMakeLists.txt	(Arbeitskopie)
@@ -108,3 +108,16 @@
 install( TARGETS plasma_comic_phdprovider DESTINATION ${PLUGIN_INSTALL_DIR} )
 install( FILES phdprovider.desktop DESTINATION ${SERVICES_INSTALL_DIR} )
 install( FILES pics/plasma_comic_phd.png DESTINATION \
${DATA_INSTALL_DIR}/plasma-comic ) +
+### next ####
+
+set( comic_shithappens_provider_SRCS
+shithappensprovider.cpp
+)
+
+kde4_add_plugin( plasma_comic_shithappensprovider ${comic_shithappens_provider_SRCS} \
) +target_link_libraries( plasma_comic_shithappensprovider plasmacomicprovidercore \
${KDE4_SYNDICATION_LIBS} ) +install( TARGETS plasma_comic_shithappensprovider \
DESTINATION ${PLUGIN_INSTALL_DIR} ) +install( FILES shithappensprovider.desktop \
DESTINATION ${SERVICES_INSTALL_DIR} ) +install( FILES \
pics/plasma_comic_shithappens.png DESTINATION ${DATA_INSTALL_DIR}/plasma-comic ) \
+install( FILES pics/plasma_comic_shithappens-header.png DESTINATION \
                ${DATA_INSTALL_DIR}/plasma-comic )
Index: shithappensprovider.h
===================================================================
--- shithappensprovider.h	(Revision 0)
+++ shithappensprovider.h	(Revision 0)
@@ -0,0 +1,94 @@
+/*
+*   Copyright (C) 2008 Matthias Fuchs <mat69@gmx.net>
+*
+*   This program is free software; you can redistribute it and/or modify
+*   it under the terms of the GNU Library General Public License as
+*   published by the Free Software Foundation; either version 2, 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 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 SHITHAPPENSPROVIDER_H
+#define SHITHAPPENSPROVIDER_H
+
+#include "comicprovider.h"
+
+/**
+* This class provides the comic strip image for http://ruthe.de.
+*/
+class ShitHappensProvider : public ComicProvider
+{
+    Q_OBJECT
+    
+    public:
+        
+        /**
+        * Creates a new ShitHappens provider.
+        *
+        * @param parent The parent object.
+        */
+        ShitHappensProvider( QObject *parent, const QVariantList& );
+        
+        /**
+        * Destroys the ctrl+alt+del provider.
+        */
+        ~ShitHappensProvider();
+        
+        /**
+        * Sets the Http to the Website of the comic (either a concrete
+        * date exluding the currentDate or a generic Url)
+        */
+        void setWebsiteHttp();
+        
+        /**
+        * Returns the identifier type.
+        */
+        IdentifierType identifierType() const;
+        
+        /**
+        * 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 the website of the comic.
+        */
+        virtual KUrl websiteUrl() const;
+        
+        /**
+        * Returns the identifier of the next comic.
+        */
+        virtual QString nextIdentifier() const;
+        
+        /**
+        * Returns the identifier of the previous comic.
+        */
+        virtual QString previousIdentifier() const;
+        
+        
+    private:
+        class Private;
+        Private* const d;
+        
+        Q_PRIVATE_SLOT( d, void pageRequestFinished( bool ) )
+        Q_PRIVATE_SLOT( d, void imageRequestFinished( bool ) )
+};
+
+#endif


["AW: AW: Programm zum Anzeigen von Shit Happens!.eml" (message/rfc822)]

X-Account-Key: account4
X-Mozilla-Keys:
Return-Path: <ruthe@ruthe.de>
X-Flags: 0000
Delivered-To: GMX delivery to mat69@gmx.net
Received: (qmail invoked by alias); 20 Aug 2008 00:33:34 -0000
Received: from moutng.kundenserver.de (EHLO moutng.kundenserver.de) [212.227.126.187]
  by mx0.gmx.net (mx032) with SMTP; 20 Aug 2008 02:33:34 +0200
Received: from ralphlaptop (p5B0526DF.dip0.t-ipconnect.de [91.5.38.223])
	by mrelayeu.kundenserver.de (node=mrelayeu2) with ESMTP (Nemesis)
	id 0MKwtQ-1KVbdm0UE6-0005HV; Wed, 20 Aug 2008 02:33:34 +0200
From: "Ralph Ruthe" <ruthe@ruthe.de>
To: "'Matthias Fuchs'" <mat69@gmx.net>
Subject: AW: AW: Programm zum Anzeigen von Shit Happens!
Date: Wed, 20 Aug 2008 02:33:33 +0200
Message-ID: <009201c9025c$60a40ae0$0800a8c0@ralphlaptop>
MIME-Version: 1.0
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
X-Mailer: Microsoft Office Outlook 11
In-Reply-To: <48AB62C5.9090102@gmx.net>
Thread-Index: AckCWjxfAqirkQhiQ8GYkpNg1VZtVAAAG3mw
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3350
X-GMX-Antivirus: -1 (not scanned, may not use virus scanner)
X-GMX-Htest: 0.47
X-GMX-Antispam: 0 (Mail was not recognized as spam)
X-GMX-UID: ZlSYfD4WX1VpWtcl7mFy5/p3SDc4NAwh

Dann solltest du mal sehen, wie schnell ich antworte, wenn ich SOFORT
kapiere, worums geht! :-)

Doof an solchen Programmen finde ich immer ein bisschen, dass die Cartoons
so völlig von ihrer Heimat (nämlich meiner Seite) losgelöst werden. Die 
Leute konsumieren den Kram einfach nur und wissen gar nichts mehr über den
Künstler, was sie (wie du) aber täten, wenn sie die Gags auf meiner Seite
lesen würden.

Andererseits:
wenn ihnen die Sachen gefallen, werden sie sich wahrscheinloch doch mal
informieren, woher diese Shit-happpens-Cartoons denn wohl kommen. 
Also will ich mal glauben, dass es so sein wird und mir was bringt.

Ach so, das wollte ich noch sagen: es wäre mir wichtig, dass du den
"SHIT HAPPENS!"-Schriftzug oben drüber sichtbar machst. Damit die Leute
wenigstens wissen, wie der Comic heißt, den sie da lesen. Okay?

Danke und gute Nacht,
Ralph



-----Ursprüngliche Nachricht-----
Von: Matthias Fuchs [mailto:mat69@gmx.net] 
Gesendet: Mittwoch, 20. August 2008 02:18
An: Ralph Ruthe
Betreff: Re: AW: Programm zum Anzeigen von Shit Happens!

Hallo Ralph,

Wahnsinn, danke für die schnelle Antwort! :)

Im Prinzip geht es nur darum, dass man sich deine Comics auf seinem 
Rechner -- also nicht auf irgendeiner Homepage -- anzeigen kann ohne 
deine Homepage jeden Tag oder alle paar Stunden anklicken zu müssen d.h. 
man sieht immer das gerade aktuelle Comic und halt auch die vorherigen 
wenn man sich durchklickt.
Derzeit zeigt dieses Programm für Linux nur Comics a la Garfield und 
anderes englisches Zeugs an und das möchte ich gerne ändern.

Natürlich werden die Comics inhaltlich nicht geändert --> da könnte man 
ja gleich eigene erstellen, wenns von mir käme wohl weniger lustige vom 
zeichnerischen gar nicht erst zu sprechen ...
Es geht wie du gemeint hast um die Bequemlichkeit und auch darum ein 
paar Leuten mehr (so viele verwenden nun auch nicht Linux und können 
deutsch) deine Comics bekannt zu machen.

lg und nochmals danke für die schnelle und unkomplizierte Antwort. :)
Matthias

Ralph Ruthe schrieb:
> Hallo Matthias!
> 
> Zunächst mal: gerne "du".
> Freut mich, dass dir meine Cartoons so gut gefallen!
> Immer schön zu hören! 
> 
> Zu deinem Anliegen:
> ich habe ehrlich gesagt nur wenig von dem verstanden, was du mir
> geschrieben hast und bin mir auch nicht 100% sicher, wofür das gut 
> sein soll. (Vermutlich für ein bequemeres Lesen?) Leider fehlt mir 
> auch die Zeit, um mich so lange damit auseinander zu setzen, bis 
> ich es begriffen habe.
> 
> Aber um es kurz zu machen:
> solange durch deinen Code keine meiner Cartoons inhaltlich
> verändert werden und solange dadurch nicht auf irgendeiner anderen
> Seite übermäßig viele (mehr als 10) meiner Cartoons virtuell zur Verfügung

> gestellt werden (zudem noch auf einer Seite, auf der durch Banner o. ä.
mit
> meinem Inhalt dann Geld verdient wird), also solange der ganze Spaß
> eigentlich
> nur dazu dient, dass Leute sich auf ihrem privaten Rechner mit meinem 
> Kram eine Art bequemes Spielzeug einrichten, solange habe ich damit 
> ganz sicher kein Problem.
> 
> Hau rein und viel Spaß! 
> 
> Liebe Grüße,
> Ralph Ruthe
> 
> 
> 
> 
> -----Ursprüngliche Nachricht-----
> Von: Matthias Fuchs [mailto:mat69@gmx.net] 
> Gesendet: Dienstag, 19. August 2008 14:10
> An: ruthe@ruthe.de
> Betreff: Programm zum Anzeigen von Shit Happens!
> 
> Hallo,
> 
> Ich "lese" sehr gerne Deine/Ihre (bei E-Mails bin ich mir nie über die 
> Anrede sicher) Comics.
> Da "Shit Happens!" nicht vom Comic Plasmoid [1] für KDE 4 [2] angezeigt 
> wird habe ich selbst für mich eine Dataengine -- was das ist erkläre ich 
> kurz weiter unten -- geschrieben, die die Unterstützung nachliefert.
> 
> Bevor ich aber den Code für die Unterstützung von "Shit Happens!" der 
> Öffentlichkeit unter der GPL [3] zugänglich mache wollte ich wissen ob 
> ich das darf. Schließlich ist das ja nicht mein Comic.
> 
> 
> Jetzt kurz zum Funktionsprinzip: Das Comic-Plasmoid kann alle Comics auf 
> dem Desktop anzeigen für die eine Dataengine geschrieben wurde. 
> Dataengines stellen verschiedene "Dinge" zur Verfügung. So gibt es 
> welche für die Uhrzeit und in diesem Fall Comics. Auf Dataengines können 
> Programme bei Bedarf zugreifen, so wie es das Comic Plasmoid macht.
> 
> Der von mir geschriebene Code lehnt sich an den schon vorhandenen für 
> andere Comics an und basiert teilweise auf diesem.
> Die "Shit Happens!" Dataengine liefert das aktuelle Comic bzw. das Comic 
> mit einer bestimmten Nummer (z.B. "shithappens:768", das erste Comic hat 
> die Nummer 1, das gerade aktuelle die Nummer 770) und damit sie nicht 
> jedesmal neu heruntergeladen werden müssen speichert es die schon 
> betrachteten auf der Festplatte.
> Darüber hinaus bietet es die Nummer des vorherigen und des 
> darauffolgenden Comics und einen Link zur Website des Comics an. Das 
> "favicon" vom jeweiligen Comic, in diesem Fall von "Shit Happens!", ist 
> auch auf der Festplatte gespeichert.
> 
> Auf diesem Bild sieht man das Comic Plasmoid. [4]
> 
> 
> Darf ich den Code und das favicon für die "Shit Happens!"-Unterstützung 
> veröffentlichen?
> Sollten Fragen offen sein beantworte ich diese gerne, ich kann auch den 
> Code schicken.
> 
> 
> 
> mfg und danke für Shit Happens!
> Matthias Fuchs
> 
> 
> PS.: Tut mir leid für die lange Mail.
> 
> [1] ein kleines Programm zum Darstellen von Comics auf dem Desktop
> [2] eine freie Desktop-Umgebung für Linux und andere Betriebssysteme 
> (Windows und Mac OS X werden derzeit nicht vollständig unterstützt) 
> http://de.wikipedia.org/wiki/Kde
> [3] eine Lizenz für freie Software http://de.wikipedia.org/wiki/Gpl
> [4] http://img180.imageshack.us/my.php?image=shithappensyb9.jpg
> 



_______________________________________________
Plasma-devel mailing list
Plasma-devel@kde.org
https://mail.kde.org/mailman/listinfo/plasma-devel


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

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