actually show the containment's qml

This commit is contained in:
Marco Martin 2013-02-04 19:47:35 +01:00
parent 624817e9f3
commit 7912da6072
11 changed files with 174 additions and 78 deletions

View File

@ -203,6 +203,20 @@ uint Applet::id() const
return d->appletId; return d->appletId;
} }
QObject *Applet::graphicObject() const
{
return d->graphicObject;
}
void Applet::setGraphicObject(QObject *obj)
{
if (d->graphicObject == obj) {
return;
}
d->graphicObject = obj;
emit graphicObjectChanged();
}
void Applet::save(KConfigGroup &g) const void Applet::save(KConfigGroup &g) const
{ {
if (d->transient) { if (d->transient) {

View File

@ -94,6 +94,13 @@ class PLASMA_EXPORT Applet : public QObject
*/ */
uint id() const; uint id() const;
/**
* @since: 5.0
* A pointer to the graphical representation of this applet
*/
QObject *graphicObject() const;
void setGraphicObject(QObject *obj);
/** /**
* Returns the KConfigGroup to access the applets configuration. * Returns the KConfigGroup to access the applets configuration.
* *
@ -569,6 +576,11 @@ class PLASMA_EXPORT Applet : public QObject
bool hasValidAssociatedApplication() const; bool hasValidAssociatedApplication() const;
Q_SIGNALS: Q_SIGNALS:
/**
* emitted when/if the graphic representation of the applet changes
*/
void graphicObjectChanged();
/** /**
* This signal indicates that an application launch, window * This signal indicates that an application launch, window
* creation or window focus event was triggered. This is used, for instance, * creation or window focus event was triggered. This is used, for instance,

View File

@ -71,6 +71,7 @@ AppletPrivate::AppletPrivate(KService::Ptr service, const KPluginInfo *info, int
itemStatus(UnknownStatus), itemStatus(UnknownStatus),
preferredSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored), preferredSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored),
modificationsTimer(0), modificationsTimer(0),
graphicObject(0),
hasConfigurationInterface(false), hasConfigurationInterface(false),
failed(false), failed(false),
isContainment(false), isContainment(false),

View File

@ -173,6 +173,9 @@ public:
QBasicTimer constraintsTimer; QBasicTimer constraintsTimer;
QBasicTimer *modificationsTimer; QBasicTimer *modificationsTimer;
// Everything graphics related that remains in Applet
QObject *graphicObject;
// a great green field of booleans :) // a great green field of booleans :)
bool hasConfigurationInterface : 1; bool hasConfigurationInterface : 1;
bool failed : 1; bool failed : 1;

View File

@ -104,8 +104,6 @@ bool DeclarativeAppletScript::init()
Plasma::Applet *a = applet(); Plasma::Applet *a = applet();
Plasma::Containment *cont = qobject_cast<Plasma::Containment *>(a); Plasma::Containment *cont = qobject_cast<Plasma::Containment *>(a);
//TODO: assign the graphical root object
if (cont) { if (cont) {
m_interface = new ContainmentInterface(this); m_interface = new ContainmentInterface(this);
//fail? so it's a normal Applet //fail? so it's a normal Applet
@ -125,6 +123,8 @@ void DeclarativeAppletScript::qmlCreationFinished()
{ {
//If it's a popupapplet and the root object has a "compactRepresentation" component, use that instead of the icon //If it's a popupapplet and the root object has a "compactRepresentation" component, use that instead of the icon
Plasma::Applet *a = applet(); Plasma::Applet *a = applet();
a->setGraphicObject(m_qmlObject->rootObject());
//TODO: access rootItem from m_interface //TODO: access rootItem from m_interface
//m_self->setProperty("rootItem", QVariant::fromValue(m_qmlObject->rootObject())); //m_self->setProperty("rootItem", QVariant::fromValue(m_qmlObject->rootObject()));

View File

@ -37,6 +37,8 @@ DesktopCorona::DesktopCorona(QObject *parent)
connect(m_desktopWidget, SIGNAL(workAreaResized(int)), connect(m_desktopWidget, SIGNAL(workAreaResized(int)),
this, SLOT(workAreaResized(int))); this, SLOT(workAreaResized(int)));
connect(this, SIGNAL(screenOwnerChanged(int, int, Plasma::Containment *)),
this, SLOT(updateScreenOwner(int, int, Plasma::Containment *)));
checkViews(); checkViews();
} }
@ -49,8 +51,11 @@ DesktopCorona::~DesktopCorona()
void DesktopCorona::loadDefaultLayout() void DesktopCorona::loadDefaultLayout()
{ {
Plasma::Containment *cont = addContainment("org.kde.testcontainment"); Plasma::Containment *cont = addContainment("org.kde.testcontainment");
Plasma::Applet *appl = cont->addApplet("foo"); cont->setScreen(0);
qDebug() << "Containment:" << cont->name() << "Applet:" << appl->name() << appl; qDebug() << containmentForScreen(0);
//Plasma::Applet *appl = cont->addApplet("foo");
qDebug() << "Containment:" << cont << cont->name();
//qDebug() << "Applet:" << appl->name() << appl;
} }
void DesktopCorona::checkScreens(bool signalWhenExists) void DesktopCorona::checkScreens(bool signalWhenExists)
@ -79,7 +84,7 @@ void DesktopCorona::checkScreen(int screen, bool signalWhenExists)
//TODO: restore activities //TODO: restore activities
//Activity *currentActivity = activity(m_activityController->currentActivity()); //Activity *currentActivity = activity(m_activityController->currentActivity());
//ensure the desktop(s) have a containment and view //ensure the desktop(s) have a containment and view
checkDesktop(/*currentActivity,*/ signalWhenExists, screen, 0); checkDesktop(/*currentActivity,*/ signalWhenExists, screen, -1);
//ensure the panels get views too //ensure the panels get views too
@ -184,5 +189,16 @@ void DesktopCorona::checkViews()
} }
} }
void DesktopCorona::updateScreenOwner(int wasScreen, int isScreen, Plasma::Containment *containment)
{
qDebug() << "Was screen" << wasScreen << "Is screen" << isScreen <<"Containment" << containment;
if (isScreen < 0 || m_views.count() < isScreen + 1) {
qWarning() << "Invalid screen";
return;
}
m_views[isScreen]->setContainment(containment);
}
#include "desktopcorona.moc" #include "desktopcorona.moc"

