Merge branch 'master' into plasma/declarative

Conflicts:
	plasma/declarativeimports/core/CMakeLists.txt
	plasma/declarativeimports/core/corebindingsplugin.cpp
	plasma/declarativeimports/plasmacomponents/BusyIndicator.qml
	plasma/declarativeimports/plasmacomponents/ScrollBar.qml
	plasma/declarativeimports/plasmacomponents/qmldir
This commit is contained in:
Marco Martin 2011-09-13 20:43:59 +02:00
commit e5b43a7357
71 changed files with 2315 additions and 987 deletions

View File

@ -1,4 +1,5 @@
add_subdirectory(core)
add_subdirectory(draganddrop)
add_subdirectory(graphicslayouts)
add_subdirectory(graphicswidgets)
add_subdirectory(qtextracomponents)

View File

@ -1,6 +1,7 @@
project(corebindings)
set(corebindings_SRCS
declarativeitemcontainer.cpp
corebindingsplugin.cpp
dataengineconsumer.cpp
theme.cpp
@ -10,6 +11,7 @@ set(corebindings_SRCS
framesvgitem.cpp
dialog.cpp
qrangemodel.cpp
tooltip.cpp
)
INCLUDE_DIRECTORIES(

View File

@ -33,6 +33,7 @@
#include "theme_p.h"
#include "dialog.h"
#include "qrangemodel.h"
#include "tooltip.h"
void CoreBindingsPlugin::registerTypes(const char *uri)
{
@ -51,9 +52,12 @@ void CoreBindingsPlugin::registerTypes(const char *uri)
qmlRegisterType<DialogProxy>(uri, 0, 1, "Dialog");
qmlRegisterType<Plasma::QRangeModel>(uri, 0, 1, "RangeModel");
qmlRegisterType<ToolTipProxy>(uri, 0, 1, "ToolTip");
qmlRegisterInterface<Plasma::Service>("Service");
qRegisterMetaType<Plasma::Service*>("Service");
qmlRegisterInterface<Plasma::ServiceJob>("ServiceJob");
qRegisterMetaType<Plasma::ServiceJob*>("ServiceJob");
/*qmlRegisterInterface<Plasma::DataSource>("DataSource");
qRegisterMetaType<Plasma::DataSource*>("DataSource");*/

View File

@ -26,8 +26,6 @@
#include <Plasma/Service>
Q_DECLARE_METATYPE(Plasma::Service*)
class CoreBindingsPlugin : public QDeclarativeExtensionPlugin
{
Q_OBJECT

View File

@ -106,6 +106,8 @@ DataEngine *DataEngineConsumer::dataEngine(const QString &name)
DataEngine *DataEngineConsumer::remoteDataEngine(const KUrl &location, const QString &name)
{
Q_UNUSED(location);
Q_UNUSED(name);
return 0;
}

View File

@ -83,10 +83,11 @@ void SortFilterModel::setModel(QObject *source)
void SortFilterModel::setFilterRegExp(const QString &exp)
{
//FIXME: this delaying of the reset signal seems to make the views behave a bit better, i.e. less holes and avoids some crashes, in theory shouldn't be necessary
beginResetModel();
blockSignals(true);
QSortFilterProxyModel::setFilterRegExp(QRegExp(exp, Qt::CaseInsensitive));
blockSignals(false);
reset();
endResetModel();
}
QString SortFilterModel::filterRegExp() const
@ -190,6 +191,7 @@ void DataModel::dataUpdated(const QString &sourceName, const Plasma::DataEngine:
(m_sourceFilter.isEmpty() || (sourceRegExp.isValid() && sourceRegExp.exactMatch(i.key())))) {
Plasma::DataEngine::Data data = value.value<Plasma::DataEngine::Data>();
data["DataEngineSource"] = i.key();
list.append(data);
}
++i;
@ -253,26 +255,30 @@ QString DataModel::keyRoleFilter() const
void DataModel::setItems(const QString &sourceName, const QVariantList &list)
{
emit modelAboutToBeReset();
beginResetModel();
//convert to vector, so data() will be O(1)
m_items[sourceName] = list.toVector();
if (!list.isEmpty()) {
if (list.first().canConvert<QVariantHash>()) {
foreach (const QString& roleName, list.first().value<QVariantHash>().keys()) {
if (!m_roleIds.contains(roleName)) {
++m_maxRoleId;
m_roleNames[m_maxRoleId] = roleName.toLatin1();
m_roleIds[roleName] = m_maxRoleId;
foreach (const QVariant &item, list) {
foreach (const QString& roleName, item.value<QVariantHash>().keys()) {
if (!m_roleIds.contains(roleName)) {
++m_maxRoleId;
m_roleNames[m_maxRoleId] = roleName.toLatin1();
m_roleIds[roleName] = m_maxRoleId;
}
}
}
} else {
foreach (const QString& roleName, list.first().value<QVariantMap>().keys()) {
if (!m_roleIds.contains(roleName)) {
++m_maxRoleId;
m_roleNames[m_maxRoleId] = roleName.toLatin1();
m_roleIds[roleName] = m_maxRoleId;
foreach (const QVariant &item, list) {
foreach (const QString& roleName, item.value<QVariantMap>().keys()) {
if (!m_roleIds.contains(roleName)) {
++m_maxRoleId;
m_roleNames[m_maxRoleId] = roleName.toLatin1();
m_roleIds[roleName] = m_maxRoleId;
}
}
}
}
@ -284,16 +290,32 @@ void DataModel::setItems(const QString &sourceName, const QVariantList &list)
//make the declarative view reload everything,
//would be nice an incremental update but is not possible
emit modelReset();
endResetModel();
}
void DataModel::removeSource(const QString &sourceName)
{
//FIXME: this could be way more efficient by not resetting the whole model
//FIXME: find a way to remove only the proper things also in the case where sources are items
emit modelAboutToBeReset();
m_items.remove(sourceName);
emit modelReset();
//source name as key of the map
if (!m_keyRoleFilter.isEmpty()) {
if (m_items.contains(sourceName)) {
beginResetModel();
m_items.remove(sourceName);
endResetModel();
}
//source name in the map, linear scan
} else {
for (int i = 0; i < m_items.value(QString()).count(); ++i) {
if (m_items.value(QString())[i].value<QVariantHash>().value("DataEngineSource") == sourceName) {
beginResetModel();
m_items[QString()].remove(i);
endResetModel();
break;
}
}
}
}
QVariant DataModel::data(const QModelIndex &index, int role) const

View File

@ -130,8 +130,6 @@ protected:
inline int countItems() const;
Q_SIGNALS:
void modelAboutToBeReset();
void modelReset();
void countChanged();
private Q_SLOTS:

View File

@ -32,7 +32,7 @@ namespace Plasma
{
DataSource::DataSource(QObject* parent)
: QObject(parent),
m_interval(1000),
m_interval(0),
m_dataEngine(0)
{
setObjectName("DataSource");
@ -193,6 +193,10 @@ Plasma::Service *DataSource::serviceForSource(const QString &source)
void DataSource::connectSource(const QString &source)
{
if (m_connectedSources.contains(source)) {
return;
}
m_newSources.append(source);
m_connectedSources.append(source);
m_changes |= SourcesChanged;

View File

@ -55,12 +55,13 @@ public:
DataSource(QObject* parent=0);
Q_PROPERTY(bool valid READ valid)
bool valid() const {return m_dataEngine != 0;}
bool valid() const {return m_dataEngine && m_dataEngine->isValid();}
Q_PROPERTY(int interval READ interval WRITE setInterval NOTIFY intervalChanged)
int interval() const {return m_interval;}
void setInterval(const int interval);
Q_PROPERTY(QString dataEngine READ engine WRITE setEngine NOTIFY engineChanged)
Q_PROPERTY(QString engine READ engine WRITE setEngine NOTIFY engineChanged)
QString engine() const {return m_engine;}
void setEngine(const QString &e);

View File

@ -0,0 +1,84 @@
/***************************************************************************
* Copyright 2011 Marco Martin <mart@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 "declarativeitemcontainer_p.h"
#include <KDebug>
DeclarativeItemContainer::DeclarativeItemContainer(QGraphicsItem *parent)
: QGraphicsWidget(parent)
{
}
DeclarativeItemContainer::~DeclarativeItemContainer()
{
}
void DeclarativeItemContainer::setDeclarativeItem(QDeclarativeItem *item, bool reparent)
{
if (m_declarativeItem) {
disconnect(m_declarativeItem.data(), 0, this, 0);
}
m_declarativeItem = item;
if (reparent) {
static_cast<QGraphicsItem *>(item)->setParentItem(this);
}
setMinimumWidth(item->implicitWidth());
setMinimumHeight(item->implicitHeight());
resize(item->width(), item->height());
connect(m_declarativeItem.data(), SIGNAL(widthChanged()), this, SLOT(widthChanged()));
connect(m_declarativeItem.data(), SIGNAL(heightChanged()), this, SLOT(heightChanged()));
}
QDeclarativeItem *DeclarativeItemContainer::declarativeItem() const
{
return m_declarativeItem.data();
}
void DeclarativeItemContainer::resizeEvent(QGraphicsSceneResizeEvent *event)
{
if (m_declarativeItem) {
m_declarativeItem.data()->setProperty("width", event->newSize().width());
m_declarativeItem.data()->setProperty("height", event->newSize().height());
}
}
void DeclarativeItemContainer::widthChanged()
{
if (!m_declarativeItem) {
return;
}
QSizeF newSize(size());
newSize.setWidth(m_declarativeItem.data()->width());
resize(newSize);
}
void DeclarativeItemContainer::heightChanged()
{
if (!m_declarativeItem) {
return;
}
QSizeF newSize(size());
newSize.setHeight(m_declarativeItem.data()->height());
resize(newSize);
}
#include "declarativeitemcontainer_p.moc"

View File

@ -0,0 +1,51 @@
/***************************************************************************
* Copyright 2011 Marco Martin <mart@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 DECLARATIVEITEMCONTAINER_P
#define DECLARATIVEITEMCONTAINER_P
#include <QDeclarativeItem>
#include <QGraphicsObject>
#include <QGraphicsWidget>
#include <QGraphicsSceneResizeEvent>
class DeclarativeItemContainer : public QGraphicsWidget
{
Q_OBJECT
public:
DeclarativeItemContainer(QGraphicsItem *parent = 0);
~DeclarativeItemContainer();
void setDeclarativeItem(QDeclarativeItem *item, bool reparent = true);
QDeclarativeItem *declarativeItem() const;
protected:
void resizeEvent(QGraphicsSceneResizeEvent *event);
protected Q_SLOTS:
void widthChanged();
void heightChanged();
private:
QWeakPointer<QDeclarativeItem> m_declarativeItem;
};
#endif

View File

@ -18,69 +18,78 @@
***************************************************************************/
#include "dialog.h"
#include "declarativeitemcontainer_p.h"
#include <QDeclarativeItem>
#include <QGraphicsObject>
#include <QGraphicsWidget>
#include <QTimer>
#include <QLayout>
#include <Plasma/Corona>
#include <Plasma/Dialog>
#include <Plasma/WindowEffects>
class DeclarativeItemContainer : public QGraphicsWidget
DialogMargins::DialogMargins(Plasma::Dialog *dialog, QObject *parent)
: QObject(parent),
m_dialog(dialog)
{
public:
DeclarativeItemContainer(QGraphicsItem *parent = 0)
: QGraphicsWidget(parent)
{}
checkMargins();
}
~DeclarativeItemContainer()
{}
void DialogMargins::checkMargins()
{
int left, top, right, bottom;
m_dialog->getContentsMargins(&left, &top, &right, &bottom);
void setDeclarativeItem(QDeclarativeItem *item)
{
if (m_declarativeItem) {
m_declarativeItem.data()->removeSceneEventFilter(this);
}
m_declarativeItem = item;
static_cast<QGraphicsItem *>(item)->setParentItem(this);
setMinimumWidth(item->implicitWidth());
setMinimumHeight(item->implicitHeight());
resize(item->width(), item->height());
item->installSceneEventFilter(this);
if (left != m_left) {
m_left = left;
emit leftChanged();
}
QDeclarativeItem *declarativeItem() const
{
return m_declarativeItem.data();
if (top != m_top) {
m_top = top;
emit topChanged();
}
protected:
void resizeEvent(QGraphicsSceneResizeEvent *event)
{
if (m_declarativeItem) {
m_declarativeItem.data()->setProperty("width", event->newSize().width());
m_declarativeItem.data()->setProperty("height", event->newSize().height());
}
if (right != m_right) {
m_right = right;
emit rightChanged();
}
bool sceneEventFilter(QGraphicsItem *watched, QEvent *event)
{
if (event->type() == QEvent::GraphicsSceneResize) {
resize(watched->boundingRect().size());
}
return QGraphicsWidget::sceneEventFilter(watched, event);
if (bottom != m_bottom) {
m_bottom = bottom;
emit bottomChanged();
}
}
private:
QWeakPointer<QDeclarativeItem> m_declarativeItem;
};
int DialogMargins::left() const
{
return m_left;
}
int DialogMargins::top() const
{
return m_top;
}
int DialogMargins::right() const
{
return m_right;
}
int DialogMargins::bottom() const
{
return m_bottom;
}
DialogProxy::DialogProxy(QObject *parent)
: QObject(parent)
: QObject(parent),
m_declarativeItemContainer(0),
m_activeWindow(false),
m_location(Plasma::Floating)
{
m_dialog = new Plasma::Dialog();
m_margins = new DialogMargins(m_dialog, this);
m_dialog->installEventFilter(this);
m_flags = m_dialog->windowFlags();
}
@ -92,18 +101,22 @@ DialogProxy::~DialogProxy()
QGraphicsObject *DialogProxy::mainItem() const
{
return m_dialog->graphicsWidget();
return m_mainItem.data();
}
void DialogProxy::setMainItem(QGraphicsObject *mainItem)
{
if (m_mainItem.data() != mainItem) {
if (m_mainItem) {
m_mainItem.data()->setParent(mainItem->parent());
m_mainItem.data()->setParent(mainItem ? mainItem->parent() : 0);
}
m_mainItem = mainItem;
mainItem->setParentItem(0);
mainItem->setParent(this);
if (mainItem) {
mainItem->setParentItem(0);
mainItem->setParent(this);
}
//if this is called in Compenent.onCompleted we have to wait a loop the item is added to a scene
QTimer::singleShot(0, this, SLOT(syncMainItem()));
@ -125,19 +138,27 @@ void DialogProxy::syncMainItem()
QGraphicsObject *qo = qobject_cast<QGraphicsObject *>(parent);
if (qo) {
scene = qo->scene();
scene->addItem(m_mainItem.data());
break;
if (scene) {
scene->addItem(m_mainItem.data());
break;
}
}
}
}
if (!scene) {
return;
}
//the parent of the qobject never changed, only the parentitem, so put it back what it was
m_mainItem.data()->setParentItem(qobject_cast<QGraphicsObject *>(m_mainItem.data()->parent()));
QGraphicsWidget *widget = qobject_cast<QGraphicsWidget *>(m_mainItem.data());
if (widget) {
m_declarativeItemContainer->deleteLater();
m_declarativeItemContainer = 0;
if (m_declarativeItemContainer) {
m_declarativeItemContainer->deleteLater();
m_declarativeItemContainer = 0;
}
} else {
QDeclarativeItem *di = qobject_cast<QDeclarativeItem *>(m_mainItem.data());
if (di) {
@ -163,17 +184,20 @@ void DialogProxy::setVisible(const bool visible)
m_dialog->setVisible(visible);
if (visible) {
m_dialog->setWindowFlags(m_flags);
m_dialog->setVisible(visible);
m_dialog->raise();
}
emit visibleChanged();
}
}
QPoint DialogProxy::popupPosition(QGraphicsObject *item) const
QPoint DialogProxy::popupPosition(QGraphicsObject *item, int alignment) const
{
if (!item) {
return QPoint();
}
Plasma::Corona *corona = qobject_cast<Plasma::Corona *>(item->scene());
if (corona) {
return corona->popupPosition(item, m_dialog->size());
return corona->popupPosition(item, m_dialog->size(), (Qt::AlignmentFlag)alignment);
} else {
return QPoint();
}
@ -200,6 +224,21 @@ void DialogProxy::setY(int y)
m_dialog->move(m_dialog->pos().x(), y);
}
int DialogProxy::width() const
{
return m_dialog->size().width();
}
int DialogProxy::height() const
{
return m_dialog->size().height();
}
bool DialogProxy::isActiveWindow() const
{
return m_activeWindow;
}
int DialogProxy::windowFlags() const
{
return (int)m_dialog->windowFlags();
@ -211,10 +250,59 @@ void DialogProxy::setWindowFlags(const int flags)
m_dialog->setWindowFlags((Qt::WindowFlags)flags);
}
int DialogProxy::location() const
{
return (int)m_location;
}
void DialogProxy::setLocation(int location)
{
if (m_location == location) {
return;
}
m_location = (Plasma::Location)location;
emit locationChanged();
}
QObject *DialogProxy::margins() const
{
return m_margins;
}
bool DialogProxy::eventFilter(QObject *watched, QEvent *event)
{
if (watched == m_dialog && event->type() == QEvent::Move) {
emit positionChanged();
QMoveEvent *me = static_cast<QMoveEvent *>(event);
if (me->oldPos().x() != me->pos().x()) {
emit xChanged();
}
if (me->oldPos().y() != me->pos().y()) {
emit yChanged();
}
if ((me->oldPos().x() != me->pos().x()) || (me->oldPos().y() != me->pos().y())) {
m_margins->checkMargins();
}
} else if (watched == m_dialog && event->type() == QEvent::Resize) {
QResizeEvent *re = static_cast<QResizeEvent *>(event);
if (re->oldSize().width() != re->size().width()) {
emit widthChanged();
}
if (re->oldSize().height() != re->size().height()) {
emit heightChanged();
}
} else if (watched == m_dialog && event->type() == QEvent::Show) {
Plasma::WindowEffects::slideWindow(m_dialog, m_location);
emit visibleChanged();
} else if (watched == m_dialog && event->type() == QEvent::Hide) {
Plasma::WindowEffects::slideWindow(m_dialog, m_location);
emit visibleChanged();
} else if (watched == m_dialog && event->type() == QEvent::WindowActivate) {
m_activeWindow = true;
emit activeWindowChanged();
} else if (watched == m_dialog && event->type() == QEvent::WindowDeactivate) {
m_activeWindow = false;
emit activeWindowChanged();
}
return false;
}

View File

@ -23,6 +23,8 @@
#include <QWeakPointer>
#include <QPoint>
#include <Plasma/Plasma>
class QGraphicsObject;
namespace Plasma
@ -32,15 +34,56 @@ namespace Plasma
class DeclarativeItemContainer;
class DialogMargins : public QObject
{
Q_OBJECT
Q_PROPERTY(int left READ left NOTIFY leftChanged)
Q_PROPERTY(int top READ top NOTIFY topChanged)
Q_PROPERTY(int right READ right NOTIFY rightChanged)
Q_PROPERTY(int bottom READ bottom NOTIFY bottomChanged)
public:
DialogMargins(Plasma::Dialog *dialog, QObject *parent = 0);
int left() const;
int top() const;
int right() const;
int bottom() const;
Q_SIGNALS:
void leftChanged();
void rightChanged();
void topChanged();
void bottomChanged();
protected:
void checkMargins();
private:
int m_left;
int m_top;
int m_right;
int m_bottom;
Plasma::Dialog *m_dialog;
friend class DialogProxy;
};
class DialogProxy : public QObject
{
Q_OBJECT
Q_PROPERTY(QGraphicsObject *mainItem READ mainItem WRITE setMainItem NOTIFY mainItemChanged)
Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged)
Q_PROPERTY(int x READ x WRITE setX NOTIFY positionChanged)
Q_PROPERTY(int y READ y WRITE setY NOTIFY positionChanged)
Q_PROPERTY(int x READ x WRITE setX NOTIFY xChanged)
Q_PROPERTY(int y READ y WRITE setY NOTIFY yChanged)
//to set the size try to force doing so from the inner item
Q_PROPERTY(int width READ width NOTIFY widthChanged)
Q_PROPERTY(int height READ height NOTIFY heightChanged)
Q_PROPERTY(int windowFlags READ windowFlags WRITE setWindowFlags)
Q_PROPERTY(QObject *margins READ margins CONSTANT)
Q_PROPERTY(bool activeWindow READ isActiveWindow NOTIFY activeWindowChanged)
Q_PROPERTY(int location READ location WRITE setLocation NOTIFY locationChanged)
public:
enum WidgetAttribute {
@ -62,18 +105,34 @@ public:
int y() const;
void setY(int y);
int width() const;
int height() const;
bool isActiveWindow() const;
//FIXME: passing an int is ugly
int windowFlags() const;
void setWindowFlags(const int);
Q_INVOKABLE QPoint popupPosition(QGraphicsObject *item) const;
int location() const;
void setLocation(int location);
QObject *margins() const;
//FIXME: alignment should be Qt::AlignmentFlag
Q_INVOKABLE QPoint popupPosition(QGraphicsObject *item, int alignment=Qt::AlignLeft) const;
//FIXME:: Qt::WidgetAttribute should be already
Q_INVOKABLE void setAttribute(int attribute, bool on);
Q_SIGNALS:
void mainItemChanged();
void visibleChanged();
void positionChanged();
void xChanged();
void yChanged();
void widthChanged();
void heightChanged();
void activeWindowChanged();
void locationChanged();
protected Q_SLOTS:
void syncMainItem();
@ -86,6 +145,9 @@ private:
Qt::WindowFlags m_flags;
DeclarativeItemContainer *m_declarativeItemContainer;
QWeakPointer<QGraphicsObject> m_mainItem;
DialogMargins *m_margins;
bool m_activeWindow;
Plasma::Location m_location;
};
#endif

View File

@ -69,9 +69,11 @@ void SvgItem::setSvg(Plasma::Svg *svg)
disconnect(m_svg.data(), 0, this, 0);
}
m_svg = svg;
connect(svg, SIGNAL(repaintNeeded()), this, SLOT(updateNeeded()));
connect(svg, SIGNAL(repaintNeeded()), this, SIGNAL(naturalSizeChanged()));
connect(svg, SIGNAL(sizeChanged()), this, SIGNAL(naturalSizeChanged()));
if (svg) {
connect(svg, SIGNAL(repaintNeeded()), this, SLOT(updateNeeded()));
connect(svg, SIGNAL(repaintNeeded()), this, SIGNAL(naturalSizeChanged()));
connect(svg, SIGNAL(sizeChanged()), this, SIGNAL(naturalSizeChanged()));
}
emit naturalSizeChanged();
}

View File

@ -31,6 +31,36 @@ ThemeProxy::~ThemeProxy()
{
}
QString ThemeProxy::themeName() const
{
return Plasma::Theme::defaultTheme()->themeName();
}
QFont ThemeProxy::font() const
{
return Plasma::Theme::defaultTheme()->font(Plasma::Theme::DefaultFont);
}
bool ThemeProxy::windowTranslucencyEnabled() const
{
return Plasma::Theme::defaultTheme()->windowTranslucencyEnabled();
}
KUrl ThemeProxy::homepage() const
{
return Plasma::Theme::defaultTheme()->homepage();
}
bool ThemeProxy::useGlobalSettings() const
{
return Plasma::Theme::defaultTheme()->useGlobalSettings();
}
QString ThemeProxy::wallpaperPath() const
{
return Plasma::Theme::defaultTheme()->wallpaperPath();
}
QColor ThemeProxy::textColor() const
{
return Plasma::Theme::defaultTheme()->color(Plasma::Theme::TextColor);
@ -96,6 +126,11 @@ QColor ThemeProxy::viewFocusColor() const
return Plasma::Theme::defaultTheme()->color(Plasma::Theme::ViewFocusColor);
}
QString ThemeProxy::styleSheet() const
{
return Plasma::Theme::defaultTheme()->styleSheet(QString());
}
#include "theme_p.moc"

View File

@ -21,12 +21,22 @@
#include <QObject>
#include <KUrl>
#include <QFont>
#include <QColor>
class ThemeProxy : public QObject
{
Q_OBJECT
Q_PROPERTY(QString themeName READ themeName NOTIFY themeChanged)
Q_PROPERTY(QFont font READ font NOTIFY themeChanged)
Q_PROPERTY(bool windowTranslucentEnabled READ windowTranslucencyEnabled NOTIFY themeChanged)
Q_PROPERTY(KUrl homepage READ homepage NOTIFY themeChanged)
Q_PROPERTY(bool useGlobalSettings READ useGlobalSettings NOTIFY themeChanged)
Q_PROPERTY(QString wallpaperPath READ wallpaperPath NOTIFY themeChanged)
// colors
Q_PROPERTY(QColor textColor READ textColor NOTIFY themeChanged)
Q_PROPERTY(QColor highlightColor READ highlightColor NOTIFY themeChanged)
Q_PROPERTY(QColor backgroundColor READ backgroundColor NOTIFY themeChanged)
@ -41,11 +51,19 @@ class ThemeProxy : public QObject
Q_PROPERTY(QColor viewBackgroundColor READ viewBackgroundColor NOTIFY themeChanged)
Q_PROPERTY(QColor viewHoverColor READ viewHoverColor NOTIFY themeChanged)
Q_PROPERTY(QColor viewFocusColor READ viewFocusColor NOTIFY themeChanged)
Q_PROPERTY(QString styleSheet READ styleSheet NOTIFY themeChanged)
public:
ThemeProxy(QObject *parent = 0);
~ThemeProxy();
QString themeName() const;
QFont font() const;
bool windowTranslucencyEnabled() const;
KUrl homepage() const;
bool useGlobalSettings() const;
QString wallpaperPath() const;
QColor textColor() const;
QColor highlightColor() const;
QColor backgroundColor() const;
@ -59,6 +77,7 @@ public:
QColor viewBackgroundColor() const;
QColor viewHoverColor() const;
QColor viewFocusColor() const;
QString styleSheet() const;
Q_SIGNALS:
void themeChanged();

View File

@ -0,0 +1,168 @@
/***************************************************************************
* Copyright 2011 Marco Martin <mart@kde.org> *
* Copyright 2011 Artur Duque de Souza <asouza@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 "tooltip.h"
#include "declarativeitemcontainer_p.h"
#include <QDeclarativeItem>
#include <QGraphicsObject>
#include <QGraphicsWidget>
#include <QGraphicsScene>
#include <QDebug>
#include <QTimer>
#include <KIcon>
#include <KIconLoader>
#include <Plasma/ToolTipContent>
#include <Plasma/ToolTipManager>
ToolTipProxy::ToolTipProxy(QObject *parent)
: QObject(parent), m_mainText(""), m_subText(""), m_widget(0)
{
connect(this, SIGNAL(targetChanged()), this, SLOT(updateToolTip()));
connect(this, SIGNAL(mainTextChanged()), this, SLOT(updateToolTip()));
connect(this, SIGNAL(subTextChanged()), this, SLOT(updateToolTip()));
connect(this, SIGNAL(imageChanged()), this, SLOT(updateToolTip()));
}
ToolTipProxy::~ToolTipProxy()
{
}
QGraphicsObject *ToolTipProxy::target() const
{
return m_target.data();
}
void ToolTipProxy::setTarget(QGraphicsObject *target)
{
if (m_target.data() != target) {
m_target = target;
m_widget = qobject_cast<QGraphicsWidget*>(m_target.data());
if (!m_widget) {
// if this is called in Compenent.onCompleted we have to
// wait a loop for the item to be added to a scene
QTimer::singleShot(0, this, SLOT(syncTarget()));
return;
}
emit targetChanged();
}
}
void ToolTipProxy::syncTarget()
{
// find the scene
QGraphicsScene *scene = m_target.data()->scene();
if (!scene) {
QObject *parent = m_target.data();
while ((parent = parent->parent())) {
QGraphicsObject *qo = qobject_cast<QGraphicsObject*>(parent);
if (qo) {
scene = qo->scene();
scene->addItem(m_target.data());
break;
}
}
}
QDeclarativeItem *item = qobject_cast<QDeclarativeItem*>(m_target.data());
if (!item) {
return;
}
if (!m_declarativeItemContainer) {
m_declarativeItemContainer = QWeakPointer<DeclarativeItemContainer>(new DeclarativeItemContainer());
m_declarativeItemContainer.data()->setObjectName("DIContainer");
scene->addItem(m_declarativeItemContainer.data());
}
if (m_declarativeItemContainer) {
m_target.data()->setObjectName("Original Item");
m_declarativeItemContainer.data()->setDeclarativeItem(item, false);
m_declarativeItemContainer.data()->setAcceptHoverEvents(true);
m_declarativeItemContainer.data()->setParentItem(m_target.data());
m_widget = m_declarativeItemContainer.data();
emit targetChanged();
}
}
QString ToolTipProxy::mainText() const
{
return m_mainText;
}
void ToolTipProxy::setMainText(const QString &text)
{
if (text == m_mainText) {
return;
}
m_mainText = text;
emit mainTextChanged();
}
QString ToolTipProxy::subText() const
{
return m_subText;
}
void ToolTipProxy::setSubText(const QString &text)
{
if (text == m_subText) {
return;
}
m_subText = text;
emit subTextChanged();
}
// ###TODO: SHOULD BE PIXMAP OR QICON??
QString ToolTipProxy::image() const
{
return m_image;
}
void ToolTipProxy::setImage(const QString &name)
{
if (name == m_image) {
return;
}
m_image = name;
emit imageChanged();
}
void ToolTipProxy::updateToolTip()
{
if (!m_widget) {
return;
}
Plasma::ToolTipContent data;
data.setMainText(m_mainText);
data.setSubText(m_subText);
data.setImage(KIcon(m_image).pixmap(IconSize(KIconLoader::Desktop)));
Plasma::ToolTipManager::self()->setContent(m_widget, data);
}
#include "tooltip.moc"

View File

@ -0,0 +1,76 @@
/***************************************************************************
* Copyright 2011 Marco Martin <mart@kde.org> *
* Copyright 2011 Artur Duque de Souza <asouza@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 TOOLTIP_PROXY_P
#define TOOLTIP_PROXY_P
#include <QObject>
#include <QWeakPointer>
class QGraphicsObject;
class QGraphicsWidget;
class DeclarativeItemContainer;
class ToolTipProxy : public QObject
{
Q_OBJECT
Q_PROPERTY(QGraphicsObject *target READ target WRITE setTarget NOTIFY targetChanged)
Q_PROPERTY(QString mainText READ mainText WRITE setMainText NOTIFY mainTextChanged)
Q_PROPERTY(QString subText READ subText WRITE setSubText NOTIFY subTextChanged)
Q_PROPERTY(QString image READ image WRITE setImage NOTIFY imageChanged)
public:
ToolTipProxy(QObject *parent = 0);
~ToolTipProxy();
QGraphicsObject *target() const;
void setTarget(QGraphicsObject *target);
QString mainText() const;
void setMainText(const QString &text);
QString subText() const;
void setSubText(const QString &text);
// SHOULD BE PIXMAP OR QICON
QString image() const;
void setImage(const QString &name);
Q_SIGNALS:
void targetChanged();
void mainTextChanged();
void subTextChanged();
void imageChanged();
protected Q_SLOTS:
void syncTarget();
void updateToolTip();
private:
QString m_mainText;
QString m_subText;
QString m_image;
QGraphicsWidget *m_widget;
QWeakPointer<DeclarativeItemContainer> m_declarativeItemContainer;
QWeakPointer<QGraphicsObject> m_target;
};
#endif

View File

@ -0,0 +1,27 @@
project(draganddrop)
include(KDE4Defaults)
set(declarativedragdrop_SRCS
draganddropplugin.cpp
DeclarativeDragArea.cpp
DeclarativeDragDropEvent.cpp
DeclarativeDropArea.cpp
DeclarativeMimeData.cpp
)
INCLUDE_DIRECTORIES(
${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR}
${KDE4_INCLUDES}
)
qt4_automoc(${declarativedragdrop_SRCS})
kde4_add_library(dragdropplugin SHARED ${declarativedragdrop_SRCS})
target_link_libraries(dragdropplugin ${QT_QTCORE_LIBRARY} ${QT_QTGUI_LIBRARY} ${QT_QTDECLARATIVE_LIBRARY})
install(TARGETS dragdropplugin DESTINATION ${IMPORTS_INSTALL_DIR}/org/kde/draganddrop)
install(FILES qmldir DESTINATION ${IMPORTS_INSTALL_DIR}/org/kde/draganddrop)

View File

@ -0,0 +1,186 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "DeclarativeDragArea.h"
#include "DeclarativeMimeData.h"
#include <QDrag>
#include <QMimeData>
#include <QGraphicsSceneMouseEvent>
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
/*!
A DragArea is used to make an item draggable.
*/
DeclarativeDragArea::DeclarativeDragArea(QDeclarativeItem *parent)
: QDeclarativeItem(parent),
m_delegate(0),
m_source(0),
m_target(0),
m_enabled(true),
m_supportedActions(Qt::MoveAction),
m_defaultAction(Qt::MoveAction),
m_data(new DeclarativeMimeData()) // m_data is owned by us, and we shouldn't pass it to Qt directly as it will automatically delete it after the drag and drop.
{
setAcceptedMouseButtons(Qt::LeftButton);
}
DeclarativeDragArea::~DeclarativeDragArea()
{
if (m_data) {
delete m_data;
}
}
/*!
The delegate is the item that will be displayed next to the mouse cursor during the drag and drop operation.
It usually consists of a large, semi-transparent icon representing the data being dragged.
*/
QDeclarativeComponent* DeclarativeDragArea::delegate() const
{
return m_delegate;
}
void DeclarativeDragArea::setDelegate(QDeclarativeComponent *delegate)
{
if (m_delegate != delegate) {
m_delegate = delegate;
emit delegateChanged();
}
}
void DeclarativeDragArea::resetDelegate()
{
setDelegate(0);
}
/*!
The QML element that is the source of this drag and drop operation. This can be defined to any item, and will
be available to the DropArea as event.data.source
*/
QDeclarativeItem* DeclarativeDragArea::source() const
{
return m_source;
}
void DeclarativeDragArea::setSource(QDeclarativeItem* source)
{
if (m_source != source) {
m_source = source;
emit sourceChanged();
}
}
void DeclarativeDragArea::resetSource()
{
setSource(0);
}
// target
QDeclarativeItem* DeclarativeDragArea::target() const
{
//TODO: implement me
return 0;
}
// data
DeclarativeMimeData* DeclarativeDragArea::data() const
{
return m_data;
}
// enabled
bool DeclarativeDragArea::isEnabled() const
{
return m_enabled;
}
void DeclarativeDragArea::setEnabled(bool enabled)
{
if (enabled != m_enabled) {
m_enabled = enabled;
emit enabledChanged();
}
}
// supported actions
Qt::DropActions DeclarativeDragArea::supportedActions() const
{
return m_supportedActions;
}
void DeclarativeDragArea::setSupportedActions(Qt::DropActions actions)
{
if (actions != m_supportedActions) {
m_supportedActions = actions;
emit supportedActionsChanged();
}
}
// default action
Qt::DropAction DeclarativeDragArea::defaultAction() const
{
return m_defaultAction;
}
void DeclarativeDragArea::setDefaultAction(Qt::DropAction action)
{
if (action != m_defaultAction) {
m_defaultAction = action;
emit defaultActionChanged();
}
}
void DeclarativeDragArea::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
if ( !m_enabled
|| QLineF(event->screenPos(), event->buttonDownScreenPos(Qt::LeftButton)).length()
< QApplication::startDragDistance()) {
return;
}
QDrag *drag = new QDrag(event->widget());
DeclarativeMimeData* dataCopy = new DeclarativeMimeData(m_data); //Qt will take ownership of this copy and delete it.
drag->setMimeData(dataCopy);
if (m_delegate) {
// Render the delegate to a Pixmap
QDeclarativeItem* item = qobject_cast<QDeclarativeItem *>(m_delegate->create());
QGraphicsScene scene;
scene.addItem(item);
QPixmap pixmap(scene.sceneRect().width(), scene.sceneRect().height());
pixmap.fill(Qt::transparent);
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
scene.render(&painter);
drag->setPixmap(pixmap);
drag->setHotSpot(QPoint(0, 0)); // TODO: Make a property for that
}
//setCursor(Qt::OpenHandCursor); //TODO? Make a property for the cursor
Qt::DropAction action = drag->exec(m_supportedActions, m_defaultAction);
emit drop(action);
}

View File

@ -0,0 +1,95 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef DECLARATIVEDRAGAREA_H
#define DECLARATIVEDRAGAREA_H
#include <QDeclarativeItem>
class QDeclarativeComponent;
class DeclarativeMimeData;
class DeclarativeDragArea : public QDeclarativeItem
{
Q_OBJECT
Q_PROPERTY(QDeclarativeComponent* delegate READ delegate WRITE setDelegate NOTIFY delegateChanged RESET resetDelegate)
Q_PROPERTY(QDeclarativeItem* source READ source WRITE setSource NOTIFY sourceChanged RESET resetSource)
Q_PROPERTY(QDeclarativeItem* target READ source NOTIFY targetChanged)
Q_PROPERTY(DeclarativeMimeData* data READ data CONSTANT)
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged) //TODO: Should call setAcceptDrops()
Q_PROPERTY(Qt::DropActions supportedActions READ supportedActions WRITE setSupportedActions NOTIFY supportedActionsChanged)
Q_PROPERTY(Qt::DropAction defaultAction READ defaultAction WRITE setDefaultAction NOTIFY defaultActionChanged)
public:
DeclarativeDragArea(QDeclarativeItem *parent=0);
~DeclarativeDragArea();
QDeclarativeComponent *delegate() const;
void setDelegate(QDeclarativeComponent* delegate);
void resetDelegate();
QDeclarativeItem* target() const;
QDeclarativeItem* source() const;
void setSource(QDeclarativeItem* source);
void resetSource();
bool isEnabled() const;
void setEnabled(bool enabled);
//supported actions
Qt::DropActions supportedActions() const;
void setSupportedActions(Qt::DropActions actions);
//default action
Qt::DropAction defaultAction() const;
void setDefaultAction(Qt::DropAction action);
DeclarativeMimeData* data() const;
signals:
void delegateChanged();
void sourceChanged();
void targetChanged();
void dataChanged();
void enabledChanged();
void drop(int action);
void supportedActionsChanged();
void defaultActionChanged();
protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *) {}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *) {}
private:
QDeclarativeComponent* m_delegate;
QDeclarativeItem* m_source;
QDeclarativeItem* m_target;
bool m_enabled;
Qt::DropActions m_supportedActions;
Qt::DropAction m_defaultAction;
DeclarativeMimeData* const m_data;
};
#endif // DECLARATIVEDRAGAREA_H

View File

@ -0,0 +1,42 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "DeclarativeDragDropEvent.h"
DeclarativeDragDropEvent::DeclarativeDragDropEvent(QGraphicsSceneDragDropEvent* e, QObject* parent) :
QObject(parent),
m_x(e->pos().x()),
m_y(e->pos().y()),
m_buttons(e->buttons()),
m_modifiers(e->modifiers()),
m_data(e->mimeData()),
m_event(e)
{
}
void DeclarativeDragDropEvent::accept(int action)
{
m_event->setDropAction( (Qt::DropAction) action );
m_event->accept();
}

View File

@ -0,0 +1,66 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef DECLARATIVEDRAGDROPEVENT_H
#define DECLARATIVEDRAGDROPEVENT_H
#include <QObject>
#include <QGraphicsSceneDragDropEvent>
#include "DeclarativeMimeData.h"
class DeclarativeDragDropEvent : public QObject
{
Q_OBJECT
Q_PROPERTY(int x READ x)
Q_PROPERTY(int y READ y)
Q_PROPERTY(int buttons READ buttons)
Q_PROPERTY(int modifiers READ modifiers)
Q_PROPERTY(DeclarativeMimeData* data READ data)
Q_PROPERTY(Qt::DropActions possibleActions READ possibleActions)
Q_PROPERTY(Qt::DropAction proposedAction READ proposedAction)
public:
DeclarativeDragDropEvent(QGraphicsSceneDragDropEvent* e, QObject* parent = 0);
int x() const { return m_x; }
int y() const { return m_y; }
int buttons() const { return m_buttons; }
int modifiers() const { return m_modifiers; }
DeclarativeMimeData* data() { return &m_data; }
Qt::DropAction proposedAction() const { return m_event->proposedAction(); }
Qt::DropActions possibleActions() const { return m_event->possibleActions(); }
public slots:
void accept(int action);
private:
int m_x;
int m_y;
Qt::MouseButtons m_buttons;
Qt::KeyboardModifiers m_modifiers;
DeclarativeMimeData m_data;
QGraphicsSceneDragDropEvent* m_event;
};
#endif // DECLARATIVEDRAGDROPEVENT_H

View File

@ -0,0 +1,68 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "DeclarativeDropArea.h"
#include "DeclarativeDragDropEvent.h"
#include <QGraphicsSceneDragDropEvent>
#include <QMimeData>
DeclarativeDropArea::DeclarativeDropArea(QDeclarativeItem *parent)
: QDeclarativeItem(parent),
m_enabled(true)
{
setAcceptDrops(m_enabled);
}
void DeclarativeDropArea::dragEnterEvent(QGraphicsSceneDragDropEvent *event) {
DeclarativeDragDropEvent dde(event, this);
emit dragEnter(&dde);
}
void DeclarativeDropArea::dragLeaveEvent(QGraphicsSceneDragDropEvent *event)
{
DeclarativeDragDropEvent dde(event, this);
emit dragLeave(&dde);
}
void DeclarativeDropArea::dropEvent(QGraphicsSceneDragDropEvent *event)
{
DeclarativeDragDropEvent dde(event, this);
emit drop(&dde);
}
bool DeclarativeDropArea::isEnabled() const
{
return m_enabled;
}
void DeclarativeDropArea::setEnabled(bool enabled)
{
if (enabled == m_enabled) {
return;
}
m_enabled = enabled;
setAcceptDrops(m_enabled);
emit enabledChanged();
}

View File

@ -0,0 +1,57 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef DECLARATIVEDROPAREA_H
#define DECLARATIVEDROPAREA_H
#include <QDeclarativeItem>
class DeclarativeDragDropEvent;
class DeclarativeDropArea : public QDeclarativeItem
{
Q_OBJECT
Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled NOTIFY enabledChanged)
public:
DeclarativeDropArea(QDeclarativeItem *parent=0);
bool isEnabled() const;
void setEnabled(bool enabled);
signals:
void dragEnter(DeclarativeDragDropEvent* event);
void dragLeave(DeclarativeDragDropEvent* event);
void drop(DeclarativeDragDropEvent* event);
void enabledChanged();
protected:
void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
void dragLeaveEvent(QGraphicsSceneDragDropEvent *event);
void dropEvent(QGraphicsSceneDragDropEvent *event);
private:
bool m_enabled;
};
#endif

View File

@ -0,0 +1,121 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "DeclarativeMimeData.h"
/*!
\qmlclass MimeData DeclarativeMimeData
This is a wrapper class around QMimeData, with a few extensions to provide better support for in-qml drag & drops.
*/
/*!
\internal
\class DeclarativeMimeData
Creates a new DeclarativeMimeData by cloning the QMimeData passed as parameter.
This is useful for two reasons :
- In DragArea, we want to clone our "working copy" of the DeclarativeMimeData instance, as Qt will automatically
delete it after the drag and drop operation.
- In the drop events, the QMimeData is const, and we have troubles passing const to QML. So we clone it to
remove the "constness"
This method will try to cast the QMimeData to DeclarativeMimeData, and will clone our extensions to QMimeData as well
*/
DeclarativeMimeData::DeclarativeMimeData(const QMimeData* copy)
: QMimeData(),
m_source(0)
{
// Copy the standard MIME data
foreach(QString format, copy->formats()) {
this->setData(format, copy->data(format));
}
// If the object we are copying actually is a DeclarativeMimeData, copy our extended properties as well
const DeclarativeMimeData* declarativeMimeData = qobject_cast<const DeclarativeMimeData*>(copy);
if (declarativeMimeData) {
this->setSource(declarativeMimeData->source());
}
}
/*!
\qmlproperty url MimeData::url
Returns the first URL from the urls property of QMimeData
TODO: We should use QDeclarativeListProperty<QUrls> to return the whole list instead of only the first element.
*/
QUrl DeclarativeMimeData::url() const
{
if ( this->hasUrls() && !this->urls().isEmpty()) {
return urls().first();
}
return QUrl();
}
void DeclarativeMimeData::setUrl(const QUrl &url)
{
if (this->url() == url)
return;
QList<QUrl> urlList;
urlList.append(url);
setUrls(urlList);
emit urlChanged();
}
// color
QColor DeclarativeMimeData::color() const
{
if ( this->hasColor()) {
return qvariant_cast<QColor>(this->colorData());
}
return QColor();
}
void DeclarativeMimeData::setColor(const QColor &color)
{
if (this->color() != color) {
this->setColorData(color);
emit colorChanged();
}
}
/*!
\qmlproperty item MimeData::source
Setting source to any existing qml item will enable the receiver of the drag and drop operation to know in which item
the operation originated.
In the case of inter-application drag and drop operations, the source will not be available, and will be 0.
Be sure to test it in your QML code, before using it, or it will generate errors in the console.
*/
QDeclarativeItem* DeclarativeMimeData::source() const
{
return m_source;
}
void DeclarativeMimeData::setSource(QDeclarativeItem* source)
{
if (m_source != source) {
m_source = source;
emit sourceChanged();
}
}

View File

@ -0,0 +1,75 @@
/*
Copyright (C) 2010 by BetterInbox <contact@betterinbox.com>
Original author: Gregory Schlomoff <greg@betterinbox.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef DECLARATIVEMIMEDATA_H
#define DECLARATIVEMIMEDATA_H
#include <QMimeData>
#include <QColor>
#include <QUrl>
#include <QDeclarativeItem>
class DeclarativeMimeData : public QMimeData
{
Q_OBJECT
Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged)
Q_PROPERTY(QString html READ html WRITE setHtml NOTIFY htmlChanged)
Q_PROPERTY(QUrl url READ url WRITE setUrl NOTIFY urlChanged) //TODO: use QDeclarativeListProperty<QUrls> to return the whole list instead of only the first url
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
Q_PROPERTY(QDeclarativeItem* source READ source WRITE setSource NOTIFY sourceChanged)
//TODO: Image property
public:
DeclarativeMimeData() : QMimeData() {}
DeclarativeMimeData(const QMimeData* copy);
QUrl url() const;
void setUrl(const QUrl &url);
QColor color() const;
void setColor(const QColor &color);
QDeclarativeItem* source() const;
void setSource(QDeclarativeItem* source);
/*
QString text() const; //TODO: Reimplement this to issue the onChanged signals
void setText(const QString &text);
QString html() const;
void setHtml(const QString &html);
*/
signals:
void textChanged(); //FIXME not being used
void htmlChanged(); //FIXME not being used
void urlChanged();
void colorChanged();
void sourceChanged();
private:
QDeclarativeItem* m_source;
};
#endif // DECLARATIVEMIMEDATA_H

View File

@ -0,0 +1,43 @@
/*
Copyright 2011 by Marco Martin <mart@kde.org>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#include "draganddropplugin.h"
#include <QtDeclarative/qdeclarative.h>
#include "DeclarativeDragArea.h"
#include "DeclarativeDragDropEvent.h"
#include "DeclarativeDropArea.h"
#include "DeclarativeMimeData.h"
void DragAndDropPlugin::registerTypes(const char *uri)
{
Q_ASSERT(uri == QLatin1String("org.kde.draganddrop"));
qmlRegisterType<DeclarativeDropArea>(uri, 1, 0, "DropArea");
qmlRegisterType<DeclarativeDragArea>(uri, 1, 0, "DragArea");
qmlRegisterUncreatableType<DeclarativeMimeData>(uri, 1, 0, "MimeData", "MimeData cannot be created from QML.");
qmlRegisterUncreatableType<DeclarativeDragDropEvent>(uri, 1, 0, "DragDropEvent", "DragDropEvent cannot be created from QML.");
}
Q_EXPORT_PLUGIN2(draganddropplugin, DragAndDropPlugin)

View File

@ -0,0 +1,36 @@
/*
Copyright 2011 by Marco Martin <mart@kde.org>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/
#ifndef DRAGANDDROPPLUGIN_H
#define DRAGANDDROPPLUGIN_H
#include <QDeclarativeExtensionPlugin>
class DragAndDropPlugin : public QDeclarativeExtensionPlugin
{
Q_OBJECT
public:
void registerTypes(const char *uri);
};
#endif

View File

@ -0,0 +1,2 @@
plugin draganddropplugin

View File

@ -1,76 +0,0 @@
/*
* Copyright (C) 2010 by Anselmo Lacerda Silveira de Melo <anselmolsm@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 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.
*/
import Qt 4.7
import org.kde.plasma.core 0.1 as PlasmaCore
Item {
id: root
width: 200
height: 100
//API
property bool autohide: false
//### get font from theme when available
//### deal with QFont stuff in a proper way
property string font: "Arial"
property string color: theme.textColor
property int duration: 3000
/*### actually the FlashingLabel in C++ doesn't have
this as part of its API, either text or pixmap is
set only when flash is called.*/
property string text: ""
//###
PlasmaCore.Theme {
id: theme
}
Text {
id: label
text: root.text
color: root.color
font.family: root.font
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
anchors.verticalCenter: root.verticalCenter
anchors.horizontalCenter: root.horizontalCenter
}
PropertyAnimation {
id: fade
target: label;
property: "opacity";
duration: root.duration;
to: 0
}
function flash(text, duration, alignment) {
if (text)
root.text = text
if (duration)
root.duration = duration
if (alignment)
label.horizontalAlignment = alignment
fade.start()
}
//###TODO: flash pixmap
}

View File

@ -1,47 +0,0 @@
/*
* Copyright 2010 Marco Martin <notmart@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 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.
*/
import Qt 4.7
import org.kde.plasma.core 0.1 as PlasmaCore
PlasmaCore.FrameSvgItem {
id : background
imagePath: "widgets/frame"
prefix: "plain"
width: childrenRect.width
height: childrenRect.height
property alias padding: paddingRectangle;
signal clicked;
Item {
id: paddingRectangle
anchors.fill: parent
anchors.leftMargin: background.margins.left
anchors.topMargin: background.margins.top
anchors.rightMargin: background.margins.right
anchors.bottomMargin: background.margins.bottom
}
MouseArea {
id: itemMouse
anchors.fill: background
onClicked: background.clicked()
}
}

View File

@ -1,97 +0,0 @@
/*
* Copyright (C) 2010 by Artur Duque de Souza <asouzakde.org>
*
* 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.
*/
import Qt 4.7
import org.kde.plasma.core 0.1 as PlasmaCore
Item {
id: root
width: 100; height: 100
property string text: ""
property string infoText: ""
property string svg: ""
property string icon: ""
property bool drawBackground: true
property int numDisplayLines: 1
//property QColor textBackgroundColor: ""
signal pressed(bool down)
signal clicked()
signal doubleClicked()
signal activated()
signal changed()
PlasmaCore.Theme {
id: theme
}
PlasmaCore.FrameSvgItem {
id: background
visible: root.drawBackground
anchors.fill: root
imagePath: "widgets/viewitem"
prefix: mainMouseArea.pressed == true ? "selected" : "hover"
}
PlasmaCore.SvgItem {
id: svg
visible: root.svg != ""
width: root.width - label.height
height: root.height - label.height
anchors.horizontalCenter: root.horizontalCenter
svg: PlasmaCore.Svg { imagePath: root.svg }
// if you need to do anything while repainting
// do it inside this slot
function update() {
}
}
Image {
id: icon
visible: root.icon != ""
width: root.width - label.height
height: root.height - label.height
}
Text {
id: label
text: root.text
color: theme.textColor
anchors.top: icon.bottom
anchors.horizontalCenter: root.horizontalCenter
}
MouseArea {
id: mainMouseArea
hoverEnabled: true
anchors.fill: parent
onEntered: {
}
onExited: {
}
}
}

View File

@ -1,95 +0,0 @@
/*
* Copyright (C) 2010 by Marco Martin <mart@kde.org>
*
* 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.
*/
import Qt 4.7
import org.kde.plasma.core 0.1 as PlasmaCore
Item {
width: 50
height:20
property string text
signal clicked
id: button
PlasmaCore.FrameSvgItem {
id: hover
anchors.fill: parent
opacity: 0
anchors.leftMargin: -margins.left
anchors.topMargin: -margins.top
anchors.rightMargin: -margins.right
anchors.bottomMargin: -margins.bottom
imagePath: "widgets/button"
prefix: "hover"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
PlasmaCore.FrameSvgItem {
id: shadow
anchors.fill: parent
anchors.leftMargin: -margins.left
anchors.topMargin: -margins.top
anchors.rightMargin: -margins.right
anchors.bottomMargin: -margins.bottom
imagePath: "widgets/button"
prefix: "shadow"
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
PlasmaCore.FrameSvgItem {
id: surface
anchors.fill: parent
imagePath: "widgets/button"
prefix: "normal"
}
Text {
text: button.text
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onPressed: {
surface.prefix = "pressed"
}
onReleased: {
surface.prefix = "normal"
button.clicked()
}
onEntered: {
shadow.opacity = 0
hover.opacity = 1
}
onExited: {
shadow.opacity = 1
hover.opacity = 0
}
}
}

View File

@ -1,79 +0,0 @@
/*
* Copyright (C) 2010 by Marco Martin <mart@kde.org>
*
* 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.
*/
import Qt 4.7
import org.kde.plasma.core 0.1 as PlasmaCore
Item {
width: 50
height:20
property string text
property bool down: false
signal clicked
id: button
PlasmaCore.FrameSvgItem {
id: surface
anchors.fill: parent
imagePath: "widgets/button"
prefix: down?"pressed":"normal"
opacity: down?1:0
Behavior on opacity {
PropertyAnimation { duration: 250 }
}
}
Text {
text: button.text
anchors.fill: parent
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
onPressed: {
if (!down) {
surface.prefix = "pressed"
}
}
onReleased: {
if (!down) {
surface.prefix = "normal"
}
button.clicked()
}
onEntered: {
if (!down) {
surface.opacity = 1
}
}
onExited: {
if (!down) {
surface.opacity = 0
}
}
}
}

View File

@ -73,7 +73,7 @@ void QIconItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
painter->setRenderHint(QPainter::Antialiasing, m_smooth);
painter->setRenderHint(QPainter::SmoothPixmapTransform, m_smooth);
m_icon.paint(painter, boundingRect().toRect());
m_icon.paint(painter, boundingRect().toRect(), Qt::AlignCenter, isEnabled()?QIcon::Normal:QIcon::Disabled);
painter->setRenderHint(QPainter::Antialiasing, wasAntiAlias);
painter->setRenderHint(QPainter::SmoothPixmapTransform, wasSmoothTransform);
}

View File

@ -1,29 +0,0 @@
project(components_test)
find_package(KDE4 REQUIRED)
include(KDE4Defaults)
add_definitions (${QT_DEFINITIONS} ${KDE4_DEFINITIONS})
include_directories(
${CMAKE_SOURCE_DIR}
${CMAKE_BINARY_DIR}
${KDE4_INCLUDES}
)
set(components_test_TEST_SRCS
test.cpp)
kde4_add_executable(components_test ${components_test_TEST_SRCS})
target_link_libraries(components_test kdeclarative ${KDE4_KDECORE_LIBS} ${QT_QTDECLARATIVE_LIBRARY})
## install
install(TARGETS components_test EXPORT kdelibsLibraryTargets ${INSTALL_TARGETS_DEFAULT_ARGS})
install(FILES "gallery.qml" DESTINATION ${CMAKE_BINARY_DIR}/widgets/components)

View File

@ -1,79 +0,0 @@
/*
* Copyright (C) 2010 by Anselmo Lacerda Silveira de Melo <anselmolsm@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 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.
*/
import Qt 4.7
import org.kde.plasma.components 0.1 as PlasmaComponents
import org.kde.plasma.core 0.1 as PlasmaCore
import org.kde.qtextracomponents 0.1 as QtExtraComponents
Rectangle {
id: test
width: 400
height: 500
color: "tomato"
Column {
x: 10
anchors.fill: parent
spacing: 5
PlasmaComponents.FlashingLabel {
id: label
font: "Times"
}
Row {
id: busyRow
Repeater {
model: 8
PlasmaComponents.BusyWidget {
width: 50
height: 50
}
}
}
PlasmaComponents.PushButton {
text: "Ok"
onClicked: {print("Clicked!"); scrollBar.value=35}
}
PlasmaComponents.ScrollBar {
id: scrollBar
}
PlasmaComponents.ScrollBar {
id: scrollBarV
orientation: Qt.Vertical
}
QtExtraComponents.QPixmapItem {
width:200
height:100
id: pixmapTest
}
}
PlasmaCore.Svg {
id: svgTest
imagePath: "widgets/clock"
}
Component.onCompleted: {
label.flash("I am a FlashingLabel!!!");
pixmapTest.pixmap = svgTest.pixmap();
}
}

View File

@ -1,55 +0,0 @@
/*
* Copyright 2011 Marco Martin <mart@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 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 <QApplication>
#include <QDeclarativeView>
#include <QDeclarativeContext>
#include <QScriptEngine>
#include <kdeclarative.h>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QDeclarativeView view;
QDeclarativeContext *context = view.rootContext();
context->setContextProperty("backgroundColor",
QColor(Qt::yellow));
KDeclarative kdeclarative;
kdeclarative.setDeclarativeEngine(view.engine());
kdeclarative.initialize();
//binds things like kconfig and icons
kdeclarative.setupBindings();
//If all gone well, the QScriptEngine has been extracted
QScriptEngine *scriptEngine = kdeclarative.scriptEngine();
Q_ASSERT(scriptEngine);
QScriptValue global = scriptEngine->globalObject();
view.setSource(QUrl::fromLocalFile("gallery.qml"));
view.show();
return app.exec();
}
#include "testobject_p.moc"

View File

@ -1,49 +0,0 @@
/*
* Copyright 2011 Marco Martin <mart@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 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 TESTOBJECT_P_H
#define TESTOBJECT_P_H
#include <QObject>
class TestObject : public QObject
{
Q_OBJECT
Q_PROPERTY(QString prop READ prop WRITE setProp NOTIFY propChanged)
public:
void setProp(const QString &prop)
{
m_prop = prop;
emit propChanged();
}
QString prop() const
{
return m_prop;
}
Q_SIGNALS:
void propChanged();
private:
QString m_prop;
};
#endif

View File

@ -1,6 +1,8 @@
[Desktop Entry]
Name=plasma-kpart
Name[ast]=plasma-kpart
Name[bg]=plasma-kpart
Name[bs]=plasma-kpart
Name[ca]=plasma-kpart
Name[ca@valencia]=plasma-kpart
Name[cs]=plasma-kpart
@ -29,6 +31,7 @@ Name[lt]=plasma-kpart
Name[nb]=plasma-kpart
Name[nds]=Kpart för Plasma
Name[nl]=plasma-kpart
Name[nn]=plasma-kpart
Name[pa]=plasma-kpart
Name[pl]=plasma-kpart
Name[pt]=plasma-kpart
@ -44,6 +47,7 @@ Name[sr@latin]=plasma-kpart
Name[sv]=Plasma-delprogram
Name[th]=plasma-kpart
Name[tr]=plasma-kpart
Name[ug]=plasma-kpart
Name[uk]=plasma-kpart
Name[wa]=plasma-kpårt
Name[x-test]=xxplasma-kpartxx

View File

@ -22,8 +22,15 @@
#include "plasmakpart.h"
#include "plasmakpartcorona.h"
#include "plasmakpartview.h"
#include <QCheckBox>
#include <QFile>
#include <QHash>
#include <QGraphicsProxyWidget>
#include <QGraphicsLinearLayout>
#include <QTimer>
#include <KDebug>
#include <KStandardDirs>
#include <Plasma/Containment>
#include <Plasma/Theme>
@ -31,13 +38,8 @@
#include <Plasma/Wallpaper>
#include <plasma/pluginloader.h>
#include <KDebug>
#include <KStandardDirs>
#include <QCheckBox>
#include <QHash>
#include <QGraphicsProxyWidget>
#include <QGraphicsLinearLayout>
#include "plasmakpartcorona.h"
#include "plasmakpartview.h"
K_PLUGIN_FACTORY(plasmaKPartFactory, registerPlugin<PlasmaKPart>();)
K_EXPORT_PLUGIN(plasmaKPartFactory("plasma-kpart","plasma-kpart") )
@ -45,8 +47,7 @@ K_EXPORT_PLUGIN(plasmaKPartFactory("plasma-kpart","plasma-kpart") )
PlasmaKPart::PlasmaKPart(QWidget *parentWidget, QObject *parent, const QVariantList &args)
: KParts::ReadOnlyPart(parent),
m_corona(0),
m_view(new PlasmaKPartView(0, 1, parentWidget)),
m_service(0)
m_view(new PlasmaKPartView(0, 1))
{
setComponentData(plasmaKPartFactory::componentData());
@ -66,16 +67,24 @@ PlasmaKPart::PlasmaKPart(QWidget *parentWidget, QObject *parent, const QVariantL
}
}
if (args.length() > 1) {
m_category = args.at(1).value<QString>();
}
// this line initializes the corona.
corona();
setAutoDeletePart(false);
QTimer::singleShot(0, this, SLOT(initCorona()));
}
PlasmaKPart::~PlasmaKPart()
{
delete m_view;
m_view = 0;
if (!m_configFile.isEmpty()) {
m_corona->saveLayout();
}
delete m_corona;
m_corona = 0;
//TODO: This manual sync() should not be necessary?
syncConfig();
}
void PlasmaKPart::setThemeDefaults()
@ -90,62 +99,35 @@ void PlasmaKPart::setThemeDefaults()
Plasma::Theme::defaultTheme()->setFont(cg.readEntry("desktopFont", QFont("Sans") ));
}
void PlasmaKPart::cleanup()
{
if (m_corona) {
m_corona->saveLayout();
}
if (!m_view->containment()) {
return;
}
// save the mapping of Views to Containments at the moment
// of application exit so we can restore that when we start again.
KConfigGroup viewIds(KGlobal::config(), "ViewIds");
viewIds.deleteGroup();
viewIds.writeEntry(QString::number(m_view->containment()->id()), 1);
delete m_view;
m_view = 0;
delete m_corona;
m_corona = 0;
//TODO: This manual sync() should not be necessary?
syncConfig();
}
void PlasmaKPart::syncConfig()
{
KGlobal::config()->sync();
}
PlasmaKPartCorona* PlasmaKPart::corona()
void PlasmaKPart::initCorona()
{
if (!m_corona) {
m_corona = new PlasmaKPartCorona(this);
connect(m_corona, SIGNAL(containmentAdded(Plasma::Containment*)), this, SLOT(createView(Plasma::Containment*)));
connect(m_corona, SIGNAL(configSynced()), this, SLOT(syncConfig()));
m_corona->setItemIndexMethod(QGraphicsScene::NoIndex);
m_corona->initializeLayout();
m_view->show();
if (m_corona) {
return;
}
m_corona = new PlasmaKPartCorona(this);
connect(m_corona, SIGNAL(containmentAdded(Plasma::Containment*)), this, SLOT(createView(Plasma::Containment*)));
connect(m_corona, SIGNAL(configSynced()), this, SLOT(syncConfig()));
m_corona->setItemIndexMethod(QGraphicsScene::NoIndex);
m_corona->initializeLayout(m_configFile);
m_view->show();
}
PlasmaKPartCorona* PlasmaKPart::corona() const
{
return m_corona;
}
void PlasmaKPart::createView(Plasma::Containment *containment)
{
KConfigGroup viewIds(KGlobal::config(), "ViewIds");
int id = viewIds.readEntry(QString::number(containment->id()), 1);
kDebug() << "new containment" << (QObject*)containment << containment->id()<<"view id"<<id;
m_view->setContainment(containment);
emit viewCreated();
}
void PlasmaKPart::addApplet(const QString& name, const QVariantList& args, const QRectF& geometry )
@ -153,29 +135,27 @@ void PlasmaKPart::addApplet(const QString& name, const QVariantList& args, const
containment()->addApplet(name, args, geometry);
}
Plasma::Applet::List PlasmaKPart::listActiveApplets( )
Plasma::Applet::List PlasmaKPart::listActiveApplets() const
{
return containment()->applets();
}
Plasma::Containment* PlasmaKPart::containment()
QString PlasmaKPart::configFile() const
{
return m_configFile;
}
void PlasmaKPart::setConfigFile(const QString &file)
{
m_configFile = file;
if (m_corona && QFile::exists(m_configFile)) {
m_corona->initializeLayout(m_configFile);
}
}
Plasma::Containment* PlasmaKPart::containment() const
{
return corona()->containments().first();
}
bool PlasmaKPart::setPluginLoader(Plasma::PluginLoader *loader)
{
if (Plasma::PluginLoader::pluginLoader()) {
return false;
}
Plasma::PluginLoader::setPluginLoader(loader);
return true;
}
QString PlasmaKPart::category()
{
return m_category;
}
#include "plasmakpart.moc"

View File

@ -35,7 +35,6 @@ namespace Plasma
}
#include <KDE/KParts/Part>
#include <KDE/KService>
#include <QtCore/QHash>
class QVariant;
@ -45,16 +44,33 @@ class PlasmaKPart : public KParts::ReadOnlyPart
{
Q_OBJECT
Q_PROPERTY(Plasma::Applet::List activeApplets READ listActiveApplets)
Q_PROPERTY(QString configFile READ configFile WRITE setConfigFile)
public:
/**
* The default constructor.
* The args may contain a pointer to a Plasma::PluginLoader as the first parameter.
* Note that only one Plasma::PluginLoader can be active at a time, and that the
* prefered mechanism for registering the plugin loader is via
* Plasma::PluginLoader::setPluginLoader
*/
PlasmaKPart(QWidget *parentWidget, QObject *parent, const QVariantList &args);
~PlasmaKPart();
void notifyStartup(bool completed);
PlasmaKPartCorona *corona();
Plasma::Containment *containment();
QString category();
PlasmaKPartCorona *corona() const;
Plasma::Containment *containment() const;
/**
* Returns a list of active applets in the containment.
*
* @return A list of the containment's Applets
**/
Plasma::Applet::List listActiveApplets() const;
QString configFile() const;
void setConfigFile(const QString &file);
public Q_SLOTS:
/**
@ -66,40 +82,8 @@ public Q_SLOTS:
**/
void addApplet(const QString &pluginName, const QVariantList &args = QVariantList(), const QRectF &dimensions = QRectF());
/**
* Sets the application-specific plugin loader. This allows
* applications which need to add internal applets (such
* as existing QWidget-based dashboard plugins), services or
* data engines to the Plasma dashboard. The preferred way to
* set this loader is by passing it to the KPart wrapped in a
* QVariant in the @p args parameter of the KPart constructor.
* This method is provided for applications which cannot set
* the loader in this method.
* The method will return false if Plasma already has a
* PluginLoader in memory, and will return true if the PluginLoader
* is successfully set.
*
* @param loader The loader which you want Plasma to query for
* new Applets, Data Engines and Services.
* @return True if the loader was successfully set, false otherwise
* (If Plasma already has a PluginLoader in memory)
*
* @short Set application-specific plugin loader
**/
bool setPluginLoader(Plasma::PluginLoader *loader);
/**
* Returns a list of active applets in the containment.
*
* @return A list of the containment's Applets
**/
Plasma::Applet::List listActiveApplets();
Q_SIGNALS:
void viewCreated();
private Q_SLOTS:
void cleanup();
void initCorona();
void syncConfig();
void createView(Plasma::Containment* containment);
void setThemeDefaults();
@ -107,10 +91,9 @@ private Q_SLOTS:
private:
PlasmaKPartCorona* m_corona;
PlasmaKPartView* m_view;
QString m_category;
KService::Ptr m_service;
QHash<QString,Plasma::Applet*>* m_appletList;
QVBoxLayout* m_configLayout;
QString m_configFile;
};
#endif // multiple inclusion guard

View File

@ -33,11 +33,6 @@
PlasmaKPartCorona::PlasmaKPartCorona(QObject *parent)
: Plasma::Corona(parent)
{
init();
}
void PlasmaKPartCorona::init()
{
enableAction("Lock Widgets", false);
enableAction("Shortcut Settings", false);
@ -47,7 +42,6 @@ void PlasmaKPartCorona::init()
void PlasmaKPartCorona::loadDefaultLayout()
{
// used to force a save into the config file
KConfigGroup invalidConfig;
Plasma::Containment *c = addContainment(QString());
if (!c) {
@ -85,15 +79,4 @@ void PlasmaKPartCorona::printScriptMessage(const QString &error)
kDebug() << "Startup script: " << error;
}
Plasma::Containment* PlasmaKPartCorona::containment()
{
// We only have one containment, so just try and return the first one
QList<Plasma::Containment*> list = containments();
if (!list.isEmpty()) {
return list.first();
}
return 0;
}
#include "plasmakpartcorona.moc"

View File

@ -38,13 +38,9 @@ Q_OBJECT
public:
PlasmaKPartCorona(QObject* parent);
Plasma::Containment *containment();
protected:
void loadDefaultLayout();
private:
void evaluateScripts(const QStringList &scripts);
void init();
private Q_SLOTS:
void printScriptError(const QString &error);

View File

@ -2,6 +2,8 @@
Name=Save remote widgets' policies
Name[ar]=احفظ سياسات الودجات البعيدة
Name[ast]=Guardáu de polítiques d'elementos gráficos remotos
Name[bg]=Запазване на правилата на отдалечените джаджи
Name[bs]=Sačuvaj smjernice za udaljene grafičke kontrole
Name[ca]=Desa les polítiques d'estris remots
Name[ca@valencia]=Alça les polítiques d'estris remots
Name[cs]=Uložit zásady vzdálených widgetů
@ -13,13 +15,14 @@ Name[es]=Guardado de políticas de elementos gráficos remotos
Name[et]=Välisvidinate reeglite salvestamine
Name[eu]=Gorde urruneko trepeten politikak
Name[fi]=Tallenna etäkäyttöliittymäkomponenttien menettelytavat
Name[fr]=Enregistrer la stratégie des gadgets distants
Name[fr]=Enregistrer la politique des composants graphiques distants
Name[ga]=Sábháil polasaithe um giuirléidí cianda
Name[he]=שמירת מדיניות של ווידג׳טים מרוחקים
Name[hr]=Spremi pravila za udaljene widgete
Name[hu]=Távoli widgetek irányelveinek mentése
Name[ia]=Il salva le politicas del widgets remote
Name[id]=Simpan kebijakan widget jarak jauh
Name[is]=Vista stefnur varðandi fjartengdar græjur
Name[it]=Salva le linee guida degli oggetti remoti
Name[ja]=リモートウィジェットポリシーを保存
Name[kk]=Қашықтағы виджеттер ережелерін сақтау
@ -48,6 +51,7 @@ Name[sr@latin]=Sačuvaj smernice za udaljene vidžete
Name[sv]=Spara policy för grafiska fjärrkomponenter
Name[th]=บันทึกกฎของวิดเจ็ตระยะไกล
Name[tr]=Uzak programcık politikalarını kaydet
Name[ug]=يىراقتىكى ۋىجېتلارنى ساقلاش تەدبىرى
Name[uk]=Зберегти правила для віддалених віджетів
Name[x-test]=xxSave remote widgets' policiesxx
Name[zh_CN]=保存远程部件的策略
@ -55,6 +59,8 @@ Name[zh_TW]=儲存遠端元件政策
Description=Prevents the system from saving remote plasma widgets' policies
Description[ar]=يمنع النظام من حفظ سياسات ودجات بلازما البعيدة
Description[ast]=Impide que'l sistema guarde polítiques d'elementos gráficos Plasma remotos
Description[bg]=Забраняване запазването на правилата на отдалечените джаджи
Description[bs]=Sprečava sistem da sačuva smjernice udaljenih plazma grafičkih kontrola
Description[ca]=Evita al sistema de desar polítiques d'estris remots del plasma
Description[ca@valencia]=Evita al sistema d'alçar polítiques d'estris remots del plasma
Description[cs]=Zabrání systému ukládat zásady vzdálených widgetů plasmy
@ -66,13 +72,14 @@ Description[es]=Impide que el sistema guarde políticas de elementos gráficos P
Description[et]=Takistab süsteemil salvestamast Plasma välisvidinate reegleid
Description[eu]=Sistemak urruneko plasma trepeten politikak gorde ditzan galarazten du
Description[fi]=Estää järjestelmää tallentamasta etäplasmakäyttöliittymäkomponenttien menettelytapoja
Description[fr]=Empêche le système d'enregistrer la stratégie des gadgets distant
Description[fr]=Empêche le système d'enregistrer la politique des composants graphiques distants
Description[ga]=Ná lig don chóras polasaithe um giuirléidí cianda plasma a shábháil
Description[he]=מונע מהמערכת מלשמור מדיניות של ווידג׳טים מרוחקים
Description[hr]=Brani sustavu spremanje pravila za udaljene widgete Plasme
Description[hu]=Megakadályozza a rendszert a távoli widgetek irányelveinek mentésében
Description[ia]=Il preveni le systema ab salvar le politicas del widgets (elementos graphic) remote de plasma
Description[id]=Mencegah sistem dari menyimpan kebijakan widget jarak jauh plasma
Description[is]=Kemur í veg fyrir að kerfið geti vistað stefnur varðandi fjartengdar græjur
Description[it]=Impedisce al sistema di salvare le linee guida degli oggetti remoti di Plasma
Description[ja]=システムがリモート Plasma ウィジェットポリシー保存するのを防ぎます
Description[kk]=Қашықтағы Plasma виджеттер ережелерін жүйеде сақтауын болдырмау
@ -99,6 +106,7 @@ Description[sr@latin]=Sprečava sistem da sačuva smernice udaljenih plasma vid
Description[sv]=Förhindrar systemet från att spara policy för Plasma grafiska fjärrkomponenter
Description[th]=ป้องกันระบบจากการบันทึกกฎของวิดเจ็ตของพลาสมาจากทางไกล
Description[tr]=Sistemin uzak plasma programcık politikalarını kaydetmesini engelle
Description[ug]=سىستېما يىراقتىكى پلازما ۋىجېتلىرىنىڭ تەدبىرىنى ساقلاشنى چەكلەيدۇ
Description[uk]=Заборонити системі зберігати правила для віддалених віджетів Плазми
Description[x-test]=xxPrevents the system from saving remote plasma widgets' policiesxx
Description[zh_CN]=禁止系统保存远程 Plasma 部件的策略

View File

@ -8,8 +8,10 @@ if(KDE_PLATFORM_FEATURE_BINARY_COMPATIBLE_FEATURE_REDUCTION)
endif(KDE_PLATFORM_FEATURE_BINARY_COMPATIBLE_FEATURE_REDUCTION)
set(simple_javascript_engine_SRCS
common/extension_launchapp.cpp
common/extension_io.cpp
common/guiscriptenv.cpp
common/javascriptaddonpackagestructure.cpp
common/jsscriptenv.cpp
plasmoid/abstractjsappletscript.cpp
plasmoid/appletauthorization.cpp
plasmoid/jsappletinterface.cpp
@ -62,6 +64,8 @@ install(FILES data/plasma-scriptengine-applet-simple-javascript.desktop DESTINAT
# RUNNER
set(javascript_runner_engine_SRCS
common/extension_launchapp.cpp
common/extension_io.cpp
common/javascriptaddonpackagestructure.cpp
common/scriptenv.cpp
runner/javascriptrunner.cpp
@ -83,6 +87,8 @@ install(FILES data/plasma-scriptengine-runner-javascript.desktop DESTINATION ${S
# DATAENGINE
set(javascript_dataengine_engine_SRCS
common/extension_launchapp.cpp
common/extension_io.cpp
common/javascriptaddonpackagestructure.cpp
common/scriptenv.cpp
dataengine/javascriptdataengine.cpp
@ -119,6 +125,8 @@ install(FILES data/plasma-javascriptaddon.desktop DESTINATION ${SERVICETYPES_INS
#DECLARATIVE APPLET
set(declarative_appletscript_SRCS
common/extension_launchapp.cpp
common/extension_io.cpp
common/javascriptaddonpackagestructure.cpp
common/declarativescriptenv.cpp
declarative/packageaccessmanager.cpp

View File

@ -0,0 +1,142 @@
/*
* Copyright 2011 Aaron Seigo <aseigo@kde.org>
*
* 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 "scriptenv.h"
#include <QDir>
#include <KGlobalSettings>
#include <KIO/Job>
#include <KRun>
#include <KStandardDirs>
QScriptValue ScriptEnv::openUrl(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return false;
}
QScriptValue v = context->argument(0);
KUrl url = v.isString() ? KUrl(v.toString()) : qscriptvalue_cast<KUrl>(v);
if (!url.isValid()) {
return false;
}
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
if (!env) {
return false;
}
if (!(env->m_allowedUrls & AppLaunching) &&
!((env->m_allowedUrls & HttpUrls) && (url.protocol() == "http" || url.protocol() == "https"))) {
return false;
}
new KRun(url, 0);
return true;
}
// TODO these should throw an exception
QScriptValue ScriptEnv::getUrl(QScriptContext *context, QScriptEngine *engine)
{
if (context->argumentCount() == 0) {
return engine->undefinedValue();
}
QScriptValue v = context->argument(0);
KUrl url = v.isString() ? KUrl(v.toString()) : qscriptvalue_cast<KUrl>(v);
if (!url.isValid()) {
return engine->undefinedValue();
}
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
if (!env) {
//kDebug() << "findScriptEnv failed";
return engine->undefinedValue();
}
if (url.isLocalFile()) {
if (!(env->m_allowedUrls & LocalUrls)) {
return engine->undefinedValue();
}
} else if (!(env->m_allowedUrls & NetworkUrls) &&
!((env->m_allowedUrls & HttpUrls) && (url.protocol() == "http" || url.protocol() == "https"))) {
return engine->undefinedValue();
}
KIO::Job *job = KIO::get(url, KIO::NoReload, KIO::HideProgressInfo);
return engine->newQObject(job);
}
QScriptValue ScriptEnv::userDataPath(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return QDir::homePath();
}
const QString type = context->argument(0).toString();
if (type.isEmpty()) {
return QDir::homePath();
}
if (context->argumentCount() > 1) {
const QString filename = context->argument(1).toString();
return KStandardDirs::locateLocal(type.toLatin1(), filename);
}
if (type.compare("desktop", Qt::CaseInsensitive) == 0) {
return KGlobalSettings::desktopPath();
} else if (type.compare("autostart", Qt::CaseInsensitive) == 0) {
return KGlobalSettings::autostartPath();
} else if (type.compare("documents", Qt::CaseInsensitive) == 0) {
return KGlobalSettings::documentPath();
} else if (type.compare("music", Qt::CaseInsensitive) == 0) {
return KGlobalSettings::musicPath();
} else if (type.compare("video", Qt::CaseInsensitive) == 0) {
return KGlobalSettings::videosPath();
} else if (type.compare("downloads", Qt::CaseInsensitive) == 0) {
return KGlobalSettings::downloadPath();
} else if (type.compare("pictures", Qt::CaseInsensitive) == 0) {
return KGlobalSettings::picturesPath();
}
return QString();
}
void ScriptEnv::registerGetUrl(QScriptValue &obj)
{
QScriptValue get = obj.property("getUrl");
if (!get.isValid()) {
obj.setProperty("getUrl", m_engine->newFunction(ScriptEnv::getUrl));
}
}
void ScriptEnv::registerOpenUrl(QScriptValue &obj)
{
QScriptValue value = obj.property("openUrl");
if (!value.isValid()) {
obj.setProperty("openUrl", m_engine->newFunction(ScriptEnv::openUrl));
}
}

View File

@ -0,0 +1,253 @@
/*
* Copyright 2011 Aaron Seigo <aseigo@kde.org>
*
* 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 "scriptenv.h"
#include <KEMailSettings>
#include <KMimeTypeTrader>
#include <KStandardDirs>
#include <KRun>
#include <KServiceTypeTrader>
#include <KShell>
QScriptValue ScriptEnv::runApplication(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return false;
}
KUrl::List urls;
if (context->argumentCount() > 1) {
urls = qscriptvalue_cast<KUrl::List>(context->argument(1));
}
const QString app = context->argument(0).toString();
const QString exec = KGlobal::dirs()->findExe(app);
if (!exec.isEmpty()) {
return KRun::run(exec, urls, 0);
}
KService::Ptr service = KService::serviceByStorageId(app);
if (service) {
return KRun::run(*service, urls, 0);
}
return false;
}
QScriptValue ScriptEnv::runCommand(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine);
if (context->argumentCount() == 0) {
return false;
}
const QString exec = KGlobal::dirs()->findExe(context->argument(0).toString());
if (!exec.isEmpty()) {
QString args;
if (context->argumentCount() > 1) {
const QStringList argList = qscriptvalue_cast<QStringList>(context->argument(1));
if (!argList.isEmpty()) {
args = ' ' + KShell::joinArgs(argList);
}
}
return KRun::runCommand(exec + args, 0);
}
return false;
}
QScriptValue ScriptEnv::applicationExists(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return false;
}
const QString application = context->argument(0).toString();
if (application.isEmpty()) {
return false;
}
// first, check for it in $PATH
if (!KStandardDirs::findExe(application).isEmpty()) {
return true;
}
if (KService::serviceByStorageId(application)) {
return true;
}
if (application.contains("'")) {
// apostrophes just screw up the trader lookups below, so check for it
return false;
}
// next, consult ksycoca for an app by that name
if (!KServiceTypeTrader::self()->query("Application", QString("Name =~ '%1'").arg(application)).isEmpty()) {
return true;
}
// next, consult ksycoca for an app by that generic name
if (!KServiceTypeTrader::self()->query("Application", QString("GenericName =~ '%1'").arg(application)).isEmpty()) {
return true;
}
return false;
}
QScriptValue ScriptEnv::defaultApplication(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return false;
}
const QString application = context->argument(0).toString();
if (application.isEmpty()) {
return false;
}
const bool storageId = context->argumentCount() < 2 ? false : context->argument(1).toBool();
// FIXME: there are some pretty horrible hacks below, in the sense that they assume a very
// specific implementation system. there is much room for improvement here. see
// kdebase-runtime/kcontrol/componentchooser/ for all the gory details ;)
if (application.compare("mailer", Qt::CaseInsensitive) == 0) {
KEMailSettings settings;
// in KToolInvocation, the default is kmail; but let's be friendlier :)
QString command = settings.getSetting(KEMailSettings::ClientProgram);
if (command.isEmpty()) {
if (KService::Ptr kontact = KService::serviceByStorageId("kontact")) {
return storageId ? kontact->storageId() : kontact->exec();
} else if (KService::Ptr kmail = KService::serviceByStorageId("kmail")) {
return storageId ? kmail->storageId() : kmail->exec();
}
}
if (!command.isEmpty()) {
if (settings.getSetting(KEMailSettings::ClientTerminal) == "true") {
KConfigGroup confGroup(KGlobal::config(), "General");
const QString preferredTerminal = confGroup.readPathEntry("TerminalApplication",
QString::fromLatin1("konsole"));
command = preferredTerminal + QString::fromLatin1(" -e ") + command;
}
return command;
}
} else if (application.compare("browser", Qt::CaseInsensitive) == 0) {
KConfigGroup config(KGlobal::config(), "General");
QString browserApp = config.readPathEntry("BrowserApplication", QString());
if (browserApp.isEmpty()) {
const KService::Ptr htmlApp = KMimeTypeTrader::self()->preferredService(QLatin1String("text/html"));
if (htmlApp) {
browserApp = storageId ? htmlApp->storageId() : htmlApp->exec();
}
} else if (browserApp.startsWith('!')) {
browserApp = browserApp.mid(1);
}
return browserApp;
} else if (application.compare("terminal", Qt::CaseInsensitive) == 0) {
KConfigGroup confGroup(KGlobal::config(), "General");
return confGroup.readPathEntry("TerminalApplication", QString::fromLatin1("konsole"));
} else if (application.compare("filemanager", Qt::CaseInsensitive) == 0) {
KService::Ptr service = KMimeTypeTrader::self()->preferredService("inode/directory");
if (service) {
return storageId ? service->storageId() : service->exec();
}
} else if (application.compare("windowmanager", Qt::CaseInsensitive) == 0) {
KConfig cfg("ksmserverrc", KConfig::NoGlobals);
KConfigGroup confGroup(&cfg, "General");
return confGroup.readEntry("windowManager", QString::fromLatin1("konsole"));
} else if (KService::Ptr service = KMimeTypeTrader::self()->preferredService(application)) {
return storageId ? service->storageId() : service->exec();
} else {
// try the files in share/apps/kcm_componentchooser/
const QStringList services = KGlobal::dirs()->findAllResources("data","kcm_componentchooser/*.desktop", KStandardDirs::NoDuplicates);
//kDebug() << "ok, trying in" << services.count();
foreach (const QString &service, services) {
KConfig config(service, KConfig::SimpleConfig);
KConfigGroup cg = config.group(QByteArray());
const QString type = cg.readEntry("valueName", QString());
//kDebug() << " checking" << service << type << application;
if (type.compare(application, Qt::CaseInsensitive) == 0) {
KConfig store(cg.readPathEntry("storeInFile", "null"));
KConfigGroup storeCg(&store, cg.readEntry("valueSection", QString()));
const QString exec = storeCg.readPathEntry(cg.readEntry("valueName", "kcm_componenchooser_null"),
cg.readEntry("defaultImplementation", QString()));
if (!exec.isEmpty()) {
return exec;
}
break;
}
}
}
return false;
}
QScriptValue ScriptEnv::applicationPath(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return false;
}
const QString application = context->argument(0).toString();
if (application.isEmpty()) {
return false;
}
// first, check for it in $PATH
const QString path = KStandardDirs::findExe(application);
if (!path.isEmpty()) {
return path;
}
if (KService::Ptr service = KService::serviceByStorageId(application)) {
return KStandardDirs::locate("apps", service->entryPath());
}
if (application.contains("'")) {
// apostrophes just screw up the trader lookups below, so check for it
return QString();
}
// next, consult ksycoca for an app by that name
KService::List offers = KServiceTypeTrader::self()->query("Application", QString("Name =~ '%1'").arg(application));
if (offers.isEmpty()) {
// next, consult ksycoca for an app by that generic name
offers = KServiceTypeTrader::self()->query("Application", QString("GenericName =~ '%1'").arg(application));
}
if (!offers.isEmpty()) {
KService::Ptr offer = offers.first();
return KStandardDirs::locate("apps", offer->entryPath());
}
return QString();
}

View File

@ -153,134 +153,6 @@ bool ScriptEnv::checkForErrors(bool fatal)
return false;
}
QScriptValue ScriptEnv::runApplication(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return false;
}
KUrl::List urls;
if (context->argumentCount() > 1) {
urls = qscriptvalue_cast<KUrl::List>(context->argument(1));
}
const QString app = context->argument(0).toString();
const QString exec = KGlobal::dirs()->findExe(app);
if (!exec.isEmpty()) {
return KRun::run(exec, urls, 0);
}
KService::Ptr service = KService::serviceByStorageId(app);
if (service) {
return KRun::run(*service, urls, 0);
}
return false;
}
QScriptValue ScriptEnv::runCommand(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine);
if (context->argumentCount() == 0) {
return false;
}
const QString exec = KGlobal::dirs()->findExe(context->argument(0).toString());
if (!exec.isEmpty()) {
QString args;
if (context->argumentCount() > 1) {
const QStringList argList = qscriptvalue_cast<QStringList>(context->argument(1));
if (!argList.isEmpty()) {
args = ' ' + KShell::joinArgs(argList);
}
}
return KRun::runCommand(exec + args, 0);
}
return false;
}
QScriptValue ScriptEnv::openUrl(QScriptContext *context, QScriptEngine *engine)
{
Q_UNUSED(engine)
if (context->argumentCount() == 0) {
return false;
}
QScriptValue v = context->argument(0);
KUrl url = v.isString() ? KUrl(v.toString()) : qscriptvalue_cast<KUrl>(v);
if (!url.isValid()) {
return false;
}
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
if (!env) {
return false;
}
if (!(env->m_allowedUrls & AppLaunching) &&
!((env->m_allowedUrls & HttpUrls) && (url.protocol() == "http" || url.protocol() == "https"))) {
return false;
}
new KRun(url, 0);
return true;
}
// TODO these should throw an exception
QScriptValue ScriptEnv::getUrl(QScriptContext *context, QScriptEngine *engine)
{
if (context->argumentCount() == 0) {
return engine->undefinedValue();
}
QScriptValue v = context->argument(0);
KUrl url = v.isString() ? KUrl(v.toString()) : qscriptvalue_cast<KUrl>(v);
if (!url.isValid()) {
return engine->undefinedValue();
}
ScriptEnv *env = ScriptEnv::findScriptEnv(engine);
if (!env) {
//kDebug() << "findScriptEnv failed";
return engine->undefinedValue();
}
if (url.isLocalFile()) {
if (!(env->m_allowedUrls & LocalUrls)) {
return engine->undefinedValue();
}
} else if (!(env->m_allowedUrls & NetworkUrls) &&
!((env->m_allowedUrls & HttpUrls) && (url.protocol() == "http" || url.protocol() == "https"))) {
return engine->undefinedValue();
}
KIO::Job *job = KIO::get(url, KIO::NoReload, KIO::HideProgressInfo);
return engine->newQObject(job);
}
void ScriptEnv::registerGetUrl(QScriptValue &obj)
{
QScriptValue get = obj.property("getUrl");
if (!get.isValid()) {
obj.setProperty("getUrl", m_engine->newFunction(ScriptEnv::getUrl));
}
}
void ScriptEnv::registerOpenUrl(QScriptValue &obj)
{
QScriptValue value = obj.property("openUrl");
if (!value.isValid()) {
obj.setProperty("openUrl", m_engine->newFunction(ScriptEnv::openUrl));
}
}
bool ScriptEnv::importBuiltinExtension(const QString &extension, QScriptValue &obj)
{
kDebug() << extension;
@ -307,6 +179,8 @@ bool ScriptEnv::importBuiltinExtension(const QString &extension, QScriptValue &o
} else if ("localio" == extension) {
m_allowedUrls |= LocalUrls;
registerGetUrl(obj);
obj.setProperty("userDataPath", m_engine->newFunction(ScriptEnv::userDataPath));
obj.setProperty("runCommand", m_engine->newFunction(ScriptEnv::runCommand));
return true;
}

View File

@ -82,8 +82,12 @@ private:
static QScriptValue print(QScriptContext *context, QScriptEngine *engine);
static QScriptValue runApplication(QScriptContext *context, QScriptEngine *engine);
static QScriptValue runCommand(QScriptContext *context, QScriptEngine *engine);
static QScriptValue defaultApplication(QScriptContext *context, QScriptEngine *engine);
static QScriptValue applicationPath(QScriptContext *context, QScriptEngine *engine);
static QScriptValue applicationExists(QScriptContext *context, QScriptEngine *engine);
static QScriptValue openUrl(QScriptContext *context, QScriptEngine *engine);
static QScriptValue getUrl(QScriptContext *context, QScriptEngine *engine);
static QScriptValue userDataPath(QScriptContext *context, QScriptEngine *engine);
static QScriptValue listAddons(QScriptContext *context, QScriptEngine *engine);
static QScriptValue loadAddon(QScriptContext *context, QScriptEngine *engine);
static QScriptValue registerAddon(QScriptContext *context, QScriptEngine *engine);

View File

@ -2,6 +2,7 @@
Name=Plasma JavaScript Addon
Name[ast]=Complementu de JavaScript pa Plasma
Name[bg]=Добавка за JavaScript на Plasma
Name[bs]=Plazma javaskriptni dodatak
Name[ca]=Complement del JavaScript pel Plasma
Name[ca@valencia]=Complement del JavaScript pel Plasma
Name[cs]=Doplněk Plasmy JavaScript
@ -12,12 +13,14 @@ Name[en_GB]=Plasma JavaScript Addon
Name[es]=Complemento de JavaScript para Plasma
Name[et]=Plasma JavaScripti lisa
Name[eu]=Plasma JavaScript gehigarria
Name[fi]=Plasma JavaScript -lisäosa
Name[fr]=Module complémentaire Javascript de Plasma
Name[he]=תוסף עבור JavaScript של Plasma
Name[hi]= -ि
Name[hr]=Dodatak JavaScripta Plasmi
Name[hu]=Plazma JavaScript-bővítmény
Name[ia]=Plasma JavaScript Addon
Name[is]=Plasma JavaScript viðbót
Name[it]=Aggiunta per Java e JavaScript
Name[ja]=Plasma JavaScript
Name[kk]=Plasma JavaScript қосымшасы
@ -34,6 +37,7 @@ Name[pl]=Dodatek dla JavaScript
Name[pt]=Extensão de JavaScript do Plasma
Name[pt_BR]=Complementos de JavaScript do Plasma
Name[ro]=Supliment JavaScript Plasma
Name[ru]=Расширение Plasma, использующее JavaScript
Name[sk]=Doplnok JavaScript pre plasmu
Name[sl]=Dodatek za JavaScript za Plasmo
Name[sr]=Плазма јаваскриптни додатак
@ -44,8 +48,11 @@ Name[sv]=Plasma Javaskript-tillägg
Name[tg]=Иловаҳои Plasma JavaScript
Name[th]=
Name[tr]=Plasma JavaScript Eklentisi
Name[ug]=Plasma JavaScript قوشۇلما
Name[uk]=Додаток JavaScript до Плазми
Name[wa]=Pacaedje di rawete Plasma JavaScript
Name[x-test]=xxPlasma JavaScript Addonxx
Name[zh_CN]=Plasma JavaScript
Name[zh_TW]=Plasma JavaScript Addon
Type=ServiceType
X-KDE-ServiceType=Plasma/JavascriptAddon

View File

@ -1,7 +1,8 @@
[Desktop Entry]
Name=Javascript Addon
Name[ast]=Complementu de JavaScript
Name[bg]=Добавка за JavaScript
Name[bg]=Добавка за Javascript
Name[bs]=Javaskriptni dodatak
Name[ca]=Complement del Javascript
Name[ca@valencia]=Complement del Javascript
Name[cs]=Doplněk JavaScript
@ -12,6 +13,7 @@ Name[en_GB]=Javascript Addon
Name[es]=Complemento de JavaScript
Name[et]=JavaScripti lisa
Name[eu]=Javascript gehigarria
Name[fi]=Javascript-lisäosa
Name[fr]=Module complémentaire Javascript
Name[he]=תוסף JavaScript
Name[hi]=ि
@ -35,6 +37,7 @@ Name[pl]=Dodatek dla JavaScript
Name[pt]=Extensão de JavaScript
Name[pt_BR]=Complementos de JavaScript
Name[ro]=Supliment Javascript
Name[ru]=Дополнение, использующее JavaScript
Name[sk]=Doplnok JavaScript
Name[sl]=Dodatek za JavaScript
Name[sr]=Јаваскриптни додатак
@ -44,12 +47,16 @@ Name[sr@latin]=JavaScript dodatak
Name[sv]=Javaskript-tillägg
Name[th]=
Name[tr]=Javascript Eklentisi
Name[ug]=Javascript قوشۇلما
Name[uk]=Додаток JavaScript
Name[wa]=Pacaedje di rawete Javascript
Name[x-test]=xxJavascript Addonxx
Name[zh_CN]=Javascript
Name[zh_TW]=Javascript Addon
Comment=Addons for Javascript Plasma plugins
Comment[ast]=Amestaos pa complementos de JavaScript pa Plasma
Comment[bg]=Добавки за приставките за Javascript на Plasma
Comment[bs]=Dodaci za javaskriptne plazma priključke
Comment[ca]=Complements pels connectors Javascript del Plasma
Comment[ca@valencia]=Complements pels connectors Javascript del Plasma
Comment[cs]=Doplňky pro javascriptové zásuvné moduly plasmy
@ -60,11 +67,13 @@ Comment[en_GB]=Addons for Javascript Plasma plugins
Comment[es]=Añadidos para complementos de JavaScript para Plasma
Comment[et]=JavaScripti Plasma pluginate lisad
Comment[eu]=Javascript Plasma pluginentzako gehigarriak
Comment[fi]=Lisäosia JavaScript Plasma -liitännäisille
Comment[fr]=Module complémentaire pour les modules externes en Javascript de Plasma
Comment[he]=תוספים לתוספי JavaScript של Plasma
Comment[hr]=Dodaci za priključke za Javascript Plasma
Comment[hu]=Bővítmények JavaScript Plazma-modulokhoz
Comment[ia]=Addons (elementos adjuncte) pro plugins de Plasma de javascript
Comment[is]=Viðbætur fyrir Plasma JavaScript íforrit
Comment[it]=Aggiunte per le estensioni JavaScript di Plasma
Comment[ja]=JavaScript Plasma
Comment[kk]=Javascript Plasma плагиніне қосымшасы
@ -80,7 +89,7 @@ Comment[pl]=Dodatki dla wtyczek Plazmy w JavaScript
Comment[pt]=Extras para os 'plugins' do Plasma em JavaScript
Comment[pt_BR]=Complementos para os plug-ins do Plasma em JavaScript
Comment[ro]=Suplimente pentru module JavaScript Plasma
Comment[ru]=Модули, обеспечивающие поддержку JavaScript в расширениях Plasma
Comment[ru]=Модули поддержки дополнений Plasma, использующих JavaScript
Comment[sk]=Doplnky pre Javascriptové moduly plasmy
Comment[sl]=Dodatki za vstavke JavaScript za Plasmo
Comment[sr]=Додаци за јаваскриптне плазма прикључке
@ -90,9 +99,11 @@ Comment[sr@latin]=Dodaci za JavaScript plasma priključke
Comment[sv]=Tillägg för Javascript Plasma-insticksprogram
Comment[th]=
Comment[tr]=Javascript Plasma eklentileri için ek araçlar
Comment[ug]=Javascript Plasma قىستۇرمىسى ئۈچۈن قوشۇلما
Comment[uk]=Додатки для використання Javascript у Плазмі
Comment[wa]=Pacaedjes di rawete po les tchôkes-divins Plasma Javascript
Comment[x-test]=xxAddons for Javascript Plasma pluginsxx
Comment[zh_CN]=Javascript Plasma
Comment[zh_TW]=Javascript Plasma Addon
Type=Service
X-KDE-ServiceTypes=Plasma/PackageStructure

View File

@ -1,6 +1,8 @@
[Desktop Entry]
Name=Declarative widget
Name[ast]=Elementu gráficu declarativu
Name[bg]=Декларативна джаджа
Name[bs]=Deklarativna grafička kontrola
Name[ca]=Estri declaratiu
Name[ca@valencia]=Estri declaratiu
Name[cs]=Deklarativní widget
@ -11,11 +13,12 @@ Name[en_GB]=Declarative widget
Name[es]=Elemento gráfico declarativo
Name[et]=Deklaratiivne vidin
Name[eu]=Trepeta ezagutarazlea
Name[fr]=Élément graphique « Declarative »
Name[fr]=Composant graphique « Declarative »
Name[he]=ווידג׳ט מוצהר
Name[hr]=Deklarativni widget
Name[hu]=Deklaratív widget
Name[ia]=Widget declarative
Name[is]=Skilgreiningagræja
Name[it]=Oggetto dichiarativo
Name[kk]=Мәлімдеме виджеті
Name[km]=
@ -24,6 +27,8 @@ Name[lt]=Deklaratyvus valdiklis
Name[nb]=Deklarativt skjermelement
Name[nds]=Stüerelement för Verkloren
Name[nl]=Widget voor declaratie
Name[nn]=Deklarativt skjermelement
Name[pl]=Deklaratywny element interfejsu
Name[pt]=Item declarativo
Name[pt_BR]=Widget declarativo
Name[ro]=Control declarativ
@ -36,12 +41,16 @@ Name[sr@ijekavianlatin]=Deklarativni vidžet
Name[sr@latin]=Deklarativni vidžet
Name[sv]=Deklarativ grafisk komponent
Name[tr]=Bildirim parçacığı
Name[ug]=ئېنىقلىما ۋىجېت
Name[uk]=Декларативний віджет
Name[wa]=Ahesse di gåyotaedje
Name[x-test]=xxDeclarative widgetxx
Name[zh_CN]=
Name[zh_TW]=
Comment=Native Plasma widget written in QML and JavaScript
Comment[ast]=Elementu gráficu nativu de Plasma escritu en QML y JavaScript
Comment[bg]=Оригинална джаджа за Plasma, написана наQML и JavaScript
Comment[bs]=Samosvojni plazma grafičkih kontrola napisana u QMLu i javaskriptu
Comment[ca]=Estri nadiu del Plasma escrit en QML i JavaScript
Comment[ca@valencia]=Estri nadiu del Plasma escrit en QML i JavaScript
Comment[cs]=Nativní Plasma widget napsaný v QML a JavaScriptu
@ -53,11 +62,12 @@ Comment[es]=Elemento gráfico nativo de Plasma escrito en QML y JavaScript
Comment[et]=QML-is ja JavaScriptis kirjutatud Plasma vidin
Comment[eu]=Plasma jatorrizko trepeta QML eta JavaScript-en idatzia
Comment[fi]=Natiivi, QML-pohjainen Plasma-sovelma
Comment[fr]=Plasmoïde natif Plasma écrit en QML et JavaScript
Comment[fr]=Composant graphique natif de Plasma écrit en QML et JavaScript
Comment[he]=ווידג׳טים של Plasma הנכתבים ב־QML וב־JavaScript
Comment[hr]=Izvorni Plasma widget napisan u QML-u i JavaScriptu
Comment[hu]=QML-ben és JavaScriptben írt natív Plazma-widget
Comment[ia]=Widget native de Plasma scribite in QLM e JavaScript
Comment[is]=Upprunabundin Plasma græja skrifuð í QML og JavaScript
Comment[it]=Oggetto nativo di Plasma scritto in QML e JavaScript
Comment[ja]=QML JavaScript Plasma
Comment[kk]=QML мен JavaScript-те жазылған Plasma тума виджеті
@ -68,6 +78,7 @@ Comment[lt]=Nuosavas Plasma valdiklis parašytas QML ir JavaScript kalba
Comment[nb]=Plasmaelement for dette systemet, skrevet i QML og JavaScript
Comment[nds]=En orginaal Plasmaelement, schreven in QML un JavaScript
Comment[nl]=Hier thuishorend Plasma-widget geschreven in QML en JavaScript
Comment[nn]=Plasma-element skriven i QML og JavaScript
Comment[pa]=QML -ਿ ਿ ਿ ਿ ਿ
Comment[pl]=Element interfejsu Plazmy napisany w QML lub JavaScript
Comment[pt]=Elemento nativo do Plasma feito em QML e JavaScript
@ -83,8 +94,10 @@ Comment[sr@latin]=Samosvojni plasma vidžet napisan u QMLu i JavaScriptu
Comment[sv]=Inbyggd grafisk Plasma-komponent skriven i QML och Javascript
Comment[th]= QML
Comment[tr]=JavaScript ve QML ile yazılmış gerçek Plasma gereci
Comment[ug]=QML ۋە JavaScript بىلەن يېزىلغان ئەسلى Plasma ۋىجېتى
Comment[uk]=Віджет Плазми, написаний на QML та JavaScript
Comment[x-test]=xxNative Plasma widget written in QML and JavaScriptxx
Comment[zh_CN]=使 QML JavaScript Plasma
Comment[zh_TW]= QML JavaScript Plasma
Type=Service
Icon=text-x-script

View File

@ -5,6 +5,7 @@ Name[ast]=Elementu gráficu JavaScript
Name[be@latin]=Widžet JavaScript
Name[bg]=Джаджа JavaScript
Name[bn_IN]=JavaScript Widget
Name[bs]=Javascript grafička kontrola
Name[ca]=Estri del JavaScript
Name[ca@valencia]=Estri del JavaScript
Name[cs]=JavaScript Widget
@ -18,7 +19,7 @@ Name[es]=Elemento gráfico JavaScript
Name[et]=JavaScripti vidin
Name[eu]=JavaScript trepeta
Name[fi]=JavaScript-sovelma
Name[fr]=Plasmoïde JavaScript
Name[fr]=Composant graphique JavaScript
Name[fy]=JavaSkript Widget
Name[ga]=Giuirléid JavaScript
Name[gl]=Widget de JavaScript
@ -66,6 +67,7 @@ Name[te]=జావాస్క్రిప్‍ట్ విడ్‍జ్‌
Name[tg]=Видҷети JavaScript
Name[th]=
Name[tr]=JavaScript Programcığı
Name[ug]=JavaScript ۋىجېتى
Name[uk]=Віджет JavaScript
Name[wa]=Ahesse JavaScript
Name[x-test]=xxJavaScript Widgetxx
@ -76,6 +78,7 @@ Comment[ar]=ودجة بلازما أصلية كتبت بجافا سكربت
Comment[ast]=Elementu gráficu nativu de Plasma escritu en JavaScript
Comment[be@latin]=Widžet systemy Plasma, napisany ŭ movie JavaScript
Comment[bg]=Оригинална джаджа за Plasma, написана с JavaScript
Comment[bs]=Samosvojni plazma grafička kontrola napisana u javaskriptu
Comment[ca]=Estri nadiu del Plasma escrit en JavaScript
Comment[ca@valencia]=Estri nadiu del Plasma escrit en JavaScript
Comment[cs]=Nativní Plasma widget napsaný v JavaScriptu
@ -89,7 +92,7 @@ Comment[es]=Elemento gráfico nativo de Plasma escrito en JavaScript
Comment[et]=JavaScriptis kirjutatud Plasma vidin
Comment[eu]=Plasma jatorrizko trepeta JavaScript-en idatzia
Comment[fi]=Natiivi, JavaScript-pohjainen Plasma-sovelma
Comment[fr]=Plasmoïde natif Plasma écrit en JavaScript
Comment[fr]=Composant graphique natif de Plasma écrit en JavaScript
Comment[fy]=Plasma widget skreaun yn JavaSkript
Comment[ga]=Giuirléid dhúchasach Plasma, scríofa i JavaScript
Comment[gl]=Widget nativo de Plasma escrito en JavaScript
@ -136,6 +139,7 @@ Comment[te]=జావాస్క్రిప్‍ట్‌లో వ్రా
Comment[tg]=Модуль Plasma, написанный на языке JavaScript
Comment[th]=
Comment[tr]=JavaScript ile yazılmış gerçek Plasma gereci
Comment[ug]=JavaScript بىلەن يېزىلغان ئەسلى Plasma ۋىجېتى
Comment[uk]=Віджет Плазми, написаний на JavaScript
Comment[wa]=Ahesse askepieye po Plasma eyet scrîte e JavaScript
Comment[x-test]=xxNative Plasma widget written in JavaScriptxx

View File

@ -2,6 +2,8 @@
Name=JavaScript DataEngine
Name[ar]=مشغل جافا سكربت
Name[ast]=Motor de datos JavaScript
Name[bg]=Ядро за данни на JavaScript
Name[bs]=Javascript pogon podataka
Name[ca]=Motor de dades de JavaScript
Name[ca@valencia]=Motor de dades de JavaScript
Name[cs]=Datový nástroj JavaScript
@ -15,7 +17,7 @@ Name[es]=Motor de datos JavaScript
Name[et]=JavaScripti andmemootor
Name[eu]=JavaScript datu-motorea
Name[fi]=JavaScript-datakone
Name[fr]=Moteur de donnée JavaScript
Name[fr]=Moteur de données JavaScript
Name[fy]=JavaSkript gegevens motor
Name[ga]=Inneall Sonraí JavaScript
Name[gl]=Motor de datos de JavaScript
@ -56,7 +58,9 @@ Name[sv]=Javascript-datagränssnitt
Name[tg]=Иҷрогари JavaScript
Name[th]=
Name[tr]=JavaScript Veri Motoru
Name[ug]=JavaScript سانلىق مەلۇمات ماتورى
Name[uk]=Рушій даних JavaScript
Name[wa]=Moteur di dnêyes JavaScript
Name[x-test]=xxJavaScript DataEnginexx
Name[zh_CN]=JavaScript
Name[zh_TW]=JavaScript

View File

@ -5,6 +5,7 @@ Name[ast]=Motor de javascript
Name[be@latin]=Uklučeńnie JavaScript
Name[bg]=Изпълнение на JavaScript
Name[bn_IN]=JavaScript Runner
Name[bs]=Javascript izvođač
Name[ca]=Executor de JavaScript
Name[ca@valencia]=Executor de JavaScript
Name[cs]=Spouštěč JavaScriptu
@ -17,7 +18,7 @@ Name[eo]=Ĝavaskripta ruligilo
Name[es]=Motor de javascript
Name[et]=JavaScripti käivitaja
Name[eu]=JavaScript abiarazlea
Name[fi]=JavaScript-suorittaja
Name[fi]=JavaScript-suoritusohjelma
Name[fr]=Lanceur JavaScript
Name[fy]=JavaSkript rinner
Name[ga]=Feidhmitheoir JavaScript
@ -67,6 +68,7 @@ Name[te]=జావాస్క్రిప్‍ట్ నడుపునది
Name[tg]=Иҷрогари JavaScript
Name[th]=
Name[tr]=JavaScript Çalıştırıcı
Name[ug]=JavaScript ئىجراچىسى
Name[uk]=Механізм запуску JavaScript
Name[wa]=Enondeu JavaScript
Name[x-test]=xxJavaScript Runnerxx
@ -78,6 +80,7 @@ Comment[ast]=Motor de javascript
Comment[be@latin]=Uklučeńnie JavaScript.
Comment[bg]=Изпълнение на JavaScript
Comment[bn_IN]=JavaScript Runner
Comment[bs]=Javascript izvođač
Comment[ca]=Executor de JavaScript
Comment[ca@valencia]=Executor de JavaScript
Comment[cs]=Spouštěč JavaScriptu
@ -90,7 +93,7 @@ Comment[eo]=Ĝavaskripta ruligilo
Comment[es]=Motor de javascript
Comment[et]=JavaScripti käivitaja
Comment[eu]=JavaScript abiarazlea
Comment[fi]=JavaScript-suorittaja
Comment[fi]=JavaScript-suoritusohjelma
Comment[fr]=Lanceur JavaScript
Comment[fy]=JavaSkript rinner
Comment[ga]=Feidhmitheoir JavaScript
@ -140,7 +143,9 @@ Comment[te]=జావాస్క్రిప్‍ట్ నడుపునద
Comment[tg]=Иҷрогари JavaScript
Comment[th]=
Comment[tr]=JavaScript Çalıştırıcı
Comment[ug]=JavaScript ئىجراچىسى
Comment[uk]=Механізм запуску JavaScript
Comment[wa]=Enondeu JavaScript
Comment[x-test]=xxJavaScript Runnerxx
Comment[zh_CN]=JavaScript
Comment[zh_TW]=JavaScript

View File

@ -39,6 +39,8 @@ public:
qint64 readData(char *data, qint64 maxSize)
{
Q_UNUSED(data);
Q_UNUSED(maxSize);
return 0;
}

View File

@ -81,13 +81,18 @@ bool DeclarativeAppletScript::init()
{
m_declarativeWidget = new Plasma::DeclarativeWidget(applet());
m_declarativeWidget->setInitializationDelayed(true);
KGlobal::locale()->insertCatalog(description().pluginName());
//make possible to import extensions from the package
//FIXME: probably to be removed, would make possible to use native code from within the package :/
//m_declarativeWidget->engine()->addImportPath(package()->path()+"/contents/imports");
//use our own custom network access manager that will access Plasma packages and to manage security (i.e. deny access to remote stuff when the proper extension isn't enabled
m_declarativeWidget->engine()->setNetworkAccessManagerFactory(new PackageAccessManagerFactory(package(), &m_auth));
QDeclarativeEngine *engine = m_declarativeWidget->engine();
QDeclarativeNetworkAccessManagerFactory *factory = engine->networkAccessManagerFactory();
engine->setNetworkAccessManagerFactory(0);
delete factory;
engine->setNetworkAccessManagerFactory(new PackageAccessManagerFactory(package(), &m_auth));
m_declarativeWidget->setQmlPath(mainScript());
@ -135,6 +140,9 @@ bool DeclarativeAppletScript::init()
void DeclarativeAppletScript::collectGarbage()
{
if (!m_engine) {
return;
}
m_engine->collectGarbage();
}
@ -195,6 +203,9 @@ QScriptValue DeclarativeAppletScript::newPlasmaSvg(QScriptContext *context, QScr
QScriptValue DeclarativeAppletScript::variantToScriptValue(QVariant var)
{
if (!m_engine) {
return QScriptValue();
}
return m_engine->newVariant(var);
}
@ -268,6 +279,18 @@ QGraphicsWidget *DeclarativeAppletScript::extractParent(QScriptContext *context,
return parent;
}
void DeclarativeAppletScript::callPlasmoidFunction(const QString &functionName, const QScriptValueList &args, ScriptEnv *env)
{
if (!m_env) {
m_env = ScriptEnv::findScriptEnv(m_engine);
}
if (env) {
QScriptValue func = m_self.property(functionName);
m_env->callFunction(func, args, m_self);
}
}
void DeclarativeAppletScript::constraintsEvent(Plasma::Constraints constraints)
{
if (constraints & Plasma::FormFactorConstraint) {
@ -297,6 +320,9 @@ void DeclarativeAppletScript::popupEvent(bool popped)
void DeclarativeAppletScript::dataUpdated(const QString &name, const Plasma::DataEngine::Data &data)
{
if (!m_engine) {
return;
}
QScriptValueList args;
args << m_engine->toScriptValue(name) << m_engine->toScriptValue(data);
@ -308,6 +334,9 @@ void DeclarativeAppletScript::extenderItemRestored(Plasma::ExtenderItem* item)
if (!m_env) {
return;
}
if (!m_engine) {
return;
}
QScriptValueList args;
args << m_engine->newQObject(item, QScriptEngine::AutoOwnership, QScriptEngine::PreferExistingWrapperObject);
@ -331,7 +360,9 @@ void DeclarativeAppletScript::executeAction(const QString &name)
}
const QString func("action_" + name);
m_env->callEventListeners(func);
if (!m_env->callEventListeners(func)) {
callPlasmoidFunction(func, QScriptValueList(), m_env);
}
}
bool DeclarativeAppletScript::include(const QString &path)
@ -347,6 +378,10 @@ ScriptEnv *DeclarativeAppletScript::scriptEnv()
void DeclarativeAppletScript::setupObjects()
{
m_engine = m_declarativeWidget->scriptEngine();
if (!m_engine) {
return;
}
connect(m_engine, SIGNAL(signalHandlerException(const QScriptValue &)),
this, SLOT(signalHandlerException(const QScriptValue &)));
@ -393,7 +428,6 @@ void DeclarativeAppletScript::setupObjects()
}
registerSimpleAppletMetaTypes(m_engine);
registerDataEngineMetaTypes(m_engine);
QTimer::singleShot(0, this, SLOT(configChanged()));
}
@ -456,6 +490,11 @@ QScriptValue DeclarativeAppletScript::loadService(QScriptContext *context, QScri
return engine->newQObject(service, QScriptEngine::AutoOwnership);
}
QList<QAction*> DeclarativeAppletScript::contextualActions()
{
return m_interface->contextualActions();
}
QScriptEngine *DeclarativeAppletScript::engine() const
{
return m_engine;

View File

@ -49,7 +49,7 @@ public:
QString filePath(const QString &type, const QString &file) const;
void executeAction(const QString &name);
QList<QAction*> contextualActions();
void constraintsEvent(Plasma::Constraints constraints);
@ -70,6 +70,7 @@ public:
static QScriptValue loadService(QScriptContext *context, QScriptEngine *engine);
public Q_SLOTS:
void executeAction(const QString &name);
void dataUpdated(const QString &name, const Plasma::DataEngine::Data &data);
void signalHandlerException(const QScriptValue &exception);
void popupEvent(bool popped);
@ -92,6 +93,7 @@ Q_SIGNALS:
void contextChanged();
private:
void callPlasmoidFunction(const QString &functionName, const QScriptValueList &args, ScriptEnv *env);
Plasma::DeclarativeWidget *m_declarativeWidget;
AppletInterface *m_interface;
EngineAccess *m_engineAccess;

View File

@ -309,6 +309,7 @@ bool SimpleJavaScriptApplet::init()
this, SLOT(extenderItemRestored(Plasma::ExtenderItem*)));
connect(applet(), SIGNAL(activate()),
this, SLOT(activate()));
KGlobal::locale()->insertCatalog(description().pluginName());
setupObjects();
AppletAuthorization auth(this);

View File

@ -54,13 +54,19 @@ void serviceJobFromQScriptValue(const QScriptValue &scriptValue, ServiceJobPtr &
serviceJob = static_cast<Plasma::ServiceJob *>(obj);
}
typedef QMap< QString, QString > StringStringMap;
Q_DECLARE_METATYPE(StringStringMap)
void registerDataEngineMetaTypes(QScriptEngine *engine)
{
qRegisterMetaType<Plasma::DataEngine::Data>("Plasma::DataEngine::Data");
qRegisterMetaType<Plasma::DataEngine::Data>("DataEngine::Data");
qScriptRegisterMapMetaType<Plasma::DataEngine::Data>(engine);
qScriptRegisterVariantMapMetaType<Plasma::DataEngine::Data>(engine);
qScriptRegisterMapMetaType<StringStringMap>(engine);
qScriptRegisterMetaType<Plasma::Service *>(engine, qScriptValueFromService, serviceFromQScriptValue);
qScriptRegisterMetaType<Plasma::DataEngine *>(engine, qScriptValueFromDataEngine, dataEngineFromQScriptValue);
qScriptRegisterMetaType<Plasma::ServiceJob *>(engine, qScriptValueFromServiceJob, serviceJobFromQScriptValue);
qRegisterMetaType<Plasma::Service *>("Service*");
qRegisterMetaType<Plasma::ServiceJob *>("ServiceJob*");
}

View File

@ -30,8 +30,6 @@
using namespace Plasma;
Q_DECLARE_METATYPE(Service*)
Q_DECLARE_METATYPE(ServiceJob*)
#ifndef DECLARATIVE_BINDING
Q_DECLARE_METATYPE(QVariant)
#endif
@ -40,6 +38,21 @@ Q_DECLARE_METATYPE(DataEngine::Data)
template <class M>
QScriptValue qScriptValueFromMap(QScriptEngine *eng, const M &map)
{
//kDebug() << "qScriptValueFromMap called";
QScriptValue obj = eng->newObject();
typename M::const_iterator begin = map.constBegin();
typename M::const_iterator end = map.constEnd();
typename M::const_iterator it;
for (it = begin; it != end; ++it) {
obj.setProperty(it.key(), qScriptValueFromValue(eng, it.value()));
}
return obj;
}
template <class M>
QScriptValue qScriptValueFromVariantMap(QScriptEngine *eng, const M &map)
{
//kDebug() << "qScriptValueFromMap called";
QScriptValue obj = eng->newObject();
@ -70,6 +83,18 @@ void qScriptValueToMap(const QScriptValue &value, M &map)
}
}
template<typename T>
int qScriptRegisterVariantMapMetaType(
QScriptEngine *engine,
const QScriptValue &prototype = QScriptValue()
#ifndef qdoc
, T * /* dummy */ = 0
#endif
)
{
return qScriptRegisterMetaType<T>(engine, qScriptValueFromVariantMap, qScriptValueToMap, prototype);
}
template<typename T>
int qScriptRegisterMapMetaType(
QScriptEngine *engine,

View File

@ -92,7 +92,6 @@ QScriptValue constructIconClass(QScriptEngine *eng)
{
QScriptValue proto = qScriptValueFromValue(eng, QIcon());
QScriptValue::PropertyFlags getter = QScriptValue::PropertyGetter;
QScriptValue::PropertyFlags setter = QScriptValue::PropertySetter;
proto.setProperty("addPixmap", eng->newFunction(addPixmap));
proto.setProperty("addFile", eng->newFunction(addFile));
proto.setProperty("null", eng->newFunction(isNull), getter);

View File

@ -68,7 +68,6 @@ QScriptValue constructQPixmapClass(QScriptEngine *eng)
{
QScriptValue proto = qScriptValueFromValue(eng, QPixmap());
QScriptValue::PropertyFlags getter = QScriptValue::PropertyGetter;
QScriptValue::PropertyFlags setter = QScriptValue::PropertySetter;
proto.setProperty("null", eng->newFunction(null), getter);
proto.setProperty("rect", eng->newFunction(rect), getter);
proto.setProperty("scaled", eng->newFunction(scaled));

View File

@ -1 +1,2 @@
add_subdirectory(plasmapkg)
add_subdirectory(plasma-remote-helper)

View File

@ -0,0 +1,10 @@
set(plasma_remote_helper_SRCS
main.cpp
)
kde4_add_executable(plasma-remote-helper ${plasma_remote_helper_SRCS})
target_link_libraries(plasma-remote-helper ${KDE4_KDEUI_LIBS})
install(TARGETS plasma-remote-helper ${INSTALL_TARGETS_DEFAULT_ARGS})

View File

@ -0,0 +1,2 @@
#! /usr/bin/env bash
$XGETTEXT *.cpp -o $podir/plasma-remote-helper.pot

View File

@ -0,0 +1,81 @@
/* Copyright 2011 Kevin Ottens <ervin@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,
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 <iostream>
#include <QtDBus/QDBusInterface>
#include <QtDBus/QDBusReply>
#include <KDE/KApplication>
#include <KDE/KAboutData>
#include <KDE/KCmdLineArgs>
static const char description[] = I18N_NOOP("Trigger the installation of a remote Plasma Widget");
static const char version[] = "0.1";
int addRemotePlasmoidToShell(const QString &shellName, const QString &url)
{
QString serviceName = "org.kde." + shellName;
QDBusInterface iface(serviceName, "/App");
if (!iface.isValid()) {
std::cerr << "Error: Couldn't contact "
<< shellName.toLocal8Bit().constData() << std::endl;
return 1;
} else {
QDBusReply<void> reply = iface.call("addRemotePlasmoid", url);
if (!reply.isValid()) {
std::cerr << "Error: Couldn't call addRemotePlasmoid on "
<< shellName.toLocal8Bit().constData() << std::endl;
return 1;
}
}
return 0;
}
int main(int argc, char **argv)
{
KAboutData aboutData("plasma-remote-helper", 0, ki18n("Plasma Remote Widget Helper"),
version, ki18n(description), KAboutData::License_GPL,
ki18n("(C) 2011 Kevin Ottens"));
aboutData.addAuthor( ki18n("Kevin Ottens"),
ki18n("Original author"),
"ervin@kde.org" );
KComponentData componentData(aboutData);
KCmdLineArgs::init( argc, argv, &aboutData );
KCmdLineOptions options;
options.add("+<url>", ki18n("URL to the Plasma Remote Widget."));
KCmdLineArgs::addCmdLineOptions( options );
KApplication app;
KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
if (args->count()<1) {
KCmdLineArgs::usageError(i18n("Syntax Error: Not enough arguments"));
} else if (args->count()>1) {
KCmdLineArgs::usageError(i18n("Syntax Error: Too many arguments"));
}
QString url = args->arg(0);
return addRemotePlasmoidToShell("plasma-desktop", url);
}

View File

@ -18,6 +18,7 @@
*/
#include <iostream>
#include <iomanip>
#include <QDir>
#include <QDBusInterface>
@ -74,41 +75,93 @@ void listPackages(const QStringList& types)
}
}
void renderTypeTable(const QMap<QString, QStringList> &plugins)
{
const QString nameHeader = i18n("Addon Name");
const QString pluginHeader = i18n("Service Type");
const QString pathHeader = i18n("Path");
int nameWidth = nameHeader.length();
int pluginWidth = pluginHeader.length();
int pathWidth = pathHeader.length();
QMapIterator<QString, QStringList> pluginIt(plugins);
while (pluginIt.hasNext()) {
pluginIt.next();
if (pluginIt.key().length() > nameWidth) {
nameWidth = pluginIt.key().length();
}
if (pluginIt.value()[0].length() > pluginWidth) {
pluginWidth = pluginIt.value()[0].length();
}
if (pluginIt.value()[1].length() > pathWidth) {
pathWidth = pluginIt.value()[1].length();
}
}
std::cout << nameHeader.toLocal8Bit().constData() << std::setw(nameWidth - nameHeader.length() + 2) << ' '
<< pluginHeader.toLocal8Bit().constData() << std::setw(pluginWidth - pluginHeader.length() + 2) << ' '
<< pathHeader.toLocal8Bit().constData() << std::endl;
std::cout << std::setfill('-') << std::setw(nameWidth) << '-' << " "
<< std::setw(pluginWidth) << '-' << " "
<< std::setw(pathWidth) << '-' << std::endl;
std::cout << std::setfill(' ');
pluginIt.toFront();
while (pluginIt.hasNext()) {
pluginIt.next();
std::cout << pluginIt.key().toLocal8Bit().constData() << std::setw(nameWidth - pluginIt.key().length() + 2) << ' '
<< pluginIt.value()[0].toLocal8Bit().constData() << std::setw(pluginWidth - pluginIt.value()[0].length() + 2) << ' '
<< pluginIt.value()[1].toLocal8Bit().constData() << std::endl;
}
}
void listTypes()
{
output(i18n("Package types that are installable with this tool:"));
output(i18n("Built in:"));
output(i18n(" dataengine: Plasma DataEngine plugin"));
output(i18n(" layout-template: Plasma containment and widget layout script"));
output(i18n(" plasmoid: Plasma widget"));
output(i18n(" runner: Search plugin (KRunner, etc)"));
output(i18n(" theme: Plasma SVG theme"));
output(i18n(" wallpaper: Image pack for use with wallpaper backgrounds"));
output(i18n(" wallpaperplugin: Wallpaper plugin"));
QMap<QString, QStringList> builtIns;
builtIns.insert(i18n("DataEngine"), QStringList() << "Plasma/DataEngine" << "plasma/dataengines/");
builtIns.insert(i18n("Layout Template"), QStringList() << "Plasma/LayoutTemplate" << "plasma/layout-templates/");
builtIns.insert(i18n("Plasmoid"), QStringList() << "Plasma/Applet" << "plasma/plasmoids/");
builtIns.insert(i18n("Runner"), QStringList() << "Plasma/Runner" << "plasma/runners/");
builtIns.insert(i18n("Theme"), QStringList() << "" << "desktoptheme/");
builtIns.insert(i18n("Wallpaper Images"), QStringList() << "" << "wallpapers/");
builtIns.insert(i18n("Wallpaper Plugin"), QStringList() << "Plasma/Wallpaper" << "plasma/wallpapers/");
renderTypeTable(builtIns);
KService::List offers = KServiceTypeTrader::self()->query("Plasma/PackageStructure");
if (!offers.isEmpty()) {
std::cout << std::endl;
output(i18n("Provided by plugins:"));
QMap<QString, QStringList> plugins;
foreach (const KService::Ptr service, offers) {
KPluginInfo info(service);
output(i18nc("Plugin name and the kind of Plasma related content it provides, both from the plugin's desktop file",
" %1: %2", info.pluginName(), info.name()));
Plasma::PackageStructure::Ptr structure = Plasma::PackageStructure::load(info.pluginName());
QString name = info.name();
QString plugin = info.pluginName();
QString path = structure->defaultPackageRoot();
plugins.insert(name, QStringList() << plugin << path);
}
renderTypeTable(plugins);
}
QStringList desktopFiles = KGlobal::dirs()->findAllResources("data", "plasma/packageformats/*rc", KStandardDirs::NoDuplicates);
if (!desktopFiles.isEmpty()) {
output(i18n("Provided by .desktop files:"));
Plasma::PackageStructure structure;
QMap<QString, QStringList> plugins;
foreach (const QString &file, desktopFiles) {
// extract the type
KConfig config(file, KConfig::SimpleConfig);
structure.read(&config);
// get the name based on the rc file name, just as Plasma::PackageStructure does
const QString name = file.left(file.length() - 2);
output(i18nc("Plugin name and the kind of Plasma related content it provides, both from the plugin's desktop file",
" %1: %2", name, structure.type()));
plugins.insert(name, QStringList() << structure.type() << structure.defaultPackageRoot());
}
}
}