diff --git a/CMakeLists.txt b/CMakeLists.txt index 946307e9e..8cf2c132d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,6 +5,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}) set(plasma_LIB_SRCS abstractrunner.cpp applet.cpp + corona.cpp dataengine.cpp dataenginemanager.cpp datasource.cpp @@ -38,6 +39,7 @@ install(TARGETS plasma DESTINATION ${LIB_INSTALL_DIR} ) install( FILES abstractrunner.h applet.h + corona.h dataengine.h dataenginemanager.h datasource.h diff --git a/corona.cpp b/corona.cpp new file mode 100644 index 000000000..c96968b22 --- /dev/null +++ b/corona.cpp @@ -0,0 +1,297 @@ +/* + * Copyright (C) 2007 Matt Broadstone + * Copyright (C) 2007 Aaron Seigo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "corona.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "applet.h" +#include "dataengine.h" +#include "widgets/vboxlayout.h" + +#ifdef ICON_DEMO +#include "widgets/icon.h" +#endif + +#include "corona.h" + +using namespace Plasma; +extern "C" { + typedef QGraphicsItem* (*loadKaramba)(const KUrl &theme, QGraphicsView *view); +} + +namespace Plasma +{ + +class Corona::Private +{ +public: + Private() + : formFactor(Planar), + location(Floating), + layout(0), + engineExplorerAction(0) + { + } + + Applet::List applets; + FormFactor formFactor; + Location location; + Layout* layout; + QAction *engineExplorerAction; +}; + +Corona::Corona(QObject * parent) + : QGraphicsScene(parent), + d(new Private) +{ + init(); +} + +Corona::Corona(const QRectF & sceneRect, QObject * parent ) + : QGraphicsScene(sceneRect, parent), + d(new Private) +{ + init(); +} + +Corona::Corona(qreal x, qreal y, qreal width, qreal height, QObject * parent) + : QGraphicsScene(x, y, width, height, parent), + d(new Private) +{ + init(); +} + +void Corona::init() +{ +/* setBackgroundMode(Qt::NoBackground);*/ + +/* QPalette pal = palette(); + pal.setBrush(QPalette::Base, Qt::transparent); + setPalette(pal);*/ + //setViewport(new QGLWidget ( QGLFormat(QGL::StencilBuffer | QGL::AlphaChannel) )); + +#ifdef ICON_DEMO + Icon* icon = new Icon(); + icon->setIcon("plasmagik"); + icon->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + addItem(icon); + + icon = new Icon(); + icon->setIcon("user-home"); + icon->setSize(64, 64); + icon->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + addItem(icon); +#endif + /* + KPluginInfo::List applets = Applet::knownApplets(); + kDebug() << "======= Applets =========" << endl; + foreach (KPluginInfo* info, applets) { + kDebug() << info->pluginName() << ": " << info->name() << endl; + } + kDebug() << "=========================" << endl; + */ + + // Loading SuperKaramba themes example + /* + QString karambaLib = QFile::encodeName(KLibLoader::self()->findLibrary(QLatin1String("libsuperkaramba"))); + KLibLoader* loader = KLibLoader::self(); + KLibrary* lib = loader->library(karambaLib); + + if (lib) { + loadKaramba startKaramba = 0; + startKaramba = (loadKaramba)lib->resolveFunction("startKaramba"); + if (startKaramba) { + startKaramba(KUrl("~/themes/aero_aio.skz"), this); + } + + lib->unload(); + } + */ + +// connect(this, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(displayContextMenu(QPoint))); + d->engineExplorerAction = new QAction(i18n("Engine Explorer"), this); + connect(d->engineExplorerAction, SIGNAL(triggered(bool)), this, SLOT(launchExplorer(bool))); +// setContextMenuPolicy(Qt::CustomContextMenu); +} + +Corona::~Corona() +{ + while (!d->applets.isEmpty()) { + delete d->applets.takeFirst(); + } +} + +Location Corona::location() const +{ + return d->location; +} + +void Corona::setLocation(Location location) +{ + d->location = location; +} + +FormFactor Corona::formFactor() const +{ + return d->formFactor; +} + +void Corona::setFormFactor(FormFactor formFactor) +{ + if (d->formFactor == formFactor) { + return; + } + + d->formFactor = formFactor; + delete d->layout; + d->layout = 0; + + switch (d->formFactor) { + case Planar: + break; + case Horizontal: + //d->layout = new HBoxLayout; + break; + case Vertical: + d->layout = new VBoxLayout; + break; + case MediaCenter: + break; + default: + kDebug() << "This can't be happening!" << endl; + break; + } + + foreach (Applet* applet, d->applets) { + applet->constraintsUpdated(); + } +} + + +void Corona::addPlasmoid(const QString& name) +{ + Applet* applet = Applet::loadApplet(name); + if (applet) { + addItem(applet); + d->applets << applet; + } else { + kDebug() << "Plasmoid " << name << " could not be loaded." << endl; + } +} + +void Corona::dragEnterEvent( QGraphicsSceneDragDropEvent *event) +{ + kDebug() << "Corona::dragEnterEvent(QGraphicsSceneDragDropEvent* event)" << endl; + if (event->mimeData()->hasFormat("text/x-plasmoidservicename")) { + event->acceptProposedAction(); + //TODO Create the applet, move to mouse position then send the + // following event to lock it to the mouse + //QMouseEvent event(QEvent::MouseButtonPress, event->pos(), Qt::LeftButton, event->mouseButtons(), 0); + //QApplication::sendEvent(this, &event); + } + //TODO Allow dragging an applet from another Corona into this one while + // keeping its settings etc. +} + +void Corona::dragLeaveEvent(QGraphicsSceneDragDropEvent *event) +{ + Q_UNUSED(event); + kDebug() << "Corona::dragLeaveEvent(QGraphicsSceneDragDropEvent* event)" << endl; + //TODO If an established Applet is dragged out of the Corona, remove it and + // create a QDrag type thing to keep the Applet's settings +} + +void Corona::dragMoveEvent(QGraphicsSceneDragDropEvent *event) +{ + Q_UNUSED(event); + kDebug() << "Corona::dragMoveEvent(QDragMoveEvent* event)" << endl; +} + +void Corona::dropEvent(QGraphicsSceneDragDropEvent *event) +{ + kDebug() << "Corona::dropEvent(QDropEvent* event)" << endl; + if (event->mimeData()->hasFormat("text/x-plasmoidservicename")) { + //TODO This will pretty much move into dragEnterEvent() + QString plasmoidName; + plasmoidName = event->mimeData()->data("text/x-plasmoidservicename"); + addPlasmoid(plasmoidName); + d->applets.last()->setPos(event->pos()); + + event->acceptProposedAction(); + } +} + +void Corona::contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent) +{ + QPointF point = contextMenuEvent->scenePos(); + /* + * example for displaying the SuperKaramba context menu + QGraphicsItem *item = itemAt(point); + if(item) { + QObject *object = dynamic_cast(item->parentItem()); + if(object && object->objectName().startsWith("karamba")) { + QContextMenuEvent event(QContextMenuEvent::Mouse, point); + contextMenuEvent(&event); + return; + } + } + */ + + Applet* applet = qgraphicsitem_cast(itemAt(point)); + KMenu desktopMenu; + if(!applet) { + desktopMenu.setTitle("Corona"); + desktopMenu.addAction("The"); + desktopMenu.addAction("desktop"); + desktopMenu.addAction("menu"); + desktopMenu.addAction(d->engineExplorerAction); + } else { + //desktopMenu.setTitle( applet->name() ); //This isn't implemented in Applet yet... + desktopMenu.addAction("Widget"); + desktopMenu.addAction("settings"); + desktopMenu.addAction("like"); + desktopMenu.addAction("opacity"); + desktopMenu.addSeparator(); + QAction* configureApplet = new QAction(i18n("Configure Applet..."), this); + connect(configureApplet, SIGNAL(triggered(bool)), + applet, SLOT(configureDialog())); //This isn't implemented in Applet yet... + desktopMenu.addAction(configureApplet); + } + desktopMenu.exec(point.toPoint()); + contextMenuEvent->accept(); +} + +void Corona::launchExplorer(bool /*param*/) +{ + QProcess::execute("plasmaengineexplorer"); +} + +} // namespace Plasma + +#include "corona.moc" + diff --git a/corona.h b/corona.h new file mode 100644 index 000000000..e504ab33c --- /dev/null +++ b/corona.h @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2007 Matt Broadstone + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License version 2 as + * published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef CORONA_H +#define CORONA_H + +#include + +#include "applet.h" +#include "plasma.h" +#include "plasma_export.h" + +namespace Plasma +{ + +class Layout; +class Svg; + +/** + * @short A QGraphicsScene for Plasma::Applets + */ +class PLASMA_EXPORT Corona : public QGraphicsScene +{ + Q_OBJECT + +//typedef QHash > layouts; + +public: + explicit Corona(QObject * parent = 0); + explicit Corona(const QRectF & sceneRect, QObject * parent = 0); + explicit Corona(qreal x, qreal y, qreal width, qreal height, QObject * parent = 0); + ~Corona(); + + /** + * The location of the Corona. @see Plasma::Location + */ + Plasma::Location location() const; + + /** + * Informs the Corona as to what position it is in. This is informational + * only, as the Corona doesn't change it's actual location. This is, + * however, passed on to Applets that may be managed by this Corona. + * + * @param location the new location of this Corona + */ + void setLocation(Location location); + + /** + * The current form factor for this Corona. @see Plasma::FormFactor + **/ + Plasma::FormFactor formFactor() const; + + /** + * Sets the form factor for this Corona. This may cause changes in both + * the arrangement of Applets as well as the display choices of individual + * Applets. + */ + void setFormFactor(FormFactor formFactor); + +public Q_SLOTS: + void addPlasmoid(const QString& name); + +protected: + void dragEnterEvent(QGraphicsSceneDragDropEvent* event); + void dragLeaveEvent(QGraphicsSceneDragDropEvent* event); + void dragMoveEvent(QGraphicsSceneDragDropEvent* event); + void dropEvent(QGraphicsSceneDragDropEvent* event); + void contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent); + +protected Q_SLOTS: + void launchExplorer(bool /*param*/); + +private: + void init(); + + class Private; + Private * const d; +}; + +} // namespace Plasma + +#endif + +