View File

@ -69,6 +69,7 @@ protected Q_SLOTS:
void workAreaResized(int screen); void workAreaResized(int screen);
void checkViews(); void checkViews();
void updateScreenOwner(int wasScreen, int isScreen, Plasma::Containment *containment);
private: private:
QDesktopWidget *m_desktopWidget; QDesktopWidget *m_desktopWidget;

View File

@ -21,79 +21,20 @@ import QtQuick 2.0
import org.kde.plasma.core 0.1 as PlasmaCore import org.kde.plasma.core 0.1 as PlasmaCore
Rectangle { Rectangle {
color: "darkblue" color: "red"
width: 640 width: 640
height: 480 height: 480
PlasmaCore.Svg { property Item containment
id: actionssvg
imagePath: "widgets/configuration-icons" onContainmentChanged: {
print("New Containment: " + containment + containment.parent)
//containment.parent = root
containment.visible = true
containment.anchors.fill = root
} }
PlasmaCore.FrameSvgItem { Component.onCompleted: print("View QML loaded")
id: frame }
x: 50
y: 50
width: txt.paintedWidth + 80
height: txt.paintedHeight + 80 * 2
property int small: 100
property int large: parent.width - width - 150
imagePath: "widgets/background"
MouseArea {
anchors.fill: parent
drag.target: parent
onClicked: {
var s = (frame.x == frame.large) ? frame.small : frame.large;
frame.x = s
frame.height = s
}
}
Behavior on x { PropertyAnimation { easing.type: Easing.OutElastic; duration: 800 } }
//Behavior on y { PropertyAnimation { easing.type: Easing.OutElastic; duration: 800 } }
Behavior on height { PropertyAnimation { easing.type: Easing.InOutDouble; duration: 300 } }
Text {
id: txt
text: "Click or Drag";
anchors.centerIn: parent
}
PlasmaCore.SvgItem {
svg: actionssvg
elementId: "rotate"
width: 16
height: width
anchors.margins: frame.margins.left
anchors {
top: parent.top
left: parent.left
}
//Rectangle { color: "white"; opacity: 0.2; anchors.fill: parent; }
}
}
// PlasmaCore.SvgItem {
// svg: actionssvg
// elementId: "rotate"
// width: 128
// height: width
// }
PlasmaCore.IconItem {
source: "accessories-dictionary"
x: 50
y: 350
width: 48
height: 48
Rectangle { color: "white"; opacity: 0.2; anchors.fill: parent; }
}
// Svg {
// x: 200
// y: 200
// width: 100
// height: 100
// MouseArea {
// anchors.fill: parent
// drag.target: parent
// }
// }
}

