Fortgeschrittenes Basteln
Plasmoiden für KDE 4 programmieren
In Bewegung
Plasma bietet dem Anwender im Idealfall ein organisches Benutzer-Interface an, auf dem sich Objekte so verhalten, wie der Benutzer es erwartet und wie sein Gehirn es aus der Natur kennt. Animationen sollen ihm dabei visuelle Hinweise geben, denn das menschliche Gehirn kommt mit kurzen Bewegungen besser klar, als mit abrupten Änderungen. Um die Benutzer nicht abzulenken, sollten sich Plasmoiden daher ruhig verhalten, solange sie nicht den Fokus besitzen.
Animationen in Plasma benutzen die Klasse Plasma::Animator. Diese stellt eine Zeitachse bereit, indem sie in bestimmten Abständen eine definierte Funktion aufruft und das Plasmoid neu zeichnet. Das Beispiel benutzt diese Phase, um den gezeichneten Bildschirm des Plasmoids zur Mitte hin zu verkleinern. Das erzeugt einen Ausschalteffekt, wie bei einem alten Fernseher. Genügt der Platz auf dem Desktop, blendet das Plasmoid zugleich den Namen des USB-Sticks weich ein.
Sobald ein Anwender einen USB-Stick einsteckt, startet das Applet über die Methode showScreen() die Animation, die in regelmäßigen Abständen die Methode animationUpdate() des Applets aufruft. Dabei speichert es die ID, um sie im weiteren Verlauf zu kontrollieren. (Listing 9)
// drade.cpp, Zeile 148 m_animId = Plasma::Animator::self()->customAnimation(40 / (1000 / m_animDuration), m_animDuration, Plasma::Animator::EaseInCurve, this, "animationUpdate");
Als Parameter übergeben Sie Plasma::Animator die Anzahl der Bilder, die Länge der Animation, die Kurvenform, das Empfänger-Widget für die Updates und die aufzurufende Methode. Die Zahl der Bilder errechnen Sie, indem Sie von 25 Bildern pro Sekunde ausgehen, was einem Bild pro 40 Millisekunden entspricht. Die Dauer der Animation wählen Sie zwischen 150 und 300 Millisekunden – länger andauernde Animationen empfinden Benutzer mitunter als störend. Als Kurvenform kommt die EaseInCurve zum Einsatz, die dafür sorgt, dass sich die Geschwindigkeit am Anfang schnell erhöht und danach langsam abbremst. Lineare Kurven wie LinearCurve fühlen sich häufig hölzern und statisch an.
Die Methode animationUpdate() bekommt dann wiederum eine Variable vom Typ Qreal namens progress mit auf den Weg (Listing 10), die verrät, wie weit die Animation fortgeschritten ist. Anhand der Boolschen Member-Variable m_fadeIn merkt sich Plasma, ob es die zu animierende Grafik gerade ein- oder ausblendet.
// drade.cpp, Zeilen 209 bis 220
void DrAde::animationUpdate(qreal progress)
{
if (progress == 1) {
m_animId = -1;
}
if (!m_fadeIn) {
m_animProgress = 1 - progress;
} else {
m_animProgress = progress;
}
update();
}
Die Variable progress pendelt dabei immer zwischen 0 (am Anfang der Animation) und 1 (am Ende). Für den Ausblendeffekt invertieren Sie den Wert einfach, sodass er kleiner wird. Die Member-Variable m_animProgress speichert den Status der Animation im Plasmoid und sorgt dafür, dass Plasma es mit Unterstützung der Methode paintInterface() neu zeichnet (drade.cpp, Zeile 235), was dann so aussieht:
m_svg->paint(p, scaleRectF(m_animProgress, contentsRect), "Screen");
Durch diesen Aufruf zeichnet Plasma das SVG-Element Screen in der durch die Animation vorgegebenen Größe. Die Funktion scaleRectF() kommt dabei zur Hilfe: Sie rechnet Position und Größe innerhalb des Plasmoids aus. Verfügt das über eine bestimmte Mindestbreite, sorgt paintLabel() dafür, dass Plasma den Namen des USB-Sticks in einem Rechteck mit abgerundeten Ecken abbildet.
Geben Sie den Farben, mit denen Sie malen, einen bestimmten Alpha-Wert mit, blendet die Methode den Text im Takt mit der Animation des Screen-Elements weich ein. Der Wert hängt dabei vom Fortschritt der Animation ab. Die folgenden zwei Zeilen (drade.cpp, Zeile 262 und 263) erledigen dies:
boxColor.setAlphaF(0.3*m_animProgress); textColor.setAlphaF(0.8*m_animProgress);
Damit ist "Dr. Ade" nun fertig. Es fehlt noch ein letzter Schritt: Sie müssen das Applet kompilieren und so in die KDE-Trunk-Version einbinden.
Dr. Ade aktivieren
Melden Sie sich über sux - kde-devel als KDE-Entwicklungshelfer an. Wechseln Sie in das Verzeichnis /home/kde-devel/KDE/kdeplasma-addons/applets und legen Sie ein neues Verzeichnis namens drade an. Kopieren Sie sämtliche Dateien von der LinuxUser-DVD, die zu "Dr. Ade" gehören, in den neuen Ordner. Wechseln Sie ins übergeordnete Verzeichnis, öffnen Sie die Datei CMakeLists.txt mit einem Texteditor und ergänzen Sie die Zeile add_subdirectory(drade). Nach dem Speichern der Datei übersetzen Sie aus dem Verzeichnis applets heraus das Plasmoid über den Befehl cmakekde. Im Drade-Verzeichnis sollte nun ein Makefile erscheinen, das Sie mit make und make install installieren. Nach einem Neustart von KDE steht Ihnen "Dr. Ade" zu Diensten.
[1] Über Plasma: Sebastian Kügler, "Plasmische Chirurgie", LinuxUser 09/2008, S. 82, http://www.linux-user.de/ausgabe/2008/09/082/
[2] Entwicklungsumgebung für KDE 4 einrichten: Kristian Kißling, "Bleeding Edge", LinuxUser 09/2008, S. 86, http://www.linux-user.de/ausgabe/2008/09/086/
[3] Mailingliste der KDE-Anwendungsentwickler: https://mail.kde.org/mailman/listinfo/kde-devel
[4] Quellcode für "Dr. Ade": http://www.linux-user.de/Downloads/2008/10/



