File plasma.diff of Package kdebase4-workspace
Patch-rediff: rediff-plasma.sh
--- dataengines/weather/plasma-dataengine-weather.desktop
+++ dataengines/weather/plasma-dataengine-weather.desktop
@@ -29,7 +29,7 @@
Name[ml]=കാലാവസ്ഥയെക്കുറിച്ചുള്ള ഡാറ്റ നല്കുന്ന എഞ്ചിന്
Name[mr]=हवामान माहिती इंजिन
Name[nb]=Værdata-motor
-Name[nds]=Weder-Hanteerkarn
+Name[nds]=Weder-Datenkarn
Name[ne]=मौसम डेटा इन्जिन
Name[nl]=Weer (gegevensengine)
Name[nn]=Vêrdatamotor
@@ -41,8 +41,8 @@
Name[ru]=Поисковая машина погоды
Name[se]=Dálkedáhtamohtor
Name[sl]=Pogon s podatki o vremenu
-Name[sr]=мотор метеоролошких услова
-Name[sr@latin]=motor meteoroloških uslova
+Name[sr]=датомотор метеоролошких услова
+Name[sr@latin]=datomotor meteoroloških uslova
Name[sv]=Datagränssnitt för väder
Name[th]=กลไกข้อมูลพยากรณ์อากาศ
Name[tr]=Hava Durumu Veri Motoru
--- dataengines/hotplug/plasma-dataengine-hotplug.desktop
+++ dataengines/hotplug/plasma-dataengine-hotplug.desktop
@@ -25,7 +25,7 @@
Name[ml]=ഹോട്ട്പ്ലഗ് ഈവന്റ് ഡേറ്റാ എഞ്ചിന്
Name[mr]=हॉटप्लग घटना माहिती इंजिन
Name[nb]=Motor for hendelsesdata
-Name[nds]=Tokoppel-Hanteerkarn
+Name[nds]=Tokoppel-Datenkarn
Name[ne]=हटप्लग घटना डेटा इन्जिन
Name[nl]=Hotplug-gebeurtenis (gegevensengine)
Name[nn]=Datamotor for Hotplug-hendingar
@@ -37,8 +37,8 @@
Name[ru]=Поставщик данных «Подключаемые устройства»
Name[se]=Hotplug-dáhpáhusaid dáhtamohtor
Name[sl]=Pogon s podatki o priklapljanju
-Name[sr]=мотор врућег укључивања
-Name[sr@latin]=motor vrućeg uključivanja
+Name[sr]=датомотор врућег укључивања
+Name[sr@latin]=datomotor vrućeg uključivanja
Name[sv]=Datagränssnitt för inkopplingshändelse
Name[th]=กลไกข้อมูลเหตุการณ์อุปกรณ์แบบ Hot Plug
Name[tr]=Hotplug Olay Verisi Motoru
--- dataengines/dict/plasma-dataengine-dict.desktop
+++ dataengines/dict/plasma-dataengine-dict.desktop
@@ -30,7 +30,7 @@
Name[ml]=നിഘണ്ടു ഡേറ്റാ എഞ്ചിന്
Name[mr]=शब्दकोष माहिती इंजिन
Name[nb]=Ordboksdata-motor
-Name[nds]=Wöörbook-Hanteerkarn
+Name[nds]=Wöörbook-Datenkarn
Name[ne]=शब्दकोश डेटा इन्जिन
Name[nl]=Woordenboek (gegevensengine)
Name[nn]=Ordboksdatamotor
@@ -42,8 +42,8 @@
Name[ru]=Поставщик данных «Словарь»
Name[se]=Sátnegirjedáhtamohtor
Name[sl]=Podatkovni pogon za slovarje
-Name[sr]=мотор речника
-Name[sr@latin]=motor rečnika
+Name[sr]=датомотор речника
+Name[sr@latin]=datomotor rečnika
Name[sv]=Datagränssnitt för ordlista
Name[tg]=Барномаҳои луғат
Name[th]=กลไกข้อมูลพจนานุกรม
--- dataengines/filebrowser/plasma-dataengine-filebrowser.desktop
+++ dataengines/filebrowser/plasma-dataengine-filebrowser.desktop
@@ -29,7 +29,7 @@
Name[nds]=Kiekerkarn för Dateien un Ornern
Name[ne]=फाइल र डाइरेकटरी ब्राउजर इन्जिन
Name[nl]=Engine voor het bladeren door mappen en bestanden
-Name[nn]=Motor for fil- og mappelesing
+Name[nn]=Datamotor for fil- og mappelesar
Name[pa]=ਫਾਇਲ ਅਤੇ ਡਾਇਰੈਕਟਰੀ ਬਰਾਊਜ਼ਰ ਇੰਜਣ
Name[pl]=Przeglądarka plików i katalogów
Name[pt]=Motor de Navegação em Ficheiros e Pastas
@@ -79,7 +79,7 @@
Comment[nds]=Infos över Dateien un Ornern för Lüttprogrammen
Comment[ne]=प्लाज्मोइडका लागि फाइलहरू र डाइरेक्टरीहरूको बारेमा जानकारी
Comment[nl]=Informatie over bestanden en mappen voor Plasmoids
-Comment[nn]=Informasjon om filer og mapper for Plasmoidar
+Comment[nn]=Informasjon om filer og mapper for plasmoidar
Comment[pa]=ਪਲਾਜਮੋਡੀਸ ਲਈ ਫਾਇਲਾਂ ਅਤੇ ਡਾਇਰੈਕਟਰੀਆਂ ਵਾਸਤੇ ਜਾਣਕਾਰੀ
Comment[pl]=Informacje o plikach i katalogach dla plazmoidów
Comment[pt]=Informação sobre os ficheiros e pastas nos Plasmóides
--- dataengines/tasks/plasma-dataengine-tasks.desktop
+++ dataengines/tasks/plasma-dataengine-tasks.desktop
@@ -26,7 +26,7 @@
Name[ml]=ടാസ്ക് മാനേജ്മെന്റ് ഡേറ്റാ എഞ്ചിന്
Name[mr]=कार्य व्यवस्थापन माहिती इंजिन
Name[nb]=Motor for oppgavedata
-Name[nds]=Opgavenpleeg-Hanteerkarn
+Name[nds]=Opgavenpleeg-Datenkarn
Name[ne]=कार्य व्यवस्थापन डेटा इन्जिन
Name[nl]=Taakbeheer (gegevensengine)
Name[nn]=Datamotor for oppgåvestyring
@@ -38,8 +38,8 @@
Name[ru]=Поставщик данных управления заданиями
Name[se]=Bargogieđahallama dáhtamohtor
Name[sl]=Pogon s podatki o upravljanju z opravili
-Name[sr]=мотор управљања задацима
-Name[sr@latin]=motor upravljanja zadacima
+Name[sr]=датомотор управљања задацима
+Name[sr@latin]=datomotor upravljanja zadacima
Name[sv]=Datagränssnitt för aktivitetshantering
Name[th]=กลไกข้อมูลจัดการงาน
Name[tr]=Görev Yönetimi Veri Motoru
--- dataengines/nowplaying/plasma-dataengine-nowplaying.desktop
+++ dataengines/nowplaying/plasma-dataengine-nowplaying.desktop
@@ -61,7 +61,7 @@
Comment[hu]=Kiírja az éppen lejátszott zene jellemzőit
Comment[is]=Telur upp hvaða tónlist er verið að spila
Comment[it]=Mostra la musica attualmente in riproduzione
-Comment[ja]=今聴いている音楽を表示します
+Comment[ja]=今聴いているものを表示します
Comment[kk]=Қазір орындалып жатқан әуендер тізімі
Comment[km]=រាយតន្ដ្រីដែលកពុងចាក់
Comment[ko]=현재 재생 중인 음악 표시하기
--- dataengines/places/plasma-dataengine-places.desktop
+++ dataengines/places/plasma-dataengine-places.desktop
@@ -27,7 +27,7 @@
Name[ml]=സ്ഥാനങ്ങളെക്കുറിച്ചുള്ള ഡാറ്റ നല്കുന്ന എഞ്ചിന്
Name[mr]=माहिती इंजिन स्थित करतो
Name[nb]=Steder-datamotor
-Name[nds]=Steden-Hanteerkarn
+Name[nds]=Steden-Datenkarn
Name[ne]=स्थान डेटा इन्जिन
Name[nl]=Locaties (gegevensengine)
Name[nn]=Datamotor for stader
@@ -39,8 +39,8 @@
Name[ru]=Поставщик данных «Точки входа»
Name[se]=Báikedáhtamohtor
Name[sl]=Pogon s podatki o mestih
-Name[sr]=мотор местâ
-Name[sr@latin]=motor mestâ
+Name[sr]=датомотор местâ
+Name[sr@latin]=datomotor mestâ
Name[sv]=Datagränssnitt för platser
Name[th]=กลไกข้อมูลที่หลัก ๆ
Name[tr]=Konumlar Veri Motoru
--- dataengines/mouse/plasma-dataengine-mouse.desktop
+++ dataengines/mouse/plasma-dataengine-mouse.desktop
@@ -28,7 +28,7 @@
Name[ml]=മൌസ് ഡേറ്റാ എഞ്ചിന്
Name[mr]=माउस माहिती इंजिन
Name[nb]=Musedata-motor
-Name[nds]=Muus-Hanteerkarn
+Name[nds]=Muus-Datenkarn
Name[ne]=माउस डेटा इन्जिन
Name[nl]=Muis (gegevensengine)
Name[nn]=Datamotor for mus
@@ -40,8 +40,8 @@
Name[ru]=Поставщик данных мыши
Name[se]=Sáhpándáhtamohtor
Name[sl]=Pogon s podatki o miški
-Name[sr]=мотор стања миша
-Name[sr@latin]=motor stanja miša
+Name[sr]=датомотор стања миша
+Name[sr@latin]=datomotor stanja miša
Name[sv]=Datagränssnitt för mus
Name[th]=กลไกข้อมูลเมาส์
Name[tr]=Fare Veri Motoru
@@ -91,7 +91,7 @@
Comment[ro]=Date despre maus pentru plasmoizi
Comment[ru]=Данные об указателе мыши для плазмоидов
Comment[se]=Sáhpándáhtat plasmoidaide
-Comment[sl]=Podatki o miški za Plazmoide
+Comment[sl]=Podatki o miški za gradnike
Comment[sr]=Подаци о мишу за плазмоиде
Comment[sr@latin]=Podaci o mišu za plazmoide
Comment[sv]=Musdata för Plasmoider
--- dataengines/powermanagement/powermanagementengine.cpp
+++ dataengines/powermanagement/powermanagementengine.cpp
@@ -1,7 +1,8 @@
/*
- * Copyright (C) 2007 Aaron Seigo <aseigo@kde.org>
- * Copyright (C) 2007 Sebastian Kuegler <sebas@kde.org>
- * CopyRight (C) 2007 Maor Vanmak <mvanmak1@gmail.com>
+ * Copyright 2007 Aaron Seigo <aseigo@kde.org>
+ * Copyright 2007-2008 Sebastian Kuegler <sebas@kde.org>
+ * CopyRight 2007 Maor Vanmak <mvanmak1@gmail.com>
+ * Copyright 2008 Dario Freddi <drf54321@gmail.com>
*
* 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
@@ -31,15 +32,18 @@
#include <KLocale>
#include "plasma/datacontainer.h"
+#include <QtDBus/QDBusInterface>
+#include <QtDBus/QDBusReply>
PowermanagementEngine::PowermanagementEngine(QObject* parent, const QVariantList& args)
: Plasma::DataEngine(parent, args)
, m_acadapter(0)
, m_sources(0)
+ , m_dbus(QDBusConnection::sessionBus())
{
Q_UNUSED(args)
- m_sources << I18N_NOOP("Battery") << I18N_NOOP("AC Adapter") << I18N_NOOP("Sleepstates");
+ m_sources << "Battery" << "AC Adapter" << "Sleepstates" << "PowerDevil";
// This following call can be removed, but if we do, the
// data is not shown in the plasmaengineexplorer.
@@ -55,20 +59,44 @@
this, SLOT(deviceRemoved(QString)));
connect(Solid::DeviceNotifier::instance(), SIGNAL(deviceAdded(QString)),
this, SLOT(deviceAdded(QString)));
+
+ QStringList modules;
+ QDBusInterface kdedInterface("org.kde.kded", "/kded", "org.kde.kded");
+ QDBusReply<QStringList> reply = kdedInterface.call("loadedModules");
+
+ if (!reply.isValid()) {
+ return;
+ }
+
+ modules = reply.value();
+
+ if (modules.contains("powerdevil")) {
+
+ if (!m_dbus.connect("org.kde.kded", "/modules/powerdevil", "org.kde.PowerDevil",
+ "profileChanged", this,
+ SLOT(profilesChanged(const QString&, const QStringList&)))) {
+ kDebug() << "error!";
+ }
+
+ QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.kded", "/modules/powerdevil",
+ "org.kde.PowerDevil", "streamData");
+ m_dbus.call(msg);
+
+ }
}
-QStringList PowermanagementEngine::sources() const
+QStringList PowermanagementEngine::sources() const
{
return m_sources + m_batterySources.values();
}
bool PowermanagementEngine::sourceRequestEvent(const QString &name)
{
- if (name == I18N_NOOP("Battery")) {
+ if (name == "Battery") {
QList<Solid::Device> list_battery =
Solid::Device::listFromType(Solid::DeviceInterface::Battery, QString());
if (list_battery.count() == 0) {
- setData(I18N_NOOP("Battery"), I18N_NOOP("has Battery"), false);
+ setData("Battery", "has Battery", false);
return true;
}
@@ -79,31 +107,33 @@
const Solid::Battery* battery = device_battery.as<Solid::Battery>();
if(battery != 0) {
- QString source = QString(I18N_NOOP("Battery%1")).arg(index++);
+ if(battery->type() == Solid::Battery::PrimaryBattery) {
+ QString source = QString("Battery%1").arg(index++);
- battery_sources<<source;
+ battery_sources<<source;
- m_batterySources[device_battery.udi()] = source;
+ m_batterySources[device_battery.udi()] = source;
- connect(battery, SIGNAL(chargeStateChanged(int, const QString &)), this,
- SLOT(updateBatteryChargeState(int, const QString &)));
- connect(battery, SIGNAL(chargePercentChanged(int, const QString &)), this,
- SLOT(updateBatteryChargePercent(int, const QString &)));
- connect(battery, SIGNAL(plugStateChanged(bool, const QString &)), this,
- SLOT(updateBatteryPlugState(bool, const QString &)));
+ connect(battery, SIGNAL(chargeStateChanged(int, const QString &)), this,
+ SLOT(updateBatteryChargeState(int, const QString &)));
+ connect(battery, SIGNAL(chargePercentChanged(int, const QString &)), this,
+ SLOT(updateBatteryChargePercent(int, const QString &)));
+ connect(battery, SIGNAL(plugStateChanged(bool, const QString &)), this,
+ SLOT(updateBatteryPlugState(bool, const QString &)));
- // Set initial values
- updateBatteryChargeState(battery->chargeState(), device_battery.udi());
- updateBatteryChargePercent(battery->chargePercent(), device_battery.udi());
- updateBatteryPlugState(battery->isPlugged(), device_battery.udi());
+ // Set initial values
+ updateBatteryChargeState(battery->chargeState(), device_battery.udi());
+ updateBatteryChargePercent(battery->chargePercent(), device_battery.udi());
+ updateBatteryPlugState(battery->isPlugged(), device_battery.udi());
+ }
}
}
if (battery_sources.count() > 0) {
- setData(I18N_NOOP("Battery"), I18N_NOOP("has Battery"), true);
- setData(I18N_NOOP("Battery"), I18N_NOOP("sources"), battery_sources);
+ setData("Battery", "has Battery", true);
+ setData("Battery", "sources", battery_sources);
}
- } else if (name == I18N_NOOP("AC Adapter")) {
+ } else if (name == "AC Adapter") {
// AC Adapter handling
QList<Solid::Device> list_ac =
Solid::Device::listFromType(Solid::DeviceInterface::AcAdapter, QString());
@@ -113,24 +143,28 @@
connect(m_acadapter, SIGNAL(plugStateChanged(bool, const QString &)), this,
SLOT(updateAcPlugState(bool)));
}
- } else if (name == I18N_NOOP("Sleepstates")) {
+ } else if (name == "Sleepstates") {
QSet<Solid::PowerManagement::SleepState> sleepstates =
Solid::PowerManagement::supportedSleepStates();
// We first set all possible sleepstates to false, then enable the ones that are available
- setData(I18N_NOOP("Sleepstates"), I18N_NOOP("Standby"), false);
- setData(I18N_NOOP("Sleepstates"), I18N_NOOP("Suspend"), false);
- setData(I18N_NOOP("Sleepstates"), I18N_NOOP("Hibernate"), false);
+ setData("Sleepstates", "Standby", false);
+ setData("Sleepstates", "Suspend", false);
+ setData("Sleepstates", "Hibernate", false);
- foreach (Solid::PowerManagement::SleepState sleepstate, sleepstates) {
+ foreach (const Solid::PowerManagement::SleepState &sleepstate, sleepstates) {
if (sleepstate == Solid::PowerManagement::StandbyState) {
- setData(I18N_NOOP("Sleepstates"), I18N_NOOP("Supports standby"), true);
+ setData("Sleepstates", "Supports standby", true);
} else if (sleepstate == Solid::PowerManagement::SuspendState) {
- setData(I18N_NOOP("Sleepstates"), I18N_NOOP("Supports suspend"), true);
+ setData("Sleepstates", "Supports suspend", true);
} else if (sleepstate == Solid::PowerManagement::HibernateState) {
- setData(I18N_NOOP("Sleepstates"), I18N_NOOP("Supports hibernate"), true);
+ setData("Sleepstates", "Supports hibernate", true);
}
kDebug() << "Sleepstate \"" << sleepstate << "\" supported.";
}
+ } else if (name == "PowerDevil") {
+ QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.kded", "/modules/powerdevil",
+ "org.kde.PowerDevil", "streamData");
+ m_dbus.call(msg);
} else {
kDebug() << "Data for '" << name << "' not found";
}
@@ -141,36 +175,36 @@
{
QString state;
if (newState == Solid::Battery::NoCharge) {
- state = I18N_NOOP("NoCharge");
+ state = "NoCharge";
} else if (newState == Solid::Battery::Charging) {
- state = I18N_NOOP("Charging");
+ state = "Charging";
} else if (newState == Solid::Battery::Discharging) {
- state = I18N_NOOP("Discharging");
+ state = "Discharging";
} else {
- state = I18N_NOOP("Could not determine battery status. Something is fishy here. :o");
+ state = "Could not determine battery status. Something is fishy here. :o";
}
const QString& source = m_batterySources[udi];
- setData(source, I18N_NOOP("State"), state);
+ setData(source, "State", state);
scheduleSourcesUpdated();
}
void PowermanagementEngine::updateBatteryPlugState(bool newState, const QString& udi)
{
const QString& source = m_batterySources[udi];
- setData(source, I18N_NOOP("Plugged in"), newState);
+ setData(source, "Plugged in", newState);
scheduleSourcesUpdated();
}
void PowermanagementEngine::updateBatteryChargePercent(int newValue, const QString& udi)
{
const QString& source = m_batterySources[udi];
- setData(source, I18N_NOOP("Percent"), newValue);
+ setData(source, "Percent", newValue);
scheduleSourcesUpdated();
}
void PowermanagementEngine::updateAcPlugState(bool newState)
{
- setData(I18N_NOOP("AC Adapter"), I18N_NOOP("Plugged in"), newState);
+ setData("AC Adapter", "Plugged in", newState);
scheduleSourcesUpdated();
}
@@ -221,4 +255,11 @@
}
}
+void PowermanagementEngine::profilesChanged( const QString ¤t, const QStringList &profiles )
+{
+ setData("PowerDevil", "currentProfile", current);
+ setData("PowerDevil", "availableProfiles", profiles);
+ scheduleSourcesUpdated();
+}
+
#include "powermanagementengine.moc"
--- dataengines/powermanagement/powermanagementengine.h
+++ dataengines/powermanagement/powermanagementengine.h
@@ -1,6 +1,7 @@
/*
- * Copyright (C) 2007 Aaron Seigo <aseigo@kde.org>
- * Copyright (C) 2007 Sebastian Kuegler <sebas@kde.org>
+ * Copyright 2007 Aaron Seigo <aseigo@kde.org>
+ * Copyright 2007-2008 Sebastian Kuegler <sebas@kde.org>
+ * Copyright 2008 Dario Freddi <drf54321@gmail.com>
*
* 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
@@ -25,11 +26,12 @@
#include <solid/battery.h>
#include <solid/acadapter.h>
+#include <QtDBus/QDBusConnection>
#include <QHash>
/**
* This class provides runtime information about the battery and AC status
- * for use in a simple battery monitor Plasma applets.
+ * for use in power management Plasma applets.
*/
class PowermanagementEngine : public Plasma::DataEngine
{
@@ -51,13 +53,15 @@
void updateAcPlugState(bool newState);
void deviceRemoved(const QString& udi);
void deviceAdded(const QString& udi);
+ void profilesChanged(const QString ¤t, const QStringList &profiles);
private:
Solid::AcAdapter* m_acadapter;
QStringList m_sources;
-
+ QDBusConnection m_dbus;
+
QHash<QString, QString> m_batterySources;
-
+
};
K_EXPORT_PLASMA_DATAENGINE(powermanagement, PowermanagementEngine)
--- dataengines/powermanagement/plasma-dataengine-powermanagement.desktop
+++ dataengines/powermanagement/plasma-dataengine-powermanagement.desktop
@@ -28,7 +28,7 @@
Name[ml]=വൈദ്യുതി നടത്തിപ്പിനുള്ള ഡാറ്റ നല്കുന്ന എഞ്ചിന്
Name[mr]=पॉवर व्यवस्थापन माहिती इंजिन
Name[nb]=Motor for strømstyringsdata
-Name[nds]=Stroomkuntrull-Hanteerkarn
+Name[nds]=Stroomkuntrull-Datenkarn
Name[ne]=पावर व्यवस्थापन डेटा इन्जिन
Name[nl]=Energiebeheer (gegevensengine)
Name[nn]=Datamotor for straumstyring
@@ -40,8 +40,8 @@
Name[ru]=Поставщик данных управления питанием
Name[se]=El-rávdnjegieđahallama dáhtamohtor
Name[sl]=Pogon s podatki o upravljanju z energijo
-Name[sr]=мотор управљања енергијом
-Name[sr@latin]=motor upravljanja energijom
+Name[sr]=датомотор управљања енергијом
+Name[sr@latin]=datomotor upravljanja energijom
Name[sv]=Datagränssnitt för strömsparfunktion
Name[th]=กลไกข้อมูลระบบจัดการพลังงาน
Name[tr]=Güç Yönetimi Veri Motoru
--- dataengines/soliddevice/plasma-dataengine-soliddevice.desktop
+++ dataengines/soliddevice/plasma-dataengine-soliddevice.desktop
@@ -26,7 +26,7 @@
Name[lv]=Solid ierīču datu dzinējs
Name[ml]=സോളിഡ് നല്കുന്ന ഉപകരണങ്ങളെക്കുറിച്ചുള്ള ഡാറ്റ നല്കുന്ന എഞ്ചിന്
Name[nb]=Datamotor for SolidDevice
-Name[nds]=SolidDevice-Hanteerkarn
+Name[nds]=SolidDevice-Datenkarn
Name[ne]=ठोस यन्त्र डेटा इन्जिन
Name[nl]=SolidDevice (gegevensengine)
Name[nn]=Datamotor for SolidDevice
@@ -38,8 +38,8 @@
Name[ru]=Поставщик данных данных SolidDevice
Name[se]=SolidDevice-dáhtamohtor
Name[sl]=Pogon s podatki od SolidDevice
-Name[sr]=мотор Солида
-Name[sr@latin]=motor Solida
+Name[sr]=датомотор Солида
+Name[sr@latin]=datomotor Solida
Name[sv]=Datagränssnitt för Solid-enhet
Name[th]=กลไกข้อมูลอุปกรณ์ Solid
Name[tr]=Solid Aygıt Veri Motoru
--- dataengines/time/plasma-dataengine-time.desktop
+++ dataengines/time/plasma-dataengine-time.desktop
@@ -32,7 +32,7 @@
Name[ml]=സമയത്തിന്റെ ഡാറ്റ നല്കുന്ന എഞ്ചിന്
Name[mr]=वेळ माहिती इंजन
Name[nb]=Tidsdata-motor
-Name[nds]=Tiet-Hanteerkarn
+Name[nds]=Tiet-Datenkarn
Name[ne]=समय डेटा इन्जिन
Name[nl]=Tijd (gegevensengine)
Name[nn]=Tidsdatamotor
@@ -44,8 +44,8 @@
Name[ru]=Поставщик данных времени
Name[se]=Áigedáhtamohtor
Name[sl]=Pogon s podatki o času
-Name[sr]=мотор датума и времена
-Name[sr@latin]=motor datuma i vremena
+Name[sr]=датомотор датума и времена
+Name[sr@latin]=datomotor datuma i vremena
Name[sv]=Datagränssnitt för tid
Name[th]=กลไกข้อมูลเวลา
Name[tr]=Saat Veri Motoru
--- desktoptheme/widgets/scrollbar.svg
+++ desktoptheme/widgets/scrollbar.svg
@@ -0,0 +1,1185 @@
+<?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://creativecommons.org/ns#"
+ 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="48"
+ height="98"
+ id="svg3642"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ sodipodi:docbase="/home/diau/failed Graphics attempts/plasma background/41/widgets"
+ sodipodi:docname="scrollbar.svgz"
+ inkscape:output_extension="org.inkscape.output.svgz.inkscape"
+ version="1.0">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="5.6568543"
+ inkscape:cx="-1.7081019"
+ inkscape:cy="40.242351"
+ inkscape:current-layer="layer1"
+ showgrid="true"
+ inkscape:grid-bbox="true"
+ inkscape:document-units="px"
+ inkscape:window-width="1680"
+ inkscape:window-height="987"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ width="48px"
+ height="48px"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ objecttolerance="9"
+ gridtolerance="13">
+ <inkscape:grid
+ visible="true"
+ enabled="true"
+ id="grid2555"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <defs
+ id="defs3644">
+ <inkscape:perspective
+ id="perspective3927"
+ inkscape:persp3d-origin="300 : 400 : 1"
+ inkscape:vp_z="700 : 600 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="-50 : 600 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective173"
+ inkscape:persp3d-origin="300 : 400 : 1"
+ inkscape:vp_z="700 : 600 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="-50 : 600 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient38324"
+ id="radialGradient6667"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ cx="1940"
+ cy="667.86218"
+ fx="1940"
+ fy="667.86218"
+ r="640" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient6665"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ x1="460.29968"
+ y1="800"
+ x2="460.29968"
+ y2="764.96027" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient38324"
+ id="radialGradient6523"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ cx="1940"
+ cy="667.86218"
+ fx="1510.0791"
+ fy="668.79901"
+ r="640" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient6521"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ x1="460.29968"
+ y1="800"
+ x2="460.29968"
+ y2="764.96027" />
+ <linearGradient
+ id="linearGradient38324"
+ inkscape:collect="always">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ id="stop38326" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;"
+ id="stop38328" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient38324"
+ id="radialGradient6410"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ cx="1940"
+ cy="667.86218"
+ fx="1940"
+ fy="667.86218"
+ r="640" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient6416"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ x1="460.29968"
+ y1="800"
+ x2="460.29968"
+ y2="764.96027" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7781"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1740976,0,0,-0.3189789,588.2195,1700.637)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7779"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1740976,0,0,-0.3189789,28.999302,1700.6721)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7777"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-0.3189789,-1732.0312,1700.6602)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient7775"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9966917,0,0,1,245.38566,1570.7243)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7793"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,3.1799296e-2,1e-7,1538.8854)"
+ cx="214.86403"
+ cy="1562.4542"
+ fx="214.36403"
+ fy="1529.1011"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7791"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1681654,3.4136193e-3,4.2099459e-2,1.1902826e-2,569.84457,1578.8558)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient7789"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,7.5757576e-2,244.89238,1586.6911)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7773"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1740976,0,0,-0.3189789,588.2195,1639.637)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7771"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.4197507,1e-7,878.68648)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7769"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1740976,0,0,-0.3189789,28.999303,1639.6721)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7767"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-0.3189789,-1732.0313,1639.6602)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7765"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1681654,4.5059775e-2,4.2099459e-2,0.1571173,569.84457,1406.2968)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient7763"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(244.89238,1509.7221)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7787"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,3.1799296e-2,453,1538.8854)"
+ cx="214.61086"
+ cy="1563.174"
+ fx="214.11086"
+ fy="1529.8208"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7785"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1681654,3.4136193e-3,-4.2099459e-2,1.1902826e-2,-116.84457,1578.8558)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient7783"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,7.5757576e-2,208.10762,1586.6911)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7761"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1740976,0,0,-0.3189789,-135.2195,1639.637)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7759"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,0.4197507,453,878.68648)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7757"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1740976,0,0,-0.3189789,424.0007,1639.6721)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7755"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,-0.3189789,2185.0313,1639.6602)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7753"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1681654,4.5059775e-2,-4.2099459e-2,0.1571173,-116.84457,1406.2968)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient7751"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,1,208.10762,1509.7221)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient7649"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.7142857,0,0,7.5757576e-2,-1.92313,11.688002)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7901"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.9624586e-3,4.5059775e-2,-1.2423295e-3,0.1571173,213.79434,1467.2968)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7899"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.9509392e-2,0,0,-0.4197507,230.6101,2223.3112)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7897"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9509392e-2,0,0,0.4197507,212.3733,939.68651)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7895"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-4.9624586e-3,4.5059775e-2,1.2423295e-3,0.1571173,229.18906,1467.2968)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7893"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9509392e-2,0,0,0.3189789,161.26211,1541.3405)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <linearGradient
+ id="linearGradient7141">
+ <stop
+ offset="0"
+ style="stop-color:#222222;stop-opacity:1;"
+ id="stop7143" />
+ <stop
+ offset="0.23586744"
+ style="stop-color:#0c0c0c;stop-opacity:1;"
+ id="stop7149" />
+ <stop
+ offset="1"
+ style="stop-color:#000000;stop-opacity:1"
+ id="stop7145" />
+ </linearGradient>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient7891"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9509392e-2,0,0,1,224.61652,1570.7221)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <linearGradient
+ id="linearGradient3215">
+ <stop
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ id="stop3217" />
+ <stop
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:0.28158844;"
+ id="stop3221" />
+ <stop
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;"
+ id="stop3219" />
+ </linearGradient>
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient7889"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.9509392e-2,0,0,0.4197507,230.58705,939.68651)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <linearGradient
+ y2="764.96027"
+ x2="460.29968"
+ y1="800"
+ x1="460.29968"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4303"
+ xlink:href="#linearGradient7141"
+ inkscape:collect="always" />
+ <radialGradient
+ r="640"
+ fy="668.79901"
+ fx="1510.0791"
+ cy="667.86218"
+ cx="1940"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4305"
+ xlink:href="#linearGradient38324"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="764.96027"
+ x2="460.29968"
+ y1="800"
+ x1="460.29968"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4335"
+ xlink:href="#linearGradient7141"
+ inkscape:collect="always" />
+ <radialGradient
+ r="640"
+ fy="668.79901"
+ fx="1510.0791"
+ cy="667.86218"
+ cx="1940"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4337"
+ xlink:href="#linearGradient38324"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="764.96027"
+ x2="460.29968"
+ y1="800"
+ x1="460.29968"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4367"
+ xlink:href="#linearGradient7141"
+ inkscape:collect="always" />
+ <radialGradient
+ r="640"
+ fy="667.86218"
+ fx="1940"
+ cy="667.86218"
+ cx="1940"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4369"
+ xlink:href="#linearGradient38324"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="764.96027"
+ x2="460.29968"
+ y1="800"
+ x1="460.29968"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4385"
+ xlink:href="#linearGradient7141"
+ inkscape:collect="always" />
+ <radialGradient
+ r="640"
+ fy="667.86218"
+ fx="1940"
+ cy="667.86218"
+ cx="1940"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4387"
+ xlink:href="#linearGradient38324"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="764.96027"
+ x2="460.29968"
+ y1="800"
+ x1="460.29968"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4395"
+ xlink:href="#linearGradient7141"
+ inkscape:collect="always" />
+ <radialGradient
+ r="640"
+ fy="667.86218"
+ fx="1940"
+ cy="667.86218"
+ cx="1940"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient4397"
+ xlink:href="#linearGradient38324"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="764.96027"
+ x2="460.29968"
+ y1="800"
+ x1="460.29968"
+ gradientTransform="matrix(4.6875e-2,0,0,0.9714286,200,478.85713)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2337"
+ xlink:href="#linearGradient7141"
+ inkscape:collect="always" />
+ <radialGradient
+ r="640"
+ fy="667.86218"
+ fx="1940"
+ cy="667.86218"
+ cx="1940"
+ gradientTransform="matrix(4.6875e-2,0,0,0.1886979,139.0625,1096.4758)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient2339"
+ xlink:href="#linearGradient38324"
+ inkscape:collect="always" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-50 : 600 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="700 : 600 : 1"
+ inkscape:persp3d-origin="300 : 400 : 1"
+ id="perspective3529" />
+ <radialGradient
+ r="91.609375"
+ fy="1529.8208"
+ fx="214.11086"
+ cy="1563.174"
+ cx="214.61086"
+ gradientTransform="matrix(-1,0,0,3.1799296e-2,302,21.8832)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3581"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <radialGradient
+ r="91.609375"
+ fy="1529.1011"
+ fx="214.36403"
+ cy="1562.4542"
+ cx="214.86403"
+ gradientTransform="matrix(1,0,0,3.1799296e-2,-153,21.8832)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3614"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-50 : 600 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="700 : 600 : 1"
+ inkscape:persp3d-origin="300 : 400 : 1"
+ id="perspective3634" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-50 : 600 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="700 : 600 : 1"
+ inkscape:persp3d-origin="300 : 400 : 1"
+ id="perspective3647" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-50 : 600 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="700 : 600 : 1"
+ inkscape:persp3d-origin="300 : 400 : 1"
+ id="perspective3660" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="-50 : 600 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="700 : 600 : 1"
+ inkscape:persp3d-origin="300 : 400 : 1"
+ id="perspective3673" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2439"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.9966917,0,0,1,245.38566,1570.7243)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2441"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-0.3189789,-1732.0312,1700.6602)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2443"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1740976,0,0,-0.3189789,28.999302,1700.6721)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2445"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1740976,0,0,-0.3189789,588.2195,1700.637)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2453"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-0.3182575,-1731.4668,1700.5705)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2455"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1740976,0,0,-0.3185758,29.563694,1700.622)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2457"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1740976,0,0,-0.3185899,588.78391,1700.5887)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2459"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(245.45478,1570.7243)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2570"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9411745e-2,0,0,0.9996163,18.614494,-5.274403)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2590"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-0.1740976,0,0,-0.3189204,214.0007,65.662628)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2593"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,-0.3189204,1975.0313,65.65073)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2599"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,0.9998167,-1.89238,-64.261352)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2609"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,7.5757576e-2,-1.89238,11.690183)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2626"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(0.1740976,0,0,-0.3189204,-183.0007,65.662628)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2629"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,-0.3189204,-1944.0313,65.65073)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2635"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.9998167,32.89238,-64.261352)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2645"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,7.5724258e-2,32.89238,11.690759)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2672"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.941176e-2,0,0,1,13.614423,-64.278817)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2691"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.3189789,-1944.0312,-34.662617)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2694"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(32.89238,-5.281017)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2697"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,0.4197507,405.21875,-636.31661)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2716"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,0.3189789,1975.0312,-34.662617)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient2719"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-1,0,0,1,-1.89238,-5.281017)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient2722"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,0.4197507,-374.21875,-636.31661)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ </defs>
+ <metadata
+ id="metadata3647">
+ <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>
+ <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:groupmode="layer"
+ inkscape:label="Layer 1"
+ id="layer1">
+ <rect
+ style="opacity:0.5;fill:#7b7b7b;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.25;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect3570"
+ width="54"
+ height="100"
+ x="-1"
+ y="-2" />
+ <path
+ style="opacity:0.45;fill:url(#linearGradient2672);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 12.999941,18.999083 L 12.999941,25.999083 L 17.983397,25.999083 C 17.98886,25.999083 17.994596,25.982883 17.999941,25.967883 L 17.999941,18.999083 L 12.999941,18.999083 z"
+ id="background-bottom" />
+ <path
+ style="opacity:0.45;fill:url(#linearGradient2645);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 5,12.999083 L 5,17.996884 L 12,17.996884 L 12,12.999083 L 5,12.999083 z"
+ id="background-left" />
+ <path
+ style="opacity:0.45;fill:url(#linearGradient2635);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 5,19.001283 L 5,19.438703 C 5,23.068637 7.93185,26 11.5625,26 L 12,26 L 12,19.001283 L 5,19.001283 z"
+ id="background-bottomleft" />
+ <path
+ style="opacity:0.45;fill:url(#linearGradient2694);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 11.5625,4.996883 C 7.64428,4.996883 5,7.751983 5,11.559383 L 5,11.996883 L 12,11.996883 L 12,4.996883 L 11.5625,4.996883 z"
+ id="background-topleft"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ id="background-right"
+ d="M 26,12.999083 L 26,17.999083 L 19,17.999083 L 19,12.999083 L 26,12.999083 z"
+ style="opacity:0.45;fill:url(#linearGradient2609);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ id="background-bottomright"
+ d="M 26,19.001283 L 26,19.438703 C 26,23.068637 23.06815,26 19.4375,26 L 19,26 L 19,19.001283 L 26,19.001283 z"
+ style="opacity:0.45;fill:url(#linearGradient2599);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ id="background-topright"
+ d="M 19.4375,4.996883 C 23.17916,4.996883 26,7.574983 26,11.559383 L 26,11.996883 L 19,11.996883 L 19,4.996883 L 19.4375,4.996883 z"
+ style="opacity:0.45;fill:url(#linearGradient2719);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ id="background-center"
+ d="M 18,12.996902 L 18,17.996902 L 13,17.996902 L 13,12.996902 L 18,12.996902 z"
+ style="opacity:0.45;fill:url(#linearGradient7649);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="background-top"
+ d="M 13.000004,4.996854 L 13.000004,11.996867 L 18.000004,11.996867 L 18.000004,4.996854 L 13.000004,4.996854 z"
+ style="opacity:0.45;fill:url(#linearGradient2570);fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <rect
+ y="1"
+ x="1"
+ height="4.375"
+ width="5"
+ id="hint-stretch-borders"
+ style="opacity:0.875;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="slider-bottom"
+ d="M 32.999941,39.999083 L 32.999941,46.999083 L 37.983397,46.999083 C 37.98886,46.999083 37.994596,46.982883 37.999941,46.967883 L 37.999941,39.999083 L 32.999941,39.999083 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1" />
+ <path
+ id="slider-left"
+ d="M 25,33.999083 L 25,38.996884 L 32,38.996884 L 32,33.999083 L 25,33.999083 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1" />
+ <path
+ id="slider-bottomleft"
+ d="M 25,40.001283 L 25,40.438703 C 25,44.068637 27.93185,47 31.5625,47 L 32,47 L 32,40.001283 L 25,40.001283 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="slider-topleft"
+ d="M 31.5625,25.996883 C 27.64428,25.996883 25,28.751983 25,32.559383 L 25,32.996883 L 32,32.996883 L 32,25.996883 L 31.5625,25.996883 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1" />
+ <path
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1"
+ d="M 46,33.999083 L 46,38.999083 L 39,38.999083 L 39,33.999083 L 46,33.999083 z"
+ id="slider-right" />
+ <path
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1"
+ d="M 46,40.001283 L 46,40.438703 C 46,44.068637 43.06815,47 39.4375,47 L 39,47 L 39,40.001283 L 46,40.001283 z"
+ id="slider-bottomright" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1"
+ d="M 39.4375,25.996883 C 43.17916,25.996883 46,28.574983 46,32.559383 L 46,32.996883 L 39,32.996883 L 39,25.996883 L 39.4375,25.996883 z"
+ id="slider-topright" />
+ <path
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1"
+ d="M 38,33.996902 L 38,38.996902 L 33,38.996902 L 33,33.996902 L 38,33.996902 z"
+ id="slider-center" />
+ <path
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998000000000;stroke-opacity:1"
+ d="M 33.000004,25.996854 L 33.000004,32.996867 L 38.000004,32.996867 L 38.000004,25.996854 L 33.000004,25.996854 z"
+ id="slider-top"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285706999999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 2.9913867,39.001421 C 2.6002611,39.036262 2.2597586,39.252656 2.0978297,39.569287 C 1.9359008,39.885918 1.9770745,40.254823 2.2058792,40.53738 L 7.1093501,46.597053 C 7.3165618,46.850138 7.6485414,47 8.0019722,47 C 8.3554029,47 8.6873826,46.850138 8.8945943,46.597053 L 13.798066,40.53738 C 14.036107,40.239549 14.065991,39.849128 13.875506,39.525668 C 13.685021,39.202208 13.30608,38.999902 12.893542,39.001421 L 3.110403,39.001421 C 3.0707598,38.999526 3.0310298,38.999526 2.9913867,39.001421 z"
+ id="arrow-down"
+ sodipodi:nodetypes="csccsccsccc" />
+ <path
+ sodipodi:nodetypes="csccsccsccc"
+ id="arrow-up"
+ d="M 2.9913867,36.998579 C 2.6002611,36.963738 2.2597586,36.747344 2.0978297,36.430713 C 1.9359008,36.114082 1.9770745,35.745177 2.2058792,35.46262 L 7.1093501,29.402947 C 7.3165618,29.149862 7.6485414,29 8.0019722,29 C 8.3554029,29 8.6873826,29.149862 8.8945943,29.402947 L 13.798066,35.46262 C 14.036107,35.760451 14.065991,36.150872 13.875506,36.474332 C 13.685021,36.797792 13.30608,37.000098 12.893542,36.998579 L 3.110403,36.998579 C 3.0707598,37.000474 3.0310298,37.000474 2.9913867,36.998579 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285706999999981;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csccsccsccc"
+ id="arrow-left"
+ d="M 22.998579,36.991387 C 22.963738,36.600261 22.747344,36.259759 22.430713,36.09783 C 22.114082,35.935901 21.745177,35.977074 21.46262,36.205879 L 15.402947,41.10935 C 15.149862,41.316562 15,41.648541 15,42.001972 C 15,42.355403 15.149862,42.687383 15.402947,42.894594 L 21.46262,47.798066 C 21.760451,48.036107 22.150872,48.065991 22.474332,47.875506 C 22.797792,47.685021 23.000098,47.30608 22.998579,46.893542 L 22.998579,37.110403 C 23.000474,37.07076 23.000474,37.03103 22.998579,36.991387 z"
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ style="opacity:0.45;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 15.001421,26.991387 C 15.036262,26.600261 15.252656,26.259759 15.569287,26.09783 C 15.885918,25.935901 16.254823,25.977074 16.53738,26.205879 L 22.597053,31.10935 C 22.850138,31.316562 23,31.648541 23,32.001972 C 23,32.355403 22.850138,32.687383 22.597053,32.894594 L 16.53738,37.798066 C 16.239549,38.036107 15.849128,38.065991 15.525668,37.875506 C 15.202208,37.685021 14.999902,37.30608 15.001421,36.893542 L 15.001421,27.110403 C 14.999526,27.07076 14.999526,27.03103 15.001421,26.991387 z"
+ id="arrow-right"
+ sodipodi:nodetypes="csccsccsccc" />
+ <path
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 32.999941,64.0312 L 32.999941,71.0312 L 37.983397,71.0312 C 37.98886,71.0312 37.994596,71.015 37.999941,71 L 37.999941,64.0312 L 32.999941,64.0312 z"
+ id="mouseover-slider-bottom" />
+ <path
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 25,58.0312 L 25,63.029001 L 32,63.029001 L 32,58.0312 L 25,58.0312 z"
+ id="mouseover-slider-left" />
+ <path
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 25,64.0334 L 25,64.47082 C 25,68.100754 27.93185,71.032117 31.5625,71.032117 L 32,71.032117 L 32,64.0334 L 25,64.0334 z"
+ id="mouseover-slider-bottomleft" />
+ <path
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 31.5625,50.029 C 27.64428,50.029 25,52.7841 25,56.5915 L 25,57.029 L 32,57.029 L 32,50.029 L 31.5625,50.029 z"
+ id="mouseover-slider-topleft"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ id="mouseover-slider-right"
+ d="M 46,58.0312 L 46,63.0312 L 39,63.0312 L 39,58.0312 L 46,58.0312 z"
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ id="mouseover-slider-bottomright"
+ d="M 46,64.0334 L 46,64.47082 C 46,68.100754 43.06815,71.032117 39.4375,71.032117 L 39,71.032117 L 39,64.0334 L 46,64.0334 z"
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ id="mouseover-slider-topright"
+ d="M 39.4375,50.029 C 43.17916,50.029 46,52.6071 46,56.5915 L 46,57.029 L 39,57.029 L 39,50.029 L 39.4375,50.029 z"
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ id="mouseover-slider-center"
+ d="M 38,58.029019 L 38,63.029019 L 33,63.029019 L 33,58.029019 L 38,58.029019 z"
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="ccccc"
+ id="mouseover-slider-top"
+ d="M 33.000004,57.028984 L 33.000004,50.028971 L 38.000004,50.028971 L 38.000004,57.028984 L 33.000004,57.028984 z"
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csccsccsccc"
+ id="mouseover-arrow-down"
+ d="M 2.9913867,63.033538 C 2.6002611,63.068379 2.2597586,63.284773 2.0978297,63.601404 C 1.9359008,63.918035 1.9770745,64.28694 2.2058792,64.569497 L 7.1093501,70.62917 C 7.3165618,70.882255 7.6485414,71.032117 8.0019722,71.032117 C 8.3554029,71.032117 8.6873826,70.882255 8.8945943,70.62917 L 13.798066,64.569497 C 14.036107,64.271666 14.065991,63.881245 13.875506,63.557785 C 13.685021,63.234325 13.30608,63.032019 12.893542,63.033538 L 3.110403,63.033538 C 3.0707598,63.031643 3.0310298,63.031643 2.9913867,63.033538 z"
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 2.9913867,61.030696 C 2.6002611,60.995855 2.2597586,60.779461 2.0978297,60.46283 C 1.9359008,60.146199 1.9770745,59.777294 2.2058792,59.494737 L 7.1093501,53.435064 C 7.3165618,53.181979 7.6485414,53.032117 8.0019722,53.032117 C 8.3554029,53.032117 8.6873826,53.181979 8.8945943,53.435064 L 13.798066,59.494737 C 14.036107,59.792568 14.065991,60.182989 13.875506,60.506449 C 13.685021,60.829909 13.30608,61.032215 12.893542,61.030696 L 3.110403,61.030696 C 3.0707598,61.032591 3.0310298,61.032591 2.9913867,61.030696 z"
+ id="mouseover-arrow-up"
+ sodipodi:nodetypes="csccsccsccc" />
+ <path
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 22.998579,61.023504 C 22.963738,60.632378 22.747344,60.291876 22.430713,60.129947 C 22.114082,59.968018 21.745177,60.009191 21.46262,60.237996 L 15.402947,65.141467 C 15.149862,65.348679 15,65.680658 15,66.034089 C 15,66.38752 15.149862,66.7195 15.402947,66.926711 L 21.46262,71.830183 C 21.760451,72.068224 22.150872,72.098108 22.474332,71.907623 C 22.797792,71.717138 23.000098,71.338197 22.998579,70.925659 L 22.998579,61.14252 C 23.000474,61.102877 23.000474,61.063147 22.998579,61.023504 z"
+ id="mouseover-arrow-left"
+ sodipodi:nodetypes="csccsccsccc" />
+ <path
+ sodipodi:nodetypes="csccsccsccc"
+ id="mouseover-arrow-right"
+ d="M 15.001421,51.023504 C 15.036262,50.632378 15.252656,50.291876 15.569287,50.129947 C 15.885918,49.968018 16.254823,50.009191 16.53738,50.237996 L 22.597053,55.141467 C 22.850138,55.348679 23,55.680658 23,56.034089 C 23,56.38752 22.850138,56.7195 22.597053,56.926711 L 16.53738,61.830183 C 16.239549,62.068224 15.849128,62.098108 15.525668,61.907623 C 15.202208,61.717138 14.999902,61.338197 15.001421,60.925659 L 15.001421,51.14252 C 14.999526,51.102877 14.999526,51.063147 15.001421,51.023504 z"
+ style="opacity:0.6;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ id="sunken-slider-bottom"
+ d="M 32.999941,89.105541 L 32.999941,96.105541 L 37.983397,96.105541 C 37.98886,96.105541 37.994596,96.089341 37.999941,96.074341 L 37.999941,89.105541 L 32.999941,89.105541 z"
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ id="sunken-slider-left"
+ d="M 25,83.105541 L 25,88.103342 L 32,88.103342 L 32,83.105541 L 25,83.105541 z"
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ id="sunken-slider-bottomleft"
+ d="M 25,89.107741 L 25,89.545161 C 25,93.175095 27.93185,96.106458 31.5625,96.106458 L 32,96.106458 L 32,89.107741 L 25,89.107741 z"
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ id="sunken-slider-topleft"
+ d="M 31.5625,75.103341 C 27.64428,75.103341 25,77.858441 25,81.665841 L 25,82.103341 L 32,82.103341 L 32,75.103341 L 31.5625,75.103341 z"
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1" />
+ <path
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 46,83.105541 L 46,88.105541 L 39,88.105541 L 39,83.105541 L 46,83.105541 z"
+ id="sunken-slider-right" />
+ <path
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 46,89.107741 L 46,89.545161 C 46,93.175095 43.06815,96.106458 39.4375,96.106458 L 39,96.106458 L 39,89.107741 L 46,89.107741 z"
+ id="sunken-slider-bottomright" />
+ <path
+ sodipodi:nodetypes="cccccc"
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 39.4375,75.103341 C 43.17916,75.103341 46,77.681441 46,81.665841 L 46,82.103341 L 39,82.103341 L 39,75.103341 L 39.4375,75.103341 z"
+ id="sunken-slider-topright" />
+ <path
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 38,83.10336 L 38,88.10336 L 33,88.10336 L 33,83.10336 L 38,83.10336 z"
+ id="sunken-slider-center" />
+ <path
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 33.000004,75.103312 L 33.000004,82.103325 L 38.000004,82.103325 L 38.000004,75.103312 L 33.000004,75.103312 z"
+ id="sunken-slider-top"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 2.9913867,88.107879 C 2.6002611,88.14272 2.2597586,88.359114 2.0978297,88.675745 C 1.9359008,88.992376 1.9770745,89.361281 2.2058792,89.643838 L 7.1093501,95.703511 C 7.3165618,95.956596 7.6485414,96.106458 8.0019722,96.106458 C 8.3554029,96.106458 8.6873826,95.956596 8.8945943,95.703511 L 13.798066,89.643838 C 14.036107,89.346007 14.065991,88.955586 13.875506,88.632126 C 13.685021,88.308666 13.30608,88.10636 12.893542,88.107879 L 3.110403,88.107879 C 3.0707598,88.105984 3.0310298,88.105984 2.9913867,88.107879 z"
+ id="sunken-arrow-down"
+ sodipodi:nodetypes="csccsccsccc" />
+ <path
+ sodipodi:nodetypes="csccsccsccc"
+ id="sunken-arrow-up"
+ d="M 2.9913867,86.105037 C 2.6002611,86.070196 2.2597586,85.853802 2.0978297,85.537171 C 1.9359008,85.22054 1.9770745,84.851635 2.2058792,84.569078 L 7.1093501,78.509405 C 7.3165618,78.25632 7.6485414,78.106458 8.0019722,78.106458 C 8.3554029,78.106458 8.6873826,78.25632 8.8945943,78.509405 L 13.798066,84.569078 C 14.036107,84.866909 14.065991,85.25733 13.875506,85.58079 C 13.685021,85.90425 13.30608,86.106556 12.893542,86.105037 L 3.110403,86.105037 C 3.0707598,86.106932 3.0310298,86.106932 2.9913867,86.105037 z"
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="csccsccsccc"
+ id="sunken-arrow-left"
+ d="M 22.998579,86.097845 C 22.963738,85.706719 22.747344,85.366217 22.430713,85.204288 C 22.114082,85.042359 21.745177,85.083532 21.46262,85.312337 L 15.402947,90.215808 C 15.149862,90.42302 15,90.754999 15,91.10843 C 15,91.461861 15.149862,91.793841 15.402947,92.001052 L 21.46262,96.904524 C 21.760451,97.142565 22.150872,97.172449 22.474332,96.981964 C 22.797792,96.791479 23.000098,96.412538 22.998579,96 L 22.998579,86.216861 C 23.000474,86.177218 23.000474,86.137488 22.998579,86.097845 z"
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ <path
+ style="opacity:0.8;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.89285707;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1"
+ d="M 15.001421,76.097845 C 15.036262,75.706719 15.252656,75.366217 15.569287,75.204288 C 15.885918,75.042359 16.254823,75.083532 16.53738,75.312337 L 22.597053,80.215808 C 22.850138,80.42302 23,80.754999 23,81.10843 C 23,81.461861 22.850138,81.793841 22.597053,82.001052 L 16.53738,86.904524 C 16.239549,87.142565 15.849128,87.172449 15.525668,86.981964 C 15.202208,86.791479 14.999902,86.412538 15.001421,86 L 15.001421,76.216861 C 14.999526,76.177218 14.999526,76.137488 15.001421,76.097845 z"
+ id="sunken-arrow-right"
+ sodipodi:nodetypes="csccsccsccc" />
+ </g>
+</svg>
--- desktoptheme/widgets/monitor.svg
+++ desktoptheme/widgets/monitor.svg
@@ -0,0 +1,1954 @@
+<?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://creativecommons.org/ns#"
+ 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"
+ id="svg2"
+ sodipodi:version="0.32"
+ inkscape:version="0.46"
+ width="200"
+ height="200"
+ version="1.0"
+ sodipodi:docbase="/home/david"
+ sodipodi:docname="monitor.svgz"
+ inkscape:output_extension="org.inkscape.output.svgz.inkscape"
+ inkscape:export-filename="computer.png"
+ inkscape:export-xdpi="33.75"
+ inkscape:export-ydpi="33.75">
+ <sodipodi:namedview
+ inkscape:window-height="710"
+ inkscape:window-width="1110"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="namedview3861"
+ showguides="true"
+ inkscape:guide-bbox="true"
+ width="128px"
+ height="128px"
+ showgrid="true"
+ inkscape:zoom="2.8284271"
+ inkscape:cx="102.44857"
+ inkscape:cy="165.98078"
+ inkscape:window-x="129"
+ inkscape:window-y="83"
+ inkscape:current-layer="svg2"
+ inkscape:grid-points="true">
+ <inkscape:grid
+ enabled="true"
+ visible="true"
+ empspacing="2"
+ empopacity="0.4"
+ opacity="0.2"
+ empcolor="#0000ff"
+ color="#0000ff"
+ spacingy="2px"
+ spacingx="2px"
+ originy="0px"
+ originx="0px"
+ type="xygrid"
+ id="GridFromPre046Settings" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata7">
+ <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>
+ <defs
+ id="defs5">
+ <radialGradient
+ r="91.609398"
+ fy="136.14069"
+ fx="2132.25"
+ cy="136.14069"
+ cx="2132.25"
+ gradientTransform="matrix(4.9460378e-3,4.5042486e-2,-1.2382186e-3,0.157057,66.828125,-50.659102)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3536"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <radialGradient
+ r="91.609375"
+ fy="1575.4911"
+ fx="214.5"
+ cy="1608.8442"
+ cx="215"
+ gradientTransform="matrix(-2.9411745e-2,0,0,-0.4195896,83.588241,705.06522)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3539"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <radialGradient
+ r="91.609375"
+ fy="1575.4911"
+ fx="214.5"
+ cy="1608.8442"
+ cx="215"
+ gradientTransform="matrix(2.9411745e-2,0,0,0.4195896,65.411787,-578.06695)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3542"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <radialGradient
+ r="91.609398"
+ fy="136.14069"
+ fx="2132.25"
+ cy="136.14069"
+ cx="2132.25"
+ gradientTransform="matrix(-4.9460378e-3,4.5042486e-2,1.2382186e-3,0.157057,82.171903,-50.659102)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3545"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <radialGradient
+ r="91.609398"
+ fy="136.14062"
+ fx="2040.6406"
+ cy="136.14062"
+ cx="2040.6406"
+ gradientTransform="matrix(2.9411745e-2,0,0,0.3188565,14.469724,23.356188)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3548"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="9.2778997"
+ x2="50.10762"
+ y1="89.277901"
+ x1="50.10762"
+ gradientTransform="matrix(2.9411745e-2,0,0,0.9996163,77.614494,52.726514)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient3551"
+ xlink:href="#linearGradient7141"
+ inkscape:collect="always" />
+ <radialGradient
+ r="91.609375"
+ fy="1575.4911"
+ fx="214.5"
+ cy="1608.8442"
+ cx="215"
+ gradientTransform="matrix(-2.9411745e-2,0,0,0.4195896,83.565267,-578.06695)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient3554"
+ xlink:href="#linearGradient3215"
+ inkscape:collect="always" />
+ <linearGradient
+ id="linearGradient3427"
+ inkscape:collect="always">
+ <stop
+ id="stop3429"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3431"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3303"
+ inkscape:collect="always">
+ <stop
+ id="stop3305"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3307"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7751"
+ inkscape:collect="always">
+ <stop
+ id="stop7753"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop7755"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3273"
+ inkscape:collect="always">
+ <stop
+ id="stop3275"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3277"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3410"
+ inkscape:collect="always">
+ <stop
+ id="stop3412"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop3414"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3259">
+ <stop
+ id="stop3261"
+ offset="0"
+ style="stop-color:#1f1f1f;stop-opacity:1;" />
+ <stop
+ id="stop3263"
+ offset="1"
+ style="stop-color:#424242;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3385">
+ <stop
+ id="stop3387"
+ offset="0"
+ style="stop-color:#d6d6d6;stop-opacity:1;" />
+ <stop
+ id="stop3389"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3393">
+ <stop
+ id="stop3395"
+ offset="0"
+ style="stop-color:#efefef;stop-opacity:1" />
+ <stop
+ id="stop3397"
+ offset="1"
+ style="stop-color:#b8b8b8;stop-opacity:1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3288"
+ inkscape:collect="always">
+ <stop
+ id="stop3290"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop3292"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7706"
+ inkscape:collect="always">
+ <stop
+ id="stop7708"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop7710"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7141">
+ <stop
+ id="stop7143"
+ style="stop-color:#222222;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop7149"
+ style="stop-color:#0c0c0c;stop-opacity:1;"
+ offset="0.23586744" />
+ <stop
+ id="stop7145"
+ style="stop-color:#000000;stop-opacity:1"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3215">
+ <stop
+ id="stop3217"
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop3221"
+ style="stop-color:#ffffff;stop-opacity:0.28158844;"
+ offset="0.5" />
+ <stop
+ id="stop3219"
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1" />
+ </linearGradient>
+ <inkscape:perspective
+ id="perspective384"
+ inkscape:persp3d-origin="64 : 42.666667 : 1"
+ inkscape:vp_z="128 : 64 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 64 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <linearGradient
+ id="linearGradient7290">
+ <stop
+ style="stop-color:#dddddd;stop-opacity:1;"
+ offset="0"
+ id="stop7292" />
+ <stop
+ style="stop-color:#a7a7a7;stop-opacity:1;"
+ offset="1"
+ id="stop7294" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7150">
+ <stop
+ id="stop7152"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ <stop
+ id="stop7154"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient7136"
+ inkscape:collect="always">
+ <stop
+ id="stop7138"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ id="stop7140"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4029">
+ <stop
+ id="stop4031"
+ offset="0"
+ style="stop-color:#818584;stop-opacity:1;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0.5"
+ id="stop4033" />
+ <stop
+ id="stop4035"
+ offset="1"
+ style="stop-color:#818584;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3722">
+ <stop
+ id="stop3724"
+ offset="0"
+ style="stop-color:#ececec;stop-opacity:1;" />
+ <stop
+ id="stop3726"
+ offset="1"
+ style="stop-color:#404040;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3611">
+ <stop
+ style="stop-color:#818584;stop-opacity:1;"
+ offset="0"
+ id="stop3613" />
+ <stop
+ id="stop3615"
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#818584;stop-opacity:1;"
+ offset="1"
+ id="stop3617" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3483">
+ <stop
+ style="stop-color:#ba0000;stop-opacity:1;"
+ offset="0"
+ id="stop3485" />
+ <stop
+ style="stop-color:#ba0000;stop-opacity:0;"
+ offset="1"
+ id="stop3487" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3176">
+ <stop
+ id="stop3178"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop3180"
+ offset="1"
+ style="stop-color:#afb0b0;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3166">
+ <stop
+ id="stop3168"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0.82206404;"
+ offset="0.5990991"
+ id="stop3518" />
+ <stop
+ id="stop3170"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3149">
+ <stop
+ id="stop3151"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="0.34797296"
+ id="stop3157" />
+ <stop
+ id="stop4061"
+ offset="0.65930116"
+ style="stop-color:#ffffff;stop-opacity:0;" />
+ <stop
+ id="stop3153"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3954">
+ <stop
+ id="stop3956"
+ offset="0"
+ style="stop-color:#b3b3b3;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.52879584"
+ id="stop3962" />
+ <stop
+ id="stop3958"
+ offset="1"
+ style="stop-color:#c5c5c5;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3065">
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0"
+ id="stop3067" />
+ <stop
+ id="stop3073"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="1"
+ id="stop3069" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3088">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop3090" />
+ <stop
+ id="stop3098"
+ offset="0.73626375"
+ style="stop-color:#000000;stop-opacity:0.49803922;" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop3092" />
+ </linearGradient>
+ <radialGradient
+ r="25.9375"
+ fy="-0.23275588"
+ fx="162.46797"
+ cy="-0.23275588"
+ cx="162.46797"
+ gradientTransform="matrix(0.7001186,0,0,2.7816652,48.721132,1.3717999)"
+ gradientUnits="userSpaceOnUse"
+ id="radialGradient7164"
+ xlink:href="#linearGradient7150"
+ inkscape:collect="always" />
+ <mask
+ id="mask7160"
+ maskUnits="userSpaceOnUse">
+ <path
+ style="opacity:1;fill:url(#radialGradient7164);fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1.08779998;stroke-opacity:1"
+ d="M 137.37423,-51.650649 C 136.90963,-51.650649 136.53048,-51.183286 136.53048,-50.619399 L 136.53048,-0.18189907 C 141.47984,0.40821793 146.5415,0.72435094 151.68673,0.72435094 C 164.60291,0.72435094 176.96094,-1.191205 188.40548,-4.713149 L 188.40548,-50.619399 C 188.40548,-51.183286 188.02634,-51.650649 187.56173,-51.650649 L 137.37423,-51.650649 z"
+ id="path7162" />
+ </mask>
+ <linearGradient
+ y2="118.57565"
+ x2="47.238132"
+ y1="74.379738"
+ x1="88.188385"
+ gradientTransform="matrix(0.7018405,0,0,0.7018405,-31.780515,17.907276)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5524"
+ xlink:href="#linearGradient3722"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="15.908398"
+ x2="72.281242"
+ y1="58"
+ x1="70.316795"
+ gradientTransform="translate(102.53048,-57.275649)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient5542"
+ xlink:href="#linearGradient7136"
+ inkscape:collect="always" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient4050"
+ id="linearGradient4056"
+ x1="69"
+ y1="35.035378"
+ x2="69"
+ y2="0.60519463"
+ gradientUnits="userSpaceOnUse" />
+ <clipPath
+ clipPathUnits="userSpaceOnUse"
+ id="clipPath4024">
+ <rect
+ style="fill:#e20071;fill-opacity:1"
+ y="7.9999967"
+ x="8"
+ id="rect4026"
+ height="88"
+ width="112"
+ ry="0" />
+ </clipPath>
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient5645"
+ id="linearGradient3002"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.214876,0,0,-1.2057416,-356.23137,-16.727269)"
+ x1="314.05814"
+ y1="11.862287"
+ x2="314.05814"
+ y2="-113.61256" />
+ <linearGradient
+ id="linearGradient5645">
+ <stop
+ id="stop5647"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" />
+ <stop
+ id="stop5649"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4854">
+ <stop
+ id="stop4857"
+ offset="0"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.5"
+ id="stop4010" />
+ <stop
+ id="stop4859"
+ offset="1"
+ style="stop-color:#ffffff;stop-opacity:0" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4838">
+ <stop
+ style="stop-color:#9a9a9a;stop-opacity:1;"
+ offset="0"
+ id="stop4840" />
+ <stop
+ id="stop4846"
+ offset="0.26439792"
+ style="stop-color:#d0d0d0;stop-opacity:1;" />
+ <stop
+ id="stop4842"
+ offset="0.52879584"
+ style="stop-color:#e4e4e4;stop-opacity:1;" />
+ <stop
+ style="stop-color:#e2e2e2;stop-opacity:1;"
+ offset="0.76439792"
+ id="stop4848" />
+ <stop
+ style="stop-color:#acacac;stop-opacity:1;"
+ offset="1"
+ id="stop4844" />
+ </linearGradient>
+ <linearGradient
+ y2="165.22659"
+ x2="196.125"
+ y1="165.22659"
+ x1="49.875"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4804">
+ <stop
+ id="stop4806"
+ style="stop-color:#6b6b6b;stop-opacity:1;"
+ offset="0" />
+ <stop
+ id="stop4808"
+ style="stop-color:#d6d9df;stop-opacity:1;"
+ offset="0.1716" />
+ <stop
+ id="stop4810"
+ style="stop-color:#737373;stop-opacity:1;"
+ offset="0.30770001" />
+ <stop
+ id="stop4812"
+ style="stop-color:#e1e4e7;stop-opacity:1;"
+ offset="0.5" />
+ <stop
+ id="stop4814"
+ style="stop-color:#818181;stop-opacity:1;"
+ offset="0.74559999" />
+ <stop
+ id="stop4816"
+ style="stop-color:#868d93;stop-opacity:1;"
+ offset="0.77539998" />
+ <stop
+ id="stop4818"
+ style="stop-color:#9b9da3;stop-opacity:1;"
+ offset="0.83310002" />
+ <stop
+ id="stop4820"
+ style="stop-color:#8e9198;stop-opacity:1;"
+ offset="0.89039999" />
+ <stop
+ id="stop4822"
+ style="stop-color:#8f949a;stop-opacity:1;"
+ offset="0.9465" />
+ <stop
+ id="stop4824"
+ style="stop-color:#adb0b5;stop-opacity:1;"
+ offset="1" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3258">
+ <stop
+ id="stop3260"
+ offset="0"
+ style="stop-color:#ececec;stop-opacity:1;" />
+ <stop
+ id="stop3262"
+ offset="1"
+ style="stop-color:#404040;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3250">
+ <stop
+ style="stop-color:#818584;stop-opacity:1;"
+ offset="0"
+ id="stop3252" />
+ <stop
+ id="stop3254"
+ offset="0.5"
+ style="stop-color:#ffffff;stop-opacity:1;" />
+ <stop
+ style="stop-color:#818584;stop-opacity:1;"
+ offset="1"
+ id="stop3256" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3242">
+ <stop
+ id="stop3244"
+ offset="0"
+ style="stop-color:#b3b3b3;stop-opacity:1;" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="0.52879584"
+ id="stop3246" />
+ <stop
+ id="stop3248"
+ offset="1"
+ style="stop-color:#909090;stop-opacity:1;" />
+ </linearGradient>
+ <linearGradient
+ id="XMLID_18_"
+ gradientUnits="userSpaceOnUse"
+ x1="26"
+ y1="69"
+ x2="220"
+ y2="69">
+ <stop
+ offset="0"
+ style="stop-color:#3383E6"
+ id="stop3354" />
+ <stop
+ offset="1"
+ style="stop-color:#6ECAF7"
+ id="stop3364" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient6160">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop6162" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop6164" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient3623">
+ <stop
+ style="stop-color:#666666;stop-opacity:1;"
+ offset="0"
+ id="stop3625" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:0;"
+ offset="1"
+ id="stop3627" />
+ </linearGradient>
+ <linearGradient
+ id="linearGradient4050">
+ <stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop4052" />
+ <stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop4054" />
+ </linearGradient>
+ <linearGradient
+ y2="0.60519463"
+ x2="69"
+ y1="35.035378"
+ x1="69"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient2810"
+ xlink:href="#linearGradient4050"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="-145.81259"
+ x2="69.935677"
+ y1="43.267174"
+ x1="69.935677"
+ gradientTransform="matrix(1.5974545,0,0,1.5316348,3.7629107,-1.2222354)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4270"
+ xlink:href="#linearGradient5645"
+ inkscape:collect="always" />
+ <linearGradient
+ y2="110"
+ x2="166.95312"
+ y1="14"
+ x1="126.03124"
+ gradientTransform="matrix(0.9709466,0,0,0.9270577,-11.464306,-146.50147)"
+ gradientUnits="userSpaceOnUse"
+ id="linearGradient4276"
+ xlink:href="#XMLID_18_"
+ inkscape:collect="always" />
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3855" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7706"
+ id="linearGradient4573"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(208,0)"
+ x1="-637"
+ y1="29.069431"
+ x2="-637"
+ y2="-163" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3288"
+ id="linearGradient4575"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-385,-62)"
+ x1="-154.25182"
+ y1="-423.82953"
+ x2="-65.956993"
+ y2="-94.308769" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4577"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,-524.0541,-13.332462)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4579"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999226)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4581"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999226)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4583"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-786.99999,-61.999226)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4585"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,-454.53398,151.70365)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4587"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,-559.14935,265.72246)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4589"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,-524.0541,-13.333233)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4591"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999997)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4593"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999997)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4595"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-786.99999,-61.999997)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4597"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,-454.53398,151.70288)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4599"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,-559.14935,265.72169)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7751"
+ id="linearGradient4601"
+ gradientUnits="userSpaceOnUse"
+ x1="-616.84747"
+ y1="-73.742973"
+ x2="-616.84747"
+ y2="-194.07599" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4603"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,-524.0541,-13.333234)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4605"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999998)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4607"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999998)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3303"
+ id="linearGradient4609"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,42.700002)"
+ x1="-127.61703"
+ y1="-310.29703"
+ x2="-127.61703"
+ y2="-275.16071" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4611"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-786.99999,-61.999998)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3427"
+ id="linearGradient4613"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999998)"
+ x1="-11.793251"
+ y1="-0.17180708"
+ x2="-11.793251"
+ y2="-124.49196" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4615"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,-454.53398,151.70288)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4617"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,-559.14935,265.72169)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4619"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,-524.0541,-13.33323)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4621"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999994)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4623"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999994)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4625"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-786.99999,-61.999994)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4627"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,-454.53398,151.70288)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4629"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,-559.14935,265.72169)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4631"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,-524.0541,-13.333233)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4633"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999997)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4635"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999997)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3303"
+ id="linearGradient4637"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,42.700003)"
+ x1="-127.61703"
+ y1="-310.29703"
+ x2="-127.61703"
+ y2="-275.16071" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4639"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-786.99999,-61.999997)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3427"
+ id="linearGradient4641"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999997)"
+ x1="-11.793251"
+ y1="-0.17180708"
+ x2="-11.793251"
+ y2="-124.49196" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4643"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,-454.53398,151.70288)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4645"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,-559.14935,265.72169)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4647"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,-524.0541,-13.333233)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4649"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999997)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4651"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999997)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4653"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-786.99999,-61.999997)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4655"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,-454.53398,151.70288)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4657"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,-559.14935,265.72169)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4659"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2071879e-8,3.0891185e-8,1.1495833,-524.0541,-13.212119)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4661"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0005391,-592.99999,-61.905118)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4663"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0005391,-592.99999,-61.967652)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4665"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0005391,-786.99999,-61.905118)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3427"
+ id="linearGradient4667"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1,0,0,1.0005391,-592.99999,-61.905118)"
+ x1="-11.793251"
+ y1="-0.17180708"
+ x2="-11.793251"
+ y2="-124.49196" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4669"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1999089e-8,3.4454488e-8,2.4759518,-454.53398,151.91296)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4671"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5793098e-8,2.0757046e-7,3.5149731,-559.14935,265.99324)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4673"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,-524.0541,-13.33323)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4675"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999994)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4677"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999994)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3303"
+ id="linearGradient4679"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,42.700006)"
+ x1="-127.61703"
+ y1="-310.29703"
+ x2="-127.61703"
+ y2="-275.16071" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4681"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-786.99999,-61.999994)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3427"
+ id="linearGradient4683"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(-592.99999,-61.999994)"
+ x1="-11.793251"
+ y1="-0.17180708"
+ x2="-11.793251"
+ y2="-124.49196" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4685"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,-454.53398,151.70288)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4687"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,-559.14935,265.72169)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4691"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.2820885,-7.5752261e-8,2.0757046e-7,3.5130793,255.85065,522.72169)"
+ cx="-120"
+ cy="-109.7959"
+ fx="-120"
+ fy="-109.7959"
+ r="78" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3273"
+ id="radialGradient4694"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.1538834,-1.1992624e-8,3.4454488e-8,2.4746178,360.46602,408.70288)"
+ cx="-120"
+ cy="-150.6152"
+ fx="-120.37437"
+ fy="-166.52031"
+ r="78" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3427"
+ id="linearGradient4697"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(222.00001,195)"
+ x1="-11.793251"
+ y1="-0.17180708"
+ x2="-11.793251"
+ y2="-124.49196" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3410"
+ id="linearGradient4700"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(28.00001,195)"
+ x1="90.5"
+ y1="-193.5"
+ x2="90.5"
+ y2="-11.834614" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3303"
+ id="linearGradient4703"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(222.00001,299.7)"
+ x1="-127.61703"
+ y1="-310.29703"
+ x2="-127.61703"
+ y2="-275.16071" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3259"
+ id="linearGradient4706"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(222.00001,195)"
+ x1="-80"
+ y1="-67.985718"
+ x2="-80"
+ y2="-208.05618" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3385"
+ id="linearGradient4709"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="translate(222.00001,195)"
+ x1="-100"
+ y1="-106.62158"
+ x2="-100"
+ y2="-228.88507" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3393"
+ id="radialGradient4712"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.5639745,-4.2049211e-8,3.0891185e-8,1.1489639,290.9459,243.66677)"
+ cx="-122.25"
+ cy="-192.92754"
+ fx="-122.25"
+ fy="-192.92754"
+ r="94" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient5515"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.9411745e-2,0,0,0.4195896,83.565267,-578.06695)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <linearGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient7141"
+ id="linearGradient5517"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9411745e-2,0,0,0.9996163,77.614494,52.726514)"
+ x1="50.10762"
+ y1="89.277901"
+ x2="50.10762"
+ y2="9.2778997" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient5519"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9411745e-2,0,0,0.3188565,14.469724,23.356188)"
+ cx="2040.6406"
+ cy="136.14062"
+ fx="2040.6406"
+ fy="136.14062"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient5521"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-4.9460378e-3,4.5042486e-2,1.2382186e-3,0.157057,82.171903,-50.659102)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient5523"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(2.9411745e-2,0,0,0.4195896,65.411787,-578.06695)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient5525"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(-2.9411745e-2,0,0,-0.4195896,83.588241,705.06522)"
+ cx="215"
+ cy="1608.8442"
+ fx="214.5"
+ fy="1575.4911"
+ r="91.609375" />
+ <radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient3215"
+ id="radialGradient5527"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(4.9460378e-3,4.5042486e-2,-1.2382186e-3,0.157057,66.828125,-50.659102)"
+ cx="2132.25"
+ cy="136.14069"
+ fx="2132.25"
+ fy="136.14069"
+ r="91.609398" />
+ </defs>
+ <image
+ xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAABACAYAAADGbyPbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
+AAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAABKISURB
+VHic7ZxtbBzVesf/Z1733eu3OA4bEhOTgBJIuCl5Eam40kWhfEgRVBekUoJQkAAJtSG0SFe8KOFT
+BZUiSFQq+ICiVkKCEFGBKqUBEUpVhxuF2sktDk5M4hvH146NHcdee3d2XvphfGafPT6zuyHxZiPx
+SEczszs758z5zf85zzlzzjLP81AvxhhjABgAFYAGwASQALB0y5Ytr/X09DxUy/KsXr164tixY38D
+4DSASQA5AAUADgDXq6PK0250ASoYryiPMZaPxWI1zdwwjAIpQ11bvYME/Ip0Pc/LR6PRmmas67oz
+l3/dw7wZQAKA53meVWtFaprGQda93SwgmWEYZq0VqWmaBr/Nrnu7WUCqpmnGa61IVVU1AApuApg3
+A0gFADNNM1brIFHXdQ6y7q3eQXIlqJFIJKoota1TwzBU/KLIn21M2AKAouu66TdZtTNd11X4fVpa
+prqEWo8gRWPwFWn64wW1M0VRqCLrEiC3egUpKkCJRCJGrRXJGBMVGXw1l+qma1KvILkFQ3bRaNTQ
+db3W+auKoiiu60rVyBhj9TJMV88gqSrVaDSqm6ZZk4wJG7Zs2bL0uXPn6t691jNIYM6tAlBjsVhN
+QIoCa2lpSZ07d04MeOrO6h0k4FecnkqlogvdRnKInucF+x0dHbceP37cQJ13Q+oRJBOSvmzZssam
+pqaY4zgLmjGH5zgOXNcFACxfvnwFgAj8oIeWr66sbkCSd5EACXIA6I899tiv4vE4C+t+yOINqq5q
+zfM8uK6LQqEA/tAsWrToFhRB0hGJX6LWMkaVqABQNU2LZzKZ2xKJBBhjKNeXlEHjyuLbSr+1bRuK
+osCyLDDG0NTU1AogBYC7V+pi6wbmDQUpSIwCVOArwDBNs2HNmjVrkskkFEUBY6xqlVGIYW6ZKtdx
+HCiKAsdxYNs2GGNob29vXbt2bUdPT08/AB3+DAEFc+9J6T3cyK5IzUCG+MV5Hf+5pMFXQMOjjz66
+vqOj45ZCoQBVVfm1AMxXoOzY8zzYtg3XdUuCGHo+P6dQKMC27SAPRVGgKIr6/PPP//a5557rATAN
+wMZ8FXq0XEIZagKXLUQ+FaDRfbrlAHUAUQBNGzZsWHfw4MF3ADRxNdJLh5WdAuNqtG07+JwGNTwV
+CgXkcjnkcjnMzMzAsiwoioJoNIp4PJ5799133/noo48+A3ARPtA8fKjOXALI1BRaHEn5rnulXxeQ
+EnCVoAHFtoa7UX0uJXVdb37ttdf+8sUXX/z7fD5v5PP5wK3KLEyZHFqhUEChUAhUSeEVCgXk83lY
+loVcLhfsc9dqGAbi8Tiam5udw4cPf7Rnz55/BTAE4DKAWQAWfHfrojgthO9DshX3rwvYawIpaePE
+bRg0mkwApq7ryebm5sb33nvvmQ0bNjyUTqfTk5OTQbulKIo0EqVBjOg6AQRqtCwr2OdJBMjBOo4D
+z/PAGIOqqtB1HZFIBM3NzbAsa7y3t/ebvXv3fvjjjz9ehD+7LovSGXYOfLW6cwkoDzco9M+FetUg
+y8Cj7Zw4rZFvDfhuM5bJZBpeeumlLWvXrl2/ePHiVel0+pZUKpV0XVeZmZnB7OxsUPG8cnlbR10i
+T7ZtB/0/sR3kbR/9LVcm/5wab4s1TQNjDJqmBUBTqRRSqRQikYg9Ozs7ns1mh8bGxvr7+/tPHTx4
+8MTJkydHUAQ7i1K4PFHVSqFeLdCqQRKAYfAU+K5RQ3FOagRAPJPJpHfu3Hnf2rVrNyxZsuSOhoaG
+xbquJ23bZlwNoipyuVwJABEOj1553090p/wc13VhWVbwMFD3yn8rBkL02PM8qKoKwzAQjUaRTCYR
+iUQQiUQQi8UQi8UQjUYRi8VgGIbnOM7U1NTUyOjo6Nn+/v6eTz/99PdffPHFHwHMwAebg6/WAkrb
+WA9ysFVBrQiyAkDatkUBJA3DaNi1a9e9GzZs2JjJZFan0+lb4/F4Yy6XU2ZnZ5HNZoOKpSaCop3z
+mZmZQDW0gsPgUsgAgodB7FPyPMRyUJCMMZimiWg0CkVRoKpq4HK5Wvnnuq4HAVIsFgtg5/P5KxMT
+E4MjIyN9fX19PYcOHfp9V1fXRQBT8AMnDtdBqVJLpmKWAxoKsgxA3rbpKM4Eb9q/f/9v77///r9q
+aWlZZtu2Nj09HUCjTz25vjRfmfosy8L09LS0PaT9Sn5M21OgdMiNnkevIV6XKjEejwfulv6e58X3
+xc8ABJA1TQvARqNRTE1NjfX29n799ttv/9vRo0f74Le1s/CjYZlKy7pcKUgBogjQgO8yG+66665l
+r7/++tPr1q17MBqNNnJ4NNSnxo+r6QfS33uehytXrsxTMSnvPCDU+IMkAhMHF2SDDel0GoZhSB8Y
+bnQuEQUqKydXcyQSQSKRgKIo9tmzZ7/77LPPPty7d+9/ARhHsXvD29eKQJlwIzKADL76DABxAE3b
+t2//1fbt259etWrVZtu2jWw2i0KhEDq+WanSyvUH+Xm8fydTEa0kmcIA+RBdpQdL0zQ0NjYGChfd
+t2j8O3GSWNi5gB9YxWIxmKaJsbGxga6urs9279790aVLl/4E4ApKA6aSAInCZORmZKMs3IXGALS8
+8sorDz788MM7li5deqdlWWxmZiYIGnhF0Mq5msCrXOUAgGVZmJqakgKRQaVGf1NpQIHeSyQSQSqV
+KgEdMnoz72Go9BuxPIqiIBKJIBqNYnZ2drq7u/vwrl273hkYGLiA4gIi2qUpgcnmMpJB5JFnevny
+5bft37//d+vXr/+N4zgsl8sF7lOsEAqwHEzx5sQKEM22bUxOTs47r5Jblbn4sPPEe0gkEohEIoEi
+RTjida/24RWNu13TNKHrOiYmJkY/+OCDf3rrrbf+A8Al+JGvBSEg8jzPE18d8T5goMKdO3c+9Oyz
+z/6uoaGhlY6QyCpgIc3zPExOTlZ8i8FNFsDQ76qI1pFIJGCa5nW/x0rumTEGXdcxN0fJO3HixJGn
+n376jbGxsfPwI10eEAUwxbaQBzQJAG27d+/+62eeeeYfVFXVaJ+OW1jUKFo5VcrUK2tPXdfF9PR0
+8BYjTIEypfMyV1M2fqwoChKJBOiEr0puUrxONS5Vdi6Nfg3DgKIo6O/v/8Pjjz++c3BwkEe4FKZL
+VcjdaQzA4jfffPOZJ5988m8ZYwp9K1ApQBErRFZ4WTdEFqSIx9lstmT4TLxxMS8xCr6a8rqui1Qq
+BT69pNzvK7WL1UCl59CtoihB/3RgYKDviSeeeOHMmTPfw4fJ3azLVcjgQ4wAaH3hhRceefXVV/+R
+Mcb4uGTYkytr6GWFFAsY1gcr19bNzs6WdEGqVcfVGi9vMpmcd29hY7uy951h7X41YGUwGWPo7u4+
+tnXr1r8DMADfzdoAHO5K+fBaorW1deW+ffveSiQSCT6yUq5PWM54461pWuDzdV0PjlVVhaqqwaC4
+DCpNXI21aJcVRYFpmkG5eBl5mXnSNK0kifcChAdHYl3JjN6voihoa2vLGIYx/s0335yGH8k6QDGw
+UeEPsd3y/vvvv7Zt27bHAAQD1mGVJ3vi+M3SG7pexqPlagOeazE+EnMtC4eo1+KDEmJ3rVyXi+7z
+9pIxhrGxsfE1a9Y8AqAPvioLfCEnH7Fp6Ozs/DMKiAcaYTBFcDTzWqlnIe16PTRU0Z5XfCcqXp/X
+twwmr8t0Ot3061//evXRo0cvwO+SOBykAkCPRqONS5YsydALcXfBYYrtnCyjhYJXCyVyo9HuQhh/
++OkMBplRt86F4XketmzZsu7o0aNfw49tChSk6jiOwRhTxKiSXyzMaqW6Sp3/6221aot5/XKo4kgU
+fx/KyzSnaP7WSQHAOEgGAJZl5QcHBy93dna2iAPB9Gm4USa+GVnovGrpAXhgqKpqcJ+KogQvt4HS
+tvbUqVPDKL7iYnQWnQtg5sSJE70dHR1/zp/8sE70jQJaS/XXEqSYN3/fCZQ2WY7jYHBwcOrIkSP/
+B39QAEBxOqQHP4yd2rdv378/8MADGxsaGgxZ1CmO5NQSaK0rttaKBFASNAKl70e5Gj/55JOv8/n8
+JRQHBErm1KgAlMnJSXdqaiq6cePGO1RVZTJFin2kWiWeXy1MfFgX8p5oQCMbI+ZKdF0XR44c6Xvj
+jTfec133PPzXXBaEAQE+VOedOnVqZHh4WN28efNKXddLohzZ0FitolYxz4VOC3kPfEu7b7IRIKrE
+zz///IedO3fudxznNICfQN5V0qXVHKQLwD59+vTwhQsXsGnTppWGYShiBmLBRJdAC/JLKtYXByb2
+vcMA8q7JoUOHTr/88sv/7HleL4BR+AMBFubeUYp/dsCTA8A6c+bM8Pnz5+01a9asSCQSughQLCSH
+SsdRxfNudIXWGhytj3IjXhQenbY5MzPjffjhhz179uz5F/gjOSOYPxXEoa+u+HR9Po0xBqAJQCaZ
+TN65Y8eObY888sjdLS0tOnUFsmBILCBQ7DrIJmKJD8PNaLIXAuL4sWhiHVAVWpaFr7766sKBAwf+
+s6en53/gD5JzJfJJWoW55HCXyqd1iDCjAJIAWgG0t7W1rd6xY8dfbNu2bWUqlVJlA8Q/B6yoWG43
+KvwPMxGI7C2OOExJLcyj0Qfctm10dXWNHDhw4Ouurq7/hr/W5BL8JQp84rOFolu1IXkfSWEaKM6Y
+i8FfI9gMoH3FihXrnnrqqd9s2bJlWUtLi8aBXg3UsCE+0b3IZiOIbvp6WFi5qaJE18ihyZoOscyy
+cvP75JOov/vuu7GPP/742yNHjnwFH+AoiksSuAr5WhM6IcsV20YKkwI15xIH2gRgUTKZ7HjwwQc3
+3nfffSvvvffeRclkUhGh0ooJe5plLojvi20PvXmarsXogLbsoRTLQmGI5ZJ5F7qlD6lt2/j+++8n
+jx079uPhw4f/t7+//w/w28Ax+Aqcga9A7ka5CksgAvDo5CsRJlUnT1yhEfjTQVIA0gCa29raVmzd
+unX95s2bO++5557mSCTCxHd5FKb4HXVR4jYMsvhgiCYLOsqdIwYrsiBGBCZr+2kMIH5u2zb6+/tn
+vv3223Nffvllz8mTJ0/NgZuYg0fbQK4+6kbpjPRgNl25WXQiUArVwPzAKAmgEUBjR0fHHZs2bVq9
+cuXKJZ2dna2dnZ1x0zRLwPEhKKqAaqCKcMu9kBYBV4qcxTUfMkgyryCLNvnntm1jaGjI6uvr++nM
+mTPD3d3dZ48fP96Nouom4SuPz5DjAOn6EBnAkimR5ea1UnXy+TwUquh+aXuamAObANDQ3t6+fP36
+9SvvvPPOW1asWLFo1apVqVQqxUSXxkf5RaC07yULLq6mU18NxDCV0SRbHeZ5HvL5PPr7+7Nz4P7U
+3d39Y29v7xn4HfjpOcVNwW/38igux+PgKDxxFRcFOH9eKzUBKA2EZGsbZXCpaoMVWXNQYwCSiURi
+yd133925dOnSlkwm07R48eKG9vb25NKlS6PJZJKJ0ynEKRaydqya+T8yRYoq5GoSl+1xt8i/y+Vy
+GBoayl+8eDE7PDw8OTQ0dHlgYGD0hx9++OPQ0NB5FIOUaRQVx9VGXSVv7yrBExf3BBClICUwRYVS
+lYpgRcgctNjGRoVtBEA8Eok03X777bfedtttizKZTHNra2sqmUxGUqmUmU6njebmZiORSCimaZZA
+raRSCg8oXTYnLq/jfbhcLuf99NNP9sTEhHXlypX85OTk7OXLl7ODg4Pj586dGzt79uzF8fHxYRTb
+NB6UzJJEI0zRRZZLIrzQpQJlQQowywGlSYVcuTQS5i6aQqbumUPlauZtsQ4gyhiLNzc3N7a1tTW1
+trYmW1paEslkMmaapqbrumaapmYYhqZpmmKapqZpmmIYhsoYY7ZtO5ZluYVCwbEsy7Ysy7Esyy4U
+CnY+n7ez2Wx+fHw8Ozo6OjU6OjoxMjIyVigUsii2XRwKV1WeJNod4CpzJdBcyT7disqbt8pZBrEs
+yCqBytxvOcAiaPEcDfODLLqMjy+k1YVzaBnEcvEkVhBQ/BMHWtm2JImLUkVI5aCIx/QzD+HKqwog
+t5+zYhkgswoQDpXCDQMtfs6HDJnkWHYNERgw/9+pRKMVJCYRNq90WYXL3F+lz8XrhKWgnJUABjd6
+tSMjEqDiNkyxYfvVqCnsmOZJyyHui+aV2cqUEQZa3JcpK2xfzJOWo2qAwc1eyxBXlVDpfqUkexMj
+JvF6srzFfWpemX1ZBVebyqks7PolZbhaeNSu2x8msfmdtrBKrgSkGmg/B6BoMqBhKgmDK34WdhyW
+3zXBo7Yg/3wFlAVL96/XVtyX5Rt2o+UUKm7LueRKvy9+sQCVvmAg52UkG2YJB1HNfjXHlUy8+XLH
+1ezLjhcEnGj/D+qqkk1i4uhuAAAAAElFTkSuQmCC
+"
+ width="114"
+ height="64"
+ id="base"
+ x="46"
+ y="136" />
+ <g
+ id="Livello_1"
+ transform="matrix(0.5,0,0,0.5,189,14.867)" />
+ <g
+ id="g3312"
+ transform="matrix(0.875,0,0,0.8703703,318.74998,21.953671)" />
+ <rect
+ style="opacity:0.875;fill:#008000;fill-opacity:1;stroke:none;stroke-width:0;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="hint-stretch-borders"
+ width="5"
+ height="4.375"
+ x="0"
+ y="0" />
+ <rect
+ y="19"
+ x="25.999969"
+ height="116"
+ width="152"
+ id="center"
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.30000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <g
+ transform="translate(815,257)"
+ id="topleft">
+ <path
+ style="fill:url(#radialGradient4673);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -799,-249 C -803.43882,-249 -807,-245.43881 -807,-241 L -807,-238 L -789,-238 L -789,-249 L -799,-249 z"
+ id="rect3383" />
+ <path
+ style="fill:url(#linearGradient4675);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -799.0625,-248 C -802.91371,-248 -806,-244.91371 -806,-241.0625 L -806,-238 L -789,-238 L -789,-248 L -799.0625,-248 z"
+ id="rect3311" />
+ <path
+ style="fill:url(#linearGradient4677);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -798.96875,-245 C -801.20404,-245 -803,-243.20404 -803,-240.96875 L -803,-238 L -789,-238 L -789,-245 L -798.96875,-245 z"
+ id="rect3271" />
+ <path
+ style="fill:url(#linearGradient4679);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -798.96875,-244.96875 C -801.20403,-244.96875 -803,-243.17279 -803,-240.9375 L -803,-238 C -802.96755,-240.22473 -801.1836,-242.96875 -798.96875,-242.96875 L -789,-242.96875 L -789,-244.96875 L -798.96875,-244.96875 z"
+ id="rect3298" />
+ <path
+ style="fill:url(#linearGradient4681);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -798.96875,-245 C -801.20403,-245 -803,-243.20404 -803,-240.96875 L -803,-238 L -802,-238 L -802,-241 C -801.99999,-242.66397 -800.66398,-244 -799,-244 L -789,-244 L -789,-245 L -798.96875,-245 z"
+ id="rect3401" />
+ <path
+ style="fill:url(#linearGradient4683);fill-opacity:1;stroke:none;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -798.96875,-245 C -801.20403,-245 -803,-243.20404 -803,-240.96875 L -803,-238 L -789,-238 L -789,-245 L -798.96875,-245 z"
+ id="path3420" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4685);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-240 C -790.10256,-239.98303 -790.98303,-239.10256 -791,-238 L -789,-238 L -789,-240 z"
+ id="rect3281" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4687);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-240 C -790.10256,-239.98303 -790.98303,-239.10256 -791,-238 L -789,-238 L -789,-240 z"
+ id="rect5414" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-239 C -789.557,-239 -790,-238.557 -790,-238 L -789,-238 L -789,-239 z"
+ id="rect3267" />
+ </g>
+ <g
+ transform="translate(815,257)"
+ id="left">
+ <path
+ style="fill:url(#radialGradient4659);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -807,-238 L -807,-122 L -789,-122 L -789,-238 L -807,-238 z"
+ id="rect5818" />
+ <path
+ style="fill:url(#linearGradient4661);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -806,-238 L -806,-122 L -789,-122 L -789,-238 L -806,-238 z"
+ id="rect5820" />
+ <path
+ style="fill:url(#linearGradient4663);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -803,-238 L -803,-122 L -789,-122 L -789,-238 L -803,-238 z"
+ id="rect5822" />
+ <path
+ style="fill:url(#linearGradient4665);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -803,-238 L -803,-122 L -802,-122 L -802,-238 L -803,-238 z"
+ id="path5826" />
+ <path
+ style="fill:url(#linearGradient4667);fill-opacity:1;stroke:none;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -803,-238 L -803,-173.74663 C -798.42875,-173.13725 -793.73899,-172.59019 -789,-172.08949 L -789,-238 L -803,-238 z"
+ id="path5828" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4669);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -791,-238 C -791.00017,-237.98925 -791,-237.97953 -791,-237.96873 L -791,-122 L -789,-122 L -789,-238 L -791,-238 z"
+ id="rect5830" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4671);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -791,-238 C -791.00017,-237.98925 -791,-237.97953 -791,-237.96873 L -791,-122 L -789,-122 L -789,-238 L -791,-238 z"
+ id="rect5832" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -790,-238 L -790,-122 L -789,-122 L -789,-238 L -790,-238 z"
+ id="rect5834" />
+ </g>
+ <g
+ transform="translate(815,257)"
+ id="bottomleft">
+ <path
+ style="fill:url(#radialGradient4647);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -807,-122 L -807,-119 C -807,-114.56118 -803.43884,-111 -799,-111 L -789,-111 L -789,-122 L -807,-122 z"
+ id="rect5938" />
+ <path
+ style="fill:url(#linearGradient4649);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -806,-122 L -806,-118.9375 C -806,-115.08629 -802.91373,-112 -799.0625,-112 L -789,-112 L -789,-122 L -806,-122 z"
+ id="rect5940" />
+ <path
+ style="fill:url(#linearGradient4651);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -803,-122 L -803,-119.03125 C -803,-116.79596 -801.20407,-115 -798.96875,-115 L -789,-115 L -789,-122 L -803,-122 z"
+ id="rect5942" />
+ <path
+ style="fill:url(#linearGradient4653);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -803,-122 L -803,-119.03125 C -802.99999,-116.79595 -801.20404,-115 -798.96875,-115 L -789,-115 L -789,-116 L -799,-116 C -800.66397,-116 -802,-117.33601 -802,-119 L -802,-122 L -803,-122 z"
+ id="path5946" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4655);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -791,-122 C -790.98303,-120.89744 -790.10257,-120.01697 -789,-120 L -789,-122 L -791,-122 z"
+ id="rect5950" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4657);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -791,-122 C -790.98303,-120.89744 -790.10257,-120.01697 -789,-120 L -789,-122 L -791,-122 z"
+ id="rect5952" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -790,-122 C -790,-121.443 -789.55702,-121 -789,-121 L -789,-122 L -790,-122 z"
+ id="rect5954" />
+ </g>
+ <g
+ id="top">
+ <path
+ style="fill:url(#radialGradient4712);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,8 L 26,19 L 178,19 L 178,8 L 26,8 z"
+ id="rect6094" />
+ <path
+ style="fill:url(#linearGradient4709);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,9 L 26,19 L 178,19 L 178,9 L 26,9 z"
+ id="rect6096" />
+ <path
+ style="fill:url(#linearGradient4706);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,12 L 26,19 L 178,19 L 178,12 L 26,12 z"
+ id="rect6098" />
+ <path
+ style="fill:url(#linearGradient4703);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,12.03125 L 26,14.03125 L 178,14.03125 L 178,12.03125 L 26,12.03125 z"
+ id="path6100" />
+ <path
+ style="fill:url(#linearGradient4700);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,12 L 26,13 L 178,13 L 178,12 L 26,12 z"
+ id="path6102" />
+ <path
+ style="fill:url(#linearGradient4697);fill-opacity:1;stroke:none;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,12 L 26,19 L 178,19 L 178,12 L 26,12 z"
+ id="path6104" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4694);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,17 L 26,19 L 178,19 L 178,17 C 177.98926,16.99983 177.97954,17 177.96875,17 L 26.03125,17 C 26.02046,17 26.01074,16.99983 26,17 z"
+ id="rect6106" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4691);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,17 L 26,19 L 178,19 L 178,17 C 177.98926,16.99983 177.97954,17 177.96875,17 L 26.03125,17 C 26.02046,17 26.01074,16.99983 26,17 z"
+ id="rect6108" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 26,18 L 26,19 L 178,19 L 178,18 L 26,18 z"
+ id="rect6110" />
+ </g>
+ <g
+ transform="translate(815,257)"
+ id="bottom">
+ <path
+ style="fill:url(#radialGradient4619);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-122 L -789,-111 L -637,-111 L -637,-122 L -789,-122 z"
+ id="rect6215" />
+ <path
+ style="fill:url(#linearGradient4621);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-122 L -789,-112 L -637,-112 L -637,-122 L -789,-122 z"
+ id="rect6217" />
+ <path
+ style="fill:url(#linearGradient4623);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-122 L -789,-115 L -637,-115 L -637,-122 L -789,-122 z"
+ id="rect6219" />
+ <path
+ style="fill:url(#linearGradient4625);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-116 L -789,-115 L -637,-115 L -637,-116 L -789,-116 z"
+ id="path6223" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4627);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-122 L -789,-120 C -788.98926,-119.99983 -788.97954,-120 -788.96875,-120 L -637.03125,-120 C -637.02046,-120 -637.01074,-119.99983 -637,-120 L -637,-122 L -789,-122 z"
+ id="rect6227" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4629);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-122 L -789,-120 C -788.98926,-119.99983 -788.97954,-120 -788.96875,-120 L -637.03125,-120 C -637.02046,-120 -637.01074,-119.99983 -637,-120 L -637,-122 L -789,-122 z"
+ id="rect6229" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -789,-122 L -789,-121 L -637,-121 L -637,-122 L -789,-122 z"
+ id="rect6231" />
+ </g>
+ <g
+ transform="translate(815,257)"
+ id="topright">
+ <path
+ style="fill:url(#radialGradient4603);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-249 L -637,-238 L -619,-238 L -619,-241 C -619,-245.43882 -622.56119,-249 -627,-249 L -637,-249 z"
+ id="rect6708" />
+ <path
+ style="fill:url(#linearGradient4605);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-248 L -637,-238 L -620,-238 L -620,-241.0625 C -620,-244.91371 -623.0863,-248 -626.9375,-248 L -637,-248 z"
+ id="rect6710" />
+ <path
+ style="fill:url(#linearGradient4607);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-245 L -637,-238 L -623,-238 L -623,-240.96875 C -623,-243.20404 -624.79596,-245 -627.03125,-245 L -637,-245 z"
+ id="rect6712" />
+ <path
+ style="fill:url(#linearGradient4609);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-244.96875 L -637,-242.96875 L -627.03125,-242.96875 C -624.81639,-242.96875 -623.03244,-240.22473 -623,-238 L -623,-240.9375 C -622.99999,-243.17279 -624.79596,-244.96875 -627.03125,-244.96875 L -637,-244.96875 z"
+ id="path6714" />
+ <path
+ style="fill:url(#linearGradient4611);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-245 L -637,-244 L -627,-244 C -625.33602,-244 -624,-242.66398 -624,-241 L -624,-238 L -623,-238 L -623,-240.96875 C -622.99999,-243.20404 -624.79596,-245 -627.03125,-245 L -637,-245 z"
+ id="path6716" />
+ <path
+ style="fill:url(#linearGradient4613);fill-opacity:1;stroke:none;stroke-width:1.29999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-245 L -637,-238 L -623,-238 L -623,-240.96875 C -622.99999,-243.20404 -624.79596,-245 -627.03125,-245 L -637,-245 z"
+ id="path6718" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4615);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-240 L -637,-238 L -635,-238 C -635.01697,-239.10256 -635.89743,-239.98303 -637,-240 z"
+ id="rect6720" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4617);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-240 L -637,-238 L -635,-238 C -635.01697,-239.10256 -635.89743,-239.98303 -637,-240 z"
+ id="rect6722" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-239 L -637,-238 L -636,-238 C -636,-238.557 -636.44298,-239 -637,-239 z"
+ id="rect6724" />
+ </g>
+ <g
+ transform="translate(815,257)"
+ id="right">
+ <path
+ style="fill:url(#radialGradient4589);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-238 L -637,-122 L -619,-122 L -619,-238 L -637,-238 z"
+ id="rect6907" />
+ <path
+ style="fill:url(#linearGradient4591);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-238 L -637,-122 L -620,-122 L -620,-238 L -637,-238 z"
+ id="rect6909" />
+ <path
+ style="fill:url(#linearGradient4593);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-238 L -637,-122 L -623,-122 L -623,-238 L -637,-238 z"
+ id="rect6911" />
+ <path
+ style="fill:url(#linearGradient4595);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -624,-238 L -624,-122 L -623,-122 L -623,-238 L -624,-238 z"
+ id="path6915" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4597);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-238 L -637,-122 L -635,-122 C -634.99983,-122.01074 -635,-122.02046 -635,-122.03125 L -635,-237.96875 C -635,-237.97954 -634.99983,-237.98926 -635,-238 L -637,-238 z"
+ id="rect6919" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4599);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-238 L -637,-122 L -635,-122 C -634.99983,-122.01074 -635,-122.02046 -635,-122.03125 L -635,-237.96875 C -635,-237.97954 -634.99983,-237.98926 -635,-238 L -637,-238 z"
+ id="rect6921" />
+ <path
+ style="opacity:1;fill:url(#linearGradient4601);fill-opacity:1;stroke:none;stroke-width:0.30000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-238 L -637,-175.59375 C -632.22086,-176.35687 -627.54532,-177.18419 -623,-178.0625 L -623,-238 L -637,-238 z"
+ id="rect6903" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-238 L -637,-122 L -636,-122 L -636,-238 L -637,-238 z"
+ id="rect6923" />
+ </g>
+ <g
+ transform="translate(815,257)"
+ id="bottomright">
+ <path
+ style="fill:url(#radialGradient4577);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-121.99923 L -637,-110.99923 L -627,-110.99923 C -622.56118,-110.99923 -619,-114.56041 -619,-118.99923 L -619,-121.99923 L -637,-121.99923 z"
+ id="rect7118" />
+ <path
+ style="fill:url(#linearGradient4579);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-121.99923 L -637,-111.99923 L -626.9375,-111.99923 C -623.08629,-111.99923 -620,-115.08552 -620,-118.93673 L -620,-121.99923 L -637,-121.99923 z"
+ id="rect7120" />
+ <path
+ style="fill:url(#linearGradient4581);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-121.99923 L -637,-114.99923 L -627.03125,-114.99923 C -624.79596,-114.99923 -623,-116.79518 -623,-119.03048 L -623,-121.99923 L -637,-121.99923 z"
+ id="rect7122" />
+ <path
+ style="fill:url(#linearGradient4583);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -624,-121.99923 L -624,-118.99923 C -623.99999,-117.33524 -625.33602,-115.99923 -627,-115.99923 L -637,-115.99923 L -637,-114.99923 L -627.03125,-114.99923 C -624.79595,-114.99923 -623,-116.79518 -623,-119.03048 L -623,-121.99923 L -624,-121.99923 z"
+ id="path7126" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4585);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-121.99923 L -637,-119.99923 C -635.89744,-120.0162 -635.01697,-120.89667 -635,-121.99923 L -637,-121.99923 z"
+ id="rect7130" />
+ <path
+ style="opacity:0.70720712;fill:url(#radialGradient4587);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-121.99923 L -637,-119.99923 C -635.89744,-120.0162 -635.01697,-120.89667 -635,-121.99923 L -637,-121.99923 z"
+ id="rect7132" />
+ <path
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M -637,-121.99923 L -637,-120.99923 C -636.443,-120.99923 -636,-121.44223 -636,-121.99923 L -637,-121.99923 z"
+ id="rect7134" />
+ </g>
+ <g
+ transform="translate(607,257)"
+ id="glass">
+ <rect
+ y="-238"
+ x="-581"
+ height="116"
+ width="152"
+ id="rect7704"
+ style="opacity:1;fill:url(#linearGradient4573);fill-opacity:1;stroke:none;stroke-width:0.30000001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ sodipodi:nodetypes="cccc"
+ id="path5718"
+ d="M -581,-238 L -429,-238 L -581,-122 L -581,-238 z"
+ style="fill:url(#linearGradient4575);fill-opacity:1;stroke:none;stroke-width:0.79999995;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1" />
+ </g>
+</svg>
--- desktoptheme/widgets/containment-controls.svg
+++ desktoptheme/widgets/containment-controls.svg
@@ -2,7 +2,7 @@
<!-- 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:cc="http://creativecommons.org/ns#"
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"
@@ -13,11 +13,11 @@
height="128"
id="svg2"
sodipodi:version="0.32"
- inkscape:version="0.45.1"
+ inkscape:version="0.46"
version="1.0"
sodipodi:docbase="/opt/svn/kdebase/workspace/plasma/desktoptheme/widgets"
- sodipodi:docname="containment-controls.svg"
- inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ sodipodi:docname="containment-controls.svgz"
+ inkscape:output_extension="org.inkscape.output.svgz.inkscape"
inkscape:export-filename="arrow-up.png"
inkscape:export-xdpi="11.25"
inkscape:export-ydpi="11.25">
@@ -35,2547 +35,562 @@
id="stop3582" />
</linearGradient>
<linearGradient
- id="linearGradient8162">
- <stop
- id="stop8164"
- offset="0"
- style="stop-color:#c5c5c5;stop-opacity:1;" />
- <stop
- id="stop8166"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient8156">
- <stop
- id="stop8158"
- offset="0"
- style="stop-color:#dcdcdc;stop-opacity:1;" />
- <stop
- id="stop8160"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient8150">
- <stop
- id="stop8152"
- offset="0"
- style="stop-color:#e3e3e3;stop-opacity:1;" />
- <stop
- id="stop8154"
- offset="1"
- style="stop-color:#8f8f8f;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient8144">
- <stop
- id="stop8146"
- offset="0"
- style="stop-color:#cfcfcf;stop-opacity:1;" />
- <stop
- id="stop8148"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:1;" />
- </linearGradient>
- <linearGradient
- id="linearGradient8138">
- <stop
- style="stop-color:#f0f0f0;stop-opacity:1;"
- offset="0"
- id="stop8140" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop8142" />
- </linearGradient>
- <linearGradient
- id="linearGradient8132">
- <stop
- id="stop8134"
- offset="0"
- style="stop-color:#787878;stop-opacity:1;" />
- <stop
- id="stop8136"
- offset="1"
- style="stop-color:#ffffff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient8126">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop8128" />
- <stop
- style="stop-color:#e1e1e1;stop-opacity:1;"
- offset="1"
- id="stop8130" />
- </linearGradient>
- <linearGradient
- id="linearGradient7151">
- <stop
- id="stop7153"
- offset="0"
- style="stop-color:#a8c1ff;stop-opacity:1;" />
- <stop
- id="stop7155"
- offset="1"
- style="stop-color:#b8ddff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient7145">
- <stop
- id="stop7147"
- offset="0"
- style="stop-color:#c2e2ff;stop-opacity:1;" />
- <stop
- id="stop7149"
- offset="1"
- style="stop-color:#80bbff;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- id="linearGradient7139">
- <stop
- style="stop-color:#80c2ff;stop-opacity:1;"
- offset="0"
- id="stop7141" />
- <stop
- style="stop-color:#80bbff;stop-opacity:0;"
- offset="1"
- id="stop7143" />
- </linearGradient>
- <linearGradient
- id="linearGradient7133">
- <stop
- id="stop7135"
- offset="0"
- style="stop-color:#03002a;stop-opacity:1;" />
- <stop
- id="stop7137"
- offset="1"
- style="stop-color:#00002a;stop-opacity:0;" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3710">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3712" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3714" />
- </linearGradient>
- <linearGradient
- id="linearGradient3689"
+ id="linearGradient3272"
inkscape:collect="always">
<stop
- id="stop3691"
+ id="stop3274"
offset="0"
- style="stop-color:#f0ff80;stop-opacity:1" />
+ style="stop-color:white;stop-opacity:1;" />
<stop
- id="stop3693"
+ id="stop3276"
offset="1"
- style="stop-color:#f0ff80;stop-opacity:0" />
+ style="stop-color:white;stop-opacity:0;" />
</linearGradient>
- <linearGradient
+ <radialGradient
inkscape:collect="always"
- id="linearGradient3669">
- <stop
- style="stop-color:#ffffff;stop-opacity:1;"
- offset="0"
- id="stop3671" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3673" />
- </linearGradient>
- <linearGradient
+ xlink:href="#linearGradient3272"
+ id="radialGradient3608"
+ gradientUnits="userSpaceOnUse"
+ gradientTransform="matrix(1.8125,0,0,2.2075201,-143.20779,-217.90313)"
+ cx="88"
+ cy="93.5"
+ fx="88"
+ fy="93.5"
+ r="8" />
+ <radialGradient
inkscape:collect="always"
- id="linearGradient3511">
- <stop
- style="stop-color:#002a0d;stop-opacity:1;"
- offset="0"
- id="stop3513" />
- <stop
- style="stop-color:#002a0d;stop-opacity:0;"
- offset="1"
- id="stop3515" />
- </linearGradient>
- <linearGradient
- id="linearGradient3503"
- inkscape:collect="always">
- <stop
- id="stop3505"
- offset="0"
- style="stop-color:#005f1e;stop-opacity:1" />
- <stop
- id="stop3507"
- offset="1"
- style="stop-color:#43943c;stop-opacity:1" />
- </linearGradient>
- <linearGradient
- id="linearGradient3400">
- <stop
- style="stop-color:#e5ff00;stop-opacity:1;"
- offset="0"
- id="stop3402" />
- <stop
- style="stop-color:#e5ff00;stop-opacity:0;"
- offset="1"
- id="stop3404" />
- </linearGradient>
- <linearGradient
- id="linearGradient3361">
- <stop
- style="stop-color:#edffbf;stop-opacity:1;"
- offset="0"
- id="stop3363" />
- <stop
- style="stop-color:#edffbf;stop-opacity:0;"
- offset="1"
- id="stop3365" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3348">
- <stop
- style="stop-color:#cbff10;stop-opacity:1"
- offset="0"
- id="stop3350" />
- <stop
- style="stop-color:#004d00;stop-opacity:1"
- offset="1"
- id="stop3352" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- id="linearGradient3294">
- <stop
- style="stop-color:#37a42c;stop-opacity:1;"
- offset="0"
- id="stop3296" />
- <stop
- style="stop-color:#bff500;stop-opacity:1"
- offset="1"
- id="stop3298" />
- </linearGradient>
- <filter
- inkscape:collect="always"
- id="filter3396">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.495"
- id="feGaussianBlur3398" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter3533">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.0600355"
- id="feGaussianBlur3535" />
- </filter>
- <filter
- inkscape:collect="always"
- x="-0.12239107"
- width="1.2447821"
- y="-0.078971461"
- height="1.1579429"
- id="filter3681">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="0.321914"
- id="feGaussianBlur3683" />
- </filter>
- <filter
- inkscape:collect="always"
- x="-0.45196507"
- width="1.9039301"
- y="-0.29913295"
- height="1.5982659"
- id="filter3722">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.3476562"
- id="feGaussianBlur3724" />
- </filter>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#XMLID_7_"
- id="linearGradient2360"
+ xlink:href="#linearGradient3272"
+ id="radialGradient3646"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
+ gradientTransform="matrix(1.8125,0,0,2.2075201,-134,-173.90313)"
+ cx="88"
+ cy="93.5"
+ fx="88"
+ fy="93.5"
+ r="8" />
<radialGradient
inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient2362"
+ xlink:href="#linearGradient3272"
+ id="radialGradient3652"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
+ cx="88"
+ cy="93.5"
+ fx="88"
+ fy="93.5"
+ r="8" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7133"
- id="linearGradient2364"
+ xlink:href="#linearGradient3578"
+ id="linearGradient3658"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
+ gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
+ x1="-8"
+ y1="98.130508"
+ x2="-8"
+ y2="126.82455" />
<radialGradient
inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="radialGradient2366"
+ xlink:href="#linearGradient3272"
+ id="radialGradient3691"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
+ cx="88"
+ cy="93.5"
+ fx="88"
+ fy="93.5"
+ r="8" />
<linearGradient
inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="linearGradient2368"
+ xlink:href="#linearGradient3578"
+ id="linearGradient3693"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
+ gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
+ x1="-8"
+ y1="98.130508"
+ x2="-8"
+ y2="126.82455" />
<radialGradient
inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient2370"
+ xlink:href="#linearGradient3272"
+ id="radialGradient2653"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="radialGradient2372"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
+ gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
+ cx="88"
+ cy="93.5"
+ fx="88"
+ fy="93.5"
+ r="8" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7151"
- id="linearGradient2374"
+ xlink:href="#linearGradient3578"
+ id="linearGradient2655"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
+ gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
+ x1="-8"
+ y1="98.130508"
+ x2="-8"
+ y2="126.82455" />
+ <radialGradient
inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="linearGradient2376"
+ xlink:href="#linearGradient3272"
+ id="radialGradient2669"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
+ cx="88"
+ cy="93.5"
+ fx="88"
+ fy="93.5"
+ r="8" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7145"
- id="linearGradient2378"
+ xlink:href="#linearGradient3578"
+ id="linearGradient2671"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
+ gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
+ x1="-8"
+ y1="98.130508"
+ x2="-8"
+ y2="126.82455" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient2380"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
+ id="linearGradient2727"
+ xlink:href="#linearGradient3499"
+ inkscape:collect="always" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient2382"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <radialGradient
- r="3.578125"
- fy="64.53125"
- fx="11.578125"
- cy="64.53125"
- cx="11.578125"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- gradientUnits="userSpaceOnUse"
- id="radialGradient2343"
- xlink:href="#linearGradient3710"
+ id="linearGradient2725"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
- <radialGradient
- r="3.15625"
- fy="16.0865"
- fx="71.775223"
- cy="16.0865"
- cx="71.775223"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
+ <linearGradient
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="radialGradient2341"
- xlink:href="#linearGradient3689"
+ id="linearGradient2723"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
<linearGradient
- y2="28.942928"
- x2="46.225941"
- y1="123.73875"
- x1="71.626404"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2338"
- xlink:href="#linearGradient3503"
+ id="linearGradient2721"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
- <radialGradient
- r="3.15625"
- fy="16.0865"
- fx="71.775223"
- cy="16.0865"
- cx="71.775223"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
+ <linearGradient
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="radialGradient2335"
- xlink:href="#linearGradient3669"
+ id="linearGradient2719"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
<linearGradient
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- y2="46.089832"
- x2="96.373123"
- y1="120.42788"
- x1="96.373123"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2332"
- xlink:href="#linearGradient3511"
+ id="linearGradient2717"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
<linearGradient
- y2="96.363052"
- x2="58.606159"
- y1="32.051865"
- x1="43.799026"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2328"
- xlink:href="#linearGradient3294"
+ id="linearGradient2715"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
- <radialGradient
- r="50"
- fy="91.805016"
- fx="57.058514"
- cy="79.055809"
- cx="53.630272"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
+ <linearGradient
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="radialGradient2324"
- xlink:href="#linearGradient3348"
+ id="linearGradient2713"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
<linearGradient
- gradientTransform="translate(20,0)"
- y2="44.287056"
- x2="91.992706"
- y1="112.5"
- x1="91.785248"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="matrix(0.7413699,0,0,1,-208.99731,-117.06001)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2321"
- xlink:href="#linearGradient3400"
+ id="linearGradient2711"
+ xlink:href="#linearGradient3499"
inkscape:collect="always" />
<linearGradient
- gradientTransform="translate(20,0)"
- y2="44.287056"
- x2="91.992706"
- y1="112.5"
- x1="91.785248"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2318"
- xlink:href="#linearGradient3400"
+ id="linearGradient14560"
+ xlink:href="#linearGradient4157"
inkscape:collect="always" />
<linearGradient
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- y2="80.12056"
- x2="63.159035"
- y1="21.171064"
- x1="63.159035"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="matrix(0.7413793,0,0,1,-209,-159)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2315"
- xlink:href="#linearGradient3361"
+ id="linearGradient3514"
+ xlink:href="#linearGradient4157"
inkscape:collect="always" />
<linearGradient
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- y2="48.212151"
- x2="35.568035"
- y1="69.923088"
- x1="73.739265"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2312"
- xlink:href="#linearGradient3710"
+ id="linearGradient3512"
+ xlink:href="#linearGradient4157"
inkscape:collect="always" />
<linearGradient
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- y2="80.12056"
- x2="63.159035"
- y1="21.171064"
- x1="63.159035"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- id="linearGradient2309"
- xlink:href="#linearGradient3710"
+ id="linearGradient3510"
+ xlink:href="#linearGradient4157"
inkscape:collect="always" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3503"
- id="linearGradient3236"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient3238"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ id="linearGradient3508"
+ xlink:href="#linearGradient4157"
+ inkscape:collect="always" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3511"
- id="linearGradient3240"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3689"
- id="radialGradient3242"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ id="linearGradient3506"
+ xlink:href="#linearGradient4157"
+ inkscape:collect="always" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3294"
- id="linearGradient3244"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient3246"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3348"
- id="radialGradient3248"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
+ id="linearGradient3504"
+ xlink:href="#linearGradient4157"
+ inkscape:collect="always" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3250"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ id="linearGradient3502"
+ xlink:href="#linearGradient4157"
+ inkscape:collect="always" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3252"
+ y2="187.04779"
+ x2="304.47833"
+ y1="162.80251"
+ x1="304.47833"
+ gradientTransform="translate(-286,-37)"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3361"
- id="linearGradient3254"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3256"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3258"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3503"
- id="linearGradient3716"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient3718"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3511"
- id="linearGradient3720"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3689"
- id="radialGradient3722"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3294"
- id="linearGradient3724"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient3726"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3348"
- id="radialGradient3728"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3730"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3732"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3361"
- id="linearGradient3734"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3736"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3738"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8126"
- id="linearGradient3874"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient3876"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8132"
- id="linearGradient3878"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8138"
- id="radialGradient3880"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8144"
- id="linearGradient3882"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient3884"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8150"
- id="radialGradient3886"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8162"
- id="linearGradient3888"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8156"
- id="linearGradient3890"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3711"
- id="linearGradient3892"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3894"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3896"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3503"
- id="linearGradient3922"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient3924"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3511"
- id="linearGradient3926"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3689"
- id="radialGradient3928"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3294"
- id="linearGradient3930"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient3932"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3348"
- id="radialGradient3934"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3936"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3938"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3361"
- id="linearGradient3940"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3942"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3944"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3503"
- id="linearGradient3946"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient3948"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3511"
- id="linearGradient3950"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3689"
- id="radialGradient3952"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3294"
- id="linearGradient3954"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient3956"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3348"
- id="radialGradient3958"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3960"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient3962"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3361"
- id="linearGradient3964"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3966"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient3968"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3503"
- id="linearGradient4028"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient4030"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3511"
- id="linearGradient4032"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3689"
- id="radialGradient4034"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3294"
- id="linearGradient4036"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient4038"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3348"
- id="radialGradient4040"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient4042"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient4044"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3361"
- id="linearGradient4046"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient4048"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient4050"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3503"
- id="linearGradient4052"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient4054"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3511"
- id="linearGradient4056"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3689"
- id="radialGradient4058"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3294"
- id="linearGradient4060"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient4062"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3348"
- id="radialGradient4064"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient4066"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient4068"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3361"
- id="linearGradient4070"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient4072"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient4074"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3503"
- id="linearGradient4158"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient4160"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3511"
- id="linearGradient4162"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3689"
- id="radialGradient4164"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3294"
- id="linearGradient4166"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient4168"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3348"
- id="radialGradient4170"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient4172"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3400"
- id="linearGradient4174"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3361"
- id="linearGradient4176"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient4178"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient4180"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- gradientTransform="matrix(0,1,-1,0,-39.9985,140.0029)"
- y2="-383.9975"
- x2="-23.516129"
- y1="-383.9971"
- x1="-84.002403"
- gradientUnits="userSpaceOnUse"
- id="linearGradient3711">
- <stop
- id="stop3713"
- style="stop-color:white;stop-opacity:1;"
- offset="0" />
- <stop
- id="stop3715"
- style="stop-color:white;stop-opacity:0;"
- offset="1" />
- </linearGradient>
- <linearGradient
- gradientTransform="translate(18.73145,-130.4544)"
- y2="157.6319"
- x2="63.9995"
- y1="25.1577"
- x1="63.9995"
- gradientUnits="userSpaceOnUse"
- id="XMLID_7_">
- <stop
- id="stop3374"
- style="stop-color:#BFD9FF"
- offset="0" />
- <stop
- id="stop3376"
- style="stop-color:#80B3FF"
- offset="0.2189" />
- <stop
- id="stop3378"
- style="stop-color:#7badf5;stop-opacity:1;"
- offset="0.2933" />
- <stop
- id="stop3380"
- style="stop-color:#4c8ad7;stop-opacity:1;"
- offset="0.44260001" />
- <stop
- id="stop3382"
- style="stop-color:#327ad2;stop-opacity:1;"
- offset="0.4941" />
- <stop
- id="stop3384"
- style="stop-color:#0065d1;stop-opacity:1;"
- offset="0.69999999" />
- </linearGradient>
- <radialGradient
- gradientTransform="translate(18.73145,-130.4544)"
- gradientUnits="userSpaceOnUse"
- r="111.0006"
- cy="-9"
- cx="51.9995"
- id="XMLID_5_">
- <stop
- id="stop3312"
- style="stop-color:#a3c8ff;stop-opacity:1;"
- offset="0.15000001" />
- <stop
- id="stop3314"
- style="stop-color:#69A1F0"
- offset="0.316" />
- <stop
- id="stop3316"
- style="stop-color:#4888DA"
- offset="0.6029" />
- <stop
- id="stop3318"
- style="stop-color:#3378CC"
- offset="0.8412" />
- <stop
- id="stop3320"
- style="stop-color:#2C72C7"
- offset="1" />
- </radialGradient>
- <linearGradient
- gradientUnits="userSpaceOnUse"
- y2="138.35936"
- x2="21.697437"
- y1="-8.5763578"
- x1="106.37579"
- id="linearGradient3278"
- xlink:href="#linearGradient3272"
+ id="linearGradient3500"
+ xlink:href="#linearGradient4157"
inkscape:collect="always" />
<linearGradient
- id="linearGradient3272"
- inkscape:collect="always">
+ id="linearGradient4157">
<stop
- id="stop3274"
+ id="stop4159"
offset="0"
- style="stop-color:white;stop-opacity:1;" />
+ style="stop-color:#ffffff;stop-opacity:1;" />
<stop
- id="stop3276"
+ id="stop4161"
offset="1"
- style="stop-color:white;stop-opacity:0;" />
+ style="stop-color:#a3a3a3;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
- xlink:href="#XMLID_7_"
- id="linearGradient8227"
+ xlink:href="#linearGradient4157"
+ id="linearGradient4738"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient8229"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ gradientTransform="translate(-336,-160)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7133"
- id="linearGradient8231"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3769"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="radialGradient8233"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ gradientTransform="translate(-285,-160)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="linearGradient8235"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3767"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient8237"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="radialGradient8239"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
+ gradientTransform="matrix(1,0,0,0.4615384,-285,-70.615377)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7151"
- id="linearGradient8241"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3765"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ gradientTransform="translate(-285,-167)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="linearGradient8243"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3763"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ gradientTransform="matrix(0.1034484,0,0,1,-25.00002,-167)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7145"
- id="linearGradient8245"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3761"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
+ gradientTransform="translate(-337,-167)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8247"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3759"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
+ gradientTransform="matrix(1,0,0,0.4615385,-337,-70.615389)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8249"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3755"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
+ gradientTransform="matrix(0.1034483,0,0,1,-24.99999,-160)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient8126"
- id="linearGradient8251"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3673"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient8253"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ gradientTransform="matrix(0.1034483,0,0,0.4615384,-22,-44.615385)"
+ x1="304.47833"
+ y1="162.80251"
+ x2="304.47833"
+ y2="187.04779" />
<linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8132"
- id="linearGradient8255"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8138"
- id="radialGradient8257"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ id="linearGradient3499">
+ <stop
+ style="stop-color:#a3a3a3;stop-opacity:1;"
+ offset="0"
+ id="stop3501" />
+ <stop
+ style="stop-color:#ffffff;stop-opacity:1;"
+ offset="1"
+ id="stop3503" />
+ </linearGradient>
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient8144"
- id="linearGradient8259"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient8261"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8150"
- id="radialGradient8263"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
+ xlink:href="#linearGradient4157"
+ id="linearGradient3784"
+ x1="5.625"
+ y1="96"
+ x2="5.625"
+ y2="108.01627"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient8162"
- id="linearGradient8265"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ xlink:href="#linearGradient4157"
+ id="linearGradient3792"
+ x1="-33.9375"
+ y1="95.976646"
+ x2="-33.9375"
+ y2="107.96875"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient8156"
- id="linearGradient8267"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ xlink:href="#linearGradient4157"
+ id="linearGradient3800"
+ x1="7"
+ y1="96"
+ x2="7"
+ y2="108"
+ gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3711"
- id="linearGradient8269"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3807"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
+ x1="12.169124"
+ y1="95.972382"
+ x2="12.169124"
+ y2="108"
+ gradientTransform="matrix(-1,0,0,1,64.077922,22.025974)" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8271"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3817"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
+ x1="5.7885823"
+ y1="96"
+ x2="5.7885823"
+ y2="108.05248"
+ gradientTransform="translate(50.077922,6.025974)" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8273"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3837"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
+ x1="-32.05162"
+ y1="95.999352"
+ x2="-32.05162"
+ y2="107.97552"
+ gradientTransform="matrix(1.007874,0,0,1.0025224,50.204724,5.7578493)" />
<linearGradient
inkscape:collect="always"
- xlink:href="#XMLID_7_"
- id="linearGradient8376"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3866"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient8378"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ x1="-33.9375"
+ y1="107.96875"
+ x2="-33.9375"
+ y2="96"
+ gradientTransform="matrix(0,1.007874,-1.002611,0,55.250652,80.204724)" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7133"
- id="linearGradient8380"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3875"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="radialGradient8382"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
+ x1="8.5"
+ y1="108"
+ x2="8.5"
+ y2="95.976585"
+ gradientTransform="matrix(0,1,-1,0,80,38.058976)" />
<linearGradient
inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="linearGradient8384"
+ xlink:href="#linearGradient4157"
+ id="linearGradient3898"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient8386"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="radialGradient8388"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
+ x1="9.375001"
+ y1="108.0026"
+ x2="9.375001"
+ y2="95.999344"
+ gradientTransform="matrix(0,-1,-1,0,80,87.941024)" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7151"
- id="linearGradient8390"
+ xlink:href="#linearGradient4157"
+ id="linearGradient4009"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ gradientTransform="matrix(0,1,-1,0,80,38.058976)"
+ x1="8.5"
+ y1="108"
+ x2="8.5"
+ y2="95.976585" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="linearGradient8392"
+ xlink:href="#linearGradient4157"
+ id="linearGradient4011"
gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
+ gradientTransform="matrix(0,-1,-1,0,80,87.941024)"
+ x1="9.375001"
+ y1="108.0026"
+ x2="9.375001"
+ y2="95.999344" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient7145"
- id="linearGradient8394"
+ xlink:href="#linearGradient4157"
+ id="linearGradient4013"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
+ gradientTransform="matrix(0,1.007874,-1.002611,0,55.250652,80.204724)"
+ x1="-33.9375"
+ y1="107.96875"
+ x2="-33.9375"
+ y2="96" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8396"
+ xlink:href="#linearGradient4157"
+ id="linearGradient4061"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
+ gradientTransform="translate(50.077922,6.025974)"
+ x1="5.7885823"
+ y1="96"
+ x2="5.7885823"
+ y2="108.05248" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8398"
+ xlink:href="#linearGradient4157"
+ id="linearGradient4063"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
+ gradientTransform="matrix(-1,0,0,1,64.077922,22.025974)"
+ x1="12.169124"
+ y1="95.972382"
+ x2="12.169124"
+ y2="108" />
<linearGradient
inkscape:collect="always"
- xlink:href="#linearGradient8126"
- id="linearGradient8400"
+ xlink:href="#linearGradient4157"
+ id="linearGradient4065"
gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient8402"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8132"
- id="linearGradient8404"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8138"
- id="radialGradient8406"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8144"
- id="linearGradient8408"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient8410"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8150"
- id="radialGradient8412"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8162"
- id="linearGradient8414"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8156"
- id="linearGradient8416"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3711"
- id="linearGradient8418"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8420"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8422"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#XMLID_7_"
- id="linearGradient8480"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient8482"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7133"
- id="linearGradient8484"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="radialGradient8486"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="linearGradient8488"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient8490"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#XMLID_5_"
- id="radialGradient8492"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7151"
- id="linearGradient8494"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7139"
- id="linearGradient8496"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient7145"
- id="linearGradient8498"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8500"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8502"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8126"
- id="linearGradient8504"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,1.8462753,-4.9416701)"
- x1="71.626404"
- y1="123.73875"
- x2="46.225941"
- y2="28.942928" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3669"
- id="radialGradient8506"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,33.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8132"
- id="linearGradient8508"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.1772548,0,0,1.0772187,6.5552946,-4.9416701)"
- x1="96.373123"
- y1="120.42788"
- x2="96.373123"
- y2="46.089832" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8138"
- id="radialGradient8510"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9650814,0.2619502,-0.9201984,3.3902106,17.309062,-57.693239)"
- cx="71.775223"
- cy="16.0865"
- fx="71.775223"
- fy="16.0865"
- r="3.15625" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8144"
- id="linearGradient8512"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,7.5466667,4.9924269)"
- x1="43.799026"
- y1="32.051865"
- x2="58.606159"
- y2="96.363052" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="radialGradient8514"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(6.5079869,0,0,1.510917,-63.772161,-32.970115)"
- cx="11.578125"
- cy="64.53125"
- fx="11.578125"
- fy="64.53125"
- r="3.578125" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8150"
- id="radialGradient8516"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.519949,7.3519239e-8,-8.0632435e-8,1.2772114,-20.224726,-23.996639)"
- cx="53.630272"
- cy="79.055809"
- fx="57.058514"
- fy="91.805016"
- r="50" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8162"
- id="linearGradient8518"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient8156"
- id="linearGradient8520"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(20,0)"
- x1="91.785248"
- y1="112.5"
- x2="91.992706"
- y2="44.287056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3711"
- id="linearGradient8522"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8524"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="73.739265"
- y1="69.923088"
- x2="35.568035"
- y2="48.212151" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3710"
- id="linearGradient8526"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0533333,0,0,0.9219945,11.76,4.9924269)"
- x1="63.159035"
- y1="21.171064"
- x2="63.159035"
- y2="80.12056" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3600"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8"
- gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
- gradientUnits="userSpaceOnUse" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3604"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-97.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3608"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.8125,0,0,2.2075201,-143.20779,-217.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3578"
- id="linearGradient3620"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(96,-4.0000076)"
- x1="-8"
- y1="98.130508"
- x2="-8"
- y2="126.82455" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3578"
- id="linearGradient3640"
- gradientUnits="userSpaceOnUse"
- gradientTransform="translate(96,-4.0000076)"
- x1="-8"
- y1="98.130508"
- x2="-8"
- y2="126.82455" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3642"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3644"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-97.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3646"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.8125,0,0,2.2075201,-134,-173.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3649"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-97.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3652"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3578"
- id="linearGradient3658"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
- x1="-8"
- y1="98.130508"
- x2="-8"
- y2="126.82455" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3691"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3578"
- id="linearGradient3693"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
- x1="-8"
- y1="98.130508"
- x2="-8"
- y2="126.82455" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient3695"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-97.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient2653"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3578"
- id="linearGradient2655"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
- x1="-8"
- y1="98.130508"
- x2="-8"
- y2="126.82455" />
- <radialGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3272"
- id="radialGradient2669"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,2.2075201,0,-112.90313)"
- cx="88"
- cy="93.5"
- fx="88"
- fy="93.5"
- r="8" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#linearGradient3578"
- id="linearGradient2671"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.875,96,9.9999934)"
- x1="-8"
- y1="98.130508"
- x2="-8"
- y2="126.82455" />
+ gradientTransform="matrix(1.007874,0,0,1.0025224,50.204724,5.7578493)"
+ x1="-32.05162"
+ y1="95.999352"
+ x2="-32.05162"
+ y2="107.97552" />
</defs>
<sodipodi:namedview
id="base"
@@ -2587,21 +602,34 @@
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
- inkscape:zoom="3.4029514"
- inkscape:cx="64.194623"
- inkscape:cy="70.741477"
+ inkscape:zoom="1"
+ inkscape:cx="173.28073"
+ inkscape:cy="199.64214"
inkscape:document-units="px"
inkscape:current-layer="layer1"
width="128px"
height="128px"
showgrid="true"
- gridspacingx="1px"
- gridspacingy="1px"
- gridempspacing="2"
- inkscape:window-width="792"
- inkscape:window-height="728"
- inkscape:window-x="55"
- inkscape:window-y="165" />
+ inkscape:window-width="1110"
+ inkscape:window-height="710"
+ inkscape:window-x="560"
+ inkscape:window-y="0"
+ inkscape:snap-nodes="true">
+ <inkscape:grid
+ id="GridFromPre046Settings"
+ type="xygrid"
+ originx="0px"
+ originy="0px"
+ spacingx="1px"
+ spacingy="1px"
+ color="#0000ff"
+ empcolor="#0000ff"
+ opacity="0.2"
+ empopacity="0.4"
+ empspacing="2"
+ visible="true"
+ enabled="true" />
+ </sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
@@ -2618,779 +646,27 @@
inkscape:groupmode="layer"
id="layer1">
<rect
+ y="6.1168857"
+ x="25.441563"
+ height="52"
+ width="78"
+ id="rect2925"
+ style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3651"
+ width="78"
+ height="52"
+ x="-1.9220779"
+ y="86.025978" />
+ <rect
style="opacity:0.65;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect3610"
width="32"
height="36.20779"
x="8"
y="-0.20779037" />
- <g
- id="south-maxslider"
- transform="matrix(0,-0.1499001,0.1428242,0,30.859856,110.39441)">
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path3519"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0020f4;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)" />
- <path
- id="path3302"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="fill:url(#linearGradient2360);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path3651"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.85;fill:url(#radialGradient2362);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)" />
- <path
- id="path3509"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="opacity:0.90526321;fill:url(#linearGradient2364);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)"
- style="opacity:0.35;fill:url(#radialGradient2366);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- id="path3685" />
- <path
- sodipodi:nodetypes="cccc"
- id="path2323"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- style="fill:url(#linearGradient2368);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)"
- id="path3705"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- style="opacity:0.5;fill:url(#radialGradient2370);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)" />
- <path
- id="path3320"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#radialGradient2372);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- id="path3394"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2374);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2376);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path3895" />
- <path
- id="path3897"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient2378);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path3910"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient2380);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path3919"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- style="fill:url(#linearGradient2382);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <g
- id="east-minslider"
- inkscape:label="Layer 1"
- transform="matrix(0.1499001,0,0,0.1428242,109.60559,38.859855)">
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path2719"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#638000;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)" />
- <path
- id="path2721"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="fill:url(#linearGradient2338);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path2723"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.85;fill:url(#radialGradient2335);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)" />
- <path
- id="path2725"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="opacity:0.90526321;fill:url(#linearGradient2332);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)"
- style="opacity:0.35;fill:url(#radialGradient2341);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- id="path2727" />
- <path
- sodipodi:nodetypes="cccc"
- id="path2729"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- style="fill:url(#linearGradient2328);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)"
- id="path2731"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- style="opacity:0.5;fill:url(#radialGradient2343);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)" />
- <path
- id="path2733"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#radialGradient2324);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- id="path2735"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2321);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient2318);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path2737" />
- <path
- id="path2739"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient2315);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path2741"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient2312);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path2743"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- style="fill:url(#linearGradient2309);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <g
- id="south-minslider"
- inkscape:label="Layer 1"
- transform="matrix(0.1428242,0,0,0.1499001,30.857407,108.4104)">
- <g
- transform="matrix(0,1,1,0,1.7146484e-2,7.9733326)"
- id="g3688">
- <path
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#638000;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path3690"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="fill:url(#linearGradient3716);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path3692" />
- <path
- style="opacity:0.85;fill:url(#radialGradient3718);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path3694"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="opacity:0.90526321;fill:url(#linearGradient3720);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path3696" />
- <path
- id="path3698"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- style="opacity:0.35;fill:url(#radialGradient3722);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)" />
- <path
- style="fill:url(#linearGradient3724);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- id="path3700"
- sodipodi:nodetypes="cccc" />
- <path
- style="opacity:0.5;fill:url(#radialGradient3726);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- id="path3702"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)" />
- <path
- style="fill:url(#radialGradient3728);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path3704" />
- <path
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3730);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path3706"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- id="path3708"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3732);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- style="fill:url(#linearGradient3734);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path3710" />
- <path
- style="fill:url(#linearGradient3736);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path3712" />
- <path
- style="fill:url(#linearGradient3738);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- id="path3714" />
- </g>
- </g>
- <g
- transform="matrix(0,-0.1499001,0.1428242,0,54.859856,110.39441)"
- id="south-offsetslider">
- <path
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#b8b8b8;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path3760"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="fill:url(#linearGradient3874);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path3762" />
- <path
- style="opacity:0.85;fill:url(#radialGradient3876);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path3764"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="opacity:0.90526321;fill:url(#linearGradient3878);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path3766" />
- <path
- id="path3768"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- style="opacity:0.35;fill:url(#radialGradient3880);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)" />
- <path
- style="fill:url(#linearGradient3882);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- id="path3770"
- sodipodi:nodetypes="cccc" />
- <path
- style="opacity:0.5;fill:url(#radialGradient3884);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- id="path3772"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)" />
- <path
- style="fill:url(#radialGradient3886);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path3774" />
- <path
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3888);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path3776"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- id="path3778"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3890);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- style="fill:url(#linearGradient3892);fill-opacity:1.0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path3780" />
- <path
- style="fill:url(#linearGradient3894);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path3782" />
- <path
- style="fill:url(#linearGradient3896);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- id="path3784" />
- </g>
- <g
- id="north-minslider"
- transform="matrix(0,-0.1499001,0.1428242,0,70.859856,22.394407)">
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path3972"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#638000;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)" />
- <path
- id="path3974"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="fill:url(#linearGradient4028);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path3976"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.85;fill:url(#radialGradient4030);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)" />
- <path
- id="path3978"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="opacity:0.90526321;fill:url(#linearGradient4032);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)"
- style="opacity:0.35;fill:url(#radialGradient4034);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- id="path3980" />
- <path
- sodipodi:nodetypes="cccc"
- id="path3982"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- style="fill:url(#linearGradient4036);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)"
- id="path3984"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- style="opacity:0.5;fill:url(#radialGradient4038);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)" />
- <path
- id="path3986"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#radialGradient4040);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- id="path3988"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4042);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4044);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path3990" />
- <path
- id="path3992"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient4046);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path3994"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient4048);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path3996"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- style="fill:url(#linearGradient4050);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <g
- id="west-minslider"
- inkscape:label="Layer 1"
- transform="matrix(0.1499001,0,0,0.1428242,3.2111921,38.857406)">
- <g
- transform="matrix(-1,0,0,1,127.97333,1.7146484e-2)"
- id="g4106">
- <path
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#638000;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path4108"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="fill:url(#linearGradient4158);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path4110" />
- <path
- style="opacity:0.85;fill:url(#radialGradient4160);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path4112"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="opacity:0.90526321;fill:url(#linearGradient4162);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path4114" />
- <path
- id="path4116"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- style="opacity:0.35;fill:url(#radialGradient4164);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)" />
- <path
- style="fill:url(#linearGradient4166);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- id="path4118"
- sodipodi:nodetypes="cccc" />
- <path
- style="opacity:0.5;fill:url(#radialGradient4168);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- id="path4120"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)" />
- <path
- style="fill:url(#radialGradient4170);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path4122" />
- <path
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4172);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path4124"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- id="path4126"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4174);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- style="fill:url(#linearGradient4176);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path4128" />
- <path
- style="fill:url(#linearGradient4178);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path4130" />
- <path
- style="fill:url(#linearGradient4180);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- id="path4132" />
- </g>
- </g>
- <g
- transform="matrix(0.1499001,0,0,0.1428242,21.605596,38.859856)"
- id="west-maxslider">
- <path
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#001280;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path8173"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="fill:url(#linearGradient8227);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path8175" />
- <path
- style="opacity:0.85;fill:url(#radialGradient8229);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path8177"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="opacity:0.90526321;fill:url(#linearGradient8231);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path8179" />
- <path
- id="path8181"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- style="opacity:0.35;fill:url(#radialGradient8233);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)" />
- <path
- style="fill:url(#linearGradient8235);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- id="path8183"
- sodipodi:nodetypes="cccc" />
- <path
- style="opacity:0.5;fill:url(#radialGradient8237);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- id="path8185"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)" />
- <path
- style="fill:url(#radialGradient8239);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8187" />
- <path
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8241);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path8189"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- id="path8191"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8243);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- style="fill:url(#linearGradient8245);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8193" />
- <path
- style="fill:url(#linearGradient8247);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8195" />
- <path
- style="fill:url(#linearGradient8249);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- id="path8197" />
- </g>
- <g
- id="west-offsetslider"
- transform="matrix(0.1499001,0,0,0.1428242,21.605596,62.859856)">
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path8201"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#b8b8b8;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)" />
- <path
- id="path8203"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="fill:url(#linearGradient8251);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path8205"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.85;fill:url(#radialGradient8253);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)" />
- <path
- id="path8207"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="opacity:0.90526321;fill:url(#linearGradient8255);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)"
- style="opacity:0.35;fill:url(#radialGradient8257);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- id="path8209" />
- <path
- sodipodi:nodetypes="cccc"
- id="path8211"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- style="fill:url(#linearGradient8259);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)"
- id="path8213"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- style="opacity:0.5;fill:url(#radialGradient8261);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)" />
- <path
- id="path8215"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#radialGradient8263);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- id="path8217"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8265);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8267);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path8219" />
- <path
- id="path8221"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient8269);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path8223"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient8271);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path8225"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- style="fill:url(#linearGradient8273);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <g
- transform="matrix(0,0.1499001,0.1428242,0,70.859855,21.605593)"
- id="north-maxslider">
- <path
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#0020f4;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path8322"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="fill:url(#linearGradient8376);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path8324" />
- <path
- style="opacity:0.85;fill:url(#radialGradient8378);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path8326"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="opacity:0.90526321;fill:url(#linearGradient8380);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path8328" />
- <path
- id="path8330"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- style="opacity:0.35;fill:url(#radialGradient8382);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)" />
- <path
- style="fill:url(#linearGradient8384);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- id="path8332"
- sodipodi:nodetypes="cccc" />
- <path
- style="opacity:0.5;fill:url(#radialGradient8386);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- id="path8334"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)" />
- <path
- style="fill:url(#radialGradient8388);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8336" />
- <path
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8390);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path8338"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- id="path8340"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8392);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- style="fill:url(#linearGradient8394);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8342" />
- <path
- style="fill:url(#linearGradient8396);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8344" />
- <path
- style="fill:url(#linearGradient8398);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- id="path8346" />
- </g>
- <g
- id="north-offsetslider"
- transform="matrix(0,0.1499001,0.1428242,0,46.859855,21.605593)">
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path8350"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#b8b8b8;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)" />
- <path
- id="path8352"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="fill:url(#linearGradient8400);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path8354"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.85;fill:url(#radialGradient8402);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)" />
- <path
- id="path8356"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="opacity:0.90526321;fill:url(#linearGradient8404);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)"
- style="opacity:0.35;fill:url(#radialGradient8406);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- id="path8358" />
- <path
- sodipodi:nodetypes="cccc"
- id="path8360"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- style="fill:url(#linearGradient8408);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)"
- id="path8362"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- style="opacity:0.5;fill:url(#radialGradient8410);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)" />
- <path
- id="path8364"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#radialGradient8412);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- id="path8366"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8414);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8416);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path8368" />
- <path
- id="path8370"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient8418);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path8372"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient8420);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path8374"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- style="fill:url(#linearGradient8422);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <g
- id="east-maxslider"
- transform="matrix(-0.1499001,0,0,0.1428242,110.3944,38.859855)">
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path8426"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#001280;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)" />
- <path
- id="path8428"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="fill:url(#linearGradient8480);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)"
- id="path8430"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- style="opacity:0.85;fill:url(#radialGradient8482);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)" />
- <path
- id="path8432"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- style="opacity:0.90526321;fill:url(#linearGradient8484);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)"
- style="opacity:0.35;fill:url(#radialGradient8486);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- id="path8434" />
- <path
- sodipodi:nodetypes="cccc"
- id="path8436"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- style="fill:url(#linearGradient8488);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)"
- id="path8438"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- style="opacity:0.5;fill:url(#radialGradient8490);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)" />
- <path
- id="path8440"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#radialGradient8492);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- id="path8442"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8494);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)" />
- <path
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)"
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8496);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path8444" />
- <path
- id="path8446"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient8498);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path8448"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- style="fill:url(#linearGradient8500);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- <path
- id="path8450"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- style="fill:url(#linearGradient8502);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
- </g>
- <g
- transform="matrix(-0.1499001,0,0,0.1428242,110.3944,62.859855)"
- id="east-offsetslider">
- <path
- style="opacity:0.90526321;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#b8b8b8;stroke-width:0.9659996;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3533)"
- d="M 87.875,12 C 87.009497,12.026935 86.176101,12.333976 85.5,12.875 L 25.5,60.875 C 24.550144,61.634129 24,62.784063 24,64 C 24,65.215937 24.550144,66.365871 25.5,67.125 L 85.5,115.125 C 86.700963,116.08613 88.332437,116.26025 89.71875,115.59375 C 91.105067,114.92725 92.000642,113.53821 92,112 L 92,88.3125 L 92,78.0625 L 90.5,76.875 C 89.299037,75.91387 87.667563,75.739753 86.28125,76.40625 C 84.894933,77.072748 83.999358,78.461793 84,80 L 84,103.6875 L 34.40625,64 L 84,24.3125 L 84,48 C 83.999358,49.538207 84.894936,50.927253 86.28125,51.59375 C 87.66756,52.260246 89.299037,52.08613 90.5,51.125 L 92,49.9375 L 92,39.6875 L 92,16 C 92.000417,14.917152 91.558627,13.878821 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path8454"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="fill:url(#linearGradient8504);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path8456" />
- <path
- style="opacity:0.85;fill:url(#radialGradient8506);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- d="M 87.875,12 C 87.075959,12.024867 86.302054,12.283948 85.65625,12.75 L 86.625,21.78125 L 91.96875,15.625 C 91.880958,14.678789 91.469257,13.792159 90.78125,13.125 C 90.003873,12.37118 88.957323,11.966273 87.875,12 z "
- id="path8458"
- transform="matrix(1.0533333,0,0,1.0173732,-5.0933333,-1.1118124)" />
- <path
- style="opacity:0.90526321;fill:url(#linearGradient8508);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
- d="M 91.17049,7.9849542 C 90.151573,8.0139691 89.170453,8.3447195 88.37451,8.9275206 L 17.739215,60.634018 C 16.620992,61.451766 15.973333,62.690496 15.973333,64.000327 C 15.973333,65.310157 16.620992,66.548887 17.739215,67.366635 L 88.37451,119.07313 C 89.788349,120.10848 91.70901,120.29604 93.341053,119.57808 C 94.973103,118.86011 96.027425,117.36381 96.026667,115.70683 L 96.026667,90.190206 L 96.026667,85.410048 L 96.026667,84.66946 L 96.026667,79.148715 L 96.026667,48.851939 L 96.026667,43.533172 L 96.026667,43.331192 L 96.026667,37.810447 L 96.026667,12.293829 C 96.027162,11.127365 95.507058,10.008855 94.591887,9.1968255 C 93.676716,8.3847962 92.44466,7.9486229 91.17049,7.9849542 z M 86.608627,21.248209 L 86.608627,42.455952 L 68.949804,42.455952 C 68.297605,42.455952 67.772548,42.936393 67.772548,43.533172 L 67.772548,85.410048 C 67.772548,86.006828 68.297605,86.487267 68.949804,86.487267 L 86.608627,86.487267 L 86.608627,106.75245 L 28.224141,64.000327 L 86.608627,21.248209 z "
- id="path8460" />
- <path
- id="path8462"
- d="M 71.875,12 C 71.075959,12.024867 70.302054,12.283948 69.65625,12.75 L 70.625,21.78125 L 75.96875,15.625 C 75.880958,14.678789 75.469257,13.792159 74.78125,13.125 C 74.003873,12.37118 72.957323,11.966273 71.875,12 z "
- style="opacity:0.35;fill:url(#radialGradient8510);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3681)"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,128.88743)" />
- <path
- style="fill:url(#linearGradient8512);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 24.4,64.000073 L 87.6,19.744339 L 87.6,108.25581 L 24.4,64.000073 z "
- id="path8464"
- sodipodi:nodetypes="cccc" />
- <path
- style="opacity:0.5;fill:url(#radialGradient8514);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:8;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter3722)"
- d="M 11.6875,59.125 L 9.5,60.875 C 8.5501441,61.634129 8,62.784063 8,64 C 8.0000001,65.215937 8.5501441,66.365871 9.5,67.125 L 13.03125,69.9375 L 15.15625,64.3125 L 11.6875,59.125 z "
- id="path8466"
- transform="matrix(1.0533333,0,0,-1.0173732,11.76,129.68423)" />
- <path
- style="fill:url(#radialGradient8516);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.4,64.000073 L 87.6,108.25581 L 87.6,78.751985 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8468" />
- <path
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8518);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- id="path8470"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- id="path8472"
- d="M 92,16 L 32,64 L 92,112 L 92,80 L 92,48 L 92,16 z "
- style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient8520);stroke-width:1.0147357px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;filter:url(#filter3396)"
- transform="matrix(1.0533333,0,0,0.9219945,-9.3066667,4.9924269)" />
- <path
- style="fill:url(#linearGradient8522);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8474" />
- <path
- style="fill:url(#linearGradient8524);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 86.71125,20.37821 L 86.71125,48.84479 L 86.71125,59.361289 C 75.203203,62.668078 61.061565,64.605133 45.762917,64.605133 C 38.631436,64.605133 31.769756,64.182739 25.28875,63.395014 L 24.531667,63.913636 C 31.325523,64.772472 38.548578,65.239004 46.059167,65.239003 C 61.572821,65.239003 75.930219,63.261985 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z "
- id="path8476" />
- <path
- style="fill:url(#linearGradient8526);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- d="M 87.6,19.744339 L 24.531667,63.913636 C 28.122981,64.367627 31.847249,64.698286 35.6575,64.922068 C 32.169447,64.704673 28.75029,64.35923 25.453333,63.942448 L 86.678333,21.069705 L 86.678333,49.709159 L 86.678333,60.052784 C 82.430956,61.273251 77.821812,62.321664 72.919167,63.135704 C 78.150964,62.285094 83.084328,61.206282 87.6,59.908723 L 87.6,49.248162 L 87.6,19.744339 z M 35.6575,64.922068 C 37.402503,65.024555 39.172559,65.101717 40.957083,65.152566 C 39.171728,65.097092 37.401526,65.030765 35.6575,64.922068 z "
- id="path8478" />
- </g>
<rect
y="122"
x="80"
@@ -3565,5 +841,703 @@
inkscape:transform-center-y="12"
inkscape:transform-center-x="1.038961" />
</g>
+ <g
+ id="south-left-limit-slider">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="rect2879"
+ d="M 46.386898,102.02597 L 68.018946,102.02597 C 70.267619,102.02597 72.077922,103.72979 72.077922,105.84618 L 72.058976,112.17979 C 72.058976,114.29618 70.248673,116 68,116 L 55.058976,116 C 48.683976,116 42.077922,110.20576 42.077922,106.02597 C 42.077922,103.90958 44.138225,102.02597 46.386898,102.02597 z"
+ style="fill:url(#linearGradient3817);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
+ <g
+ transform="translate(0,0.4419416)"
+ style="fill:#ffffff;fill-opacity:1"
+ id="g3825">
+ <rect
+ ry="1"
+ rx="1"
+ y="103.55806"
+ x="56.000004"
+ height="10"
+ width="2"
+ id="rect3827"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="matrix(0.6773596,-0.735652,0.6952605,0.7187579,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3829"
+ width="1.9562796"
+ height="7.7827229"
+ x="-34.722744"
+ y="115.2485"
+ rx="0.97813982"
+ ry="0.97700471" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="-31.648996"
+ x="116.17191"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3831"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.6773596,0.735652,0.6952605,-0.7187579,0,0)" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3833"
+ width="2"
+ height="13"
+ x="107.55806"
+ y="-70"
+ rx="1"
+ ry="1" />
+ </g>
+ <g
+ id="g3819">
+ <rect
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3668"
+ width="2"
+ height="10"
+ x="56.077923"
+ y="103.02597"
+ rx="1"
+ ry="1" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="114.94488"
+ x="-34.296085"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3670"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.6773596,-0.735652,0.6952605,0.7187579,0,0)" />
+ <rect
+ transform="matrix(0.6773596,0.735652,0.6952605,-0.7187579,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3672"
+ width="1.9562796"
+ height="7.7827229"
+ x="116.48637"
+ y="-32.067432"
+ rx="0.97813982"
+ ry="0.97700471" />
+ <rect
+ ry="1"
+ rx="1"
+ y="-70.077919"
+ x="107.02597"
+ height="13"
+ width="2"
+ id="rect3674"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+ </g>
+ <g
+ id="south-right-limit-slider">
+ <path
+ style="fill:url(#linearGradient3807);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 67.768946,118.02597 L 46.136898,118.02597 C 43.888225,118.02597 42.077922,119.72979 42.077922,121.84618 L 42,128 C 42,130.11639 43.810303,131.82021 46.058976,131.82021 L 59,131.82021 C 65.375,131.82021 72.077922,126.20576 72.077922,122.02597 C 72.077922,119.90958 70.017619,118.02597 67.768946,118.02597 z"
+ id="path3699"
+ sodipodi:nodetypes="cccccccc" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 52,120 C 51.757465,120.00313 51.527277,120.11318 51.34375,120.3125 C 50.976696,120.71114 50.967433,121.32972 51.34375,121.71875 L 53.5625,124 L 45,124 C 44.446,124 44,124.446 44,125 C 44,125.554 44.446,126 45,126 L 53.5625,126 L 51.34375,128.28125 C 50.967434,128.67029 50.976696,129.28886 51.34375,129.6875 C 51.710805,130.08614 52.311183,130.10779 52.6875,129.71875 L 56,126.25 L 56,129 C 56,129.554 56.446,130 57,130 C 57.554,130 58,129.554 58,129 L 58,121 C 58,120.446 57.554,120 57,120 C 56.446,120 56,120.446 56,121 L 56,123.71875 L 52.6875,120.28125 C 52.499341,120.08673 52.242535,119.99687 52,120 z"
+ id="path3810" />
+ <path
+ id="rect3701"
+ d="M 52.0625,119.03125 C 51.819965,119.03438 51.589777,119.14443 51.40625,119.34375 C 51.039196,119.74239 51.029933,120.36097 51.40625,120.75 L 53.625,123.03125 L 45.0625,123.03125 C 44.5085,123.03125 44.0625,123.47725 44.0625,124.03125 C 44.0625,124.58525 44.5085,125.03125 45.0625,125.03125 L 53.625,125.03125 L 51.40625,127.3125 C 51.029934,127.70154 51.039196,128.32011 51.40625,128.71875 C 51.773305,129.11739 52.373683,129.13904 52.75,128.75 L 56.0625,125.28125 L 56.0625,128.03125 C 56.0625,128.58525 56.5085,129.03125 57.0625,129.03125 C 57.6165,129.03125 58.0625,128.58525 58.0625,128.03125 L 58.0625,120.03125 C 58.0625,119.47725 57.6165,119.03125 57.0625,119.03125 C 56.5085,119.03125 56.0625,119.47725 56.0625,120.03125 L 56.0625,122.75 L 52.75,119.3125 C 52.561841,119.11798 52.305035,119.02812 52.0625,119.03125 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="south-offset-slider">
+ <path
+ sodipodi:nodetypes="cszscc"
+ id="path3713"
+ d="M 8.0032728,102 C 5.7368938,102 4.0000003,103.99209 4.0000003,106.01009 C 4.0000023,109.93852 10.01744,116 16,116 C 22.008534,116 28,110.03465 28,106.01009 C 28,103.9984 26.257584,102 23.991205,102 L 8.0032728,102 z"
+ style="fill:url(#linearGradient3837);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 11.000079,108.33903 C 10.996945,108.58199 11.086821,108.83924 11.28136,109.02773 L 14.812993,112.40864 C 15.028065,112.63581 15.34574,112.99361 16.000621,112.99821 C 16.65091,113.00278 17.037754,112.60474 17.219503,112.40864 L 20.719881,109.02773 C 21.108964,108.65075 21.087312,108.04933 20.688629,107.68162 C 20.289944,107.31393 19.671308,107.30464 19.282225,107.68162 L 17.000728,109.90427 L 17.000728,106 C 17.000728,105.44503 16.554681,104.99825 16.000621,104.99825 C 15.44656,104.99825 15,105.44503 15,106 L 15,109.90427 L 12.719015,107.68162 C 12.32994,107.30464 11.711299,107.31393 11.312613,107.68162 C 11.113271,107.86548 11.003214,108.09607 11.000079,108.33903 z"
+ id="path3839"
+ sodipodi:nodetypes="ccczccscccscccsc" />
+ <path
+ sodipodi:nodetypes="ccczccscccscccsc"
+ id="rect3717"
+ d="M 11.000079,107.34078 C 10.996945,107.58374 11.086821,107.84099 11.28136,108.02948 L 14.812993,111.41039 C 15.028065,111.63756 15.34574,111.99536 16.000621,111.99996 C 16.65091,112.00453 17.037754,111.60649 17.219503,111.41039 L 20.719881,108.02948 C 21.108964,107.6525 21.087312,107.05108 20.688629,106.68337 C 20.289944,106.31568 19.671308,106.30639 19.282225,106.68337 L 17.000728,108.90602 L 17.000728,105.00175 C 17.000728,104.44678 16.554681,104 16.000621,104 C 15.44656,104 15,104.44678 15,105.00175 L 15,108.90602 L 12.719015,106.68337 C 12.32994,106.30639 11.711299,106.31568 11.312613,106.68337 C 11.113271,106.86723 11.003214,107.09782 11.000079,107.34078 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="west-left-limit-slider">
+ <path
+ style="fill:url(#linearGradient3875);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M -15,34.367952 L -15,56 C -15,58.248673 -16.70382,60.058976 -18.82021,60.058976 L -24.17979,60.058976 C -26.29618,60.058976 -28,58.248673 -28,56 L -28,43.058976 C -28,36.683976 -23.17979,30.058976 -19.000003,30.058976 C -16.883613,30.058976 -15,32.119279 -15,34.367952 z"
+ id="path2897"
+ sodipodi:nodetypes="cccccccc" />
+ <g
+ transform="translate(1,-5.897522e-2)"
+ style="fill:#ffffff;fill-opacity:1"
+ id="g3883">
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3885"
+ width="2"
+ height="10"
+ x="44.058975"
+ y="17"
+ rx="1"
+ ry="1" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="47.72015"
+ x="16.961395"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3887"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.735652,0.6773596,-0.7187579,0.6952605,0,0)" />
+ <rect
+ transform="matrix(-0.735652,0.6773596,0.7187579,0.6952605,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3889"
+ width="1.9562798"
+ height="7.7827225"
+ x="47.608047"
+ y="17.862579"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="1"
+ rx="1"
+ y="-58.058975"
+ x="21"
+ height="13"
+ width="2"
+ id="rect3891"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,-1)" />
+ </g>
+ <g
+ id="g3877">
+ <rect
+ ry="1"
+ rx="1"
+ y="17"
+ x="44.058975"
+ height="10"
+ width="2"
+ id="rect2899"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0.735652,0.6773596,-0.7187579,0.6952605,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2901"
+ width="1.9562798"
+ height="7.7827225"
+ x="16.961395"
+ y="47.72015"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="17.862579"
+ x="47.608047"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect2903"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(-0.735652,0.6773596,0.7187579,0.6952605,0,0)" />
+ <rect
+ transform="scale(-1,-1)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2905"
+ width="2"
+ height="13"
+ x="21"
+ y="-58.058975"
+ rx="1"
+ ry="1" />
+ </g>
+ </g>
+ <g
+ id="west-right-limit-slider">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path2909"
+ d="M -15,91.632048 L -15,70 C -15,67.751327 -16.70382,65.941024 -18.82021,65.941024 L -24.17979,65.941024 C -26.29618,65.941024 -28,67.751327 -28,70 L -28,82.941024 C -28,89.316024 -23.17979,95.941024 -19.000003,95.941024 C -16.883613,95.941024 -15,93.880721 -15,91.632048 z"
+ style="fill:url(#linearGradient3898);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
+ <g
+ transform="translate(1,5.897522e-2)"
+ style="fill:#ffffff;fill-opacity:1"
+ id="g3906">
+ <rect
+ transform="matrix(0,-1,-1,0,0,0)"
+ ry="1"
+ rx="1"
+ y="17"
+ x="-81.941025"
+ height="10"
+ width="2"
+ id="rect3908"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="matrix(0.735652,-0.6773596,-0.7187579,-0.6952605,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3910"
+ width="1.9562798"
+ height="7.7827225"
+ x="-73.75383"
+ y="-45.127308"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="-74.984879"
+ x="-43.107178"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3912"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(-0.735652,-0.6773596,0.7187579,-0.6952605,0,0)" />
+ <rect
+ transform="scale(-1,1)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3914"
+ width="2"
+ height="13"
+ x="21"
+ y="67.941025"
+ rx="1"
+ ry="1" />
+ </g>
+ <g
+ id="g3900">
+ <rect
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2911"
+ width="2"
+ height="10"
+ x="-81.941025"
+ y="17"
+ rx="1"
+ ry="1"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="-45.127308"
+ x="-73.75383"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect2913"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.735652,-0.6773596,-0.7187579,-0.6952605,0,0)" />
+ <rect
+ transform="matrix(-0.735652,-0.6773596,0.7187579,-0.6952605,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2915"
+ width="1.9562798"
+ height="7.7827225"
+ x="-43.107178"
+ y="-74.984879"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="1"
+ rx="1"
+ y="67.941025"
+ x="21"
+ height="13"
+ width="2"
+ id="rect2917"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ </g>
+ </g>
+ <rect
+ transform="matrix(0,1,1,0,0,0)"
+ style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect2927"
+ width="78"
+ height="52"
+ x="25.441563"
+ y="128.06493" />
+ <rect
+ y="-39.740265"
+ x="45.454544"
+ height="52"
+ width="78"
+ id="rect2959"
+ style="opacity:1;fill:#0f0f0f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(1,-1)" />
+ <g
+ id="west-offset-slider">
+ <path
+ style="fill:url(#linearGradient3866);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M -40,38.012068 C -40,35.745688 -41.992266,34.008795 -44.010444,34.008795 C -47.939225,34.008797 -52,40.030121 -52,46.012681 C -52,52.021215 -48.035355,58.008795 -44.010444,58.008795 C -41.998577,58.008795 -40,56.266379 -40,54 L -40,38.012068 z"
+ id="path2624"
+ sodipodi:nodetypes="cszscc" />
+ <path
+ sodipodi:nodetypes="ccczccscccscccsc"
+ id="path3868"
+ d="M -45.339234,40.999351 C -45.582216,40.996217 -45.839486,41.086093 -46.027997,41.280632 L -49.409203,44.812265 C -49.636394,45.027337 -49.994226,45.345012 -49.998828,45.999893 C -50.0034,46.650182 -49.605323,47.037026 -49.409203,47.218775 L -46.027997,50.719153 C -45.650986,51.108236 -45.049509,51.086584 -44.681772,50.687901 C -44.314044,50.289216 -44.30476,49.67058 -44.681772,49.281497 L -46.90461,47 L -43,47 C -42.44498,47 -41.99816,46.553953 -41.99816,45.999893 C -41.99816,45.445832 -42.44498,44.999272 -43,44.999272 L -46.90461,44.999272 L -44.681772,42.718287 C -44.30476,42.329212 -44.314044,41.710571 -44.681772,41.311885 C -44.86564,41.112543 -45.096251,41.002486 -45.339234,40.999351 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M -46.341254,41.000079 C -46.584236,40.996945 -46.841506,41.086821 -47.030017,41.28136 L -50.411223,44.812993 C -50.638414,45.028065 -50.996246,45.34574 -51.000848,46.000621 C -51.00542,46.65091 -50.607343,47.037754 -50.411223,47.219503 L -47.030017,50.719881 C -46.653006,51.108964 -46.051529,51.087312 -45.683792,50.688629 C -45.316064,50.289944 -45.30678,49.671308 -45.683792,49.282225 L -47.90663,47.000728 L -44.00202,47.000728 C -43.447,47.000728 -43.00018,46.554681 -43.00018,46.000621 C -43.00018,45.44656 -43.447,45 -44.00202,45 L -47.90663,45 L -45.683792,42.719015 C -45.30678,42.32994 -45.316064,41.711299 -45.683792,41.312613 C -45.86766,41.113271 -46.098271,41.003214 -46.341254,41.000079 z"
+ id="path2626"
+ sodipodi:nodetypes="ccczccscccscccsc" />
+ </g>
+ <g
+ id="north-right-limit-slider"
+ transform="matrix(0,1,-1,0,147.05898,20)">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path3955"
+ d="M -15,34.367952 L -15,56 C -15,58.248673 -16.70382,60.058976 -18.82021,60.058976 L -24.17979,60.058976 C -26.29618,60.058976 -28,58.248673 -28,56 L -28,43.058976 C -28,36.683976 -23.17979,30.058976 -19.000003,30.058976 C -16.883613,30.058976 -15,32.119279 -15,34.367952 z"
+ style="fill:url(#linearGradient4009);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
+ <g
+ id="g3957"
+ style="fill:#ffffff;fill-opacity:1"
+ transform="translate(1,-5.897522e-2)">
+ <rect
+ ry="1"
+ rx="1"
+ y="17"
+ x="44.058975"
+ height="10"
+ width="2"
+ id="rect3959"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ <rect
+ transform="matrix(0.735652,0.6773596,-0.7187579,0.6952605,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3961"
+ width="1.9562798"
+ height="7.7827225"
+ x="16.961395"
+ y="47.72015"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="17.862579"
+ x="47.608047"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3963"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(-0.735652,0.6773596,0.7187579,0.6952605,0,0)" />
+ <rect
+ transform="scale(-1,-1)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3965"
+ width="2"
+ height="13"
+ x="21"
+ y="-58.058975"
+ rx="1"
+ ry="1" />
+ </g>
+ <g
+ id="g3967">
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3969"
+ width="2"
+ height="10"
+ x="44.058975"
+ y="17"
+ rx="1"
+ ry="1" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="47.72015"
+ x="16.961395"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3971"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.735652,0.6773596,-0.7187579,0.6952605,0,0)" />
+ <rect
+ transform="matrix(-0.735652,0.6773596,0.7187579,0.6952605,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3973"
+ width="1.9562798"
+ height="7.7827225"
+ x="47.608047"
+ y="17.862579"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="1"
+ rx="1"
+ y="-58.058975"
+ x="21"
+ height="13"
+ width="2"
+ id="rect3975"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,-1)" />
+ </g>
+ </g>
+ <g
+ id="north-left-limit-slider"
+ transform="matrix(0,1,-1,0,182,39)">
+ <path
+ style="fill:url(#linearGradient4011);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M -15,91.632048 L -15,70 C -15,67.751327 -16.70382,65.941024 -18.82021,65.941024 L -24.17979,65.941024 C -26.29618,65.941024 -28,67.751327 -28,70 L -28,82.941024 C -28,89.316024 -23.17979,95.941024 -19.000003,95.941024 C -16.883613,95.941024 -15,93.880721 -15,91.632048 z"
+ id="path3979"
+ sodipodi:nodetypes="cccccccc" />
+ <g
+ id="g3981"
+ style="fill:#ffffff;fill-opacity:1"
+ transform="translate(1,5.897522e-2)">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3983"
+ width="2"
+ height="10"
+ x="-81.941025"
+ y="17"
+ rx="1"
+ ry="1"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="-45.127308"
+ x="-73.75383"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3985"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.735652,-0.6773596,-0.7187579,-0.6952605,0,0)" />
+ <rect
+ transform="matrix(-0.735652,-0.6773596,0.7187579,-0.6952605,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3987"
+ width="1.9562798"
+ height="7.7827225"
+ x="-43.107178"
+ y="-74.984879"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="1"
+ rx="1"
+ y="67.941025"
+ x="21"
+ height="13"
+ width="2"
+ id="rect3989"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="scale(-1,1)" />
+ </g>
+ <g
+ id="g3991">
+ <rect
+ transform="matrix(0,-1,-1,0,0,0)"
+ ry="1"
+ rx="1"
+ y="17"
+ x="-81.941025"
+ height="10"
+ width="2"
+ id="rect3993"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="matrix(0.735652,-0.6773596,-0.7187579,-0.6952605,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3995"
+ width="1.9562798"
+ height="7.7827225"
+ x="-73.75383"
+ y="-45.127308"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="0.97700465"
+ rx="0.97813988"
+ y="-74.984879"
+ x="-43.107178"
+ height="7.7827225"
+ width="1.9562798"
+ id="rect3997"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(-0.735652,-0.6773596,0.7187579,-0.6952605,0,0)" />
+ <rect
+ transform="scale(-1,1)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect3999"
+ width="2"
+ height="13"
+ x="21"
+ y="67.941025"
+ rx="1"
+ ry="1" />
+ </g>
+ </g>
+ <g
+ id="north-offset-slider"
+ transform="matrix(0,1,-1,0,110,64)">
+ <path
+ sodipodi:nodetypes="cszscc"
+ id="path4003"
+ d="M -40,38.012068 C -40,35.745688 -41.992266,34.008795 -44.010444,34.008795 C -47.939225,34.008797 -52,40.030121 -52,46.012681 C -52,52.021215 -48.035355,58.008795 -44.010444,58.008795 C -41.998577,58.008795 -40,56.266379 -40,54 L -40,38.012068 z"
+ style="fill:url(#linearGradient4013);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M -45.339234,40.999351 C -45.582216,40.996217 -45.839486,41.086093 -46.027997,41.280632 L -49.409203,44.812265 C -49.636394,45.027337 -49.994226,45.345012 -49.998828,45.999893 C -50.0034,46.650182 -49.605323,47.037026 -49.409203,47.218775 L -46.027997,50.719153 C -45.650986,51.108236 -45.049509,51.086584 -44.681772,50.687901 C -44.314044,50.289216 -44.30476,49.67058 -44.681772,49.281497 L -46.90461,47 L -43,47 C -42.44498,47 -41.99816,46.553953 -41.99816,45.999893 C -41.99816,45.445832 -42.44498,44.999272 -43,44.999272 L -46.90461,44.999272 L -44.681772,42.718287 C -44.30476,42.329212 -44.314044,41.710571 -44.681772,41.311885 C -44.86564,41.112543 -45.096251,41.002486 -45.339234,40.999351 z"
+ id="path4005"
+ sodipodi:nodetypes="ccczccscccscccsc" />
+ <path
+ sodipodi:nodetypes="ccczccscccscccsc"
+ id="path4007"
+ d="M -46.341254,41.000079 C -46.584236,40.996945 -46.841506,41.086821 -47.030017,41.28136 L -50.411223,44.812993 C -50.638414,45.028065 -50.996246,45.34574 -51.000848,46.000621 C -51.00542,46.65091 -50.607343,47.037754 -50.411223,47.219503 L -47.030017,50.719881 C -46.653006,51.108964 -46.051529,51.087312 -45.683792,50.688629 C -45.316064,50.289944 -45.30678,49.671308 -45.683792,49.282225 L -47.90663,47.000728 L -44.00202,47.000728 C -43.447,47.000728 -43.00018,46.554681 -43.00018,46.000621 C -43.00018,45.44656 -43.447,45 -44.00202,45 L -47.90663,45 L -45.683792,42.719015 C -45.30678,42.32994 -45.316064,41.711299 -45.683792,41.312613 C -45.86766,41.113271 -46.098271,41.003214 -46.341254,41.000079 z"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ </g>
+ <g
+ id="east-right-limit-slider"
+ transform="matrix(0,-1,1,0,33.999999,137)">
+ <path
+ style="fill:url(#linearGradient4061);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 46.386898,102.02597 L 68.018946,102.02597 C 70.267619,102.02597 72.077922,103.72979 72.077922,105.84618 L 72.058976,112.17979 C 72.058976,114.29618 70.248673,116 68,116 L 55.058976,116 C 48.683976,116 42.077922,110.20576 42.077922,106.02597 C 42.077922,103.90958 44.138225,102.02597 46.386898,102.02597 z"
+ id="path4023"
+ sodipodi:nodetypes="cccccccc" />
+ <g
+ id="g4025"
+ style="fill:#ffffff;fill-opacity:1"
+ transform="translate(0,0.4419416)">
+ <rect
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4027"
+ width="2"
+ height="10"
+ x="56.000004"
+ y="103.55806"
+ rx="1"
+ ry="1" />
+ <rect
+ ry="0.97700471"
+ rx="0.97813982"
+ y="115.2485"
+ x="-34.722744"
+ height="7.7827229"
+ width="1.9562796"
+ id="rect4029"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.6773596,-0.735652,0.6952605,0.7187579,0,0)" />
+ <rect
+ transform="matrix(0.6773596,0.735652,0.6952605,-0.7187579,0,0)"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4031"
+ width="1.9562798"
+ height="7.7827225"
+ x="116.17191"
+ y="-31.648996"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="1"
+ rx="1"
+ y="-70"
+ x="107.55806"
+ height="13"
+ width="2"
+ id="rect4033"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0,1,-1,0,0,0)" />
+ </g>
+ <g
+ id="g4035">
+ <rect
+ ry="1"
+ rx="1"
+ y="103.02597"
+ x="56.077923"
+ height="10"
+ width="2"
+ id="rect4037"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <rect
+ transform="matrix(0.6773596,-0.735652,0.6952605,0.7187579,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4039"
+ width="1.9562798"
+ height="7.7827225"
+ x="-34.296085"
+ y="114.94488"
+ rx="0.97813988"
+ ry="0.97700465" />
+ <rect
+ ry="0.97700471"
+ rx="0.97813982"
+ y="-32.067432"
+ x="116.48637"
+ height="7.7827229"
+ width="1.9562796"
+ id="rect4041"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ transform="matrix(0.6773596,0.735652,0.6952605,-0.7187579,0,0)" />
+ <rect
+ transform="matrix(0,1,-1,0,0,0)"
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ id="rect4043"
+ width="2"
+ height="13"
+ x="107.02597"
+ y="-70.077919"
+ rx="1"
+ ry="1" />
+ </g>
+ </g>
+ <g
+ id="east-left-limit-slider"
+ transform="matrix(0,-1,1,0,18,101.5625)">
+ <path
+ sodipodi:nodetypes="cccccccc"
+ id="path4047"
+ d="M 67.768946,118.02597 L 46.136898,118.02597 C 43.888225,118.02597 42.077922,119.72979 42.077922,121.84618 L 42,128 C 42,130.11639 43.810303,131.82021 46.058976,131.82021 L 59,131.82021 C 65.375,131.82021 72.077922,126.20576 72.077922,122.02597 C 72.077922,119.90958 70.017619,118.02597 67.768946,118.02597 z"
+ style="fill:url(#linearGradient4063);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path4049"
+ d="M 52,120 C 51.757465,120.00313 51.527277,120.11318 51.34375,120.3125 C 50.976696,120.71114 50.967433,121.32972 51.34375,121.71875 L 53.5625,124 L 45,124 C 44.446,124 44,124.446 44,125 C 44,125.554 44.446,126 45,126 L 53.5625,126 L 51.34375,128.28125 C 50.967434,128.67029 50.976696,129.28886 51.34375,129.6875 C 51.710805,130.08614 52.311183,130.10779 52.6875,129.71875 L 56,126.25 L 56,129 C 56,129.554 56.446,130 57,130 C 57.554,130 58,129.554 58,129 L 58,121 C 58,120.446 57.554,120 57,120 C 56.446,120 56,120.446 56,121 L 56,123.71875 L 52.6875,120.28125 C 52.499341,120.08673 52.242535,119.99687 52,120 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 52.0625,119.03125 C 51.819965,119.03438 51.589777,119.14443 51.40625,119.34375 C 51.039196,119.74239 51.029933,120.36097 51.40625,120.75 L 53.625,123.03125 L 45.0625,123.03125 C 44.5085,123.03125 44.0625,123.47725 44.0625,124.03125 C 44.0625,124.58525 44.5085,125.03125 45.0625,125.03125 L 53.625,125.03125 L 51.40625,127.3125 C 51.029934,127.70154 51.039196,128.32011 51.40625,128.71875 C 51.773305,129.11739 52.373683,129.13904 52.75,128.75 L 56.0625,125.28125 L 56.0625,128.03125 C 56.0625,128.58525 56.5085,129.03125 57.0625,129.03125 C 57.6165,129.03125 58.0625,128.58525 58.0625,128.03125 L 58.0625,120.03125 C 58.0625,119.47725 57.6165,119.03125 57.0625,119.03125 C 56.5085,119.03125 56.0625,119.47725 56.0625,120.03125 L 56.0625,122.75 L 52.75,119.3125 C 52.561841,119.11798 52.305035,119.02812 52.0625,119.03125 z"
+ id="path4051" />
+ </g>
+ <g
+ id="east-offset-slider"
+ transform="matrix(0,-1,1,0,58.97227,60.719881)">
+ <path
+ style="fill:url(#linearGradient4065);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 8.0032728,102 C 5.7368938,102 4.0000003,103.99209 4.0000003,106.01009 C 4.0000023,109.93852 10.01744,116 16,116 C 22.008534,116 28,110.03465 28,106.01009 C 28,103.9984 26.257584,102 23.991205,102 L 8.0032728,102 z"
+ id="path4055"
+ sodipodi:nodetypes="cszscc" />
+ <path
+ sodipodi:nodetypes="ccczccscccscccsc"
+ id="path4057"
+ d="M 11.000079,108.33903 C 10.996945,108.58199 11.086821,108.83924 11.28136,109.02773 L 14.812993,112.40864 C 15.028065,112.63581 15.34574,112.99361 16.000621,112.99821 C 16.65091,113.00278 17.037754,112.60474 17.219503,112.40864 L 20.719881,109.02773 C 21.108964,108.65075 21.087312,108.04933 20.688629,107.68162 C 20.289944,107.31393 19.671308,107.30464 19.282225,107.68162 L 17.000728,109.90427 L 17.000728,106 C 17.000728,105.44503 16.554681,104.99825 16.000621,104.99825 C 15.44656,104.99825 15,105.44503 15,106 L 15,109.90427 L 12.719015,107.68162 C 12.32994,107.30464 11.711299,107.31393 11.312613,107.68162 C 11.113271,107.86548 11.003214,108.09607 11.000079,108.33903 z"
+ style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.7750001;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 11.000079,107.34078 C 10.996945,107.58374 11.086821,107.84099 11.28136,108.02948 L 14.812993,111.41039 C 15.028065,111.63756 15.34574,111.99536 16.000621,111.99996 C 16.65091,112.00453 17.037754,111.60649 17.219503,111.41039 L 20.719881,108.02948 C 21.108964,107.6525 21.087312,107.05108 20.688629,106.68337 C 20.289944,106.31568 19.671308,106.30639 19.282225,106.68337 L 17.000728,108.90602 L 17.000728,105.00175 C 17.000728,104.44678 16.554681,104 16.000621,104 C 15.44656,104 15,104.44678 15,105.00175 L 15,108.90602 L 12.719015,106.68337 C 12.32994,106.30639 11.711299,106.31568 11.312613,106.68337 C 11.113271,106.86723 11.003214,107.09782 11.000079,107.34078 z"
+ id="path4059"
+ sodipodi:nodetypes="ccczccscccscccsc" />
+ </g>
</g>
</svg>
--- desktoptheme/metadata.desktop
+++ desktoptheme/metadata.desktop
@@ -1,5 +1,6 @@
[Desktop Entry]
Name=Oxygen
+Name[ar]=أكسجين
Name[csb]=Krziseń
Name[es]=Oxígeno
Name[gu]=ઓક્સિજન
--- runners/shell/plasma-runner-shell.desktop
+++ runners/shell/plasma-runner-shell.desktop
@@ -20,7 +20,7 @@
Name[he]=שורת פקודה
Name[hu]=Parancssor
Name[is]=Skipanalína
-Name[it]=Linea di comando
+Name[it]=Riga di comando
Name[ja]=コマンドライン
Name[kk]=Команда жолы
Name[km]=បន្ទាត់ពាក្យបញ្ជា
--- runners/bookmarks/plasma-runner-bookmarks.desktop
+++ runners/bookmarks/plasma-runner-bookmarks.desktop
@@ -59,8 +59,8 @@
Name[se]=Girjemearkkat
Name[sk]=Záložky
Name[sl]=Zaznamki
-Name[sr]=маркери
-Name[sr@latin]=markeri
+Name[sr]=Маркери
+Name[sr@latin]=Markeri
Name[sv]=Bokmärken
Name[ta]=நினைவுக்குறிகள்
Name[te]=పేజి గుర్తులు
@@ -123,8 +123,8 @@
Comment[ru]=Открыть закладку
Comment[se]=Raba girjemearkka
Comment[sl]=Odpri zaznamek
-Comment[sr]=Отвори маркер
-Comment[sr@latin]=Otvori marker
+Comment[sr]=Отворите маркер
+Comment[sr@latin]=Otvorite marker
Comment[sv]=Öppna bokmärke
Comment[tg]=Кушодани хатчӯб
Comment[th]=เปิดที่คั่นหน้า
--- runners/calculator/plasma-runner-calculator.desktop
+++ runners/calculator/plasma-runner-calculator.desktop
@@ -1,5 +1,6 @@
[Desktop Entry]
Name=Calculator
+Name[ar]=آلة حاسبة
Name[bg]=Калкулатор
Name[bn_IN]=ক্যালকুলেটর
Name[ca]=Calculadora
@@ -90,7 +91,7 @@
Comment[nds]=Utdrück utreken
Comment[ne]=अभिव्यक्ति गणना गर्नुहोस्
Comment[nl]=Expressies berekenen
-Comment[nn]=Rekn ut mattestykke
+Comment[nn]=Grafisk kalkulator
Comment[pa]=ਸਮੀਕਰਨ ਕੱਢੋ
Comment[pl]=Obliczenie wartości wyrażenia
Comment[pt]=Calcular expressões
--- runners/webshortcuts/plasma-runner-webshortcuts.desktop
+++ runners/webshortcuts/plasma-runner-webshortcuts.desktop
@@ -59,7 +59,7 @@
Name[sk]=Internetové skratky
Name[sl]=Spletne bližnjice
Name[sr]=веб пречице
-Name[sr@latin]=web prečice
+Name[sr@latin]=veb prečice
Name[sv]=Webbgenvägar
Name[ta]=இணைய சுருக்கு வழிகள்
Name[tg]=Тугмаҳои тез
--- containments/panel/plasma-containment-panel.desktop
+++ containments/panel/plasma-containment-panel.desktop
@@ -111,7 +111,7 @@
Comment[zh_TW]=面板容器
Icon=
Type=Service
-X-KDE-ServiceTypes=Plasma/Applet,Plasma/Containment
+X-KDE-ServiceTypes=Plasma/Applet
NoDisplay=true
X-KDE-Library=plasma_containment_panel
--- containments/panel/panel.cpp
+++ containments/panel/panel.cpp
@@ -83,6 +83,7 @@
KConfigGroup cg = config("Configuration");
setMinimumSize(cg.readEntry("minimumSize", m_currentSize));
setMaximumSize(cg.readEntry("maximumSize", m_currentSize));
+ setDrawWallpaper(false);
}
QList<QAction*> Panel::contextualActions()
@@ -182,7 +183,7 @@
panel->setScreen(screen());
panel->setLocation(Plasma::TopEdge);
- // trigger an instant layout so we immediately have a proper geometry
+ // trigger an instant layout so we immediately have a proper geometry
// rather than waiting around for the event loop
panel->updateConstraints(Plasma::StartupCompletedConstraint);
panel->flushPendingConstraintsEvents();
@@ -320,7 +321,7 @@
QRectF screenRect = screen() >= 0 ? QApplication::desktop()->screenGeometry(screen()) :
geometry();
- if ((formFactor() == Horizontal && m_currentSize.width() >= screenRect.width()) ||
+ if ((formFactor() == Horizontal && m_currentSize.width() >= screenRect.width()) ||
(formFactor() == Vertical && m_currentSize.height() >= screenRect.height())) {
m_background->setElementPrefix(location());
} else {
@@ -410,7 +411,7 @@
painter->resetTransform();
const Containment::StyleOption *containmentOpt = qstyleoption_cast<const Containment::StyleOption *>(option);
-
+
QRect viewGeom;
if (containmentOpt) {
viewGeom = containmentOpt->view->geometry();
@@ -419,6 +420,9 @@
if (viewGeom != m_lastViewGeom) {
m_lastViewGeom = viewGeom;
updateBorders(viewGeom);
+ if (containmentOpt && containmentOpt->view) {
+ containmentOpt->view->setMask(m_background->mask());
+ }
}
// blit the background (saves all the per-pixel-products that blending does)
@@ -427,10 +431,6 @@
m_background->paintPanel(painter, contentsRect);
- if (containmentOpt && containmentOpt->view) {
- containmentOpt->view->setMask(m_background->mask());
- }
-
// restore transformation and composition mode
painter->restore();
}
--- containments/desktop/plasma-themes.knsrc
+++ containments/desktop/plasma-themes.knsrc
@@ -1,4 +0,0 @@
-[KNewStuff2]
-ProvidersUrl=http://download.kde.org/khotnewstuff/plasmathemes-providers.xml
-TargetDir=desktoptheme
-Uncompress=true
--- containments/desktop/backgrounddialog.cpp
+++ containments/desktop/backgrounddialog.cpp
@@ -1,966 +0,0 @@
-/*
- Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
-
- 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.
-*/
-
-#define USE_BACKGROUND_PACKAGES
-
-#include "backgrounddialog.h"
-#include <memory>
-#include <QAbstractItemView>
-#include <QAbstractListModel>
-#include <QComboBox>
-#include <QDir>
-#include <QFileInfo>
-#include <QGroupBox>
-#include <QLabel>
-#include <QList>
-#include <QListWidget>
-#include <QPainter>
-#include <QStackedWidget>
-#include <QTimeEdit>
-#include <QToolButton>
-#include <QVBoxLayout>
-#include <QCheckBox>
-#include <KColorButton>
-#include <KColorScheme>
-#include <KDebug>
-#include <KDesktopFile>
-#include <KDirSelectDialog>
-#include <KDirWatch>
-#include <KFileDialog>
-#include <KGlobalSettings>
-#include <KImageFilePreview>
-#include <KLocalizedString>
-#include <KPushButton>
-#include <KSeparator>
-#include <KStandardDirs>
-#include <knewstuff2/engine.h>
-#include <ThreadWeaver/Weaver>
-#include <KAboutData>
-
-#ifdef USE_BACKGROUND_PACKAGES
-
-#include <plasma/packagemetadata.h>
-#include <plasma/panelsvg.h>
-#include <plasma/package.h>
-#include <plasma/theme.h>
-
-#endif
-
-class ThemeInfo
-{
-public:
- QString package;
- Plasma::PanelSvg *svg;
-};
-
-class ThemeModel : public QAbstractListModel
-{
-public:
- enum { PackageNameRole = Qt::UserRole,
- SvgRole = Qt::UserRole + 1
- };
-
- ThemeModel(QObject *parent = 0);
- virtual ~ThemeModel();
-
- virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
- virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
- int indexOf(const QString &path) const;
- void reload();
-private:
- QMap<QString, ThemeInfo> m_themes;
-};
-
-ThemeModel::ThemeModel( QObject *parent )
-: QAbstractListModel( parent )
-{
- reload();
-}
-
-ThemeModel::~ThemeModel()
-{
-}
-
-void ThemeModel::reload()
-{
- reset();
- //TODO: the svg objects don't get deleted until the dialog goes away!
- m_themes.clear();
-
- // get all desktop themes
- KStandardDirs dirs;
- QStringList themes = dirs.findAllResources("data", "desktoptheme/*/metadata.desktop", KStandardDirs::NoDuplicates);
- foreach (const QString &theme, themes) {
- kDebug() << theme;
- int themeSepIndex = theme.lastIndexOf("/", -1);
- QString themeRoot = theme.left(themeSepIndex);
- int themeNameSepIndex = themeRoot.lastIndexOf("/", -1);
- QString packageName = themeRoot.right(themeRoot.length() - themeNameSepIndex - 1);
-
- KDesktopFile df(theme);
- QString name = df.readName();
- if (name.isEmpty()) {
- name = packageName;
- }
-
- Plasma::PanelSvg *svg = new Plasma::PanelSvg(this);
- svg->setImagePath(themeRoot + "/widgets/background.svg");
- svg->setEnabledBorders(Plasma::PanelSvg::AllBorders);
- ThemeInfo info;
- info.package = packageName;
- info.svg = svg;
- m_themes[name] = info;
- }
-
- beginInsertRows(QModelIndex(), 0, m_themes.size());
- endInsertRows();
-}
-
-int ThemeModel::rowCount(const QModelIndex &) const
-{
- return m_themes.size();
-}
-
-QVariant ThemeModel::data(const QModelIndex &index, int role) const
-{
- if (!index.isValid()) {
- return QVariant();
- }
-
- if (index.row() >= m_themes.size()) {
- return QVariant();
- }
-
- QMap<QString, ThemeInfo>::const_iterator it = m_themes.constBegin();
- for (int i = 0; i < index.row(); ++i) {
- ++it;
- }
-
- switch (role) {
- case Qt::DisplayRole:
- return it.key();
- case PackageNameRole:
- return (*it).package;
- case SvgRole:
- return qVariantFromValue((void*)(*it).svg);
- default:
- return QVariant();
- }
-}
-
-int ThemeModel::indexOf(const QString &name) const
-{
- QMapIterator<QString, ThemeInfo> it(m_themes);
- int i = -1;
- while (it.hasNext()) {
- ++i;
- if (it.next().value().package == name) {
- return i;
- }
- }
-
- return -1;
-}
-
-
-
-class ThemeDelegate : public QAbstractItemDelegate
-{
-public:
- ThemeDelegate( QObject * parent = 0 );
-
- virtual void paint(QPainter *painter,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const;
- virtual QSize sizeHint(const QStyleOptionViewItem &option,
- const QModelIndex &index) const;
-private:
- static const int MARGIN = 5;
-};
-
-ThemeDelegate::ThemeDelegate( QObject * parent )
-: QAbstractItemDelegate( parent )
-{
- kDebug();
-}
-
-void ThemeDelegate::paint(QPainter *painter,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const
-{
- QString title = index.model()->data(index, Qt::DisplayRole).toString();
- QString package = index.model()->data(index, ThemeModel::PackageNameRole).toString();
-
- // highlight selected item
- painter->save();
- if (option.state & QStyle::State_Selected) {
- painter->setBrush(option.palette.color(QPalette::Highlight));
- } else {
- painter->setBrush(Qt::gray);
- }
- painter->drawRect(option.rect);
- painter->restore();
-
- // draw image
- Plasma::PanelSvg *svg = static_cast<Plasma::PanelSvg *>(index.model()->data(index, ThemeModel::SvgRole).value<void *>());
- svg->resizePanel(QSize(option.rect.width()-(2*MARGIN), 100-(2*MARGIN)));
- QRect imgRect = QRect(option.rect.topLeft(), QSize( option.rect.width()-(2*MARGIN), 100-(2*MARGIN) )).
- translated(MARGIN, MARGIN);
- svg->paintPanel( painter, imgRect, QPoint(option.rect.left() + MARGIN, option.rect.top() + MARGIN) );
-
- // draw text
- painter->save();
- QFont font = painter->font();
- font.setWeight(QFont::Bold);
- QString colorFile = KStandardDirs::locate("data", "desktoptheme/" + package + "/colors");
- if (!colorFile.isEmpty()) {
- KSharedConfigPtr colors = KSharedConfig::openConfig(colorFile);
- KColorScheme colorScheme(QPalette::Active, KColorScheme::Window, colors);
- painter->setPen(colorScheme.foreground(KColorScheme::NormalText).color());
- }
- painter->setFont(font);
- painter->drawText(option.rect, Qt::AlignCenter | Qt::TextWordWrap, title);
- painter->restore();
-}
-
-QSize ThemeDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
-{
- return QSize(200, 100);
-}
-
-
-class BackgroundContainer
-{
-public:
- virtual ~BackgroundContainer();
- virtual bool contains(const QString &path) const = 0;
-};
-
-QList<Background *>
-findAllBackgrounds(const BackgroundContainer *container,
- const QString &path,
- float ratio)
-{
- QList<Background *> res;
-
-#ifdef USE_BACKGROUND_PACKAGES
-
- // get all packages in this directory
- QStringList packages = Plasma::Package::listInstalled(path);
- foreach (const QString &packagePath, packages)
- {
- kDebug() << packagePath;
- std::auto_ptr<Background> pkg(
- new BackgroundPackage(path+packagePath, ratio));
-// kDebug() << "Package is valid?" << pkg->isValid();
-// kDebug() << "Path passed to the constructor" << path+packagePath;
- if (pkg->isValid() &&
- (!container || !container->contains(pkg->path()))) {
- res.append(pkg.release());
- }
- }
-// kDebug() << packages << res;
-
-#endif
-
- // search normal wallpapers
- QDir dir(path);
- QStringList filters;
- filters << "*.png" << "*.jpeg" << "*.jpg" << "*.svg" << "*.svgz";
- dir.setNameFilters(filters);
- dir.setFilter(QDir::Files | QDir::Hidden);
- QFileInfoList files = dir.entryInfoList();
- foreach (const QFileInfo &wp, files)
- {
- if (!container || !container->contains(wp.filePath())) {
- res.append(new BackgroundFile(wp.filePath(), ratio));
- }
- }
-
- return res;
-}
-
-BackgroundContainer::~BackgroundContainer()
-{
-}
-
-class BackgroundListModel : public QAbstractListModel
- , public BackgroundContainer
-{
-public:
- BackgroundListModel(float ratio, QObject *listener);
- virtual ~BackgroundListModel();
-
- virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
- virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
- Background* package(int index) const;
-
- void reload();
- void reload(const QStringList &selected);
- void addBackground(const QString &path);
- int indexOf(const QString &path) const;
- void removeBackground(const QString &path);
- virtual bool contains(const QString &bg) const;
-private:
- QObject *m_listener;
- QList<Background*> m_packages;
- float m_ratio;
- KDirWatch m_dirwatch;
-};
-
-class BackgroundDelegate : public QAbstractItemDelegate
-{
-public:
- enum {
- AuthorRole = Qt::UserRole,
- ScreenshotRole
- };
-
- BackgroundDelegate(QObject *listener,
- float ratio, QObject *parent = 0);
-
- virtual void paint(QPainter *painter,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const;
- virtual QSize sizeHint(const QStyleOptionViewItem &option,
- const QModelIndex &index) const;
-private:
- static const int MARGIN = 5;
- QObject *m_listener;
- float m_ratio;
-};
-
-BackgroundListModel::BackgroundListModel(float ratio, QObject *listener)
-: m_listener(listener)
-, m_ratio(ratio)
-{
- connect(&m_dirwatch, SIGNAL(deleted(QString)), listener, SLOT(removeBackground(QString)));
-}
-
-void BackgroundListModel::removeBackground(const QString &path)
-{
- int index;
- while ((index = indexOf(path)) != -1) {
- beginRemoveRows(QModelIndex(), index, index);
- m_packages.removeAt(index);
- endRemoveRows();
- }
-}
-
-void BackgroundListModel::reload()
-{
- reload(QStringList());
-}
-
-void BackgroundListModel::reload(const QStringList& selected)
-{
- QStringList dirs = KGlobal::dirs()->findDirs("wallpaper", "");
- QList<Background *> tmp;
- foreach (const QString &file, selected) {
- if (!contains(file) && QFile::exists(file)) {
- tmp << new BackgroundFile(file, m_ratio);
- }
- }
- foreach (const QString &dir, dirs) {
- tmp += findAllBackgrounds(this, dir, m_ratio);
- }
-
- // add new files to dirwatch
- foreach (Background *b, tmp) {
- if (!m_dirwatch.contains(b->path())) {
- m_dirwatch.addFile(b->path());
- }
- }
-
- if (!tmp.isEmpty()) {
- beginInsertRows(QModelIndex(), 0, tmp.size() - 1);
- m_packages = tmp + m_packages;
- endInsertRows();
- }
-}
-
-void BackgroundListModel::addBackground(const QString& path) {
- if (!contains(path)) {
- if (!m_dirwatch.contains(path)) {
- m_dirwatch.addFile(path);
- }
- beginInsertRows(QModelIndex(), 0, 0);
- m_packages.prepend(new BackgroundFile(path, m_ratio));
- endInsertRows();
- }
-}
-
-int BackgroundListModel::indexOf(const QString &path) const
-{
- for (int i = 0; i < m_packages.size(); i++) {
- if (path.startsWith(m_packages[i]->path())) {
- return i;
- }
- }
- return -1;
-}
-
-bool BackgroundListModel::contains(const QString &path) const
-{
- return indexOf(path) != -1;
-}
-
-BackgroundListModel::~BackgroundListModel()
-{
- foreach (Background* pkg, m_packages) {
- delete pkg;
- }
-}
-
-int BackgroundListModel::rowCount(const QModelIndex &) const
-{
- return m_packages.size();
-}
-
-QVariant BackgroundListModel::data(const QModelIndex &index, int role) const
-{
- if (!index.isValid()) {
- return QVariant();
- }
-
- if (index.row() >= m_packages.size()) {
- return QVariant();
- }
-
- Background *b = package(index.row());
- if (!b) {
- return QVariant();
- }
-
- switch (role) {
- case Qt::DisplayRole:
- return b->title();
- case BackgroundDelegate::ScreenshotRole: {
- QPixmap pix = b->screenshot();
- if (pix.isNull() && !b->screenshotGenerationStarted()) {
- connect(b, SIGNAL(screenshotDone(QPersistentModelIndex)),
- m_listener, SLOT(updateScreenshot(QPersistentModelIndex)),
- Qt::QueuedConnection);
- b->generateScreenshot(index);
- }
- return pix;
- }
- case BackgroundDelegate::AuthorRole:
- return b->author();
- default:
- return QVariant();
- }
-}
-
-Background* BackgroundListModel::package(int index) const
-{
- return m_packages.at(index);
-}
-
-BackgroundDelegate::BackgroundDelegate(QObject *listener,
- float ratio, QObject *parent)
-: QAbstractItemDelegate(parent)
-, m_listener(listener)
-, m_ratio(ratio)
-{
-}
-
-void BackgroundDelegate::paint(QPainter *painter,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const
-{
- QString title = index.model()->data(index, Qt::DisplayRole).toString();
- QString author = index.model()->data(index, AuthorRole).toString();
- QPixmap pix = index.model()->data(index, ScreenshotRole).value<QPixmap>();
-
- // draw selection outline
- if (option.state & QStyle::State_Selected) {
- QPen oldPen = painter->pen();
- painter->setPen(option.palette.color(QPalette::Highlight));
- painter->drawRect(option.rect.adjusted(2, 2, -2, -2));
- painter->setPen(oldPen);
- }
-
- // draw pixmap
- int maxheight = Background::SCREENSHOT_HEIGHT;
- int maxwidth = int(maxheight * m_ratio);
- if (!pix.isNull()) {
- QSize sz = pix.size();
- int x = MARGIN + (maxwidth - pix.width()) / 2;
- int y = MARGIN + (maxheight - pix.height()) / 2;
- QRect imgRect = QRect(option.rect.topLeft(), pix.size()).translated(x, y);
- painter->drawPixmap(imgRect, pix);
- }
-
- // draw text
- painter->save();
- QFont font = painter->font();
- font.setWeight(QFont::Bold);
- painter->setFont(font);
- int x = option.rect.left() + MARGIN * 5 + maxwidth;
-
- QRect textRect(x,
- option.rect.top() + MARGIN,
- option.rect.width() - x - MARGIN * 2,
- maxheight);
- QString text = title;
- QString authorCaption;
- if (!author.isEmpty()) {
- authorCaption = i18nc("Caption to wallpaper preview, %1 author name",
- "by %1", author);
- text += '\n' + authorCaption;
- }
- QRect boundingRect = painter->boundingRect(
- textRect, Qt::AlignVCenter | Qt::TextWordWrap, text);
- painter->drawText(boundingRect, Qt::TextWordWrap, title);
- if (!author.isEmpty()) {
- QRect titleRect = painter->boundingRect(boundingRect, Qt::TextWordWrap, title);
- QRect authorRect(titleRect.bottomLeft(), textRect.size());
- painter->setFont(KGlobalSettings::smallestReadableFont());
- painter->drawText(authorRect, Qt::TextWordWrap, authorCaption);
- }
-
- painter->restore();
-}
-
-QSize BackgroundDelegate::sizeHint(const QStyleOptionViewItem &,
- const QModelIndex &) const
-{
- return QSize(100, Background::SCREENSHOT_HEIGHT + MARGIN * 2);
-}
-
-
-BackgroundDialog::BackgroundDialog(const QSize &res,
- const KConfigGroup &config,
- const KConfigGroup &globalConfig,
- QWidget *parent)
-: KDialog(parent)
-, m_res(res)
-, m_ratio((float) res.width() / res.height())
-, m_currentSlide(-1)
-, m_preview_renderer(QSize(128, 101), (float) 128 / res.width())
-{
- setWindowIcon(KIcon("preferences-desktop-wallpaper"));
- setCaption(i18n("Desktop Settings"));
- setButtons(Ok | Cancel | Apply);
-
- QWidget * main = new QWidget(this);
- setupUi(main);
-
- // static, slideshow or none?
- connect(m_mode, SIGNAL(currentIndexChanged(int)),
- this, SLOT(changeBackgroundMode(int)));
-
- // static picture
- m_model = new BackgroundListModel(m_ratio, this);
- m_view->setModel(m_model);
- m_view->setItemDelegate(new BackgroundDelegate(m_view->view(), m_ratio, this));
- m_view->view()->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
- connect(m_view, SIGNAL(currentIndexChanged(int)),
- this, SLOT(update()));
- m_pictureUrlButton->setIcon(KIcon("document-open"));
- connect(m_pictureUrlButton, SIGNAL(clicked()), this, SLOT(showFileDialog()));
-
- // resize method
- m_resizeMethod->addItem(i18n("Scaled & Cropped"),
- Background::ScaleCrop);
- m_resizeMethod->addItem(i18n("Scaled"),
- Background::Scale);
- m_resizeMethod->addItem(i18n("Centered"),
- Background::Center);
- m_resizeMethod->addItem(i18n("Tiled"),
- Background::Tiled);
- m_resizeMethod->addItem(i18n("Center Tiled"),
- Background::CenterTiled);
- connect(m_resizeMethod, SIGNAL(currentIndexChanged(int)),
- this, SLOT(update()));
-
- // color
- m_color->setColor(palette().color(QPalette::Window));
- connect(m_color, SIGNAL(changed(QColor)), this, SLOT(update()));
-
- // slideshow
- m_addDir->setIcon(KIcon("list-add"));
- connect(m_addDir, SIGNAL(clicked()), this, SLOT(slotAddDir()));
- m_removeDir->setIcon(KIcon("list-remove"));
- connect(m_removeDir, SIGNAL(clicked()), this, SLOT(slotRemoveDir()));
- connect(m_dirlist, SIGNAL(currentRowChanged(int)), this, SLOT(updateSlideshow()));
-
- m_slideshowDelay->setMinimumTime(QTime(0, 0, 30));
-
- // preview
- QString monitorPath = KStandardDirs::locate("data", "kcontrol/pics/monitor.png");
-
- // Size of monitor image: 200x186
- // Geometry of "display" part of monitor image: (23,14)-[151x115]
- qreal previewRatio = 128.0 / (101.0 * m_ratio);
- QSize monitorSize(200, int(186 * previewRatio));
- QRect previewRect(23, int(14 * previewRatio), 151, int(115 * previewRatio));
- m_preview_renderer.setSize(previewRect.size());
-
- m_monitor->setPixmap(QPixmap(monitorPath).scaled(monitorSize));
- m_monitor->setWhatsThis(i18n(
- "This picture of a monitor contains a preview of "
- "what the current settings will look like on your desktop."));
- m_preview = new QLabel(m_monitor);
- m_preview->setScaledContents(true);
- m_preview->setGeometry(previewRect);
-
- connect(m_newStuff, SIGNAL(clicked()), this, SLOT(getNewWallpaper()));
- connect(m_newThemeButton, SIGNAL(clicked()), this, SLOT(getNewThemes()));
-
- qRegisterMetaType<QImage>("QImage");
- connect(&m_preview_timer, SIGNAL(timeout()), this, SLOT(updateSlideshowPreview()));
- connect(&m_preview_renderer, SIGNAL(done(int, const QImage &)),
- this, SLOT(previewRenderingDone(int, const QImage &)));
- connect(this, SIGNAL(finished(int)), this, SLOT(cleanup()));
-
- m_themeModel = new ThemeModel(this);
- m_theme->setModel(m_themeModel);
- m_theme->setItemDelegate(new ThemeDelegate(m_theme->view()));
- m_theme->view()->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
-
- setMainWidget(main);
- m_emailLine->setTextInteractionFlags(Qt::TextSelectableByMouse);
-
- reloadConfig(config, globalConfig);
- adjustSize();
-}
-
-void BackgroundDialog::reloadConfig(const KConfigGroup &config, const KConfigGroup &globalConfig)
-{
- Q_UNUSED(globalConfig)
-
- // initialize
- int mode = config.readEntry("backgroundmode", int(kStaticBackground));
- m_mode->setCurrentIndex(mode);
- int delay = config.readEntry("slideTimer", 60);
- QTime time(0, 0, 0);
- time = time.addSecs(delay);
- m_slideshowDelay->setTime(time);
-
- // we go from index -> data -> config file entry (data) -> index. oi vey.
- int resizeMethod = m_resizeMethod->itemData(m_resizeMethod->currentIndex()).toInt();
- resizeMethod = config.readEntry("wallpaperposition", resizeMethod);
- resizeMethod = m_resizeMethod->findData(resizeMethod);
- m_resizeMethod->setCurrentIndex(resizeMethod);
-
- m_dirlist->clear();
- QStringList dirs = config.readEntry("slidepaths", QStringList());
- if (dirs.isEmpty()) {
- dirs << KStandardDirs::installPath("wallpaper");
- }
- foreach (const QString &dir, dirs) {
- m_dirlist->addItem(dir);
- }
- m_selected = config.readEntry("selected", QStringList());
- m_model->reload(m_selected);
- QString defaultPath = Plasma::Theme::defaultTheme()->wallpaperPath();
- QString currentPath = config.readEntry("wallpaper", defaultPath);
-
- kDebug() << "Default would be" << defaultPath << "but we're loading" << currentPath << "instead";
-
- int index = m_model->indexOf(currentPath);
- if (index != -1) {
- m_view->setCurrentIndex(index);
- }
-
- m_color->setColor(config.readEntry("wallpapercolor", m_color->color()));
- m_theme->setCurrentIndex(m_themeModel->indexOf(Plasma::Theme::defaultTheme()->themeName()));
-
- if (mode == kSlideshowBackground) {
- updateSlideshow();
- } else {
- update();
- }
-}
-
-void BackgroundDialog::saveConfig(KConfigGroup config, KConfigGroup globalConfig)
-{
- Q_UNUSED(globalConfig)
- int mode = m_mode->currentIndex();
- config.writeEntry("backgroundmode", mode);
- if (mode == kStaticBackground) {
- config.writeEntry("wallpaper", m_img);
- config.writeEntry("wallpapercolor", m_color->color());
- config.writeEntry("wallpaperposition",
- m_resizeMethod->itemData(m_resizeMethod->currentIndex()).toInt());
- config.writeEntry("selected", m_selected);
- } else if (mode == kNoBackground) {
- config.writeEntry("wallpaper", QString());
- config.writeEntry("wallpapercolor", m_color->color());
- } else {
- QStringList dirs;
- for (int i = 0; i < m_dirlist->count(); i++) {
- dirs << m_dirlist->item(i)->text();
- }
- config.writeEntry("slidepaths", dirs);
- int seconds = QTime(0, 0, 0).secsTo(m_slideshowDelay->time());
- config.writeEntry("slideTimer", seconds);
- }
-
- QString newTheme = m_theme->itemData(m_theme->currentIndex(), ThemeModel::PackageNameRole).toString();
- Plasma::Theme::defaultTheme()->setThemeName(newTheme);
-}
-
-void BackgroundDialog::getNewWallpaper()
-{
- KNS::Engine engine(0);
- if (engine.init("wallpaper.knsrc")) {
- KNS::Entry::List entries = engine.downloadDialogModal(this);
-
- if (entries.size() > 0) {
- m_model->reload();
- }
- }
-}
-
-void BackgroundDialog::getNewThemes()
-{
- KNS::Engine engine(0);
- if (engine.init("plasma-themes.knsrc")) {
- KNS::Entry::List entries = engine.downloadDialogModal(this);
-
- if (entries.size() > 0) {
- m_themeModel->reload();
- m_theme->setCurrentIndex(m_themeModel->indexOf(Plasma::Theme::defaultTheme()->themeName()));
- }
- }
-}
-
-void BackgroundDialog::showFileDialog()
-{
- m_dialog = new KFileDialog(KUrl(), "*.png *.jpeg *.jpg *.svg *.svgz", this);
- KImageFilePreview *previewWidget = new KImageFilePreview(m_dialog);
- m_dialog->setPreviewWidget(previewWidget);
- m_dialog->setOperationMode(KFileDialog::Opening);
- m_dialog->setCaption(i18n("Select Wallpaper Image File"));
- m_dialog->setModal(false);
- m_dialog->show();
- m_dialog->raise();
- m_dialog->activateWindow();
-
- connect(m_dialog, SIGNAL(okClicked()), this, SLOT(browse()));
-}
-
-void BackgroundDialog::browse()
-{
- QString wallpaper = m_dialog->selectedFile();
- disconnect(m_dialog, SIGNAL(okClicked()), this, SLOT(browse()));
-
- m_dialog->deleteLater();
-
- if (wallpaper.isEmpty()) {
- return;
- }
-
- // add background to the model
- m_model->addBackground(wallpaper);
-
- // select it
- int index = m_model->indexOf(wallpaper);
- if (index != -1) {
- m_view->setCurrentIndex(index);
- }
-
- // save it
- m_selected << wallpaper;
-}
-
-bool BackgroundDialog::setMetadata(QLabel *label,
- const QString &text)
-{
- if (text.isEmpty()) {
- label->hide();
- return false;
- }
- else {
- label->show();
- label->setText(text);
- return true;
- }
-}
-
-void BackgroundDialog::update()
-{
- if (m_mode->currentIndex() == kNoBackground) {
- m_img.clear();
- setPreview(m_img, Background::Scale);
- return;
- }
- int index = m_view->currentIndex();
- if (index == -1) {
- return;
- }
- Background *b = m_model->package(index);
- if (!b) {
- return;
- }
-
- // Prepare more user-friendly forms of some pieces of data.
- // - license by config is more a of a key value,
- // try to get the proper name if one of known licenses.
- QString license = b->license();
- KAboutLicense knownLicense = KAboutLicense::byKeyword(license);
- if (knownLicense.key() != KAboutData::License_Custom) {
- license = knownLicense.name(KAboutData::ShortName);
- }
- // - last ditch attempt to localize author's name, if not such by config
- // (translators can "hook" names from outside if resolute enough).
- QString author = i18nc("Wallpaper info, author name", "%1", b->author());
-
- // FIXME the second parameter is not used, get rid of it.
- bool someMetadata = setMetadata(m_authorLine, author);
- someMetadata = setMetadata(m_licenseLine, license) || someMetadata;
- someMetadata = setMetadata(m_emailLine, b->email()) || someMetadata;
- //m_authorLabel->setVisible(someMetadata);
- //m_emailLabel->setVisible(someMetadata);
- //m_licenseLabel->setVisible(someMetadata);
-// m_metadataSeparator->setVisible(someMetadata);
-
-
- Background::ResizeMethod method = (Background::ResizeMethod)
- m_resizeMethod->itemData(m_resizeMethod->currentIndex()).value<int>();
-
- m_img = b->findBackground(m_res, method);
- setPreview(m_img, method);
-}
-
-void BackgroundDialog::setPreview(const QString& img, Background::ResizeMethod method)
-{
- m_preview_token = m_preview_renderer.render(img, m_color->color(), method, Qt::FastTransformation);
-}
-
-void BackgroundDialog::slotAddDir()
-{
- KUrl empty;
- KDirSelectDialog dialog(empty, true, this);
- if (dialog.exec()) {
- m_dirlist->addItem(dialog.url().path());
- updateSlideshow();
- }
-}
-
-void BackgroundDialog::slotRemoveDir()
-{
- int row = m_dirlist->currentRow();
- if (row != -1) {
- m_dirlist->takeItem(row);
- updateSlideshow();
- }
-}
-
-void BackgroundDialog::updateSlideshow()
-{
- int row = m_dirlist->currentRow();
- m_removeDir->setEnabled(row != -1);
-
- // populate background list
- m_slideshowBackgrounds.clear();
- for (int i = 0; i < m_dirlist->count(); i++) {
- QString dir = m_dirlist->item(i)->text();
- m_slideshowBackgrounds += findAllBackgrounds(0, dir, m_ratio);
- }
-
- // start preview
- if (m_slideshowBackgrounds.isEmpty()) {
- m_preview->setPixmap(QPixmap());
- m_preview_timer.stop();
- }
- else {
- m_currentSlide = -1;
- if (!m_preview_timer.isActive()) {
- m_preview_timer.start(3000);
- }
- }
-}
-
-void BackgroundDialog::updateSlideshowPreview()
-{
- if (!m_slideshowBackgrounds.isEmpty()) {
- // increment current slide index
- m_currentSlide++;
- m_currentSlide = m_currentSlide % m_slideshowBackgrounds.count();
-
- Background *slide = m_slideshowBackgrounds[m_currentSlide];
- Q_ASSERT(slide);
-
- const Background::ResizeMethod method = Background::Scale;
- m_img = slide->findBackground(m_res, method);
- setPreview(m_img, method);
- }
- else {
- m_preview->setPixmap(QPixmap());
- }
-}
-
-void BackgroundDialog::changeBackgroundMode(int mode)
-{
- switch (mode)
- {
- case kStaticBackground:
- m_preview_timer.stop();
- stackedWidget->setCurrentIndex(0);
- enableButtons(true);
- update();
- break;
- case kNoBackground:
- m_preview_timer.stop();
- stackedWidget->setCurrentIndex(0);
- enableButtons(false);
- update();
- break;
- case kSlideshowBackground:
- stackedWidget->setCurrentIndex(1);
- updateSlideshow();
- enableButtons(true);
- break;
- }
-}
-
-void BackgroundDialog::enableButtons(bool enabled)
-{
- m_view->setEnabled(enabled);
- m_resizeMethod->setEnabled(enabled);
- m_pictureUrlButton->setEnabled(enabled);
-}
-
-bool BackgroundDialog::contains(const QString &path) const
-{
- foreach (Background *bg, m_slideshowBackgrounds)
- {
- if (bg->path() == path) {
- return true;
- }
- }
- return false;
-}
-
-void BackgroundDialog::previewRenderingDone(int token, const QImage &image)
-{
- // display preview only if it is the latest rendered file
- if (token == m_preview_token) {
- m_preview->setPixmap(QPixmap::fromImage(image));
- }
-}
-
-void BackgroundDialog::updateScreenshot(QPersistentModelIndex index)
-{
- m_view->view()->update(index);
-}
-
-void BackgroundDialog::cleanup()
-{
- m_preview_timer.stop();
-}
-
-void BackgroundDialog::removeBackground(const QString &path)
-{
- m_model->removeBackground(path);
-}
--- containments/desktop/backgroundpackage.h
+++ containments/desktop/backgroundpackage.h
@@ -1,137 +0,0 @@
-/*
- * Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License 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 BACKGROUNDPACKAGE_H
-#define BACKGROUNDPACKAGE_H
-
-#include <memory>
-#include <QImage>
-#include <QPersistentModelIndex>
-#include <QPixmap>
-#include <QSize>
-#include <QThread>
-#include <QVariant>
-#include <ThreadWeaver/Job>
-#include <plasma/package.h>
-
-namespace Plasma { class PackageMetadata; }
-
-class DummyObject : public QObject
-{
-Q_OBJECT
-signals:
- void done(ThreadWeaver::Job *);
-};
-
-class Background : public QObject
-{
-Q_OBJECT
-public:
- enum ResizeMethod {
- Scale,
- Center,
- ScaleCrop,
- Tiled,
- CenterTiled
- };
-
- static const int SCREENSHOT_HEIGHT = 60;
-
- virtual ~Background();
-
- virtual QString path() const = 0;
- virtual QString findBackground(const QSize &resolution,
- ResizeMethod method) const = 0;
- virtual QPixmap screenshot() const = 0;
- virtual bool screenshotGenerationStarted() const = 0;
- virtual void generateScreenshot(QPersistentModelIndex index) const = 0;
- virtual QString title() const = 0;
- virtual QString author() const = 0;
- virtual QString email() const = 0;
- virtual QString license() const = 0;
-
- virtual bool isValid() const = 0;
-
-protected:
- static QImage defaultScreenshot();
- static QImage createScreenshot(const QString &path, float ratio);
- friend class ResizeThread;
-};
-
-class BackgroundPackage : public Background,
- public Plasma::Package
-{
-Q_OBJECT
-public:
- BackgroundPackage(const QString &path, float ratio);
-
- virtual QString path() const;
- virtual QString findBackground(const QSize &resolution,
- ResizeMethod method) const;
- virtual QPixmap screenshot() const;
- virtual bool screenshotGenerationStarted() const;
- virtual void generateScreenshot(QPersistentModelIndex index) const;
- virtual QString author() const;
- virtual QString title() const;
- virtual QString email() const;
- virtual QString license() const;
- virtual bool isValid() const;
-private:
- QString resString(const QSize &size) const;
- QSize resSize(const QString &res) const;
-
- float distance(const QSize &size,
- const QSize &desired,
- ResizeMethod method) const;
-
- QString m_path;
- float m_ratio;
- mutable QPixmap m_screenshot;
-};
-
-class BackgroundFile : public Background
-{
-Q_OBJECT
-public:
- BackgroundFile(const QString &file, float ratio);
- virtual ~BackgroundFile();
-
- virtual QString path() const;
- virtual QString findBackground(const QSize &resolution,
- ResizeMethod method) const;
- virtual bool screenshotGenerationStarted() const;
- virtual void generateScreenshot(QPersistentModelIndex index) const;
- virtual QPixmap screenshot() const;
- virtual QString author() const;
- virtual QString title() const;
- virtual QString email() const;
- virtual QString license() const;
- virtual bool isValid() const;
-private:
- QString m_file;
- float m_ratio;
-
- mutable bool m_resizer_started;
- mutable QPixmap m_screenshot;
-private slots:
- void updateScreenshot(ThreadWeaver::Job *);
-signals:
- void screenshotDone(QPersistentModelIndex index);
-};
-
-#endif // BACKGROUNDPACKAGE_H
--- containments/desktop/backgrounddialog.h
+++ containments/desktop/backgrounddialog.h
@@ -1,122 +0,0 @@
-/*
- Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
-
- 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.
-*/
-
-#ifndef BACKGROUNDDIALOG_H
-#define BACKGROUNDDIALOG_H
-
-#include <QSize>
-#include <QTimer>
-#include <KDialog>
-
-#include "backgroundpackage.h"
-#include "renderthread.h"
-
-#include "ui_BackgroundDialog.h"
-
-class BackgroundContainer;
-class ThemeModel;
-class BackgroundListModel;
-class QComboBox;
-class QLabel;
-class QListWidget;
-class QPushButton;
-class QTimeEdit;
-class QCheckBox;
-class KColorButton;
-class KFileDialog;
-class KSeparator;
-
-class BackgroundDialog : public KDialog, public Ui::BackgroundDialog
-{
-Q_OBJECT
-public:
- enum BackgroundMode {
- kStaticBackground,
- kSlideshowBackground,
- kNoBackground
- };
-
- // FIXME seems that we're leaking, make a destructor
- BackgroundDialog(const QSize &res,
- const KConfigGroup &config,
- const KConfigGroup &globalConfig,
- QWidget *parent = 0);
-
- void reloadConfig(const KConfigGroup &config, const KConfigGroup &globalConfig);
- void saveConfig(KConfigGroup config, KConfigGroup globalConfig);
-
- QString path() const;
- int mode();
-private:
- //QComboBox *m_mode;
- //QComboBox *m_view;
- BackgroundListModel *m_model;
- ThemeModel *m_themeModel;
-
- //QLabel *m_authorLabel;
- //QLabel *m_emailLabel;
- //QLabel *m_licenseLabel;
- //QLabel *m_authorLine;
- //QLabel *m_emailLine;
- //QLabel *m_licenseLine;
- QLabel *m_preview;
-
- //QPushButton *m_newStuff;
-
- //QComboBox *m_resizeMethod;
- //KColorButton *m_color;
-
- //QListWidget *m_dirlist;
- //QPushButton *m_addDir;
- //QPushButton *m_removeDir;
- //QTimeEdit *m_slideshowDelay;
- KFileDialog *m_dialog;
-
- QString m_img;
- QSize m_res;
- float m_ratio;
-
- QTimer m_preview_timer;
- QList<Background *> m_slideshowBackgrounds;
- int m_currentSlide;
-
- QStringList m_selected;
-
- RenderThread m_preview_renderer;
- int m_preview_token;
-
- //QCheckBox *m_alignToGrid;
- //QCheckBox *m_showIcons;
-
- bool setMetadata(QLabel *label,
- const QString &text);
- void setPreview(const QString &img, Background::ResizeMethod method);
- virtual bool contains(const QString &path) const;
-private slots:
- void update();
- void getNewWallpaper();
- void getNewThemes();
- void browse();
- void showFileDialog();
- void enableButtons(bool enabled);
-
- void slotAddDir();
- void slotRemoveDir();
- void updateSlideshow();
- void updateSlideshowPreview();
-
- void changeBackgroundMode(int mode);
- void previewRenderingDone(int token, const QImage &pix);
-
- void updateScreenshot(QPersistentModelIndex index);
- void cleanup();
- void removeBackground(const QString &path);
-};
-
-#endif // BACKGROUNDDIALOG_H
--- containments/desktop/wallpaper.knsrc
+++ containments/desktop/wallpaper.knsrc
@@ -1,4 +0,0 @@
-[KNewStuff2]
-ProvidersUrl=http://download.kde.org/khotnewstuff/wallpaper-providers.xml
-StandardResource=wallpaper
-CachePolicy=resident
--- containments/desktop/renderthread.cpp
+++ containments/desktop/renderthread.cpp
@@ -1,236 +0,0 @@
-/*
- Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
-
- 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.
-*/
-
-#include "renderthread.h"
-
-#include <QPainter>
-#include <QFile>
-#include <KDebug>
-#include <KSvgRenderer>
-
-RenderThread::RenderThread(const QSize &size, float ratio)
-: m_current_token(-1)
-, m_size(size)
-, m_ratio(ratio)
-{
- m_abort = false;
- m_restart = false;
-}
-
-RenderThread::~RenderThread()
-{
- {
- // abort computation
- QMutexLocker lock(&m_mutex);
- m_abort = true;
- m_condition.wakeOne();
- }
-
- wait();
-}
-
-void RenderThread::setSize(const QSize& size)
-{
- QMutexLocker lock(&m_mutex);
- m_size = size;
-}
-
-int RenderThread::render(const QString &file,
- const QColor &color,
- Background::ResizeMethod method,
- Qt::TransformationMode mode)
-{
- int token;
- {
- QMutexLocker lock(&m_mutex);
- m_file = file;
- m_color = color;
- m_method = method;
- m_mode = mode;
- m_restart = true;
- token = ++m_current_token;
- }
-
- if (!isRunning()) {
- start();
- }
- else {
- m_condition.wakeOne();
- }
-
- return token;
-}
-
-void RenderThread::run()
-{
- QString file;
- QColor color;
- QSize size;
- float ratio;
- Background::ResizeMethod method;
- Qt::TransformationMode mode;
- int token;
-
- forever {
- {
- QMutexLocker lock(&m_mutex);
- while (!m_restart && !m_abort) {
- m_condition.wait(&m_mutex);
- }
- if (m_abort) {
- return;
- }
- m_restart = false;
-
- // load all parameters in nonshared variables
- token = m_current_token;
- file = m_file;
- color = m_color;
- size = m_size;
- ratio = m_ratio;
- method = m_method;
- mode = m_mode;
- }
-
- QImage result(size, QImage::Format_ARGB32_Premultiplied);
- result.fill(color.rgba());
-
- if (file.isEmpty() || !QFile::exists(file)) {
- emit done(token, result);
- continue;
- }
-
- QPoint pos(0, 0);
- bool tiled = false;
- bool scalable = file.endsWith("svg") || file.endsWith("svgz");
- QSize scaledSize;
- QImage img;
-
- // load nonscalable image
- if (!scalable) {
- img = QImage(file);
- }
-
- // set image size
- QSize imgSize;
- if (scalable) {
- // scalable: image can be of any size
- imgSize = size;
- }
- else {
- // otherwise, use the natural size of the loaded image
- imgSize = img.size();
- }
- imgSize *= ratio;
-
- // if any of them is zero we may run into a div-by-zero below.
- if (imgSize.width() == 0) {
- imgSize.setWidth(1);
- }
- if (imgSize.height() == 0) {
- imgSize.setHeight(1);
- }
-
- // set render parameters according to resize mode
- switch (method)
- {
- case Background::Scale:
- scaledSize = size;
- break;
- case Background::Center:
- scaledSize = imgSize;
- pos = QPoint((size.width() - scaledSize.width()) / 2,
- (size.height() - scaledSize.height()) / 2);
-
- //If the picture is bigger than the screen, shrink it
- if( size.width() < imgSize.width() && imgSize.width() > imgSize.height() )
- {
- int width = size.width();
- int height = width * scaledSize.height() / imgSize.width();
- scaledSize = QSize(width, height);
- pos = QPoint((size.width() - scaledSize.width()) / 2,
- (size.height() - scaledSize.height()) / 2);
- }
- else if( size.height() < imgSize.height() )
- {
- int height = size.height();
- int width = height * imgSize.width() / imgSize.height();
- scaledSize = QSize(width, height);
- pos = QPoint((size.width() - scaledSize.width()) / 2,
- (size.height() - scaledSize.height()) / 2);
- }
-
- break;
- case Background::ScaleCrop: {
- float xratio = (float) size.width() / imgSize.width();
- float yratio = (float) size.height() / imgSize.height();
- if (xratio > yratio) {
- int width = size.width();
- int height = width * imgSize.height() / imgSize.width();
- scaledSize = QSize(width, height);
- }
- else {
- int height = size.height();
- int width = height * imgSize.width() / imgSize.height();
- scaledSize = QSize(width, height);
- }
- pos = QPoint((size.width() - scaledSize.width()) / 2,
- (size.height() - scaledSize.height()) / 2);
- break;
- }
- case Background::Tiled:
- scaledSize = imgSize;
- tiled = true;
- break;
- case Background::CenterTiled:
- scaledSize = imgSize;
- pos = QPoint(
- -scaledSize.width() +
- ((size.width() - scaledSize.width()) / 2) % scaledSize.width(),
- -scaledSize.height() +
- ((size.height() - scaledSize.height()) / 2) % scaledSize.height());
- tiled = true;
- break;
- }
-
- QPainter p(&result);
- if (scalable) {
- // tiling is ignored for scalable wallpapers
- KSvgRenderer svg(file);
- if (m_restart) {
- continue;
- }
- svg.render(&p);
- }
- else {
- QImage scaled = img.scaled(scaledSize, Qt::IgnoreAspectRatio, mode);
- if (m_restart) {
- continue;
- }
- if (tiled) {
- for (int x = pos.x(); x < size.width(); x += scaledSize.width()) {
- for (int y = pos.y(); y < size.height(); y += scaledSize.height()) {
- p.drawImage(QPoint(x, y), scaled);
- if (m_restart) {
- goto endLoop;
- }
- }
- }
- }
- else {
- p.drawImage(pos, scaled);
- }
- }
-
- // signal we're done
- emit done(token, result);
-
- endLoop: continue;
- }
-}
--- containments/desktop/BackgroundDialog.ui
+++ containments/desktop/BackgroundDialog.ui
@@ -1,609 +0,0 @@
-<ui version="4.0" >
- <class>BackgroundDialog</class>
- <widget class="QWidget" name="BackgroundDialog" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>644</width>
- <height>419</height>
- </rect>
- </property>
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="baseSize" >
- <size>
- <width>200</width>
- <height>700</height>
- </size>
- </property>
- <layout class="QGridLayout" name="gridLayout_2" >
- <item row="0" column="0" >
- <widget class="QGroupBox" name="groupBox" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Maximum" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>10</verstretch>
- </sizepolicy>
- </property>
- <property name="title" >
- <string>Wallpaper</string>
- </property>
- <property name="flat" >
- <bool>true</bool>
- </property>
- <layout class="QGridLayout" name="gridLayout" >
- <item row="0" column="0" >
- <layout class="QVBoxLayout" >
- <item>
- <widget class="QComboBox" name="m_mode" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <item>
- <property name="text" >
- <string>Image</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>Slideshow</string>
- </property>
- </item>
- <item>
- <property name="text" >
- <string>None</string>
- </property>
- </item>
- </widget>
- </item>
- <item>
- <widget class="QStackedWidget" name="stackedWidget" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
- <horstretch>1</horstretch>
- <verstretch>2</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>350</width>
- <height>51</height>
- </size>
- </property>
- <property name="currentIndex" >
- <number>0</number>
- </property>
- <widget class="QWidget" name="page" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>439</width>
- <height>237</height>
- </rect>
- </property>
- <layout class="QGridLayout" >
- <property name="leftMargin" >
- <number>0</number>
- </property>
- <property name="topMargin" >
- <number>6</number>
- </property>
- <property name="rightMargin" >
- <number>0</number>
- </property>
- <property name="bottomMargin" >
- <number>0</number>
- </property>
- <item row="0" column="0" >
- <widget class="QLabel" name="label" >
- <property name="minimumSize" >
- <size>
- <width>75</width>
- <height>0</height>
- </size>
- </property>
- <property name="text" >
- <string>&Picture:</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>m_view</cstring>
- </property>
- </widget>
- </item>
- <item row="0" column="1" colspan="3" >
- <layout class="QHBoxLayout" >
- <item>
- <widget class="QComboBox" name="m_view" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>1</horstretch>
- <verstretch>1</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QToolButton" name="m_pictureUrlButton" >
- <property name="toolTip" >
- <string>Browse</string>
- </property>
- <property name="text" >
- <string>...</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item row="1" column="1" >
- <widget class="QLabel" name="m_authorLabel" >
- <property name="text" >
- <string>Author:</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="1" column="2" colspan="2" >
- <widget class="QLabel" name="m_authorLine" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text" >
- <string/>
- </property>
- </widget>
- </item>
- <item row="2" column="1" >
- <widget class="QLabel" name="m_emailLabel" >
- <property name="text" >
- <string>Email:</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- </widget>
- </item>
- <item row="2" column="2" colspan="2" >
- <widget class="QLabel" name="m_emailLine" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text" >
- <string/>
- </property>
- </widget>
- </item>
- <item row="3" column="1" >
- <widget class="QLabel" name="m_licenseLabel" >
- <property name="text" >
- <string>License:</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set>
- </property>
- </widget>
- </item>
- <item row="3" column="2" colspan="2" >
- <widget class="QLabel" name="m_licenseLine" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text" >
- <string/>
- </property>
- <property name="alignment" >
- <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
- </property>
- </widget>
- </item>
- <item row="4" column="0" >
- <widget class="QLabel" name="label_4" >
- <property name="minimumSize" >
- <size>
- <width>75</width>
- <height>0</height>
- </size>
- </property>
- <property name="text" >
- <string>P&ositioning:</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>m_resizeMethod</cstring>
- </property>
- </widget>
- </item>
- <item row="4" column="1" colspan="3" >
- <widget class="QComboBox" name="m_resizeMethod" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item row="5" column="0" >
- <widget class="QLabel" name="label_5" >
- <property name="text" >
- <string>&Color:</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
- </property>
- <property name="buddy" >
- <cstring>m_color</cstring>
- </property>
- </widget>
- </item>
- <item row="5" column="1" colspan="2" >
- <widget class="KColorButton" name="m_color" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="minimumSize" >
- <size>
- <width>0</width>
- <height>30</height>
- </size>
- </property>
- <property name="color" >
- <color>
- <red>70</red>
- <green>90</green>
- <blue>130</blue>
- </color>
- </property>
- <property name="defaultColor" >
- <color>
- <red>70</red>
- <green>90</green>
- <blue>130</blue>
- </color>
- </property>
- </widget>
- </item>
- <item row="5" column="3" >
- <spacer>
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="6" column="0" colspan="2" >
- <spacer name="verticalSpacer_2" >
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>1</width>
- <height>1</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="page_3" >
- <property name="geometry" >
- <rect>
- <x>0</x>
- <y>0</y>
- <width>466</width>
- <height>167</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" >
- <property name="leftMargin" >
- <number>0</number>
- </property>
- <property name="topMargin" >
- <number>6</number>
- </property>
- <property name="rightMargin" >
- <number>0</number>
- </property>
- <property name="bottomMargin" >
- <number>0</number>
- </property>
- <item>
- <layout class="QHBoxLayout" >
- <item>
- <widget class="KListWidget" name="m_dirlist" />
- </item>
- <item>
- <layout class="QVBoxLayout" >
- <item>
- <widget class="KPushButton" name="m_addDir" >
- <property name="text" >
- <string>&Add Folder...</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="KPushButton" name="m_removeDir" >
- <property name="enabled" >
- <bool>false</bool>
- </property>
- <property name="text" >
- <string>&Remove Folder</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QWidget" native="1" name="widget" />
- </item>
- <item>
- <spacer>
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- <item>
- <layout class="QHBoxLayout" >
- <item>
- <widget class="QLabel" name="label_2" >
- <property name="text" >
- <string>&Change images every:</string>
- </property>
- <property name="buddy" >
- <cstring>m_slideshowDelay</cstring>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QTimeEdit" name="m_slideshowDelay" >
- <property name="dateTime" >
- <datetime>
- <hour>0</hour>
- <minute>0</minute>
- <second>0</second>
- <year>2000</year>
- <month>1</month>
- <day>1</day>
- </datetime>
- </property>
- <property name="currentSection" >
- <enum>QDateTimeEdit::HourSection</enum>
- </property>
- <property name="displayFormat" >
- <string comment="(qtdt-format) Please do not change the quotes (') and translate only the content of the quotes." >hh 'Hours' mm 'Mins' ss 'Secs'</string>
- </property>
- <property name="time" >
- <time>
- <hour>0</hour>
- <minute>0</minute>
- <second>0</second>
- </time>
- </property>
- </widget>
- </item>
- <item>
- <spacer>
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </widget>
- </item>
- </layout>
- </item>
- <item row="0" column="1" >
- <layout class="QVBoxLayout" name="verticalLayout" >
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout" >
- <item>
- <spacer name="horizontalSpacer" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="m_monitor" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text" >
- <string>Monitor</string>
- </property>
- <property name="alignment" >
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_2" >
- <property name="orientation" >
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- <item>
- <widget class="QPushButton" name="m_newStuff" >
- <property name="toolTip" >
- <string>Download new wallpapers</string>
- </property>
- <property name="text" >
- <string>New Wallpaper...</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer>
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType" >
- <enum>QSizePolicy::Expanding</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>159</width>
- <height>113</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- <item row="1" column="0" >
- <spacer>
- <property name="orientation" >
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType" >
- <enum>QSizePolicy::Expanding</enum>
- </property>
- <property name="sizeHint" stdset="0" >
- <size>
- <width>636</width>
- <height>0</height>
- </size>
- </property>
- </spacer>
- </item>
- <item row="2" column="0" >
- <widget class="QGroupBox" name="groupBox_3" >
- <property name="title" >
- <string>Desktop Theme</string>
- </property>
- <property name="flat" >
- <bool>true</bool>
- </property>
- <property name="checkable" >
- <bool>false</bool>
- </property>
- <layout class="QGridLayout" >
- <item row="0" column="0" >
- <layout class="QHBoxLayout" >
- <item>
- <widget class="QLabel" name="label_3" >
- <property name="text" >
- <string>Theme:</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QComboBox" name="m_theme" >
- <property name="sizePolicy" >
- <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QPushButton" name="m_newThemeButton" >
- <property name="enabled" >
- <bool>true</bool>
- </property>
- <property name="text" >
- <string>New Theme...</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>KColorButton</class>
- <extends>QPushButton</extends>
- <header>kcolorbutton.h</header>
- </customwidget>
- <customwidget>
- <class>KListWidget</class>
- <extends>QListWidget</extends>
- <header>klistwidget.h</header>
- </customwidget>
- <customwidget>
- <class>KPushButton</class>
- <extends>QPushButton</extends>
- <header>kpushbutton.h</header>
- </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
--- containments/desktop/backgroundpackage.cpp
+++ containments/desktop/backgroundpackage.cpp
@@ -1,393 +0,0 @@
-/*
- * Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License 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 "backgroundpackage.h"
-#include <cmath>
-// <cmath> does not define fabs (by the standard, even if it does with gcc)
-#include <math.h>
-#include <float.h> // FLT_MAX
-
-#include <QFileInfo>
-#include <QPainter>
-#include <KDebug>
-#include <KLocalizedString>
-#include <KStandardDirs>
-#include <KSvgRenderer>
-#include <plasma/packagestructure.h>
-#include <plasma/packagemetadata.h>
-#include <ThreadWeaver/Weaver>
-
-using namespace Plasma;
-
-class ResizeThread : public ThreadWeaver::Job
-{
-public:
- ResizeThread(const QString &path, float ratio, QObject *parent = 0);
- virtual ~ResizeThread();
-
- virtual void start(QPersistentModelIndex index);
- virtual void run();
-
- QImage result() const;
- QPersistentModelIndex index() const;
- bool isInitialized() const;
-private:
- QString m_path;
- QImage m_result;
- float m_ratio;
- QPersistentModelIndex m_index;
-};
-
-ResizeThread::ResizeThread(const QString &path, float ratio, QObject *parent)
-: ThreadWeaver::Job(parent)
-, m_path(path)
-, m_ratio(ratio)
-{
-}
-
-ResizeThread::~ResizeThread() {
-}
-
-void ResizeThread::start(QPersistentModelIndex index)
-{
- m_index = index;
- ThreadWeaver::Weaver::instance()->enqueue(this);
-}
-
-bool ResizeThread::isInitialized() const
-{
- return m_index.isValid();
-}
-
-void ResizeThread::run()
-{
- m_result = Background::createScreenshot(m_path, m_ratio);
-}
-
-QImage ResizeThread::result() const
-{
- if (isFinished()) {
- return m_result;
- }
- else {
- return QImage();
- }
-}
-
-QPersistentModelIndex ResizeThread::index() const
-{
- return m_index;
-}
-
-Background::~Background()
-{
-}
-
-QImage Background::createScreenshot(const QString &path, float ratio)
-{
- if (path.endsWith("svg") || path.endsWith("svgz")) {
- KSvgRenderer renderer(path);
- QImage img(QSize(int(SCREENSHOT_HEIGHT * ratio), SCREENSHOT_HEIGHT),
- QImage::Format_ARGB32_Premultiplied);
- img.fill(0);
- QPainter p(&img);
- renderer.render(&p);
- return img;
- }
- else {
- QImage img(path);
- if (!img.isNull()) {
- return img.scaled(int(SCREENSHOT_HEIGHT * ratio),
- SCREENSHOT_HEIGHT,
- Qt::KeepAspectRatio);
- }
- else {
- return defaultScreenshot();
- }
- }
-
-}
-
-QImage Background::defaultScreenshot()
-{
- static QImage defaultScreenshotImage;
-
- if (defaultScreenshotImage.isNull()) {
- QImage img(QSize(SCREENSHOT_HEIGHT, SCREENSHOT_HEIGHT), QImage::Format_ARGB32_Premultiplied);
- img.fill(Qt::white);
- QPainter p(&img);
- p.drawText(QRect(0, 0, SCREENSHOT_HEIGHT, SCREENSHOT_HEIGHT),
- Qt::AlignHCenter | Qt::AlignVCenter,
- "Preview\nnot\navailable");
- defaultScreenshotImage = img;
- }
- return defaultScreenshotImage;
-}
-
-
-class BackgroundPackageStructure : public PackageStructure
-{
-public:
- static const PackageStructure::Ptr self();
-private:
- BackgroundPackageStructure(); // should be used as a singleton
- void addResolution(const char *res);
-};
-
-BackgroundPackageStructure::BackgroundPackageStructure()
-: PackageStructure(0, "Background")
-{
- QStringList mimetypes;
- mimetypes << "image/svg" << "image/png" << "image/jpeg" << "image/jpg";
- setDefaultMimetypes(mimetypes);
-
- addDirectoryDefinition("images", "images", i18n("Images"));
- addFileDefinition("screenshot", "screenshot.png", i18n("Screenshot"));
-}
-
-
-const PackageStructure::Ptr BackgroundPackageStructure::self()
-{
- static BackgroundPackageStructure::Ptr instance(0);
-
- if (!instance) {
- instance = new BackgroundPackageStructure;
- }
-
- return instance;
-}
-
-
-
-BackgroundPackage::BackgroundPackage(const QString &path, float ratio)
-: Package(path, BackgroundPackageStructure::self())
-, m_path(path)
-, m_ratio(ratio)
-{
-}
-
-QString BackgroundPackage::resString(const QSize &size) const
-{
- return QString::number(size.width()) + 'x' + QString::number(size.height());
-}
-
-QSize BackgroundPackage::resSize(const QString &str) const
-{
- int index = str.indexOf('x');
- if (index != -1) {
- return QSize(str.left(index).toInt(),
- str.mid(index + 1).toInt());
- }
- else {
- return QSize();
- }
-}
-
-QString BackgroundPackage::findBackground(const QSize &size,
- ResizeMethod method) const
-{
- QStringList images = entryList("images");
- if (images.empty()) {
- return QString();
- }
-
- // choose the nearest resolution
- float best = FLT_MAX;
- QString bestImage;
- foreach (const QString &entry, images) {
- QSize candidate = resSize(QFileInfo(entry).baseName());
- if (candidate == QSize()) {
- continue;
- }
-
- double dist = distance(candidate, size, method);
- kDebug() << "candidate" << candidate << "distance" << dist;
- if (bestImage.isNull() || dist < best) {
- bestImage = filePath("images", entry);
- best = dist;
- kDebug() << "best" << bestImage;
- if (dist == 0) {
- break;
- }
- }
- }
-
- kDebug() << "best image" << bestImage;
- return bestImage;
-}
-
-float BackgroundPackage::distance(const QSize& size,
- const QSize& desired,
- ResizeMethod method) const
-{
- // compute difference of areas
- float delta = size.width() * size.height() -
- desired.width() * desired.height();
- // scale down to about 1.0
- delta /= 1000000.0;
-
- switch (method) {
- case Scale: {
- // Consider first the difference in aspect ratio,
- // then in areas. Prefer scaling down.
- float deltaRatio = size.width() / size.height() -
- desired.width() / desired.height();
- return fabs(deltaRatio) * 3.0 +
- (delta >= 0.0 ? delta : -delta + 5.0);
- }
- case ScaleCrop:
- // Difference of areas, slight preference to scale down
- return delta >= 0.0 ? delta : -delta + 2.0;
- case Center:
- default:
- // Difference in areas
- return fabs(delta);
- }
-}
-
-QPixmap BackgroundPackage::screenshot() const
-{
- if (m_screenshot.isNull()) {
- QString screenshotPath = filePath("screenshot");
- if (!screenshotPath.isEmpty()) {
- QImage img = createScreenshot(screenshotPath, m_ratio);
- m_screenshot = QPixmap::fromImage(img);
- }
- }
-
- return m_screenshot;
-}
-
-bool BackgroundPackage::screenshotGenerationStarted() const
-{
- return true;
-}
-
-void BackgroundPackage::generateScreenshot(QPersistentModelIndex) const
-{
-}
-
-QString BackgroundPackage::title() const
-{
- QString title = metadata()->name();
- if (title.isEmpty()) {
- title = metadata()->pluginName();
- title.replace("_", " ");
- }
- return title;
-}
-
-QString BackgroundPackage::author() const
-{
- return metadata()->author();
-}
-
-QString BackgroundPackage::email() const
-{
- return metadata()->email();
-}
-
-QString BackgroundPackage::license() const
-{
- return metadata()->license();
-}
-
-bool BackgroundPackage::isValid() const
-{
- return Package::isValid();
-}
-
-QString BackgroundPackage::path() const
-{
- return m_path;
-}
-
-
-BackgroundFile::BackgroundFile(const QString &file, float ratio)
-: m_file(file)
-, m_ratio(ratio)
-, m_resizer_started(false)
-{
-}
-
-BackgroundFile::~BackgroundFile()
-{
-}
-
-QString BackgroundFile::findBackground(const QSize &,
- ResizeMethod) const
-{
- return m_file;
-}
-
-QPixmap BackgroundFile::screenshot() const
-{
- return m_screenshot;
-}
-
-bool BackgroundFile::screenshotGenerationStarted() const
-{
- return m_resizer_started;
-}
-
-void BackgroundFile::generateScreenshot(QPersistentModelIndex index) const
-{
- ResizeThread *resizer = new ResizeThread(m_file, m_ratio);
- connect(resizer, SIGNAL(done(ThreadWeaver::Job *)),
- this, SLOT(updateScreenshot(ThreadWeaver::Job *)));
- m_resizer_started = true;
- resizer->start(index);
-}
-
-void BackgroundFile::updateScreenshot(ThreadWeaver::Job *job)
-{
- ResizeThread *resizer = static_cast<ResizeThread *>(job);
- m_screenshot = QPixmap::fromImage(resizer->result());
- emit screenshotDone(resizer->index());
- resizer->deleteLater();
-}
-
-QString BackgroundFile::author() const
-{
- return QString();
-}
-
-QString BackgroundFile::title() const
-{
- return QFileInfo(m_file).baseName();
-}
-
-QString BackgroundFile::email() const
-{
- return QString();
-}
-
-QString BackgroundFile::license() const
-{
- return QString();
-}
-
-bool BackgroundFile::isValid() const
-{
- return true;
-}
-
-QString BackgroundFile::path() const
-{
- return m_file;
-}
--- containments/desktop/renderthread.h
+++ containments/desktop/renderthread.h
@@ -1,54 +0,0 @@
-/*
- Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
-
- 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.
-*/
-
-#ifndef RENDERTHREAD_H
-#define RENDERTHREAD_H
-
-#include "backgroundpackage.h"
-#include <QColor>
-#include <QImage>
-#include <QMutex>
-#include <QThread>
-#include <QWaitCondition>
-
-class RenderThread : public QThread
-{
-Q_OBJECT
-public:
- RenderThread(const QSize &size, float ratio);
- virtual ~RenderThread();
-
- int render(const QString &file,
- const QColor &color,
- Background::ResizeMethod method,
- Qt::TransformationMode mode);
-
- void setSize(const QSize &size);
-protected:
- virtual void run();
-private:
- QMutex m_mutex; // to protect parameters
- QWaitCondition m_condition;
-
- // protected by mutex
- int m_current_token;
- QString m_file;
- QColor m_color;
- QSize m_size;
- float m_ratio;
- Background::ResizeMethod m_method;
- Qt::TransformationMode m_mode;
-
- bool m_abort;
- bool m_restart;
-signals:
- void done(int token, const QImage &pixmap);
-};
-
-#endif // RENDERTHREAD_H
--- containments/desktop/desktop.h
+++ containments/desktop/desktop.h
@@ -33,9 +33,6 @@
#include <plasma/containment.h>
#include <plasma/animator.h>
-#include "renderthread.h"
-
-class BackgroundDialog;
class QAction;
class QTimeLine;
@@ -45,11 +42,6 @@
class Svg;
}
-namespace Ui
-{
- class config;
-}
-
/*class Tool : public QObject, public QGraphicsItem
{
Q_OBJECT
@@ -73,32 +65,17 @@
QList<QAction*> contextualActions();
- /**
- * Paints a default background image. Nothing fancy, but that's what plugins
- * are for. Reimplemented from Plasma::Containment;
- */
- void paintInterface(QPainter *painter,
- const QStyleOptionGraphicsItem *option,
- const QRect& contentsRect);
-
protected Q_SLOTS:
void runCommand();
void configure();
- void applyConfig();
- void nextSlide(bool skipUpdates=false);
void lockScreen();
void logout();
- void updateBackground();
- void updateBackground(int, const QImage &img);
-
void addPanel();
private:
- void reloadConfig();
QSize resolution() const;
- void suspendStartup(bool suspend); // for ksmserver
QAction *m_lockDesktopAction;
QAction *m_appletBrowserAction;
@@ -109,25 +86,6 @@
QAction *m_logoutAction;
QAction *m_separator;
QAction *m_separator2;
-
- BackgroundDialog *m_configDialog;
-
- int m_backgroundMode;
-
- // slideshow settings
- // the index of which m_slidePath is currently visible
- int m_currentSlide;
- QTimer m_slideshowTimer;
- QStringList m_slideFiles;
-
- QPixmap m_bitmapBackground;
- QString m_wallpaperPath;
-
- int m_wallpaperPosition;
- QColor m_wallpaperColor;
-
- RenderThread m_renderer;
- int m_rendererToken;
};
#endif // PLASMA_PANEL_H
--- containments/desktop/plasma-containment-desktop.desktop
+++ containments/desktop/plasma-containment-desktop.desktop
@@ -56,8 +56,8 @@
Name[se]=Čállinbeavdi
Name[sk]=Plocha
Name[sl]=Namizje
-Name[sr]=.Десктоп
-Name[sr@latin]=.Desktop
+Name[sr]=Површ
+Name[sr@latin]=Površ
Name[sv]=Skrivbord
Name[ta]=பணிமேசை
Name[te]=రంగస్ఠలం
@@ -72,7 +72,8 @@
Name[x-test]=xxDesktopxx
Name[zh_CN]=桌面
Name[zh_TW]=桌面
-Icon=Plasma
+Comment=Default desktop containment
+Icon=user-desktop
Type=Service
X-KDE-ServiceTypes=Plasma/Applet,Plasma/Containment
NoDisplay=true
--- containments/desktop/desktop.cpp
+++ containments/desktop/desktop.cpp
@@ -48,10 +48,7 @@
#include "krunner_interface.h"
#include "screensaver_interface.h"
-#include "ksmserver_interface.h"
-#include "backgrounddialog.h"
-
using namespace Plasma;
DefaultDesktop::DefaultDesktop(QObject *parent, const QVariantList &args)
@@ -61,50 +58,17 @@
m_addPanelAction(0),
m_runCommandAction(0),
m_lockScreenAction(0),
- m_logoutAction(0),
- m_configDialog(0),
- m_wallpaperPath(0),
- m_wallpaperPosition(0),
- m_renderer(resolution(), 1.0),
- m_rendererToken(-1)
+ m_logoutAction(0)
{
qRegisterMetaType<QImage>("QImage");
qRegisterMetaType<QPersistentModelIndex>("QPersistentModelIndex");
- connect(&m_renderer, SIGNAL(done(int, QImage)),
- this, SLOT(updateBackground(int, QImage)));
- connect(&m_slideshowTimer, SIGNAL(timeout()),
- this, SLOT(nextSlide()));
//kDebug() << "!!! loading desktop";
}
DefaultDesktop::~DefaultDesktop()
{
- delete m_configDialog;
}
-void DefaultDesktop::nextSlide(bool skipUpdates)
-{
- if (++m_currentSlide >= m_slideFiles.size()) {
- m_currentSlide = 0;
- }
-
- if (m_slideFiles.size() > 0) {
- // do not change to the same background if we have a choice
- // if there is only one background, it may be changed by someone else
- if (m_slideFiles.size() > 1 && m_wallpaperPath == m_slideFiles[m_currentSlide]) {
- // try next one, they can't be the same (at least the same path)
- if (++m_currentSlide >= m_slideFiles.size()) {
- m_currentSlide = 0;
- }
- }
-
- m_wallpaperPath = m_slideFiles[m_currentSlide];
- if (!skipUpdates) {
- updateBackground();
- }
- }
-}
-
QSize DefaultDesktop::resolution() const
{
return QApplication::desktop()->screenGeometry(screen()).size();
@@ -112,21 +76,6 @@
void DefaultDesktop::constraintsEvent(Plasma::Constraints constraints)
{
- if (constraints & Plasma::StartupCompletedConstraint) {
- qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()) + id());
- reloadConfig();
- }
-
- if (constraints & Plasma::SizeConstraint) {
- m_renderer.setSize(size().toSize());
-
- if (m_rendererToken != -1) {
- // if the renderer token is still -1, then we haven't actually started up yet
- // and there is no point in touching the renderer at this point
- updateBackground();
- }
- }
-
if (constraints & Plasma::ImmutableConstraint && m_appletBrowserAction) {
// we need to update the menu items that have already been created
bool locked = immutability() != Mutable;
@@ -136,137 +85,9 @@
void DefaultDesktop::configure()
{
- KConfigGroup cg = config();
- KConfigGroup gcg = globalConfig();
- if (m_configDialog == 0) {
- const QSize resolution =
- QApplication::desktop()->screenGeometry(screen()).size();
- m_configDialog = new BackgroundDialog(resolution, cg, gcg, 0);
- connect(m_configDialog, SIGNAL(okClicked()),
- this, SLOT(applyConfig()));
- connect(m_configDialog, SIGNAL(applyClicked()),
- this, SLOT(applyConfig()));
- }
- else {
- m_configDialog->reloadConfig(cg, gcg);
- }
-
- m_configDialog->show();
- KWindowSystem::setOnDesktop(m_configDialog->winId(), KWindowSystem::currentDesktop());
- KWindowSystem::activateWindow(m_configDialog->winId());
+ emit configureRequested();
}
-void DefaultDesktop::applyConfig()
-{
- Q_ASSERT(m_configDialog);
- m_configDialog->saveConfig(config(), globalConfig());
- emit configNeedsSaving();
-
- reloadConfig();
-}
-
-void DefaultDesktop::reloadConfig()
-{
- KConfigGroup cg = config();
-
- // store the state of the existing wallpaper config so we can determine later
- // if we need to trigger updates
- QString oldWallpaperPath(m_wallpaperPath);
- QColor old_wallpaperColor = m_wallpaperColor;
- int old_wallPaperPosition = m_wallpaperPosition;
-
- // If no wallpaper is set, a default will be set in updateBackground()
- // which is called as soon as constraints are updated.
- m_wallpaperPath = cg.readEntry("wallpaper", QString());
- m_backgroundMode = cg.readEntry("backgroundmode", int(BackgroundDialog::kStaticBackground));
-
- if (m_backgroundMode != BackgroundDialog::kNoBackground &&
- (m_wallpaperPath.isEmpty() || !KStandardDirs::exists(m_wallpaperPath))) {
- m_wallpaperPath = Plasma::Theme::defaultTheme()->wallpaperPath(size().toSize());
- cg.writeEntry("wallpaper", m_wallpaperPath);
- }
-
- if (!m_wallpaperPath.isEmpty()) {
- kDebug() << "Using configured wallpaper" << m_wallpaperPath;
- }
-
- // used in both modes, so read it no matter which mode we are in
- m_wallpaperPosition = cg.readEntry("wallpaperposition", int(Background::ScaleCrop));
- m_wallpaperColor = cg.readEntry("wallpapercolor", QColor(Qt::black));
-
- if (m_backgroundMode == BackgroundDialog::kStaticBackground ||
- m_backgroundMode == BackgroundDialog::kNoBackground) {
- m_slideshowTimer.stop();
- // Only set the wallpaper if constraints have been loaded
- // and background image has changed
- if (oldWallpaperPath != m_wallpaperPath ||
- m_wallpaperPosition != old_wallPaperPosition ||
- m_wallpaperColor != old_wallpaperColor) {
- updateBackground();
- }
- } else {
- QStringList dirs = cg.readEntry("slidepaths", QStringList());
- QStringList filters;
- filters << "*.png" << "*.jpeg" << "*.jpg" << "*.svg" << "*.svgz";
-
- m_slideFiles.clear();
-
- for (int i = 0; i < dirs.size(); ++i) {
- QString path = dirs[i];
- // TODO load packages, too
- QDir dir(path);
- dir.setNameFilters(filters);
- dir.setFilter(QDir::Files | QDir::Hidden);
-
- QFileInfoList files = dir.entryInfoList();
- foreach (const QFileInfo &wp, files) {
- int position = m_slideFiles.size() == 0 ? 0 : qrand() % m_slideFiles.size();
- m_slideFiles.insert(position, wp.filePath());
- }
-
- // now make it look in sub-dirs
- dir.setFilter(QDir::AllDirs | QDir::NoDotAndDotDot);
- QFileInfoList subdirs = dir.entryInfoList();
- foreach (const QFileInfo &wp, subdirs) {
- dirs.append(wp.filePath());
- }
- }
-
- int delay = cg.readEntry("slideTimer", 60);
- m_slideshowTimer.setInterval(delay * 1000);
- if (!m_slideshowTimer.isActive()) {
- m_slideshowTimer.start();
- }
- m_currentSlide = -1;
- nextSlide(false);
- }
-}
-
-void DefaultDesktop::updateBackground()
-{
- if (m_wallpaperPath.isEmpty() && m_backgroundMode != BackgroundDialog::kNoBackground) {
- m_wallpaperPath = Plasma::Theme::defaultTheme()->wallpaperPath(size().toSize());
- kDebug() << "Setting wallpaper to default" << m_wallpaperPath;
- emit configNeedsSaving();
- }
-
- m_rendererToken =
- m_renderer.render(m_wallpaperPath,
- m_wallpaperColor,
- (Background::ResizeMethod)m_wallpaperPosition,
- Qt::SmoothTransformation);
- suspendStartup( true ); // during KDE startup, make ksmserver until the wallpaper is ready
-}
-
-void DefaultDesktop::updateBackground(int token, const QImage &img)
-{
- if (m_rendererToken == token) {
- m_bitmapBackground = QPixmap::fromImage(img);
- update();
- suspendStartup( false );
- }
-}
-
void DefaultDesktop::addPanel()
{
if (corona()) {
@@ -275,9 +96,18 @@
panel->showConfigurationInterface();
panel->setScreen(screen());
- panel->setLocation(Plasma::TopEdge);
+ if (corona()->containments().count()==2) {
+ panel->setLocation(Plasma::BottomEdge);
+ if (!corona()->loadDefaultApplets(panel, true)) {
+ panel->destroy(false);
+ return;
+ }
+ }
+ else {
+ panel->setLocation(Plasma::TopEdge);
+ }
- // trigger an instant layout so we immediately have a proper geometry
+ // trigger an instant layout so we immediately have a proper geometry
// rather than waiting around for the event loop
panel->updateConstraints(Plasma::StartupCompletedConstraint);
panel->flushPendingConstraintsEvents();
@@ -298,17 +128,6 @@
}
}
-void DefaultDesktop::suspendStartup(bool suspend)
-{
- org::kde::KSMServerInterface ksmserver("org.kde.ksmserver", "/KSMServer", QDBusConnection::sessionBus());
- const QString startupID("desktop wallaper");
- if (suspend) {
- ksmserver.suspendStartup(startupID);
- } else {
- ksmserver.resumeStartup(startupID);
- }
-}
-
void DefaultDesktop::lockScreen()
{
if (!KAuthorized::authorizeKAction("lock_screen")) {
@@ -338,7 +157,7 @@
connect(m_runCommandAction, SIGNAL(triggered(bool)), this, SLOT(runCommand()));
m_runCommandAction->setIcon(KIcon("system-run"));
- m_setupDesktopAction = new QAction(i18n("Desktop Settings..."), this);
+ m_setupDesktopAction = new QAction(i18n("Desktop Settings"), this);
m_setupDesktopAction->setIcon(KIcon("configure"));
connect(m_setupDesktopAction, SIGNAL(triggered()), this, SLOT(configure()));
@@ -400,35 +219,6 @@
#endif
}
-void DefaultDesktop::paintInterface(QPainter *painter,
- const QStyleOptionGraphicsItem *option,
- const QRect& contentsRect)
-{
- //kDebug() << "paintInterface of background";
- if (m_bitmapBackground.isNull()) {
- Containment::paintInterface(painter, option, contentsRect);
- return;
- }
-
- painter->save();
-
- if (painter->worldMatrix() == QMatrix()) {
- // draw the background untransformed when possible;(saves lots of per-pixel-math)
- painter->resetTransform();
- }
-
- // blit the background (saves all the per-pixel-products that blending does)
- painter->setCompositionMode(QPainter::CompositionMode_Source);
-
- // for pixmaps we draw only the exposed part (untransformed since the
- // bitmapBackground already has the size of the viewport)
- painter->drawPixmap(option->exposedRect, m_bitmapBackground, option->exposedRect);
- //kDebug() << "draw pixmap of background to" << option->exposedRect;
-
- // restore transformation and composition mode
- painter->restore();
-}
-
K_EXPORT_PLASMA_APPLET(desktop, DefaultDesktop)
#include "desktop.moc"
--- containments/desktop/CMakeLists.txt
+++ containments/desktop/CMakeLists.txt
@@ -1,29 +1,19 @@
set(desktop_SRCS
- desktop.cpp
- backgrounddialog.cpp
- backgroundpackage.cpp
- renderthread.cpp)
+ desktop.cpp)
-kde4_add_ui_files( desktop_SRCS BackgroundDialog.ui )
-
set(krunner_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/krunner/org.kde.krunner.Interface.xml)
QT4_ADD_DBUS_INTERFACE(desktop_SRCS ${krunner_xml} krunner_interface)
set(screensaver_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/krunner/org.freedesktop.ScreenSaver.xml)
QT4_ADD_DBUS_INTERFACE(desktop_SRCS ${screensaver_xml} screensaver_interface)
-set(ksmserver_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/ksmserver/org.kde.KSMServerInterface.xml)
-QT4_ADD_DBUS_INTERFACE(desktop_SRCS ${ksmserver_xml} ksmserver_interface)
-
kde4_add_plugin(plasma_containment_desktop ${desktop_SRCS})
if(WIN32)
-target_link_libraries(plasma_containment_desktop plasma ${KDE4_KNEWSTUFF2_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS} ${KDE4_THREADWEAVER_LIBRARY})
+target_link_libraries(plasma_containment_desktop plasma ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS})
else(WIN32)
-target_link_libraries(plasma_containment_desktop plasma kworkspace ${KDE4_KNEWSTUFF2_LIBS} ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS} ${KDE4_THREADWEAVER_LIBRARY})
+target_link_libraries(plasma_containment_desktop plasma kworkspace ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS})
endif(WIN32)
install(TARGETS plasma_containment_desktop DESTINATION ${PLUGIN_INSTALL_DIR})
install(FILES plasma-containment-desktop.desktop DESTINATION ${SERVICES_INSTALL_DIR})
install(FILES plasma_desktop_containment.kwinrules DESTINATION ${DATA_INSTALL_DIR}/kwin/default_rules)
-
-install( FILES wallpaper.knsrc plasma-themes.knsrc DESTINATION ${CONFIG_INSTALL_DIR} )
--- containments/CMakeLists.txt
+++ containments/CMakeLists.txt
@@ -1,2 +1,3 @@
add_subdirectory(desktop)
add_subdirectory(panel)
+add_subdirectory(plaindesktop)
--- containments/plaindesktop/desktop.h
+++ containments/plaindesktop/desktop.h
@@ -0,0 +1,91 @@
+/*
+* Copyright 2007 by Aaron Seigo <aseigo@kde.org>
+* Copyright 2008 by Alexis Ménard <darktears31@gmail.com>
+*
+*
+* 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,
+* 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 PLASMA_PLAINDESKTOP_H
+#define PLASMA_PLAINDESKTOP_H
+
+#include <QGraphicsItem>
+#include <QList>
+#include <QObject>
+#include <QStyleOptionGraphicsItem>
+#include <QTimer>
+
+#include <KDialog>
+#include <KIcon>
+
+#include <plasma/containment.h>
+#include <plasma/animator.h>
+
+class QAction;
+class QTimeLine;
+
+namespace Plasma
+{
+ class AppletBrowser;
+ class Svg;
+}
+
+/*class Tool : public QObject, public QGraphicsItem
+{
+ Q_OBJECT
+
+public:
+ explicit Tool(QGraphicsItem *parent = 0);
+ QRectF boundingRect() const;
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
+
+};*/
+
+class DefaultDesktop : public Plasma::Containment
+{
+ Q_OBJECT
+
+public:
+ DefaultDesktop(QObject *parent, const QVariantList &args);
+ ~DefaultDesktop();
+
+ void constraintsEvent(Plasma::Constraints constraints);
+
+ QList<QAction*> contextualActions();
+
+protected Q_SLOTS:
+ void runCommand();
+ void configure();
+
+ void lockScreen();
+ void logout();
+
+ void addPanel();
+
+private:
+ QSize resolution() const;
+
+ QAction *m_lockDesktopAction;
+ QAction *m_appletBrowserAction;
+ QAction *m_addPanelAction;
+ QAction *m_runCommandAction;
+ QAction *m_setupDesktopAction;
+ QAction *m_lockScreenAction;
+ QAction *m_logoutAction;
+ QAction *m_separator;
+ QAction *m_separator2;
+};
+
+#endif // PLASMA_PLAINDESKTOP_H
--- containments/plaindesktop/desktop.cpp
+++ containments/plaindesktop/desktop.cpp
@@ -0,0 +1,224 @@
+/*
+* Copyright 2007 by Aaron Seigo <aseigo@kde.org>
+* Copyright 2008 by Alexis Ménard <darktears31@gmail.com>
+*
+*
+* 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,
+* 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 "desktop.h"
+
+#include <QAction>
+#include <QApplication>
+#include <QDesktopWidget>
+#include <QFile>
+#include <QFileInfo>
+#include <QGraphicsScene>
+#include <QGraphicsView>
+#include <QPainter>
+#include <QTimeLine>
+
+#include <KAuthorized>
+#include <KComboBox>
+#include <KDebug>
+#include <KFileDialog>
+#include <KImageFilePreview>
+#include <KRun>
+#include <KStandardDirs>
+#include <KWindowSystem>
+
+#include "plasma/corona.h"
+#include "plasma/appletbrowser.h"
+#include "plasma/animator.h"
+#include "plasma/theme.h"
+#include "kworkspace/kworkspace.h"
+#include "knewstuff2/engine.h"
+
+#include "krunner_interface.h"
+#include "screensaver_interface.h"
+
+using namespace Plasma;
+
+DefaultDesktop::DefaultDesktop(QObject *parent, const QVariantList &args)
+ : Containment(parent, args, false),
+ m_lockDesktopAction(0),
+ m_appletBrowserAction(0),
+ m_addPanelAction(0),
+ m_runCommandAction(0),
+ m_lockScreenAction(0),
+ m_logoutAction(0)
+{
+ qRegisterMetaType<QImage>("QImage");
+ qRegisterMetaType<QPersistentModelIndex>("QPersistentModelIndex");
+ //kDebug() << "!!! loading desktop";
+}
+
+DefaultDesktop::~DefaultDesktop()
+{
+}
+
+QSize DefaultDesktop::resolution() const
+{
+ return QApplication::desktop()->screenGeometry(screen()).size();
+}
+
+void DefaultDesktop::constraintsEvent(Plasma::Constraints constraints)
+{
+ if (constraints & Plasma::ImmutableConstraint && m_appletBrowserAction) {
+ // we need to update the menu items that have already been created
+ bool locked = immutability() != Mutable;
+ m_addPanelAction->setVisible(!locked);
+ }
+}
+
+void DefaultDesktop::configure()
+{
+ emit configureRequested();
+}
+
+void DefaultDesktop::addPanel()
+{
+ if (corona()) {
+ // make a panel at the top
+ Containment* panel = corona()->addContainment("panel");
+ panel->showConfigurationInterface();
+
+ panel->setScreen(screen());
+ if (corona()->containments().count()==2) {
+ panel->setLocation(Plasma::BottomEdge);
+ if (!corona()->loadDefaultApplets(panel, true)) {
+ panel->destroy(false);
+ return;
+ }
+ }
+ else {
+ panel->setLocation(Plasma::TopEdge);
+ }
+
+ // trigger an instant layout so we immediately have a proper geometry
+ // rather than waiting around for the event loop
+ panel->updateConstraints(Plasma::StartupCompletedConstraint);
+ panel->flushPendingConstraintsEvents();
+ }
+}
+
+void DefaultDesktop::runCommand()
+{
+ if (!KAuthorized::authorizeKAction("run_command")) {
+ return;
+ }
+
+ QString interface("org.kde.krunner");
+ org::kde::krunner::Interface krunner(interface, "/Interface",
+ QDBusConnection::sessionBus());
+ if (krunner.isValid()) {
+ krunner.display();
+ }
+}
+
+void DefaultDesktop::lockScreen()
+{
+ if (!KAuthorized::authorizeKAction("lock_screen")) {
+ return;
+ }
+
+ QString interface("org.freedesktop.ScreenSaver");
+ org::freedesktop::ScreenSaver screensaver(interface, "/ScreenSaver",
+ QDBusConnection::sessionBus());
+ if (screensaver.isValid()) {
+ screensaver.Lock();
+ }
+}
+
+QList<QAction*> DefaultDesktop::contextualActions()
+{
+ //TODO: should we offer "Switch User" here?
+
+ if (!m_appletBrowserAction) {
+ m_appletBrowserAction = action("add widgets");
+
+ m_addPanelAction = new QAction(i18n("Add Panel"), this);
+ connect(m_addPanelAction, SIGNAL(triggered(bool)), this, SLOT(addPanel()));
+ m_addPanelAction->setIcon(KIcon("list-add"));
+
+ m_runCommandAction = new QAction(i18n("Run Command..."), this);
+ connect(m_runCommandAction, SIGNAL(triggered(bool)), this, SLOT(runCommand()));
+ m_runCommandAction->setIcon(KIcon("system-run"));
+
+ m_setupDesktopAction = new QAction(i18n("Desktop Settings"), this);
+ m_setupDesktopAction->setIcon(KIcon("configure"));
+ connect(m_setupDesktopAction, SIGNAL(triggered()), this, SLOT(configure()));
+
+ m_lockDesktopAction = action("lock widgets");
+
+ m_lockScreenAction = new QAction(i18n("Lock Screen"), this);
+ m_lockScreenAction->setIcon(KIcon("system-lock-screen"));
+ connect(m_lockScreenAction, SIGNAL(triggered(bool)), this, SLOT(lockScreen()));
+
+ m_logoutAction = new QAction(i18n("Leave..."), this);
+ m_logoutAction->setIcon(KIcon("system-shutdown"));
+ connect(m_logoutAction, SIGNAL(triggered(bool)), this, SLOT(logout()));
+ constraintsEvent(Plasma::ImmutableConstraint);
+
+ m_separator = new QAction(this);
+ m_separator->setSeparator(true);
+
+ m_separator2 = new QAction(this);
+ m_separator2->setSeparator(true);
+ }
+
+ QList<QAction*> actions;
+
+ if (KAuthorized::authorizeKAction("run_command")) {
+ actions.append(m_runCommandAction);
+ }
+
+ actions.append(m_appletBrowserAction);
+ actions.append(m_addPanelAction);
+ actions.append(m_setupDesktopAction);
+ if (screen() == -1) {
+ actions.append(action("remove"));
+ }
+
+ actions.append(m_lockDesktopAction);
+
+ actions.append(m_separator);
+
+ if (KAuthorized::authorizeKAction("lock_screen")) {
+ actions.append(m_lockScreenAction);
+ }
+
+ if (KAuthorized::authorizeKAction("logout")) {
+ actions.append(m_logoutAction);
+ }
+
+ return actions;
+}
+
+void DefaultDesktop::logout()
+{
+ if (!KAuthorized::authorizeKAction("logout")) {
+ return;
+ }
+#ifndef Q_WS_WIN
+ KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmDefault,
+ KWorkSpace::ShutdownTypeDefault,
+ KWorkSpace::ShutdownModeDefault);
+#endif
+}
+
+K_EXPORT_PLASMA_APPLET(desktop, DefaultDesktop)
+
+#include "desktop.moc"
--- containments/plaindesktop/CMakeLists.txt
+++ containments/plaindesktop/CMakeLists.txt
@@ -0,0 +1,18 @@
+set(desktop_SRCS
+ desktop.cpp)
+
+set(krunner_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/krunner/org.kde.krunner.Interface.xml)
+QT4_ADD_DBUS_INTERFACE(desktop_SRCS ${krunner_xml} krunner_interface)
+
+set(screensaver_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/krunner/org.freedesktop.ScreenSaver.xml)
+QT4_ADD_DBUS_INTERFACE(desktop_SRCS ${screensaver_xml} screensaver_interface)
+
+kde4_add_plugin(plasma_containment_plaindesktop ${desktop_SRCS})
+if(WIN32)
+target_link_libraries(plasma_containment_plaindesktop plasma ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS})
+else(WIN32)
+target_link_libraries(plasma_containment_plaindesktop plasma kworkspace ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS})
+endif(WIN32)
+
+install(TARGETS plasma_containment_plaindesktop DESTINATION ${PLUGIN_INSTALL_DIR})
+install(FILES plasma-containment-plaindesktop.desktop DESTINATION ${SERVICES_INSTALL_DIR})
--- containments/plaindesktop/plasma-containment-plaindesktop.desktop
+++ containments/plaindesktop/plasma-containment-plaindesktop.desktop
@@ -0,0 +1,90 @@
+[Desktop Entry]
+Name=Plain Desktop
+Name[af]=Werkskerm
+Name[ar]=سطح المكتب
+Name[be]=Працоўны стол
+Name[bg]=Работен плот
+Name[bn]=ডেস্কটপ
+Name[bn_IN]=ডেস্কটপ
+Name[br]=Gorretaol
+Name[ca]=Escriptori
+Name[cs]=Pracovní plocha
+Name[csb]=Pùlt
+Name[cy]=Penbwrdd
+Name[de]=Arbeitsfläche
+Name[el]=Επιφάνεια εργασίας
+Name[eo]=Labortablo
+Name[es]=Escritorio
+Name[et]=Töölaud
+Name[eu]=Mahaigaina
+Name[fa]=رومیزی
+Name[fi]=Työpöytä
+Name[fr]=Bureau
+Name[fy]=Buroblêd
+Name[ga]=Deasc
+Name[gl]=Escritorio
+Name[gu]=ડેસ્કટોપ
+Name[he]=שולחן עבודה
+Name[hi]=डेस्कटॉप
+Name[hr]=Radna površina
+Name[hu]=Munkaasztal
+Name[is]=Skjáborð
+Name[ja]=デスクトップ
+Name[ka]=სამუშაო დაფა
+Name[kk]=Жұмыс үстелі
+Name[km]=ផ្ទៃតុ
+Name[kn]=ಗಣಕತೆರೆ
+Name[ko]=데스크톱
+Name[ku]=Sermasê
+Name[lt]=Darbastalis
+Name[lv]=Darbvirsma
+Name[mk]=Работна површина
+Name[ml]=പണിയിടം
+Name[mr]=डेस्कटॉप
+Name[ms]=Ruang Kerja
+Name[nb]=Skrivebord
+Name[nds]=Schriefdisch
+Name[ne]=डेस्कटप
+Name[nl]=Bureaublad
+Name[nn]=Skrivebord
+Name[oc]=Burèu
+Name[pa]=ਡੈਸਕਟਾਪ
+Name[pl]=Pulpit
+Name[pt]=Ambiente de Trabalho
+Name[pt_BR]=Área de Trabalho
+Name[ru]=Рабочий стол
+Name[se]=Čállinbeavdi
+Name[sk]=Plocha
+Name[sl]=Namizje
+Name[sr]=Радна површ
+Name[sr@latin]=Radna površ
+Name[sv]=Skrivbord
+Name[ta]=பணிமேசை
+Name[te]=రంగస్ఠలం
+Name[tg]=Мизи корӣ
+Name[th]=พื้นที่ทำงาน
+Name[tr]=Masaüstü
+Name[uk]=Стільниця
+Name[uz]=Ish stoli
+Name[uz@cyrillic]=Иш столи
+Name[vi]=Màn hình nền
+Name[wa]=Sicribanne
+Name[x-test]=xxDesktopxx
+Name[zh_CN]=桌面
+Name[zh_TW]=桌面
+Comment=Desktop without toolbox
+Icon=user-desktop
+Type=Service
+X-KDE-ServiceTypes=Plasma/Applet,Plasma/Containment
+NoDisplay=true
+
+X-KDE-Library=plasma_containment_plaindesktop
+X-KDE-PluginInfo-Author=The Plasma Team
+X-KDE-PluginInfo-Email=panel-devel@kde.org
+X-KDE-PluginInfo-Name=plaindesktop
+X-KDE-PluginInfo-Version=0.1
+X-KDE-PluginInfo-Website=http://plasma.kde.org/
+X-KDE-PluginInfo-Category=Containments
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
--- applets/devicenotifier/devicenotifier.cpp
+++ applets/devicenotifier/devicenotifier.cpp
@@ -138,6 +138,8 @@
}
isNotificationEnabled = true;
+ Plasma::ToolTipManager::self()->registerWidget(this);
+
//connect to engine when a device is plug
connect(m_solidEngine, SIGNAL(sourceAdded(const QString&)),
this, SLOT(onSourceAdded(const QString&)));
@@ -295,6 +297,30 @@
}
}
+void DeviceNotifier::toolTipAboutToShow()
+{
+ Plasma::ToolTipManager::ToolTipContent toolTip;
+ toolTip.mainText = i18n("Device Notifier");
+ if (!m_lastPlugged.isEmpty()) {
+ Solid::Device *device = new Solid::Device(m_lastPlugged.last());
+
+ toolTip.subText = i18n("Last plugged in device: %1", device->product());
+ toolTip.image = KIcon(device->icon()).pixmap(IconSize(KIconLoader::Desktop));
+
+ delete device;
+ } else {
+ toolTip.subText = i18n("No devices plugged in");
+ toolTip.image = KIcon("drive-removable-media-usb-pendrive").pixmap(IconSize(KIconLoader::Desktop));
+ }
+
+ Plasma::ToolTipManager::self()->setToolTipContent(this, toolTip);
+}
+
+void DeviceNotifier::toolTipHidden()
+{
+ Plasma::ToolTipManager::self()->setToolTipContent(this, Plasma::ToolTipManager::ToolTipContent());
+}
+
void DeviceNotifier::onSourceAdded(const QString &name)
{
kDebug() << "DeviceNotifier:: source added" << name;
@@ -316,6 +342,7 @@
m_solidEngine->connectSource(name, this);
m_solidDeviceEngine->connectSource(name, this);
+ m_lastPlugged<<name;
//sets the "action" column
QStandardItem *actionItem = new QStandardItem();
@@ -339,6 +366,8 @@
if (m_icon && m_hotplugModel->rowCount() == 0) {
m_widget->hide();
}
+
+ m_lastPlugged.removeAll(name);
}
QModelIndex DeviceNotifier::indexForUdi(const QString &udi) const
--- applets/devicenotifier/devicenotifier.h
+++ applets/devicenotifier/devicenotifier.h
@@ -23,6 +23,8 @@
#include <solid/solidnamespace.h>
#include <plasma/applet.h>
#include <plasma/dataengine.h>
+#include <plasma/tooltipmanager.h>
+
#include <plasma/animator.h>
#include <plasma/dialog.h>
#include <KIcon>
@@ -84,6 +86,8 @@
void slotOnItemClicked(const QModelIndex &);
void onTimerExpired();
void onClickNotifier();
+ void toolTipAboutToShow();
+ void toolTipHidden();
protected:
void createConfigurationInterface(KConfigDialog *parent);
@@ -114,6 +118,9 @@
bool isNotificationEnabled;
QGraphicsLinearLayout *m_layout;
+ ///last plugged udi
+ QList<QString> m_lastPlugged;
+
/// Designer Config file
Ui::solidNotifierConfig ui;
--- applets/libplasmaclock/clockapplet.cpp
+++ applets/libplasmaclock/clockapplet.cpp
@@ -58,6 +58,7 @@
: Plasma::Applet(parent, args),
d(new Private)
{
+ Plasma::ToolTipManager::self()->registerWidget(this);
}
ClockApplet::~ClockApplet()
@@ -66,18 +67,67 @@
delete d;
}
-void ClockApplet::updateToolTipContent() {
- //QString timeString = KGlobal::locale()->formatTime(d->time, d->showSeconds);
- //TODO port to TOOLTIP manager
- /*Plasma::ToolTipData tipData;
+void ClockApplet::toolTipAboutToShow()
+{
+ updateContent();
+}
- tipData.mainText = "";//d->time.toString(timeString);
- tipData.subText = "";//d->date.toString();
- //tipData.image = d->toolTipIcon;
+void ClockApplet::toolTipHidden()
+{
+ Plasma::ToolTipManager::self()->clearToolTipContent(this);
+}
- setToolTip(tipData);*/
+void ClockApplet::updateContent()
+{
+ Plasma::ToolTipManager::ToolTipContent tipData;
+
+ {
+ // the main text contains the current timezone's time and date
+ Plasma::DataEngine::Data data = dataEngine("time")->query(currentTimezone());
+ QString mainText;
+ mainText += KGlobal::locale()->formatTime(data["Time"].toTime(), false) + "<br>";
+ mainText += KGlobal::locale()->formatDate(data["Date"].toDate());
+ tipData.mainText = mainText;
+ }
+
+ QString subText;
+/* if (!isLocalTimezone()) {
+ d->addTzToTipText(subText, localTimezone());
+ }
+ foreach (const QString &tz, getSelectedTimezones()) {
+ if (tz == currentTimezone()) {
+ continue;
+ }
+ d->addTzToTipText(subText, tz);
+ }*/
+ tipData.subText = subText;
+
+ // query for custom content
+ Plasma::ToolTipManager::ToolTipContent customContent = toolTipContent();
+ if (customContent.image.isNull()) {
+ tipData.image = KIcon("chronometer").pixmap(IconSize(KIconLoader::Desktop));
+ } else {
+ tipData.image = customContent.image;
+ }
+
+ if (!customContent.mainText.isEmpty()) {
+ // add their main text
+ tipData.mainText = customContent.mainText + "<br>" + tipData.mainText;
+ }
+
+ if (!customContent.subText.isEmpty()) {
+ // add their sub text
+ tipData.subText = customContent.subText + "<br>" + tipData.subText;
+ }
+
+ Plasma::ToolTipManager::self()->setToolTipContent(this, tipData);
}
+Plasma::ToolTipManager::ToolTipContent ClockApplet::toolTipContent()
+{
+ return Plasma::ToolTipManager::ToolTipContent();
+}
+
void ClockApplet::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (event->buttons() == Qt::LeftButton) {
--- applets/libplasmaclock/clockapplet.h
+++ applets/libplasmaclock/clockapplet.h
@@ -27,6 +27,8 @@
#include <plasma/applet.h>
#include <plasma/dataengine.h>
#include <plasma/dialog.h>
+#include <plasma/tooltipmanager.h>
+
#include "ui_calendar.h"
#include "plasmaclock_export.h"
@@ -51,17 +53,21 @@
static QString localTimezone();
+ public Q_SLOTS:
+ void toolTipAboutToShow();
+ void toolTipHidden();
+
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+ virtual Plasma::ToolTipManager::ToolTipContent toolTipContent();
+ void updateContent();
protected Q_SLOTS:
void setCurrentTimezone(const QString &tz);
void showCalendar(QGraphicsSceneMouseEvent *event);
private:
- void updateToolTipContent();
-
class Private;
Private * const d;
};
--- applets/lock_logout/Messages.sh
+++ applets/lock_logout/Messages.sh
@@ -0,0 +1,2 @@
+#! /usr/bin/env bash
+$XGETTEXT *.cpp -o $podir/plasma_applet_lock_logout.pot
Property changes on: applets/lock_logout/Messages.sh
___________________________________________________________________
Added: svn:executable
+ *
--- applets/lock_logout/lockout.cpp
+++ applets/lock_logout/lockout.cpp
@@ -21,11 +21,13 @@
// Plasma
#include <plasma/widgets/icon.h>
+#include <plasma/containment.h>
// Qt
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusReply>
#include <QGraphicsLinearLayout>
+#include <QAction>
// KDE
#include <KIcon>
@@ -47,18 +49,41 @@
m_layout->setSpacing(0);
Plasma::Icon *icon_lock = new Plasma::Icon(KIcon("system-lock-screen"), "", this);
- m_layout->addItem(icon_lock);
connect(icon_lock, SIGNAL(clicked()), this, SLOT(clickLock()));
Plasma::Icon *icon_logout = new Plasma::Icon(KIcon("system-shutdown"), "", this);
- m_layout->addItem(icon_logout);
connect(icon_logout, SIGNAL(clicked()), this, SLOT(clickLogout()));
+
+ KConfigGroup cg = config();
+ if (cg.readEntry("AlternateButtonOrder", false)) {
+ m_layout->addItem(icon_lock);
+ m_layout->addItem(icon_logout);
+ }
+ else {
+ m_layout->addItem(icon_logout);
+ m_layout->addItem(icon_lock);
+ }
+
+ QAction *switcher = new QAction(i18n("Alternate Button Order"), this);
+ m_actions.append(switcher);
+ connect(switcher, SIGNAL(triggered(bool)), this, SLOT(switchOrder()));
}
LockOut::~LockOut()
{
}
+void LockOut::switchOrder()
+{
+ KConfigGroup cg = config();
+ cg.writeEntry("AlternateButtonOrder", !cg.readEntry("AlternateButtonOrder", false));
+ emit configNeedsSaving();
+
+ QGraphicsLayoutItem* item = m_layout->itemAt(0);
+ m_layout->removeAt(0);
+ m_layout->addItem(item);
+}
+
void LockOut::checkLayout()
{
Qt::Orientation direction;
@@ -131,5 +156,9 @@
KWorkSpace::ShutdownModeDefault);
}
+QList<QAction*> LockOut::contextualActions()
+{
+ return m_actions;
+}
#include "lockout.moc"
--- applets/lock_logout/lockout.h
+++ applets/lock_logout/lockout.h
@@ -33,13 +33,16 @@
~LockOut();
void init();
virtual void constraintsEvent(Plasma::Constraints constraints);
+ virtual QList<QAction*> contextualActions();
public slots:
void clickLogout();
void clickLock();
+ void switchOrder();
private:
QGraphicsLinearLayout *m_layout;
+ QList<QAction*> m_actions;
void checkLayout();
};
--- applets/trash/trash.cpp
+++ applets/trash/trash.cpp
@@ -45,6 +45,7 @@
//Plasma
#include <plasma/widgets/icon.h>
#include <plasma/containment.h>
+#include <plasma/tooltipmanager.h>
//Solid
#include <solid/devicenotifier.h>
@@ -200,17 +201,20 @@
void Trash::setIcon()
{
+ Plasma::ToolTipManager::ToolTipContent data;
+ data.mainText = i18n("Trash");
+
if (m_count > 0) {
m_icon->setIcon(KIcon("user-trash-full"));
- //FIXME PORT TO TOOLTIP MANAGER
- //m_data.subText = i18np("One item", "%1 items", m_count);
+
+ data.subText = i18np("One item", "%1 items", m_count);
if (m_showText) {
m_icon->setInfoText(i18np("One item", "%1 items", m_count));
}
} else {
m_icon->setIcon(KIcon("user-trash"));
- //FIXME PORT TO TOOLTIP MANAGER
- //m_data.subText = i18nc("The trash is empty. This is not an action, but a state", "Empty");
+
+ data.subText = i18nc("The trash is empty. This is not an action, but a state", "Empty");
if (m_showText){
m_icon->setInfoText(i18nc("The trash is empty. This is not an action, but a state", "Empty"));
}
@@ -218,14 +222,13 @@
m_icon->update();
- //FIXME TOOLTIP MANAGER
- /*m_data.image = m_icon->icon().pixmap(IconSize(KIconLoader::Desktop));
+ data.image = m_icon->icon().pixmap(IconSize(KIconLoader::Desktop));
if (!m_showText) {
- m_icon->setToolTip(m_data);
+ Plasma::ToolTipManager::self()->setToolTipContent(this, data);
} else {
- m_icon->setToolTip(Plasma::ToolTipData());
- }*/
+ Plasma::ToolTipManager::self()->setToolTipContent(this, Plasma::ToolTipManager::ToolTipContent());
+ }
emptyTrash->setEnabled(m_count>0);
}
--- applets/systemtray/systemtray.cpp
+++ applets/systemtray/systemtray.cpp
@@ -1,198 +0,0 @@
-/***************************************************************************
- * systemtray.cpp *
- * *
- * Copyright (C) 2007 Alexander Rodin <rodin.alexander@gmail.com> *
- * Copyright (C) 2007 Jason Stubbs <jasonbstubbs@gmail.com> *
- * *
- * 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 . *
- ***************************************************************************/
-
-// Own
-#include "systemtray.h"
-
-// Qt
-#include <QApplication>
-#include <QGraphicsView>
-#include <QTimer>
-
-//Plasma
-#include <plasma/panelsvg.h>
-
-SystemTray::SystemTray(QObject *parent, const QVariantList &arguments)
- : Plasma::Applet(parent, arguments),
- m_startUpDelayShowTimer(0),
- m_showOwnBackground(false)
-{
- // Revert to Qt-4.4.0 behaviour so that the SystemTrayWidget is always on
- // top. Note, if a sibling widget requires a native window for other
- // reasons the problem could reoccur.
- // Another alternative is to raise() during SystemTrayWidget construction
- // and then have it listen for ChildAdded events on its parent. However,
- // this causes a lot of flashes of white and so should be avoided if
- // possible.
- // See http://bugs.kde.org/show_bug.cgi?id=168007
- // and http://mail.kde.org/pipermail/plasma-devel/2008-August/000258.html
-
-#if QT_VERSION < 0x040401
- Qt::ApplicationAttribute attr = (Qt::ApplicationAttribute)4;
-#else
- Qt::ApplicationAttribute attr = Qt::AA_DontCreateNativeWidgetSiblings;
-#endif
- if (!QApplication::testAttribute(attr)) {
- QApplication::setAttribute(attr);
- }
-
- m_background = new Plasma::PanelSvg(this);
- m_background->setImagePath("widgets/systemtray");
- connect(this, SIGNAL(geometryChanged()), this, SLOT(updateWidgetGeometry()));
-}
-
-SystemTray::~SystemTray()
-{
- // Get rid of our SystemTrayWidget if we still have one
- delete m_systemTrayWidget;
-}
-
-void SystemTray::constraintsEvent(Plasma::Constraints constraints)
-{
- if (constraints & (Plasma::LocationConstraint | Plasma::FormFactorConstraint)) {
- updateWidgetOrientation();
- }
-
- if (constraints & (Plasma::StartupCompletedConstraint | Plasma::FormFactorConstraint)) {
- updateWidgetGeometry();
- }
-}
-
-void SystemTray::paintInterface(QPainter *painter,
- const QStyleOptionGraphicsItem *option,
- const QRect& contentsRect)
-{
- Q_UNUSED(option)
-
- if (m_showOwnBackground) {
- m_background->paintPanel(painter, contentsRect);
- }
-}
-
-void SystemTray::updateWidgetOrientation()
-{
- if (!m_systemTrayWidget) {
- return;
- }
- // TODO: Handle other form factors
- if (formFactor() == Plasma::Horizontal) {
- m_systemTrayWidget->setOrientation(Qt::Horizontal);
- } else if (formFactor() == Plasma::Vertical) {
- m_systemTrayWidget->setOrientation(Qt::Vertical);
- } else { // desktop
- m_systemTrayWidget->setOrientation(Qt::Horizontal);
- }
-}
-
-void SystemTray::updateWidgetGeometry()
-{
- QGraphicsView *parentView = view();
- if (!parentView) {
- kDebug() << "Problem view is NULL";
- return;
- }
-
- if (!m_systemTrayWidget || m_systemTrayWidget->parentWidget() != parentView) {
- delete m_systemTrayWidget;
- m_systemTrayWidget = new SystemTrayWidget(parentView);
- updateWidgetOrientation();
- connect(m_systemTrayWidget, SIGNAL(sizeShouldChange()),
- this, SLOT(updateWidgetGeometry()));
-
- if (! m_startUpDelayShowTimer) {
- m_startUpDelayShowTimer = new QTimer(this);
- connect(m_startUpDelayShowTimer, SIGNAL(timeout()), this, SLOT(startupDelayer()));
- }
- }
-
- if (m_startUpDelayShowTimer) {
- kDebug() << "start up delay";
- m_startUpDelayShowTimer->start(STARTUP_TIMER_DELAY);
- return; // don't relayout yet.
- }
-
- // Figure out the margins set by the background svg and disable the svg
- // if there won't be enough room for a single row of icons
- qreal leftMargin, topMargin, rightMargin, bottomMargin;
- if (formFactor() == Plasma::Vertical || formFactor() == Plasma::Horizontal) {
- m_background->setElementPrefix(QString());
- m_background->getMargins(leftMargin, topMargin, rightMargin, bottomMargin);
-
- if (geometry().width() - leftMargin - rightMargin < 22 ||
- geometry().height() - topMargin - bottomMargin < 22) {
- m_showOwnBackground = false;
- leftMargin = topMargin = rightMargin = bottomMargin = 0;
- } else {
- m_showOwnBackground = true;
- m_background->resizePanel(size());
- update();
- }
- } else {
- getContentsMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin);
- }
-
- // Update our preferred size based on the wystem tray widget's size and any margins
- QRectF rf = mapFromView(parentView, QRect(m_systemTrayWidget->pos(),
- m_systemTrayWidget->minimumSize()));
- rf.setWidth(rf.width() + leftMargin + rightMargin);
- rf.setHeight(rf.height() + topMargin + bottomMargin);
-
-
- if (m_systemTrayWidget->orientation() == Qt::Vertical) {
- setMinimumHeight(rf.height());
- setMinimumWidth(22 + leftMargin + rightMargin);
- } else {
- setMinimumWidth(rf.width());
- setMinimumHeight(22 + topMargin + bottomMargin);
- }
- setPreferredSize(rf.size());
-
- // Calculate the rect usable by the system tray widget
- rf = rect();
- rf.moveLeft(rf.left() + leftMargin);
- rf.setWidth(rf.width() - leftMargin - rightMargin);
- rf.moveTop(rf.top() + topMargin);
- rf.setHeight(rf.height() - topMargin - bottomMargin);
-
- // Set the widget's maximum size to the size to the available size.
- // The widget will use this size to calculate how many rows/columns
- // can be displayed.
- QRect r = mapToView(parentView, rf);
- m_systemTrayWidget->setMaximumSize(r.size());
-
- // Center the widget within the available area
- QSize s = m_systemTrayWidget->minimumSize();
- r.moveLeft(r.left() + (r.width() - s.width()) / 2);
- r.moveTop(r.top() + (r.height() - s.height()) / 2);
- r.setSize(s);
- m_systemTrayWidget->setGeometry(r);
-}
-
-void SystemTray::startupDelayer()
-{
- delete m_startUpDelayShowTimer;
- m_startUpDelayShowTimer = 0;
- m_systemTrayWidget->setVisible(true);
- m_systemTrayWidget->init();
-}
-
-#include "systemtray.moc"
--- applets/systemtray/systemtraycontainer.cpp
+++ applets/systemtray/systemtraycontainer.cpp
@@ -1,133 +0,0 @@
-/***************************************************************************
- * systemtraywidget.h *
- * *
- * Copyright (C) 2007 Jason Stubbs <jasonbstubbs@gmail.com> *
- * *
- * 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 . *
- ***************************************************************************/
-
-// Own
-#include "systemtraycontainer.h"
-
-// KDE
-#include <KDebug>
-#include <plasma/theme.h>
-
-// Qt
-#include <QX11Info>
-
-// Xlib
-#include <X11/Xlib.h>
-
-SystemTrayContainer::SystemTrayContainer(QWidget *parent)
- : QX11EmbedContainer(parent)
-{
- connect(this, SIGNAL(clientClosed()), SLOT(deleteLater()));
- connect(this, SIGNAL(error(QX11EmbedContainer::Error)), SLOT(handleError(QX11EmbedContainer::Error)));
-
- connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), this, SLOT(updateBackground()));
- updateBackground();
-
- // Tray icons have a fixed size of 22x22
- setMaximumSize(22, 22);
-}
-
-void SystemTrayContainer::embedSystemTrayClient( WId clientId )
-{
- kDebug() << "attempting to embed" << clientId;
- if( !prepareFor(clientId)) { // temporary hack, until QX11EmbedContainer gets fixed
- deleteLater();
- return;
- }
-
- embedClient(clientId);
-
- // check if we still have a valid clientId since there may cases where we don't any
- // longer after calling embedClient like e.g. if there is already a pidgin-instance
- // running and it got started again. In that case those guniqueapplication starts
- // and fires a SYSTEM_TRAY_REQUEST_DOCK with another clientId up, exists and passes
- // commandline-arguments on to the other running instance and embedClient does fail
- // without emitting a clientClosed() or error() signal.
- XWindowAttributes attr;
- if( !XGetWindowAttributes(QX11Info::display(), clientId, &attr) /*|| attr.map_state == IsUnmapped*/ ) {
- deleteLater();
- }
-}
-
-bool SystemTrayContainer::x11Event(XEvent *event)
-{
- bool ok = QX11EmbedContainer::x11Event(event);
- if (event->type == ReparentNotify) {
- setMinimumSize(22,22);
- }
- return ok;
-}
-
-void SystemTrayContainer::updateBackground()
-{
- // Qt's regular quasi-transparent background doesn't work so set it to the
- // theme's background color instead.
- QPalette p = palette();
- p.setBrush(QPalette::Window, Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor));
- setPalette(p);
- setBackgroundRole(QPalette::Window);
-}
-
-void SystemTrayContainer::handleError(QX11EmbedContainer::Error error)
-{
- Q_UNUSED(error);
- deleteLater();
-}
-
-// Temporary hack to change X window used by QX11EmbedContainer so that it matches
-// the window embedded into it (#153193).
-bool SystemTrayContainer::prepareFor(WId w)
-{
- Display* dpy = QX11Info::display();
-
- XWindowAttributes ga;
- if( !XGetWindowAttributes(dpy, w, &ga))
- return false;
-
- XSetWindowAttributes sa;
- sa.background_pixel = WhitePixel(dpy, DefaultScreen(dpy));
- sa.border_pixel = BlackPixel(dpy, DefaultScreen(dpy));
- sa.colormap = ga.colormap;
-
- Window ww = XCreateWindow(dpy, parentWidget() ? parentWidget()->winId() : DefaultRootWindow(dpy),
- 0, 0, 22, 22, 0, ga.depth, InputOutput, ga.visual,
- CWBackPixel | CWBorderPixel | CWColormap, &sa);
- create(ww, true, true);
-
- // repeat everything from QX11EmbedContainer's ctor that might be relevant
- setFocusPolicy(Qt::StrongFocus);
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- setAcceptDrops(true);
- setEnabled(false);
-
- XSelectInput(dpy, ww,
- KeyPressMask | KeyReleaseMask |
- ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
- KeymapStateMask |
- PointerMotionMask |
- EnterWindowMask | LeaveWindowMask |
- FocusChangeMask |
- ExposureMask |
- StructureNotifyMask |
- SubstructureNotifyMask);
- XFlush(dpy);
- return true;
-}
--- applets/systemtray/systemtraywidget.cpp
+++ applets/systemtray/systemtraywidget.cpp
@@ -1,206 +0,0 @@
-/***************************************************************************
- * systemtraywidget.h *
- * *
- * Copyright (C) 2007 Alexander Rodin <rodin.alexander@gmail.com> *
- * Copyright (C) 2007 Jason Stubbs <jasonbstubbs@gmail.com> *
- * *
- * 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 . *
- ***************************************************************************/
-
-// Own
-#include "systemtraywidget.h"
-#include "systemtraycontainer.h"
-
-// Qt
-#include <QX11Info>
-
-// Xlib
-#include <X11/Xlib.h>
-
-namespace
-{
-enum
-{
- SYSTEM_TRAY_REQUEST_DOCK,
- SYSTEM_TRAY_BEGIN_MESSAGE,
- SYSTEM_TRAY_CANCEL_MESSAGE
-};
-}
-
-SystemTrayWidget::SystemTrayWidget(QWidget *parent)
- : QWidget(parent),
- m_orientation(Qt::Horizontal),
- m_maxCount(0),
- m_nextRow(0),
- m_nextColumn(0)
-{
- m_mainLayout = new QGridLayout(this);
-
- // Override spacing set by the current style
- m_mainLayout->setContentsMargins(0, 0, 0, 0);
- m_mainLayout->setSpacing(4);
-}
-
-void SystemTrayWidget::init()
-{
- Display *display = QX11Info::display();
-
- m_selectionAtom = XInternAtom(display, "_NET_SYSTEM_TRAY_S" + QByteArray::number(QX11Info::appScreen()), false);
- m_opcodeAtom = XInternAtom(display, "_NET_SYSTEM_TRAY_OPCODE", false);
- XSetSelectionOwner(display, m_selectionAtom, winId(), CurrentTime);
-
- if (XGetSelectionOwner(display, m_selectionAtom) == winId()) {
- WId root = QX11Info::appRootWindow();
- XClientMessageEvent xev;
-
- xev.type = ClientMessage;
- xev.window = root;
- xev.message_type = XInternAtom(display, "MANAGER", false);
- xev.format = 32;
- xev.data.l[0] = CurrentTime;
- xev.data.l[1] = m_selectionAtom;
- xev.data.l[2] = winId();
- xev.data.l[3] = 0; // manager specific data
- xev.data.l[4] = 0; // manager specific data
-
- XSendEvent(display, root, false, StructureNotifyMask, (XEvent*)&xev);
- }
-}
-
-bool SystemTrayWidget::x11Event(XEvent *event)
-{
- if (event->type == ClientMessage) {
- if (event->xclient.message_type == m_opcodeAtom &&
- event->xclient.data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) {
- const WId systemTrayClientId = (WId)event->xclient.data.l[2];
- if (systemTrayClientId == 0) {
- return true;
- }
- foreach(SystemTrayContainer *c, findChildren<SystemTrayContainer*>()) {
- if (c->clientWinId() == systemTrayClientId) {
- return true;
- }
- }
-
- // Set up a SystemTrayContainer for the client
- SystemTrayContainer *container = new SystemTrayContainer(this);
- connect(container, SIGNAL(destroyed(QObject *)), this, SLOT(relayoutContainers(QObject *)));
- connect(container, SIGNAL(clientIsEmbedded()), this, SIGNAL(sizeShouldChange()));
- addWidgetToLayout(container);
-
- container->embedSystemTrayClient(systemTrayClientId);
- return true;
- }
- }
- return QWidget::x11Event(event);
-}
-
-void SystemTrayWidget::setOrientation(Qt::Orientation orientation)
-{
- if (orientation != m_orientation) {
- m_orientation = orientation;
- relayoutContainers();
- }
-}
-
-Qt::Orientation SystemTrayWidget::orientation() const
-{
- return m_orientation;
-}
-
-void SystemTrayWidget::setMaximumSize(QSize s)
-{
- bool doLayout = (m_orientation == Qt::Horizontal && s.height() != maximumHeight());
- doLayout |= (m_orientation == Qt::Vertical && s.width() != maximumWidth());
-
- QWidget::setMaximumSize(s);
- if (doLayout) {
- relayoutContainers();
- }
-}
-
-void SystemTrayWidget::addWidgetToLayout(QWidget *widget)
-{
- // Add the widget to the layout
- m_mainLayout->setRowMinimumHeight(m_nextRow, 22);
- m_mainLayout->setColumnMinimumWidth(m_nextColumn, 22);
- widget->resize(22,22);
- m_mainLayout->addWidget(widget, m_nextRow, m_nextColumn, 1, 1, Qt::AlignCenter);
-
- // Figure out where the next widget should go
- if (m_orientation == Qt::Horizontal) {
- // Calculate the items that fit into a column
- m_maxCount = (maximumHeight() + m_mainLayout->spacing()) / (widget->height() + m_mainLayout->spacing()) -1;
-
- setMinimumSize(QSize(22 * (m_nextColumn + 1) + m_mainLayout->spacing() * m_nextColumn,
- 22 * (m_maxCount + 1) + m_mainLayout->spacing() * m_maxCount));
-
- // Add down then across when horizontal
- m_nextRow++;
- if (m_nextRow > m_maxCount){
- m_nextColumn++;
- m_nextRow = 0;
- }
- } else {
- // Calculate the items that fit into a row
- m_maxCount = (maximumWidth() + m_mainLayout->spacing()) / (widget->width() + m_mainLayout->spacing()) -1;
-
- setMinimumSize(QSize(22 * (m_maxCount + 1) + m_mainLayout->spacing() * m_maxCount,
- 22 * (m_nextRow + 1) + m_mainLayout->spacing() * m_nextRow));
-
- // Add across then down when vertical
- m_nextColumn++;
- if (m_nextColumn > m_maxCount) {
- m_nextRow++;
- m_nextColumn = 0;
- }
- }
-}
-
-void SystemTrayWidget::relayoutContainers(QObject *removeContainer)
-{
- // Pull all widgets from our container, skipping over the one that was just
- // deleted
- QList<QWidget *> remainingWidgets;
- while (QLayoutItem* item = m_mainLayout->takeAt(0)) {
- if (item->widget() && item->widget() != removeContainer) {
- remainingWidgets.append(item->widget());
- }
- delete item;
- }
-
- // Reset the widths and heights in our layout to 0 so that the removed
- // widget's space isn't kept
- // (Why doesn't QGridLayout do this automatically?)
- for (int row = 0; row < m_mainLayout->rowCount(); row++) {
- m_mainLayout->setRowMinimumHeight(row, 0);
- }
- for (int column = 0; column < m_mainLayout->columnCount(); column++) {
- m_mainLayout->setColumnMinimumWidth(column, 0);
- }
-
- // Re-add remaining widgets
- m_maxCount = 0;
- m_nextRow = 0;
- m_nextColumn = 0;
- foreach (QWidget *widget, remainingWidgets) {
- addWidgetToLayout(widget);
- }
-
- emit sizeShouldChange();
-}
-
-#include "systemtraywidget.moc"
--- applets/systemtray/systemtray.h
+++ applets/systemtray/systemtray.h
@@ -1,74 +0,0 @@
-/***************************************************************************
- * systemtray.h *
- * *
- * Copyright (C) 2007 Alexander Rodin <rodin.alexander@gmail.com> *
- * Copyright (C) 2007 Jason Stubbs <jasonbstubbs@gmail.com> *
- * *
- * 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 SYSTEMTRAY_H
-#define SYSTEMTRAY_H
-
-// Own
-#include "systemtraywidget.h"
-
-// Qt
-#include <QPointer>
-
-// Plasma
-#include <plasma/applet.h>
-
-class QTimer;
-
-namespace Plasma
-{
- class PanelSvg;
-}
-
-class SystemTray: public Plasma::Applet
-{
-Q_OBJECT
-
-public:
- explicit SystemTray(QObject *parent, const QVariantList &arguments = QVariantList());
- ~SystemTray();
-
- void constraintsEvent(Plasma::Constraints constraints);
- void paintInterface(QPainter *painter,
- const QStyleOptionGraphicsItem *option,
- const QRect &contentsRect);
-
-private slots:
- void updateWidgetGeometry();
- void startupDelayer();
-
-private:
- void updateWidgetOrientation();
-
- static const int STARTUP_TIMER_DELAY = 1500;
-
- Plasma::PanelSvg *m_background;
- QTimer *m_startUpDelayShowTimer;
- bool m_showOwnBackground;
-
- // The parent widget might delete this so we guard it
- QPointer<SystemTrayWidget> m_systemTrayWidget;
-};
-
-K_EXPORT_PLASMA_APPLET(systemtray, SystemTray)
-
-#endif // SYSTEMTRAY_H
--- applets/systemtray/systemtraycontainer.h
+++ applets/systemtray/systemtraycontainer.h
@@ -1,47 +0,0 @@
-/***************************************************************************
- * systemtraywidget.h *
- * *
- * Copyright (C) 2007 Jason Stubbs <jasonbstubbs@gmail.com> *
- * *
- * 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 SYSTEMTRAYCONTAINER_H
-#define SYSTEMTRAYCONTAINER_H
-
-// Qt
-#include <QX11EmbedContainer>
-
-class SystemTrayContainer : public QX11EmbedContainer
-{
-Q_OBJECT
-
-public:
- explicit SystemTrayContainer(QWidget *parent);
- void embedSystemTrayClient( WId clientId );
-
-protected:
- bool x11Event(XEvent *event);
-
-private:
- bool prepareFor( WId id );
-
-private slots:
- void handleError(QX11EmbedContainer::Error error);
- void updateBackground();
-};
-
-#endif // SYSTRAYCONTAINER_H
--- applets/systemtray/systemtraywidget.h
+++ applets/systemtray/systemtraywidget.h
@@ -1,70 +0,0 @@
-/***************************************************************************
- * systemtraywidget.h *
- * *
- * Copyright (C) 2007 Alexander Rodin <rodin.alexander@gmail.com> *
- * Copyright (C) 2007 Jason Stubbs <jasonbstubbs@gmail.com> *
- * *
- * 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 SYSTEMTRAYWIDGET_H
-#define SYSTEMTRAYWIDGET_H
-
-// Qt
-#include <QGridLayout>
-#include <QWidget>
-
-// Xlib
-#include <X11/Xdefs.h>
-
-class SystemTrayWidget: public QWidget
-{
-Q_OBJECT
-
-public:
- SystemTrayWidget(QWidget *parent);
-
- void init();
-
- void setOrientation(Qt::Orientation);
- Qt::Orientation orientation() const;
- void setMaximumSize(QSize s);
-
-protected:
- bool x11Event(XEvent *event);
-
-Q_SIGNALS:
- void sizeShouldChange();
-
-private slots:
- void relayoutContainers(QObject *removeContainer = 0);
-
-private:
- void addWidgetToLayout(QWidget *widget);
- void doSizeChange();
-
- QGridLayout *m_mainLayout;
- Qt::Orientation m_orientation;
- int m_maxCount;
- int m_nextRow;
- int m_nextColumn;
-
- // These need to remain allocated for the duration of our lifetime
- Atom m_selectionAtom;
- Atom m_opcodeAtom;
-};
-
-#endif // SYSTEMTRAYWIDGET_H
--- applets/systemtray/Messages.sh
+++ applets/systemtray/Messages.sh
@@ -0,0 +1,2 @@
+#! /usr/bin/env bash
+$XGETTEXT ui/*.cpp -o $podir/plasma_applet_systemtray.pot
Property changes on: applets/systemtray/Messages.sh
___________________________________________________________________
Added: svn:executable
+ *
--- applets/systemtray/protocols/fdo/fdoselectionmanager.h
+++ applets/systemtray/protocols/fdo/fdoselectionmanager.h
@@ -0,0 +1,72 @@
+/***************************************************************************
+ * fdoselectionmanager.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 FDOSELECTIONMANAGER_H
+#define FDOSELECTIONMANAGER_H
+
+#include <QtGui/QWidget>
+
+namespace SystemTray
+{
+ class Task;
+}
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+class SelectionManager : public QWidget
+{
+ Q_OBJECT
+
+public:
+ class Singleton;
+ static SelectionManager* self();
+
+ void addDamageWatch(QWidget *container, WId client);
+ void removeDamageWatch(QWidget *container);
+ bool haveComposite() const;
+
+signals:
+ void taskCreated(SystemTray::Task *task);
+
+protected:
+ bool x11Event(XEvent *event);
+
+private slots:
+ void initSelection();
+ void cleanupTask(WId winId);
+
+private:
+ SelectionManager();
+ ~SelectionManager();
+
+ class Private;
+ Private* const d;
+};
+
+}
+}
+
+
+#endif
--- applets/systemtray/protocols/fdo/x11embedcontainer.h
+++ applets/systemtray/protocols/fdo/x11embedcontainer.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+ * x11embedcontainer.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 X11EMBEDCONTAINER_H
+#define X11EMBEDCONTAINER_H
+
+#include <QtGui/QX11EmbedContainer>
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+class X11EmbedContainer : public QX11EmbedContainer
+{
+ Q_OBJECT
+
+public:
+ X11EmbedContainer(QWidget *parent = 0);
+ ~X11EmbedContainer();
+
+ void embedSystemTrayClient(WId id);
+
+protected:
+ void paintEvent(QPaintEvent *event);
+
+private slots:
+ void ensureValidSize();
+ void updateBackgroundImage();
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+}
+
+
+#endif
--- applets/systemtray/protocols/fdo/fdotask.h
+++ applets/systemtray/protocols/fdo/fdotask.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * fdotask.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 FDOTASK_H
+#define FDOTASK_H
+
+#include "../../core/task.h"
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+class Task : public SystemTray::Task
+{
+ Q_OBJECT
+
+public:
+ Task(WId winId);
+ virtual ~Task();
+
+ virtual bool isEmbeddable() const;
+ virtual QString name() const;
+ virtual QString typeId() const;
+ virtual QIcon icon() const;
+
+signals:
+ void taskDeleted(WId winId);
+
+protected:
+ virtual QGraphicsWidget* createWidget(Plasma::Applet *applet);
+
+private:
+ class Private;
+ Private* const d;
+};
+
+
+}
+}
+
+#endif
--- applets/systemtray/protocols/fdo/x11embeddelegate.cpp
+++ applets/systemtray/protocols/fdo/x11embeddelegate.cpp
@@ -0,0 +1,97 @@
+/***************************************************************************
+ * x11embeddelegate.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "x11embedcontainer.h"
+#include "x11embeddelegate.h"
+
+#include <QtCore/QEvent>
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+
+class X11EmbedDelegate::Private
+{
+public:
+ X11EmbedContainer *container;
+};
+
+
+X11EmbedDelegate::X11EmbedDelegate(QWidget *parent)
+ : QWidget(parent),
+ d(new Private())
+{
+ d->container = new X11EmbedContainer(this);
+ d->container->move(0, 0);
+ d->container->show();
+}
+
+
+X11EmbedDelegate::~X11EmbedDelegate()
+{
+ delete d;
+}
+
+
+void X11EmbedDelegate::setParent(QWidget *newParent)
+{
+ if (parent()) {
+ parent()->removeEventFilter(this);
+ }
+ QWidget::setParent(newParent);
+ if (newParent) {
+ newParent->installEventFilter(this);
+ }
+}
+
+
+void X11EmbedDelegate::resizeEvent(QResizeEvent *event)
+{
+ Q_UNUSED(event);
+ d->container->resize(size());
+}
+
+
+X11EmbedContainer* X11EmbedDelegate::container()
+{
+ return d->container;
+}
+
+
+bool X11EmbedDelegate::eventFilter(QObject *watched, QEvent *event)
+{
+ bool ret = QWidget::eventFilter(watched, event);
+
+ if (event->type() == QEvent::Hide) {
+ setParent(0);
+ }
+
+ return ret;
+}
+
+
+}
+}
+
+#include "x11embeddelegate.moc"
--- applets/systemtray/protocols/fdo/fdographicswidget.h
+++ applets/systemtray/protocols/fdo/fdographicswidget.h
@@ -0,0 +1,62 @@
+/***************************************************************************
+ * fdographicswidget.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 FDOGRAPHICSWIDGET_H
+#define FDOGRAPHICSWIDGET_H
+
+#include <QtGui/QGraphicsWidget>
+#include <QtGui/QX11EmbedContainer>
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+class GraphicsWidget : public QGraphicsWidget
+{
+ Q_OBJECT
+
+public:
+ GraphicsWidget(WId winId);
+ ~GraphicsWidget();
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
+
+signals:
+ void clientClosed();
+
+private slots:
+ void handleClientEmbedded();
+ void handleClientClosed();
+ void handleClientError(QX11EmbedContainer::Error);
+ void updateWidgetBackground();
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+}
+
+
+#endif
--- applets/systemtray/protocols/fdo/fdotaskprotocol.h
+++ applets/systemtray/protocols/fdo/fdotaskprotocol.h
@@ -0,0 +1,51 @@
+/***************************************************************************
+ * fdoprotocol.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 FDOTASKPROTOCOL_H
+#define FDOTASKPROTOCOL_H
+
+#include "../../core/taskprotocol.h"
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+class TaskProtocol : public SystemTray::TaskProtocol
+{
+ Q_OBJECT
+
+public:
+ TaskProtocol(QObject *parent);
+ ~TaskProtocol();
+ void init();
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+}
+
+
+#endif
--- applets/systemtray/protocols/fdo/x11embeddelegate.h
+++ applets/systemtray/protocols/fdo/x11embeddelegate.h
@@ -0,0 +1,67 @@
+/***************************************************************************
+ * x11embeddelegate.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 X11EMBEDDELEGATE_H
+#define X11EMBEDDELEGATE_H
+
+#include <QWidget>
+
+namespace SystemTray
+{
+namespace FDO
+{
+ class X11EmbedContainer;
+}
+}
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+class X11EmbedDelegate : public QWidget
+{
+ Q_OBJECT
+
+public:
+ X11EmbedDelegate(QWidget *parent = 0);
+ ~X11EmbedDelegate();
+
+ void setParent(QWidget *parent);
+ X11EmbedContainer* container();
+
+ bool eventFilter(QObject *watched, QEvent *event);
+
+protected:
+ void resizeEvent(QResizeEvent *event);
+
+private:
+ class Private;
+ Private* const d;
+};
+
+
+}
+}
+
+
+#endif
--- applets/systemtray/protocols/fdo/fdoselectionmanager.cpp
+++ applets/systemtray/protocols/fdo/fdoselectionmanager.cpp
@@ -0,0 +1,368 @@
+/***************************************************************************
+ * fdoselectionmanager.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "fdoselectionmanager.h"
+#include "fdotask.h"
+
+#include <KDebug>
+
+#include <QtCore/QCoreApplication>
+#include <QtCore/QHash>
+#include <QtCore/QTimer>
+
+#include <QtGui/QTextDocument>
+#include <QtGui/QX11Info>
+
+#include <KGlobal>
+
+#include <config-X11.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/Xrender.h>
+
+#ifdef HAVE_XFIXES
+# include <X11/extensions/Xfixes.h>
+#endif
+
+#ifdef HAVE_XDAMAGE
+# include <X11/extensions/Xdamage.h>
+#endif
+
+#ifdef HAVE_XCOMPOSITE
+# include <X11/extensions/Xcomposite.h>
+#endif
+
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+#if defined(HAVE_XFIXES) && defined(HAVE_XDAMAGE) && defined(HAVE_XCOMPOSITE)
+struct DamageWatch
+{
+ QWidget *container;
+ Damage damage;
+};
+
+static int damageEventBase;
+static QMap<WId, DamageWatch*> damageWatches;
+static QCoreApplication::EventFilter oldEventFilter;
+
+// Global event filter for intercepting damage events
+static bool x11EventFilter(void *message, long int *result)
+{
+ XEvent *event = reinterpret_cast<XEvent*>(message);
+ if (event->type == damageEventBase + XDamageNotify) {
+ XDamageNotifyEvent *e = reinterpret_cast<XDamageNotifyEvent*>(event);
+ if (DamageWatch *damageWatch = damageWatches.value(e->drawable)) {
+ // Create a new region and empty the damage region into it.
+ // The window is small enough that we don't really care about the region;
+ // we'll just throw it away and schedule a full repaint of the container.
+ XserverRegion region = XFixesCreateRegion(e->display, 0, 0);
+ XDamageSubtract(e->display, e->damage, None, region);
+ XFixesDestroyRegion(e->display, region);
+ damageWatch->container->update();
+ }
+ }
+
+ if (oldEventFilter && oldEventFilter != &x11EventFilter) {
+ return oldEventFilter(message, result);
+ } else {
+ return false;
+ }
+}
+#endif
+
+
+class SelectionManager::Singleton
+{
+public:
+ SelectionManager instance;
+};
+
+K_GLOBAL_STATIC(SelectionManager::Singleton, singleton)
+
+
+struct MessageRequest
+{
+ long messageId;
+ long timeout;
+ long bytesRemaining;
+ QByteArray message;
+};
+
+
+class SelectionManager::Private
+{
+public:
+ Private(SelectionManager *q)
+ : q(q), haveComposite(false)
+ {
+ display = QX11Info::display();
+ selectionAtom = XInternAtom(display, "_NET_SYSTEM_TRAY_S" + QByteArray::number(QX11Info::appScreen()), false);
+ opcodeAtom = XInternAtom(display, "_NET_SYSTEM_TRAY_OPCODE", false);
+ messageAtom = XInternAtom(display, "_NET_SYSTEM_TRAY_MESSAGE_DATA", false);
+ visualAtom = XInternAtom(display, "_NET_SYSTEM_TRAY_VISUAL", false);
+
+#if defined(HAVE_XFIXES) && defined(HAVE_XDAMAGE) && defined(HAVE_XCOMPOSITE)
+ int eventBase, errorBase;
+ bool haveXfixes = XFixesQueryExtension(display, &eventBase, &errorBase);
+ bool haveXdamage = XDamageQueryExtension(display, &damageEventBase, &errorBase);
+ bool haveXComposite = XCompositeQueryExtension(display, &eventBase, &errorBase);
+
+ if (haveXfixes && haveXdamage && haveXComposite) {
+ haveComposite = true;
+ oldEventFilter = QCoreApplication::instance()->setEventFilter(x11EventFilter);
+ }
+#endif
+ }
+
+ void handleRequestDock(const XClientMessageEvent &event);
+ void handleBeginMessage(const XClientMessageEvent &event);
+ void handleMessageData(const XClientMessageEvent &event);
+ void handleCancelMessage(const XClientMessageEvent &event);
+
+ Display *display;
+ Atom selectionAtom;
+ Atom opcodeAtom;
+ Atom messageAtom;
+ Atom visualAtom;
+
+ QHash<WId, MessageRequest> messageRequests;
+ QHash<WId, Task*> tasks;
+
+ SelectionManager *q;
+ bool haveComposite;
+};
+
+
+SelectionManager* SelectionManager::self()
+{
+ return &singleton->instance;
+}
+
+
+SelectionManager::SelectionManager()
+ : d(new SelectionManager::Private(this))
+{
+ // Init the selection later just to ensure that no signals are sent
+ // until after construction is done and the creating object has a
+ // chance to connect.
+ QTimer::singleShot(0, this, SLOT(initSelection()));
+}
+
+
+SelectionManager::~SelectionManager()
+{
+#if defined(HAVE_XFIXES) && defined(HAVE_XDAMAGE) && defined(HAVE_XCOMPOSITE)
+ if (d->haveComposite && QCoreApplication::instance()) {
+ QCoreApplication::instance()->setEventFilter(oldEventFilter);
+ }
+#endif
+ delete d;
+}
+
+
+void SelectionManager::addDamageWatch(QWidget *container, WId client)
+{
+#if defined(HAVE_XFIXES) && defined(HAVE_XDAMAGE) && defined(HAVE_XCOMPOSITE)
+ DamageWatch *damage = new DamageWatch;
+ damage->container = container;
+ damage->damage = XDamageCreate(QX11Info::display(), client, XDamageReportNonEmpty);
+ damageWatches.insert(client, damage);
+#endif
+}
+
+void SelectionManager::removeDamageWatch(QWidget *container)
+{
+#if defined(HAVE_XFIXES) && defined(HAVE_XDAMAGE) && defined(HAVE_XCOMPOSITE)
+ for (QMap<WId, DamageWatch*>::Iterator it = damageWatches.begin(); it != damageWatches.end(); ++it)
+ {
+ DamageWatch *damage = *(it);
+ if (damage->container == container) {
+ XDamageDestroy(QX11Info::display(), damage->damage);
+ damageWatches.erase(it);
+ delete damage;
+ break;
+ }
+ }
+#endif
+}
+
+
+bool SelectionManager::haveComposite() const
+{
+ return d->haveComposite;
+}
+
+
+bool SelectionManager::x11Event(XEvent *event)
+{
+ if (event->type == ClientMessage) {
+ if (event->xclient.message_type == d->opcodeAtom) {
+ switch (event->xclient.data.l[1]) {
+ case SYSTEM_TRAY_REQUEST_DOCK:
+ d->handleRequestDock(event->xclient);
+ return true;
+ case SYSTEM_TRAY_BEGIN_MESSAGE:
+ d->handleBeginMessage(event->xclient);
+ return true;
+ case SYSTEM_TRAY_CANCEL_MESSAGE:
+ d->handleCancelMessage(event->xclient);
+ return true;
+ }
+ } else if (event->xclient.message_type == d->messageAtom) {
+ d->handleMessageData(event->xclient);
+ return true;
+ }
+ }
+
+ return QWidget::x11Event(event);
+}
+
+
+void SelectionManager::initSelection()
+{
+ XSetSelectionOwner(d->display, d->selectionAtom, winId(), CurrentTime);
+
+ WId selectionOwner = XGetSelectionOwner(d->display, d->selectionAtom);
+ if (selectionOwner != winId()) {
+ // FIXME: Hmmm... Reading the docs on XSetSelectionOwner,
+ // this should not be possible.
+ kDebug() << "Tried to set selection owner to" << winId() << "but it is set to" << selectionOwner;
+ return;
+ }
+
+ // Prefer the ARGB32 visual if available
+ int nvi;
+ VisualID visual = XVisualIDFromVisual((Visual*)QX11Info::appVisual());
+ XVisualInfo templ;
+ templ.screen = DefaultScreen(d->display);
+ templ.depth = 32;
+ templ.c_class = TrueColor;
+ XVisualInfo *xvi = XGetVisualInfo(d->display, VisualScreenMask | VisualDepthMask | VisualClassMask,
+ &templ, &nvi);
+ for (int i = 0; i < nvi; i++) {
+ XRenderPictFormat *format = XRenderFindVisualFormat(d->display, xvi[i].visual);
+ if (format->type == PictTypeDirect && format->direct.alphaMask) {
+ visual = xvi[i].visualid;
+ break;
+ }
+ }
+
+ XChangeProperty(d->display, winId(), d->visualAtom, XA_VISUALID, 32,
+ PropModeReplace, (const unsigned char*)&visual, 1);
+
+ WId root = QX11Info::appRootWindow();
+ XClientMessageEvent xev;
+
+ xev.type = ClientMessage;
+ xev.window = root;
+ xev.message_type = XInternAtom(d->display, "MANAGER", false);
+ xev.format = 32;
+ xev.data.l[0] = CurrentTime;
+ xev.data.l[1] = d->selectionAtom;
+ xev.data.l[2] = winId();
+ xev.data.l[3] = 0;
+ xev.data.l[4] = 0;
+
+ XSendEvent(d->display, root, false, StructureNotifyMask, (XEvent*)&xev);
+}
+
+
+void SelectionManager::Private::handleRequestDock(const XClientMessageEvent &event)
+{
+ const WId winId = (WId)event.data.l[2];
+
+ if (tasks.contains(winId)) {
+ kDebug() << "got a dock request from an already existing task";
+ return;
+ }
+
+ Task *task = new Task(winId);
+
+ tasks[winId] = task;
+ q->connect(task, SIGNAL(taskDeleted(WId)), q, SLOT(cleanupTask(WId)));
+
+ emit q->taskCreated(task);
+}
+
+
+void SelectionManager::cleanupTask(WId winId)
+{
+ d->tasks.remove(winId);
+}
+
+
+void SelectionManager::Private::handleBeginMessage(const XClientMessageEvent &event)
+{
+ const WId winId = event.window;
+
+ MessageRequest request;
+ request.messageId = event.data.l[4];
+ request.timeout = event.data.l[2];
+ request.bytesRemaining = event.data.l[3];
+
+ if (request.bytesRemaining) {
+ messageRequests[winId] = request;
+ }
+}
+
+
+void SelectionManager::Private::handleMessageData(const XClientMessageEvent &event)
+{
+ const WId winId = event.window;
+ const char *messageData = event.data.b;
+
+ if (!messageRequests.contains(winId)) {
+ kDebug() << "Unexpected message data from" << winId;
+ return;
+ }
+
+ MessageRequest &request = messageRequests[winId];
+ const int messageSize = qMin(request.bytesRemaining, 20l);
+ request.bytesRemaining -= messageSize;
+ request.message += QByteArray(messageData, messageSize);
+
+ if (request.bytesRemaining == 0) {
+// createNotification(winId);
+ messageRequests.remove(winId);
+ }
+}
+
+void SelectionManager::Private::handleCancelMessage(const XClientMessageEvent &event)
+{
+ const WId winId = event.window;
+ const long messageId = event.data.l[2];
+
+ if (messageRequests.contains(winId) && messageRequests[winId].messageId == messageId) {
+ messageRequests.remove(winId);
+ }
+}
+
+}
+}
--- applets/systemtray/protocols/fdo/x11embedcontainer.cpp
+++ applets/systemtray/protocols/fdo/x11embedcontainer.cpp
@@ -0,0 +1,270 @@
+/***************************************************************************
+ * systemtraywidget.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "x11embedcontainer.h"
+#include "fdoselectionmanager.h"
+
+// KDE
+#include <KDebug>
+
+// Qt
+#include <QtCore/QTimer>
+#include <QtGui/QPainter>
+#include <QtGui/QX11Info>
+
+// Xlib
+#include <config-X11.h>
+
+#include <X11/Xlib.h>
+#include <X11/extensions/Xrender.h>
+
+#ifdef HAVE_XCOMPOSITE
+# include <X11/extensions/Xcomposite.h>
+#endif
+
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+
+class X11EmbedContainer::Private
+{
+public:
+ Private(X11EmbedContainer *q)
+ : q(q),
+ picture(None),
+ updatingBackground(false)
+ {
+ }
+ ~Private()
+ {
+ if (picture) {
+ XRenderFreePicture(QX11Info::display(), picture);
+ }
+ }
+
+ void updateClientBackground();
+ void sendExposeToClient();
+
+ X11EmbedContainer *q;
+
+ XWindowAttributes attr;
+ Picture picture;
+ QImage bgImage;
+ bool updatingBackground;
+};
+
+
+X11EmbedContainer::X11EmbedContainer(QWidget *parent)
+ : QX11EmbedContainer(parent),
+ d(new Private(this))
+{
+ connect(this, SIGNAL(clientIsEmbedded()),
+ this, SLOT(ensureValidSize()));
+}
+
+
+X11EmbedContainer::~X11EmbedContainer()
+{
+ SelectionManager::self()->removeDamageWatch(this);
+ delete d;
+}
+
+
+void X11EmbedContainer::embedSystemTrayClient(WId clientId)
+{
+ Display *display = QX11Info::display();
+
+ if (!XGetWindowAttributes(display, clientId, &d->attr)) {
+ emit error(QX11EmbedContainer::Unknown);
+ return;
+ }
+
+ XSetWindowAttributes sAttr;
+ sAttr.background_pixel = BlackPixel(display, DefaultScreen(display));
+ sAttr.border_pixel = BlackPixel(display, DefaultScreen(display));
+ sAttr.colormap = d->attr.colormap;
+
+ WId parentId = parentWidget() ? parentWidget()->winId() : DefaultRootWindow(display);
+ Window winId = XCreateWindow(display, parentId, 0, 0, d->attr.width, d->attr.height,
+ 0, d->attr.depth, InputOutput, d->attr.visual,
+ CWBackPixel | CWBorderPixel | CWColormap, &sAttr);
+ create(winId);
+
+#if defined(HAVE_XCOMPOSITE) && defined(HAVE_XFIXES) && defined(HAVE_XDAMAGE)
+ XRenderPictFormat *format = XRenderFindVisualFormat(display, d->attr.visual);
+ if (format->type == PictTypeDirect && format->direct.alphaMask &&
+ SelectionManager::self()->haveComposite())
+ {
+ // Redirect ARGB windows to offscreen storage so we can composite them ourselves
+ XRenderPictureAttributes attr;
+ attr.subwindow_mode = IncludeInferiors;
+
+ d->picture = XRenderCreatePicture(display, clientId, format, CPSubwindowMode, &attr);
+ XCompositeRedirectSubwindows(display, winId, CompositeRedirectManual);
+ SelectionManager::self()->addDamageWatch(this, clientId);
+
+ kDebug() << "Embedded client uses an ARGB visual -> compositing.";
+ } else {
+ kDebug() << "Embedded client is not using an ARGB visual.";
+ }
+#endif
+
+ // repeat everything from QX11EmbedContainer's ctor that might be relevant
+ setFocusPolicy(Qt::StrongFocus);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ setAcceptDrops(true);
+ setEnabled(false);
+
+ XSelectInput(display, winId,
+ KeyPressMask | KeyReleaseMask |
+ ButtonPressMask | ButtonReleaseMask | ButtonMotionMask |
+ KeymapStateMask |
+ PointerMotionMask |
+ EnterWindowMask | LeaveWindowMask |
+ FocusChangeMask |
+ ExposureMask |
+ StructureNotifyMask |
+ SubstructureNotifyMask);
+
+ XFlush(display);
+
+ embedClient(clientId);
+
+ // FIXME: This checks that the client is still valid. Qt won't pick it up
+ // if the client closes before embedding completes. However, what happens
+ // if the close happens after this point? Should checks happen on a timer
+ // until embedding completes perhaps?
+ if (!XGetWindowAttributes(QX11Info::display(), clientId, &d->attr)) {
+ emit error(QX11EmbedContainer::Unknown);
+ return;
+ }
+}
+
+
+void X11EmbedContainer::ensureValidSize()
+{
+ QSize s = QSize(qBound(minimumSize().width(), width(), maximumSize().width()),
+ qBound(minimumSize().height(), height(), maximumSize().height()));
+ resize(s);
+}
+
+
+void X11EmbedContainer::paintEvent(QPaintEvent *event)
+{
+ Q_UNUSED(event);
+
+ if (!d->picture) {
+ if (!d->updatingBackground) {
+ QTimer::singleShot(0, this, SLOT(updateBackgroundImage()));
+ }
+ return;
+ }
+
+ // Taking a detour via a QPixmap is unfortunately the only way we can get
+ // the window contents into Qt's backing store.
+ QPixmap pixmap(size());
+ pixmap.fill(Qt::transparent);
+
+ XRenderComposite(x11Info().display(), PictOpSrc, d->picture, None, pixmap.x11PictureHandle(),
+ 0, 0, 0, 0, 0, 0, width(), height());
+
+ QPainter p(this);
+ p.drawPixmap(0, 0, pixmap);
+}
+
+
+void X11EmbedContainer::updateBackgroundImage()
+{
+ QWidget *topWidget = this;
+ while (topWidget->parentWidget()) {
+ topWidget = topWidget->parentWidget();
+ }
+
+ QImage bgImage = QImage(size(), QImage::Format_RGB32);
+
+ d->updatingBackground = true;
+ topWidget->render(&bgImage, QPoint(0, 0), QRect(mapTo(topWidget, QPoint(0, 0)), size()));
+ d->updatingBackground = false;
+
+ // FIXME: The client background isn't painted correctly after a parent
+ // widget is reparented, so currently need to update it all the time.
+ //if (d->bgImage != bgImage) {
+ d->bgImage = bgImage;
+ d->updateClientBackground();
+ //}
+}
+
+
+void X11EmbedContainer::Private::updateClientBackground()
+{
+ if (!q->clientWinId()) {
+ return;
+ }
+
+ QPixmap bgPixmap = QPixmap::fromImage(bgImage);
+
+ Display *display = QX11Info::display();
+ Pixmap bg = XCreatePixmap(display, q->clientWinId(), q->width(), q->height(), attr.depth);
+
+ XRenderPictFormat *format = XRenderFindVisualFormat(display, attr.visual);
+ Picture picture = XRenderCreatePicture(display, bg, format, 0, 0);
+
+ XRenderComposite(display, PictOpSrc, bgPixmap.x11PictureHandle(),
+ None, picture, 0, 0, 0, 0, 0, 0, q->width(), q->height());
+
+ XSetWindowBackgroundPixmap(display, q->clientWinId(), bg);
+
+ XRenderFreePicture(display, picture);
+ XFreePixmap(display, bg);
+
+ sendExposeToClient();
+}
+
+
+void
+X11EmbedContainer::Private::sendExposeToClient()
+{
+ Display *display = QX11Info::display();
+
+ XExposeEvent expose;
+ expose.type = Expose;
+ expose.serial = 0;
+ expose.send_event = True;
+ expose.display = display;
+ expose.window = q->clientWinId();
+ expose.x = 0;
+ expose.y = 0;
+ expose.width = q->width();
+ expose.height = q->height();
+ expose.count = 0;
+
+ XSendEvent(display, q->clientWinId(), True, 0, (XEvent*)&expose);
+}
+
+
+}
+}
+
+#include "x11embedcontainer.moc"
--- applets/systemtray/protocols/fdo/fdotask.cpp
+++ applets/systemtray/protocols/fdo/fdotask.cpp
@@ -0,0 +1,112 @@
+/***************************************************************************
+ * fdotask.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "fdographicswidget.h"
+#include "fdotask.h"
+
+#include <KWindowSystem>
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+
+class Task::Private
+{
+public:
+ Private(WId winId)
+ : winId(winId)
+ {
+ KWindowInfo info = KWindowSystem::windowInfo(winId, NET::WMName, NET::WM2WindowClass);
+
+ // FIXME: This isn't unique
+ typeId = info.windowClassName();
+
+ name = info.name();
+ if (name.isEmpty()) {
+ name = typeId;
+ }
+
+ icon = KWindowSystem::icon(winId);
+ }
+
+ WId winId;
+ QString name;
+ QString typeId;
+ QIcon icon;
+};
+
+
+Task::Task(WId winId)
+ : d(new Private(winId))
+{
+}
+
+
+Task::~Task()
+{
+ emit taskDeleted(d->winId);
+ delete d;
+}
+
+
+bool Task::isEmbeddable() const
+{
+ return associatedWidgets().count() == 0;
+}
+
+
+QString Task::name() const
+{
+ return d->name;
+}
+
+
+QString Task::typeId() const
+{
+ return d->typeId;
+}
+
+
+QIcon Task::icon() const
+{
+ return d->icon;
+}
+
+
+QGraphicsWidget* Task::createWidget(Plasma::Applet *applet)
+{
+ Q_UNUSED(applet)
+
+ QGraphicsWidget *widget = new GraphicsWidget(d->winId);
+ connect(widget, SIGNAL(clientClosed()),
+ this, SLOT(deleteLater()));
+ return widget;
+}
+
+
+}
+}
+
+
+#include "fdotask.moc"
--- applets/systemtray/protocols/fdo/fdographicswidget.cpp
+++ applets/systemtray/protocols/fdo/fdographicswidget.cpp
@@ -0,0 +1,188 @@
+/***************************************************************************
+ * fdographicswidget.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "fdographicswidget.h"
+#include "x11embeddelegate.h"
+#include "x11embedcontainer.h"
+
+#include <QtCore/QPointer>
+
+#include <QtGui/QApplication>
+#include <QtGui/QGraphicsView>
+
+#include <plasma/theme.h>
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+
+class GraphicsWidget::Private
+{
+public:
+ Private()
+ : clientEmbedded(false)
+ {
+ }
+
+ ~Private()
+ {
+ delete widget;
+ }
+
+ WId winId;
+ bool clientEmbedded;
+ QPointer<X11EmbedDelegate> widget;
+};
+
+
+GraphicsWidget::GraphicsWidget(WId winId)
+ : d(new GraphicsWidget::Private())
+{
+ d->winId = winId;
+
+ setMinimumSize(22, 22);
+ setMaximumSize(22, 22);
+ resize(22, 22);
+
+ setCacheMode(QGraphicsItem::NoCache);
+
+ connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()),
+ this, SLOT(updateWidgetBackground()));
+}
+
+
+GraphicsWidget::~GraphicsWidget()
+{
+ delete d;
+}
+
+
+void GraphicsWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *parentWidget)
+{
+ QGraphicsWidget::paint(painter, option, parentWidget);
+
+ QGraphicsView *parentView = 0;
+ foreach (QGraphicsView *view, scene()->views()) {
+ if (view->isVisible() && view->sceneRect().intersects(sceneBoundingRect())) {
+ parentView = view;
+ }
+ }
+
+ if (!parentView) {
+ return;
+ }
+
+ if (!d->widget) {
+#if QT_VERSION < 0x040401
+ const Qt::ApplicationAttribute attr = (Qt::ApplicationAttribute)4;
+#else
+ const Qt::ApplicationAttribute attr = Qt::AA_DontCreateNativeWidgetSiblings;
+#endif
+ if (!QApplication::testAttribute(attr)) {
+ QApplication::setAttribute(attr);
+ }
+
+ d->widget = new X11EmbedDelegate();
+ d->widget->setMinimumSize(22, 22);
+ d->widget->setMaximumSize(22, 22);
+ d->widget->resize(22, 22);
+
+ connect(d->widget->container(), SIGNAL(clientIsEmbedded()),
+ this, SLOT(handleClientEmbedded()));
+ connect(d->widget->container(), SIGNAL(clientClosed()),
+ this, SLOT(handleClientClosed()));
+ connect(d->widget->container(), SIGNAL(error(QX11EmbedContainer::Error)),
+ this, SLOT(handleClientError(QX11EmbedContainer::Error)));
+
+ d->widget->container()->embedSystemTrayClient(d->winId);
+
+ return;
+
+ } else if (!d->clientEmbedded) {
+ return;
+ }
+
+ if (d->widget->parentWidget() != parentView) {
+ kDebug() << "embedding into" << parentView->metaObject()->className() << "(" << d->winId << ")";
+ d->widget->setParent(parentView);
+ }
+
+ QPoint pos = parentView->mapFromScene(scenePos());
+ if (d->widget->pos() != pos) {
+ d->widget->move(pos);
+ }
+
+ if (!d->widget->isVisible()) {
+ d->widget->show();
+ }
+
+ if (parentView->childAt(pos) != d->widget->container()) {
+ d->widget->raise();
+ }
+}
+
+
+void GraphicsWidget::updateWidgetBackground()
+{
+ if (!d->widget) {
+ return;
+ }
+
+ QPalette palette = d->widget->palette();
+ palette.setBrush(QPalette::Window, Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor));
+ d->widget->setPalette(palette);
+ d->widget->setBackgroundRole(QPalette::Window);
+}
+
+
+void GraphicsWidget::handleClientEmbedded()
+{
+ kDebug() << "client embedded (" << d->winId << ")";
+
+ d->clientEmbedded = true;
+ update();
+}
+
+
+void GraphicsWidget::handleClientClosed()
+{
+ emit clientClosed();
+ kDebug() << "client closed (" << d->winId << ")";
+}
+
+
+void GraphicsWidget::handleClientError(QX11EmbedContainer::Error error)
+{
+ Q_UNUSED(error);
+
+ kDebug() << "client error (" << d->winId << ")";
+ emit clientClosed();
+}
+
+
+}
+}
+
+
+#include "fdographicswidget.moc"
--- applets/systemtray/protocols/fdo/fdotaskprotocol.cpp
+++ applets/systemtray/protocols/fdo/fdotaskprotocol.cpp
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * fdoprotocol.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "fdotaskprotocol.h"
+
+#include "fdoselectionmanager.h"
+
+
+namespace SystemTray
+{
+namespace FDO
+{
+
+
+class TaskProtocol::Private
+{
+public:
+};
+
+
+TaskProtocol::TaskProtocol(QObject *parent)
+ : SystemTray::TaskProtocol(parent),
+ d(new TaskProtocol::Private)
+{
+}
+
+
+TaskProtocol::~TaskProtocol()
+{
+ delete d;
+}
+
+
+void TaskProtocol::init()
+{
+ connect(SelectionManager::self(), SIGNAL(taskCreated(SystemTray::Task*)),
+ this, SIGNAL(taskCreated(SystemTray::Task*)));
+}
+
+
+}
+}
+
+
+#include "fdotaskprotocol.moc"
--- applets/systemtray/protocols/plasmoid/plasmoidtask.h
+++ applets/systemtray/protocols/plasmoid/plasmoidtask.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+ * plasmoidtask.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * Copyright (C) 2008 Sebastian Kügler <sebas@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 PLASMOIDTASK_H
+#define PLASMOIDTASK_H
+
+#include "../../core/task.h"
+
+
+namespace SystemTray
+{
+namespace Plasmoid
+{
+
+class Task : public SystemTray::Task
+{
+ Q_OBJECT
+
+public:
+ Task(QString appletName);
+ virtual ~Task();
+
+ bool isValid() const;
+ virtual bool isEmbeddable() const;
+ virtual QString name() const;
+ virtual QString typeId() const;
+ virtual QIcon icon() const;
+
+signals:
+ void taskDeleted(QString typeId);
+
+protected:
+ virtual QGraphicsWidget* createWidget(Plasma::Applet *applet);
+
+private:
+ class Private;
+ Private* const d;
+};
+
+
+}
+}
+
+#endif
--- applets/systemtray/protocols/plasmoid/plasmoidtaskprotocol.h
+++ applets/systemtray/protocols/plasmoid/plasmoidtaskprotocol.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ * plasmoidprotocol.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * Copyright (C) 2008 Sebastian Kügler <sebas@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 PLASMOIDTASKPROTOCOL_H
+#define PLASMOIDTASKPROTOCOL_H
+
+#include "../../core/taskprotocol.h"
+
+
+namespace SystemTray
+{
+namespace Plasmoid
+{
+
+class TaskProtocol : public SystemTray::TaskProtocol
+{
+ Q_OBJECT
+
+public:
+ TaskProtocol(QObject *parent);
+ ~TaskProtocol();
+
+ void init();
+
+private slots:
+ void cleanupTask(QString typeId);
+ void newTask(QString appletName);
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+}
+
+
+#endif
--- applets/systemtray/protocols/plasmoid/plasmoidtask.cpp
+++ applets/systemtray/protocols/plasmoid/plasmoidtask.cpp
@@ -0,0 +1,135 @@
+/***************************************************************************
+ * plasmoidtask.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * Copyright (C) 2008 Sebastian Kügler <sebas@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 "plasmoidtask.h"
+#include <fixx11h.h>
+
+#include <plasma/applet.h>
+
+
+namespace SystemTray
+{
+namespace Plasmoid
+{
+
+
+class Task::Private
+{
+public:
+ Private(QString name, Task *q)
+ : q(q),
+ name(name),
+ typeId(name),
+ applet(0)
+ {
+ if (!name.isEmpty()) {
+ setupApplet();
+ }
+ }
+
+ void setupApplet();
+
+ Task *q;
+ QString name;
+ QString typeId;
+ QIcon icon;
+ Plasma::Applet *applet;
+};
+
+
+Task::Task(QString appletname)
+ : d(new Private(appletname, this))
+{
+}
+
+
+Task::~Task()
+{
+ emit taskDeleted(d->typeId);
+ delete d;
+}
+
+
+bool Task::isEmbeddable() const
+{
+ return d->applet != 0;
+}
+
+bool Task::isValid() const
+{
+ return !d->name.isEmpty();
+}
+
+QString Task::name() const
+{
+ return d->name;
+}
+
+
+QString Task::typeId() const
+{
+ return d->typeId;
+}
+
+
+QIcon Task::icon() const
+{
+ return d->icon;
+}
+
+
+QGraphicsWidget* Task::createWidget(Plasma::Applet *host)
+{
+ Q_UNUSED(host)
+ return static_cast<QGraphicsWidget*>(d->applet);
+}
+
+
+void Task::Private::setupApplet()
+{
+ applet = Plasma::Applet::load(name);
+
+ if (!applet) {
+ kDebug() << "Could not load applet" << name;
+ name = QString();
+ return;
+ }
+
+ applet->setParent(q);
+ applet->setFlag(QGraphicsItem::ItemIsMovable, false);
+
+ //connect(applet, SIGNAL(destroyed(QObject*)), this, SLOT(appletDestroyed(QObject*)));
+ applet->init();
+ applet->setBackgroundHints(Plasma::Applet::NoBackground);
+
+ // TODO: We'll need the preferred item size here
+ // The applet does need a size, otherwise it won't show up correctly.
+ applet->setMinimumSize(22, 22);
+ kDebug() << applet->name() << " Applet loaded";
+}
+
+
+}
+}
+
+
+#include "plasmoidtask.moc"
--- applets/systemtray/protocols/plasmoid/plasmoidtaskprotocol.cpp
+++ applets/systemtray/protocols/plasmoid/plasmoidtaskprotocol.cpp
@@ -0,0 +1,100 @@
+/***************************************************************************
+ * plasmoidprotocol.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * Copyright (C) 2008 Sebastian Kügler <sebas@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 "plasmoidtask.h"
+#include "plasmoidtaskprotocol.h"
+
+#include <KDebug>
+
+#include <QtCore/QHash>
+
+
+namespace SystemTray
+{
+namespace Plasmoid
+{
+
+
+class TaskProtocol::Private
+{
+public:
+ QHash<QString, Task*> tasks;
+};
+
+
+TaskProtocol::TaskProtocol(QObject *parent)
+ : SystemTray::TaskProtocol(parent),
+ d(new TaskProtocol::Private)
+{
+}
+
+
+TaskProtocol::~TaskProtocol()
+{
+ delete d;
+}
+
+
+void TaskProtocol::init()
+{
+ // TODO: Load plasmoids from config
+ //newTask("battery");
+ //newTask("notify");
+ //newTask("kuiserver");
+ //newTask("mid_control");
+}
+
+
+void TaskProtocol::newTask(QString appletName)
+{
+ if (d->tasks.contains(appletName)) {
+ kDebug() << "Task " << appletName << "is already in here.";
+ return;
+ }
+
+ kDebug() << "Registering task with the manager" << appletName;
+ Task *task = new Task(appletName);
+
+ if (!task->isValid()) {
+ // we failed to load our applet *sob*
+ delete task;
+ return;
+ }
+
+ d->tasks[appletName] = task;
+ connect(task, SIGNAL(taskDeleted(QString)), this, SLOT(cleanupTask(QString)));
+ emit taskCreated(task);
+}
+
+
+void TaskProtocol::cleanupTask(QString typeId)
+{
+ kDebug() << "task with typeId" << typeId << "removed";
+ d->tasks.remove(typeId);
+}
+
+
+}
+}
+
+
+#include "plasmoidtaskprotocol.moc"
--- applets/systemtray/core/manager.h
+++ applets/systemtray/core/manager.h
@@ -0,0 +1,83 @@
+/***************************************************************************
+ * manager.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 SYSTEMTRAYMANAGER_H
+#define SYSTEMTRAYMANAGER_H
+
+#include <QtCore/QObject>
+
+namespace SystemTray
+{
+ class Task;
+
+/**
+ * @short Creator and amalgamator of the supported system tray specifications
+ **/
+class Manager : public QObject
+{
+ Q_OBJECT
+
+public:
+ class Singleton;
+
+ /**
+ * @return the global Manager instance
+ **/
+ static Manager* self();
+
+ /**
+ * @return a list of all known Task instances
+ **/
+ QList<Task*> tasks() const;
+
+signals:
+ /**
+ * Emitted when a new task has been added
+ **/
+ void taskAdded(SystemTray::Task *task);
+
+ /**
+ * Emitted when something about a task changes (such as it changing from
+ * non-embeddable to embeddable)
+ **/
+ void taskChanged(SystemTray::Task *task);
+
+ /**
+ * Emitted when a task has been removed
+ **/
+ void taskRemoved(SystemTray::Task *task);
+
+private slots:
+ void addTask(SystemTray::Task *task);
+ void removeTask(SystemTray::Task *task);
+
+private:
+ Manager();
+ ~Manager();
+
+ class Private;
+ Private* const d;
+};
+
+}
+
+
+#endif
--- applets/systemtray/core/task.cpp
+++ applets/systemtray/core/task.cpp
@@ -0,0 +1,84 @@
+/***************************************************************************
+ * task.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "task.h"
+
+#include <QtGui/QGraphicsWidget>
+
+
+namespace SystemTray
+{
+
+
+class Task::Private
+{
+public:
+ QList<QGraphicsWidget*> associatedWidgets;
+};
+
+
+Task::Task()
+ : d(new Private)
+{
+}
+
+
+Task::~Task()
+{
+ emit destroyed(this);
+ delete d;
+}
+
+
+QGraphicsWidget* Task::widget(Plasma::Applet *host)
+{
+ Q_ASSERT(host);
+
+ QGraphicsWidget *widget;
+ widget = createWidget(host);
+ d->associatedWidgets.append(widget);
+ connect(widget, SIGNAL(destroyed()), this, SLOT(widgetDeleted()));
+ connect(this, SIGNAL(destroyed()), widget, SLOT(deleteLater()));
+
+ return widget;
+}
+
+
+void Task::widgetDeleted()
+{
+ bool wasEmbeddable = isEmbeddable();
+ d->associatedWidgets.removeAll(static_cast<QGraphicsWidget*>(sender()));
+ if (!wasEmbeddable && isEmbeddable()) {
+ emit changed(this);
+ }
+}
+
+
+QList<QGraphicsWidget*> Task::associatedWidgets() const
+{
+ return d->associatedWidgets;
+}
+
+
+}
+
+
+#include "task.moc"
--- applets/systemtray/core/taskprotocol.cpp
+++ applets/systemtray/core/taskprotocol.cpp
@@ -0,0 +1,38 @@
+/***************************************************************************
+ * taskprotocol.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "taskprotocol.h"
+
+
+namespace SystemTray
+{
+
+
+TaskProtocol::TaskProtocol(QObject *parent)
+ : QObject(parent)
+{
+}
+
+
+}
+
+
+#include "taskprotocol.moc"
--- applets/systemtray/core/task.h
+++ applets/systemtray/core/task.h
@@ -0,0 +1,129 @@
+/***************************************************************************
+ * task.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 SYSTEMTRAYTASK_H
+#define SYSTEMTRAYTASK_H
+
+#include <QtCore/QObject>
+
+#include <QtGui/QIcon>
+
+class QGraphicsWidget;
+
+namespace Plasma
+{
+ class Applet;
+} // namespace Plasma
+
+namespace SystemTray
+{
+
+/**
+ * @short System tray task base class
+ *
+ * To support a new system tray protocol, Protocol and this class should
+ * be subclassed.
+ **/
+class Task : public QObject
+{
+ Q_OBJECT
+
+public:
+ virtual ~Task();
+
+ /**
+ * Creates a new graphics widget for this task
+ *
+ * isEmbeddable() should be checked before creating a new widget.
+ **/
+ QGraphicsWidget* widget(Plasma::Applet *host);
+
+ /**
+ * Returns the current list of graphics widgets that have been created
+ * for this task and have not yet been deleted
+ **/
+ QList<QGraphicsWidget*> associatedWidgets() const;
+
+ /**
+ * Returns whether this task can be embeddable
+ *
+ * Depending on the protocol, there may be circumstances under which
+ * a new widget can not be created. isEmbeddable() will return false
+ * under these circumstances.
+ **/
+ virtual bool isEmbeddable() const = 0;
+
+ /**
+ * Returns the name of this task that should be presented to the user
+ **/
+ virtual QString name() const = 0;
+
+ /**
+ * Returns a unique identifier for this task
+ *
+ * The identifier is valid between restarts and so is safe to save
+ **/
+ virtual QString typeId() const = 0;
+
+ /**
+ * Returns an icon that can be associated with this task
+ *
+ * The icon returned is not necessarily the same icon that appears
+ * in the tray icon itself.
+ **/
+ virtual QIcon icon() const = 0;
+
+signals:
+ /**
+ * Emitted when something about the task has changed
+ **/
+ void changed(SystemTray::Task *task = 0);
+
+ /**
+ * Emitted when the task is about to be destroyed
+ **/
+ void destroyed(SystemTray::Task *task = 0);
+
+protected:
+ Task();
+
+ /**
+ * Called when a new widget is required
+ *
+ * Subclasses should implement this to return a graphics widget that
+ * handles all user interaction with the task. Ownership of the
+ * created widget is handled automatically so subclasses should not
+ * delete the created widget.
+ **/
+ virtual QGraphicsWidget* createWidget(Plasma::Applet *host) = 0;
+
+private slots:
+ void widgetDeleted();
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+
+
+#endif
--- applets/systemtray/core/taskprotocol.h
+++ applets/systemtray/core/taskprotocol.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * taskprotocol.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 SYSTEMTRAYTASKPROTOCOL_H
+#define SYSTEMTRAYTASKPROTOCOL_H
+
+#include <QtCore/QObject>
+
+namespace SystemTray
+{
+ class Task;
+}
+
+
+namespace SystemTray
+{
+
+/**
+ * @short System tray protocol base class
+ *
+ * To support a new system tray protocol, this class and Task should be
+ * subclassed and the subclass of this class registered with the global
+ * Manager. The Protocol subclass should emit taskCreated() for each new
+ * task created.
+ **/
+class TaskProtocol : public QObject
+{
+ Q_OBJECT
+public:
+ explicit TaskProtocol(QObject *parent = 0);
+ virtual void init() = 0;
+
+signals:
+ /**
+ * Signals that a new task has been created
+ **/
+ void taskCreated(SystemTray::Task *task);
+};
+
+}
+
+
+#endif
--- applets/systemtray/core/manager.cpp
+++ applets/systemtray/core/manager.cpp
@@ -0,0 +1,117 @@
+/***************************************************************************
+ * manager.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "manager.h"
+
+#include <KGlobal>
+
+#include <plasma/applet.h>
+
+#include "task.h"
+#include "taskprotocol.h"
+
+#include "../protocols/fdo/fdotaskprotocol.h"
+#include "../protocols/plasmoid/plasmoidtaskprotocol.h"
+
+namespace SystemTray
+{
+
+
+class Manager::Singleton
+{
+public:
+ Manager instance;
+};
+
+K_GLOBAL_STATIC(Manager::Singleton, singleton)
+
+
+class Manager::Private
+{
+public:
+ Private(Manager *manager)
+ : q(manager)
+ {
+ registerTaskProtocol(new Plasmoid::TaskProtocol(q));
+ registerTaskProtocol(new FDO::TaskProtocol(q));
+ }
+
+ void registerTaskProtocol(TaskProtocol *protocol);
+
+ Manager *q;
+ QList<Task*> tasks;
+};
+
+
+Manager* Manager::self()
+{
+ return &singleton->instance;
+}
+
+Manager::Manager()
+ : d(new Private(this))
+{
+}
+
+Manager::~Manager()
+{
+ delete d;
+}
+
+
+QList<Task*> Manager::tasks() const
+{
+ return d->tasks;
+}
+
+
+void Manager::Private::registerTaskProtocol(TaskProtocol *protocol)
+{
+ connect(protocol, SIGNAL(taskCreated(SystemTray::Task*)),
+ q, SLOT(addTask(SystemTray::Task*)));
+ protocol->init();
+}
+
+
+void Manager::addTask(Task *task)
+{
+ connect(task, SIGNAL(destroyed(SystemTray::Task*)),
+ this, SLOT(removeTask(SystemTray::Task*)));
+ connect(task, SIGNAL(changed(SystemTray::Task*)),
+ this, SIGNAL(taskChanged(SystemTray::Task*)));
+
+ kDebug() << task->name() << "(" << task->typeId() << ")";
+
+ d->tasks.append(task);
+ emit taskAdded(task);
+}
+
+
+void Manager::removeTask(Task *task)
+{
+ d->tasks.removeAll(task);
+ emit taskRemoved(task);
+}
+
+}
+
+
+#include "manager.moc"
--- applets/systemtray/plasma-applet-systemtray.desktop
+++ applets/systemtray/plasma-applet-systemtray.desktop
@@ -1,8 +1,9 @@
[Desktop Entry]
-
Name=System Tray
Name[af]=Stelsellaai
+Name[ar]=صينية النظام
Name[be]=Сістэмны трэй
+Name[be@latin]=Systemny trej
Name[bg]=Системен панел
Name[bn]=সিস্টেম ট্রে
Name[bn_IN]=সিস্টেম ট্রে
@@ -35,6 +36,7 @@
Name[ka]=სისტემური პანელი
Name[kk]=Жүйелік сөре
Name[km]=ថាសប្រព័ន្ធ
+Name[kn]=ವ್ಯವಸ್ಥಾ ಖಾನೆ (ಟ್ರೇ)
Name[ko]=시스템 트레이
Name[lt]=Sistemos dėklas
Name[lv]=Sistēmas ikonu josla
@@ -70,6 +72,25 @@
Name[xh]=Itreyi Yendlela yokusebenza
Name[zh_CN]=系统托盘
Name[zh_TW]=系統匣
+Comment=Access hidden applications minimized in the system tray
+Comment[be@latin]=Dostup da schavanych u systemnym trei aplikacyjaŭ
+Comment[el]=Πρόσβαση κρυφών εφαρμογών ελαχιστοποιημένων στο πλαίσιο συστήματος
+Comment[et]=Süsteemsesse salve minimeeritud peidetud rakenduste kasutamine
+Comment[gl]=Acede a programa ocultos minimizados na bandexa do sistema
+Comment[kk]=Жүйелік сөреге түйілген жасырын қолданбаларға қатынау
+Comment[km]=ចូលដំណើរការកម្មវិធីដែលលាក់ដែលបានបង្រួមនៅក្នុងថាសប្រព័ន្ធ
+Comment[kn]=ವ್ಯವಸ್ಥಾ ಖಾನೆಯಲ್ಲಿ (ಟ್ರೇ) ಕನಿಷ್ಠೀಕರಿಸಲಾದ ಅಡಗಿಸಲಾದ ಅನ್ವಯಗಳನ್ನು ನಿಲುಕಿಸಿಕೋ
+Comment[nb]=Få tilgang til skjulte programmer som er minimert i systemkurven
+Comment[nds]=Togriep op op versteken Programmen in den Systeemafsnitt
+Comment[pt]=Aceder às aplicações escondidas e minimizadas na bandeja do sistema
+Comment[pt_BR]=Aceder às aplicações escondidas e minimizadas na bandeja do sistema
+Comment[sl]=Dostopajte do skritih programov, pomanjšanih v sistemsko vrstico
+Comment[sv]=Kom åt dolda program minimerade i systembrickan
+Comment[tr]=Sistem çekmecesine küçültülen uygulamalara erişin
+Comment[uk]=Доступ до прихованих програму, мінімізованих до системного лотка
+Comment[x-test]=xxAccess hidden applications minimized in the system trayxx
+Comment[zh_TW]=存取最小化在系統匣內的隱藏應用程式
+# Icon=systemtray //TODO: fix icon
Type=Service
X-KDE-ServiceTypes=Plasma/Applet
@@ -78,9 +99,8 @@
X-KDE-PluginInfo-Email=rodin.alexander@gmail.com
X-KDE-PluginInfo-Name=systemtray
X-KDE-PluginInfo-Version=pre0.1
-X-KDE-PluginInfo-Website=http://plasma.kde.org
+X-KDE-PluginInfo-Website=http://plasma.kde.org/
X-KDE-PluginInfo-Category=Windows and Tasks
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL v2+
X-KDE-PluginInfo-EnabledByDefault=true
-
--- applets/systemtray/CMakeLists.txt
+++ applets/systemtray/CMakeLists.txt
@@ -1,13 +1,31 @@
project(plasma-systemtray)
set(systemtray_SRCS
- systemtray.cpp
- systemtraycontainer.cpp
- systemtraywidget.cpp)
+ core/manager.cpp
+ core/taskprotocol.cpp
+ core/task.cpp
+
+ protocols/fdo/fdotaskprotocol.cpp
+ protocols/fdo/fdotask.cpp
+ protocols/fdo/fdographicswidget.cpp
+ protocols/fdo/fdoselectionmanager.cpp
+ protocols/fdo/x11embedcontainer.cpp
+ protocols/fdo/x11embeddelegate.cpp
+
+ protocols/plasmoid/plasmoidtaskprotocol.cpp
+ protocols/plasmoid/plasmoidtask.cpp
+
+ ui/applet.cpp
+ ui/compactlayout.cpp
+ ui/taskarea.cpp
+
+ )
+
kde4_add_plugin(plasma_applet_systemtray ${systemtray_SRCS})
-target_link_libraries(plasma_applet_systemtray ${KDE4_KDEUI_LIBS} plasma ${X11_LIBRARIES})
+include_directories(${CMAKE_SOURCE_DIR})
+target_link_libraries(plasma_applet_systemtray ${KDE4_KDEUI_LIBS} plasma ${X11_LIBRARIES} ${X11_Xrender_LIB}
+ ${X11_Xfixes_LIB} ${X11_Xdamage_LIB} ${X11_Xcomposite_LIB})
install(TARGETS plasma_applet_systemtray DESTINATION ${PLUGIN_INSTALL_DIR})
install(FILES plasma-applet-systemtray.desktop DESTINATION ${SERVICES_INSTALL_DIR})
-
--- applets/systemtray/ui/taskarea.h
+++ applets/systemtray/ui/taskarea.h
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * taskarea.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 TASKAREA_H
+#define TASKAREA_H
+
+#include <QGraphicsWidget>
+
+namespace Plasma
+{
+ class Applet;
+} // namespace Plasma
+
+namespace SystemTray
+{
+
+class Task;
+
+class TaskArea : public QGraphicsWidget
+{
+ Q_OBJECT
+
+public:
+ TaskArea(Plasma::Applet *parent);
+ ~TaskArea();
+
+ void setHiddenTypes(const QStringList &hiddenTypes);
+ bool isHiddenType(const QString &typeId) const;
+ void syncTasks(const QList<SystemTray::Task*> &tasks);
+
+public slots:
+ void addTask(SystemTray::Task *task);
+ void removeTask(SystemTray::Task *task);
+
+signals:
+ void sizeHintChanged(Qt::SizeHint which);
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+
+
+#endif
--- applets/systemtray/ui/compactlayout.cpp
+++ applets/systemtray/ui/compactlayout.cpp
@@ -0,0 +1,347 @@
+/***************************************************************************
+ * compactlayout.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "compactlayout.h"
+
+#include <QtCore/QHash>
+
+#include <QtGui/QGraphicsWidget>
+
+
+namespace SystemTray
+{
+
+
+class CompactLayout::Private
+{
+public:
+ Private(CompactLayout *q)
+ : q(q),
+ spacing(4.0)
+ {
+ }
+
+ QHash<QGraphicsLayoutItem*, QRectF> calculateGeometries(Qt::SizeHint which,
+ const QSizeF &constraint) const;
+ void addPadding(QHash<QGraphicsLayoutItem*, QRectF> &geometries,
+ const QSizeF &constraint);
+ QSizeF hackedConstraint(const QSizeF &constraint) const;
+ void updateParentWidget(QGraphicsWidget *item);
+ QRectF boundingRect(const QList<QRectF> &rects) const;
+
+ CompactLayout *q;
+ qreal spacing;
+ QList<QGraphicsLayoutItem*> items;
+};
+
+
+CompactLayout::CompactLayout(QGraphicsLayoutItem *parent)
+ : QGraphicsLayout(parent),
+ d(new Private(this))
+{
+}
+
+
+CompactLayout::~CompactLayout()
+{
+ delete d;
+}
+
+
+qreal CompactLayout::spacing() const
+{
+ return d->spacing;
+}
+
+
+void CompactLayout::setSpacing(qreal spacing)
+{
+ d->spacing = spacing;
+}
+
+
+void CompactLayout::addItem(QGraphicsLayout *item)
+{
+ item->setParentLayoutItem(this);
+ d->items.append(item);
+
+ updateGeometry();
+ activate();
+}
+
+
+void CompactLayout::addItem(QGraphicsWidget *item)
+{
+ item->setParentLayoutItem(this);
+ d->updateParentWidget(item);
+
+ d->items.append(item);
+
+ updateGeometry();
+ activate();
+}
+
+
+void CompactLayout::Private::updateParentWidget(QGraphicsWidget *item)
+{
+ QGraphicsLayoutItem *parentItem = q->parentLayoutItem();
+ while (parentItem && parentItem->isLayout()) {
+ parentItem = parentItem->parentLayoutItem();
+ }
+
+ if (parentItem) {
+ item->setParentItem(static_cast<QGraphicsWidget*>(parentItem));
+ }
+}
+
+
+void CompactLayout::removeItem(QGraphicsLayoutItem *item)
+{
+ d->items.removeAll(item);
+
+ updateGeometry();
+ activate();
+}
+
+
+bool CompactLayout::containsItem(QGraphicsLayoutItem *item) const
+{
+ return d->items.contains(item);
+}
+
+
+int CompactLayout::count() const
+{
+ return d->items.count();
+}
+
+
+void CompactLayout::setGeometry(const QRectF &rect)
+{
+ QHash<QGraphicsLayoutItem*, QRectF> geometries;
+ geometries = d->calculateGeometries(Qt::PreferredSize, rect.size());
+ d->addPadding(geometries, rect.size());
+
+ QHashIterator<QGraphicsLayoutItem*, QRectF> i(geometries);
+ while (i.hasNext()) {
+ i.next();
+ QGraphicsLayoutItem *item = i.key();
+ item->setGeometry(i.value());
+ }
+}
+
+
+void CompactLayout::Private::addPadding(QHash<QGraphicsLayoutItem*, QRectF> &geometries, const QSizeF &constraint)
+{
+ QSizeF size = boundingRect(geometries.values()).size();
+
+ qreal xAdjustment = (constraint.width() - size.width()) / 2.0;
+ qreal yAdjustment = (constraint.height() - size.height()) / 2.0;
+
+ if (xAdjustment || yAdjustment) {
+ foreach (QGraphicsLayoutItem *item, items) {
+ geometries[item].moveLeft(geometries[item].left() + xAdjustment);
+ geometries[item].moveTop(geometries[item].top() + yAdjustment);
+ }
+ }
+}
+
+
+QGraphicsLayoutItem* CompactLayout::itemAt(int index) const
+{
+ return d->items.at(index);
+}
+
+
+void CompactLayout::removeAt(int index)
+{
+ d->items.removeAt(index);
+}
+
+
+QSizeF CompactLayout::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
+{
+ if (which != Qt::PreferredSize) {
+ return QSizeF();
+ }
+
+ QHash<QGraphicsLayoutItem*, QRectF> geometries =
+ d->calculateGeometries(which, d->hackedConstraint(constraint));
+
+ return d->boundingRect(geometries.values()).size();
+}
+
+
+QRectF CompactLayout::Private::boundingRect(const QList<QRectF> &rects) const
+{
+ QRectF boundingRect;
+
+ foreach (const QRectF &rect, rects) {
+ if (boundingRect.isNull()) {
+ boundingRect = rect;
+ } else {
+ boundingRect = boundingRect.united(rect);
+ }
+ }
+
+ return boundingRect;
+}
+
+
+QHash<QGraphicsLayoutItem*, QRectF> CompactLayout::Private::calculateGeometries(Qt::SizeHint which, const QSizeF &constraint) const
+{
+ QSizePolicy sizePolicy = q->parentLayoutItem()->sizePolicy();
+
+ QHash<QGraphicsLayoutItem*, QRectF> geometries;
+ QList<qreal> xPositions;
+ QList<qreal> yPositions;
+
+ xPositions << 0.0;
+ yPositions << 0.0;
+
+ foreach (QGraphicsLayoutItem *item, items) {
+ QRectF rect;
+ rect.setSize(item->effectiveSizeHint(which));
+
+ // Strictly speaking, this should check the item's minimum width/height
+ // but in practice, doing so will lead to a worse visual result.
+ rect.setWidth(qMin(rect.width(), constraint.width()));
+ rect.setHeight(qMin(rect.height(), constraint.height()));
+
+ // Try to find an empty space for the item within the bounds
+ // of the already positioned out items
+ foreach (qreal x, xPositions) {
+ rect.moveLeft(x);
+ if (rect.right() >= xPositions.last()) {
+ continue;
+ }
+
+ foreach (qreal y, yPositions) {
+ rect.moveTop(y);
+ if (rect.bottom() >= yPositions.last()) {
+ continue;
+ }
+
+ bool overlapping = false;
+ foreach (const QRectF &existingRect, geometries) {
+ if (existingRect.intersects(rect)) {
+ overlapping = true;
+ }
+ }
+
+ if (!overlapping) {
+ goto positioning_done;
+ }
+ }
+ }
+
+ // It didn't fit anywhere, so the current bounds will need to
+ // be extended.
+ Qt::Orientation direction;
+
+ // Extend based on constraints
+ if (yPositions.last() + rect.height() > constraint.height()) {
+ direction = Qt::Horizontal;
+ } else if (xPositions.last() + rect.width() > constraint.width()) {
+ direction = Qt::Vertical;
+ // Then extend based on expanding policy
+ } else if (sizePolicy.horizontalPolicy() & QSizePolicy::ExpandFlag) {
+ direction = Qt::Horizontal;
+ } else if (sizePolicy.verticalPolicy() & QSizePolicy::ExpandFlag) {
+ direction = Qt::Vertical;
+ // Otherwise try to keep the shape of a square
+ } else if (yPositions.last() >= xPositions.last()) {
+ direction = Qt::Horizontal;
+ } else {
+ direction = Qt::Vertical;
+ }
+
+ if (direction == Qt::Horizontal) {
+ rect.moveTop(yPositions.first());
+ rect.moveLeft(xPositions.last());
+ } else {
+ rect.moveLeft(xPositions.first());
+ rect.moveTop(yPositions.last());
+ }
+
+ positioning_done:
+ if (!xPositions.contains(rect.right() + spacing)) {
+ xPositions.append(rect.right() + spacing);
+ qSort(xPositions);
+ }
+
+ if (!yPositions.contains(rect.bottom() + spacing)) {
+ yPositions.append(rect.bottom() + spacing);
+ qSort(yPositions);
+ }
+
+ geometries[item] = rect;
+ }
+
+ return geometries;
+}
+
+
+QSizeF CompactLayout::Private::hackedConstraint(const QSizeF &constraint) const
+{
+ // Qt doesn't seem to ever specify constraints to sizeHint()
+ // but the layout needs to know what the constraints are.
+ // This function returns a new constraint with the size of
+ // the containing view when Qt hasn't passed a constraint.
+
+ if (constraint.width() != -1 || constraint.height() != -1) {
+ return constraint;
+ }
+
+ const QGraphicsWidget *widget = 0;
+ const QGraphicsLayoutItem *item = q;
+
+ while (item && !widget) {
+ item = item->parentLayoutItem();
+ if (!item->isLayout()) {
+ widget = static_cast<const QGraphicsWidget*>(item);
+ }
+ }
+
+ if (!widget) {
+ return constraint;
+ }
+
+ QSizeF parentSize;
+ qreal xMargins = 0.0, yMargins = 0.0;
+
+ while (widget->parentWidget()) {
+ widget = widget->parentWidget();
+ parentSize = widget->size();
+
+ if (widget->layout()) {
+ qreal left, top, right, bottom;
+ widget->layout()->getContentsMargins(&left, &top, &right, &bottom);
+ xMargins += left + right;
+ yMargins += top + bottom;
+ }
+ }
+
+ return parentSize - QSizeF(xMargins, yMargins);
+}
+
+
+}
--- applets/systemtray/ui/applet.cpp
+++ applets/systemtray/ui/applet.cpp
@@ -0,0 +1,290 @@
+/***************************************************************************
+ * applet.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * Copyright (C) 2008 Sebastian Sauer *
+ * *
+ * 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 "applet.h"
+#include "taskarea.h"
+
+#include <QtGui/QGraphicsLayout>
+#include <QtGui/QIcon>
+#include <QtGui/QListWidget>
+
+#include <KActionSelector>
+#include <KConfigDialog>
+
+#include <plasma/panelsvg.h>
+#include <plasma/theme.h>
+
+#include "../core/manager.h"
+#include "../core/task.h"
+
+
+namespace SystemTray
+{
+
+K_EXPORT_PLASMA_APPLET(systemtray, Applet)
+
+
+class Applet::Private
+{
+public:
+ Private(Applet *q)
+ : q(q),
+ taskArea(0),
+ configInterface(0),
+ background(0),
+ backgroundEnabled(false)
+ {
+ }
+
+ void setTaskAreaGeometry();
+
+ Applet *q;
+
+ TaskArea *taskArea;
+ QPointer<KActionSelector> configInterface;
+
+ Plasma::PanelSvg *background;
+ bool backgroundEnabled;
+};
+
+
+Applet::Applet(QObject *parent, const QVariantList &arguments)
+ : Plasma::Applet(parent, arguments),
+ d(new Private(this))
+{
+ d->background = new Plasma::PanelSvg(this);
+ d->background->setImagePath("widgets/systemtray");
+
+ setAspectRatioMode(Plasma::KeepAspectRatio);
+
+ setHasConfigurationInterface(true);
+}
+
+Applet::~Applet()
+{
+ delete d;
+}
+
+void Applet::init()
+{
+ KConfigGroup cg = config();
+ QStringList hiddenTypes = cg.readEntry("hidden", QStringList());
+
+ d->taskArea = new TaskArea(this);
+ d->setTaskAreaGeometry();
+ connect(Manager::self(), SIGNAL(taskAdded(SystemTray::Task*)),
+ d->taskArea, SLOT(addTask(SystemTray::Task*)));
+ connect(Manager::self(), SIGNAL(taskChanged(SystemTray::Task*)),
+ d->taskArea, SLOT(addTask(SystemTray::Task*)));
+ connect(Manager::self(), SIGNAL(taskRemoved(SystemTray::Task*)),
+ d->taskArea, SLOT(removeTask(SystemTray::Task*)));
+
+ d->taskArea->setHiddenTypes(hiddenTypes);
+ connect(d->taskArea, SIGNAL(sizeHintChanged(Qt::SizeHint)),
+ this, SLOT(propogateSizeHintChange(Qt::SizeHint)));
+
+ connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()),
+ this, SLOT(checkSizes()));
+ checkSizes();
+
+ d->taskArea->syncTasks(Manager::self()->tasks());
+
+}
+
+
+void Applet::constraintsEvent(Plasma::Constraints constraints)
+{
+ if (constraints & Plasma::FormFactorConstraint) {
+ QSizePolicy policy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+ policy.setHeightForWidth(true);
+
+ if (formFactor() == Plasma::Horizontal) {
+ policy.setVerticalPolicy(QSizePolicy::Expanding);
+ } else if (formFactor() == Plasma::Vertical) {
+ policy.setHorizontalPolicy(QSizePolicy::Expanding);
+ }
+
+ setSizePolicy(policy);
+ d->taskArea->setSizePolicy(policy);
+ }
+
+ if (constraints & Plasma::SizeConstraint) {
+ checkSizes();
+ }
+}
+
+
+void Applet::setGeometry(const QRectF &rect)
+{
+ Plasma::Applet::setGeometry(rect);
+
+ if (d->taskArea) {
+ d->setTaskAreaGeometry();
+ }
+}
+
+
+void Applet::checkSizes()
+{
+ d->taskArea->layout()->updateGeometry();
+
+ QSizeF preferredSize = d->taskArea->effectiveSizeHint(Qt::PreferredSize);
+ QSizeF actualSize = size();
+
+ qreal leftMargin, topMargin, rightMargin, bottomMargin;
+ d->background->getMargins(leftMargin, topMargin, rightMargin, bottomMargin);
+
+ bool backgroundEnabled;
+ switch (formFactor()) {
+ case Plasma::Horizontal:
+ backgroundEnabled = actualSize.height() >= (preferredSize.height() + topMargin + bottomMargin);
+ break;
+ default:
+ backgroundEnabled = true;
+ }
+
+ if (backgroundEnabled) {
+ setContentsMargins(leftMargin, topMargin, rightMargin, bottomMargin);
+ } else {
+ setContentsMargins(0, 0, 0, 0);
+ leftMargin = topMargin = rightMargin = bottomMargin = 0;
+ }
+
+ preferredSize.setWidth(preferredSize.width() + leftMargin + rightMargin);
+ preferredSize.setHeight(preferredSize.height() + topMargin + bottomMargin);
+ setPreferredSize(preferredSize);
+
+ if (formFactor() == Plasma::Planar && (actualSize.width() < preferredSize.width() ||
+ actualSize.height() < preferredSize.height())) {
+
+ QSizeF constraint;
+ if (actualSize.width() > actualSize.height()) {
+ constraint = QSize(actualSize.width() - leftMargin - rightMargin, -1);
+ } else {
+ constraint = QSize(-1, actualSize.height() - topMargin - bottomMargin);
+ }
+
+ preferredSize = d->taskArea->effectiveSizeHint(Qt::PreferredSize, constraint);
+ preferredSize.setWidth(qMax(actualSize.width(), preferredSize.width()));
+ preferredSize.setHeight(qMax(actualSize.height(), preferredSize.height()));
+
+ resize(preferredSize);
+ return;
+ }
+
+ if (backgroundEnabled != d->backgroundEnabled) {
+ d->backgroundEnabled = backgroundEnabled;
+ update();
+ }
+}
+
+
+void Applet::Private::setTaskAreaGeometry()
+{
+ qreal leftMargin, topMargin, rightMargin, bottomMargin;
+ q->getContentsMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin);
+
+ QRectF taskAreaRect(q->rect());
+ taskAreaRect.moveLeft(leftMargin);
+ taskAreaRect.moveTop(topMargin);
+ taskAreaRect.setWidth(taskAreaRect.width() - leftMargin - rightMargin);
+ taskAreaRect.setHeight(taskAreaRect.height() - topMargin - bottomMargin);
+
+ taskArea->setGeometry(taskAreaRect);
+}
+
+
+void Applet::paintInterface(QPainter *painter, const QStyleOptionGraphicsItem *option, const QRect &contentsRect)
+{
+ Q_UNUSED(option)
+ Q_UNUSED(contentsRect);
+
+ if (d->backgroundEnabled) {
+ d->background->resizePanel(size());
+ d->background->paintPanel(painter);
+ }
+}
+
+
+void Applet::propogateSizeHintChange(Qt::SizeHint which)
+{
+ checkSizes();
+ emit sizeHintChanged(which);
+}
+
+
+void Applet::createConfigurationInterface(KConfigDialog *parent)
+{
+ if (!d->configInterface) {
+ d->configInterface = new KActionSelector();
+ d->configInterface->setAvailableLabel(i18n("Visible icons:"));
+ d->configInterface->setSelectedLabel(i18n("Hidden icons:"));
+ d->configInterface->setShowUpDownButtons(false);
+
+ connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
+ connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
+
+ parent->setMainWidget(d->configInterface);
+ }
+
+ QListWidget *visibleList = d->configInterface->availableListWidget();
+ QListWidget *hiddenList = d->configInterface->selectedListWidget();
+
+ visibleList->clear();
+ hiddenList->clear();
+
+ foreach (Task *task, Manager::self()->tasks()) {
+ QListWidgetItem *listItem = new QListWidgetItem();
+ listItem->setText(task->name());
+ listItem->setIcon(task->icon());
+ listItem->setData(Qt::UserRole, task->typeId());
+
+ if (d->taskArea->isHiddenType(task->typeId())) {
+ hiddenList->addItem(listItem);
+ } else {
+ visibleList->addItem(listItem);
+ }
+ }
+}
+
+
+void Applet::configAccepted()
+{
+ QStringList hiddenTypes;
+
+ QListWidget *hiddenList = d->configInterface->selectedListWidget();
+ for (int i = 0; i < hiddenList->count(); ++i) {
+ hiddenTypes << hiddenList->item(i)->data(Qt::UserRole).toString();
+ }
+
+ d->taskArea->setHiddenTypes(hiddenTypes);
+ d->taskArea->syncTasks(Manager::self()->tasks());
+
+ KConfigGroup cg = config();
+ cg.writeEntry("hidden", hiddenTypes);
+ emit configNeedsSaving();
+}
+
+
+}
+
+#include "applet.moc"
--- applets/systemtray/ui/compactlayout.h
+++ applets/systemtray/ui/compactlayout.h
@@ -0,0 +1,61 @@
+/***************************************************************************
+ * compactlayout.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 COMPACTLAYOUT_H
+#define COMPACTLAYOUT_H
+
+#include <QGraphicsLayout>
+
+
+namespace SystemTray
+{
+
+class CompactLayout : public QGraphicsLayout
+{
+public:
+ CompactLayout(QGraphicsLayoutItem *parent = 0);
+ ~CompactLayout();
+
+ qreal spacing() const;
+ void setSpacing(qreal spacing);
+
+ void addItem(QGraphicsLayout *item);
+ void addItem(QGraphicsWidget *item);
+ void removeItem(QGraphicsLayoutItem *item);
+ bool containsItem(QGraphicsLayoutItem *item) const;
+
+ int count() const;
+ void setGeometry(const QRectF &rect);
+ QGraphicsLayoutItem* itemAt(int i) const;
+ void removeAt(int index);
+
+protected:
+ QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const;
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+
+
+#endif
--- applets/systemtray/ui/applet.h
+++ applets/systemtray/ui/applet.h
@@ -0,0 +1,68 @@
+/***************************************************************************
+ * applet.h *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 APPLET_H
+#define APPLET_H
+
+#include <plasma/applet.h>
+
+namespace SystemTray
+{
+}
+
+
+namespace SystemTray
+{
+
+class Applet : public Plasma::Applet
+{
+ Q_OBJECT
+
+public:
+ explicit Applet(QObject *parent, const QVariantList &arguments = QVariantList());
+ ~Applet();
+
+ void init();
+ void constraintsEvent(Plasma::Constraints constraints);
+ void setGeometry(const QRectF &rect);
+
+protected:
+ void paintInterface(QPainter *painter, const QStyleOptionGraphicsItem *option, const QRect &contentsRect);
+ void createConfigurationInterface(KConfigDialog *parent);
+// void initExtenderItem(Plasma::ExtenderItem *extenderItem);
+
+ void hoverEnterEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); }
+ void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { Q_UNUSED(event); }
+
+private slots:
+ void configAccepted();
+ void propogateSizeHintChange(Qt::SizeHint which);
+ void checkSizes();
+
+private:
+ class Private;
+ Private* const d;
+};
+
+}
+
+
+#endif
--- applets/systemtray/ui/taskarea.cpp
+++ applets/systemtray/ui/taskarea.cpp
@@ -0,0 +1,130 @@
+/***************************************************************************
+ * taskarea.cpp *
+ * *
+ * Copyright (C) 2008 Jason Stubbs <jasonbstubbs@gmail.com> *
+ * *
+ * 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 "taskarea.h"
+
+#include <QtCore/QSet>
+
+#include <plasma/applet.h>
+
+#include "../core/task.h"
+#include "compactlayout.h"
+
+
+namespace SystemTray
+{
+
+
+class TaskArea::Private
+{
+public:
+ Private(Plasma::Applet *h)
+ : host(h),
+ layout(new CompactLayout())
+ {
+ }
+
+ QGraphicsWidget* findWidget(Task *task);
+
+ Plasma::Applet *host;
+ CompactLayout *layout;
+ QSet<QString> hiddenTypes;
+};
+
+
+TaskArea::TaskArea(Plasma::Applet *parent)
+ : QGraphicsWidget(parent),
+ d(new Private(parent))
+{
+ setLayout(d->layout);
+}
+
+
+TaskArea::~TaskArea()
+{
+ delete d;
+}
+
+
+void TaskArea::setHiddenTypes(const QStringList &hiddenTypes)
+{
+ d->hiddenTypes = QSet<QString>::fromList(hiddenTypes);
+}
+
+
+bool TaskArea::isHiddenType(const QString &typeId) const
+{
+ return d->hiddenTypes.contains(typeId);
+}
+
+
+void TaskArea::syncTasks(const QList<SystemTray::Task*> &tasks)
+{
+ foreach (Task *task, tasks) {
+ if (isHiddenType(task->typeId())) {
+ QGraphicsWidget *widget = d->findWidget(task);
+ if (widget) {
+ d->layout->removeItem(widget);
+ delete widget;
+ }
+ } else {
+ addTask(task);
+ }
+ }
+}
+
+
+void TaskArea::addTask(Task *task)
+{
+ if (task->isEmbeddable() && !isHiddenType(task->typeId()) && !d->findWidget(task)) {
+ d->layout->addItem(task->widget(d->host));
+ emit sizeHintChanged(Qt::PreferredSize);
+ }
+}
+
+
+void TaskArea::removeTask(Task *task)
+{
+ foreach (QGraphicsWidget *widget, task->associatedWidgets()) {
+ if (d->layout->containsItem(widget)) {
+ d->layout->removeItem(widget);
+ emit sizeHintChanged(Qt::PreferredSize);
+ break;
+ }
+ }
+}
+
+
+QGraphicsWidget* TaskArea::Private::findWidget(Task *task)
+{
+ foreach (QGraphicsWidget *widget, task->associatedWidgets()) {
+ if (layout->containsItem(widget)) {
+ return widget;
+ }
+ }
+
+ return 0;
+}
+
+
+}
+
+#include "taskarea.moc"
--- applets/tasks/windowtaskitem.h
+++ applets/tasks/windowtaskitem.h
@@ -55,8 +55,11 @@
public:
/** Constructs a new representation for a window task. */
- WindowTaskItem(Tasks *parent, const bool showTooltip);
+ WindowTaskItem(Tasks *parent, bool showTooltip);
+ /**Destruct the representation of the window task */
+ ~WindowTaskItem();
+
/** Sets the starting task represented by this item. */
void setStartupTask(TaskManager::StartupPtr task);
@@ -124,6 +127,8 @@
public slots:
virtual void activate();
+ void toolTipAboutToShow();
+ void toolTipHidden();
protected:
virtual void contextMenuEvent(QGraphicsSceneContextMenuEvent *event);
@@ -169,9 +174,10 @@
*/
void drawTextLayout(QPainter *painter, const QTextLayout &layout, const QRect &rect) const;
+ void updateToolTip();
private slots:
- void updateTask();
+ void updateTask(::TaskManager::TaskChanges changes);
void animationUpdate(qreal progress);
private:
@@ -180,6 +186,7 @@
QTimer* m_activateTimer;
bool m_showTooltip;
+ bool m_showingTooltip;
// area of item occupied by task's icon
QRectF iconRect(const QRectF &bounds) const;
// area of item occupied by task's text
--- applets/tasks/tasks.cpp
+++ applets/tasks/tasks.cpp
@@ -92,11 +92,9 @@
setLayout(m_layout);
KConfigGroup cg = config();
-#ifdef TOOLTIP_MANAGER
- m_showTooltip = cg.readEntry("showTooltip", true);
-#endif
m_showOnlyCurrentDesktop = cg.readEntry("showOnlyCurrentDesktop", false);
m_showOnlyCurrentScreen = cg.readEntry("showOnlyCurrentScreen", false);
+ m_showTooltip = cg.readEntry("showTooltip", true);
// listen for addition and removal of window tasks
connect(TaskManager::TaskManager::self(), SIGNAL(taskAdded(TaskPtr)),
@@ -130,6 +128,7 @@
item->deleteLater();
}
+ updatePreferredSize();
adjustStretch();
}
@@ -138,12 +137,18 @@
TaskManager::TaskManager *manager = TaskManager::TaskManager::self();
TaskManager::TaskDict tasks = manager->tasks();
- QMapIterator<WId,TaskPtr> iter(tasks);
+ QHashIterator<WId,TaskPtr> iter(tasks);
while (iter.hasNext()) {
iter.next();
+ if ((!iter.value()->isOnCurrentDesktop() && m_showOnlyCurrentDesktop) ||
+ (!isOnMyScreen(iter.value()) && m_showOnlyCurrentScreen)) {
+ connect(iter.value().data(), SIGNAL(changed(::TaskManager::TaskChanges)),
+ this, SLOT(addAttentionTask(::TaskManager::TaskChanges)));
+ }
addWindowTask(iter.value());
}
+ updatePreferredSize();
}
void Tasks::addWindowTask(TaskPtr task)
@@ -152,11 +157,11 @@
return;
}
- if (m_showOnlyCurrentDesktop && !task->isOnCurrentDesktop()) {
+ if (m_showOnlyCurrentDesktop && !task->isOnCurrentDesktop() && !task->demandsAttention()) {
return;
}
- if (m_showOnlyCurrentScreen && !isOnMyScreen(task)) {
+ if (m_showOnlyCurrentScreen && !isOnMyScreen(task) && !task->demandsAttention()) {
return;
}
@@ -208,31 +213,33 @@
void Tasks::removeWindowTask(TaskPtr task)
{
- if (m_windowTaskItems.contains(task)) {
- WindowTaskItem *item = m_windowTaskItems.take(task);
+ WindowTaskItem *item = m_windowTaskItems.take(task);
+ if (item) {
m_layout->removeItem(item);
scene()->removeItem(item);
item->deleteLater();
m_activeTask = m_windowTaskItems.end();
+ updatePreferredSize();
+ adjustStretch();
}
-
- adjustStretch();
}
void Tasks::removeAllWindowTasks()
{
- QHash<TaskPtr,WindowTaskItem*>::iterator it = m_windowTaskItems.begin();
+ QHashIterator<TaskPtr,WindowTaskItem*> iter (m_windowTaskItems);
- while (it != m_windowTaskItems.end()) {
- WindowTaskItem *item = it.value();
+ while (iter.hasNext()) {
+ iter.next();
+ WindowTaskItem *item = iter.value();
m_layout->removeItem(item);
scene()->removeItem(item);
item->deleteLater();
- ++it;
}
-
- m_windowTaskItems.clear();
- m_activeTask = m_windowTaskItems.end();
+ if (m_windowTaskItems.count() > 0) {
+ m_windowTaskItems.clear();
+ m_activeTask = m_windowTaskItems.end();
+ updatePreferredSize();
+ }
}
void Tasks::constraintsEvent(Plasma::Constraints constraints)
@@ -371,7 +378,7 @@
return;
}
- if (!task->isOnCurrentDesktop()) {
+ if (!task->isOnCurrentDesktop() && !task->demandsAttention()) {
removeWindowTask(task);
} else if (!m_windowTaskItems.contains(task)) {
addWindowTask(task);
@@ -392,7 +399,7 @@
void Tasks::checkScreenChange()
{
foreach (const TaskPtr &task, m_geometryTasks) {
- if (!isOnMyScreen(task)) {
+ if (!isOnMyScreen(task) && !task->demandsAttention()) {
removeWindowTask(task);
} else if (!m_windowTaskItems.contains(task)) {
addWindowTask(task);
@@ -446,6 +453,27 @@
}
+void Tasks::updatePreferredSize()
+{
+ if (m_layout->count() > 0) {
+ QGraphicsLayoutItem *item = m_layout->itemAt(0);
+
+ if (formFactor() == Plasma::Horizontal) {
+ setPreferredSize(item->preferredSize().width()*m_layout->count(), preferredSize().height());
+ } else if (formFactor() == Plasma::Vertical) {
+ setPreferredSize(preferredSize().width(), item->preferredSize().height()*m_layout->count());
+ }
+ //Empty taskbar, arbitrary small value
+ } else {
+ if (formFactor() == Plasma::Horizontal) {
+ setPreferredSize(10, preferredSize().height());
+ } else if (formFactor() == Plasma::Vertical) {
+ setPreferredSize(preferredSize().width(), 10);
+ }
+ }
+ emit sizeHintChanged(Qt::PreferredSize);
+}
+
bool Tasks::isOnMyScreen(TaskPtr task)
{
Plasma::Containment* appletContainment = containment();
@@ -463,18 +491,14 @@
void Tasks::createConfigurationInterface(KConfigDialog *parent)
{
- QWidget *widget = new QWidget;
- m_ui.setupUi(widget);
- parent->setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply);
- connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
- connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
- parent->addPage(widget, parent->windowTitle(), icon());
+ QWidget *widget = new QWidget;
+ m_ui.setupUi(widget);
+ parent->setButtons(KDialog::Ok | KDialog::Cancel | KDialog::Apply);
+ connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
+ connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
+ parent->addPage(widget, parent->windowTitle(), icon());
-#ifdef TOOLTIP_MANAGER
m_ui.showTooltip->setChecked(m_showTooltip);
-#else
- m_ui.showTooltip->hide();
-#endif
m_ui.showOnlyCurrentDesktop->setChecked(m_showOnlyCurrentDesktop);
m_ui.showOnlyCurrentScreen->setChecked(m_showOnlyCurrentScreen);
}
@@ -495,25 +519,17 @@
cg.writeEntry("showOnlyCurrentScreen", m_showOnlyCurrentScreen);
changed = true;
}
-
- if (changed) {
- reconnect();
- }
-#ifdef TOOLTIP_MANAGER
- if (m_showTooltip != (m_ui.showTooltip->checkState() == Qt::Checked)) {
+ if (m_showTooltip != (m_ui.showTooltip->isChecked())) {
m_showTooltip = !m_showTooltip;
- foreach (AbstractTaskItem *taskItem, m_windowTaskItems) {
- WindowTaskItem *windowTaskItem = dynamic_cast<WindowTaskItem *>(taskItem);
- if (windowTaskItem) {
- windowTaskItem->setShowTooltip(m_showTooltip);
- }
- }
KConfigGroup cg = config();
cg.writeEntry("showTooltip", m_showTooltip);
changed = true;
}
-#endif
+
if (changed) {
+ reconnect();
+ }
+ if (changed) {
update();
emit configNeedsSaving();
}
@@ -559,6 +575,21 @@
}
}
+/** Adds a windowTaskItem that is demanding attention to the taskbar if it is not currently shown and is not on the current desktop.
+*This funtion applies when the m_showOnlyCurrentDesktop or m_showOnlyCurrentScreen switch set. */
+void Tasks::addAttentionTask(::TaskManager::TaskChanges changes)
+{
+ if (!(changes & TaskManager::StateChanged)) {
+ return;
+ }
+
+ TaskPtr task;
+ task.attach(qobject_cast<TaskManager::Task*>(sender()));
+ if (task->demandsAttention() && !m_windowTaskItems.contains(task)) {
+ addWindowTask(task);
+ }
+}
+
K_EXPORT_PLASMA_APPLET(tasks, Tasks)
#include "tasks.moc"
--- applets/tasks/windowtaskitem.cpp
+++ applets/tasks/windowtaskitem.cpp
@@ -41,13 +41,15 @@
#include "plasma/theme.h"
#include "plasma/paintutils.h"
#include "plasma/panelsvg.h"
+#include "plasma/tooltipmanager.h"
#include "tasks.h"
-WindowTaskItem::WindowTaskItem(Tasks *parent, const bool showTooltip)
+WindowTaskItem::WindowTaskItem(Tasks *parent, bool showTooltip)
: QGraphicsWidget(parent),
m_applet(parent),
m_activateTimer(0),
+ m_showingTooltip(false),
m_flags(0),
m_animId(0),
m_alpha(1),
@@ -56,17 +58,27 @@
m_attentionTimerId(0),
m_attentionTicks(0)
{
- m_showTooltip = showTooltip;
+ setShowTooltip(showTooltip);
setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding));
setAcceptsHoverEvents(true);
setAcceptDrops(true);
+ if (m_showTooltip) {
+ Plasma::ToolTipManager::self()->registerWidget(this);
+ } else {
+ Plasma::ToolTipManager::self()->unregisterWidget(this);
+ }
+
QFontMetrics fm(KGlobalSettings::taskbarFont());
QSize mSize = fm.size(0, "M");
setPreferredSize(QSize(mSize.width()*15 + m_applet->itemLeftMargin() + m_applet->itemRightMargin() + IconSize(KIconLoader::Panel),
mSize.height()*3 + m_applet->itemTopMargin() + m_applet->itemBottomMargin()));
}
+WindowTaskItem::~WindowTaskItem()
+{
+}
+
void WindowTaskItem::activate()
{
// the Task class has a method called activateRaiseOrIconify() which
@@ -87,6 +99,19 @@
}
}
+void WindowTaskItem::toolTipAboutToShow()
+{
+ m_showingTooltip = true;
+ updateToolTip();
+}
+
+void WindowTaskItem::toolTipHidden()
+{
+ m_showingTooltip = false;
+ Plasma::ToolTipManager::ToolTipContent data;
+ Plasma::ToolTipManager::self()->setToolTipContent(this, data);
+}
+
void WindowTaskItem::close()
{
if (m_task) {
@@ -97,7 +122,11 @@
void WindowTaskItem::setShowTooltip(const bool showit)
{
m_showTooltip = showit;
- updateTask();
+ if (showit) {
+ Plasma::ToolTipManager::self()->registerWidget(this);
+ } else {
+ Plasma::ToolTipManager::self()->unregisterWidget(this);
+ }
}
void WindowTaskItem::setText(const QString &text)
@@ -518,7 +547,7 @@
painter->drawPixmap(rect.topLeft(), pixmap);
}
-void WindowTaskItem::updateTask()
+void WindowTaskItem::updateTask(::TaskManager::TaskChanges changes)
{
Q_ASSERT(m_task);
@@ -545,32 +574,41 @@
setTaskFlags(flags);
- // basic title and icon
- QIcon taskIcon;
- taskIcon.addPixmap(m_task->icon(KIconLoader::SizeSmall, KIconLoader::SizeSmall, false));
- taskIcon.addPixmap(m_task->icon(KIconLoader::SizeSmallMedium, KIconLoader::SizeSmallMedium, false));
- taskIcon.addPixmap(m_task->icon(KIconLoader::SizeMedium, KIconLoader::SizeMedium, false));
- taskIcon.addPixmap(m_task->icon(KIconLoader::SizeLarge, KIconLoader::SizeLarge, false));
+ if (changes & TaskManager::IconChanged) {
+ setIcon(m_task->icon());
+ }
-#ifdef TOOLTIP_MANAGER
- if (m_showTooltip) {
- Plasma::ToolTipData data;
- data.mainText = m_task->visibleName();
- data.subText = i18nc("Which virtual desktop a window is currently on", "On %1", KWindowSystem::desktopName(m_task->desktop()));
- data.image = iconPixmap;
- data.windowToPreview = m_task->window();
- setToolTip(data);
- } else {
- Plasma::ToolTipData data;
- setToolTip(data); // Clear
+ if (changes & TaskManager::NameChanged) {
+ setText(m_task->visibleName());
}
-#endif
- setIcon(taskIcon);
- setText(m_task->visibleName());
+
+ if (m_showingTooltip &&
+ (changes & TaskManager::IconChanged ||
+ changes & TaskManager::NameChanged ||
+ changes & TaskManager::DesktopChanged)) {
+ updateToolTip();
+ }
+
//redraw
queueUpdate();
}
+void WindowTaskItem::updateToolTip()
+{
+ if (!m_task) {
+ return;
+ }
+
+ Plasma::ToolTipManager::ToolTipContent data;
+ data.mainText = m_task->visibleName();
+ data.subText = i18nc("Which virtual desktop a window is currently on", "On %1",
+ KWindowSystem::desktopName(m_task->desktop()));
+ data.image = m_task->icon(KIconLoader::SizeSmall, KIconLoader::SizeSmall, false);
+ data.windowToPreview = m_task->window();
+
+ Plasma::ToolTipManager::self()->setToolTipContent(this, data);
+}
+
void WindowTaskItem::animationUpdate(qreal progress)
{
if (progress == 1) {
@@ -606,12 +644,10 @@
m_task = task;
- connect(task.constData(), SIGNAL(changed()),
- this, SLOT(updateTask()));
- connect(task.constData(), SIGNAL(iconChanged()),
- this, SLOT(updateTask()));
+ connect(task.constData(), SIGNAL(changed(::TaskManager::TaskChanges)),
+ this, SLOT(updateTask(::TaskManager::TaskChanges)));
- updateTask();
+ updateTask(TaskManager::EverythingChanged);
publishIconGeometry();
//kDebug() << "Task added, isActive = " << task->isActive();
--- applets/tasks/tasks.h
+++ applets/tasks/tasks.h
@@ -101,6 +101,7 @@
void taskMovedDesktop(TaskPtr task);
void windowChangedGeometry(TaskPtr task);
void checkScreenChange();
+ void addAttentionTask(::TaskManager::TaskChanges changes);
private:
// creates task representations for existing windows
@@ -113,6 +114,7 @@
void insertItemBeforeSpacer(QGraphicsWidget * item);
void adjustStretch();
+ void updatePreferredSize();
bool isOnMyScreen(TaskPtr task);
void reconnect();
--- applets/icon/icon.cpp
+++ applets/icon/icon.cpp
@@ -44,6 +44,7 @@
#include <plasma/theme.h>
#include <plasma/widgets/icon.h>
#include <plasma/containment.h>
+#include <plasma/tooltipmanager.h>
IconApplet::IconApplet(QObject *parent, const QVariantList &args)
: Plasma::Applet(parent, args),
@@ -80,6 +81,7 @@
setDisplayLines(2);
registerAsDragHandle(m_icon);
+ Plasma::ToolTipManager::self()->registerWidget(m_icon);
setAspectRatioMode(Plasma::ConstrainedSquare);
@@ -157,12 +159,11 @@
//in the panel the icon behaves like a button
connect(m_icon, SIGNAL(clicked()), this, SLOT(openUrl()));
m_icon->setText(QString());
- //FIXME PORT TO TOOL TIP MANAGER
- /*Plasma::ToolTipData data;
+ Plasma::ToolTipManager::ToolTipContent data;
data.mainText = m_text;
data.subText = m_genericName;
data.image = m_icon->icon().pixmap(IconSize(KIconLoader::Desktop));
- m_icon->setToolTip(data);*/
+ Plasma::ToolTipManager::self()->setToolTipContent(m_icon, data);
m_icon->setDrawBackground(false);
}
}
--- applets/analog-clock/plasma-applet-analogclock.desktop
+++ applets/analog-clock/plasma-applet-analogclock.desktop
@@ -101,7 +101,7 @@
Comment[nds]=En Klock mit SVG-Mustern
Comment[ne]=एउटा एसभीजी थेमेबल घडी
Comment[nl]=Een klok met SVG-themamogelijkheden
-Comment[nn]=Ei SVG-basert klokke med fleire tema
+Comment[nn]=SVG-basert klokke med fleire tema
Comment[pa]=ਇੱਕ SVG ਥੀਮ-ਯੋਗ ਕਲਾਕ
Comment[pl]=Zegar z motywami SVG
Comment[pt]=Um relógio com temas em SVG
@@ -123,7 +123,7 @@
Comment[zh_TW]=SVG 可調整外觀時鐘
Icon=chronometer
Type=Service
-X-KDE-ServiceTypes=Plasma/Applet,Plasma/Containment
+X-KDE-ServiceTypes=Plasma/Applet
X-KDE-Library=plasma_applet_clock
X-KDE-PluginInfo-Author=The Plasma Team
--- applets/battery/battery.svg
+++ applets/battery/battery.svg
@@ -1,682 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-<svg
- xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- version="1.0"
- width="22.000275"
- height="22.000181"
- viewBox="0 0 22 12"
- id="svg2065"
- xml:space="preserve"><rect
- width="8"
- height="10"
- x="13"
- y="1"
- style="fill:url(#linearGradient10105);fill-opacity:1"
- id="rect9410" /><defs
- id="defs2113"><linearGradient
- id="linearGradient4870"><stop
- style="stop-color:#ffdd00;stop-opacity:1"
- offset="0"
- id="stop4872" /><stop
- style="stop-color:#ffdd00;stop-opacity:0"
- offset="1"
- id="stop4874" /></linearGradient><linearGradient
- x1="11.9995"
- y1="2.2495"
- x2="11.9995"
- y2="9.7489996"
- id="linearGradient6729"
- gradientUnits="userSpaceOnUse">
- <stop
- style="stop-color:#ffbf80;stop-opacity:1"
- offset="0"
- id="stop6731" />
- <stop
- style="stop-color:#ff7e00;stop-opacity:1"
- offset="1"
- id="stop6733" />
- <a:midPointStop
- offset="0"
- style="stop-color:#99DCC6" />
- <a:midPointStop
- offset="0.5"
- style="stop-color:#99DCC6" />
- <a:midPointStop
- offset="1"
- style="stop-color:#00734D" />
- </linearGradient><linearGradient
- x1="11.9995"
- y1="2.2495"
- x2="11.9995"
- y2="9.7489996"
- id="linearGradient5838"
- gradientUnits="userSpaceOnUse">
- <stop
- style="stop-color:#ff8080;stop-opacity:1"
- offset="0"
- id="stop5840" />
- <stop
- style="stop-color:#cd0000;stop-opacity:1"
- offset="1"
- id="stop5842" />
- <a:midPointStop
- offset="0"
- style="stop-color:#99DCC6" />
- <a:midPointStop
- offset="0.5"
- style="stop-color:#99DCC6" />
- <a:midPointStop
- offset="1"
- style="stop-color:#00734D" />
- </linearGradient><linearGradient
- id="linearGradient3291"><stop
- style="stop-color:#000000;stop-opacity:1"
- offset="0"
- id="stop3293" /><stop
- style="stop-color:#000000;stop-opacity:0"
- offset="1"
- id="stop3295" /></linearGradient><linearGradient
- x1="11.9995"
- y1="2.2495"
- x2="11.9995"
- y2="9.7489996"
- id="linearGradient3311"
- gradientUnits="userSpaceOnUse">
- <stop
- style="stop-color:#3cff3c;stop-opacity:1"
- offset="0"
- id="stop3313" />
- <stop
- style="stop-color:#008c00;stop-opacity:1"
- offset="1"
- id="stop3315" />
- <a:midPointStop
- style="stop-color:#99DCC6"
- offset="0" />
- <a:midPointStop
- style="stop-color:#99DCC6"
- offset="0.5" />
- <a:midPointStop
- style="stop-color:#00734D"
- offset="1" />
- </linearGradient><linearGradient
- id="linearGradient3043"><stop
- style="stop-color:#ffffff;stop-opacity:0.5029586"
- offset="0"
- id="stop3045" /><stop
- style="stop-color:#ffffff;stop-opacity:0"
- offset="1"
- id="stop3047" /></linearGradient><linearGradient
- x1="12"
- y1="11"
- x2="12"
- y2="1"
- id="XMLID_8_"
- gradientUnits="userSpaceOnUse">
- <stop
- style="stop-color:#454545;stop-opacity:1"
- offset="0"
- id="stop2078" />
- <stop
- style="stop-color:#000000;stop-opacity:1"
- offset="1"
- id="stop2080" />
- <a:midPointStop
- offset="0"
- style="stop-color:#454545" />
- <a:midPointStop
- offset="0.5"
- style="stop-color:#454545" />
- <a:midPointStop
- offset="1"
- style="stop-color:#000000" />
- </linearGradient><linearGradient
- x1="12"
- y1="9.0010004"
- x2="12"
- y2="1.001"
- id="XMLID_9_"
- gradientUnits="userSpaceOnUse">
- <stop
- style="stop-color:#aeaeae;stop-opacity:1"
- offset="0"
- id="stop2085" /><stop
- style="stop-color:#696969;stop-opacity:1"
- offset="0.25714287"
- id="stop3403" />
- <stop
- style="stop-color:#3a3a3a;stop-opacity:1"
- offset="1"
- id="stop2087" />
- <a:midPointStop
- offset="0"
- style="stop-color:#FFFFFF" />
- <a:midPointStop
- offset="0.5"
- style="stop-color:#FFFFFF" />
- <a:midPointStop
- offset="1"
- style="stop-color:#000000" />
- </linearGradient><radialGradient
- cx="96.8349"
- cy="78.852486"
- r="26.26219"
- fx="96.8349"
- fy="78.852486"
- id="radialGradient7893"
- xlink:href="#linearGradient4870"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.194405,0,0,0.355618,-6.03865,-20.42761)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient8047"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse" /><linearGradient
- x1="12"
- y1="9.0010004"
- x2="12"
- y2="1.001"
- id="linearGradient8049"
- xlink:href="#XMLID_9_"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,1.25,0,-0.25)" /><linearGradient
- x1="12"
- y1="11"
- x2="12"
- y2="1"
- id="linearGradient8051"
- xlink:href="#XMLID_8_"
- gradientUnits="userSpaceOnUse" /><linearGradient
- x1="1"
- y1="11"
- x2="1"
- y2="1"
- id="linearGradient8053"
- xlink:href="#XMLID_8_"
- gradientUnits="userSpaceOnUse" /><linearGradient
- x1="12"
- y1="11"
- x2="12"
- y2="1"
- id="linearGradient4791"
- xlink:href="#XMLID_8_"
- gradientUnits="userSpaceOnUse" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient4787"
- xlink:href="#linearGradient6729"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.222223,0,0,1,16.33333,0)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient7749"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.333334,0,0,1,14,0)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient7751"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.333334,0,0,1.463415,14,-5.0976)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient9844"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.555556,0,0,1,9.33333,0)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient9840"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.555556,0,0,1.463415,9.33333,-5.0976)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient10117"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.666667,0,0,1,7,0)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient10113"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.666667,0,0,1.463415,7,-5.0976)" /><radialGradient
- cx="63.912209"
- cy="115.70919"
- r="63.912209"
- fx="63.912209"
- fy="115.7093"
- id="radialGradient10059"
- xlink:href="#linearGradient3291"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.197802,0,92.82166)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient6655"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.777778,0,0,1,4.66667,0)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient6651"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.777778,0,0,1.463415,4.66667,-5.0976)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient68886"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.9991321,0,0,1.463415,3.4277715e-3,-5.1057075)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient76332"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.222222,0,0,1.463415,16.33334,-5.0976)" /><linearGradient
- x1="1.5"
- y1="4.0419998"
- x2="1.5"
- y2="8"
- id="linearGradient76336"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient83062"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0002516,0,0,1.463415,-5.2735133e-3,-5.0976)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient83064"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1.0002516,0,0,1,-5.2735133e-3,0)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient83066"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8882738,0,0,1,2.3462594,0)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient83068"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.8882738,0,0,1.463415,2.3462594,-5.0976)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient16304"
- xlink:href="#linearGradient3311"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.555556,0,0,1,9.33333,0)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient16306"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.555556,0,0,1.463415,9.33333,-5.0976)" /><linearGradient
- x1="13.633333"
- y1="1.5664186"
- x2="13.633333"
- y2="6"
- id="linearGradient17814"
- xlink:href="#linearGradient5838"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.111111,0,0,1,18.66667,0)" /><linearGradient
- x1="6.8666668"
- y1="11.006487"
- x2="6.8666668"
- y2="9.6329269"
- id="linearGradient17816"
- xlink:href="#linearGradient3043"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(0.111111,0,0,1.463415,18.66667,-5.0976)" /></defs>
-
-
- <g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Battery"><rect
- width="22"
- height="22"
- x="0"
- y="-5"
- style="fill:none"
- id="rect68833" /><g
- id="g32977"><rect
- width="2"
- height="6"
- x="0"
- y="3"
- style="fill:url(#linearGradient8053);fill-opacity:1"
- id="rect9324" /><rect
- width="20"
- height="12"
- rx="1"
- ry="1"
- x="2"
- y="0"
- style="fill:url(#linearGradient8051)"
- id="rect9326" /><rect
- width="18"
- height="10"
- x="3"
- y="1"
- style="fill:url(#linearGradient8049)"
- id="rect9328" /><rect
- width="1"
- height="4"
- x="2"
- y="4"
- style="opacity:0.1;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
- id="rect9336" /></g></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill100"><rect
- width="1"
- height="3.9579999"
- x="1"
- y="4.0419922"
- style="fill:url(#linearGradient76336);fill-opacity:1"
- id="rect32905" /><rect
- width="18"
- height="10"
- x="3"
- y="1"
- style="fill:url(#linearGradient8047);fill-opacity:1"
- id="rect32971" /><rect
- width="17.984375"
- height="2"
- x="3.0008278"
- y="8.9918919"
- style="fill:url(#linearGradient68886);fill-opacity:1;display:inline;overflow:visible"
- id="rect68884" /><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect83029" /></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill90"><g
- transform="translate(4.3492649e-3,-6.9736349e-3)"
- style="overflow:visible"
- id="g83044"><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect83046" /><rect
- width="18.004524"
- height="10"
- x="2.9954765"
- y="1"
- style="fill:url(#linearGradient83064);fill-opacity:1"
- id="rect83048" /><rect
- width="18.004524"
- height="2"
- x="2.9954765"
- y="9"
- style="fill:url(#linearGradient83062);fill-opacity:1"
- id="rect83050" /></g></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill80"><g
- transform="translate(4.3492649e-3,-6.9736349e-3)"
- style="overflow:visible"
- id="g83032"><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect83034" /><rect
- width="15.988924"
- height="10"
- x="5.0110765"
- y="1"
- style="fill:url(#linearGradient83066);fill-opacity:1"
- id="rect83036" /><rect
- width="15.988924"
- height="2"
- x="5.0110765"
- y="9"
- style="fill:url(#linearGradient83068);fill-opacity:1"
- id="rect83038" /></g></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill70"><g
- transform="translate(4.3492649e-3,-6.9736349e-3)"
- style="overflow:visible"
- id="g32987"><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect83173" /><rect
- width="14"
- height="10"
- x="7"
- y="1"
- style="fill:url(#linearGradient6655);fill-opacity:1"
- id="rect5296" /><rect
- width="14"
- height="2"
- x="7"
- y="9"
- style="fill:url(#linearGradient6651);fill-opacity:1"
- id="rect5300" /></g></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill60"><g
- transform="translate(-1.3686299e-4,-8.0465899e-4)"
- style="overflow:visible"
- id="g32990"><rect
- width="12"
- height="10"
- x="9"
- y="1"
- style="fill:url(#linearGradient10117);fill-opacity:1"
- id="rect9378" /><rect
- width="12"
- height="2"
- x="9"
- y="9"
- style="fill:url(#linearGradient10113);fill-opacity:1"
- id="rect9382" /></g><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="brect" /></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill50"><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect83163" /><g
- transform="translate(3.2523847e-4,-9.9243469e-4)"
- style="overflow:visible"
- id="g32992"><rect
- width="10"
- height="10"
- x="11"
- y="1"
- style="fill:url(#linearGradient9844);fill-opacity:1"
- id="rect9394" /><rect
- width="10"
- height="2"
- x="11"
- y="9"
- style="fill:url(#linearGradient9840);fill-opacity:1"
- id="rect9398" /></g></g><g
- style="display:inline"
- id="Fill40"><g
- transform="matrix(0.7985304,0,0,1,4.2311874,-9.9243469e-4)"
- style="overflow:visible"
- id="g16292"><rect
- width="10"
- height="10"
- x="11"
- y="1"
- style="fill:url(#linearGradient16304);fill-opacity:1"
- id="rect16294" /><rect
- width="10"
- height="2"
- x="11"
- y="9"
- style="fill:url(#linearGradient16306);fill-opacity:1"
- id="rect16296" /></g><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect16308" /></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill30"><g
- transform="translate(0,1.1800146e-4)"
- style="overflow:visible"
- id="g33048"><rect
- width="6"
- height="10"
- x="15"
- y="1"
- style="fill:url(#linearGradient7749);fill-opacity:1"
- id="rect9426" /><rect
- width="6"
- height="2"
- x="15"
- y="9"
- style="fill:url(#linearGradient7751);fill-opacity:1"
- id="rect9430" /></g><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect17969" /></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill20"><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="boundrect" /><rect
- width="4"
- height="10"
- x="17"
- y="1"
- style="fill:url(#linearGradient4787);fill-opacity:1"
- id="rect33050" /></g><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- style="display:inline"
- id="Fill10"><g
- transform="translate(-8.1659365e-3,-2.0281456e-2)"
- style="overflow:visible"
- id="g17775"><rect
- width="2"
- height="10"
- x="19"
- y="1"
- style="fill:url(#linearGradient17814);fill-opacity:1"
- id="rect17780" /><rect
- width="2"
- height="2"
- x="19"
- y="9"
- style="fill:url(#linearGradient17816);fill-opacity:1"
- id="rect17783" /></g><rect
- width="21.990196"
- height="21.991766"
- x="0.003928124"
- y="-4.9961619"
- style="fill:none"
- id="rect17818" /></g><g
- style="display:inline"
- id="AcAdapter"><g
- transform="translate(1.3686299e-4,4.672975e-5)"
- id="g81881"><path
- d="M 16.121693,-4.8283693 C 13.684604,-3.5801574 9.63517,2.6825902 7,5.9943844 L 11.225525,6.397576 C 10.580558,9.2005486 9.762696,14.475723 8.570824,15.263474 C 11.030937,15.020018 15.63969,7.1348077 18.39671,3.5658063 L 13.62714,3.1633147 C 14.371019,0.63350016 15.038711,-3.2486895 16.121693,-4.8283693 z "
- style="opacity:0.41803278;fill:#cf4913;fill-opacity:0.75;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- id="path9470" /><path
- d="M 15.586715,-4.188275 C 13.41255,-2.5785363 10.316234,2.4353018 7.681064,5.7470959 L 11.561494,6.0845553 C 10.916527,8.8875278 10.37803,13.291754 9.613414,14.490327 C 11.153278,13.556682 15.135063,7.3647272 17.892084,3.7957258 L 13.355089,3.4011686 C 14.098964,0.87135406 14.503729,-2.6085952 15.586715,-4.188275 z "
- style="fill:#e3ad00;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- id="path9472" /><path
- d="M 15.586715,-4.188275 C 13.41255,-2.5785363 10.316234,2.4353018 7.681064,5.7470959 L 11.561494,6.0845553 C 10.916527,8.8875278 10.37803,13.291754 9.613414,14.490327 C 11.153278,13.556682 15.135063,7.3647272 17.892084,3.7957258 L 13.355089,3.4011686 C 14.098964,0.87135406 14.503729,-2.6085952 15.586715,-4.188275 z "
- style="fill:url(#radialGradient7893);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
- id="path9474" /><rect
- width="21.997829"
- height="21.996096"
- ry="0"
- x="0"
- y="-4.9961433"
- style="opacity:1;fill:none;fill-opacity:0.68235294"
- id="rect81883" /></g></g><g
- style="display:inline"
- id="Shadow"><path
- d="M 127.82442 115.70919 A 63.912209 12.641975 0 1 1 0,115.70919 A 63.912209 12.641975 0 1 1 127.82442 115.70919 z"
- transform="matrix(0.172079,0,0,-8.975362e-2,0,26.2507)"
- style="opacity:0.38139535;fill:url(#radialGradient10059);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4;stroke-opacity:1"
- id="path9618" /><rect
- width="21.997829"
- height="21.996096"
- ry="0"
- x="0"
- y="-4.9961433"
- style="opacity:1;fill:none;fill-opacity:0.68235294"
- id="rect81886" /></g></svg>
\ No newline at end of file
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
--- applets/battery/battery.h
+++ applets/battery/battery.h
@@ -28,6 +28,7 @@
#include <plasma/applet.h>
#include <plasma/animator.h>
#include <plasma/dataengine.h>
+#include <plasma/dialog.h>
#include "ui_batteryConfig.h"
namespace Plasma
@@ -35,6 +36,10 @@
class Svg;
}
+ class QLabel;
+ class QComboBox;
+ class QSlider;
+
class Battery : public Plasma::Applet
{
Q_OBJECT
@@ -46,15 +51,14 @@
void paintInterface(QPainter *painter, const QStyleOptionGraphicsItem *option,
const QRect &contents);
void setPath(const QString&);
- QSizeF contentSizeHint() const;
Qt::Orientations expandingDirections() const;
-
void constraintsEvent(Plasma::Constraints constraints);
public slots:
void dataUpdated(const QString &name, const Plasma::DataEngine::Data &data);
protected Q_SLOTS:
+ virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void configAccepted();
@@ -62,6 +66,7 @@
protected:
void createConfigurationInterface(KConfigDialog *parent);
+ void setEmbedded(const bool embedded);
private slots:
void animationUpdate(qreal progress);
@@ -69,16 +74,32 @@
void batteryAnimationUpdate(qreal progress);
void sourceAdded(const QString &source);
void sourceRemoved(const QString &source);
+ void brightnessChanged(const int brightness);
+ void updateSlider(const float brightness);
+ void setFullBrightness();
+ void openConfig();
+ void setProfile(const QString &profile);
+ void suspend();
+ void hibernate();
private:
- Q_ENUMS( m_batteryStyle )
- enum ClockStyle {
- // Keep the order of styles the same order as the items in the configdialog!
- OxygenBattery, ClassicBattery
- };
void connectSources();
void disconnectSources();
- int m_batteryStyle;
+ void initWidget(QWidget *widget);
+ void updateStatus();
+
+ /* Prevent creating infinite loops by embedding applets inside applets */
+ bool m_isEmbedded;
+ QWidget *m_widget;
+ bool m_extenderVisible;
+ QString m_svgFile;
+ QLabel *m_statusLabel;
+ QLabel *m_batteryLabel;
+ QLabel *m_profileLabel;
+ QComboBox *m_profileCombo;
+ QSlider *m_brightnessSlider;
+ int m_inhibitCookie;
+
/* Paint battery with proper charge level */
void paintBattery(QPainter *p, const QRect &contentsRect, const int batteryPercent, const bool plugState);
/* Paint a label on top of the battery */
@@ -100,6 +121,10 @@
Plasma::Svg* m_theme;
bool m_acadapter_plugged;
+ QStringList m_availableProfiles;
+ QString m_currentProfile;
+ QStringList m_suspendMethods;
+
// Configuration dialog
Ui::batteryConfig ui;
@@ -120,6 +145,7 @@
QHash<QString, QHash<QString, QVariant> > m_batteries_data;
QFont m_font;
bool m_isHovered;
+ bool m_firstRun;
QColor m_boxColor;
QColor m_textColor;
QRectF m_textRect;
--- applets/battery/battery.cpp
+++ applets/battery/battery.cpp
@@ -1,7 +1,7 @@
/***************************************************************************
- * Copyright (C) 2007-2008 by Riccardo Iaconelli <riccardo@kde.org> *
- * Copyright (C) 2007-2008 by Sebastian Kuegler <sebas@kde.org> *
- * Copyright (C) 2007 by Luka Renko <lure@kubuntu.org> *
+ * Copyright 2007-2008 by Riccardo Iaconelli <riccardo@kde.org> *
+ * Copyright 2007-2008 by Sebastian Kuegler <sebas@kde.org> *
+ * Copyright 2007 by Luka Renko <lure@kubuntu.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 *
@@ -22,28 +22,58 @@
#include "battery.h"
#include <QApplication>
+#include <QDBusConnection>
+#include <QDBusInterface>
#include <QPainter>
#include <QStyleOptionGraphicsItem>
#include <QFont>
#include <QGraphicsSceneHoverEvent>
+#include <QGraphicsGridLayout>
+#include <QGraphicsLinearLayout>
+#include <QTimer>
+#include <QX11Info>
#include <KDebug>
#include <KIcon>
#include <KLocalizedString>
#include <KSharedConfig>
+#include <KToolInvocation>
#include <KDialog>
#include <KColorScheme>
#include <KConfigDialog>
#include <KGlobalSettings>
+#include <KPushButton>
+#include <kworkspace/kworkspace.h>
+
+#include <solid/control/powermanager.h>
+#include <solid/powermanagement.h>
+
#include <plasma/svg.h>
#include <plasma/theme.h>
#include <plasma/animator.h>
+#include <QLabel>
+#include <QSlider>
+#include <QPushButton>
+#include <QToolButton>
+#include <QCheckBox>
+#include <QComboBox>
+#include <X11/Xlib.h>
+
Battery::Battery(QObject *parent, const QVariantList &args)
: Plasma::Applet(parent, args),
- m_batteryStyle(0),
+ m_isEmbedded(false),
+ m_widget(0),
+ m_extenderVisible(false),
+ m_svgFile(0),
+ m_statusLabel(0),
+ m_batteryLabel(0),
+ m_profileLabel(0),
+ m_profileCombo(0),
m_theme(0),
+ m_availableProfiles(QStringList()),
+ m_currentProfile(0),
m_animId(-1),
m_alpha(1),
m_fadeIn(false),
@@ -54,33 +84,34 @@
m_batteryAlpha(1),
m_batteryFadeIn(true),
m_isHovered(false),
+ m_firstRun(true),
m_numOfBattery(0)
{
kDebug() << "Loading applet battery";
setAcceptsHoverEvents(true);
setHasConfigurationInterface(true);
resize(128, 128);
- //setAspectRatioMode(Plasma::ConstrainedSquare );
- m_textRect = QRect();
+ setAspectRatioMode(Plasma::ConstrainedSquare );
+ m_textRect = QRectF();
}
void Battery::init()
{
KConfigGroup cg = config();
m_showBatteryString = cg.readEntry("showBatteryString", false);
- m_showMultipleBatteries = cg.readEntry("showMultipleBatteries", true);
+ m_showMultipleBatteries = cg.readEntry("showMultipleBatteries", !m_isEmbedded);
- QString svgFile = QString();
- if (cg.readEntry("style", 0) == 0) {
- m_batteryStyle = OxygenBattery;
- svgFile = "widgets/battery-oxygen";
- } else {
- m_batteryStyle = ClassicBattery;
- svgFile = "widgets/battery";
- }
+ m_svgFile = QString();
+
+ showBattery(false);;
m_theme = new Plasma::Svg(this);
- m_theme->setImagePath(svgFile);
+ m_theme->setImagePath("widgets/battery-oxygen");
m_theme->setContainsMultipleImages(false);
+ m_theme->resize(contentsRect().size());
+ if (m_acadapter_plugged) {
+ showAcAdapter(true);
+ }
+ showBattery(true);
m_theme->resize(contentsRect().size());
m_font = QApplication::font();
@@ -92,31 +123,56 @@
readColors();
connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), SLOT(readColors()));
- const QStringList& battery_sources = dataEngine("powermanagement")->query(I18N_NOOP("Battery"))[I18N_NOOP("sources")].toStringList();
+ const QStringList& battery_sources = dataEngine("powermanagement")->query("Battery")["sources"].toStringList();
//connect sources
connectSources();
foreach (const QString &battery_source, battery_sources) {
- kDebug() << "BatterySource:" << battery_source;
+ //kDebug() << "BatterySource:" << battery_source;
dataUpdated(battery_source, dataEngine("powermanagement")->query(battery_source));
}
- dataUpdated(I18N_NOOP("AC Adapter"), dataEngine("powermanagement")->query(I18N_NOOP("AC Adapter")));
m_numOfBattery = battery_sources.size();
- kDebug() << battery_sources.size();
+
+ dataUpdated("AC Adapter", dataEngine("powermanagement")->query("AC Adapter"));
+
+ if (!m_isEmbedded) {
+ m_widget = new QWidget();
+ initWidget(m_widget);
+ m_widget->setWindowFlags(Qt::Popup);
+ }
}
void Battery::constraintsEvent(Plasma::Constraints constraints)
{
+ //kDebug() << "ConstraintsEvent, Dude." << contentsRect();
if (constraints & (Plasma::FormFactorConstraint | Plasma::SizeConstraint)) {
if (formFactor() == Plasma::Vertical) {
- setMaximumSize(QWIDGETSIZE_MAX, qMax(m_textRect.height(), contentsRect().width()));
+ if (!m_showMultipleBatteries) {
+ setMinimumHeight(qMax(m_textRect.height(), size().width()));
+ } else {
+ setMinimumHeight(qMax(m_textRect.height(), size().width()*m_numOfBattery));
+ }
+ setMinimumWidth(0);
//kDebug() << "Vertical FormFactor";
} else if (formFactor() == Plasma::Horizontal) {
- setMaximumSize(qMax(m_textRect.width(), contentsRect().height()), QWIDGETSIZE_MAX);
+ if (!m_showMultipleBatteries) {
+ setMinimumWidth(qMax(m_textRect.width(), size().height()));
+ } else {
+ setMinimumWidth(qMax(m_textRect.width(), size().height()*m_numOfBattery));
+ }
+ setMinimumHeight(0);
//kDebug() << "Horizontal FormFactor" << m_textRect.width() << contentsRect().height();
+ } else {
+ setMaximumSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
+ setMinimumSize(KIconLoader::SizeSmall, KIconLoader::SizeSmall);
}
}
+ if (!m_showMultipleBatteries || m_numOfBattery < 2) {
+ setAspectRatioMode(Plasma::Square);
+ } else {
+ setAspectRatioMode(Plasma::KeepAspectRatio);
+ }
if (constraints & (Plasma::SizeConstraint | Plasma::FormFactorConstraint) && m_theme) {
m_theme->resize(contentsRect().size().toSize());
@@ -127,26 +183,30 @@
void Battery::dataUpdated(const QString& source, const Plasma::DataEngine::Data &data)
{
- if (source.startsWith(I18N_NOOP("Battery"))) {
+ if (source.startsWith("Battery")) {
m_batteries_data[source] = data;
- } else if (source == I18N_NOOP("AC Adapter")) {
- m_acadapter_plugged = data[I18N_NOOP("Plugged in")].toBool();
+ } else if (source == "AC Adapter") {
+ m_acadapter_plugged = data["Plugged in"].toBool();
showAcAdapter(m_acadapter_plugged);
+ } else if (source == "PowerDevil") {
+ m_availableProfiles = data["availableProfiles"].toStringList();
+ m_currentProfile = data["currentProfile"].toString();
+ //kDebug() << "PowerDevil profiles:" << m_availableProfiles << "[" << m_currentProfile << "]";
} else {
kDebug() << "Applet::Dunno what to do with " << source;
}
+ updateStatus();
update();
}
void Battery::createConfigurationInterface(KConfigDialog *parent)
{
- QWidget *widget = new QWidget();
+ QWidget *widget = new QWidget(parent);
ui.setupUi(widget);
parent->setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Apply );
- parent->addPage(widget, parent->windowTitle(), icon());
+ parent->addPage(widget, parent->windowTitle(), Applet::icon());
connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
- ui.styleGroup->setSelected(m_batteryStyle);
ui.showBatteryStringCheckBox->setChecked(m_showBatteryString ? Qt::Checked : Qt::Unchecked);
ui.showMultipleBatteriesCheckBox->setChecked(m_showMultipleBatteries ? Qt::Checked : Qt::Unchecked);
}
@@ -165,32 +225,9 @@
m_showMultipleBatteries = !m_showMultipleBatteries;
cg.writeEntry("showMultipleBatteries", m_showMultipleBatteries);
kDebug() << "Show multiple battery changed: " << m_showMultipleBatteries;
+ emit sizeHintChanged(Qt::PreferredSize);
}
- if (ui.styleGroup->selected() != m_batteryStyle) {
- QString svgFile = QString();
- if (ui.styleGroup->selected() == OxygenBattery) {
- svgFile = "widgets/battery-oxygen";
- } else {
- svgFile = "widgets/battery";
- }
- if (m_acadapter_plugged) {
- showAcAdapter(false);
- }
- showBattery(false);
- m_batteryStyle = ui.styleGroup->selected();
- delete m_theme;
- m_theme = new Plasma::Svg(this);
- m_theme->setImagePath(svgFile);
- kDebug() << "Changing theme to " << svgFile;
- cg.writeEntry("style", m_batteryStyle);
- m_theme->resize(contentsRect().size());
- if (m_acadapter_plugged) {
- showAcAdapter(true);
- }
- showBattery(true);
- }
-
//reconnect sources
disconnectSources();
connectSources();
@@ -227,8 +264,290 @@
Battery::~Battery()
{
+ delete m_widget;
}
+void Battery::suspend()
+{
+ XUngrabKeyboard( QX11Info::display(), QX11Info::appTime());
+ XUngrabPointer( QX11Info::display(), QX11Info::appTime());
+ XSync( QX11Info::display(), False );
+ QDBusConnection dbus( QDBusConnection::sessionBus() );
+ QDBusInterface iface( "org.kde.kded", "/modules/powerdevil", "org.kde.PowerDevil", dbus );
+ iface.call( "suspend", Solid::Control::PowerManager::ToRam );
+}
+
+void Battery::hibernate()
+{
+ XUngrabKeyboard( QX11Info::display(), QX11Info::appTime());
+ XUngrabPointer( QX11Info::display(), QX11Info::appTime());
+ XSync( QX11Info::display(), False );
+ QDBusConnection dbus( QDBusConnection::sessionBus() );
+ QDBusInterface iface( "org.kde.kded", "/modules/powerdevil", "org.kde.PowerDevil", dbus );
+ iface.call( "suspend", Solid::Control::PowerManager::ToDisk );
+}
+
+void Battery::brightnessChanged(const int brightness)
+{
+ Solid::Control::PowerManager::setBrightness(brightness);
+}
+
+void Battery::updateSlider(const float brightness)
+{
+ m_brightnessSlider->setValue((int) brightness);
+}
+
+void Battery::setFullBrightness()
+{
+ brightnessChanged(100);
+ updateSlider(100);
+}
+
+void Battery::setEmbedded(const bool embedded)
+{
+ m_isEmbedded = embedded;
+}
+
+void Battery::initWidget(QWidget *controls)
+{
+ // We only show the extender for applets that are not embedded, as
+ // that would create infinitve loops, you really don't want an applet
+ // extender when the applet is embedded into another applet, such
+ // as the battery applet is also embedded into the battery's extender.
+ if (!m_isEmbedded) {
+ int row = 0;
+ int rowHeight = 20;
+ int columnWidth = 80;
+
+ QGridLayout *controlsLayout = new QGridLayout(controls);
+ controls->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ QLabel *headerLabel = new QLabel(controls);
+ headerLabel->setText(i18n("Power Management"));
+ QFont font = headerLabel->font();
+ font.setBold(true);
+ headerLabel->setFont(font);
+ headerLabel->setWordWrap(false);
+ QGridLayout *headerLayout = new QGridLayout(controls);
+ headerLayout->setColumnMinimumWidth(0, columnWidth/2);
+ headerLayout->addWidget(headerLabel, 0, 1, Qt::AlignLeft);
+ controlsLayout->addItem(headerLayout, row, 1, 1, 2);
+ row++;
+
+ controlsLayout->setColumnMinimumWidth(0, rowHeight);
+ controlsLayout->setColumnMinimumWidth(1, 2*columnWidth);
+ controlsLayout->setColumnMinimumWidth(2, rowHeight);
+ controlsLayout->setHorizontalSpacing(0);
+ QGridLayout *batteryLayout = new QGridLayout(controls);
+ batteryLayout->setColumnMinimumWidth(0, 100);
+ batteryLayout->setColumnMinimumWidth(1, columnWidth);
+ batteryLayout->setRowMinimumHeight(row, 20);
+ m_batteryLabel = new QLabel(controls);
+ m_batteryLabel->setMinimumSize(160, 60);
+ m_batteryLabel->setWordWrap(false);
+ m_batteryLabel->setAlignment(Qt::AlignTop);
+
+ batteryLayout->addWidget(m_batteryLabel, 0, 0, 1, 1, Qt::AlignLeft);
+ controlsLayout->addItem(batteryLayout, row, 0, 1, 3);
+ row++;
+
+ QLabel *brightnessLabel = new QLabel(controls);
+ brightnessLabel->setText(i18n("Screen Brightness"));
+ brightnessLabel->setWordWrap(false);
+ controlsLayout->addWidget(brightnessLabel, row, 0, 1, 3);
+ brightnessLabel->setWordWrap(false);
+ row++;
+
+ m_brightnessSlider = new QSlider(controls);
+ m_brightnessSlider->setRange(0, 100);
+ m_brightnessSlider->setValue(Solid::Control::PowerManager::brightness());
+ m_brightnessSlider->setTickInterval(10);
+ m_brightnessSlider->setOrientation(Qt::Horizontal);
+ connect(m_brightnessSlider, SIGNAL(valueChanged(int)),
+ this, SLOT(brightnessChanged(int)));
+
+ Solid::Control::PowerManager::Notifier *notifier = Solid::Control::PowerManager::notifier();
+
+ connect(notifier, SIGNAL(brightnessChanged(float)),
+ this, SLOT(updateSlider(float)));
+ controlsLayout->addWidget(m_brightnessSlider, row, 1, 1, 1);
+
+ QToolButton *brightnessIcon = new QToolButton(controls);
+ brightnessIcon->setIcon(KIcon("ktip"));
+ connect(brightnessIcon, SIGNAL(clicked()),
+ this, SLOT(setFullBrightness()));
+ brightnessIcon->setMinimumSize(rowHeight, rowHeight);
+ controlsLayout->addWidget(brightnessIcon, row, 2, 1, 1);
+ controlsLayout->setSpacing(10);
+ row++;
+
+ m_profileLabel = new QLabel(controls);
+ m_profileLabel->setText(i18n("Power Profile"));
+ controlsLayout->addWidget(m_profileLabel, row, 0, 1, 3);
+ row++;
+
+ m_profileCombo = new QComboBox(controls);
+ connect(m_profileCombo, SIGNAL(activated(QString)),
+ this, SLOT(setProfile(QString)));
+
+ controlsLayout->addWidget(m_profileCombo, row, 1, 1, 2);
+ row++;
+
+ QLabel *actionsLabel = new QLabel(controls);
+ actionsLabel->setText(i18n("Actions"));
+ actionsLabel->setWordWrap(false);
+ controlsLayout->addWidget(actionsLabel, row, 0, 1, 3);
+ row++;
+
+ QGridLayout *actionsLayout = new QGridLayout(controls);
+
+ // Sleep and Hibernate buttons
+ QSet<Solid::PowerManagement::SleepState> sleepstates = Solid::PowerManagement::supportedSleepStates();
+ foreach (const Solid::PowerManagement::SleepState &sleepstate, sleepstates) {
+ if (sleepstate == Solid::PowerManagement::StandbyState) {
+ // Not interesting at this point ...
+
+ } else if (sleepstate == Solid::PowerManagement::SuspendState) {
+ QToolButton *suspendButton = new QToolButton(controls);
+ suspendButton->setIcon(KIcon("system-suspend"));
+ suspendButton->setText(i18n("Sleep"));
+ suspendButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ suspendButton->setMaximumHeight(36);
+ actionsLayout->addWidget(suspendButton, 0, 0);
+ connect(suspendButton, SIGNAL(clicked()), this, SLOT(suspend()));
+ } else if (sleepstate == Solid::PowerManagement::HibernateState) {
+ QToolButton *hibernateButton = new QToolButton(controls);
+ hibernateButton->setIcon(KIcon("system-suspend-hibernate"));
+ hibernateButton->setText(i18n("Hibernate"));
+ hibernateButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ hibernateButton->setMaximumHeight(36);
+ actionsLayout->addWidget(hibernateButton, 0, 1);
+ connect(hibernateButton, SIGNAL(clicked()), this, SLOT(hibernate()));
+ }
+ }
+ controlsLayout->addItem(actionsLayout, row, 1, 1, 2);
+ row++;
+
+ // More settings button
+ QToolButton *configButton = new QToolButton(controls);
+ configButton->setText(i18n("Configure..."));
+ configButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
+ configButton->setMaximumHeight(36);
+ configButton->setIcon(KIcon("preferences-system-power-management"));
+ configButton->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+ connect(configButton, SIGNAL(clicked()), this, SLOT(openConfig()));
+
+ QGridLayout *moreLayout = new QGridLayout(controls);
+ moreLayout->setColumnMinimumWidth(0, columnWidth);
+ moreLayout->addWidget(configButton, 0, 1, Qt::AlignLeft);
+
+ controlsLayout->addItem(moreLayout, row, 1, 1, 2);
+
+ controls->setLayout(controlsLayout);
+ }
+}
+
+void Battery::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (event->buttons() == Qt::LeftButton) {
+ if (m_widget->isVisible()) {
+ m_widget->hide();
+ m_extenderVisible = false;
+ } else {
+ m_widget->move(popupPosition(m_widget->sizeHint()));
+ m_widget->show();
+ m_extenderVisible = true;
+ updateStatus();
+ }
+ }
+ Applet::mousePressEvent(event);
+}
+
+void Battery::updateStatus()
+{
+ if (!m_extenderVisible) {
+ return;
+ }
+
+ if (m_numOfBattery && m_batteryLabel) {
+ QHashIterator<QString, QHash<QString, QVariant > > battery_data(m_batteries_data);
+ QString batteryLabelText = QString("<br />");
+ int bnum = 0;
+ while (battery_data.hasNext()) {
+ bnum++;
+ battery_data.next();
+ QString state = battery_data.value()["State"].toString();
+ if (m_numOfBattery == 1) {
+ if (battery_data.value()["Plugged in"].toBool()) {
+ if (state == "NoCharge") {
+ batteryLabelText.append(i18n("<b>Battery:</b> %1% (fully charged)", battery_data.value()["Percent"].toString()));
+ } else if (state == "Discharging") {
+ batteryLabelText.append(i18n("<b>Battery:</b> %1% (discharging)", battery_data.value()["Percent"].toString()));
+ } else {
+ batteryLabelText.append(i18n("<b>Battery:</b> %1% (charging)", battery_data.value()["Percent"].toString()));
+ }
+ } else {
+ batteryLabelText.append(i18nc("Battery is not plugged in", "<b>Battery:</b> not present"));
+ }
+ } else {
+ if (state == "NoCharge") {
+ batteryLabelText.append(i18n("<b>Battery %1:</b> %2% (fully charged)", bnum, battery_data.value()["Percent"].toString()));
+ } else if (state == "Discharging") {
+ batteryLabelText.append(i18n("<b>Battery %1:</b> %2% (discharging)", bnum, battery_data.value()["Percent"].toString()));
+ } else {
+ batteryLabelText.append(i18n("<b>Battery %1:</b> %2% (charging)", bnum, battery_data.value()["Percent"].toString()));
+ }
+ }
+
+ if (m_acadapter_plugged) {
+ batteryLabelText.append(i18n("<br /><b>AC Adapter:</b> Plugged in"));
+ } else {
+ batteryLabelText.append(i18n("<br /><b>AC Adapter:</b> Not plugged in"));
+ }
+ }
+ m_batteryLabel->setText(batteryLabelText);
+ }
+
+ if (!m_availableProfiles.empty() && m_profileCombo) {
+ m_profileCombo->clear();
+ m_profileCombo->addItem(m_currentProfile);
+ foreach (const QString &p, m_availableProfiles) {
+ if (m_currentProfile != p) {
+ m_profileCombo->addItem(p);
+ }
+ }
+ }
+
+ if (m_profileLabel && m_profileCombo) {
+ if (m_availableProfiles.empty()) {
+ m_profileCombo->hide();
+ m_profileLabel->hide();
+ } else {
+ m_profileCombo->show();
+ m_profileLabel->show();
+ }
+ }
+}
+
+void Battery::openConfig()
+{
+ kDebug() << "opening powermanagement configuration dialog";
+ QStringList args;
+ args << "powerdevilconfig";
+ KToolInvocation::kdeinitExec("kcmshell4", args);
+}
+
+void Battery::setProfile(const QString &profile)
+{
+ if (m_currentProfile != profile) {
+ kDebug() << "Changing power profile to " << profile;
+ QDBusConnection dbus( QDBusConnection::sessionBus() );
+ QDBusInterface iface( "org.kde.kded", "/modules/powerdevil", "org.kde.PowerDevil", dbus );
+ iface.call( "refreshStatus" );
+ iface.call( "setProfile", profile );
+ }
+}
+
void Battery::showLabel(bool show)
{
if (m_fadeIn == show) {
@@ -245,7 +564,8 @@
"animationUpdate");
}
-QRectF Battery::scaleRectF(const qreal progress, QRectF rect) {
+QRectF Battery::scaleRectF(const qreal progress, QRectF rect)
+{
if (progress == 1) {
return rect;
}
@@ -269,7 +589,7 @@
return;
}
m_acFadeIn = show;
- const int FadeInDuration = 300;
+ const int FadeInDuration = 600;
// As long as the animation is running, we fake it's still plugged in so it gets
// painted in paintInterface()
m_acadapter_plugged = true;
@@ -323,6 +643,7 @@
// now the animation has ended, we _really_ set it to not show the adapter
if (!m_acFadeIn && (progress == 1)) {
m_acadapter_plugged = false;
+ updateStatus();
}
update();
}
@@ -368,12 +689,19 @@
}
p->setFont(m_font);
- // Let's find a good position for painting the background
+ // Let's find a good position for painting the percentage on top of the battery
m_textRect = QRectF(qMax(qreal(0.0), contentsRect.left() + (contentsRect.width() - text_width) / 2),
contentsRect.top() + ((contentsRect.height() - (int)fm.height()) / 2 * 0.9),
qMin(contentsRect.width(), (int)text_width),
fm.height() * 1.2 );
+ //kDebug() << contentsRect << m_textRect;
+ //p->setBrush(QColor("green"));
+ //p->drawRect(m_textRect);
+ if (m_firstRun) {
+ m_firstRun = false;
+ return;
+ }
// Poor man's highlighting
m_boxColor.setAlphaF(m_alpha);
p->setPen(m_boxColor);
@@ -402,41 +730,17 @@
if (plugState && m_theme->hasElement("Battery")) {
m_theme->paint(p, scaleRectF(m_batteryAlpha, contentsRect), "Battery");
- if (m_batteryStyle == OxygenBattery) {
- if (batteryPercent > 95) {
- fill_element = "Fill100";
- } else if (batteryPercent > 80) {
- fill_element = "Fill80";
- } else if (batteryPercent > 50) {
- fill_element = "Fill60";
- } else if (batteryPercent > 20) {
- fill_element = "Fill40";
- } else if (batteryPercent > 10) {
- fill_element = "Fill20";
- } // Don't show a fillbar below 11% charged
- } else { // OxyenStyle
- if (batteryPercent > 95) {
- fill_element = "Fill100";
- } else if (batteryPercent > 90) {
- fill_element = "Fill90";
- } else if (batteryPercent > 80) {
- fill_element = "Fill80";
- } else if (batteryPercent > 70) {
- fill_element = "Fill70";
- } else if (batteryPercent > 55) {
- fill_element = "Fill60";
- } else if (batteryPercent > 40) {
- fill_element = "Fill50";
- } else if (batteryPercent > 30) {
- fill_element = "Fill40";
- } else if (batteryPercent > 20) {
- fill_element = "Fill30";
- } else if (batteryPercent > 10) {
- fill_element = "Fill20";
- } else if (batteryPercent >= 5) {
- fill_element = "Fill10";
- } // Lower than 5%? Show no fillbar.
- }
+ if (batteryPercent > 95) {
+ fill_element = "Fill100";
+ } else if (batteryPercent > 80) {
+ fill_element = "Fill80";
+ } else if (batteryPercent > 50) {
+ fill_element = "Fill60";
+ } else if (batteryPercent > 20) {
+ fill_element = "Fill40";
+ } else if (batteryPercent > 10) {
+ fill_element = "Fill20";
+ } // Don't show a fillbar below 11% charged
}
//kDebug() << "plugState:" << plugState;
@@ -479,11 +783,11 @@
m_theme->paint(p, ac_contentsRect, "AcAdapter");
}
// Show that there's no battery
- paintLabel(p, contentsRect, I18N_NOOP("n/a"));
+ paintLabel(p, contentsRect, "n/a");
return;
}
- if (m_showMultipleBatteries) {
+ if (m_isEmbedded || m_showMultipleBatteries || m_firstRun) {
// paint each battery with own charge level
int battery_num = 0;
int width = contentsRect.width()/m_numOfBattery;
@@ -495,16 +799,16 @@
width, contentsRect.height());
// paint battery with appropriate charge level
- paintBattery(p, corect, battery_data.value()[I18N_NOOP("Percent")].toInt(), battery_data.value()[I18N_NOOP("Plugged in")].toBool());
+ paintBattery(p, corect, battery_data.value()["Percent"].toInt(), battery_data.value()["Plugged in"].toBool());
- if (m_showBatteryString || m_isHovered) {
+ if (m_showBatteryString || m_isHovered || m_firstRun) {
// Show the charge percentage with a box on top of the battery
QString batteryLabel;
- if (battery_data.value()[I18N_NOOP("Plugged in")].toBool()) {
- batteryLabel = battery_data.value()[I18N_NOOP("Percent")].toString();
+ if (battery_data.value()["Plugged in"].toBool()) {
+ batteryLabel = battery_data.value()["Percent"].toString();
batteryLabel.append("%");
} else {
- batteryLabel = I18N_NOOP("n/a");
+ batteryLabel = "n/a";
}
paintLabel(p, corect, batteryLabel);
}
@@ -518,8 +822,8 @@
QHashIterator<QString, QHash<QString, QVariant > > battery_data(m_batteries_data);
while (battery_data.hasNext()) {
battery_data.next();
- if (battery_data.value()[I18N_NOOP("Plugged in")].toBool()) {
- battery_charge += battery_data.value()[I18N_NOOP("Percent")].toInt();
+ if (battery_data.value()["Plugged in"].toBool()) {
+ battery_charge += battery_data.value()["Percent"].toInt();
has_battery = true;
++battery_num;
}
@@ -529,28 +833,30 @@
}
// paint battery with appropriate charge level
paintBattery(p, contentsRect, battery_charge, has_battery);
- if (m_showBatteryString || m_isHovered) {
+ if (m_isEmbedded || m_showBatteryString || m_isHovered) {
// Show the charge percentage with a box on top of the battery
QString batteryLabel;
- if(has_battery) {
+ if (has_battery) {
batteryLabel = QString::number(battery_charge);
batteryLabel.append("%");
} else {
- batteryLabel = I18N_NOOP("n/a");
+ batteryLabel = "n/a";
}
paintLabel(p, contentsRect, batteryLabel);
}
}
}
-void Battery::connectSources() {
- const QStringList& battery_sources = dataEngine("powermanagement")->query(I18N_NOOP("Battery"))[I18N_NOOP("sources")].toStringList();
+void Battery::connectSources()
+{
+ const QStringList& battery_sources = dataEngine("powermanagement")->query("Battery")["sources"].toStringList();
foreach (const QString &battery_source, battery_sources) {
dataEngine("powermanagement")->connectSource(battery_source, this);
}
- dataEngine("powermanagement")->connectSource(I18N_NOOP("AC Adapter"), this);
+ dataEngine("powermanagement")->connectSource("AC Adapter", this);
+ dataEngine("powermanagement")->connectSource("PowerDevil", this);
connect(dataEngine("powermanagement"), SIGNAL(sourceAdded(QString)),
this, SLOT(sourceAdded(QString)));
@@ -560,13 +866,14 @@
void Battery::disconnectSources()
{
- const QStringList& battery_sources = dataEngine("powermanagement")->query(I18N_NOOP("Battery"))[I18N_NOOP("sources")].toStringList();
+ const QStringList& battery_sources = dataEngine("powermanagement")->query("Battery")["sources"].toStringList();
foreach (const QString &battery_source ,battery_sources) {
dataEngine("powermanagement")->disconnectSource(battery_source, this);
}
- dataEngine("powermanagement")->disconnectSource(I18N_NOOP("AC Adapter"), this);
+ dataEngine("powermanagement")->disconnectSource("AC Adapter", this);
+ dataEngine("powermanagement")->disconnectSource("PowerDevil", this);
disconnect(SLOT(sourceAdded(QString)));
disconnect(SLOT(sourceRemoved(QString)));
@@ -578,15 +885,20 @@
dataEngine("powermanagement")->connectSource(source, this);
m_numOfBattery++;
}
+ if (source == "PowerDevil") {
+ dataEngine("powermanagement")->connectSource(source, this);
+ }
}
void Battery::sourceRemoved(const QString& source)
{
- if (m_batteries_data.contains(source)) {
- m_batteries_data.remove(source);
+ if (m_batteries_data.remove(source)) {
m_numOfBattery--;
update();
}
+ if (source == "PowerDevil") {
+ dataEngine("powermanagement")->disconnectSource(source, this);
+ }
}
#include "battery.moc"
--- applets/battery/batteryConfig.ui
+++ applets/battery/batteryConfig.ui
@@ -6,7 +6,7 @@
<x>0</x>
<y>0</y>
<width>363</width>
- <height>134</height>
+ <height>80</height>
</rect>
</property>
<property name="windowTitle" >
@@ -15,7 +15,7 @@
<property name="accessibleName" >
<string>Configure Battery Monitor</string>
</property>
- <layout class="QVBoxLayout" >
+ <layout class="QVBoxLayout" name="verticalLayout" >
<item>
<widget class="QCheckBox" name="showBatteryStringCheckBox" >
<property name="toolTip" >
@@ -37,38 +37,20 @@
</widget>
</item>
<item>
- <widget class="KButtonGroup" name="styleGroup" >
- <layout class="QVBoxLayout" >
- <item>
- <widget class="QRadioButton" name="oxygenBattery" >
- <property name="text" >
- <string>Oxygen theme</string>
- </property>
- <property name="checked" >
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="classicBattery" >
- <property name="text" >
- <string>Classic theme</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>15</height>
+ </size>
+ </property>
+ </spacer>
</item>
</layout>
</widget>
- <customwidgets>
- <customwidget>
- <class>KButtonGroup</class>
- <extends>QGroupBox</extends>
- <header>kbuttongroup.h</header>
- <container>1</container>
- </customwidget>
- </customwidgets>
<resources/>
<connections/>
</ui>
--- applets/battery/CMakeLists.txt
+++ applets/battery/CMakeLists.txt
@@ -5,13 +5,12 @@
kde4_add_ui_files(battery_SRCS batteryConfig.ui )
kde4_add_plugin(plasma_applet_battery ${battery_SRCS})
-target_link_libraries(plasma_applet_battery plasma ${KDE4_KIO_LIBS})
+target_link_libraries(plasma_applet_battery plasma ${KDE4_KIO_LIBS} ${KDE4_SOLID_LIBS} solidcontrol)
install(TARGETS plasma_applet_battery DESTINATION ${PLUGIN_INSTALL_DIR})
install(FILES plasma-battery-default.desktop DESTINATION ${SERVICES_INSTALL_DIR})
install(FILES
- battery.svg
battery-oxygen.svg
DESTINATION ${DATA_INSTALL_DIR}/desktoptheme/default/widgets/)
--- applets/kickoff/simpleapplet/menuview.cpp
+++ applets/kickoff/simpleapplet/menuview.cpp
@@ -143,7 +143,7 @@
action->setText(name);
} else { // seems we have a perfect desktop-file (likely a KDE one, heh) and name+description are clear separated
if (d->formattype == NameDescription) {
- action->setText(QString("%1 %2").arg(name).arg(text));
+ action->setText(QString("%1 (%2)").arg(name).arg(text));
} else {
action->setText(QString("%1 (%2)").arg(text).arg(name));
}
--- applets/kickoff/simpleapplet/simpleapplet.cpp
+++ applets/kickoff/simpleapplet/simpleapplet.cpp
@@ -31,6 +31,7 @@
#include <QMetaEnum>
#include <QPointer>
#include <QGraphicsLinearLayout>
+#include <QFile>
// KDE
#include <KIcon>
@@ -133,7 +134,10 @@
QString viewIcon() {
switch( viewtype ) {
case Combined:
- return "start-here-kde";
+ if (QFile::exists("/usr/share/icons/oxygen/scalable/places/start-here-branding.svg"))
+ return "start-here-branding";
+ else
+ return "start-here-kde";
case Favorites:
return "bookmarks";
case Applications:
@@ -274,7 +278,7 @@
formatLabel->setBuddy(d->formatComboBox);
d->addItem(d->formatComboBox, i18nc("@item:inlistbox Format:", "Name Only"), MenuLauncherApplet::Name);
d->addItem(d->formatComboBox, i18nc("@item:inlistbox Format:", "Description Only"), MenuLauncherApplet::Description);
- d->addItem(d->formatComboBox, i18nc("@item:inlistbox Format:", "Name Description"), MenuLauncherApplet::NameDescription);
+ d->addItem(d->formatComboBox, i18nc("@item:inlistbox Format:", "Name (Description)"), MenuLauncherApplet::NameDescription);
d->addItem(d->formatComboBox, i18nc("@item:inlistbox Format:", "Description (Name)"), MenuLauncherApplet::DescriptionName);
l->addWidget(d->formatComboBox, 1, 1);
--- applets/kickoff/applet/applet.cpp
+++ applets/kickoff/applet/applet.cpp
@@ -29,6 +29,7 @@
#include <QVBoxLayout>
#include <QLabel>
#include <QGraphicsLinearLayout>
+#include <QFile>
// KDE
#include <KIcon>
@@ -41,6 +42,7 @@
#include <plasma/widgets/icon.h>
#include <plasma/containment.h>
#include <plasma/view.h>
+#include <plasma/tooltipmanager.h>
// Local
#include "ui/launcher.h"
@@ -55,10 +57,12 @@
KIntNumInput *visibleCountEdit;
QList<QAction*> actions;
QAction* switcher;
+ LauncherApplet *q;
- Private() : launcher(0), switcher(0) {}
+ Private(LauncherApplet *lApplet) : launcher(0), switcher(0), q(lApplet) {}
~Private() { delete launcher; }
void createLauncher(LauncherApplet *q);
+ void initToolTip();
};
void LauncherApplet::Private::createLauncher(LauncherApplet *q)
@@ -71,15 +75,28 @@
QObject::connect(launcher, SIGNAL(configNeedsSaving()), q, SIGNAL(configNeedsSaving()));
}
+
+void LauncherApplet::Private::initToolTip()
+{
+ Plasma::ToolTipManager::ToolTipContent data;
+ data.mainText = i18n("Application Launcher");
+ data.subText = i18n("Favorites, applications, computer places, recently used items and desktop sessions");
+ data.image = KIcon(q->icon()).pixmap(IconSize(KIconLoader::Desktop));
+ Plasma::ToolTipManager::self()->setToolTipContent(q, data);
+}
+
LauncherApplet::LauncherApplet(QObject *parent, const QVariantList &args)
: Plasma::Applet(parent,args),
- d(new Private)
+ d(new Private(this))
{
KGlobal::locale()->insertCatalog("plasma_applet_launcher");
setHasConfigurationInterface(true);
setBackgroundHints(NoBackground);
- d->icon = new Plasma::Icon(KIcon("start-here-kde"), QString(), this);
+ if (QFile::exists("/usr/share/icons/oxygen/scalable/places/start-here-branding.svg"))
+ d->icon = new Plasma::Icon(KIcon("start-here-branding"), QString(), this);
+ else
+ d->icon = new Plasma::Icon(KIcon("start-here-kde"), QString(), this);
d->icon->setFlag(ItemIsMovable, false);
connect(d->icon, SIGNAL(pressed(bool)), this, SLOT(toggleMenu(bool)));
connect(this, SIGNAL(activate()), this, SLOT(toggleMenu()));
@@ -113,6 +130,8 @@
connect(d->switcher, SIGNAL(triggered(bool)), this, SLOT(switchMenuStyle()));
resize(IconSize(KIconLoader::Desktop),IconSize(KIconLoader::Desktop));
d->icon->resize(contentsRect().size());
+
+ Plasma::ToolTipManager::self()->registerWidget(this);
}
void LauncherApplet::constraintsEvent(Plasma::Constraints constraints)
@@ -170,6 +189,15 @@
d->switchOnHoverCheckBox->setChecked(d->launcher->switchTabsOnHover());
}
+void LauncherApplet::toolTipAboutToShow()
+{
+ if (d->launcher && d->launcher->isVisible()) {
+ Plasma::ToolTipManager::self()->clearToolTipContent(this);
+ } else {
+ d->initToolTip();
+ }
+}
+
void LauncherApplet::configAccepted()
{
bool switchTabsOnHover = d->switchOnHoverCheckBox->isChecked();
@@ -197,6 +225,7 @@
void LauncherApplet::toggleMenu()
{
if (!d->launcher) {
+ Plasma::ToolTipManager::self()->clearToolTipContent(this);
d->createLauncher(this);
}
--- applets/kickoff/applet/plasma-applet-launcher.desktop
+++ applets/kickoff/applet/plasma-applet-launcher.desktop
@@ -96,7 +96,7 @@
Comment[nds]=Röppt Programmen op
Comment[ne]=अनुप्रयोग सुरुआत गर्न सुरुआतकर्ता
Comment[nl]=Applet voor het starten van programma's
-Comment[nn]=Start program
+Comment[nn]=Moderne programstartar
Comment[pa]=ਐਪਲੀਕੇਸ਼ਨ ਚਲਾਉਣ ਲਈ ਲਾਂਚਰ
Comment[pl]=Uruchamianie programów
Comment[pt]=Lançador para iniciar aplicações
--- applets/kickoff/applet/applet.h
+++ applets/kickoff/applet/applet.h
@@ -53,6 +53,7 @@
public slots:
void switchMenuStyle();
void startMenuEditor();
+ void toolTipAboutToShow();
protected slots:
void configAccepted();
--- applets/kickoff/core/systemmodel.cpp
+++ applets/kickoff/core/systemmodel.cpp
@@ -87,7 +87,7 @@
connect(placesModel, SIGNAL(rowsRemoved(QModelIndex,int,int)),
q, SLOT(sourceRowsRemoved(QModelIndex,int,int)));
- topLevelSections << i18n("Applications")
+ topLevelSections << i18n("Administration")
<< i18n("Places")
<< i18n("Removable Storage")
<< i18n("Storage");
@@ -248,17 +248,32 @@
KService::Ptr service = d->appsList[index.row()];
- switch(role) {
- case Qt::DisplayRole:
- return service->name();
- case Qt::DecorationRole:
- return KIcon(service->icon());
- case SubTitleRole:
- return service->genericName();
- case UrlRole:
- return service->entryPath();
- default:
- return QVariant();
+ if (service->name()=="sysinfo") {
+ switch(role) {
+ case Qt::DisplayRole:
+ return i18n("System Information");
+ case Qt::DecorationRole:
+ return KIcon("hwinfo");
+ case SubTitleRole:
+ return "sysinfo:/";
+ case UrlRole:
+ return "sysinfo:/";
+ default:
+ return QVariant();
+ }
+ } else {
+ switch(role) {
+ case Qt::DisplayRole:
+ return service->name();
+ case Qt::DecorationRole:
+ return KIcon(service->icon());
+ case SubTitleRole:
+ return service->genericName();
+ case UrlRole:
+ return service->entryPath();
+ default:
+ return QVariant();
+ }
}
}
--- applets/kickoff/core/leavemodel.cpp
+++ applets/kickoff/core/leavemodel.cpp
@@ -27,6 +27,8 @@
#include <KLocalizedString>
#include <KIcon>
#include <solid/powermanagement.h>
+#include <solid/control/powermanager.h>
+#include <KConfigGroup>
// Local
#include "core/models.h"
@@ -42,7 +44,7 @@
//Q_ASSERT(KUrl(url).scheme() == "leave");
QStandardItem *item = new QStandardItem();
const QString basename = QFileInfo(url).baseName();
- if (basename == "logout") {
+ if (basename == "logoutonly") {
item->setText(i18n("Logout"));
item->setIcon(KIcon("system-log-out"));
item->setData(i18n("End session"),Kickoff::SubTitleRole);
@@ -60,12 +62,12 @@
else if (basename == "sleep") {
item->setText(i18n("Sleep"));
item->setIcon(KIcon("system-suspend"));
- item->setData(url,Kickoff::SubTitleRole);
+ item->setData(i18n("Suspend to RAM"),Kickoff::SubTitleRole);
}
else if (basename == "hibernate") {
item->setText(i18n("Hibernate"));
item->setIcon(KIcon("system-suspend-hibernate"));
- item->setData(url,Kickoff::SubTitleRole);
+ item->setData(i18n("Suspend to Disk"),Kickoff::SubTitleRole);
}
else if (basename == "shutdown") {
item->setText(i18n("Shutdown"));
@@ -77,6 +79,26 @@
item->setIcon(KIcon("system-restart"));
item->setData(i18n("Restart the computer"),Kickoff::SubTitleRole);
}
+ else if (basename == "savesession") {
+ item->setText(i18n("Save Session"));
+ item->setIcon(KIcon("document-save"));
+ item->setData(i18n("Save current session for next login"),Kickoff::SubTitleRole);
+ }
+ else if (basename == "standby") {
+ item->setText(i18n("Standby"));
+ item->setIcon(KIcon("system-suspend"));
+ item->setData(i18n("Pause without logging out"),Kickoff::SubTitleRole);
+ }
+ else if (basename == "suspenddisk") {
+ item->setText(i18n("Suspend to Disk"));
+ item->setIcon(KIcon("system-suspend-hibernate"));
+ item->setData(i18n("Pause without logging out"),Kickoff::SubTitleRole);
+ }
+ else if (basename == "suspendram") {
+ item->setText(i18n("Suspend to RAM"));
+ item->setIcon(KIcon("system-suspend-hibernate"));
+ item->setData(i18n("Pause without logging out"),Kickoff::SubTitleRole);
+ }
else {
item->setText(basename);
item->setData(url,Kickoff::SubTitleRole);
@@ -89,17 +111,30 @@
: QStandardItemModel(parent)
, d(0)
{
+}
+
+void LeaveModel::updateModel()
+{
+ clear();
+
// Session Options
QStandardItem *sessionOptions = new QStandardItem(i18n("Session"));
// Logout
- QStandardItem *logoutOption = createStandardItem("leave:/logout");
+ QStandardItem *logoutOption = createStandardItem("leave:/logoutonly");
sessionOptions->appendRow(logoutOption);
// Lock
QStandardItem *lockOption = createStandardItem("leave:/lock");
sessionOptions->appendRow(lockOption);
+ // Save Session
+ KConfigGroup c(KSharedConfig::openConfig("ksmserverrc", KConfig::NoGlobals), "General");
+ if (c.readEntry( "loginMode") == "restoreSavedSession") {
+ QStandardItem *saveSessionOption = createStandardItem("leave:/savesession");
+ sessionOptions->appendRow(saveSessionOption);
+ }
+
// Switch User
QStandardItem *switchUserOption = createStandardItem("leave:/switch");
sessionOptions->appendRow(switchUserOption);
@@ -122,6 +157,24 @@
systemOptions->appendRow(hibernateOption);
}
+ Solid::Control::PowerManager::SuspendMethods spdMethods = Solid::Control::PowerManager::supportedSuspendMethods();
+ if( spdMethods & Solid::Control::PowerManager::Standby ) {
+ QStandardItem *standbyOption = createStandardItem("leave:/standby");
+ systemOptions->appendRow(standbyOption);
+ }
+
+#if 0
+ if( spdMethods & Solid::Control::PowerManager::ToRam ) {
+ QStandardItem *suspendramOption = createStandardItem("leave:/suspendram");
+ systemOptions->appendRow(suspendramOption);
+ }
+
+ if( spdMethods & Solid::Control::PowerManager::ToDisk ) {
+ QStandardItem *suspenddiskOption = createStandardItem("leave:/suspenddisk");
+ systemOptions->appendRow(suspenddiskOption);
+ }
+#endif
+
// Shutdown
QStandardItem *shutDownOption = createStandardItem("leave:/shutdown");
systemOptions->appendRow(shutDownOption);
--- applets/kickoff/core/itemhandlers.cpp
+++ applets/kickoff/core/itemhandlers.cpp
@@ -29,6 +29,8 @@
#include <KToolInvocation>
#include <KUrl>
#include <solid/powermanagement.h>
+#include <solid/control/powermanager.h>
+#include <kjob.h>
// KDE Base
#include <kworkspace/kworkspace.h>
@@ -39,6 +41,7 @@
// DBus
#include "krunner_interface.h"
#include "screensaver_interface.h"
+#include "ksmserver_interface.h"
using namespace Kickoff;
@@ -78,11 +81,27 @@
// decouple dbus call, otherwise we'll run into a dead-lock
QTimer::singleShot(0, this, SLOT(switchUser()));
return true;
- } else if (m_logoutAction == "logout" ||
+ } else if (m_logoutAction == "logout" || m_logoutAction == "logoutonly" ||
m_logoutAction == "restart" || m_logoutAction == "shutdown" ) {
// decouple dbus call, otherwise we'll run into a dead-lock
QTimer::singleShot(0, this, SLOT(logout()));
return true;
+ } else if (m_logoutAction == "savesession") {
+ // decouple dbus call, otherwise we'll run into a dead-lock
+ QTimer::singleShot(0, this, SLOT(saveSession()));
+ return true;
+ } else if (m_logoutAction == "standby") {
+ // decouple dbus call, otherwise we'll run into a dead-lock
+ QTimer::singleShot(0, this, SLOT(standby()));
+ return true;
+ } else if (m_logoutAction == "suspendram") {
+ // decouple dbus call, otherwise we'll run into a dead-lock
+ QTimer::singleShot(0, this, SLOT(suspendRAM()));
+ return true;
+ } else if (m_logoutAction == "suspenddisk") {
+ // decouple dbus call, otherwise we'll run into a dead-lock
+ QTimer::singleShot(0, this, SLOT(suspendDisk()));
+ return true;
}
return false;
@@ -95,6 +114,8 @@
if (m_logoutAction == "logout") {
type = KWorkSpace::ShutdownTypeNone;
+ } else if (m_logoutAction == "logoutonly") {
+ type = KWorkSpace::ShutdownTypeLogout;
} else if (m_logoutAction == "lock") {
kDebug() << "Locking screen";
} else if (m_logoutAction == "switch") {
@@ -130,3 +151,38 @@
krunner.switchUser();
}
}
+
+void LeaveItemHandler::saveSession()
+{
+ QString interface("org.kde.ksmserver");
+
+ org::kde::KSMServerInterface ksmserver(interface, "/KSMServer",
+ QDBusConnection::sessionBus());
+ if (ksmserver.isValid()) {
+ ksmserver.saveCurrentSession();
+ }
+}
+
+void LeaveItemHandler::standby()
+{
+ Solid::Control::PowerManager::SuspendMethod spdMethod = Solid::Control::PowerManager::Standby;
+ KJob *job = Solid::Control::PowerManager::suspend( spdMethod );
+ if (job != 0)
+ job->start();
+}
+
+void LeaveItemHandler::suspendRAM()
+{
+ Solid::Control::PowerManager::SuspendMethod spdMethod = Solid::Control::PowerManager::ToRam;
+ KJob *job = Solid::Control::PowerManager::suspend( spdMethod );
+ if (job != 0)
+ job->start();
+}
+
+void LeaveItemHandler::suspendDisk()
+{
+ Solid::Control::PowerManager::SuspendMethod spdMethod = Solid::Control::PowerManager::ToDisk;
+ KJob *job = Solid::Control::PowerManager::suspend( spdMethod );
+ if (job != 0)
+ job->start();
+}
--- applets/kickoff/core/leavemodel.h
+++ applets/kickoff/core/leavemodel.h
@@ -36,6 +36,8 @@
static QStandardItem* createStandardItem(const QString& url);
+ void updateModel();
+
private:
class Private;
Private * const d;
--- applets/kickoff/core/favoritesmodel.cpp
+++ applets/kickoff/core/favoritesmodel.cpp
@@ -138,6 +138,11 @@
}
void FavoritesModel::add(const QString& url)
{
+ KService::Ptr service = KService::serviceByStorageId(url);
+ if (!service) {
+ return;
+ }
+
Private::globalFavoriteList << url;
Private::globalFavoriteSet << url;
--- applets/kickoff/core/models.cpp
+++ applets/kickoff/core/models.cpp
@@ -155,7 +155,19 @@
{
KConfigGroup appsGroup = componentData().config()->group("SystemApplications");
QStringList apps;
- apps << "systemsettings";
+
+ if (QFile::exists("/usr/share/applications/YaST.desktop"))
+ apps << "YaST.desktop";
+
+ if (QFile::exists("/usr/share/applications/package-manager.desktop"))
+ apps << "package-manager.desktop";
+
+ if (KService::serviceByStorageId("YaST2/live-installer.desktop"))
+ apps << "YaST2/live-installer.desktop";
+
+ if (QFile::exists("/usr/share/kde4/services/sysinfo.protocol"))
+ apps << "/usr/share/kde4/services/sysinfo.protocol";
+
apps = appsGroup.readEntry("DesktopFiles", apps);
return apps;
}
--- applets/kickoff/core/itemhandlers.h
+++ applets/kickoff/core/itemhandlers.h
@@ -42,6 +42,10 @@
void logout();
void lock();
void switchUser();
+ void saveSession();
+ void standby();
+ void suspendRAM();
+ void suspendDisk();
private:
QString m_logoutAction;
--- applets/kickoff/core/applicationmodel.cpp
+++ applets/kickoff/core/applicationmodel.cpp
@@ -110,6 +110,8 @@
static bool AppNodeLessThan(AppNode *n1, AppNode *n2);
void fillNode(const QString &relPath, AppNode *node);
+ void addAppNode(const QString &icon, const QString &appName, const QString &genericName,
+ const QString& relPath, const QString &desktopEntry, bool isDir, AppNode *parent);
static QHash<QString,QString> iconNameMap();
ApplicationModel *q;
@@ -118,6 +120,9 @@
Qt::SortOrder sortOrder;
int sortColumn;
QStringList systemApplications;
+
+ QStringList newInstalledPrograms, seenPrograms;
+ QString currentDate;
};
bool ApplicationModelPrivate::AppNodeLessThan(AppNode *n1, AppNode *n2)
@@ -134,78 +139,150 @@
void ApplicationModelPrivate::fillNode(const QString &_relPath, AppNode *node)
{
+ if (_relPath=="new/") {
+ for (QStringList::ConstIterator it = newInstalledPrograms.begin(); it != newInstalledPrograms.end(); ++it) {
+ KService::Ptr p = KService::serviceByStorageId((*it));
+
+ if (p->noDisplay()) {
+ continue;
+ }
+
+ AppNode *newnode = new AppNode();
+ newnode->icon = KIcon(p->icon());
+ newnode->appName = p->name();
+ newnode->genericName = p->genericName();
+ newnode->relPath = QString();
+ newnode->desktopEntry = p->entryPath();
+ newnode->isDir = false;
+ newnode->parent = node;
+ node->children.append(newnode);
+ }
+ return;
+ }
+
KServiceGroup::Ptr root = KServiceGroup::group(_relPath);
if (!root || !root->isValid()) return;
KServiceGroup::List list = root->entries();
- // application name <-> service map for detecting duplicate entries
- QHash<QString,KService::Ptr> existingServices;
+ KSortableList<KSharedPtr<KSycocaEntry>,QByteArray> slist;
+ KSortableList<KSharedPtr<KSycocaEntry>,QByteArray> glist;
+ QMap<QString,QString> specialTitle;
+ QMap<QString,QString> categoryIcon;
+ QMap<QString,QString> shortenedMenuPath;
+
for (KServiceGroup::List::ConstIterator it = list.begin();
it != list.end(); ++it)
{
- QString icon;
- QString appName;
- QString genericName;
- QString relPath = _relPath;
- QString desktopEntry;
- bool isDir = false;
const KSycocaEntry::Ptr p = (*it);
if (p->isType(KST_KService))
{
const KService::Ptr service = KService::Ptr::staticCast(p);
+ slist.insert( service->name().toLocal8Bit(), p);
+ }
+ else if (p->isType(KST_KServiceGroup))
+ {
+ KServiceGroup::Ptr serviceGroup = KServiceGroup::Ptr::staticCast(p);
+ if ( serviceGroup->SuSEshortMenu() ){
+ KServiceGroup::List l = serviceGroup->entries(true, true /*excludeNoDisplay_*/, false );
+ if ( l.count() == 1 ) {
+ // the special case, we want to short the menu.
+ // TOFIX? : this works only for one level
+ KServiceGroup::List::ConstIterator _it=l.begin();
+ const KSycocaEntry::Ptr _e = (*_it);
+ if (_e->isType(KST_KService)) {
+ const KService::Ptr s = KService::Ptr::staticCast(_e);
+ QString key;
+ if ( serviceGroup->SuSEgeneralDescription() )
+ key = s->name();
+ else {
+ // we use the normal menu description
+ key = s->name();
+ if( !s->genericName().isEmpty() && serviceGroup->caption()!=s->genericName())
+ key = serviceGroup->caption() + " (" + s->name() + ")";
+ }
+ specialTitle.insert( _e->name(), key );
+ categoryIcon.insert( _e->name(), serviceGroup->icon() );
+ slist.insert( key.toLocal8Bit(), _e );
+ shortenedMenuPath.insert( _e->name(), serviceGroup->relPath() );
+ // and escape from here
+ continue;
+ }
+ }
+ }
+ glist.insert( serviceGroup->caption().toLocal8Bit(), p );
+ }
+ else
+ slist.insert( p->name().toLocal8Bit(), p);
+ }
+
+ list = root->SuSEsortEntries( slist, glist, true /*excludeNoDisplay_*/, false );
+
+ for( KServiceGroup::List::ConstIterator it = list.begin();
+ it != list.end(); ++it)
+ {
+ const KSycocaEntry::Ptr p = (*it);
+ if (p->isType(KST_KService))
+ {
+ const KService::Ptr service = KService::Ptr::staticCast(p);
+
if (service->noDisplay())
continue;
- icon = service->icon();
- appName = service->name();
- genericName = service->genericName();
- desktopEntry = service->entryPath();
-
- // check for duplicates (eg. KDE 3 and KDE 4 versions of application
- // both present)
- if (duplicatePolicy == ApplicationModel::ShowLatestOnlyPolicy &&
- existingServices.contains(appName)
- ) {
- if (Kickoff::isLaterVersion(existingServices[appName],service)) {
- continue;
- } else {
- // find and remove the existing entry with the same name
- for (int i = 0 ; i < node->children.count() ; i++) {
- if ( node->children[i]->appName == appName ) {
- delete node->children.takeAt(i);
- }
- }
- }
- }
// don't duplicate applications that are configured to appear in the System tab
// in the Applications tab
if ( systemApplications.contains( service->desktopEntryName() ) ) {
continue;
}
- existingServices[appName] = service;
+ QString menuPath;
+ if (shortenedMenuPath[service->name()].isEmpty())
+ menuPath=_relPath+service->menuId();
+ else
+ menuPath=shortenedMenuPath[service->name()]+service->menuId();
+
+ QString icon = categoryIcon[service->name()];
+ if (icon.isEmpty())
+ icon = service->icon();
+
+ QString name = specialTitle[service->name()];
+ if (name.isEmpty())
+ name = service->name();
+
+ QString genericName = service->genericName();
+ if (genericName.isEmpty()) {
+ genericName = name;
+ name = QString::null;
+ }
+
+ if (name==genericName)
+ name = QString::null;
+
+ addAppNode(icon, name, genericName, _relPath, service->entryPath(), false, node);
}
else if (p->isType(KST_KServiceGroup))
{
- const KServiceGroup::Ptr serviceGroup = KServiceGroup::Ptr::staticCast(p);
+ KServiceGroup::Ptr serviceGroup = KServiceGroup::Ptr::staticCast(p);
+ if ( serviceGroup->SuSEshortMenu() ){
+ KServiceGroup::List l = serviceGroup->entries(true, true /*excludeNoDisplay_*/ );
+ if ( l.count() == 1 )
+ continue;
+ }
+ // standard sub menu
+
if (serviceGroup->noDisplay() || serviceGroup->childCount() == 0)
continue;
kDebug(250) << "Service group" << serviceGroup->entryPath() << serviceGroup->icon()
<< serviceGroup->relPath() << serviceGroup->directoryEntryPath();
- icon = serviceGroup->icon();
- if (iconNameMap().contains(icon)) {
+ QString icon = serviceGroup->icon();
+ if (iconNameMap().contains(icon))
icon = iconNameMap().value(icon);
- }
- genericName = serviceGroup->caption();
- relPath = serviceGroup->relPath();
- appName = serviceGroup->comment();
- isDir = true;
+ addAppNode(icon, serviceGroup->comment(), serviceGroup->caption(), serviceGroup->relPath(), QString::null, true, node);
}
else
{
@@ -213,18 +290,35 @@
continue;
}
+ }
+
+ qStableSort(node->children.begin(), node->children.end(), ApplicationModelPrivate::AppNodeLessThan);
+
+ if (_relPath.isEmpty() && newInstalledPrograms.count()) {
AppNode *newnode = new AppNode();
- newnode->icon = KIcon(icon);
- newnode->appName = appName;
- newnode->genericName = genericName;
- newnode->relPath = relPath;
- newnode->desktopEntry = desktopEntry;
- newnode->isDir = isDir;
+ newnode->icon = KIcon("chronometer");
+ newnode->appName = QString();
+ newnode->genericName = i18n("Recently Installed");
+ newnode->relPath = "new/";
+ newnode->desktopEntry = QString();
+ newnode->isDir = true;
newnode->parent = node;
- node->children.append(newnode);
+ node->children.prepend(newnode);
}
+}
- qStableSort(node->children.begin(), node->children.end(), ApplicationModelPrivate::AppNodeLessThan);
+void ApplicationModelPrivate::addAppNode(const QString &icon, const QString &appName, const QString &genericName,
+ const QString& relPath, const QString &desktopEntry, bool isDir, AppNode *parent )
+{
+ AppNode *newnode = new AppNode();
+ newnode->icon = KIcon(icon);
+ newnode->appName = appName;
+ newnode->genericName = genericName;
+ newnode->relPath = relPath;
+ newnode->desktopEntry = desktopEntry;
+ newnode->isDir = isDir;
+ newnode->parent = parent;
+ parent->children.append(newnode);
}
ApplicationModel::ApplicationModel(QObject *parent)
@@ -236,6 +330,7 @@
dbus.connect(QString(), "/kickoff", "org.kde.plasma", "reloadMenu", this, SLOT(slotReloadMenu()));
connect(KSycoca::self(), SIGNAL(databaseChanged()), this, SLOT(checkSycocaChange()));
d->fillNode(QString(), d->root);
+ createNewProgramList();
}
ApplicationModel::~ApplicationModel()
@@ -384,6 +479,7 @@
d->root = new AppNode();
d->fillNode(QString(), d->root);
reset();
+ createNewProgramList();
}
void ApplicationModel::checkSycocaChange()
@@ -398,6 +494,100 @@
return d->duplicatePolicy;
}
+void ApplicationModel::createNewProgramList()
+{
+ KConfigGroup kickoffrc = Kickoff::componentData().config()->group("Applications");
+ d->seenPrograms = kickoffrc.readEntry("FirstSeen", QStringList());
+ d->newInstalledPrograms.clear();
+
+ d->currentDate = QDate::currentDate().toString(Qt::ISODate);
+
+ bool initialize = (d->seenPrograms.count() == 0);
+
+ bool seenProgramsChanged = createNewProgramList(QString::null);
+
+ if (initialize) {
+ for (QStringList::Iterator it = d->seenPrograms.begin(); it != d->seenPrograms.end(); ++it) {
+ *(++it) = "-";
+ }
+
+ d->newInstalledPrograms.clear();
+ }
+
+ if (seenProgramsChanged) {
+ kickoffrc.writeEntry("FirstSeen", d->seenPrograms);
+ kickoffrc.sync();
+ }
+}
+
+bool ApplicationModel::createNewProgramList(QString relPath)
+{
+ bool seenProgramsChanged = false;
+
+ KServiceGroup::Ptr group = KServiceGroup::group(relPath);
+ if (!group || !group->isValid()) {
+ return false;
+ }
+
+ KServiceGroup::List list = group->entries();
+ if (list.isEmpty()) {
+ return false;
+ }
+
+ KServiceGroup::List::ConstIterator it = list.begin();
+ for (; it != list.end(); ++it) {
+ KSycocaEntry::Ptr e = (*it);
+
+ if (e) {
+ if (e->isType(KST_KServiceGroup)) {
+ KServiceGroup::Ptr g(KServiceGroup::Ptr::staticCast(e));
+ if(!g->noDisplay()) {
+ seenProgramsChanged |= createNewProgramList(g->relPath());
+ }
+ } else if (e->isType(KST_KService)) {
+ KService::Ptr s(KService::Ptr::staticCast(e));
+ if (s->isApplication() && !s->noDisplay() ) {
+ QString shortStorageId = s->storageId().replace(".desktop", QString::null);
+ QStringList::Iterator it_find = d->seenPrograms.begin();
+ QStringList::Iterator it_end = d->seenPrograms.end();
+ bool found = false;
+ for (; it_find != it_end; ++it_find) {
+ if (*(it_find)==shortStorageId) {
+ found = true;
+ break;
+ }
+ ++it_find;
+ }
+ if (!found) {
+ seenProgramsChanged = true;
+ d->seenPrograms += shortStorageId;
+ d->seenPrograms += d->currentDate;
+ if (d->newInstalledPrograms.indexOf(s->storageId())==-1) {
+ d->newInstalledPrograms += s->storageId();
+ }
+ }
+ else {
+ ++it_find;
+ if (*(it_find)!="-") {
+ QDate date = QDate::fromString(*(it_find), Qt::ISODate);
+ if (date.daysTo(QDate::currentDate())<3) {
+ if (d->newInstalledPrograms.indexOf(s->storageId())==-1) {
+ d->newInstalledPrograms += s->storageId();
+ }
+ }
+ else {
+ seenProgramsChanged=true;
+ (*it_find)="-";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ return seenProgramsChanged;
+}
+
/**
* FIXME This is a temporary workaround to map the icon names found
* in the desktop directory files (from /usr/share/desktop-directories)
--- applets/kickoff/core/applicationmodel.h
+++ applets/kickoff/core/applicationmodel.h
@@ -86,10 +86,15 @@
void slotReloadMenu();
void checkSycocaChange();
+ protected slots:
+ void createNewProgramList();
+
private:
friend class ApplicationModelPrivate;
ApplicationModelPrivate *const d;
+ bool createNewProgramList(QString relPath);
+
Q_DISABLE_COPY(ApplicationModel)
};
--- applets/kickoff/CMakeLists.txt
+++ applets/kickoff/CMakeLists.txt
@@ -33,6 +33,10 @@
QT4_ADD_DBUS_INTERFACE(Kickoff_SRCS ${screensaver_xml} screensaver_interface)
set(krunner_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/krunner/org.kde.krunner.Interface.xml)
QT4_ADD_DBUS_INTERFACE(Kickoff_SRCS ${krunner_xml} krunner_interface)
+
+set(ksmserver_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/ksmserver/org.kde.KSMServerInterface.xml)
+QT4_ADD_DBUS_INTERFACE(Kickoff_SRCS ${ksmserver_xml} ksmserver_interface)
+
if(NOT WIN32)
set ( Kickoff_LIBS
${KDE4_KIO_LIBS}
@@ -63,13 +67,13 @@
# Kickoff Plasma Applet
set ( Applet_SRCS ${Kickoff_SRCS} applet/applet.cpp )
kde4_add_plugin(plasma_applet_launcher ${Applet_SRCS})
-target_link_libraries(plasma_applet_launcher plasma ${Kickoff_LIBS})
+target_link_libraries(plasma_applet_launcher plasma solidcontrol ${Kickoff_LIBS})
install(TARGETS plasma_applet_launcher DESTINATION ${PLUGIN_INSTALL_DIR})
install(FILES applet/plasma-applet-launcher.desktop DESTINATION ${SERVICES_INSTALL_DIR})
# Simple KMenu Plasma Applet
set ( SimpleApplet_SRCS ${Kickoff_SRCS} simpleapplet/menuview.cpp simpleapplet/simpleapplet.cpp )
kde4_add_plugin(plasma_applet_simplelauncher ${SimpleApplet_SRCS})
-target_link_libraries(plasma_applet_simplelauncher plasma ${Kickoff_LIBS})
+target_link_libraries(plasma_applet_simplelauncher plasma solidcontrol ${Kickoff_LIBS})
install(TARGETS plasma_applet_simplelauncher DESTINATION ${PLUGIN_INSTALL_DIR})
install(FILES simpleapplet/plasma-applet-simplelauncher.desktop DESTINATION ${SERVICES_INSTALL_DIR})
--- applets/kickoff/ui/launcher.cpp
+++ applets/kickoff/ui/launcher.cpp
@@ -80,6 +80,7 @@
, urlLauncher(new UrlItemLauncher(launcher))
, resizeHandle(0)
, searchModel(0)
+ , leaveModel(0)
, searchBar(0)
, footer(0)
, contentArea(0)
@@ -152,14 +153,14 @@
void setupLeaveView()
{
- LeaveModel *model = new LeaveModel(q);
+ leaveModel = new LeaveModel(q);
UrlItemView *view = new UrlItemView;
ItemDelegate *delegate = new ItemDelegate(q);
delegate->setRoleMapping(Plasma::Delegate::SubTitleRole, SubTitleRole);
delegate->setRoleMapping(Plasma::Delegate::SubTitleMandatoryRole, SubTitleMandatoryRole);
view->setItemDelegate(delegate);
view->setItemStateProvider(delegate);
- addView(i18n("Leave"), KIcon("system-shutdown"), model, view);
+ addView(i18n("Leave"), KIcon("system-shutdown"), leaveModel, view);
}
void setupFavoritesView()
@@ -420,6 +421,7 @@
FlipScrollView *applicationView;
QAbstractItemView *searchView;
QAbstractItemView *favoritesView;
+ LeaveModel *leaveModel;
ContextMenuFactory *contextMenuFactory;
bool autoHide;
int visibleItemCount;
@@ -697,6 +699,7 @@
d->contentArea->setCurrentWidget(d->favoritesView);
d->searchBar->clear();
d->applicationView->viewRoot();
+ d->leaveModel->updateModel();
}
Launcher::~Launcher()
@@ -868,7 +871,9 @@
void Launcher::openHomepage()
{
hide();
- KToolInvocation::invokeBrowser("http://www.kde.org/");
+ KConfig config("kickoffrc");
+ KConfigGroup group = config.group("Branding");
+ KToolInvocation::invokeBrowser(group.readEntry("Homepage", "http://www.kde.org/"));
}
void Launcher::resultsAvailable()
--- applets/pager/plasma-pager-default.desktop
+++ applets/pager/plasma-pager-default.desktop
@@ -1,5 +1,6 @@
[Desktop Entry]
Name=Pager
+Name[ar]=جهاز النداء
Name[bg]=Пейджър
Name[bn_IN]=পেজার
Name[ca]=Paginador
@@ -47,6 +48,7 @@
Name[x-test]=xxPagerxx
Name[zh_CN]=分页器
Name[zh_TW]=呼叫器
+Comment=Switch between virtual desktops
Type=Service
X-KDE-ServiceTypes=Plasma/Applet
--- wallpapers/image/Messages.sh
+++ wallpapers/image/Messages.sh
@@ -0,0 +1,2 @@
+#! /usr/bin/env bash
+$XGETTEXT *.cpp -o $podir/plasma_wallpaper_image.pot
Property changes on: wallpapers/image/Messages.sh
___________________________________________________________________
Added: svn:executable
+ *
--- wallpapers/image/backgroundpackage.h
+++ wallpapers/image/backgroundpackage.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License 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 BACKGROUNDPACKAGE_H
+#define BACKGROUNDPACKAGE_H
+
+#include <memory>
+#include <QImage>
+#include <QPersistentModelIndex>
+#include <QPixmap>
+#include <QSize>
+#include <QThread>
+#include <QVariant>
+#include <ThreadWeaver/Job>
+#include <plasma/package.h>
+
+namespace Plasma { class PackageMetadata; }
+
+class DummyObject : public QObject
+{
+Q_OBJECT
+signals:
+ void done(ThreadWeaver::Job *);
+};
+
+class Background : public QObject
+{
+Q_OBJECT
+public:
+ enum ResizeMethod {
+ Scale,
+ Center,
+ ScaleCrop,
+ Tiled,
+ CenterTiled,
+ Maxpect
+ };
+
+ static const int SCREENSHOT_HEIGHT = 60;
+
+ virtual ~Background();
+
+ virtual QString path() const = 0;
+ virtual QString findBackground(const QSize &resolution,
+ ResizeMethod method) const = 0;
+ virtual QPixmap screenshot() const = 0;
+ virtual bool screenshotGenerationStarted() const = 0;
+ virtual void generateScreenshot(QPersistentModelIndex index) const = 0;
+ virtual QString title() const = 0;
+ virtual QString author() const = 0;
+ virtual QString email() const = 0;
+ virtual QString license() const = 0;
+
+ virtual bool isValid() const = 0;
+
+protected:
+ static QImage defaultScreenshot();
+ static QImage createScreenshot(const QString &path, float ratio);
+ friend class ResizeThread;
+};
+
+class BackgroundPackage : public Background,
+ public Plasma::Package
+{
+Q_OBJECT
+public:
+ BackgroundPackage(const QString &path, float ratio);
+
+ virtual QString path() const;
+ virtual QString findBackground(const QSize &resolution,
+ ResizeMethod method) const;
+ virtual QPixmap screenshot() const;
+ virtual bool screenshotGenerationStarted() const;
+ virtual void generateScreenshot(QPersistentModelIndex index) const;
+ virtual QString author() const;
+ virtual QString title() const;
+ virtual QString email() const;
+ virtual QString license() const;
+ virtual bool isValid() const;
+private:
+ QString resString(const QSize &size) const;
+ QSize resSize(const QString &res) const;
+
+ float distance(const QSize &size,
+ const QSize &desired,
+ ResizeMethod method) const;
+
+ QString m_path;
+ float m_ratio;
+ mutable QPixmap m_screenshot;
+};
+
+class BackgroundFile : public Background
+{
+Q_OBJECT
+public:
+ BackgroundFile(const QString &file, float ratio);
+ virtual ~BackgroundFile();
+
+ virtual QString path() const;
+ virtual QString findBackground(const QSize &resolution,
+ ResizeMethod method) const;
+ virtual bool screenshotGenerationStarted() const;
+ virtual void generateScreenshot(QPersistentModelIndex index) const;
+ virtual QPixmap screenshot() const;
+ virtual QString author() const;
+ virtual QString title() const;
+ virtual QString email() const;
+ virtual QString license() const;
+ virtual bool isValid() const;
+private:
+ QString m_file, m_author, m_title;
+ float m_ratio;
+
+ mutable bool m_resizer_started;
+ mutable QPixmap m_screenshot;
+private slots:
+ void updateScreenshot(ThreadWeaver::Job *);
+signals:
+ void screenshotDone(QPersistentModelIndex index);
+};
+
+#endif // BACKGROUNDPACKAGE_H
--- wallpapers/image/backgroundlistmodel.h
+++ wallpapers/image/backgroundlistmodel.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+
+ 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.
+*/
+
+#ifndef BACKGROUNDLISTMODEL_H
+#define BACKGROUNDLISTMODEL_H
+
+#include <QAbstractListModel>
+#include <KDirWatch>
+
+class Background;
+
+class BackgroundContainer
+{
+public:
+ virtual ~BackgroundContainer() {};
+ virtual bool contains(const QString &path) const = 0;
+};
+
+class BackgroundListModel : public QAbstractListModel, public BackgroundContainer
+{
+public:
+ BackgroundListModel(float ratio, QObject *listener);
+ virtual ~BackgroundListModel();
+
+ virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+ Background* package(int index) const;
+
+ void reload();
+ void reload(const QStringList &selected);
+ void addBackground(const QString &path);
+ int indexOf(const QString &path) const;
+ void removeBackground(const QString &path);
+ virtual bool contains(const QString &bg) const;
+
+ static QList<Background *> findAllBackgrounds(const BackgroundContainer *container,
+ const QString &path, float ratio);
+
+private:
+ QObject *m_listener;
+ QList<Background*> m_packages;
+ float m_ratio;
+ KDirWatch m_dirwatch;
+};
+
+#endif // BACKGROUNDLISTMODEL_H
--- wallpapers/image/imageconfig.ui
+++ wallpapers/image/imageconfig.ui
@@ -0,0 +1,279 @@
+<ui version="4.0" >
+ <class>ImageConfig</class>
+ <widget class="QWidget" name="ImageConfig" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>605</width>
+ <height>230</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="minimumSize" >
+ <size>
+ <width>75</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>&Picture:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_view</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QComboBox" name="m_view" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>1</horstretch>
+ <verstretch>1</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="QToolButton" name="m_pictureUrlButton" >
+ <property name="toolTip" >
+ <string>Browse</string>
+ </property>
+ <property name="text" >
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="m_authorLabel" >
+ <property name="text" >
+ <string>Author:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="QLabel" name="m_authorLine" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="m_emailLabel" >
+ <property name="text" >
+ <string>Email:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" >
+ <widget class="QLabel" name="m_emailLine" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="m_licenseLabel" >
+ <property name="text" >
+ <string>License:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" >
+ <widget class="QLabel" name="m_licenseLine" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string/>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="minimumSize" >
+ <size>
+ <width>125</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>P&ositioning:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_resizeMethod</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2" >
+ <layout class="QHBoxLayout" name="horizontalLayout" >
+ <item>
+ <widget class="QComboBox" name="m_resizeMethod" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="spacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>187</width>
+ <height>17</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>&Color:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_color</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="2" >
+ <layout class="QHBoxLayout" name="horizontalLayout_2" >
+ <item>
+ <widget class="KColorButton" name="m_color" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="color" >
+ <color>
+ <red>70</red>
+ <green>90</green>
+ <blue>130</blue>
+ </color>
+ </property>
+ <property name="defaultColor" >
+ <color>
+ <red>70</red>
+ <green>90</green>
+ <blue>130</blue>
+ </color>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="spacer" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="1" colspan="2" >
+ <layout class="QHBoxLayout" name="horizontalLayout_3" >
+ <item>
+ <spacer name="horizontalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="m_newStuff" >
+ <property name="toolTip" >
+ <string>Download new wallpapers</string>
+ </property>
+ <property name="text" >
+ <string>Get New Wallpapers...</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="5" column="1" >
+ <spacer name="verticalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>13</width>
+ <height>5</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>KColorButton</class>
+ <extends>QPushButton</extends>
+ <header>kcolorbutton.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
--- wallpapers/image/renderthread.cpp
+++ wallpapers/image/renderthread.cpp
@@ -0,0 +1,257 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+
+ 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.
+*/
+
+#include "renderthread.h"
+
+#include <QPainter>
+#include <QFile>
+#include <KDebug>
+#include <KSvgRenderer>
+
+RenderThread::RenderThread()
+: m_current_token(-1)
+, m_size(0, 0)
+, m_ratio(1.0)
+{
+ m_abort = false;
+ m_restart = false;
+}
+
+RenderThread::~RenderThread()
+{
+ {
+ // abort computation
+ QMutexLocker lock(&m_mutex);
+ m_abort = true;
+ m_condition.wakeOne();
+ }
+
+ wait();
+}
+
+void RenderThread::setSize(const QSize& size)
+{
+ QMutexLocker lock(&m_mutex);
+ m_size = size;
+}
+
+void RenderThread::setRatio(float ratio)
+{
+ QMutexLocker lock(&m_mutex);
+ m_ratio = ratio;
+}
+
+int RenderThread::render(const QString &file,
+ const QColor &color,
+ Background::ResizeMethod method,
+ Qt::TransformationMode mode)
+{
+ int token;
+ {
+ QMutexLocker lock(&m_mutex);
+ m_file = file;
+ m_color = color;
+ m_method = method;
+ m_mode = mode;
+ m_restart = true;
+ token = ++m_current_token;
+ }
+
+ if (!isRunning()) {
+ start();
+ }
+ else {
+ m_condition.wakeOne();
+ }
+
+ return token;
+}
+
+void RenderThread::run()
+{
+ QString file;
+ QColor color;
+ QSize size;
+ float ratio;
+ Background::ResizeMethod method;
+ Qt::TransformationMode mode;
+ int token;
+
+ forever {
+ {
+ QMutexLocker lock(&m_mutex);
+ while (!m_restart && !m_abort) {
+ m_condition.wait(&m_mutex);
+ }
+ if (m_abort) {
+ return;
+ }
+ m_restart = false;
+
+ // load all parameters in nonshared variables
+ token = m_current_token;
+ file = m_file;
+ color = m_color;
+ size = m_size;
+ ratio = m_ratio;
+ method = m_method;
+ mode = m_mode;
+ }
+
+ QImage result(size, QImage::Format_ARGB32_Premultiplied);
+ result.fill(color.rgba());
+
+ if (file.isEmpty() || !QFile::exists(file)) {
+ emit done(token, result);
+ continue;
+ }
+
+ QPoint pos(0, 0);
+ bool tiled = false;
+ bool scalable = file.endsWith("svg") || file.endsWith("svgz");
+ QSize scaledSize;
+ QImage img;
+
+ // load nonscalable image
+ if (!scalable) {
+ img = QImage(file);
+ }
+
+ // set image size
+ QSize imgSize;
+ if (scalable) {
+ // scalable: image can be of any size
+ imgSize = size;
+ }
+ else {
+ // otherwise, use the natural size of the loaded image
+ imgSize = img.size();
+ }
+ imgSize *= ratio;
+
+ // if any of them is zero we may run into a div-by-zero below.
+ if (imgSize.width() == 0) {
+ imgSize.setWidth(1);
+ }
+ if (imgSize.height() == 0) {
+ imgSize.setHeight(1);
+ }
+
+ // set render parameters according to resize mode
+ switch (method)
+ {
+ case Background::Scale:
+ scaledSize = size;
+ break;
+ case Background::Center:
+ scaledSize = imgSize;
+ pos = QPoint((size.width() - scaledSize.width()) / 2,
+ (size.height() - scaledSize.height()) / 2);
+
+ //If the picture is bigger than the screen, shrink it
+ if( size.width() < imgSize.width() && imgSize.width() > imgSize.height() )
+ {
+ int width = size.width();
+ int height = width * scaledSize.height() / imgSize.width();
+ scaledSize = QSize(width, height);
+ pos = QPoint((size.width() - scaledSize.width()) / 2,
+ (size.height() - scaledSize.height()) / 2);
+ }
+ else if( size.height() < imgSize.height() )
+ {
+ int height = size.height();
+ int width = height * imgSize.width() / imgSize.height();
+ scaledSize = QSize(width, height);
+ pos = QPoint((size.width() - scaledSize.width()) / 2,
+ (size.height() - scaledSize.height()) / 2);
+ }
+
+ break;
+ case Background::Maxpect: {
+ float xratio = (float) size.width() / imgSize.width();
+ float yratio = (float) size.height() / imgSize.height();
+ if (xratio > yratio) {
+ int height = size.height();
+ int width = height * imgSize.width() / imgSize.height();
+ scaledSize = QSize(width, height);
+ } else {
+ int width = size.width();
+ int height = width * imgSize.height() / imgSize.width();
+ scaledSize = QSize(width, height);
+ }
+ pos = QPoint((size.width() - scaledSize.width()) / 2,
+ (size.height() - scaledSize.height()) / 2);
+ break;
+ }
+ case Background::ScaleCrop: {
+ float xratio = (float) size.width() / imgSize.width();
+ float yratio = (float) size.height() / imgSize.height();
+ if (xratio > yratio) {
+ int width = size.width();
+ int height = width * imgSize.height() / imgSize.width();
+ scaledSize = QSize(width, height);
+ } else {
+ int height = size.height();
+ int width = height * imgSize.width() / imgSize.height();
+ scaledSize = QSize(width, height);
+ }
+ pos = QPoint((size.width() - scaledSize.width()) / 2,
+ (size.height() - scaledSize.height()) / 2);
+ break;
+ }
+ case Background::Tiled:
+ scaledSize = imgSize;
+ tiled = true;
+ break;
+ case Background::CenterTiled:
+ scaledSize = imgSize;
+ pos = QPoint(
+ -scaledSize.width() +
+ ((size.width() - scaledSize.width()) / 2) % scaledSize.width(),
+ -scaledSize.height() +
+ ((size.height() - scaledSize.height()) / 2) % scaledSize.height());
+ tiled = true;
+ break;
+ }
+
+ QPainter p(&result);
+ if (scalable) {
+ // tiling is ignored for scalable wallpapers
+ KSvgRenderer svg(file);
+ if (m_restart) {
+ continue;
+ }
+ svg.render(&p);
+ }
+ else {
+ QImage scaled = img.scaled(scaledSize, Qt::IgnoreAspectRatio, mode);
+ if (m_restart) {
+ continue;
+ }
+ if (tiled) {
+ for (int x = pos.x(); x < size.width(); x += scaledSize.width()) {
+ for (int y = pos.y(); y < size.height(); y += scaledSize.height()) {
+ p.drawImage(QPoint(x, y), scaled);
+ if (m_restart) {
+ goto endLoop;
+ }
+ }
+ }
+ }
+ else {
+ p.drawImage(pos, scaled);
+ }
+ }
+
+ // signal we're done
+ emit done(token, result);
+
+ endLoop: continue;
+ }
+}
--- wallpapers/image/plasma-wallpaper-image.desktop
+++ wallpapers/image/plasma-wallpaper-image.desktop
@@ -0,0 +1,73 @@
+[Desktop Entry]
+Type=Service
+Name=Image
+Name[be@latin]=Vyjava
+Name[el]=Εικόνα
+Name[et]=Pilt
+Name[ga]=Íomhá
+Name[gl]=Imaxe
+Name[gu]=ચિત્ર
+Name[km]=រូបភាព
+Name[nds]=Bild
+Name[pt]=Imagem
+Name[pt_BR]=Imagem
+Name[sl]=Slika
+Name[sv]=Bild
+Name[tr]=Resim
+Name[uk]=Зображення
+Name[zh_TW]=影像
+Icon=image-jpeg
+ServiceTypes=Plasma/Wallpaper
+Actions=SingleImage;Slideshow;
+
+X-KDE-Library=plasma_wallpaper_image
+X-KDE-PluginInfo-Author=Petri Damstén
+X-KDE-PluginInfo-Email=damu@iki.fi
+X-KDE-PluginInfo-Name=image
+X-KDE-PluginInfo-Version=pre0.1
+X-KDE-PluginInfo-Website=http://plasma.kde.org/
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
+[Desktop Action SingleImage]
+Name=Image
+Name[be@latin]=Vyjava
+Name[el]=Εικόνα
+Name[et]=Pilt
+Name[ga]=Íomhá
+Name[gl]=Imaxe
+Name[gu]=ચિત્ર
+Name[km]=រូបភាព
+Name[nds]=Bild
+Name[pt]=Imagem
+Name[pt_BR]=Imagem
+Name[sl]=Slika
+Name[sv]=Bild
+Name[tr]=Resim
+Name[uk]=Зображення
+Name[zh_TW]=影像
+Icon=image-jpeg
+# Dummy
+Exec=plasma
+
+[Desktop Action Slideshow]
+Name=Slideshow
+Name[be@latin]=Słajdy
+Name[el]=Προβολή σλάιντ
+Name[et]=Slaidiseanss
+Name[ga]=Taispeántas Sleamhnán
+Name[gl]=Presentación
+Name[gu]=સ્લાઇડશો
+Name[km]=បញ្ចាំងស្លាយ
+Name[nds]=Diaschau
+Name[pt]=Apresentação
+Name[pt_BR]=Apresentação
+Name[sl]=Menjanje slik
+Name[sv]=Bildspel
+Name[tr]=Slayt Gösterisi
+Name[uk]=Показ слайдів
+Name[zh_TW]=投影播放
+Icon=folder-image
+# Dummy
+Exec=plasma
--- wallpapers/image/backgrounddelegate.cpp
+++ wallpapers/image/backgrounddelegate.cpp
@@ -0,0 +1,88 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+
+ 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.
+*/
+
+#include "backgrounddelegate.h"
+
+#include <KGlobalSettings>
+#include <QPen>
+#include <QPainter>
+#include "backgroundpackage.h"
+
+BackgroundDelegate::BackgroundDelegate(QObject *listener,
+ float ratio, QObject *parent)
+: QAbstractItemDelegate(parent)
+, m_listener(listener)
+, m_ratio(ratio)
+{
+}
+
+void BackgroundDelegate::paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+{
+ QString title = index.model()->data(index, Qt::DisplayRole).toString();
+ QString author = index.model()->data(index, AuthorRole).toString();
+ QPixmap pix = index.model()->data(index, ScreenshotRole).value<QPixmap>();
+
+ // draw selection outline
+ if (option.state & QStyle::State_Selected) {
+ QPen oldPen = painter->pen();
+ painter->setPen(option.palette.color(QPalette::Highlight));
+ painter->drawRect(option.rect.adjusted(2, 2, -2, -2));
+ painter->setPen(oldPen);
+ }
+
+ // draw pixmap
+ int maxheight = Background::SCREENSHOT_HEIGHT;
+ int maxwidth = int(maxheight * m_ratio);
+ if (!pix.isNull()) {
+ QSize sz = pix.size();
+ int x = MARGIN + (maxwidth - pix.width()) / 2;
+ int y = MARGIN + (maxheight - pix.height()) / 2;
+ QRect imgRect = QRect(option.rect.topLeft(), pix.size()).translated(x, y);
+ painter->drawPixmap(imgRect, pix);
+ }
+
+ // draw text
+ painter->save();
+ QFont font = painter->font();
+ font.setWeight(QFont::Bold);
+ painter->setFont(font);
+ int x = option.rect.left() + MARGIN * 5 + maxwidth;
+
+ QRect textRect(x,
+ option.rect.top() + MARGIN,
+ option.rect.width() - x - MARGIN * 2,
+ maxheight);
+ QString text = title;
+ QString authorCaption;
+ if (!author.isEmpty()) {
+ authorCaption = i18nc("Caption to wallpaper preview, %1 author name",
+ "by %1", author);
+ text += '\n' + authorCaption;
+ }
+ QRect boundingRect = painter->boundingRect(
+ textRect, Qt::AlignVCenter | Qt::TextWordWrap, text);
+ painter->drawText(boundingRect, Qt::TextWordWrap, title);
+ if (!author.isEmpty()) {
+ QRect titleRect = painter->boundingRect(boundingRect, Qt::TextWordWrap, title);
+ QRect authorRect(titleRect.bottomLeft(), textRect.size());
+ painter->setFont(KGlobalSettings::smallestReadableFont());
+ painter->drawText(authorRect, Qt::TextWordWrap, authorCaption);
+ }
+
+ painter->restore();
+}
+
+QSize BackgroundDelegate::sizeHint(const QStyleOptionViewItem &,
+ const QModelIndex &) const
+{
+ return QSize(100, Background::SCREENSHOT_HEIGHT + MARGIN * 2);
+}
+
--- wallpapers/image/renderthread.h
+++ wallpapers/image/renderthread.h
@@ -0,0 +1,58 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+
+ 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.
+*/
+
+#ifndef RENDERTHREAD_H
+#define RENDERTHREAD_H
+
+#include "backgroundpackage.h"
+#include <QColor>
+#include <QImage>
+#include <QMutex>
+#include <QThread>
+#include <QWaitCondition>
+
+class RenderThread : public QThread
+{
+Q_OBJECT
+public:
+ RenderThread();
+ virtual ~RenderThread();
+
+ int render(const QString &file,
+ const QColor &color,
+ Background::ResizeMethod method,
+ Qt::TransformationMode mode);
+
+ void setSize(const QSize &size);
+ void setRatio(float ratio);
+
+protected:
+ virtual void run();
+
+private:
+ QMutex m_mutex; // to protect parameters
+ QWaitCondition m_condition;
+
+ // protected by mutex
+ int m_current_token;
+ QString m_file;
+ QColor m_color;
+ QSize m_size;
+ float m_ratio;
+ Background::ResizeMethod m_method;
+ Qt::TransformationMode m_mode;
+
+ bool m_abort;
+ bool m_restart;
+
+signals:
+ void done(int token, const QImage &pixmap);
+};
+
+#endif // RENDERTHREAD_H
--- wallpapers/image/backgrounddelegate.h
+++ wallpapers/image/backgrounddelegate.h
@@ -0,0 +1,38 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+
+ 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.
+*/
+
+#ifndef BACKGROUNDDELEGATE_H
+#define BACKGROUNDDELEGATE_H
+
+#include <QAbstractItemDelegate>
+
+class BackgroundDelegate : public QAbstractItemDelegate
+{
+public:
+ enum {
+ AuthorRole = Qt::UserRole,
+ ScreenshotRole
+ };
+
+ BackgroundDelegate(QObject *listener,
+ float ratio, QObject *parent = 0);
+
+ virtual void paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
+ virtual QSize sizeHint(const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
+
+private:
+ static const int MARGIN = 5;
+ QObject *m_listener;
+ float m_ratio;
+};
+
+#endif // BACKGROUNDDELEGATEL_H
--- wallpapers/image/image.cpp
+++ wallpapers/image/image.cpp
@@ -0,0 +1,494 @@
+/*
+ Copyright (c) 2007 by Paolo Capriotti <p.capriotti@gmail.com>
+ Copyright (c) 2007 by Aaron Seigo <aseigo@kde.org>
+ Copyright (c) 2008 by Alexis Ménard <darktears31@gmail.com>
+ Copyright (c) 2008 by Petri Damsten <damu@iki.fi>
+
+ 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.
+*/
+
+#include "image.h"
+
+#include <QPainter>
+#include <QFile>
+#include <KDirSelectDialog>
+#include <KStandardDirs>
+#include <KDirWatch>
+#include <KGlobalSettings>
+#include <KFileDialog>
+#include <KImageFilePreview>
+#include <KNS/Engine>
+#include <plasma/theme.h>
+#include "backgroundlistmodel.h"
+#include "backgrounddelegate.h"
+#include "ksmserver_interface.h"
+
+
+Image::Image(QObject *parent, const QVariantList &args)
+: Plasma::Wallpaper(parent, args)
+, m_dialog(0)
+, m_rendererToken(-1)
+{
+ qRegisterMetaType<QImage>("QImage");
+ connect(&m_renderer, SIGNAL(done(int, QImage)), this, SLOT(updateBackground(int, QImage)));
+ connect(&m_timer, SIGNAL(timeout()), this, SLOT(nextSlide()));
+}
+
+Image::~Image()
+{
+ qDeleteAll(m_slideshowBackgrounds);
+ delete m_dialog;
+}
+
+void Image::init(const KConfigGroup &config)
+{
+ m_timer.stop();
+ m_mode = renderingMode().name();
+ calculateGeometry();
+
+ m_delay = config.readEntry("slideTimer", 60);
+ m_resizeMethod = (Background::ResizeMethod)config.readEntry("wallpaperposition",
+ (int)Background::Scale);
+ m_wallpaper = config.readEntry("wallpaper", QString());
+ if (m_wallpaper.isEmpty()) {
+ m_wallpaper = Plasma::Theme::defaultTheme()->wallpaperPath();
+ int index = m_wallpaper.indexOf("/contents/images/");
+ if (index > -1) { // We have file from package -> get path to package
+ m_wallpaper = m_wallpaper.left(index);
+ }
+ }
+ m_color = config.readEntry("wallpapercolor", QColor(56, 111, 150));
+ m_usersWallpapers = config.readEntry("userswallpapers", QStringList());
+ m_dirs = config.readEntry("slidepaths", QStringList());
+ if (m_dirs.isEmpty()) {
+ m_dirs << KStandardDirs::installPath("wallpaper");
+ }
+
+ if (m_mode == "SingleImage") {
+ setSingleImage();
+ } else {
+ startSlideshow();
+ }
+}
+
+void Image::save(KConfigGroup &config)
+{
+ config.writeEntry("slideTimer", m_delay);
+ config.writeEntry("wallpaperposition", (int)m_resizeMethod);
+ config.writeEntry("slidepaths", m_dirs);
+ config.writeEntry("wallpaper", m_wallpaper);
+ config.writeEntry("wallpapercolor", m_color);
+ config.writeEntry("userswallpapers", m_usersWallpapers);
+}
+
+QWidget* Image::createConfigurationInterface(QWidget* parent)
+{
+ m_widget = new QWidget(parent);
+
+ if (m_mode == "SingleImage") {
+ m_uiImage.setupUi(m_widget);
+
+ m_model = new BackgroundListModel(m_ratio, this);
+ m_uiImage.m_view->setModel(m_model);
+ m_uiImage.m_view->setItemDelegate(new BackgroundDelegate(m_uiImage.m_view->view(),
+ m_ratio, this));
+ m_uiImage.m_view->view()->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ m_model->reload(m_usersWallpapers);
+ int index = m_model->indexOf(m_wallpaper);
+ if (index != -1) {
+ m_uiImage.m_view->setCurrentIndex(index);
+ Background *b = m_model->package(index);
+ if (b) {
+ fillMetaInfo(b);
+ }
+ }
+ connect(m_uiImage.m_view, SIGNAL(currentIndexChanged(int)), this, SLOT(pictureChanged(int)));
+
+ m_uiImage.m_pictureUrlButton->setIcon(KIcon("document-open"));
+ connect(m_uiImage.m_pictureUrlButton, SIGNAL(clicked()), this, SLOT(showFileDialog()));
+
+ m_uiImage.m_emailLine->setTextInteractionFlags(Qt::TextSelectableByMouse);
+
+ m_uiImage.m_resizeMethod->addItem(i18n("Scaled & Cropped"), Background::ScaleCrop);
+ m_uiImage.m_resizeMethod->addItem(i18n("Scaled"), Background::Scale);
+ m_uiImage.m_resizeMethod->addItem(i18n("Maxpect"), Background::Maxpect);
+ m_uiImage.m_resizeMethod->addItem(i18n("Centered"), Background::Center);
+ m_uiImage.m_resizeMethod->addItem(i18n("Tiled"), Background::Tiled);
+ m_uiImage.m_resizeMethod->addItem(i18n("Center Tiled"), Background::CenterTiled);
+ for (int i = 0; i < m_uiImage.m_resizeMethod->count(); ++i) {
+ if (m_resizeMethod == m_uiImage.m_resizeMethod->itemData(i).value<int>()) {
+ m_uiImage.m_resizeMethod->setCurrentIndex(i);
+ break;
+ }
+ }
+ connect(m_uiImage.m_resizeMethod, SIGNAL(currentIndexChanged(int)),
+ this, SLOT(positioningChanged(int)));
+
+ m_uiImage.m_color->setColor(m_color);
+ connect(m_uiImage.m_color, SIGNAL(changed(const QColor&)), this, SLOT(colorChanged(const QColor&)));
+
+ connect(m_uiImage.m_newStuff, SIGNAL(clicked()), this, SLOT(getNewWallpaper()));
+ } else {
+ m_uiSlideshow.setupUi(m_widget);
+
+ m_uiSlideshow.m_dirlist->clear();
+ foreach (const QString &dir, m_dirs) {
+ m_uiSlideshow.m_dirlist->addItem(dir);
+ }
+ m_uiSlideshow.m_dirlist->setCurrentRow(0);
+ updateDirs();
+ m_uiSlideshow.m_addDir->setIcon(KIcon("list-add"));
+ connect(m_uiSlideshow.m_addDir, SIGNAL(clicked()), this, SLOT(slotAddDir()));
+ m_uiSlideshow.m_removeDir->setIcon(KIcon("list-remove"));
+ connect(m_uiSlideshow.m_removeDir, SIGNAL(clicked()), this, SLOT(slotRemoveDir()));
+
+ QTime time(0, 0, 0);
+ time = time.addSecs(m_delay);
+ m_uiSlideshow.m_slideshowDelay->setTime(time);
+ m_uiSlideshow.m_slideshowDelay->setMinimumTime(QTime(0, 0, 30));
+ connect(m_uiSlideshow.m_slideshowDelay, SIGNAL(timeChanged(const QTime&)),
+ this, SLOT(timeChanged(const QTime&)));
+
+ m_uiSlideshow.m_resizeMethod->addItem(i18n("Scaled & Cropped"), Background::ScaleCrop);
+ m_uiSlideshow.m_resizeMethod->addItem(i18n("Scaled"), Background::Scale);
+ m_uiSlideshow.m_resizeMethod->addItem(i18n("Maxpect"), Background::Maxpect);
+ m_uiSlideshow.m_resizeMethod->addItem(i18n("Centered"), Background::Center);
+ m_uiSlideshow.m_resizeMethod->addItem(i18n("Tiled"), Background::Tiled);
+ m_uiSlideshow.m_resizeMethod->addItem(i18n("Center Tiled"), Background::CenterTiled);
+ for (int i = 0; i < m_uiSlideshow.m_resizeMethod->count(); ++i) {
+ if (m_resizeMethod == m_uiSlideshow.m_resizeMethod->itemData(i).value<int>()) {
+ m_uiSlideshow.m_resizeMethod->setCurrentIndex(i);
+ break;
+ }
+ }
+ connect(m_uiSlideshow.m_resizeMethod, SIGNAL(currentIndexChanged(int)),
+ this, SLOT(positioningChanged(int)));
+
+ m_uiSlideshow.m_color->setColor(m_color);
+ connect(m_uiSlideshow.m_color, SIGNAL(changed(const QColor&)), this, SLOT(colorChanged(const QColor&)));
+ }
+
+ return m_widget;
+}
+
+void Image::calculateGeometry()
+{
+ m_size = boundingRect().size().toSize();
+ m_renderer.setSize(m_size);
+ m_ratio = boundingRect().width() / boundingRect().height();
+ m_renderer.setRatio(m_ratio);
+}
+
+void Image::paint(QPainter *painter, const QRectF& exposedRect)
+{
+ // Check if geometry changed
+ //kDebug() << m_size << boundingRect().size().toSize();
+ if (m_size != boundingRect().size().toSize()) {
+ calculateGeometry();
+ if (!m_img.isEmpty()) { // We have previous image
+ render();
+ //kDebug() << "re-rendering";
+ return;
+ }
+ }
+ if (m_pixmap.isNull()) {
+ painter->fillRect(exposedRect, QBrush(m_color));
+ //kDebug() << "pixmap null";
+ return;
+ }
+ painter->save();
+
+ if (painter->worldMatrix() == QMatrix()) {
+ // draw the background untransformed when possible;(saves lots of per-pixel-math)
+ painter->resetTransform();
+ }
+
+ // blit the background (saves all the per-pixel-products that blending does)
+ painter->setCompositionMode(QPainter::CompositionMode_Source);
+
+ // for pixmaps we draw only the exposed part (untransformed since the
+ // bitmapBackground already has the size of the viewport)
+ painter->drawPixmap(exposedRect, m_pixmap, exposedRect);
+
+ // restore transformation and composition mode
+ painter->restore();
+}
+
+void Image::timeChanged(const QTime& time)
+{
+ m_delay = QTime(0, 0, 0).secsTo(time);
+ if (!m_slideshowBackgrounds.isEmpty()) {
+ m_timer.start(m_delay * 1000);
+ }
+}
+
+void Image::slotAddDir()
+{
+ KUrl empty;
+ KDirSelectDialog dialog(empty, true, m_widget);
+ if (dialog.exec()) {
+ m_uiSlideshow.m_dirlist->addItem(dialog.url().path());
+ updateDirs();
+ startSlideshow();
+ }
+}
+
+void Image::slotRemoveDir()
+{
+ int row = m_uiSlideshow.m_dirlist->currentRow();
+ if (row != -1) {
+ m_uiSlideshow.m_dirlist->takeItem(row);
+ updateDirs();
+ startSlideshow();
+ }
+}
+
+void Image::updateDirs()
+{
+ m_dirs.clear();
+ for (int i = 0; i < m_uiSlideshow.m_dirlist->count(); i++) {
+ m_dirs.append(m_uiSlideshow.m_dirlist->item(i)->text());
+ }
+
+ if (m_uiSlideshow.m_dirlist->count() == 0) {
+ m_uiSlideshow.m_dirlist->hide();
+ } else {
+ const int itemHeight = m_uiSlideshow.m_dirlist->visualItemRect(m_uiSlideshow.m_dirlist->item(0)).height();
+ const int vMargin = m_uiSlideshow.m_dirlist->height() - m_uiSlideshow.m_dirlist->viewport()->height();
+
+ if (m_uiSlideshow.m_dirlist->count() <= 6) {
+ m_uiSlideshow.m_dirlist->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ m_uiSlideshow.m_dirlist->setFixedHeight(itemHeight * m_uiSlideshow.m_dirlist->count() + vMargin);
+ } else {
+ m_uiSlideshow.m_dirlist->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ }
+
+ if (!m_uiSlideshow.m_dirlist->isVisible()) {
+ m_uiSlideshow.m_dirlist->setCurrentRow(0);
+ }
+
+ m_uiSlideshow.m_dirlist->show();
+ m_uiSlideshow.gridLayout->invalidate();
+ }
+
+ m_uiSlideshow.m_removeDir->setEnabled(m_uiSlideshow.m_dirlist->currentRow() != -1);
+}
+
+void Image::setSingleImage()
+{
+ QString img;
+ BackgroundPackage b(m_wallpaper, m_ratio);
+
+ img = b.findBackground(m_size, m_resizeMethod); // isValid() returns true for jpg?
+ kDebug() << img << m_wallpaper;
+ if (img.isEmpty()) {
+ img = m_wallpaper;
+ }
+ render(img);
+}
+
+void Image::startSlideshow()
+{
+ // populate background list
+ m_timer.stop();
+ qDeleteAll(m_slideshowBackgrounds);
+ m_slideshowBackgrounds.clear();
+ foreach (const QString& dir, m_dirs) {
+ m_slideshowBackgrounds += BackgroundListModel::findAllBackgrounds(0, dir, m_ratio);
+ }
+
+ // start slideshow
+ if (m_slideshowBackgrounds.isEmpty()) {
+ m_pixmap = QPixmap();
+ emit update(boundingRect());
+ } else {
+ m_currentSlide = -1;
+ nextSlide();
+ m_timer.start(m_delay * 1000);
+ }
+}
+
+void Image::getNewWallpaper()
+{
+ KNS::Engine engine(0);
+ if (engine.init("wallpaper.knsrc")) {
+ KNS::Entry::List entries = engine.downloadDialogModal(m_widget);
+
+ if (entries.size() > 0) {
+ m_model->reload();
+ }
+ }
+}
+
+void Image::colorChanged(const QColor& color)
+{
+ m_color = color;
+ setSingleImage();
+}
+
+void Image::pictureChanged(int index)
+{
+ if (index == -1) {
+ return;
+ }
+ Background *b = m_model->package(index);
+ if (!b) {
+ return;
+ }
+ fillMetaInfo(b);
+ m_wallpaper = b->path();
+ setSingleImage();
+}
+
+void Image::positioningChanged(int index)
+{
+ if (m_mode == "SingleImage") {
+ m_resizeMethod =
+ (Background::ResizeMethod)m_uiImage.m_resizeMethod->itemData(index).value<int>();
+ setSingleImage();
+ } else {
+ m_resizeMethod =
+ (Background::ResizeMethod)m_uiSlideshow.m_resizeMethod->itemData(index).value<int>();
+ startSlideshow();
+ }
+}
+
+void Image::fillMetaInfo(Background *b)
+{
+ // Prepare more user-friendly forms of some pieces of data.
+ // - license by config is more a of a key value,
+ // try to get the proper name if one of known licenses.
+ QString license = b->license();
+ KAboutLicense knownLicense = KAboutLicense::byKeyword(license);
+ if (knownLicense.key() != KAboutData::License_Custom) {
+ license = knownLicense.name(KAboutData::ShortName);
+ }
+ // - last ditch attempt to localize author's name, if not such by config
+ // (translators can "hook" names from outside if resolute enough).
+ QString author = i18nc("Wallpaper info, author name", "%1", b->author());
+
+ setMetadata(m_uiImage.m_authorLine, author);
+ setMetadata(m_uiImage.m_licenseLine, license);
+ setMetadata(m_uiImage.m_emailLine, b->email());
+}
+
+bool Image::setMetadata(QLabel *label, const QString &text)
+{
+ if (text.isEmpty()) {
+ label->hide();
+ return false;
+ }
+ else {
+ label->show();
+ label->setText(text);
+ return true;
+ }
+}
+
+void Image::showFileDialog()
+{
+ if (!m_dialog) {
+ m_dialog = new KFileDialog(KUrl(), "*.png *.jpeg *.jpg *.svg *.svgz", m_widget);
+ KImageFilePreview *previewWidget = new KImageFilePreview(m_dialog);
+ m_dialog->setPreviewWidget(previewWidget);
+ m_dialog->setOperationMode(KFileDialog::Opening);
+ m_dialog->setCaption(i18n("Select Wallpaper Image File"));
+ m_dialog->setModal(false);
+ }
+ m_dialog->show();
+ m_dialog->raise();
+ m_dialog->activateWindow();
+
+ connect(m_dialog, SIGNAL(okClicked()), this, SLOT(browse()));
+}
+
+void Image::browse()
+{
+ QString wallpaper = m_dialog->selectedFile();
+ disconnect(m_dialog, SIGNAL(okClicked()), this, SLOT(browse()));
+
+ if (wallpaper.isEmpty()) {
+ return;
+ }
+
+ // add background to the model
+ m_model->addBackground(wallpaper);
+
+ // select it
+ int index = m_model->indexOf(wallpaper);
+ if (index != -1) {
+ m_uiImage.m_view->setCurrentIndex(index);
+ }
+ // save it
+ m_usersWallpapers << wallpaper;
+}
+
+void Image::nextSlide()
+{
+ QString previous;
+ if (m_currentSlide >= 0 && m_currentSlide < m_slideshowBackgrounds.size()) {
+ previous = m_slideshowBackgrounds[m_currentSlide]->path();
+ }
+ if (++m_currentSlide >= m_slideshowBackgrounds.size()) {
+ m_currentSlide = 0;
+ }
+
+ if (m_slideshowBackgrounds.size() > 0) {
+ // do not change to the same background if we have a choice
+ // if there is only one background, it may be changed by someone else
+ if (m_slideshowBackgrounds.size() > 1 &&
+ m_slideshowBackgrounds[m_currentSlide]->path() == previous) {
+ // try next one, they can't be the same (at least the same path)
+ if (++m_currentSlide >= m_slideshowBackgrounds.size()) {
+ m_currentSlide = 0;
+ }
+ }
+ render(m_slideshowBackgrounds[m_currentSlide]->findBackground(m_size, m_resizeMethod));
+ }
+}
+
+void Image::render(const QString& image)
+{
+ if (!image.isEmpty()) {
+ m_img = image;
+ }
+ // else re-render previous image
+ m_rendererToken = m_renderer.render(m_img, m_color, m_resizeMethod,
+ Qt::SmoothTransformation);
+ suspendStartup(true); // during KDE startup, make ksmserver until the wallpaper is ready
+}
+
+void Image::updateBackground(int token, const QImage &img)
+{
+ if (m_rendererToken == token) {
+ m_pixmap = QPixmap::fromImage(img);
+ emit update(boundingRect());
+ suspendStartup(false);
+ }
+}
+
+void Image::suspendStartup(bool suspend)
+{
+ org::kde::KSMServerInterface ksmserver("org.kde.ksmserver", "/KSMServer", QDBusConnection::sessionBus());
+ const QString startupID("desktop wallaper");
+ if (suspend) {
+ ksmserver.suspendStartup(startupID);
+ } else {
+ ksmserver.resumeStartup(startupID);
+ }
+}
+
+void Image::updateScreenshot(QPersistentModelIndex index)
+{
+ m_uiImage.m_view->view()->update(index);
+}
+
+void Image::removeBackground(const QString &path)
+{
+ m_model->removeBackground(path);
+}
+
+#include "image.moc"
--- wallpapers/image/slideshowconfig.ui
+++ wallpapers/image/slideshowconfig.ui
@@ -0,0 +1,278 @@
+<ui version="4.0" >
+ <class>SlideshowConfig</class>
+ <widget class="QWidget" name="SlideshowConfig" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>468</width>
+ <height>347</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label" >
+ <property name="minimumSize" >
+ <size>
+ <width>75</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>Folders:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_addDir</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="KPushButton" name="m_addDir" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>&Add Folder...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <widget class="KPushButton" name="m_removeDir" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>&Remove Folder</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" >
+ <spacer name="horizontalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>105</width>
+ <height>23</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1" colspan="3" >
+ <widget class="KListWidget" name="m_dirlist" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Maximum" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" >
+ <widget class="QLabel" name="label_2" >
+ <property name="minimumSize" >
+ <size>
+ <width>125</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>&Change images every:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_slideshowDelay</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="3" >
+ <layout class="QHBoxLayout" name="horizontalLayout_3" >
+ <item>
+ <widget class="QTimeEdit" name="m_slideshowDelay" >
+ <property name="dateTime" >
+ <datetime>
+ <hour>0</hour>
+ <minute>0</minute>
+ <second>0</second>
+ <year>2000</year>
+ <month>1</month>
+ <day>1</day>
+ </datetime>
+ </property>
+ <property name="currentSection" >
+ <enum>QDateTimeEdit::HourSection</enum>
+ </property>
+ <property name="displayFormat" >
+ <string comment="(qtdt-format) Please do not change the quotes (') and translate only the content of the quotes." >hh 'Hours' mm 'Mins' ss 'Secs'</string>
+ </property>
+ <property name="time" >
+ <time>
+ <hour>0</hour>
+ <minute>0</minute>
+ <second>0</second>
+ </time>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="minimumSize" >
+ <size>
+ <width>75</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>P&ositioning:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_resizeMethod</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="3" >
+ <layout class="QHBoxLayout" name="horizontalLayout_2" >
+ <item>
+ <widget class="QComboBox" name="m_resizeMethod" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="text" >
+ <string>Color:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_color</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1" colspan="3" >
+ <layout class="QHBoxLayout" name="horizontalLayout" >
+ <item>
+ <widget class="KColorButton" name="m_color" >
+ <property name="color" >
+ <color>
+ <red>70</red>
+ <green>90</green>
+ <blue>130</blue>
+ </color>
+ </property>
+ <property name="defaultColor" >
+ <color>
+ <red>70</red>
+ <green>90</green>
+ <blue>130</blue>
+ </color>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="5" column="1" colspan="2" >
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>105</width>
+ <height>5</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>KColorButton</class>
+ <extends>QPushButton</extends>
+ <header>kcolorbutton.h</header>
+ </customwidget>
+ <customwidget>
+ <class>KListWidget</class>
+ <extends>QListWidget</extends>
+ <header>klistwidget.h</header>
+ </customwidget>
+ <customwidget>
+ <class>KPushButton</class>
+ <extends>QPushButton</extends>
+ <header>kpushbutton.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
--- wallpapers/image/wallpaper.knsrc
+++ wallpapers/image/wallpaper.knsrc
@@ -0,0 +1,4 @@
+[KNewStuff2]
+ProvidersUrl=http://download.kde.org/khotnewstuff/wallpaper-providers.xml
+StandardResource=wallpaper
+CachePolicy=resident
--- wallpapers/image/image.h
+++ wallpapers/image/image.h
@@ -0,0 +1,91 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+ Copyright (c) 2008 by Petri Damsten <damu@iki.fi>
+
+ 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.
+*/
+
+#ifndef IMAGE_HEADER
+#define IMAGE_HEADER
+
+#include <QTimer>
+#include <QPixmap>
+#include <QStringList>
+#include <plasma/wallpaper.h>
+#include "backgroundpackage.h"
+#include "renderthread.h"
+#include "ui_imageconfig.h"
+#include "ui_slideshowconfig.h"
+
+class KFileDialog;
+class BackgroundContainer;
+class BackgroundListModel;
+
+class Image : public Plasma::Wallpaper
+{
+ Q_OBJECT
+ public:
+ Image(QObject* parent, const QVariantList& args);
+ ~Image();
+
+ virtual void save(KConfigGroup &config);
+ virtual void paint(QPainter* painter, const QRectF& exposedRect);
+ virtual QWidget* createConfigurationInterface(QWidget* parent);
+
+ protected slots:
+ void timeChanged(const QTime& time);
+ void positioningChanged(int index);
+ void slotAddDir();
+ void slotRemoveDir();
+ void getNewWallpaper();
+ void colorChanged(const QColor& color);
+ void pictureChanged(int index);
+ void browse();
+ void nextSlide();
+ void updateBackground(int token, const QImage &img);
+ void showFileDialog();
+ void updateScreenshot(QPersistentModelIndex index);
+ void removeBackground(const QString &path);
+
+ protected:
+ void init(const KConfigGroup &config);
+ void updateDirs();
+ void startSlideshow();
+ void fillMetaInfo(Background* b);
+ bool setMetadata(QLabel *label, const QString &text);
+ void render(const QString& image = QString());
+ void suspendStartup(bool suspend); // for ksmserver
+ void calculateGeometry();
+ void setSingleImage();
+
+ private:
+ int m_delay;
+ Background::ResizeMethod m_resizeMethod;
+ QStringList m_dirs;
+ QString m_wallpaper;
+ QColor m_color;
+ QStringList m_usersWallpapers;
+
+ QWidget* m_widget;
+ Ui::ImageConfig m_uiImage;
+ Ui::SlideshowConfig m_uiSlideshow;
+ QString m_mode;
+ QList<Background *> m_slideshowBackgrounds;
+ QTimer m_timer;
+ QPixmap m_pixmap;
+ int m_currentSlide;
+ qreal m_ratio;
+ BackgroundListModel *m_model;
+ KFileDialog *m_dialog;
+ RenderThread m_renderer;
+ int m_rendererToken;
+ QSize m_size;
+ QString m_img;
+};
+
+K_EXPORT_PLASMA_WALLPAPER(image, Image)
+
+#endif
--- wallpapers/image/backgroundpackage.cpp
+++ wallpapers/image/backgroundpackage.cpp
@@ -0,0 +1,405 @@
+/*
+ * Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License 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 "backgroundpackage.h"
+#include <cmath>
+// <cmath> does not define fabs (by the standard, even if it does with gcc)
+#include <math.h>
+#include <float.h> // FLT_MAX
+
+#include <QFileInfo>
+#include <QPainter>
+#include <KDebug>
+#include <KLocalizedString>
+#include <KStandardDirs>
+#include <KDesktopFile>
+#include <KConfigGroup>
+#include <KSvgRenderer>
+#include <plasma/packagestructure.h>
+#include <plasma/packagemetadata.h>
+#include <ThreadWeaver/Weaver>
+
+using namespace Plasma;
+
+class ResizeThread : public ThreadWeaver::Job
+{
+public:
+ ResizeThread(const QString &path, float ratio, QObject *parent = 0);
+ virtual ~ResizeThread();
+
+ virtual void start(QPersistentModelIndex index);
+ virtual void run();
+
+ QImage result() const;
+ QPersistentModelIndex index() const;
+ bool isInitialized() const;
+private:
+ QString m_path;
+ QImage m_result;
+ float m_ratio;
+ QPersistentModelIndex m_index;
+};
+
+ResizeThread::ResizeThread(const QString &path, float ratio, QObject *parent)
+: ThreadWeaver::Job(parent)
+, m_path(path)
+, m_ratio(ratio)
+{
+}
+
+ResizeThread::~ResizeThread() {
+}
+
+void ResizeThread::start(QPersistentModelIndex index)
+{
+ m_index = index;
+ ThreadWeaver::Weaver::instance()->enqueue(this);
+}
+
+bool ResizeThread::isInitialized() const
+{
+ return m_index.isValid();
+}
+
+void ResizeThread::run()
+{
+ m_result = Background::createScreenshot(m_path, m_ratio);
+}
+
+QImage ResizeThread::result() const
+{
+ if (isFinished()) {
+ return m_result;
+ }
+ else {
+ return QImage();
+ }
+}
+
+QPersistentModelIndex ResizeThread::index() const
+{
+ return m_index;
+}
+
+Background::~Background()
+{
+}
+
+QImage Background::createScreenshot(const QString &path, float ratio)
+{
+ if (path.endsWith("svg") || path.endsWith("svgz")) {
+ KSvgRenderer renderer(path);
+ QImage img(QSize(int(SCREENSHOT_HEIGHT * ratio), SCREENSHOT_HEIGHT),
+ QImage::Format_ARGB32_Premultiplied);
+ img.fill(0);
+ QPainter p(&img);
+ renderer.render(&p);
+ return img;
+ }
+ else {
+ QImage img(path);
+ if (!img.isNull()) {
+ return img.scaled(int(SCREENSHOT_HEIGHT * ratio),
+ SCREENSHOT_HEIGHT,
+ Qt::KeepAspectRatio);
+ }
+ else {
+ return defaultScreenshot();
+ }
+ }
+
+}
+
+QImage Background::defaultScreenshot()
+{
+ static QImage defaultScreenshotImage;
+
+ if (defaultScreenshotImage.isNull()) {
+ QImage img(QSize(SCREENSHOT_HEIGHT, SCREENSHOT_HEIGHT), QImage::Format_ARGB32_Premultiplied);
+ img.fill(Qt::white);
+ QPainter p(&img);
+ p.drawText(QRect(0, 0, SCREENSHOT_HEIGHT, SCREENSHOT_HEIGHT),
+ Qt::AlignHCenter | Qt::AlignVCenter,
+ "Preview\nnot\navailable");
+ defaultScreenshotImage = img;
+ }
+ return defaultScreenshotImage;
+}
+
+
+class BackgroundPackageStructure : public PackageStructure
+{
+public:
+ static const PackageStructure::Ptr self();
+private:
+ BackgroundPackageStructure(); // should be used as a singleton
+ void addResolution(const char *res);
+};
+
+BackgroundPackageStructure::BackgroundPackageStructure()
+: PackageStructure(0, "Background")
+{
+ QStringList mimetypes;
+ mimetypes << "image/svg" << "image/png" << "image/jpeg" << "image/jpg";
+ setDefaultMimetypes(mimetypes);
+
+ addDirectoryDefinition("images", "images", i18n("Images"));
+ addFileDefinition("screenshot", "screenshot.png", i18n("Screenshot"));
+}
+
+
+const PackageStructure::Ptr BackgroundPackageStructure::self()
+{
+ static BackgroundPackageStructure::Ptr instance(0);
+
+ if (!instance) {
+ instance = new BackgroundPackageStructure;
+ }
+
+ return instance;
+}
+
+
+
+BackgroundPackage::BackgroundPackage(const QString &path, float ratio)
+: Package(path, BackgroundPackageStructure::self())
+, m_path(path)
+, m_ratio(ratio)
+{
+}
+
+QString BackgroundPackage::resString(const QSize &size) const
+{
+ return QString::number(size.width()) + 'x' + QString::number(size.height());
+}
+
+QSize BackgroundPackage::resSize(const QString &str) const
+{
+ int index = str.indexOf('x');
+ if (index != -1) {
+ return QSize(str.left(index).toInt(),
+ str.mid(index + 1).toInt());
+ }
+ else {
+ return QSize();
+ }
+}
+
+QString BackgroundPackage::findBackground(const QSize &size,
+ ResizeMethod method) const
+{
+ QStringList images = entryList("images");
+ if (images.empty()) {
+ return QString();
+ }
+
+ // choose the nearest resolution
+ float best = FLT_MAX;
+ QString bestImage;
+ foreach (const QString &entry, images) {
+ QSize candidate = resSize(QFileInfo(entry).baseName());
+ if (candidate == QSize()) {
+ continue;
+ }
+
+ double dist = distance(candidate, size, method);
+ //kDebug() << "candidate" << candidate << "distance" << dist;
+ if (bestImage.isNull() || dist < best) {
+ bestImage = filePath("images", entry);
+ best = dist;
+ //kDebug() << "best" << bestImage;
+ if (dist == 0) {
+ break;
+ }
+ }
+ }
+
+ //kDebug() << "best image" << bestImage;
+ return bestImage;
+}
+
+float BackgroundPackage::distance(const QSize& size,
+ const QSize& desired,
+ ResizeMethod method) const
+{
+ // compute difference of areas
+ float delta = size.width() * size.height() -
+ desired.width() * desired.height();
+ // scale down to about 1.0
+ delta /= 1000000.0;
+
+ switch (method) {
+ case Scale: {
+ // Consider first the difference in aspect ratio,
+ // then in areas. Prefer scaling down.
+ float deltaRatio = 1.0;
+ if (size.height() > 0 && desired.height() > 0) {
+ deltaRatio = size.width() / size.height() -
+ desired.width() / desired.height();
+ }
+ return fabs(deltaRatio) * 3.0 + (delta >= 0.0 ? delta : -delta + 5.0);
+ }
+ case ScaleCrop:
+ // Difference of areas, slight preference to scale down
+ return delta >= 0.0 ? delta : -delta + 2.0;
+ case Center:
+ default:
+ // Difference in areas
+ return fabs(delta);
+ }
+}
+
+QPixmap BackgroundPackage::screenshot() const
+{
+ if (m_screenshot.isNull()) {
+ QString screenshotPath = filePath("screenshot");
+ if (!screenshotPath.isEmpty()) {
+ QImage img = createScreenshot(screenshotPath, m_ratio);
+ m_screenshot = QPixmap::fromImage(img);
+ }
+ }
+
+ return m_screenshot;
+}
+
+bool BackgroundPackage::screenshotGenerationStarted() const
+{
+ return true;
+}
+
+void BackgroundPackage::generateScreenshot(QPersistentModelIndex) const
+{
+}
+
+QString BackgroundPackage::title() const
+{
+ QString title = metadata()->name();
+ if (title.isEmpty()) {
+ title = metadata()->pluginName();
+ title.replace("_", " ");
+ }
+ return title;
+}
+
+QString BackgroundPackage::author() const
+{
+ return metadata()->author();
+}
+
+QString BackgroundPackage::email() const
+{
+ return metadata()->email();
+}
+
+QString BackgroundPackage::license() const
+{
+ return metadata()->license();
+}
+
+bool BackgroundPackage::isValid() const
+{
+ return Package::isValid();
+}
+
+QString BackgroundPackage::path() const
+{
+ return m_path;
+}
+
+
+BackgroundFile::BackgroundFile(const QString &file, float ratio)
+: m_file(file)
+, m_author(QString())
+, m_title(QFileInfo(m_file).baseName())
+, m_ratio(ratio)
+, m_resizer_started(false)
+{
+ if (QFile::exists(m_file+".desktop")) {
+ KDesktopFile config(m_file+".desktop");
+ KConfigGroup cg = config.group("Wallpaper");
+ m_title = cg.readEntry("Name", m_title);
+ m_author = cg.readEntry("Author", QString());
+ }
+}
+
+BackgroundFile::~BackgroundFile()
+{
+}
+
+QString BackgroundFile::findBackground(const QSize &,
+ ResizeMethod) const
+{
+ return m_file;
+}
+
+QPixmap BackgroundFile::screenshot() const
+{
+ return m_screenshot;
+}
+
+bool BackgroundFile::screenshotGenerationStarted() const
+{
+ return m_resizer_started;
+}
+
+void BackgroundFile::generateScreenshot(QPersistentModelIndex index) const
+{
+ ResizeThread *resizer = new ResizeThread(m_file, m_ratio);
+ connect(resizer, SIGNAL(done(ThreadWeaver::Job *)),
+ this, SLOT(updateScreenshot(ThreadWeaver::Job *)));
+ m_resizer_started = true;
+ resizer->start(index);
+}
+
+void BackgroundFile::updateScreenshot(ThreadWeaver::Job *job)
+{
+ ResizeThread *resizer = static_cast<ResizeThread *>(job);
+ m_screenshot = QPixmap::fromImage(resizer->result());
+ emit screenshotDone(resizer->index());
+ resizer->deleteLater();
+}
+
+QString BackgroundFile::author() const
+{
+ return m_author;
+}
+
+QString BackgroundFile::title() const
+{
+ return m_title;
+}
+
+QString BackgroundFile::email() const
+{
+ return QString();
+}
+
+QString BackgroundFile::license() const
+{
+ return QString();
+}
+
+bool BackgroundFile::isValid() const
+{
+ return true;
+}
+
+QString BackgroundFile::path() const
+{
+ return m_file;
+}
--- wallpapers/image/CMakeLists.txt
+++ wallpapers/image/CMakeLists.txt
@@ -0,0 +1,21 @@
+project(plasma-wallpaper-image)
+
+set(image_SRCS
+ image.cpp
+ backgroundpackage.cpp
+ renderthread.cpp
+ backgrounddelegate.cpp
+ backgroundlistmodel.cpp
+)
+kde4_add_ui_files(image_SRCS imageconfig.ui slideshowconfig.ui)
+
+set(ksmserver_xml ${KDEBASE_WORKSPACE_SOURCE_DIR}/ksmserver/org.kde.KSMServerInterface.xml)
+qt4_add_dbus_interface(image_SRCS ${ksmserver_xml} ksmserver_interface)
+
+kde4_add_plugin(plasma_wallpaper_image ${image_SRCS})
+target_link_libraries(plasma_wallpaper_image plasma ${KDE4_KIO_LIBS} ${KDE4_KFILE_LIBS} ${KDE4_KNEWSTUFF2_LIBS} ${KDE4_THREADWEAVER_LIBRARY})
+
+install(TARGETS plasma_wallpaper_image DESTINATION ${PLUGIN_INSTALL_DIR})
+install(FILES plasma-wallpaper-image.desktop DESTINATION ${SERVICES_INSTALL_DIR})
+
+install(FILES wallpaper.knsrc DESTINATION ${CONFIG_INSTALL_DIR})
--- wallpapers/image/backgroundlistmodel.cpp
+++ wallpapers/image/backgroundlistmodel.cpp
@@ -0,0 +1,187 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+
+ 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.
+*/
+
+#include "backgroundlistmodel.h"
+
+#include <QFile>
+#include <QDir>
+#include <KGlobal>
+#include <KStandardDirs>
+#include <KDesktopFile>
+#include <KConfigGroup>
+#include "backgroundpackage.h"
+#include "backgrounddelegate.h"
+
+BackgroundListModel::BackgroundListModel(float ratio, QObject *listener)
+: m_listener(listener)
+, m_ratio(ratio)
+{
+ connect(&m_dirwatch, SIGNAL(deleted(QString)), listener, SLOT(removeBackground(QString)));
+}
+
+void BackgroundListModel::removeBackground(const QString &path)
+{
+ int index;
+ while ((index = indexOf(path)) != -1) {
+ beginRemoveRows(QModelIndex(), index, index);
+ m_packages.removeAt(index);
+ endRemoveRows();
+ }
+}
+
+void BackgroundListModel::reload()
+{
+ reload(QStringList());
+}
+
+void BackgroundListModel::reload(const QStringList& selected)
+{
+ QStringList dirs = KGlobal::dirs()->findDirs("wallpaper", "");
+ QList<Background *> tmp;
+ foreach (const QString &file, selected) {
+ if (!contains(file) && QFile::exists(file)) {
+ tmp << new BackgroundFile(file, m_ratio);
+ }
+ }
+ foreach (const QString &dir, dirs) {
+ tmp += findAllBackgrounds(this, dir, m_ratio);
+ }
+
+ // add new files to dirwatch
+ foreach (Background *b, tmp) {
+ if (!m_dirwatch.contains(b->path())) {
+ m_dirwatch.addFile(b->path());
+ }
+ }
+
+ if (!tmp.isEmpty()) {
+ beginInsertRows(QModelIndex(), 0, tmp.size() - 1);
+ m_packages = tmp + m_packages;
+ endInsertRows();
+ }
+}
+
+void BackgroundListModel::addBackground(const QString& path) {
+ if (!contains(path)) {
+ if (!m_dirwatch.contains(path)) {
+ m_dirwatch.addFile(path);
+ }
+ beginInsertRows(QModelIndex(), 0, 0);
+ m_packages.prepend(new BackgroundFile(path, m_ratio));
+ endInsertRows();
+ }
+}
+
+int BackgroundListModel::indexOf(const QString &path) const
+{
+ for (int i = 0; i < m_packages.size(); i++) {
+ if (path.startsWith(m_packages[i]->path())) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+bool BackgroundListModel::contains(const QString &path) const
+{
+ return indexOf(path) != -1;
+}
+
+BackgroundListModel::~BackgroundListModel()
+{
+ foreach (Background* pkg, m_packages) {
+ delete pkg;
+ }
+}
+
+int BackgroundListModel::rowCount(const QModelIndex &) const
+{
+ return m_packages.size();
+}
+
+QVariant BackgroundListModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid()) {
+ return QVariant();
+ }
+
+ if (index.row() >= m_packages.size()) {
+ return QVariant();
+ }
+
+ Background *b = package(index.row());
+ if (!b) {
+ return QVariant();
+ }
+
+ switch (role) {
+ case Qt::DisplayRole:
+ return b->title();
+ case BackgroundDelegate::ScreenshotRole: {
+ QPixmap pix = b->screenshot();
+ if (pix.isNull() && !b->screenshotGenerationStarted()) {
+ connect(b, SIGNAL(screenshotDone(QPersistentModelIndex)),
+ m_listener, SLOT(updateScreenshot(QPersistentModelIndex)),
+ Qt::QueuedConnection);
+ b->generateScreenshot(index);
+ }
+ return pix;
+ }
+ case BackgroundDelegate::AuthorRole:
+ return b->author();
+ default:
+ return QVariant();
+ }
+}
+
+Background* BackgroundListModel::package(int index) const
+{
+ return m_packages.at(index);
+}
+
+QList<Background *> BackgroundListModel::findAllBackgrounds(const BackgroundContainer *container,
+ const QString &path, float ratio)
+{
+ QList<Background *> res;
+
+ // get all packages in this directory
+ QStringList packages = Plasma::Package::listInstalled(path);
+ foreach (const QString &packagePath, packages)
+ {
+ kDebug() << packagePath;
+ std::auto_ptr<Background> pkg(new BackgroundPackage(path+packagePath, ratio));
+ if (pkg->isValid() &&
+ (!container || !container->contains(pkg->path()))) {
+ res.append(pkg.release());
+ }
+ }
+
+ // search normal wallpapers
+ QDir dir(path);
+ QStringList filters;
+ filters << "*.png" << "*.jpeg" << "*.jpg" << "*.svg" << "*.svgz";
+ dir.setNameFilters(filters);
+ dir.setFilter(QDir::Files | QDir::Hidden);
+ QFileInfoList files = dir.entryInfoList();
+ foreach (const QFileInfo &wp, files)
+ {
+ bool hidden = false;
+ if (QFile::exists(wp.filePath()+".desktop")) {
+ KDesktopFile config(wp.filePath()+".desktop");
+ KConfigGroup cg = config.group("Wallpaper");
+ hidden = cg.readEntry("Hidden", false);
+ }
+ if (!hidden && (!container || !container->contains(wp.filePath()))) {
+ res.append(new BackgroundFile(wp.filePath(), ratio));
+ }
+ }
+ return res;
+}
+
+
--- wallpapers/CMakeLists.txt
+++ wallpapers/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory(color)
+add_subdirectory(image)
--- wallpapers/color/color.cpp
+++ wallpapers/color/color.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2008 by Petri Damsten <damu@iki.fi>
+ *
+ * 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 "color.h"
+
+#include <QPainter>
+#include <KDebug>
+
+Color::Color(QObject *parent, const QVariantList &args)
+ : Plasma::Wallpaper(parent, args), m_color(Qt::gray)
+{
+}
+
+void Color::paint(QPainter *painter, const QRectF& exposedRect)
+{
+ painter->fillRect(exposedRect, QBrush(m_color));
+}
+
+void Color::init(const KConfigGroup &config)
+{
+ m_color = config.readEntry("wallpapercolor", QColor(Qt::gray));
+}
+
+QWidget* Color::createConfigurationInterface(QWidget* parent)
+{
+ QWidget *widget = new QWidget(parent);
+ m_ui.setupUi(widget);
+
+ m_ui.m_color->setColor(m_color);
+ connect(m_ui.m_color, SIGNAL(changed(const QColor&)), this, SLOT(setColor(const QColor&)));
+ return widget;
+}
+
+void Color::setColor(const QColor& color)
+{
+ m_color = color;
+ emit update(boundingRect());
+}
+
+void Color::save(KConfigGroup &config)
+{
+ config.writeEntry("wallpapercolor", m_color);
+}
+
+#include "color.moc"
--- wallpapers/color/Messages.sh
+++ wallpapers/color/Messages.sh
@@ -0,0 +1,2 @@
+#! /usr/bin/env bash
+$XGETTEXT *.cpp -o $podir/plasma_wallpaper_color.pot
Property changes on: wallpapers/color/Messages.sh
___________________________________________________________________
Added: svn:executable
+ *
--- wallpapers/color/config.ui
+++ wallpapers/color/config.ui
@@ -0,0 +1,96 @@
+<ui version="4.0" >
+ <class>Config</class>
+ <widget class="QWidget" name="Config" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>381</width>
+ <height>145</height>
+ </rect>
+ </property>
+ <property name="windowTitle" >
+ <string>Color</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" >
+ <widget class="QLabel" name="label_5" >
+ <property name="minimumSize" >
+ <size>
+ <width>125</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>&Color:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_color</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" >
+ <widget class="KColorButton" name="m_color" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Minimum" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="color" >
+ <color>
+ <red>70</red>
+ <green>90</green>
+ <blue>130</blue>
+ </color>
+ </property>
+ <property name="defaultColor" >
+ <color>
+ <red>70</red>
+ <green>90</green>
+ <blue>130</blue>
+ </color>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" >
+ <spacer name="spacer" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>87</width>
+ <height>27</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0" colspan="3" >
+ <spacer name="verticalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>338</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>KColorButton</class>
+ <extends>QPushButton</extends>
+ <header>kcolorbutton.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
--- wallpapers/color/color.h
+++ wallpapers/color/color.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2008 by Petri Damsten <damu@iki.fi>
+ *
+ * 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 COLOR_HEADER
+#define COLOR_HEADER
+
+#include <QColor>
+#include <plasma/wallpaper.h>
+#include "ui_config.h"
+
+class Color : public Plasma::Wallpaper
+{
+ Q_OBJECT
+ public:
+ Color(QObject* parent, const QVariantList& args);
+
+ virtual void save(KConfigGroup &config);
+ virtual void paint(QPainter* painter, const QRectF& exposedRect);
+ virtual QWidget* createConfigurationInterface(QWidget* parent);
+
+ protected:
+ virtual void init(const KConfigGroup &config);
+
+ protected slots:
+ void setColor(const QColor& color);
+
+ private:
+ Ui::Config m_ui;
+ QColor m_color;
+};
+
+K_EXPORT_PLASMA_WALLPAPER(color, Color)
+
+#endif
--- wallpapers/color/plasma-wallpaper-color.desktop
+++ wallpapers/color/plasma-wallpaper-color.desktop
@@ -0,0 +1,35 @@
+[Desktop Entry]
+Name=Color
+Name[be@latin]=Koler
+Name[el]=Χρώμα
+Name[et]=Värv
+Name[ga]=Dath
+Name[gl]=Cor
+Name[gu]=રંગ
+Name[ja]=色
+Name[km]=ពណ៌
+Name[nb]=Farge
+Name[nds]=Klöör
+Name[nn]=Farge
+Name[pt]=Cor
+Name[pt_BR]=Cor
+Name[sl]=Barva
+Name[sv]=Färg
+Name[te]=రంగు
+Name[tr]=Renk
+Name[uk]=Колір
+Name[zh_TW]=顏色
+Type=Service
+Icon=preferences-desktop-color
+ServiceTypes=Plasma/Wallpaper
+
+X-KDE-Library=plasma_wallpaper_color
+X-KDE-PluginInfo-Author=Petri Damstén
+X-KDE-PluginInfo-Email=damu@iki.fi
+X-KDE-PluginInfo-Name=color
+X-KDE-PluginInfo-Version=pre0.1
+X-KDE-PluginInfo-Website=http://plasma.kde.org/
+X-KDE-PluginInfo-Depends=
+X-KDE-PluginInfo-License=GPL
+X-KDE-PluginInfo-EnabledByDefault=true
+
--- wallpapers/color/CMakeLists.txt
+++ wallpapers/color/CMakeLists.txt
@@ -0,0 +1,12 @@
+project(plasma-wallpaper-color)
+
+set(color_SRCS
+ color.cpp
+)
+kde4_add_ui_files(color_SRCS config.ui)
+
+kde4_add_plugin(plasma_wallpaper_color ${color_SRCS})
+target_link_libraries(plasma_wallpaper_color plasma ${KDE4_KIO_LIBS})
+
+install(TARGETS plasma_wallpaper_color DESTINATION ${PLUGIN_INSTALL_DIR})
+install(FILES plasma-wallpaper-color.desktop DESTINATION ${SERVICES_INSTALL_DIR})
--- CMakeLists.txt
+++ CMakeLists.txt
@@ -9,3 +9,4 @@
add_subdirectory(tools)
add_subdirectory(containments)
add_subdirectory(plasma)
+add_subdirectory(wallpapers)
--- plasma/wallpaperpreview.h
+++ plasma/wallpaperpreview.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2008 Petri Damsten <damu@iki.fi>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef WALLPAPER_PREVIEW_HEADER
+#define WALLPAPER_PREVIEW_HEADER
+
+#include <QWidget>
+
+namespace Plasma{
+ class Wallpaper;
+ class Svg;
+}
+
+class WallpaperPreview : public QWidget
+{
+ Q_OBJECT
+public:
+ WallpaperPreview(QWidget *parent = 0);
+ virtual ~WallpaperPreview();
+
+ void setWallpaper(Plasma::Wallpaper* wallpaper);
+
+protected:
+ virtual void paintEvent(QPaintEvent* event);
+ virtual void resizeEvent(QResizeEvent* event);
+
+protected slots:
+ void updateRect(const QRectF& rect);
+
+private:
+ Plasma::Wallpaper* m_wallpaper;
+ Plasma::Svg* m_wallpaperOverlay;
+};
+
+#endif // WALLPAPER_PREVIEW
--- plasma/plasma-themes.knsrc
+++ plasma/plasma-themes.knsrc
@@ -0,0 +1,4 @@
+[KNewStuff2]
+ProvidersUrl=http://download.kde.org/khotnewstuff/plasmathemes-providers.xml
+TargetDir=desktoptheme
+Uncompress=true
--- plasma/panelview.h
+++ plasma/panelview.h
@@ -27,12 +27,17 @@
#include <plasma/plasma.h>
#include <plasma/view.h>
+#ifdef Q_WS_X11
+#include <X11/Xlib.h>
+#include <fixx11h.h>
+#endif
+
#ifdef Q_WS_WIN
#include <windows.h>
-#include <shellapi.h>
#endif
class QWidget;
+class QTimeLine;
namespace Plasma
{
@@ -42,6 +47,7 @@
}
class PanelController;
+
class PanelAppletOverlay;
class PanelView : public Plasma::View
@@ -49,6 +55,12 @@
Q_OBJECT
public:
+ enum PanelMode {
+ NormalPanel = 0,
+ AutoHide,
+ LetWindowsCover
+ };
+
/**
* Constructs a new panelview.
* @arg parent the QWidget this panel is parented to
@@ -62,11 +74,16 @@
Plasma::Location location() const;
/**
+ * @return panel behaviour
+ */
+ PanelMode panelMode() const;
+
+ /**
* @return the Corona (scene) associated with this panel.
*/
Plasma::Corona *corona() const;
- /**
+ /*
* @return the offset of the panel from the left screen edge
*/
int offset() const;
@@ -80,6 +97,16 @@
* Pinches the min/max sizes of the containment to the current screen resolution
*/
void pinchContainment(const QRect &screenGeometry);
+#ifdef Q_WS_X11
+ /**
+ * @return the unhide trigger window id, None if there is none
+ */
+ Window unhideTrigger() { return m_unhideTrigger; }
+#endif
+ /**
+ * unhides the panel if it is hidden
+ */
+ void unhide();
public Q_SLOTS:
/**
@@ -106,15 +133,44 @@
*/
void setLocation(Plasma::Location location);
+ /**
+ * Sets the panel behaviour
+ * @param mode
+ */
+ void setPanelMode(PanelView::PanelMode mode);
+
protected:
void updateStruts();
void moveEvent(QMoveEvent *event);
void resizeEvent(QResizeEvent *event);
+ void leaveEvent(QEvent *event);
+ void drawBackground(QPainter * painter, const QRectF & rect);
+ void paintEvent(QPaintEvent *event);
+ bool event(QEvent *event);
+private:
+ void createUnhideTrigger();
+ void destroyUnhideTrigger();
+ Qt::Alignment alignmentFilter(Qt::Alignment align) const;
+ bool isHorizontal() const;
+ QTimeLine *timeLine();
+
+#ifdef Q_WS_WIN
+ bool registerAccessBar(HWND hwndAccessBar, bool fRegister);
+ void appBarQuerySetPos(uint uEdge, LPRECT lprc, PAPPBARDATA pabd);
+ void appBarCallback(MSG *message, long *result);
+ void appBarPosChanged(PAPPBARDATA pabd);
+ bool winEvent(MSG *message, long *result);
+ bool m_barRegistered;
+#endif
+
private Q_SLOTS:
+ void checkForActivation();
void showAppletBrowser();
void togglePanelController();
void edittingComplete();
+ void animateHide(qreal);
+ void panelDeleted();
/**
* Updates the panel's position according to the screen and containment
@@ -123,28 +179,25 @@
void updatePanelGeometry();
private:
- Qt::Alignment alignmentFilter(Qt::Alignment align) const;
- bool isHorizontal() const;
-#ifdef Q_WS_WIN
- bool registerAccessBar(HWND hwndAccessBar, bool fRegister);
- void appBarQuerySetPos(uint uEdge, LPRECT lprc, PAPPBARDATA pabd);
- void appBarCallback(MSG *message, long *result);
- void appBarPosChanged(PAPPBARDATA pabd);
- bool winEvent(MSG *message, long *result);
- bool m_barRegistered;
-#endif
-
Plasma::Svg *m_background;
PanelController *m_panelController;
QList<PanelAppletOverlay*> m_moveOverlays;
+ QTimeLine *m_timeLine;
int m_offset;
Qt::Alignment m_alignment;
+#ifdef Q_WS_X11
+ Window m_unhideTrigger;
+#endif
+
QSizeF m_lastMin;
QSizeF m_lastMax;
+ PanelMode m_panelMode;
int m_lastSeenSize;
- bool m_lastHorizontal;
- bool m_editting;
+ bool m_lastHorizontal : 1;
+
+ bool m_editting : 1;
+ bool m_firstPaint : 1;
};
#endif
--- plasma/backgrounddialog.cpp
+++ plasma/backgrounddialog.cpp
@@ -0,0 +1,586 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+ Copyright (C) 2007 Ivan Cukic <ivan.cukic+kde@gmail.com>
+ Copyright (c) 2008 by Petri Damsten <damu@iki.fi>
+
+ 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.
+*/
+
+#include "backgrounddialog.h"
+
+#include <QPainter>
+#include <QFile>
+#include <QAbstractItemView>
+#include <QStandardItemModel>
+
+#include <KStandardDirs>
+#include <KDesktopFile>
+#include <KColorScheme>
+#include <KNS/Engine>
+
+#include <plasma/containment.h>
+#include <plasma/panelsvg.h>
+#include <plasma/theme.h>
+#include <plasma/wallpaper.h>
+#include <plasma/view.h>
+#include <plasma/corona.h>
+
+#include "wallpaperpreview.h"
+
+typedef QPair<QString, QString> WallpaperInfo;
+Q_DECLARE_METATYPE(WallpaperInfo)
+
+class ThemeInfo
+{
+public:
+ QString package;
+ Plasma::PanelSvg *svg;
+};
+
+class ThemeModel : public QAbstractListModel
+{
+public:
+ enum { PackageNameRole = Qt::UserRole,
+ SvgRole = Qt::UserRole + 1
+ };
+
+ ThemeModel(QObject *parent = 0);
+ virtual ~ThemeModel();
+
+ virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
+ virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+ int indexOf(const QString &path) const;
+ void reload();
+private:
+ QMap<QString, ThemeInfo> m_themes;
+};
+
+ThemeModel::ThemeModel( QObject *parent )
+: QAbstractListModel( parent )
+{
+ reload();
+}
+
+ThemeModel::~ThemeModel()
+{
+}
+
+void ThemeModel::reload()
+{
+ reset();
+ foreach (const QString& key, m_themes.keys()) {
+ delete m_themes[key].svg;
+ }
+ m_themes.clear();
+
+ // get all desktop themes
+ KStandardDirs dirs;
+ QStringList themes = dirs.findAllResources("data", "desktoptheme/*/metadata.desktop",
+ KStandardDirs::NoDuplicates);
+ foreach (const QString &theme, themes) {
+ kDebug() << theme;
+ int themeSepIndex = theme.lastIndexOf('/', -1);
+ QString themeRoot = theme.left(themeSepIndex);
+ int themeNameSepIndex = themeRoot.lastIndexOf('/', -1);
+ QString packageName = themeRoot.right(themeRoot.length() - themeNameSepIndex - 1);
+
+ KDesktopFile df(theme);
+ QString name = df.readName();
+ if (name.isEmpty()) {
+ name = packageName;
+ }
+
+ Plasma::PanelSvg *svg = new Plasma::PanelSvg(this);
+ QString svgFile = themeRoot + "/widgets/background.svg";
+ if (QFile::exists(svgFile)) {
+ svg->setImagePath(svgFile);
+ } else {
+ svg->setImagePath(svgFile + "z");
+ }
+ svg->setEnabledBorders(Plasma::PanelSvg::AllBorders);
+ ThemeInfo info;
+ info.package = packageName;
+ info.svg = svg;
+ m_themes[name] = info;
+ }
+
+ beginInsertRows(QModelIndex(), 0, m_themes.size());
+ endInsertRows();
+}
+
+int ThemeModel::rowCount(const QModelIndex &) const
+{
+ return m_themes.size();
+}
+
+QVariant ThemeModel::data(const QModelIndex &index, int role) const
+{
+ if (!index.isValid()) {
+ return QVariant();
+ }
+
+ if (index.row() >= m_themes.size()) {
+ return QVariant();
+ }
+
+ QMap<QString, ThemeInfo>::const_iterator it = m_themes.constBegin();
+ for (int i = 0; i < index.row(); ++i) {
+ ++it;
+ }
+
+ switch (role) {
+ case Qt::DisplayRole:
+ return it.key();
+ case PackageNameRole:
+ return (*it).package;
+ case SvgRole:
+ return qVariantFromValue((void*)(*it).svg);
+ default:
+ return QVariant();
+ }
+}
+
+int ThemeModel::indexOf(const QString &name) const
+{
+ QMapIterator<QString, ThemeInfo> it(m_themes);
+ int i = -1;
+ while (it.hasNext()) {
+ ++i;
+ if (it.next().value().package == name) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+
+class ThemeDelegate : public QAbstractItemDelegate
+{
+public:
+ ThemeDelegate(QObject * parent = 0);
+
+ virtual void paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
+ virtual QSize sizeHint(const QStyleOptionViewItem &option,
+ const QModelIndex &index) const;
+private:
+ static const int MARGIN = 5;
+};
+
+ThemeDelegate::ThemeDelegate(QObject* parent)
+: QAbstractItemDelegate(parent)
+{
+}
+
+void ThemeDelegate::paint(QPainter *painter,
+ const QStyleOptionViewItem &option,
+ const QModelIndex &index) const
+{
+ QString title = index.model()->data(index, Qt::DisplayRole).toString();
+ QString package = index.model()->data(index, ThemeModel::PackageNameRole).toString();
+
+ // highlight selected item
+ painter->save();
+ if (option.state & QStyle::State_Selected) {
+ painter->setBrush(option.palette.color(QPalette::Highlight));
+ } else {
+ painter->setBrush(Qt::gray);
+ }
+ painter->drawRect(option.rect);
+ painter->restore();
+
+ // draw image
+ Plasma::PanelSvg *svg = static_cast<Plasma::PanelSvg *>(
+ index.model()->data(index, ThemeModel::SvgRole).value<void *>());
+ svg->resizePanel(QSize(option.rect.width() - (2 * MARGIN), 100 - (2 * MARGIN)));
+ QRect imgRect = QRect(option.rect.topLeft(),
+ QSize(option.rect.width() - (2 * MARGIN), 100 - (2 * MARGIN)))
+ .translated(MARGIN, MARGIN);
+ svg->paintPanel( painter, imgRect, QPoint(option.rect.left() + MARGIN, option.rect.top() + MARGIN) );
+
+ // draw text
+ painter->save();
+ QFont font = painter->font();
+ font.setWeight(QFont::Bold);
+ QString colorFile = KStandardDirs::locate("data", "desktoptheme/" + package + "/colors");
+ if (!colorFile.isEmpty()) {
+ KSharedConfigPtr colors = KSharedConfig::openConfig(colorFile);
+ KColorScheme colorScheme(QPalette::Active, KColorScheme::Window, colors);
+ painter->setPen(colorScheme.foreground(KColorScheme::NormalText).color());
+ }
+ painter->setFont(font);
+ painter->drawText(option.rect, Qt::AlignCenter | Qt::TextWordWrap, title);
+ painter->restore();
+}
+
+QSize ThemeDelegate::sizeHint(const QStyleOptionViewItem &, const QModelIndex &) const
+{
+ return QSize(200, 100);
+}
+
+// From kcategorizeditemsviewdelegate by Ivan Cukic
+#define EMBLEM_ICON_SIZE 16
+#define UNIVERSAL_PADDING 6
+#define FADE_LENGTH 32
+#define MAIN_ICON_SIZE 48
+
+class AppletDelegate : public QAbstractItemDelegate
+{
+public:
+ enum { DescriptionRole = Qt::UserRole + 1, PluginNameRole };
+
+ AppletDelegate(QObject * parent = 0);
+
+ virtual void paint(QPainter* painter, const QStyleOptionViewItem& option,
+ const QModelIndex& index) const;
+ virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const;
+ int calcItemHeight(const QStyleOptionViewItem& option) const;
+};
+
+AppletDelegate::AppletDelegate(QObject* parent)
+: QAbstractItemDelegate(parent)
+{
+}
+
+void AppletDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option,
+ const QModelIndex& index) const
+{
+ QStyleOptionViewItemV4 opt(option);
+ QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
+ style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
+
+ const int left = option.rect.left();
+ const int top = option.rect.top();
+ const int width = option.rect.width();
+ const int height = calcItemHeight(option);
+
+ bool leftToRight = (painter->layoutDirection() == Qt::LeftToRight);
+ QIcon::Mode iconMode = QIcon::Normal;
+
+ QColor foregroundColor = (option.state.testFlag(QStyle::State_Selected)) ?
+ option.palette.color(QPalette::HighlightedText) : option.palette.color(QPalette::Text);
+
+ // Painting main column
+ QFont titleFont = option.font;
+ titleFont.setBold(true);
+ titleFont.setPointSize(titleFont.pointSize() + 2);
+
+ QPixmap pixmap(width, height);
+ pixmap.fill(Qt::transparent);
+ QPainter p(&pixmap);
+ p.translate(-option.rect.topLeft());
+
+ QLinearGradient gradient;
+
+ QString title = index.model()->data(index, Qt::DisplayRole).toString();
+ QString description = index.model()->data(index, AppletDelegate::DescriptionRole).toString();
+
+ // Painting
+
+ // Text
+ int textInner = 2 * UNIVERSAL_PADDING + MAIN_ICON_SIZE;
+
+ p.setPen(foregroundColor);
+ p.setFont(titleFont);
+ p.drawText(left + (leftToRight ? textInner : 0),
+ top, width - textInner, height / 2,
+ Qt::AlignBottom | Qt::AlignLeft, title);
+ p.setFont(option.font);
+ p.drawText(left + (leftToRight ? textInner : 0),
+ top + height / 2,
+ width - textInner, height / 2,
+ Qt::AlignTop | Qt::AlignLeft, description);
+
+ // Main icon
+ const QIcon& icon = qVariantValue<QIcon>(index.model()->data(index, Qt::DecorationRole));
+ icon.paint(&p,
+ leftToRight ? left + UNIVERSAL_PADDING : left + width - UNIVERSAL_PADDING - MAIN_ICON_SIZE,
+ top + UNIVERSAL_PADDING, MAIN_ICON_SIZE, MAIN_ICON_SIZE, Qt::AlignCenter, iconMode);
+
+ // Gradient part of the background - fading of the text at the end
+ if (leftToRight) {
+ gradient = QLinearGradient(left + width - UNIVERSAL_PADDING - FADE_LENGTH, 0,
+ left + width - UNIVERSAL_PADDING, 0);
+ gradient.setColorAt(0, Qt::white);
+ gradient.setColorAt(1, Qt::transparent);
+ } else {
+ gradient = QLinearGradient(left + UNIVERSAL_PADDING, 0,
+ left + UNIVERSAL_PADDING + FADE_LENGTH, 0);
+ gradient.setColorAt(0, Qt::transparent);
+ gradient.setColorAt(1, Qt::white);
+ }
+
+ QRect paintRect = option.rect;
+ p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
+ p.fillRect(paintRect, gradient);
+
+ if (leftToRight) {
+ gradient.setStart(left + width - FADE_LENGTH, 0);
+ gradient.setFinalStop(left + width, 0);
+ } else {
+ gradient.setStart(left + UNIVERSAL_PADDING, 0);
+ gradient.setFinalStop(left + UNIVERSAL_PADDING + FADE_LENGTH, 0);
+ }
+ paintRect.setHeight(UNIVERSAL_PADDING + MAIN_ICON_SIZE / 2);
+ p.fillRect(paintRect, gradient);
+ p.end();
+
+ painter->drawPixmap(option.rect.topLeft(), pixmap);
+}
+
+int AppletDelegate::calcItemHeight(const QStyleOptionViewItem& option) const
+{
+ // Painting main column
+ QFont titleFont = option.font;
+ titleFont.setBold(true);
+ titleFont.setPointSize(titleFont.pointSize() + 2);
+
+ int textHeight = QFontInfo(titleFont).pixelSize() + QFontInfo(option.font).pixelSize();
+ //kDebug() << textHeight << qMax(textHeight, MAIN_ICON_SIZE) + 2 * UNIVERSAL_PADDING;
+ return qMax(textHeight, MAIN_ICON_SIZE) + 2 * UNIVERSAL_PADDING;
+}
+
+QSize AppletDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
+{
+ Q_UNUSED(index)
+ return QSize(200, calcItemHeight(option));
+}
+
+BackgroundDialog::BackgroundDialog(const QSize& res, Plasma::View* view, QWidget* parent)
+ : KDialog(parent),
+ m_themeModel(0),
+ m_containmentModel(0),
+ m_wallpaper(0),
+ m_view(view),
+ m_containment(m_view->containment()),
+ m_preview(0)
+{
+ setWindowIcon(KIcon("preferences-desktop-wallpaper"));
+ setCaption(i18n("Desktop Settings"));
+ showButtonSeparator(true);
+ setButtons(Ok | Cancel | Apply);
+
+ QWidget * main = new QWidget(this);
+ setupUi(main);
+
+ // Size of monitor image: 200x186
+ // Geometry of "display" part of monitor image: (23,14)-[151x115]
+ qreal previewRatio = (qreal)res.height() / (qreal)res.width();
+ QSize monitorSize(200, int(200 * previewRatio));
+
+ Plasma::PanelSvg *svg = new Plasma::PanelSvg(this);
+ svg->setImagePath("widgets/monitor");
+ svg->resizePanel(monitorSize);
+ QPixmap monitorPix(monitorSize + QSize(0, svg->elementSize("base").height() - svg->marginSize(Plasma::BottomMargin)));
+ monitorPix.fill(Qt::transparent);
+
+ QPainter painter(&monitorPix);
+ QPoint standPosizion(monitorSize.width()/2 - svg->elementSize("base").width()/2, svg->contentsRect().bottom());
+ svg->paint(&painter, standPosizion, "base");
+ svg->paintPanel(&painter, monitorPix.rect());
+ painter.end();
+
+ m_monitor->setPixmap(monitorPix);
+ m_monitor->setWhatsThis(i18n(
+ "This picture of a monitor contains a preview of "
+ "what the current settings will look like on your desktop."));
+ m_preview = new WallpaperPreview(m_monitor);
+ m_preview->setGeometry(svg->contentsRect().toRect());
+
+ connect(m_newThemeButton, SIGNAL(clicked()), this, SLOT(getNewThemes()));
+
+ connect(this, SIGNAL(finished(int)), this, SLOT(cleanup()));
+ connect(this, SIGNAL(okClicked()), this, SLOT(saveConfig()));
+ connect(this, SIGNAL(applyClicked()), this, SLOT(saveConfig()));
+
+ m_themeModel = new ThemeModel(this);
+ m_theme->setModel(m_themeModel);
+ m_theme->setItemDelegate(new ThemeDelegate(m_theme->view()));
+ m_theme->view()->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+
+ m_containmentModel = new QStandardItemModel(this);
+ m_containmentComboBox->setModel(m_containmentModel);
+ m_containmentComboBox->setItemDelegate(new AppletDelegate());
+
+ setMainWidget(main);
+ reloadConfig();
+ adjustSize();
+}
+
+BackgroundDialog::~BackgroundDialog()
+{
+ cleanup();
+}
+
+void BackgroundDialog::cleanup()
+{
+ delete m_wallpaper;
+ m_wallpaper = 0;
+}
+
+void BackgroundDialog::getNewThemes()
+{
+ KNS::Engine engine(0);
+ if (engine.init("plasma-themes.knsrc")) {
+ KNS::Entry::List entries = engine.downloadDialogModal(this);
+
+ if (entries.size() > 0) {
+ m_themeModel->reload();
+ m_theme->setCurrentIndex(m_themeModel->indexOf(
+ Plasma::Theme::defaultTheme()->themeName()));
+ }
+ }
+}
+
+void BackgroundDialog::reloadConfig()
+{
+ disconnect(m_wallpaperMode, SIGNAL(currentIndexChanged(int)), this, SLOT(changeBackgroundMode(int)));
+ m_containment = m_view->containment();
+ int containmentIndex = 0;
+ int wallpaperIndex = 0;
+
+ // Containment
+ KPluginInfo::List plugins = Plasma::Containment::listContainments();
+ m_containmentModel->clear();
+ int i = 0;
+ foreach (KPluginInfo info, plugins) {
+ QStandardItem* item = new QStandardItem(KIcon(info.icon()), info.name());
+ item->setData(info.comment(), AppletDelegate::DescriptionRole);
+ item->setData(info.pluginName(), AppletDelegate::PluginNameRole);
+ m_containmentModel->appendRow(item);
+ if (info.pluginName() == m_containment->pluginName()) {
+ containmentIndex = i;
+ }
+ ++i;
+ }
+ m_containmentComboBox->setCurrentIndex(containmentIndex);
+
+ // Wallpaper
+ bool doWallpaper = m_containment->drawWallpaper();
+ m_wallpaperLabel->setVisible(doWallpaper);
+ m_wallpaperGroup->setVisible(doWallpaper);
+ if (doWallpaper) {
+ // Load wallpaper plugins
+ QString currentPlugin;
+ QString currentMode;
+
+ Plasma::Wallpaper *currentWallpaper = m_containment->wallpaper();
+ if (currentWallpaper) {
+ currentPlugin = currentWallpaper->pluginName();
+ currentMode = currentWallpaper->renderingMode().name();
+ }
+
+ plugins = Plasma::Wallpaper::listWallpaperInfo();
+ m_wallpaperMode->clear();
+ i = 0;
+ foreach (KPluginInfo info, plugins) {
+ bool matches = info.pluginName() == currentPlugin;
+ const QList<KServiceAction>& modes = info.service()->actions();
+ if (modes.count() > 0) {
+ foreach (const KServiceAction& mode, modes) {
+ m_wallpaperMode->addItem(KIcon(mode.icon()), mode.text(),
+ QVariant::fromValue(WallpaperInfo(info.pluginName(), mode.name())));
+ if (matches && mode.name() == currentMode) {
+ wallpaperIndex = i;
+ }
+ ++i;
+ }
+ } else {
+ m_wallpaperMode->addItem(KIcon(info.icon()), info.name(),
+ QVariant::fromValue(WallpaperInfo(info.pluginName(), QString())));
+ if (matches) {
+ wallpaperIndex = i;
+ }
+ ++i;
+ }
+ }
+ m_wallpaperMode->setCurrentIndex(wallpaperIndex);
+ changeBackgroundMode(wallpaperIndex);
+ }
+
+ // Theme
+ m_theme->setCurrentIndex(m_themeModel->indexOf(Plasma::Theme::defaultTheme()->themeName()));
+
+ connect(m_wallpaperMode, SIGNAL(currentIndexChanged(int)), this, SLOT(changeBackgroundMode(int)));
+}
+
+void BackgroundDialog::changeBackgroundMode(int mode)
+{
+ kDebug();
+ QWidget* w = 0;
+ WallpaperInfo wallpaperInfo = m_wallpaperMode->itemData(mode).value<WallpaperInfo>();
+
+ if (m_wallpaperGroup->layout()->count() > 1) {
+ delete dynamic_cast<QWidgetItem*>(m_wallpaperGroup->layout()->takeAt(1))->widget();
+ }
+
+ if (m_wallpaper && m_wallpaper->pluginName() != wallpaperInfo.first) {
+ delete m_wallpaper;
+ m_wallpaper = 0;
+ }
+
+ if (!m_wallpaper) {
+ m_wallpaper = Plasma::Wallpaper::load(wallpaperInfo.first);
+ m_preview->setWallpaper(m_wallpaper);
+ }
+
+ if (m_wallpaper) {
+ KConfigGroup cfg = wallpaperConfig(wallpaperInfo.first);
+ kDebug() << "making a" << wallpaperInfo.first << "in mode" << wallpaperInfo.second;
+ m_wallpaper->restore(cfg, wallpaperInfo.second);
+ w = m_wallpaper->createConfigurationInterface(m_wallpaperGroup);
+ }
+
+ if (!w) {
+ w = new QWidget(m_wallpaperGroup);
+ }
+
+ m_wallpaperGroup->layout()->addWidget(w);
+}
+
+KConfigGroup BackgroundDialog::wallpaperConfig(const QString &plugin)
+{
+ Q_ASSERT(m_containment);
+
+ //FIXME: we have details about the structure of the containment config duplicated here!
+ KConfigGroup cfg = m_containment->config();
+ cfg = KConfigGroup(&cfg, "Wallpaper");
+ return KConfigGroup(&cfg, plugin);
+}
+
+void BackgroundDialog::saveConfig()
+{
+ QString theme = m_theme->itemData(m_theme->currentIndex(),
+ ThemeModel::PackageNameRole).toString();
+ QString wallpaperPlugin = m_wallpaperMode->itemData(m_wallpaperMode->currentIndex()).value<WallpaperInfo>().first;
+ QString wallpaperMode = m_wallpaperMode->itemData(m_wallpaperMode->currentIndex()).value<WallpaperInfo>().second;
+ QString containment = m_containmentComboBox->itemData(m_containmentComboBox->currentIndex(),
+ AppletDelegate::PluginNameRole).toString();
+
+ // Containment
+ if (m_containment->pluginName() != containment) {
+ m_containment = m_view->swapContainment(containment);
+ }
+
+ // Wallpaper
+ Plasma::Wallpaper *currentWallpaper = m_containment->wallpaper();
+ if (currentWallpaper) {
+ KConfigGroup cfg = wallpaperConfig(currentWallpaper->pluginName());
+ currentWallpaper->save(cfg);
+ }
+
+ if (m_wallpaper) {
+ KConfigGroup cfg = wallpaperConfig(m_wallpaper->pluginName());
+ m_wallpaper->save(cfg);
+ }
+
+ m_containment->setWallpaper(wallpaperPlugin, wallpaperMode);
+
+ // Plasma Theme
+ Plasma::Theme::defaultTheme()->setThemeName(theme);
+}
--- plasma/panelcontroller.cpp
+++ plasma/panelcontroller.cpp
@@ -1,4 +1,4 @@
- /*
+/*
* Copyright 2008 Marco Martin <notmart@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -22,13 +22,16 @@
#include <QAction>
#include <QApplication>
#include <QBoxLayout>
+#include <QVBoxLayout>
#include <QDesktopWidget>
#include <QFrame>
+#include <QLabel>
#include <QMouseEvent>
#include <QPainter>
#include <QToolButton>
#include <KColorUtils>
+#include <KIconLoader>
#include <KIcon>
#include <KWindowSystem>
@@ -36,6 +39,8 @@
#include <plasma/corona.h>
#include <plasma/paintutils.h>
#include <plasma/theme.h>
+#include <plasma/svg.h>
+#include <plasma/dialog.h>
#include "plasmaapp.h"
#include "positioningruler.h"
@@ -83,89 +88,7 @@
}
};
-class PanelController::ResizeHandle: public QWidget
-{
-public:
- ResizeHandle(QWidget *parent)
- : QWidget(parent),
- m_mouseOver(false)
- {
- setCursor(Qt::SizeVerCursor);
- }
- QSize sizeHint() const
- {
- return QSize(4, 4);
- }
-
- void paintEvent(QPaintEvent *event)
- {
- QPainter painter(this);
- QColor backColor = Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor);
-
- if (m_mouseOver) {
- backColor.setAlphaF(0.50);
- } else {
- backColor.setAlphaF(0.30);
- }
-
- painter.fillRect(event->rect(), backColor);
-
- // draw 3 dots to resemble other resize handles
- int diameter = qMin(width(), height());
- QRect dotRect(QPoint(0,0), QSize(diameter, diameter));
- dotRect.moveCenter(mapFromParent(geometry().center()));
-
- painter.setRenderHint(QPainter::Antialiasing, true);
-
- paintDot(&painter, dotRect);
-
- //other two dots
- if (size().width() > size().height()) {
- dotRect.translate(-diameter*2, 0);
- paintDot(&painter, dotRect);
- dotRect.translate(diameter*4, 0);
- paintDot(&painter, dotRect);
- } else {
- dotRect.translate(0, -diameter*2);
- paintDot(&painter, dotRect);
- dotRect.translate(0, diameter*4);
- paintDot(&painter, dotRect);
- }
- }
-
-protected:
- void enterEvent(QEvent * event)
- {
- m_mouseOver = true;
- update();
- }
-
- void leaveEvent(QEvent * event)
- {
- m_mouseOver = false;
- update();
- }
-
-private:
- void paintDot(QPainter *painter, QRect dotRect)
- {
- QLinearGradient gradient(dotRect.left(), dotRect.top(), dotRect.left(), dotRect.bottom());
- QColor firstColor = Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor);
- firstColor.setAlphaF(0.6);
- QColor secondColor = Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor);
- secondColor.setAlphaF(0.6);
- gradient.setColorAt(0, firstColor);
- gradient.setColorAt(1, secondColor);
-
- painter->setBrush(gradient);
- painter->setPen(Qt::NoPen);
- painter->drawEllipse(dotRect);
- }
-
- bool m_mouseOver;
-};
-
class PanelController::Private
{
public:
@@ -180,7 +103,8 @@
startDragPos(0,0),
leftAlignTool(0),
centerAlignTool(0),
- rightAlignTool(0)
+ rightAlignTool(0),
+ drawMoveHint(false)
{
}
@@ -242,7 +166,7 @@
return;
}
- QSize preferredSize(containment->size().toSize());
+ QSize preferredSize(containment->preferredSize().toSize());
switch (location) {
case Plasma::LeftEdge:
@@ -284,9 +208,94 @@
ruler->setOffset(0);
}
+ void panelModeChanged(bool toggle)
+ {
+ if (!toggle) {
+ return;
+ }
+
+ if (q->sender() == normalPanelTool) {
+ emit q->panelModeChanged(PanelView::NormalPanel);
+ } else if (q->sender() == autoHideTool) {
+ emit q->panelModeChanged(PanelView::AutoHide);
+ } else if (q->sender() == underWindowsTool) {
+ emit q->panelModeChanged(PanelView::LetWindowsCover);
+ }
+ }
+
+ void settingsPopup()
+ {
+ if (optionsDialog->isVisible()) {
+ optionsDialog->hide();
+ } else {
+ KWindowSystem::setState(optionsDialog->winId(), NET::SkipTaskbar | NET::SkipPager | NET::Sticky);
+ QPoint pos = q->mapToGlobal(settingsTool->pos());
+ optionsDialog->layout()->activate();
+ optionsDialog->resize(optionsDialog->sizeHint());
+ QSize s = optionsDialog->size();
+
+ switch (location) {
+ case Plasma::BottomEdge:
+ pos = QPoint(pos.x(), pos.y() - s.height());
+ break;
+ case Plasma::TopEdge:
+ pos = QPoint(pos.x(), pos.y() + settingsTool->size().height());
+ break;
+ case Plasma::LeftEdge:
+ pos = QPoint(pos.x() + settingsTool->size().width(), pos.y());
+ break;
+ case Plasma::RightEdge:
+ pos = QPoint(pos.x() - s.width(), pos.y());
+ break;
+ default:
+ if (pos.y() - s.height() > 0) {
+ pos = QPoint(pos.x(), pos.y() - s.height());
+ } else {
+ pos = QPoint(pos.x(), pos.y() + settingsTool->size().height());
+ }
+ }
+
+ QRect screenRect = QApplication::desktop()->screenGeometry(containment->screen());
+
+ if (pos.rx() + s.width() > screenRect.right()) {
+ pos.rx() -= ((pos.rx() + s.width()) - screenRect.right());
+ }
+
+ if (pos.ry() + s.height() > screenRect.bottom()) {
+ pos.ry() -= ((pos.ry() + s.height()) - screenRect.bottom());
+ }
+
+ pos.rx() = qMax(0, pos.rx());
+ optionsDialog->move(pos);
+ optionsDialog->show();
+ }
+ }
+
+ void syncRuler()
+ {
+ QRect screenGeom =
+ QApplication::desktop()->screenGeometry(containment->screen());
+
+ switch (location) {
+ case Plasma::LeftEdge:
+ case Plasma::RightEdge:
+ ruler->setAvailableLength(screenGeom.height());
+ ruler->setMaxLength(qMin((int)containment->maximumSize().height(), screenGeom.height()));
+ ruler->setMinLength(containment->minimumSize().height());
+ break;
+ case Plasma::TopEdge:
+ case Plasma::BottomEdge:
+ default:
+ ruler->setAvailableLength(screenGeom.width());
+ ruler->setMaxLength(qMin((int)containment->maximumSize().width(), screenGeom.width()));
+ ruler->setMinLength(containment->minimumSize().width());
+ break;
+ }
+ }
+
enum DragElement { NoElement = 0,
- ResizeHandleElement,
- PanelControllerElement
+ ResizeButtonElement,
+ MoveButtonElement
};
PanelController *q;
@@ -295,21 +304,35 @@
Plasma::Location location;
QBoxLayout *extLayout;
QBoxLayout *layout;
- QBoxLayout *alignLayout;
+ QLabel *alignLabel;
+ QLabel *modeLabel;
DragElement dragging;
QPoint startDragPos;
+ Plasma::Svg *svg;
+ Plasma::Dialog *optionsDialog;
+ QBoxLayout *optDialogLayout;
+ ToolButton *settingsTool;
+ ToolButton *moveTool;
+ ToolButton *sizeTool;
+
//Alignment buttons
ToolButton *leftAlignTool;
ToolButton *centerAlignTool;
ToolButton *rightAlignTool;
+ //Panel mode buttons
+ ToolButton *normalPanelTool;
+ ToolButton *autoHideTool;
+ ToolButton *underWindowsTool;
+
//Widgets for actions
QList<QWidget *> actionWidgets;
- ResizeHandle *panelHeightHandle;
PositioningRuler *ruler;
+ bool drawMoveHint;
+
static const int minimumHeight = 10;
};
@@ -317,19 +340,26 @@
: QWidget(0),
d(new Private(this))
{
+ Q_UNUSED(parent)
+
+ QPalette pal = palette();
+ pal.setBrush(backgroundRole(), Qt::transparent);
+ QWidget::setPalette(pal);
+
+ d->svg = new Plasma::Svg(this);
+ d->svg->setImagePath("widgets/containment-controls");
+ d->svg->setContainsMultipleImages(true);
+
//setWindowFlags(Qt::Popup);
setWindowFlags(Qt::FramelessWindowHint);
KWindowSystem::setState(winId(), NET::SkipTaskbar | NET::SkipPager | NET::Sticky);
setAttribute(Qt::WA_DeleteOnClose);
setFocus(Qt::ActiveWindowFocusReason);
- //Resize handles
- d->panelHeightHandle = new ResizeHandle(this);
//layout setup
d->extLayout = new QBoxLayout(QBoxLayout::TopToBottom, this);
d->extLayout->setContentsMargins(0, 1, 0, 0);
setLayout(d->extLayout);
- d->extLayout->addWidget(d->panelHeightHandle);
d->layout = new QBoxLayout(QBoxLayout::LeftToRight);
d->layout->setContentsMargins(4, 4, 4, 4);
@@ -339,6 +369,7 @@
d->layout->setDirection(QBoxLayout::LeftToRight);
}
d->layout->setSpacing(4);
+
d->layout->addStretch();
d->extLayout->addLayout(d->layout);
@@ -347,34 +378,91 @@
//alignment
//first the container
QFrame *alignFrame = new ButtonGroup(this);
- d->alignLayout = new QBoxLayout(d->layout->direction(), alignFrame);
- alignFrame->setLayout(d->alignLayout);
- d->layout->addWidget(alignFrame);
-
- d->leftAlignTool = d->addTool("format-justify-left", i18n("Align panel to left"), alignFrame, Qt::ToolButtonIconOnly, true);
- d->alignLayout->addWidget(d->leftAlignTool);
+ QVBoxLayout *alignLayout = new QVBoxLayout(alignFrame);
+
+
+ d->alignLabel = new QLabel(i18n("Panel Alignment"), this);
+ alignLayout->addWidget(d->alignLabel);
+
+ d->leftAlignTool = d->addTool("format-justify-left", i18n("Left"), alignFrame, Qt::ToolButtonTextBesideIcon, true);
+ d->leftAlignTool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ alignLayout->addWidget(d->leftAlignTool);
d->leftAlignTool->setChecked(true);
connect(d->leftAlignTool, SIGNAL(toggled(bool)), this, SLOT(alignToggled(bool)));
- d->centerAlignTool = d->addTool("format-justify-center", i18n("Align panel to center"), alignFrame, Qt::ToolButtonIconOnly, true);
- d->alignLayout->addWidget(d->centerAlignTool);
+ d->centerAlignTool = d->addTool("format-justify-center", i18n("Center"), alignFrame, Qt::ToolButtonTextBesideIcon, true);
+ d->centerAlignTool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ alignLayout->addWidget(d->centerAlignTool);
connect(d->centerAlignTool, SIGNAL(clicked(bool)), this, SLOT(alignToggled(bool)));
- d->rightAlignTool = d->addTool("format-justify-right", i18n("Align panel to right"), alignFrame, Qt::ToolButtonIconOnly, true);
- d->alignLayout->addWidget(d->rightAlignTool);
+ d->rightAlignTool = d->addTool("format-justify-right", i18n("Right"), alignFrame, Qt::ToolButtonTextBesideIcon, true);
+ d->rightAlignTool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ alignLayout->addWidget(d->rightAlignTool);
connect(d->rightAlignTool, SIGNAL(clicked(bool)), this, SLOT(alignToggled(bool)));
+
+ //Panel mode
+ //first the container
+ QFrame *modeFrame = new ButtonGroup(this);
+ QVBoxLayout *modeLayout = new QVBoxLayout(modeFrame);
+
+ d->modeLabel = new QLabel(i18n("Visibility"), this);
+ modeLayout->addWidget(d->modeLabel);
+
+ d->normalPanelTool = d->addTool("checkmark", i18n("Always visible"), modeFrame, Qt::ToolButtonTextBesideIcon, true);
+ d->normalPanelTool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ modeLayout->addWidget(d->normalPanelTool);
+ connect(d->normalPanelTool, SIGNAL(toggled(bool)), this, SLOT(panelModeChanged(bool)));
+
+ d->autoHideTool = d->addTool("video-display", i18n("Auto hide"), modeFrame, Qt::ToolButtonTextBesideIcon, true);
+ d->autoHideTool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ modeLayout->addWidget(d->autoHideTool);
+ connect(d->autoHideTool, SIGNAL(toggled(bool)), this, SLOT(panelModeChanged(bool)));
+
+ d->underWindowsTool = d->addTool("view-fullscreen", i18n("Windows can cover"), modeFrame, Qt::ToolButtonTextBesideIcon, true);
+ d->underWindowsTool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ modeLayout->addWidget(d->underWindowsTool);
+ connect(d->underWindowsTool, SIGNAL(toggled(bool)), this, SLOT(panelModeChanged(bool)));
+
+
d->layout->addStretch();
+ d->moveTool = d->addTool("transform-move", i18n("Screen Edge"), this);
+ d->moveTool->installEventFilter(this);
+ d->moveTool->setCursor(Qt::SizeAllCursor);
+ d->layout->addWidget(d->moveTool);
+ d->sizeTool = d->addTool("transform-scale", i18n("Height"), this);
+ d->sizeTool->installEventFilter(this);
+ d->sizeTool->setCursor(Qt::SizeVerCursor);
+ d->layout->addWidget(d->sizeTool);
+ d->layout->addStretch();
+
//other buttons
d->layout->addSpacing(20);
+
+ //Settings popup menu
+ d->settingsTool = d->addTool("configure", i18n("More Settings"), this);
+ d->layout->addWidget(d->settingsTool);
+ connect(d->settingsTool, SIGNAL(pressed()), this, SLOT(settingsPopup()));
+ d->optionsDialog = new Plasma::Dialog(0); // don't pass in a parent; breaks with some lesser WMs
+ d->optionsDialog->installEventFilter(this);
+ KWindowSystem::setState(d->optionsDialog->winId(), NET::SkipTaskbar | NET::SkipPager | NET::Sticky);
+ d->optDialogLayout = new QVBoxLayout(d->optionsDialog);
+ d->optDialogLayout->setMargin(0);
+ d->optDialogLayout->addWidget(alignFrame);
+ d->optDialogLayout->addWidget(modeFrame);
+
+
ToolButton *closeControllerTool = d->addTool("window-close", i18n("Close this configuration window"), this, Qt::ToolButtonIconOnly, false);
d->layout->addWidget(closeControllerTool);
- connect(closeControllerTool, SIGNAL(clicked()), this, SLOT(hideController()));
+ connect(closeControllerTool, SIGNAL(clicked()), this, SLOT(hide()));
d->ruler = new PositioningRuler(this);
connect(d->ruler, SIGNAL(rulersMoved(int, int, int)), this, SLOT(rulersMoved(int, int, int)));
d->extLayout->addWidget(d->ruler);
+
+ connect(Plasma::Theme::defaultTheme(), SIGNAL(themeChanged()), SLOT(setPalette()));
+ setPalette();
}
PanelController::~PanelController()
@@ -382,6 +470,8 @@
//TODO: should we try and only call this when something has actually been
// altered that we care about?
PlasmaApp::self()->corona()->requestConfigSync();
+ delete d->optionsDialog;
+ d->optionsDialog = 0;
delete d;
}
@@ -396,7 +486,9 @@
QWidget *child;
while (!d->actionWidgets.isEmpty()) {
child = d->actionWidgets.first();
+ //try to remove from both layouts
d->layout->removeWidget(child);
+ d->optDialogLayout->removeWidget(child);
d->actionWidgets.removeFirst();
child->deleteLater();
}
@@ -408,7 +500,7 @@
ToolButton *addWidgetTool = d->addTool(action, this);
d->layout->insertWidget(insertIndex, addWidgetTool);
++insertIndex;
- connect(addWidgetTool, SIGNAL(clicked()), this, SLOT(hideController()));
+ connect(addWidgetTool, SIGNAL(clicked()), this, SLOT(hide()));
}
action = containment->action("lock widgets");
@@ -416,34 +508,18 @@
ToolButton *lockWidgetsTool = d->addTool(action, this);
d->layout->insertWidget(insertIndex, lockWidgetsTool);
++insertIndex;
- connect(lockWidgetsTool, SIGNAL(clicked()), this, SLOT(hideController()));
+ connect(lockWidgetsTool, SIGNAL(clicked()), this, SLOT(hide()));
}
action = containment->action("remove");
if (action) {
ToolButton *removePanelTool = d->addTool(action, this);
- d->layout->insertWidget(insertIndex, removePanelTool);
- ++insertIndex;
- connect(removePanelTool, SIGNAL(clicked()), this, SLOT(hideController()));
+ removePanelTool->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ d->optDialogLayout->insertWidget(insertIndex, removePanelTool);
+ connect(removePanelTool, SIGNAL(clicked()), this, SLOT(hide()));
}
- QRect screenGeom = QApplication::desktop()->screenGeometry(d->containment->screen());
-
- switch (d->location) {
- case Plasma::LeftEdge:
- case Plasma::RightEdge:
- d->ruler->setAvailableLength(screenGeom.height());
- d->ruler->setMaxLength(qMin((int)containment->maximumSize().height(), screenGeom.height()));
- d->ruler->setMinLength(containment->minimumSize().height());
- break;
- case Plasma::TopEdge:
- case Plasma::BottomEdge:
- default:
- d->ruler->setAvailableLength(screenGeom.width());
- d->ruler->setMaxLength(qMin((int)containment->maximumSize().width(), screenGeom.width()));
- d->ruler->setMinLength(containment->minimumSize().width());
- break;
- }
+ d->syncRuler();
}
QSize PanelController::sizeHint() const
@@ -508,8 +584,10 @@
d->extLayout->setDirection(QBoxLayout::RightToLeft);
}
d->extLayout->setContentsMargins(1, 0, 0, 0);
- d->panelHeightHandle->setCursor(Qt::SizeHorCursor);
- d->panelHeightHandle->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+ d->sizeTool->setCursor(Qt::SizeHorCursor);
+ d->sizeTool->setText(i18n("Width"));
+ d->leftAlignTool->setText(i18n("Top"));
+ d->rightAlignTool->setText(i18n("Bottom"));
d->ruler->setAvailableLength(screenGeom.height());
break;
@@ -521,8 +599,10 @@
d->extLayout->setDirection(QBoxLayout::LeftToRight);
}
d->extLayout->setContentsMargins(1, 0, 0, 0);
- d->panelHeightHandle->setCursor(Qt::SizeHorCursor);
- d->panelHeightHandle->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding);
+ d->sizeTool->setCursor(Qt::SizeHorCursor);
+ d->sizeTool->setText(i18n("Width"));
+ d->leftAlignTool->setText(i18n("Top"));
+ d->rightAlignTool->setText(i18n("Bottom"));
d->ruler->setAvailableLength(screenGeom.height());
break;
@@ -534,8 +614,10 @@
}
d->extLayout->setDirection(QBoxLayout::BottomToTop);
d->extLayout->setContentsMargins(0, 0, 0, 1);
- d->panelHeightHandle->setCursor(Qt::SizeVerCursor);
- d->panelHeightHandle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ d->sizeTool->setCursor(Qt::SizeVerCursor);
+ d->sizeTool->setText(i18n("Height"));
+ d->leftAlignTool->setText(i18n("Left"));
+ d->rightAlignTool->setText(i18n("Right"));
d->ruler->setAvailableLength(screenGeom.width());
break;
@@ -548,19 +630,18 @@
}
d->extLayout->setDirection(QBoxLayout::TopToBottom);
d->extLayout->setContentsMargins(0, 1, 0, 0);
- d->panelHeightHandle->setCursor(Qt::SizeVerCursor);
- d->panelHeightHandle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+ d->sizeTool->setCursor(Qt::SizeVerCursor);
+ d->sizeTool->setText(i18n("Height"));
+ d->leftAlignTool->setText(i18n("Left"));
+ d->rightAlignTool->setText(i18n("Right"));
d->ruler->setAvailableLength(screenGeom.width());
break;
}
- d->alignLayout->setDirection(d->layout->direction());
- if (d->alignLayout->parentWidget()) {
- d->alignLayout->parentWidget()->setMaximumSize(d->alignLayout->sizeHint());
- }
+ d->ruler->setMaximumSize(d->ruler->sizeHint());
- d->ruler->setMaximumSize(d->ruler->sizeHint());
+ d->syncRuler();
}
Plasma::Location PanelController::location() const
@@ -575,7 +656,7 @@
}
}
-int PanelController::offset()
+int PanelController::offset() const
{
return d->ruler->offset();
}
@@ -595,67 +676,143 @@
}
}
-int PanelController::alignment()
+Qt::Alignment PanelController::alignment() const
{
return d->ruler->alignment();
}
-void PanelController::hideController()
+void PanelController::setPanelMode(PanelView::PanelMode mode)
{
- hide();
+ switch (mode) {
+ case PanelView::AutoHide:
+ d->autoHideTool->setChecked(true);
+ break;
+ case PanelView::LetWindowsCover:
+ d->underWindowsTool->setChecked(true);
+ break;
+ case PanelView::NormalPanel:
+ default:
+ d->normalPanelTool->setChecked(true);
+ break;
+ }
}
+
+
+PanelView::PanelMode PanelController::panelMode() const
+{
+ if (d->underWindowsTool->isChecked()) {
+ return PanelView::LetWindowsCover;
+ } else if (d->autoHideTool->isChecked()) {
+ return PanelView::AutoHide;
+ } else {
+ return PanelView::NormalPanel;
+ }
+}
+
+void PanelController::setPalette()
+{
+ QColor color = Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor);
+ QPalette p = d->alignLabel->palette();
+ p.setColor(QPalette::Normal, QPalette::WindowText, color);
+ p.setColor(QPalette::Inactive, QPalette::WindowText, color);
+ d->alignLabel->setPalette(p);
+ d->modeLabel->setPalette(p);
+}
+
void PanelController::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setCompositionMode(QPainter::CompositionMode_Source );
- QColor backColor = Plasma::Theme::defaultTheme()->color(Plasma::Theme::BackgroundColor);
+ QColor backColor = Plasma::Theme::defaultTheme() ->color(Plasma::Theme::BackgroundColor);
backColor.setAlphaF(0.75);
painter.fillRect(event->rect(), backColor);
-}
-void PanelController::mousePressEvent(QMouseEvent *event)
-{
- if (d->panelHeightHandle->geometry().contains(event->pos()) ) {
- d->startDragPos = event->pos();
- d->dragging = Private::ResizeHandleElement;
- } else if (QRect(QPoint(0, 0), size()).contains(event->pos()) && !d->ruler->geometry().contains(event->pos()) ) {
- d->dragging = Private::PanelControllerElement;
- setCursor(Qt::SizeAllCursor);
+ QRect borderRect;
+ QString element;
+ switch (d->location) {
+ case Plasma::LeftEdge:
+ element = "west-right";
+ borderRect = QRect(QPoint(0,0), d->svg->elementSize(element));
+ borderRect.setHeight(height());
+ borderRect.moveRight(geometry().width());
+ break;
+ case Plasma::RightEdge:
+ element = "east-left";
+ borderRect = QRect(QPoint(0,0), d->svg->elementSize(element));
+ borderRect.setHeight(height());
+ break;
+ case Plasma::TopEdge:
+ element = "north-bottom";
+ borderRect = QRect(QPoint(0,0), d->svg->elementSize(element));
+ borderRect.setWidth(width());
+ borderRect.moveBottom(geometry().height());
+ break;
+ case Plasma::BottomEdge:
+ default:
+ element = "south-top";
+ borderRect = QRect(QPoint(0, 0), d->svg->elementSize(element));
+ borderRect.setWidth(width());
+ break;
}
- QWidget::mousePressEvent(event);
+ d->svg->paint(&painter, borderRect, element);
}
-void PanelController::mouseReleaseEvent(QMouseEvent *event)
+bool PanelController::eventFilter(QObject *watched, QEvent *event)
{
- Q_UNUSED(event)
+ if (watched == d->optionsDialog && event->type() == QEvent::WindowDeactivate) {
+ if (!d->settingsTool->underMouse()) {
+ d->optionsDialog->hide();
+ }
+ if (!isActiveWindow()) {
+ close();
+ }
+ return true;
+ } else if (watched == d->moveTool) {
+ if (event->type() == QEvent::MouseButtonPress) {
+ d->dragging = Private::MoveButtonElement;
+ } else if (event->type() == QEvent::MouseButtonRelease) {
+ d->dragging = Private::NoElement;
+ }
+ } else if (watched == d->sizeTool) {
+ if (event->type() == QEvent::MouseButtonPress) {
+ QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
+ d->startDragPos = mouseEvent->pos();
+ d->dragging = Private::ResizeButtonElement;
+ } else if (event->type() == QEvent::MouseButtonRelease) {
+ //FIXME: for now resizes here instead of on mouse move, for a serious performance problem, maybe in Qt
+ QRect screenGeom =
+ QApplication::desktop()->screenGeometry(d->containment->screen());
+ if (d->dragging == Private::ResizeButtonElement) {
+ switch (location()) {
+ case Plasma::LeftEdge:
+ d->resizePanelHeight(geometry().left() - screenGeom.left());
+ break;
+ case Plasma::RightEdge:
+ d->resizePanelHeight(screenGeom.right() - geometry().right());
+ break;
+ case Plasma::TopEdge:
+ d->resizePanelHeight(geometry().top() - screenGeom.top());
+ break;
+ case Plasma::BottomEdge:
+ default:
+ d->resizePanelHeight(screenGeom.bottom() - geometry().bottom());
+ break;
+ }
+ }
- //FIXME: for now resizes here instead of on mouse move, for a serious performance problem, maybe in Qt
- QRect screenGeom =
- QApplication::desktop()->screenGeometry(d->containment->screen());
- if (d->dragging == Private::ResizeHandleElement) {
- switch (location()) {
- case Plasma::LeftEdge:
- d->resizePanelHeight(geometry().left() - screenGeom.left());
- break;
- case Plasma::RightEdge:
- d->resizePanelHeight(screenGeom.right() - geometry().right());
- break;
- case Plasma::TopEdge:
- d->resizePanelHeight(geometry().top() - screenGeom.top());
- break;
- case Plasma::BottomEdge:
- default:
- d->resizePanelHeight(screenGeom.bottom() - geometry().bottom());
- break;
+ //resets properties saved during the drag
+ d->startDragPos = QPoint(0, 0);
+ d->dragging = Private::NoElement;
+ setCursor(Qt::ArrowCursor);
+ } else if (event->type() == QEvent::MouseMove) {
+ QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
+ mouseMoveEvent(mouseEvent);
}
}
- //resets properties saved during the drag
- d->startDragPos = QPoint(0, 0);
- d->dragging = Private::NoElement;
- setCursor(Qt::ArrowCursor);
+ return false;
}
void PanelController::mouseMoveEvent(QMouseEvent *event)
@@ -667,7 +824,7 @@
QDesktopWidget *desktop = QApplication::desktop();
QRect screenGeom = desktop->screenGeometry(d->containment->screen());
- if (d->dragging == Private::PanelControllerElement) {
+ if (d->dragging == Private::MoveButtonElement) {
//only move when the mouse cursor is out of the controller to avoid an endless reposition cycle
if (geometry().contains(event->globalPos())) {
return;
@@ -740,6 +897,7 @@
d->startDragPos.x() - d->minimumHeight >
screenGeom.left()) {
move(mapToGlobal(event->pos()).x() - d->startDragPos.x(), pos().y());
+ d->sizeTool->setText(i18n("Width: %1", screenGeom.left() + (mapToGlobal(event->pos()).x() - d->startDragPos.x())));
//FIXME: Panel resize deferred, should be here
}
break;
@@ -748,6 +906,7 @@
d->startDragPos.x() + width() + d->minimumHeight <
screenGeom.right()) {
move(mapToGlobal(event->pos()).x() - d->startDragPos.x(), pos().y());
+ d->sizeTool->setText(i18n("Width: %1", screenGeom.right() - (mapToGlobal(event->pos()).x() - d->startDragPos.x()) - width() + 1));
}
break;
case Plasma::TopEdge:
@@ -755,6 +914,7 @@
d->startDragPos.y() - d->minimumHeight >
screenGeom.top()) {
move(pos().x(), mapToGlobal(event->pos()).y() - d->startDragPos.y());
+ d->sizeTool->setText(i18n("Height: %1", screenGeom.top() + (mapToGlobal(event->pos()).y() - d->startDragPos.y())));
}
break;
case Plasma::BottomEdge:
@@ -763,6 +923,7 @@
d->startDragPos.y() + height() + d->minimumHeight <
screenGeom.bottom()) {
move(pos().x(), mapToGlobal(event->pos()).y() - d->startDragPos.y());
+ d->sizeTool->setText(i18n("Height: %1", screenGeom.bottom() - (mapToGlobal(event->pos()).y() - d->startDragPos.y()) - height() + 1));
}
break;
}
@@ -771,7 +932,10 @@
void PanelController::focusOutEvent(QFocusEvent * event)
{
Q_UNUSED(event)
- close();
+ if (!d->optionsDialog->isActiveWindow()) {
+ d->optionsDialog->hide();
+ close();
+ }
}
#include "panelcontroller.moc"
--- plasma/backgrounddialog.h
+++ plasma/backgrounddialog.h
@@ -0,0 +1,55 @@
+/*
+ Copyright (c) 2007 Paolo Capriotti <p.capriotti@gmail.com>
+ Copyright (c) 2008 by Petri Damsten <damu@iki.fi>
+
+ 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.
+*/
+
+#ifndef BACKGROUNDDIALOG_H
+#define BACKGROUNDDIALOG_H
+
+#include <KDialog>
+#include "ui_BackgroundDialog.h"
+
+namespace Plasma {
+ class Wallpaper;
+ class Containment;
+ class View;
+}
+class ThemeModel;
+class WallpaperPreview;
+class QStandardItemModel;
+
+class BackgroundDialog : public KDialog, public Ui::BackgroundDialog
+{
+ Q_OBJECT
+public:
+ BackgroundDialog(const QSize& res, Plasma::View* view, QWidget* parent = 0);
+ ~BackgroundDialog();
+
+ void reloadConfig();
+
+public slots:
+ void saveConfig();
+
+private:
+ KConfigGroup wallpaperConfig(const QString &plugin);
+
+private slots:
+ void getNewThemes();
+ void changeBackgroundMode(int mode);
+ void cleanup();
+
+private:
+ ThemeModel* m_themeModel;
+ QStandardItemModel* m_containmentModel;
+ Plasma::Wallpaper* m_wallpaper;
+ Plasma::View* m_view;
+ Plasma::Containment* m_containment;
+ WallpaperPreview* m_preview;
+};
+
+#endif // BACKGROUNDDIALOG_H
--- plasma/desktopview.cpp
+++ plasma/desktopview.cpp
@@ -35,10 +35,14 @@
#include "plasma/corona.h"
#include "plasma/containment.h"
#include "plasma/svg.h"
+#include "plasma/wallpaper.h"
+#include "plasma/theme.h"
#include "dashboardview.h"
#include "plasmaapp.h"
+#include "backgrounddialog.h"
+
#ifdef Q_WS_WIN
#include "windows.h"
#include "windef.h"
@@ -50,6 +54,7 @@
: Plasma::View(containment, id, parent),
m_zoomLevel(Plasma::DesktopZoom),
m_dashboard(0),
+ m_configDialog(0),
m_dashboardFollowsDesktop(true)
{
setFocusPolicy(Qt::NoFocus);
@@ -86,6 +91,7 @@
DesktopView::~DesktopView()
{
+ delete m_configDialog;
delete m_dashboard;
}
@@ -97,6 +103,7 @@
connect(containment, SIGNAL(showAddWidgetsInterface(QPointF)), this, SLOT(showAppletBrowser()));
connect(containment, SIGNAL(addSiblingContainment(Plasma::Containment *)), this, SLOT(addContainment(Plasma::Containment *)));
connect(containment, SIGNAL(focusRequested(Plasma::Containment *)), this, SLOT(setContainment(Plasma::Containment *)));
+ connect(containment, SIGNAL(configureRequested()), this, SLOT(configureContainment()));
}
}
@@ -113,7 +120,7 @@
int containmentId = cg.readEntry("DashboardContainment", 0);
if (containmentId > 0) {
foreach (Plasma::Containment *c, containment()->corona()->containments()) {
- if (c->id() == containmentId) {
+ if ((int)c->id() == containmentId) {
dc = c;
m_dashboardFollowsDesktop = false;
break;
@@ -162,7 +169,7 @@
setWindowFlags(windowFlags() & ~Qt::FramelessWindowHint);
KWindowSystem::setOnAllDesktops(winId(), false);
- KWindowSystem::setType(winId(), NET::Normal);
+ KWindowSystem::setType(winId(), NET::Normal);
}
}
@@ -222,6 +229,22 @@
}
}
+void DesktopView::configureContainment()
+{
+ if (m_configDialog == 0) {
+ const QSize resolution =
+ QApplication::desktop()->screenGeometry(screen()).size();
+ m_configDialog = new BackgroundDialog(resolution, this);
+ }
+ else {
+ m_configDialog->reloadConfig();
+ }
+
+ m_configDialog->show();
+ KWindowSystem::setOnDesktop(m_configDialog->winId(), KWindowSystem::currentDesktop());
+ KWindowSystem::activateWindow(m_configDialog->winId());
+}
+
void DesktopView::zoom(Plasma::Containment *containment, Plasma::ZoomDirection direction)
{
if (direction == Plasma::ZoomIn) {
--- plasma/panelappletoverlay.cpp
+++ plasma/panelappletoverlay.cpp
@@ -19,6 +19,7 @@
#include "panelappletoverlay.h"
+#include <QApplication>
#include <QGraphicsLinearLayout>
#include <QPainter>
#include <QTimer>
@@ -30,6 +31,7 @@
#include <plasma/containment.h>
#include <plasma/paintutils.h>
#include <plasma/theme.h>
+#include <plasma/view.h>
class AppletMoveSpacer : public QGraphicsWidget
{
@@ -141,6 +143,17 @@
return;
}
+ if (event->button() != Qt::LeftButton) {
+ kDebug() << "sending even to" << (QWidget*)parent();
+ Plasma::View *view = dynamic_cast<Plasma::View*>(parent());
+
+ if (view && view->containment()) {
+ view->containment()->showContextMenu(mapToParent(event->pos()), event->globalPos());
+ }
+
+ return;
+ }
+
m_clickDrag = false;
if (!m_spacer) {
m_spacer = new AppletMoveSpacer(m_applet);
@@ -167,6 +180,10 @@
{
Q_UNUSED(event)
+ if (!m_spacer) {
+ return;
+ }
+
QPoint p = mapToParent(event->pos());
QRect g = geometry();
@@ -199,6 +216,11 @@
{
Q_UNUSED(event)
+ releaseMouse();
+ if (!m_spacer) {
+ return;
+ }
+
if (!m_origin.isNull()) {
//kDebug() << m_clickDrag << m_origin << mapToParent(event->pos());
if (m_orientation == Qt::Horizontal) {
@@ -221,7 +243,6 @@
m_spacer = 0;
m_layout->insertItem(m_index, m_applet);
m_applet->setZValue(m_applet->zValue() - 1);
- releaseMouse();
}
void PanelAppletOverlay::enterEvent(QEvent *event)
--- plasma/panelcontroller.h
+++ plasma/panelcontroller.h
@@ -24,8 +24,10 @@
#include <plasma/plasma.h>
+#include "panelview.h"
+
namespace Plasma
{
class Containment;
@@ -35,6 +37,7 @@
{
Q_OBJECT
public:
+
PanelController(QWidget* parent = 0);
~PanelController();
@@ -48,18 +51,20 @@
Plasma::Location location() const;
void setOffset(int newOffset);
- int offset();
+ int offset() const;
void setAlignment(const Qt::Alignment &newAlignment);
- int alignment();
+ Qt::Alignment alignment() const;
+ void setPanelMode(PanelView::PanelMode);
+ PanelView::PanelMode panelMode() const;
+
public Q_SLOTS:
- void hideController();
+ void setPalette();
protected:
void paintEvent(QPaintEvent *event);
- void mousePressEvent(QMouseEvent *event);
- void mouseReleaseEvent(QMouseEvent *event);
+ bool eventFilter(QObject *watched, QEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void focusOutEvent(QFocusEvent * event);
@@ -70,10 +75,13 @@
void offsetChanged(int offset);
void alignmentChanged(Qt::Alignment);
void locationChanged(Plasma::Location);
+ void panelModeChanged(PanelView::PanelMode mode);
private:
Q_PRIVATE_SLOT(d, void rulersMoved(int offset, int minLength, int minLength))
Q_PRIVATE_SLOT(d, void alignToggled(bool toggle))
+ Q_PRIVATE_SLOT(d, void panelModeChanged(bool toggle))
+ Q_PRIVATE_SLOT(d, void settingsPopup())
class ButtonGroup;
class ResizeHandle;
--- plasma/desktopview.h
+++ plasma/desktopview.h
@@ -29,6 +29,7 @@
} // namespace Plasma
class DashboardView;
+class BackgroundDialog;
class DesktopView : public Plasma::View
{
@@ -52,7 +53,7 @@
*/
void setIsDesktop(bool isDesktop);
- /**
+ /**
* Returns true if this widget is currently a desktop window.
* See setAsDesktop()
*/
@@ -96,6 +97,13 @@
*/
void setContainment(Plasma::Containment *containment);
+ /**
+ * Configure containment.
+ *
+ * @arg containment to configure
+ */
+ void configureContainment();
+
protected:
void wheelEvent(QWheelEvent *event);
void drawBackground(QPainter *painter, const QRectF &rect);
@@ -103,6 +111,7 @@
private:
Plasma::ZoomLevel m_zoomLevel;
DashboardView *m_dashboard;
+ BackgroundDialog *m_configDialog;
bool m_dashboardFollowsDesktop;
};
--- plasma/desktopcorona.cpp
+++ plasma/desktopcorona.cpp
@@ -23,11 +23,13 @@
#include <QDesktopWidget>
#include <QDir>
#include <QGraphicsLayout>
+#include <QFile>
#include <KDebug>
#include <KDialog>
#include <KGlobalSettings>
#include <KStandardDirs>
+#include <KMessageBox>
#include <plasma/containment.h>
#include <plasma/dataenginemanager.h>
@@ -52,7 +54,9 @@
for (int i = 0; i < numScreens; ++i) {
if (!containmentForScreen(i)) {
//TODO: should we look for containments that aren't asigned but already exist?
- Plasma::Containment* c = addContainment("desktop");
+ KSharedConfigPtr defaultconfig = KSharedConfig::openConfig("plasmarc");
+ KConfigGroup group = KConfigGroup(defaultconfig, "Defaults");
+ Plasma::Containment* c = addContainment(group.readEntry("containment", "desktop"));
c->setScreen(i);
c->setFormFactor(Plasma::Planar);
c->flushPendingConstraintsEvents();
@@ -113,6 +117,7 @@
c->init();
c->setScreen(i);
+ c->setWallpaper("image", "SingleImage");
c->setFormFactor(Plasma::Planar);
c->updateConstraints(Plasma::StartupCompletedConstraint);
c->flushPendingConstraintsEvents();
@@ -150,17 +155,57 @@
panel->updateConstraints(Plasma::StartupCompletedConstraint);
panel->flushPendingConstraintsEvents();
+ loadDefaultApplets(panel);
+
+ emit containmentAdded(panel);
+ requestConfigSync();
+}
+
+bool DesktopCorona::loadDefaultApplets(Plasma::Containment* panel, bool askType)
+{
+ if (askType) {
+ int answer = KMessageBox::questionYesNoCancel(0, i18n("Do you want a panel with the default widgets or an empty panel?"), i18n("Add Panel"), KGuiItem(i18n("Default Panel")), KGuiItem(i18n("Empty Panel")));
+ if (answer==KMessageBox::Cancel) {
+ return false;
+ } else if (answer==KMessageBox::No) {
+ return true;
+ }
+ }
+
+ // used to force a save into the config file
+ KConfigGroup invalidConfig;
+
// some default applets to get a usable UI
Plasma::Applet *applet = loadDefaultApplet("launcher", panel);
if (applet) {
applet->setGlobalShortcut(KShortcut("Alt+F1"));
}
+ if (QFile::exists("/usr/share/kde4/services/plasma-applet-showdashboard.desktop"))
+ panel->addApplet("showdashboard");
+
+ QVariantList args;
+ if (QFile::exists("/usr/share/applications/kde4/dolphin.desktop")) {
+ args << "/usr/share/applications/kde4/dolphin.desktop";
+ QRectF rect;
+ panel->addApplet("icon", args, rect);
+ }
+
+ args.clear();
+ if (QFile::exists("/usr/share/applications/kde4/konqbrowser.desktop")) {
+ args << "/usr/share/applications/kde4/konqbrowser.desktop";
+ QRectF rect;
+ panel->addApplet("icon", args, rect);
+ }
+
loadDefaultApplet("notifier", panel);
loadDefaultApplet("pager", panel);
loadDefaultApplet("tasks", panel);
loadDefaultApplet("systemtray", panel);
+ if (QFile::exists("/usr/share/kde4/services/plasma-applet-networkmanagement.desktop"))
+ panel->addApplet("networkmanagement");
+
Plasma::DataEngineManager *engines = Plasma::DataEngineManager::self();
Plasma::DataEngine *power = engines->loadEngine("powermanagement");
if (power) {
@@ -173,6 +218,8 @@
loadDefaultApplet("digital-clock", panel);
+ panel->addApplet("lockout");
+
foreach (Plasma::Applet* applet, panel->applets()) {
applet->init();
applet->flushPendingConstraintsEvents();
@@ -180,17 +227,9 @@
}
panel->save(invalidConfig);
- emit containmentAdded(panel);
+ return true;
+}
- requestConfigSync();
- /*
- foreach (Plasma::Containment *c, containments()) {
- kDebug() << "letting the world know about" << (QObject*)c;
- emit containmentAdded(c);
- }
- */
-}
-
Plasma::Applet *DesktopCorona::loadDefaultApplet(const QString &pluginName, Plasma::Containment *c)
{
QVariantList args;
--- plasma/positioningruler.cpp
+++ plasma/positioningruler.cpp
@@ -70,10 +70,9 @@
}
if (alignment == Qt::AlignCenter) {
- const int newTop = offsetSliderRect.center().y() + (offsetSliderRect.center().y() - newPos.y());
- if (newTop < 0 || newTop > availableLength) {
- return false;
- }
+ int newTop = offsetSliderRect.center().y() + (offsetSliderRect.center().y() - newPos.y());
+ newTop = qBound(0, newTop, availableLength);
+
symmetricSliderRect.moveCenter(QPoint(symmetricSliderRect.center().x(), newTop));
}
sliderRect.moveCenter(QPoint(sliderRect.center().x(), newPos.y()));
@@ -83,10 +82,9 @@
}
if (alignment == Qt::AlignCenter) {
- const int newLeft = offsetSliderRect.center().x() + (offsetSliderRect.center().x() - newPos.x());
- if (newLeft < 0 || newLeft > availableLength) {
- return false;
- }
+ int newLeft = offsetSliderRect.center().x() + (offsetSliderRect.center().x() - newPos.x());
+ newLeft = qBound(0, newLeft, availableLength);
+
symmetricSliderRect.moveCenter(QPoint(newLeft, symmetricSliderRect.center().y()));
}
sliderRect.moveCenter(QPoint(newPos.x(), sliderRect.center().y()));
@@ -135,11 +133,11 @@
break;
}
- leftMaxSliderRect.setSize(sliderGraphics->elementSize(elementPrefix + "maxslider"));
- rightMaxSliderRect.setSize(leftMaxSliderRect.size());
- leftMinSliderRect.setSize(sliderGraphics->elementSize(elementPrefix + "minslider"));
- rightMinSliderRect.setSize(leftMinSliderRect.size());
- offsetSliderRect.setSize(sliderGraphics->elementSize(elementPrefix + "offsetslider"));
+ leftMaxSliderRect.setSize(sliderGraphics->elementSize(elementPrefix + "left-limit-slider"));
+ leftMinSliderRect.setSize(sliderGraphics->elementSize(elementPrefix + "right-limit-slider"));
+ rightMaxSliderRect.setSize(leftMinSliderRect.size());
+ rightMinSliderRect.setSize(leftMaxSliderRect.size());
+ offsetSliderRect.setSize(sliderGraphics->elementSize(elementPrefix + "offset-slider"));
}
void setupSliders(const QSize &totalSize)
@@ -164,67 +162,67 @@
//Here substracting one to everything because QRect.moveCenter(pos) moves the rect with
//the width/2 th pixel at pos.x (and so for y) resulting in the painted image moved
//one pixel to the right
- rightMaxPos = offset + maxLength - 1;
+ rightMaxPos = offset + maxLength;
leftMaxPos = 0;
- rightMinPos = offset + minLength - 1;
+ rightMinPos = offset + minLength;
leftMinPos = 0;
- offsetPos = offset - 1;
+ offsetPos = offset;
break;
case Qt::AlignRight:
- leftMaxPos = totalLength - offset - maxLength - 1;
+ leftMaxPos = totalLength - offset - maxLength;
rightMaxPos = 0;
- leftMinPos = totalLength - offset - minLength - 1;
+ leftMinPos = totalLength - offset - minLength;
rightMinPos = 0;
- offsetPos = totalLength - offset - 1;
+ offsetPos = totalLength - offset;
break;
case Qt::AlignCenter:
default:
- leftMaxPos = totalLength/2 + offset - maxLength/2 - 1;
- rightMaxPos = totalLength/2 + offset + maxLength/2 - 1;
+ leftMaxPos = totalLength/2 + offset - maxLength/2;
+ rightMaxPos = totalLength/2 + offset + maxLength/2;
- leftMinPos = totalLength/2 + offset - minLength/2 - 1;
- rightMinPos = totalLength/2 + offset + minLength/2 - 1;
+ leftMinPos = totalLength/2 + offset - minLength/2;
+ rightMinPos = totalLength/2 + offset + minLength/2;
- offsetPos = totalLength/2 + offset - 1;
+ offsetPos = totalLength/2 + offset;
break;
}
-
+
switch (location) {
case Plasma::LeftEdge:
leftMaxSliderRect.moveCenter(QPoint(3*(totalSize.width()/4), leftMaxPos));
rightMaxSliderRect.moveCenter(QPoint(3*(totalSize.width()/4), rightMaxPos));
-
+
leftMinSliderRect.moveCenter(QPoint(totalSize.width()/4, leftMinPos));
rightMinSliderRect.moveCenter(QPoint(totalSize.width()/4, rightMinPos));
-
+
offsetSliderRect.moveCenter(QPoint(3*(totalSize.width()/4), offsetPos));
break;
case Plasma::RightEdge:
leftMaxSliderRect.moveCenter(QPoint(totalSize.width()/4, leftMaxPos));
rightMaxSliderRect.moveCenter(QPoint(totalSize.width()/4, rightMaxPos));
-
+
leftMinSliderRect.moveCenter(QPoint(3*(totalSize.width()/4), leftMinPos));
rightMinSliderRect.moveCenter(QPoint(3*(totalSize.width()/4), rightMinPos));
-
+
offsetSliderRect.moveCenter(QPoint(totalSize.width()/4, offsetPos));
break;
case Plasma::TopEdge:
leftMaxSliderRect.moveCenter(QPoint(leftMaxPos, 3*(totalSize.height()/4)));
rightMaxSliderRect.moveCenter(QPoint(rightMaxPos, 3*(totalSize.height()/4)));
-
+
leftMinSliderRect.moveCenter(QPoint(leftMinPos, totalSize.height()/4));
rightMinSliderRect.moveCenter(QPoint(rightMinPos, totalSize.height()/4));
-
+
offsetSliderRect.moveCenter(QPoint(offsetPos, 3*(totalSize.height()/4)));
break;
case Plasma::BottomEdge:
default:
leftMaxSliderRect.moveCenter(QPoint(leftMaxPos, totalSize.height()/4));
rightMaxSliderRect.moveCenter(QPoint(rightMaxPos, totalSize.height()/4));
-
+
leftMinSliderRect.moveCenter(QPoint(leftMinPos, 3*(totalSize.height()/4)));
rightMinSliderRect.moveCenter(QPoint(rightMinPos, 3*(totalSize.height()/4)));
-
+
offsetSliderRect.moveCenter(QPoint(offsetPos, totalSize.height()/4));
break;
}
@@ -480,8 +478,11 @@
//Draw center indicators
if (d->alignment == Qt::AlignCenter && (d->location == Plasma::LeftEdge || d->location == Plasma::RightEdge)) {
d->sliderGraphics->paint(&painter, QPoint(event->rect().left(), event->rect().center().y()), "vertical-centerindicator");
+ //this because rect.moveCenter will cause a rect moved one pixel off respect where we need it
+ painter.translate(0, -1);
} else if (d->alignment == Qt::AlignCenter) {
d->sliderGraphics->paint(&painter, QPoint(event->rect().center().x(), event->rect().top()), "horizontal-centerindicator");
+ painter.translate(-1, 0);
}
//Draw handles
@@ -504,16 +505,16 @@
}
if (d->alignment != Qt::AlignLeft) {
- d->sliderGraphics->paint(&painter, d->leftMaxSliderRect, elementPrefix + "maxslider");
- d->sliderGraphics->paint(&painter, d->leftMinSliderRect, elementPrefix + "minslider");
+ d->sliderGraphics->paint(&painter, d->leftMaxSliderRect, elementPrefix + "left-limit-slider");
+ d->sliderGraphics->paint(&painter, d->leftMinSliderRect, elementPrefix + "right-limit-slider");
}
if (d->alignment != Qt::AlignRight) {
- d->sliderGraphics->paint(&painter, d->rightMaxSliderRect, elementPrefix + "maxslider");
- d->sliderGraphics->paint(&painter, d->rightMinSliderRect, elementPrefix + "minslider");
+ d->sliderGraphics->paint(&painter, d->rightMaxSliderRect, elementPrefix + "right-limit-slider");
+ d->sliderGraphics->paint(&painter, d->rightMinSliderRect, elementPrefix + "left-limit-slider");
}
- d->sliderGraphics->paint(&painter, d->offsetSliderRect, elementPrefix + "offsetslider");
+ d->sliderGraphics->paint(&painter, d->offsetSliderRect, elementPrefix + "offset-slider");
}
void PositioningRuler::wheelEvent(QWheelEvent *event)
@@ -633,7 +634,7 @@
newPos.setY(d->availableLength);
}
}
-
+
switch (d->dragging) {
case Private::LeftMaxSlider:
//don't let the slider "cross" with the offset slider
--- plasma/plasmaapp.cpp
+++ plasma/plasmaapp.cpp
@@ -17,12 +17,16 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
-// plasma.loadEngine("hardware")
-// LineGraph graph
-// plasma.connect(graph, "hardware", "cpu");
-
#include "plasmaapp.h"
+#ifdef Q_WS_WIN
+#ifdef _WIN32_WINNT
+#undef _WIN32_WINNT
+#endif
+#define _WIN32_WINNT 0x0500
+#include <windows.h>
+#endif
+
#include <unistd.h>
#ifndef _SC_PHYS_PAGES
@@ -127,7 +131,8 @@
: KUniqueApplication(),
#endif
m_corona(0),
- m_appletBrowser(0)
+ m_appletBrowser(0),
+ m_panelHidden(0)
{
KGlobal::locale()->insertCatalog("libplasma");
@@ -197,7 +202,13 @@
memorySize /= 1024;
#endif
#ifdef Q_WS_WIN
- size_t memorySize = 2000000000; //FIXME: get the right memorysize instead of hardcoding it
+ size_t memorySize;
+
+ MEMORYSTATUSEX statex;
+ statex.dwLength = sizeof (statex);
+ GlobalMemoryStatusEx (&statex);
+
+ memorySize = (statex.ullTotalPhys/1024) + (statex.ullTotalPageFile/1024);
#endif
// If you have no suitable sysconf() interface and are not FreeBSD,
// then you are out of luck and get a compile error.
@@ -297,13 +308,46 @@
view->toggleDashboard();
}
+void PlasmaApp::panelHidden(bool hidden)
+{
+ if (hidden) {
+ ++m_panelHidden;
+ //kDebug() << "panel hidden" << m_panelHidden;
+ } else {
+ --m_panelHidden;
+ if (m_panelHidden < 0) {
+ kDebug() << "panelHidden(false) called too many times!";
+ m_panelHidden = 0;
+ }
+ //kDebug() << "panel unhidden" << m_panelHidden;
+ }
+}
+
+#ifdef Q_WS_X11
+bool PlasmaApp::x11EventFilter(XEvent *event)
+{
+ if (m_panelHidden && event->type == EnterNotify) {
+ //kDebug();
+ foreach (PanelView *panel, m_panels) {
+ //kDebug() << panel->unhideTrigger() << event->xcrossing.window;
+ if (panel->unhideTrigger() == event->xcrossing.window) {
+ panel->unhide();
+ return true;
+ }
+ }
+ }
+
+ return KUniqueApplication::x11EventFilter(event);
+}
+#endif
+
void PlasmaApp::setIsDesktop(bool isDesktop)
{
m_isDesktop = isDesktop;
foreach (DesktopView *view, m_desktops) {
view->setIsDesktop(isDesktop);
}
-
+
if (isDesktop) {
connect(QApplication::desktop(), SIGNAL(resized(int)), SLOT(adjustSize(int)));
} else {
@@ -318,7 +362,6 @@
void PlasmaApp::adjustSize(int screen)
{
- kDebug() << "adjust size for screen" << screen;
QDesktopWidget *desktop = QApplication::desktop();
bool screenExists = screen < desktop->numScreens();
@@ -329,6 +372,8 @@
DesktopView *view = viewForScreen(screen);
+ kDebug() << "adjust size for screen" << screen << screenGeom << view;
+
if (view) {
if (screenExists) {
kDebug() << "here we go ... adjusting size";
@@ -346,15 +391,14 @@
// perhaps we should make one.
}
- foreach (PanelView *panel, m_panels) {
- if (panel->screen() == screen) {
- if (screenExists) {
+ //TODO: should we remove panels when the screen
+ // disappears? this would mean having some
+ // way of alerting that we have a new screen
+ // that appears
+ if (screenExists) {
+ foreach (PanelView *panel, m_panels) {
+ if (panel->screen() == screen) {
panel->pinchContainment(screenGeom);
- } else {
- //TODO: should we remove panels when the screen
- // disappears? this would mean having some
- // way of alerting that we have a new screen
- // that appears
}
}
}
--- plasma/desktopcorona.h
+++ plasma/desktopcorona.h
@@ -49,6 +49,11 @@
*/
void checkScreens();
+ /**
+ * SUSE-specific extension
+ **/
+ bool loadDefaultApplets(Plasma::Containment* panel, bool askType=false);
+
protected Q_SLOTS:
void screenResized(int);
--- plasma/plasmaapp.h
+++ plasma/plasmaapp.h
@@ -75,11 +75,26 @@
*/
void createDesktopView(Plasma::Containment *containment, int id = 0);
+ /**
+ * Should be called when a panel hides or unhides itself
+ */
+ void panelHidden(bool hidden);
+
public Q_SLOTS:
// DBUS interface. if you change these methods, you MUST run:
// qdbuscpp2xml plasmaapp.h -o org.kde.plasma.App.xml
void toggleDashboard();
+protected:
+#ifdef Q_WS_X11
+ bool x11EventFilter(XEvent *event);
+#endif
+
+private:
+ PlasmaApp(Display* display, Qt::HANDLE visual, Qt::HANDLE colormap);
+ static void crashHandler(int signal);
+ DesktopView* viewForScreen(int screen) const;
+
private Q_SLOTS:
void setCrashHandler();
void cleanup();
@@ -90,14 +105,11 @@
void adjustSize(int screen);
private:
- PlasmaApp(Display* display, Qt::HANDLE visual, Qt::HANDLE colormap);
- static void crashHandler(int signal);
- DesktopView* viewForScreen(int screen) const;
-
Plasma::Corona *m_corona;
QList<PanelView*> m_panels;
Plasma::AppletBrowser *m_appletBrowser;
QList<DesktopView*> m_desktops;
+ int m_panelHidden;
bool m_isDesktop;
};
--- plasma/main.cpp
+++ plasma/main.cpp
@@ -27,7 +27,7 @@
#include "plasmaapp.h"
static const char description[] = I18N_NOOP( "The KDE desktop, panels and widgets workspace application." );
-static const char version[] = "0.1";
+static const char version[] = "0.1-SUSE";
extern "C"
#ifdef Q_WS_WIN
--- plasma/wallpaperpreview.cpp
+++ plasma/wallpaperpreview.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2008 Petri Damsten <damu@iki.fi>
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "wallpaperpreview.h"
+#include <QPainter>
+#include <QPaintEvent>
+#include <plasma/wallpaper.h>
+#include <plasma/svg.h>
+
+WallpaperPreview::WallpaperPreview(QWidget *parent) : QWidget(parent), m_wallpaper(0)
+{
+ m_wallpaperOverlay = new Plasma::Svg(this);
+ m_wallpaperOverlay->setImagePath("widgets/monitor");
+ m_wallpaperOverlay->setContainsMultipleImages(true);
+}
+
+WallpaperPreview::~WallpaperPreview()
+{
+}
+
+void WallpaperPreview::setWallpaper(Plasma::Wallpaper* wallpaper)
+{
+ m_wallpaper = wallpaper;
+ if (m_wallpaper) {
+ connect(m_wallpaper, SIGNAL(update(const QRectF &)),
+ this, SLOT(updateRect(const QRectF &)));
+ resizeEvent(0);
+ }
+}
+
+void WallpaperPreview::resizeEvent(QResizeEvent* event)
+{
+ Q_UNUSED(event)
+ if (m_wallpaper) {
+ m_wallpaper->setBoundingRect(contentsRect());
+ }
+}
+
+void WallpaperPreview::updateRect(const QRectF& rect)
+{
+ update(rect.toRect());
+}
+
+void WallpaperPreview::paintEvent(QPaintEvent* event)
+{
+ QPainter painter(this);
+ if (m_wallpaper) {
+ m_wallpaper->paint(&painter, event->rect());
+ m_wallpaperOverlay->paint(&painter, QRect(QPoint(0,0), size()), "glass");
+ }
+}
+
+#include "wallpaperpreview.moc"
--- plasma/BackgroundDialog.ui
+++ plasma/BackgroundDialog.ui
@@ -0,0 +1,266 @@
+<ui version="4.0" >
+ <class>BackgroundDialog</class>
+ <widget class="QWidget" name="BackgroundDialog" >
+ <property name="geometry" >
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>478</width>
+ <height>290</height>
+ </rect>
+ </property>
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="baseSize" >
+ <size>
+ <width>200</width>
+ <height>700</height>
+ </size>
+ </property>
+ <layout class="QGridLayout" name="gridLayout" >
+ <item row="0" column="0" colspan="4" >
+ <widget class="QLabel" name="label_5" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Desktop Activity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" >
+ <widget class="QLabel" name="label_4" >
+ <property name="text" >
+ <string>Type:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_containmentComboBox</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2" >
+ <layout class="QHBoxLayout" name="horizontalLayout_3" >
+ <item>
+ <widget class="QComboBox" name="m_containmentComboBox" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType" >
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item rowspan="6" row="1" column="3" >
+ <layout class="QVBoxLayout" name="verticalLayout_2" >
+ <item>
+ <widget class="QLabel" name="m_monitor" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Preferred" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text" >
+ <string>Monitor</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" colspan="3" >
+ <widget class="QLabel" name="label_2" >
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Desktop Theme</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" >
+ <widget class="QLabel" name="label_3" >
+ <property name="minimumSize" >
+ <size>
+ <width>129</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>Theme:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_theme</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" >
+ <widget class="QComboBox" name="m_theme" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2" >
+ <widget class="QPushButton" name="m_newThemeButton" >
+ <property name="enabled" >
+ <bool>true</bool>
+ </property>
+ <property name="text" >
+ <string>New Theme...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="3" >
+ <widget class="QLabel" name="m_wallpaperLabel" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Preferred" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font" >
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text" >
+ <string>Wallpaper</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="3" >
+ <widget class="QWidget" native="1" name="m_wallpaperGroup" >
+ <layout class="QVBoxLayout" name="verticalLayout" >
+ <property name="leftMargin" >
+ <number>0</number>
+ </property>
+ <property name="topMargin" >
+ <number>0</number>
+ </property>
+ <property name="rightMargin" >
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout" >
+ <item>
+ <widget class="QLabel" name="m_wallpaperTypeLabel" >
+ <property name="minimumSize" >
+ <size>
+ <width>129</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text" >
+ <string>Type:</string>
+ </property>
+ <property name="alignment" >
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ <property name="buddy" >
+ <cstring>m_wallpaperMode</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="m_wallpaperMode" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Fixed" hsizetype="Expanding" >
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize" >
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QWidget" native="1" name="m_wallpaperConfig" >
+ <property name="sizePolicy" >
+ <sizepolicy vsizetype="Expanding" hsizetype="Expanding" >
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="6" column="1" >
+ <spacer name="verticalSpacer" >
+ <property name="orientation" >
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0" >
+ <size>
+ <width>20</width>
+ <height>64</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
--- plasma/panelview.cpp
+++ plasma/panelview.cpp
@@ -22,7 +22,11 @@
#include <QApplication>
#include <QDesktopWidget>
#include <QGraphicsLinearLayout>
+#include <QTimeLine>
#include <QTimer>
+#ifdef Q_WS_X11
+#include <QX11Info>
+#endif
#include <KWindowSystem>
#include <KDebug>
@@ -40,15 +44,21 @@
PanelView::PanelView(Plasma::Containment *panel, int id, QWidget *parent)
: Plasma::View(panel, id, parent),
m_panelController(0),
+ m_timeLine(0),
+#ifdef Q_WS_X11
+ m_unhideTrigger(None),
+#endif
+ m_panelMode(NormalPanel),
m_lastHorizontal(true),
- m_editting(false)
+ m_editting(false),
+ m_firstPaint(true)
{
Q_ASSERT(qobject_cast<Plasma::Corona*>(panel->scene()));
-
KConfigGroup viewConfig = config();
m_offset = viewConfig.readEntry("Offset", 0);
m_alignment = alignmentFilter((Qt::Alignment)viewConfig.readEntry("Alignment", (int)Qt::AlignLeft));
+ setPanelMode((PanelMode)viewConfig.readEntry("panelMode", (int)m_panelMode));
// pinchContainment calls updatePanelGeometry for us
@@ -63,13 +73,14 @@
if (panel) {
connect(panel, SIGNAL(showAddWidgetsInterface(QPointF)), this, SLOT(showAppletBrowser()));
- connect(panel, SIGNAL(destroyed(QObject*)), this, SLOT(deleteLater()));
+ connect(panel, SIGNAL(destroyed(QObject*)), this, SLOT(panelDeleted()));
connect(panel, SIGNAL(toolBoxToggled()), this, SLOT(togglePanelController()));
+
+ kDebug() << "Panel geometry is" << panel->geometry();
}
+
connect(this, SIGNAL(sceneRectAboutToChange()), this, SLOT(updatePanelGeometry()));
- kDebug() << "Panel geometry is" << panel->geometry();
-
// Graphics view setup
setFrameStyle(QFrame::NoFrame);
//setAutoFillBackground(true);
@@ -80,20 +91,25 @@
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ QPalette pal = palette();
+ pal.setBrush(backgroundRole(), Qt::transparent);
+ setPalette(pal);
+
// KWin setup
- KWindowSystem::setType(winId(), NET::Dock);
- KWindowSystem::setState(winId(), NET::Sticky);
KWindowSystem::setOnAllDesktops(winId(), true);
-
+
#ifdef Q_WS_WIN
registerAccessBar(winId(), true);
-#endif
+#endif
updateStruts();
}
PanelView::~PanelView()
{
+#ifdef Q_WS_WIN
+ registerAccessBar(winId(), false);
+#endif
}
void PanelView::setLocation(Plasma::Location location)
@@ -165,6 +181,52 @@
return containment()->location();
}
+void PanelView::checkForActivation()
+{
+ //kDebug() << "stacking order changed!" << KWindowSystem::self()->stackingOrder().last() << winId();
+ if (KWindowSystem::self()->stackingOrder().last() == winId()) {
+ destroyUnhideTrigger();
+ } else {
+ createUnhideTrigger();
+ }
+}
+
+void PanelView::setPanelMode(PanelView::PanelMode mode)
+{
+ unsigned long state = NET::Sticky;
+
+ disconnect(KWindowSystem::self(), SIGNAL(stackingOrderChanged()),
+ this, SLOT(checkForActivation()));
+
+ KWindowSystem::setType(winId(), NET::Dock);
+ if (mode == LetWindowsCover) {
+ createUnhideTrigger();
+ connect(KWindowSystem::self(), SIGNAL(stackingOrderChanged()),
+ this, SLOT(checkForActivation()));
+ KWindowSystem::clearState(winId(), NET::StaysOnTop | NET::KeepAbove);
+ state |= NET::KeepBelow;
+ } else {
+ //kDebug() << "panel shouldn't let windows cover it!";
+ state |= NET::StaysOnTop;
+ }
+
+ if (mode == NormalPanel) {
+ // we need to kill the input window if it exists!
+ destroyUnhideTrigger();
+ }
+
+ //kDebug() << "panel state set to" << state << NET::Sticky;
+ KWindowSystem::setState(winId(), state);
+
+ m_panelMode = mode;
+ config().writeEntry("panelMode", (int)mode);
+}
+
+PanelView::PanelMode PanelView::panelMode() const
+{
+ return m_panelMode;
+}
+
Plasma::Corona *PanelView::corona() const
{
return qobject_cast<Plasma::Corona*>(scene());
@@ -262,7 +324,7 @@
} else if (m_alignment == Qt::AlignRight) {
geom.moveTopRight(QPoint(screenGeom.right() - m_offset, screenGeom.top()));
} else if (m_alignment == Qt::AlignCenter) {
- geom.moveCenter(QPoint(screenGeom.center().x() + m_offset, screenGeom.top() + geom.height()/2 - 1));
+ geom.moveTopLeft(QPoint(screenGeom.center().x() - geom.width()/2 + 1 - geom.width()%2 + m_offset, screenGeom.top()));
}
//enable borders if needed
@@ -275,7 +337,7 @@
} else if (m_alignment == Qt::AlignRight) {
geom.moveBottomLeft(QPoint(screenGeom.left(), screenGeom.bottom() - m_offset));
} else if (m_alignment == Qt::AlignCenter) {
- geom.moveCenter(QPoint(screenGeom.left()+size.width()/2 - 1, screenGeom.center().y() + m_offset -1));
+ geom.moveTopLeft(QPoint(screenGeom.left(), screenGeom.center().y() - geom.height()/2 + 1 - geom.height()%2 + m_offset));
}
//enable borders if needed
@@ -284,11 +346,11 @@
case Plasma::RightEdge:
if (m_alignment == Qt::AlignLeft) {
- geom.moveTopLeft(QPoint(screenGeom.right() - size.width() + 1, m_offset));
+ geom.moveTopRight(QPoint(screenGeom.right(), m_offset));
} else if (m_alignment == Qt::AlignRight) {
- geom.moveBottomLeft(QPoint(screenGeom.right() - size.width() + 1, screenGeom.bottom() - m_offset));
+ geom.moveBottomRight(QPoint(screenGeom.right(), screenGeom.bottom() - m_offset));
} else if (m_alignment == Qt::AlignCenter) {
- geom.moveCenter(QPoint(screenGeom.right() - size.width()/2, screenGeom.center().y() + m_offset));
+ geom.moveTopRight(QPoint(screenGeom.right(), screenGeom.center().y() - geom.height()/2 + 1 - geom.height()%2 + m_offset));
}
//enable borders if needed
@@ -298,11 +360,11 @@
case Plasma::BottomEdge:
default:
if (m_alignment == Qt::AlignLeft) {
- geom.moveTopLeft(QPoint(m_offset, screenGeom.bottom() - size.height() + 1));
+ geom.moveBottomLeft(QPoint(m_offset, screenGeom.bottom()));
} else if (m_alignment == Qt::AlignRight) {
- geom.moveTopRight(QPoint(screenGeom.right() - m_offset, screenGeom.bottom() - size.height() + 1));
+ geom.moveBottomRight(QPoint(screenGeom.right() - m_offset, screenGeom.bottom()));
} else if (m_alignment == Qt::AlignCenter) {
- geom.moveCenter(QPoint(screenGeom.center().x() + m_offset, screenGeom.bottom() - size.height()/2));
+ geom.moveBottomLeft(QPoint(screenGeom.center().x() - geom.width()/2 + 1 - geom.width()%2 + m_offset, screenGeom.bottom()));
}
//enable borders if needed
@@ -456,7 +518,6 @@
if (m_panelController) {
m_panelController->setContainment(c);
-
m_panelController->setOffset(m_offset);
}
}
@@ -512,11 +573,13 @@
m_panelController->setLocation(containment()->location());
m_panelController->setAlignment(m_alignment);
m_panelController->setOffset(m_offset);
+ m_panelController->setPanelMode(m_panelMode);
connect(m_panelController, SIGNAL(destroyed(QObject*)), this, SLOT(edittingComplete()));
connect(m_panelController, SIGNAL(offsetChanged(int)), this, SLOT(setOffset(int)));
connect(m_panelController, SIGNAL(alignmentChanged(Qt::Alignment)), this, SLOT(setAlignment(Qt::Alignment)));
connect(m_panelController, SIGNAL(locationChanged(Plasma::Location)), this, SLOT(setLocation(Plasma::Location)));
+ connect(m_panelController, SIGNAL(panelModeChanged(PanelView::PanelMode)), this, SLOT(setPanelMode(PanelView::PanelMode)));
if (dynamic_cast<QGraphicsLinearLayout*>(containment()->layout())) {
// we only support mouse over drags for panels with linear layouts
@@ -549,6 +612,7 @@
m_panelController->show();
} else {
m_panelController->close();
+ updateStruts();
}
}
@@ -560,6 +624,12 @@
qDeleteAll(m_moveOverlays);
m_moveOverlays.clear();
containment()->closeToolBox();
+ updateStruts();
+ m_firstPaint = true; // triggers autohide
+
+ // not overly efficient since we may not have changed any settings,
+ // but ensures that if we have, a config sync will occur
+ PlasmaApp::self()->corona()->requestConfigSync();
}
Qt::Alignment PanelView::alignmentFilter(Qt::Alignment align) const
@@ -576,47 +646,49 @@
{
NETExtendedStrut strut;
- QRect thisScreen = QApplication::desktop()->screenGeometry(containment()->screen());
- QRect wholeScreen = QApplication::desktop()->geometry();
+ if (m_panelMode == NormalPanel) {
+ QRect thisScreen = QApplication::desktop()->screenGeometry(containment()->screen());
+ QRect wholeScreen = QApplication::desktop()->geometry();
- // extended struts are to the combined screen geoms, not the single screen
- int leftOffset = wholeScreen.x() - thisScreen.x();
- int rightOffset = wholeScreen.right() - thisScreen.right();
- int bottomOffset = wholeScreen.bottom() - thisScreen.bottom();
- int topOffset = wholeScreen.top() - thisScreen.top();
- kDebug() << "screen l/r/b/t offsets are:" << leftOffset << rightOffset << bottomOffset << topOffset;
+ // extended struts are to the combined screen geoms, not the single screen
+ int leftOffset = wholeScreen.x() - thisScreen.x();
+ int rightOffset = wholeScreen.right() - thisScreen.right();
+ int bottomOffset = wholeScreen.bottom() - thisScreen.bottom();
+ int topOffset = wholeScreen.top() - thisScreen.top();
+ kDebug() << "screen l/r/b/t offsets are:" << leftOffset << rightOffset << bottomOffset << topOffset;
- switch (location())
- {
- case Plasma::TopEdge:
- strut.top_width = height() + topOffset;
- strut.top_start = x();
- strut.top_end = x() + width() - 1;
- break;
+ switch (location())
+ {
+ case Plasma::TopEdge:
+ strut.top_width = height() + topOffset;
+ strut.top_start = x();
+ strut.top_end = x() + width() - 1;
+ break;
- case Plasma::BottomEdge:
- strut.bottom_width = height() + bottomOffset;
- strut.bottom_start = x();
- strut.bottom_end = x() + width() - 1;
- //kDebug() << "setting bottom edge to" << strut.bottom_width
- // << strut.bottom_start << strut.bottom_end;
- break;
+ case Plasma::BottomEdge:
+ strut.bottom_width = height() + bottomOffset;
+ strut.bottom_start = x();
+ strut.bottom_end = x() + width() - 1;
+ //kDebug() << "setting bottom edge to" << strut.bottom_width
+ // << strut.bottom_start << strut.bottom_end;
+ break;
- case Plasma::RightEdge:
- strut.right_width = width() + rightOffset;
- strut.right_start = y();
- strut.right_end = y() + height() - 1;
- break;
+ case Plasma::RightEdge:
+ strut.right_width = width() + rightOffset;
+ strut.right_start = y();
+ strut.right_end = y() + height() - 1;
+ break;
- case Plasma::LeftEdge:
- strut.left_width = width() + leftOffset;
- strut.left_start = y();
- strut.left_end = y() + height() - 1;
- break;
+ case Plasma::LeftEdge:
+ strut.left_width = width() + leftOffset;
+ strut.left_start = y();
+ strut.left_end = y() + height() - 1;
+ break;
- default:
- //kDebug() << "where are we?";
+ default:
+ //kDebug() << "where are we?";
break;
+ }
}
KWindowSystem::setExtendedStrut(winId(), strut.left_width,
@@ -635,15 +707,256 @@
void PanelView::moveEvent(QMoveEvent *event)
{
+ //kDebug();
QWidget::moveEvent(event);
updateStruts();
}
void PanelView::resizeEvent(QResizeEvent *event)
{
+ //kDebug();
QWidget::resizeEvent(event);
updateStruts();
}
+QTimeLine *PanelView::timeLine()
+{
+ if (!m_timeLine) {
+ m_timeLine = new QTimeLine(200, this);
+ m_timeLine->setCurveShape(QTimeLine::EaseOutCurve);
+ m_timeLine->setUpdateInterval(10);
+ connect(m_timeLine, SIGNAL(valueChanged(qreal)), this, SLOT(animateHide(qreal)));
+ }
+
+ return m_timeLine;
+}
+
+void PanelView::unhide()
+{
+ //kDebug();
+ destroyUnhideTrigger();
+
+ QTimeLine * tl = timeLine();
+ tl->setDirection(QTimeLine::Backward);
+ // with composite, we can quite do some nice animations with transparent
+ // backgrounds; without it we can't so we just show/hide
+ if (PlasmaApp::hasComposite()) {
+ if (tl->state() == QTimeLine::NotRunning) {
+ tl->start();
+ }
+ }
+
+ show();
+ KWindowSystem::setOnAllDesktops(winId(), true);
+ unsigned long state = NET::Sticky;
+ KWindowSystem::setState(winId(), state);
+ if (m_panelMode == LetWindowsCover) {
+ KWindowSystem::raiseWindow(winId());
+ KWindowSystem::activateWindow(winId());
+ }
+}
+
+void PanelView::leaveEvent(QEvent *event)
+{
+ if (m_panelMode == AutoHide && !m_editting) {
+ // try not to hide if we have an associated popup or window about
+ bool havePopup = QApplication::activePopupWidget() != 0;
+
+ if (!havePopup) {
+ QWidget *popup = QApplication::activeWindow();
+
+ if (popup) {
+ kDebug() << "got a popup!" << popup
+ << popup->window() << popup->window()->parentWidget() << popup->parentWidget() << this;
+
+
+ if (popup->window()->parentWidget() == this ||
+ popup->parentWidget() == this ||
+ (popup->parentWidget() && popup->parentWidget()->window() == this)) {
+ havePopup = true;
+ }
+ } /* else {
+ kDebug() << "no popup?!";
+ } */
+ } else {
+ kDebug() << "gota a popup widget";
+ }
+
+ if (!havePopup) {
+ QTimeLine * tl = timeLine();
+ tl->setDirection(QTimeLine::Forward);
+
+ // with composite, we can quite do some nice animations with transparent
+ // backgrounds; without it we can't so we just show/hide
+ if (PlasmaApp::hasComposite()) {
+ if (tl->state() == QTimeLine::NotRunning) {
+ tl->start();
+ }
+ } else {
+ animateHide(1.0);
+ }
+ }
+ }
+
+ Plasma::View::leaveEvent(event);
+}
+
+void PanelView::drawBackground(QPainter *painter, const QRectF &rect)
+{
+ if (PlasmaApp::hasComposite()) {
+ painter->setCompositionMode(QPainter::CompositionMode_Source);
+ painter->fillRect(rect.toAlignedRect(), Qt::transparent);
+ } else {
+ Plasma::View::drawBackground(painter, rect);
+ }
+}
+
+void PanelView::paintEvent(QPaintEvent *event)
+{
+ Plasma::View::paintEvent(event);
+ if (m_firstPaint) {
+ // set up our auothide system after we paint it visibly to the user
+ if (m_panelMode == AutoHide) {
+ QTimeLine * tl = timeLine();
+ tl->setDirection(QTimeLine::Forward);
+ tl->start();
+ }
+
+ m_firstPaint = false;
+ }
+}
+
+bool PanelView::event(QEvent *event)
+{
+ if (event->type() == QEvent::Paint) {
+ QPainter p(this);
+ p.setCompositionMode(QPainter::CompositionMode_Source);
+ p.fillRect(rect(), Qt::transparent);
+ }
+ return Plasma::View::event(event);
+}
+
+void PanelView::animateHide(qreal progress)
+{
+ int margin = 0;
+ Plasma::Location loc = location();
+
+ if (loc == Plasma::TopEdge || loc == Plasma::BottomEdge) {
+ margin = progress * height();
+ } else {
+ margin = progress * width();
+ }
+
+ int xtrans = 0;
+ int ytrans = 0;
+
+ switch (loc) {
+ case Plasma::TopEdge:
+ ytrans = -margin;
+ break;
+ case Plasma::BottomEdge:
+ ytrans = margin;
+ break;
+ case Plasma::RightEdge:
+ xtrans = margin;
+ break;
+ case Plasma::LeftEdge:
+ xtrans = -margin;
+ break;
+ default:
+ // no hiding unless we're on an edge.
+ return;
+ break;
+ }
+
+ //kDebug() << progress << xtrans << ytrans;
+ if (PlasmaApp::hasComposite()) {
+ viewport()->move(xtrans, ytrans);
+ }
+
+ QTimeLine *tl = timeLine();
+ if (qFuzzyCompare(qreal(1.0), progress) && tl->direction() == QTimeLine::Forward) {
+ //kDebug() << "**************** hide complete" << triggerPoint << triggerWidth << triggerHeight;
+ createUnhideTrigger();
+ hide();
+ }/* else if (qFuzzyCompare(qreal(0.0), progress) && tl->direction() == QTimeLine::Backward) {
+ kDebug() << "show complete";
+ }*/
+}
+
+void PanelView::createUnhideTrigger()
+{
+#ifdef Q_WS_X11
+ if (m_unhideTrigger != None) {
+ return;
+ }
+
+ int triggerWidth = 1;
+ int triggerHeight = 1;
+ QPoint triggerPoint = pos();
+
+ switch (location()) {
+ case Plasma::TopEdge:
+ triggerWidth = width();
+ break;
+ case Plasma::BottomEdge:
+ triggerWidth = width();
+ triggerPoint = geometry().bottomLeft();
+ break;
+ case Plasma::RightEdge:
+ triggerHeight = height();
+ triggerPoint = geometry().topRight();
+ break;
+ case Plasma::LeftEdge:
+ triggerHeight = height();
+ break;
+ default:
+ // no hiding unless we're on an edge.
+ return;
+ break;
+ }
+
+ XSetWindowAttributes attributes;
+ attributes.override_redirect = True;
+ attributes.event_mask = EnterWindowMask;
+ unsigned long valuemask = CWOverrideRedirect | CWEventMask;
+ m_unhideTrigger = XCreateWindow(QX11Info::display(), QX11Info::appRootWindow(),
+ triggerPoint.x(), triggerPoint.y(), triggerWidth, triggerHeight,
+ 0, CopyFromParent, InputOnly, CopyFromParent,
+ valuemask, &attributes);
+ XMapWindow(QX11Info::display(), m_unhideTrigger);
+// KWindowSystem::setState(m_unhideTrigger, NET::StaysOnTop);
+
+#endif
+ //kDebug() << m_unhideTrigger;
+ PlasmaApp::self()->panelHidden(true);
+}
+
+void PanelView::destroyUnhideTrigger()
+{
+#ifdef Q_WS_X11
+ if (m_unhideTrigger == None) {
+ return;
+ }
+
+ XDestroyWindow(QX11Info::display(), m_unhideTrigger);
+ m_unhideTrigger = None;
+#endif
+
+ //kDebug();
+ PlasmaApp::self()->panelHidden(false);
+}
+
+void PanelView::panelDeleted()
+{
+ if (!QApplication::closingDown()) {
+ // the panel was removed at runtime; clean up our configuration object as well
+ KConfigGroup c = config();
+ c.deleteGroup();
+ }
+
+ deleteLater();
+}
+
#include "panelview.moc"
--- plasma/CMakeLists.txt
+++ plasma/CMakeLists.txt
@@ -3,6 +3,7 @@
add_subdirectory(configupdates)
set(plasma_SRCS
+ backgrounddialog.cpp
dashboardview.cpp
desktopcorona.cpp
desktopview.cpp
@@ -13,8 +14,11 @@
plasmaapp.cpp
positioningruler.cpp
toolbutton.cpp
+ wallpaperpreview.cpp
)
+kde4_add_ui_files(plasma_SRCS BackgroundDialog.ui)
+
if(WIN32)
set( plasma_SRCS ${plasma_SRCS} panelview_win.cpp )
endif(WIN32)
@@ -30,7 +34,7 @@
if(WIN32)
target_link_libraries(kdeinit_plasma_qgv plasma ${KDE4_KIO_LIBS})
else(WIN32)
-target_link_libraries(kdeinit_plasma_qgv plasma kworkspace ${KDE4_KIO_LIBS} ${X11_LIBRARIES})
+target_link_libraries(kdeinit_plasma_qgv plasma kworkspace ${KDE4_KNEWSTUFF2_LIBS} ${KDE4_KIO_LIBS} ${X11_LIBRARIES})
endif(WIN32)
if(X11_Xrender_FOUND)
target_link_libraries(kdeinit_plasma_qgv ${X11_Xrender_LIB})
@@ -40,4 +44,6 @@
install(TARGETS kdeinit_plasma_qgv DESTINATION ${LIB_INSTALL_DIR})
install(TARGETS plasma_qgv ${INSTALL_TARGETS_DEFAULT_ARGS})
-install( FILES plasma.desktop DESTINATION ${AUTOSTART_INSTALL_DIR} )
+install(FILES plasma.desktop DESTINATION ${AUTOSTART_INSTALL_DIR})
+
+install(FILES plasma-themes.knsrc DESTINATION ${CONFIG_INSTALL_DIR})
--- scriptengines/qscript/plasma-scriptengine-qscript.desktop
+++ scriptengines/qscript/plasma-scriptengine-qscript.desktop
@@ -36,8 +36,8 @@
Name[pt_BR]=Widget JavaScript
Name[ro]=Miniaplicație JavaScript
Name[sl]=Gradnik v JavaScriptu
-Name[sr]=виџет јаваскрипта
-Name[sr@latin]=vidžet JavaScripta
+Name[sr]=јаваскриптни виџет
+Name[sr@latin]=javascript vidžet
Name[sv]=Grafisk Javascript-komponent
Name[th]=วิดเจ็ตจาวาสคริปต์
Name[tr]=JavaScript Programcığı
--- scriptengines/qscript/plasma-scriptengine-qscriptrunner.desktop
+++ scriptengines/qscript/plasma-scriptengine-qscriptrunner.desktop
@@ -29,15 +29,15 @@
Name[nb]=JavaScript-kjører
Name[nds]=JavaScript-Dreger
Name[nl]=JavaScript-runner
-Name[nn]=JavaScript-køyrer
+Name[nn]=JavaScript-køyrar
Name[pa]=ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਰਨਰ
Name[pl]=Silnik JavaScript
Name[pt]=Execução de JavaScript
Name[pt_BR]=Mecanismo JavaScript
Name[ro]=Executor JavaScript
Name[sl]=Zaganjalnik javascripta
-Name[sr]=извођач јаваскрипта
-Name[sr@latin]=izvođač JavaScripta
+Name[sr]=јаваскриптни извођач
+Name[sr@latin]=javascript izvođač
Name[sv]=Kör Javascript
Name[tg]=Иҷрогари JavaScript
Name[th]=ตัวประมวลผลจาวาสคริปต์
@@ -76,15 +76,15 @@
Comment[nb]=JavaScript-kjører
Comment[nds]=JavaScript-Dreger
Comment[nl]=JavaScript-runner
-Comment[nn]=JavaScript-køyrer
+Comment[nn]=JavaScript-køyrar
Comment[pa]=ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਰਨਰ
Comment[pl]=Silnik JavaScript
Comment[pt]=Execução de JavaScript
Comment[pt_BR]=Mecanismo JavaScript
Comment[ro]=Executor JavaScript
Comment[sl]=Zaganjalnik javascripta
-Comment[sr]=Извођач јаваскрипта
-Comment[sr@latin]=Izvođač JavaScripta
+Comment[sr]=Јаваскриптни извођач
+Comment[sr@latin]=Javascript izvođač
Comment[sv]=Kör Javascript
Comment[tg]=Иҷрогари JavaScript
Comment[th]=ตัวประมวลผลจาวาสคริปต์
--- scriptengines/webkit/plasma-packagestructure-dashboard.desktop
+++ scriptengines/webkit/plasma-packagestructure-dashboard.desktop
@@ -78,8 +78,8 @@
Comment[pt_BR]=Widget do painel do MacOS
Comment[ru]=Виджет приборной доски MacOS Dashboard
Comment[sl]=Gradnik za Mac OS Dashboard
-Comment[sr]=Инструмент-табла као у МекОС‑у
-Comment[sr@latin]=Instrument-tabla kao u MacOS‑u
+Comment[sr]=Виџет инструмент-табле као у МекОС‑у
+Comment[sr@latin]=Vidžet instrument-table kao u MacOS‑u
Comment[sv]=Grafisk komponent för MacOS instrumentpanel
Comment[th]=วิดเจ็ตของแดชบอร์ด MacOS
Comment[tr]=MacOS kontrol paneli programcığı
--- scriptengines/webkit/plasma-scriptengine-applet-web.desktop
+++ scriptengines/webkit/plasma-scriptengine-applet-web.desktop
@@ -36,7 +36,7 @@
Name[ru]=Веб-элемент
Name[sl]=Spletni gradnik
Name[sr]=веб виџет
-Name[sr@latin]=web vidžet
+Name[sr@latin]=veb vidžet
Name[sv]=Webbkomponent
Name[th]=วิดเจ็ตแบบเว็บ
Name[tr]=Web Programcığı
@@ -79,8 +79,8 @@
Comment[pt_BR]=Widget de página Web usando HTML e JavaScript
Comment[ru]=Модуль, использующий HTML и JavaScript
Comment[sl]=Spletni gradnik, ki uporablja HTML in JavaScript
-Comment[sr]=Виџет веб стране са ХТМЛ‑ом и јаваскриптом
-Comment[sr@latin]=Vidžet veb strane sa HTML‑om i JavaScriptom
+Comment[sr]=Виџет веб странице са ХТМЛ‑ом и јаваскриптом
+Comment[sr@latin]=Vidžet veb stranice sa HTML‑om i JavaScriptom
Comment[sv]=Grafisk webbkomponent som använder HTML och Javascript
Comment[th]=วิดเจ็ตหน้าเว็บที่ถูกเขียนด้วย HTML และจาวาสคริปต์
Comment[tr]=HTML ve JavaScript kullanan Web sayfası programcığı