View File

@ -17,14 +17,76 @@
*/ */
import QtQuick 2.0 import QtQuick 2.0
//import org.kde.plasma 2.0
import org.kde.plasma.core 0.1 as PlasmaCore import org.kde.plasma.core 0.1 as PlasmaCore
Rectangle { Rectangle {
color: "red" id: root
color: "darkblue"
width: 640 width: 640
height: 480 height: 480
property Item containment
PlasmaCore.Svg {
id: actionssvg
imagePath: "widgets/configuration-icons"
}
PlasmaCore.FrameSvgItem {
id: frame
x: 50
y: 50
width: txt.paintedWidth + 80
height: txt.paintedHeight + 80 * 2
property int small: 100
property int large: parent.width - width - 150
imagePath: "widgets/background"
MouseArea {
anchors.fill: parent
drag.target: parent
onClicked: {
var s = (frame.x == frame.large) ? frame.small : frame.large;
frame.x = s
frame.height = s
}
}
Behavior on x { PropertyAnimation { easing.type: Easing.OutElastic; duration: 800 } }
//Behavior on y { PropertyAnimation { easing.type: Easing.OutElastic; duration: 800 } }
Behavior on height { PropertyAnimation { easing.type: Easing.InOutDouble; duration: 300 } }
Text {
id: txt
text: "Click or Drag";
anchors.centerIn: parent
}
PlasmaCore.SvgItem {
svg: actionssvg
elementId: "rotate"
width: 16
height: width
anchors.margins: frame.margins.left
anchors {
top: parent.top
left: parent.left
}
//Rectangle { color: "white"; opacity: 0.2; anchors.fill: parent; }
}
}
// PlasmaCore.SvgItem {
// svg: actionssvg
// elementId: "rotate"
// width: 128
// height: width
// }
PlasmaCore.IconItem {
source: "accessories-dictionary"
x: 50
y: 350
width: 48
height: 48
Rectangle { color: "white"; opacity: 0.2; anchors.fill: parent; }
}
Component.onCompleted: print("Test Containment loaded") Component.onCompleted: print("Test Containment loaded")
} }

View File

@ -19,7 +19,8 @@
#include "view.h" #include "view.h"
#include <QDebug> #include <QDebug>
#include <QQuickItem>
#include <QTimer>
#include "plasma/pluginloader.h" #include "plasma/pluginloader.h"
View::View(QWindow *parent) View::View(QWindow *parent)
@ -44,4 +45,41 @@ View::~View()
void View::setContainment(Plasma::Containment *cont)
{
if (m_containment) {
disconnect(m_containment.data(), 0, this, 0);
}
m_containment = cont;
if (!cont) {
return;
}
connect(cont, SIGNAL(graphicObjectChanged()), this, SLOT(syncGraphicObject()));
if (m_containment.data()->graphicObject()) {
syncGraphicObject();
}
}
Plasma::Containment *View::containment() const
{
return m_containment.data();
}
void View::syncGraphicObject()
{
qDebug() << "using as graphic containment" << m_containment.data()->graphicObject()<<m_containment.data();
if (!m_containment || !m_containment.data()->graphicObject()) {
qWarning() << "Containment not valid (yet?)";
return;
}
m_containment.data()->graphicObject()->setProperty("visible", false);
m_containment.data()->graphicObject()->setProperty("parent", QVariant::fromValue(rootObject()));
rootObject()->setProperty("containment", QVariant::fromValue(m_containment.data()->graphicObject()));
}
#include "moc_view.cpp" #include "moc_view.cpp"

View File

@ -23,6 +23,7 @@
#include "plasma/package.h" #include "plasma/package.h"
#include "plasma/containment.h"
class View : public QQuickView class View : public QQuickView
@ -33,8 +34,15 @@ public:
View(QWindow *parent = 0); View(QWindow *parent = 0);
virtual ~View(); virtual ~View();
void setContainment(Plasma::Containment *cont);
Plasma::Containment *containment() const;
protected Q_SLOTS:
void syncGraphicObject();
private: private:
Plasma::Package m_package; Plasma::Package m_package;
QWeakPointer<Plasma::Containment> m_containment;
}; };
#endif // VIEW_H #endif // VIEW_H