diff --git a/declarativeimports/CMakeLists.txt b/declarativeimports/CMakeLists.txt index 5e2e20e2e..76a8c1c6f 100644 --- a/declarativeimports/CMakeLists.txt +++ b/declarativeimports/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory(core) +add_subdirectory(draganddrop) add_subdirectory(graphicslayouts) add_subdirectory(graphicswidgets) add_subdirectory(qtextracomponents) diff --git a/declarativeimports/core/CMakeLists.txt b/declarativeimports/core/CMakeLists.txt index 09c0a93cf..8f20666f9 100644 --- a/declarativeimports/core/CMakeLists.txt +++ b/declarativeimports/core/CMakeLists.txt @@ -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( diff --git a/declarativeimports/core/corebindingsplugin.cpp b/declarativeimports/core/corebindingsplugin.cpp index 2b71df7bc..d9d7ced33 100644 --- a/declarativeimports/core/corebindingsplugin.cpp +++ b/declarativeimports/core/corebindingsplugin.cpp @@ -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(uri, 0, 1, "Dialog"); qmlRegisterType(uri, 0, 1, "RangeModel"); + qmlRegisterType(uri, 0, 1, "ToolTip"); qmlRegisterInterface("Service"); qRegisterMetaType("Service"); + qmlRegisterInterface("ServiceJob"); + qRegisterMetaType("ServiceJob"); /*qmlRegisterInterface("DataSource"); qRegisterMetaType("DataSource");*/ diff --git a/declarativeimports/core/corebindingsplugin.h b/declarativeimports/core/corebindingsplugin.h index 6b452f827..d0a61517a 100644 --- a/declarativeimports/core/corebindingsplugin.h +++ b/declarativeimports/core/corebindingsplugin.h @@ -26,8 +26,6 @@ #include -Q_DECLARE_METATYPE(Plasma::Service*) - class CoreBindingsPlugin : public QDeclarativeExtensionPlugin { Q_OBJECT diff --git a/declarativeimports/core/dataengineconsumer.cpp b/declarativeimports/core/dataengineconsumer.cpp index ecf58732e..0ccaff220 100644 --- a/declarativeimports/core/dataengineconsumer.cpp +++ b/declarativeimports/core/dataengineconsumer.cpp @@ -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; } diff --git a/declarativeimports/core/datamodel.cpp b/declarativeimports/core/datamodel.cpp index 14d7f1fad..eb56b4fe1 100644 --- a/declarativeimports/core/datamodel.cpp +++ b/declarativeimports/core/datamodel.cpp @@ -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(); 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()) { - foreach (const QString& roleName, list.first().value().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().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().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().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().value("DataEngineSource") == sourceName) { + beginResetModel(); + m_items[QString()].remove(i); + endResetModel(); + break; + } + } + } } QVariant DataModel::data(const QModelIndex &index, int role) const diff --git a/declarativeimports/core/datamodel.h b/declarativeimports/core/datamodel.h index e74ffd5b7..a67909c73 100644 --- a/declarativeimports/core/datamodel.h +++ b/declarativeimports/core/datamodel.h @@ -130,8 +130,6 @@ protected: inline int countItems() const; Q_SIGNALS: - void modelAboutToBeReset(); - void modelReset(); void countChanged(); private Q_SLOTS: diff --git a/declarativeimports/core/datasource.cpp b/declarativeimports/core/datasource.cpp index 9d5a914f6..a5bc4aca8 100644 --- a/declarativeimports/core/datasource.cpp +++ b/declarativeimports/core/datasource.cpp @@ -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; diff --git a/declarativeimports/core/datasource_p.h b/declarativeimports/core/datasource_p.h index f61a5689d..1004da049 100644 --- a/declarativeimports/core/datasource_p.h +++ b/declarativeimports/core/datasource_p.h @@ -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); diff --git a/declarativeimports/core/declarativeitemcontainer.cpp b/declarativeimports/core/declarativeitemcontainer.cpp new file mode 100644 index 000000000..4d5ed88e1 --- /dev/null +++ b/declarativeimports/core/declarativeitemcontainer.cpp @@ -0,0 +1,84 @@ +/*************************************************************************** + * Copyright 2011 Marco Martin * + * * + * 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 + +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(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" diff --git a/declarativeimports/core/declarativeitemcontainer_p.h b/declarativeimports/core/declarativeitemcontainer_p.h new file mode 100644 index 000000000..a92ce19bb --- /dev/null +++ b/declarativeimports/core/declarativeitemcontainer_p.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright 2011 Marco Martin * + * * + * 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 +#include +#include +#include + + +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 m_declarativeItem; +}; + +#endif diff --git a/declarativeimports/core/dialog.cpp b/declarativeimports/core/dialog.cpp index 4ce4690e8..3b063f36e 100644 --- a/declarativeimports/core/dialog.cpp +++ b/declarativeimports/core/dialog.cpp @@ -18,69 +18,78 @@ ***************************************************************************/ #include "dialog.h" +#include "declarativeitemcontainer_p.h" #include #include #include #include +#include #include #include +#include -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(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 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(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(m_mainItem.data()->parent())); QGraphicsWidget *widget = qobject_cast(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(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(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(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(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; } diff --git a/declarativeimports/core/dialog.h b/declarativeimports/core/dialog.h index fa8ce532f..a871a80d1 100644 --- a/declarativeimports/core/dialog.h +++ b/declarativeimports/core/dialog.h @@ -23,6 +23,8 @@ #include #include +#include + 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 m_mainItem; + DialogMargins *m_margins; + bool m_activeWindow; + Plasma::Location m_location; }; #endif diff --git a/declarativeimports/core/svgitem.cpp b/declarativeimports/core/svgitem.cpp index d631e84ed..ae246e717 100644 --- a/declarativeimports/core/svgitem.cpp +++ b/declarativeimports/core/svgitem.cpp @@ -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(); } diff --git a/declarativeimports/core/theme.cpp b/declarativeimports/core/theme.cpp index b793c5ff5..fd9e15895 100644 --- a/declarativeimports/core/theme.cpp +++ b/declarativeimports/core/theme.cpp @@ -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" diff --git a/declarativeimports/core/theme_p.h b/declarativeimports/core/theme_p.h index 86b6def12..008264991 100644 --- a/declarativeimports/core/theme_p.h +++ b/declarativeimports/core/theme_p.h @@ -21,12 +21,22 @@ #include +#include +#include #include 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(); diff --git a/declarativeimports/core/tooltip.cpp b/declarativeimports/core/tooltip.cpp new file mode 100644 index 000000000..966450ce5 --- /dev/null +++ b/declarativeimports/core/tooltip.cpp @@ -0,0 +1,168 @@ +/*************************************************************************** + * Copyright 2011 Marco Martin * + * Copyright 2011 Artur Duque de Souza * + * * + * 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 +#include +#include +#include +#include +#include + +#include +#include +#include +#include + + +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(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(parent); + if (qo) { + scene = qo->scene(); + scene->addItem(m_target.data()); + break; + } + } + } + + QDeclarativeItem *item = qobject_cast(m_target.data()); + if (!item) { + return; + } + + if (!m_declarativeItemContainer) { + m_declarativeItemContainer = QWeakPointer(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" + diff --git a/declarativeimports/core/tooltip.h b/declarativeimports/core/tooltip.h new file mode 100644 index 000000000..59658582e --- /dev/null +++ b/declarativeimports/core/tooltip.h @@ -0,0 +1,76 @@ +/*************************************************************************** + * Copyright 2011 Marco Martin * + * Copyright 2011 Artur Duque de Souza * + * * + * 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 +#include + +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 m_declarativeItemContainer; + QWeakPointer m_target; +}; + +#endif diff --git a/declarativeimports/draganddrop/CMakeLists.txt b/declarativeimports/draganddrop/CMakeLists.txt new file mode 100644 index 000000000..5450873c7 --- /dev/null +++ b/declarativeimports/draganddrop/CMakeLists.txt @@ -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) diff --git a/declarativeimports/draganddrop/DeclarativeDragArea.cpp b/declarativeimports/draganddrop/DeclarativeDragArea.cpp new file mode 100644 index 000000000..93943e609 --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeDragArea.cpp @@ -0,0 +1,186 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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 +#include +#include +#include +#include +#include + +/*! + 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(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); +} diff --git a/declarativeimports/draganddrop/DeclarativeDragArea.h b/declarativeimports/draganddrop/DeclarativeDragArea.h new file mode 100644 index 000000000..f2f638c14 --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeDragArea.h @@ -0,0 +1,95 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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 + +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 diff --git a/declarativeimports/draganddrop/DeclarativeDragDropEvent.cpp b/declarativeimports/draganddrop/DeclarativeDragDropEvent.cpp new file mode 100644 index 000000000..765386259 --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeDragDropEvent.cpp @@ -0,0 +1,42 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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(); +} diff --git a/declarativeimports/draganddrop/DeclarativeDragDropEvent.h b/declarativeimports/draganddrop/DeclarativeDragDropEvent.h new file mode 100644 index 000000000..824650541 --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeDragDropEvent.h @@ -0,0 +1,66 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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 +#include +#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 diff --git a/declarativeimports/draganddrop/DeclarativeDropArea.cpp b/declarativeimports/draganddrop/DeclarativeDropArea.cpp new file mode 100644 index 000000000..3b394ab0b --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeDropArea.cpp @@ -0,0 +1,68 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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 +#include + +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(); +} diff --git a/declarativeimports/draganddrop/DeclarativeDropArea.h b/declarativeimports/draganddrop/DeclarativeDropArea.h new file mode 100644 index 000000000..0394ecf6b --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeDropArea.h @@ -0,0 +1,57 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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 + +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 + diff --git a/declarativeimports/draganddrop/DeclarativeMimeData.cpp b/declarativeimports/draganddrop/DeclarativeMimeData.cpp new file mode 100644 index 000000000..09dbef02d --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeMimeData.cpp @@ -0,0 +1,121 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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(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 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 urlList; + urlList.append(url); + setUrls(urlList); + emit urlChanged(); +} + +// color +QColor DeclarativeMimeData::color() const +{ + if ( this->hasColor()) { + return qvariant_cast(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(); + } +} diff --git a/declarativeimports/draganddrop/DeclarativeMimeData.h b/declarativeimports/draganddrop/DeclarativeMimeData.h new file mode 100644 index 000000000..1c9b1cd5b --- /dev/null +++ b/declarativeimports/draganddrop/DeclarativeMimeData.h @@ -0,0 +1,75 @@ +/* + Copyright (C) 2010 by BetterInbox + Original author: Gregory Schlomoff + + 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 +#include +#include +#include + +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 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 diff --git a/declarativeimports/draganddrop/draganddropplugin.cpp b/declarativeimports/draganddrop/draganddropplugin.cpp new file mode 100644 index 000000000..228ef79d4 --- /dev/null +++ b/declarativeimports/draganddrop/draganddropplugin.cpp @@ -0,0 +1,43 @@ +/* + Copyright 2011 by Marco Martin + + 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 + +#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(uri, 1, 0, "DropArea"); + qmlRegisterType(uri, 1, 0, "DragArea"); + qmlRegisterUncreatableType(uri, 1, 0, "MimeData", "MimeData cannot be created from QML."); + qmlRegisterUncreatableType(uri, 1, 0, "DragDropEvent", "DragDropEvent cannot be created from QML."); +} + +Q_EXPORT_PLUGIN2(draganddropplugin, DragAndDropPlugin) + diff --git a/declarativeimports/draganddrop/draganddropplugin.h b/declarativeimports/draganddrop/draganddropplugin.h new file mode 100644 index 000000000..ce7aba576 --- /dev/null +++ b/declarativeimports/draganddrop/draganddropplugin.h @@ -0,0 +1,36 @@ +/* + Copyright 2011 by Marco Martin + + 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 + +class DragAndDropPlugin : public QDeclarativeExtensionPlugin +{ + Q_OBJECT + +public: + void registerTypes(const char *uri); +}; + +#endif diff --git a/declarativeimports/draganddrop/qmldir b/declarativeimports/draganddrop/qmldir new file mode 100644 index 000000000..92ed88537 --- /dev/null +++ b/declarativeimports/draganddrop/qmldir @@ -0,0 +1,2 @@ +plugin draganddropplugin + diff --git a/declarativeimports/plasmacomponents/FlashingLabel.qml b/declarativeimports/plasmacomponents/FlashingLabel.qml deleted file mode 100644 index 47e7f4446..000000000 --- a/declarativeimports/plasmacomponents/FlashingLabel.qml +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2010 by Anselmo Lacerda Silveira de Melo - * - * 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 -} diff --git a/declarativeimports/plasmacomponents/Frame.qml b/declarativeimports/plasmacomponents/Frame.qml deleted file mode 100644 index c33558115..000000000 --- a/declarativeimports/plasmacomponents/Frame.qml +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2010 Marco Martin - * - * 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() - } -} diff --git a/declarativeimports/plasmacomponents/IconWidget.qml b/declarativeimports/plasmacomponents/IconWidget.qml deleted file mode 100644 index ca26ad1de..000000000 --- a/declarativeimports/plasmacomponents/IconWidget.qml +++ /dev/null @@ -1,97 +0,0 @@ -/* -* Copyright (C) 2010 by Artur Duque de Souza -* -* 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: { - } - } -} diff --git a/declarativeimports/plasmacomponents/PushButton.qml b/declarativeimports/plasmacomponents/PushButton.qml deleted file mode 100644 index 2452faf4a..000000000 --- a/declarativeimports/plasmacomponents/PushButton.qml +++ /dev/null @@ -1,95 +0,0 @@ -/* -* Copyright (C) 2010 by Marco Martin -* -* 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 - } - } - -} - diff --git a/declarativeimports/plasmacomponents/ToolButton.qml b/declarativeimports/plasmacomponents/ToolButton.qml deleted file mode 100644 index 86e51ec8c..000000000 --- a/declarativeimports/plasmacomponents/ToolButton.qml +++ /dev/null @@ -1,79 +0,0 @@ -/* -* Copyright (C) 2010 by Marco Martin -* -* 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 - } - } - } - -} - diff --git a/declarativeimports/qtextracomponents/qiconitem.cpp b/declarativeimports/qtextracomponents/qiconitem.cpp index e54c49b33..d72381e47 100644 --- a/declarativeimports/qtextracomponents/qiconitem.cpp +++ b/declarativeimports/qtextracomponents/qiconitem.cpp @@ -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); } diff --git a/declarativeimports/test/CMakeLists.txt b/declarativeimports/test/CMakeLists.txt deleted file mode 100644 index 7925e2d59..000000000 --- a/declarativeimports/test/CMakeLists.txt +++ /dev/null @@ -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) \ No newline at end of file diff --git a/declarativeimports/test/gallery.qml b/declarativeimports/test/gallery.qml deleted file mode 100644 index 19b524b53..000000000 --- a/declarativeimports/test/gallery.qml +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2010 by Anselmo Lacerda Silveira de Melo - * - * 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(); - } -} diff --git a/declarativeimports/test/test.cpp b/declarativeimports/test/test.cpp deleted file mode 100644 index 792f4144a..000000000 --- a/declarativeimports/test/test.cpp +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2011 Marco Martin - * - * 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 -#include -#include -#include - -#include - - -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" diff --git a/declarativeimports/test/testobject_p.h b/declarativeimports/test/testobject_p.h deleted file mode 100644 index 005e10584..000000000 --- a/declarativeimports/test/testobject_p.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2011 Marco Martin - * - * 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 - -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 diff --git a/kpart/plasma-kpart.desktop b/kpart/plasma-kpart.desktop index 4c53733c7..b298ca710 100644 --- a/kpart/plasma-kpart.desktop +++ b/kpart/plasma-kpart.desktop @@ -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 diff --git a/kpart/plasmakpart.cpp b/kpart/plasmakpart.cpp index 06f612cef..9259a20b7 100644 --- a/kpart/plasmakpart.cpp +++ b/kpart/plasmakpart.cpp @@ -22,8 +22,15 @@ #include "plasmakpart.h" -#include "plasmakpartcorona.h" -#include "plasmakpartview.h" +#include +#include +#include +#include +#include +#include + +#include +#include #include #include @@ -31,13 +38,8 @@ #include #include -#include -#include - -#include -#include -#include -#include +#include "plasmakpartcorona.h" +#include "plasmakpartview.h" K_PLUGIN_FACTORY(plasmaKPartFactory, registerPlugin();) 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(); - } - - // 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"<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" diff --git a/kpart/plasmakpart.h b/kpart/plasmakpart.h index d0f2a07dd..92de38524 100644 --- a/kpart/plasmakpart.h +++ b/kpart/plasmakpart.h @@ -35,7 +35,6 @@ namespace Plasma } #include -#include #include 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* m_appletList; QVBoxLayout* m_configLayout; + QString m_configFile; }; #endif // multiple inclusion guard diff --git a/kpart/plasmakpartcorona.cpp b/kpart/plasmakpartcorona.cpp index 99f84da54..6bcece1cd 100644 --- a/kpart/plasmakpartcorona.cpp +++ b/kpart/plasmakpartcorona.cpp @@ -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 list = containments(); - if (!list.isEmpty()) { - return list.first(); - } - - return 0; -} - #include "plasmakpartcorona.moc" diff --git a/kpart/plasmakpartcorona.h b/kpart/plasmakpartcorona.h index 3df552502..6137b8c8b 100644 --- a/kpart/plasmakpartcorona.h +++ b/kpart/plasmakpartcorona.h @@ -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); diff --git a/remotewidgetshelper/kcm_remotewidgets.actions b/remotewidgetshelper/kcm_remotewidgets.actions index 105ce88ce..3d110c183 100644 --- a/remotewidgetshelper/kcm_remotewidgets.actions +++ b/remotewidgetshelper/kcm_remotewidgets.actions @@ -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 部件的策略 diff --git a/scriptengines/javascript/CMakeLists.txt b/scriptengines/javascript/CMakeLists.txt index 1451e164b..8b62d6816 100644 --- a/scriptengines/javascript/CMakeLists.txt +++ b/scriptengines/javascript/CMakeLists.txt @@ -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 diff --git a/scriptengines/javascript/common/extension_io.cpp b/scriptengines/javascript/common/extension_io.cpp new file mode 100644 index 000000000..c25688153 --- /dev/null +++ b/scriptengines/javascript/common/extension_io.cpp @@ -0,0 +1,142 @@ +/* + * Copyright 2011 Aaron Seigo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License 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 + +#include +#include +#include +#include + +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(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(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)); + } +} + + diff --git a/scriptengines/javascript/common/extension_launchapp.cpp b/scriptengines/javascript/common/extension_launchapp.cpp new file mode 100644 index 000000000..93b7c29ca --- /dev/null +++ b/scriptengines/javascript/common/extension_launchapp.cpp @@ -0,0 +1,253 @@ +/* + * Copyright 2011 Aaron Seigo + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License 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 +#include +#include +#include +#include +#include + +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(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(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(); +} + diff --git a/scriptengines/javascript/common/jsscriptenv.cpp b/scriptengines/javascript/common/guiscriptenv.cpp similarity index 100% rename from scriptengines/javascript/common/jsscriptenv.cpp rename to scriptengines/javascript/common/guiscriptenv.cpp diff --git a/scriptengines/javascript/common/scriptenv.cpp b/scriptengines/javascript/common/scriptenv.cpp index d976a9f82..d90ce301d 100644 --- a/scriptengines/javascript/common/scriptenv.cpp +++ b/scriptengines/javascript/common/scriptenv.cpp @@ -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(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(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(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(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; } diff --git a/scriptengines/javascript/common/scriptenv.h b/scriptengines/javascript/common/scriptenv.h index a60e687bd..4ec7202d8 100644 --- a/scriptengines/javascript/common/scriptenv.h +++ b/scriptengines/javascript/common/scriptenv.h @@ -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); diff --git a/scriptengines/javascript/data/plasma-javascriptaddon.desktop b/scriptengines/javascript/data/plasma-javascriptaddon.desktop index 86e8d32a2..293c42af6 100644 --- a/scriptengines/javascript/data/plasma-javascriptaddon.desktop +++ b/scriptengines/javascript/data/plasma-javascriptaddon.desktop @@ -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 diff --git a/scriptengines/javascript/data/plasma-packagestructure-javascript-addon.desktop b/scriptengines/javascript/data/plasma-packagestructure-javascript-addon.desktop index 2fe01e25f..8d14d27a0 100644 --- a/scriptengines/javascript/data/plasma-packagestructure-javascript-addon.desktop +++ b/scriptengines/javascript/data/plasma-packagestructure-javascript-addon.desktop @@ -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 diff --git a/scriptengines/javascript/data/plasma-scriptengine-applet-declarative.desktop b/scriptengines/javascript/data/plasma-scriptengine-applet-declarative.desktop index f25f738e9..6f9730a5f 100644 --- a/scriptengines/javascript/data/plasma-scriptengine-applet-declarative.desktop +++ b/scriptengines/javascript/data/plasma-scriptengine-applet-declarative.desktop @@ -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 QML‑u 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 QML‑u 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 diff --git a/scriptengines/javascript/data/plasma-scriptengine-applet-simple-javascript.desktop b/scriptengines/javascript/data/plasma-scriptengine-applet-simple-javascript.desktop index 1d0947518..422d20385 100644 --- a/scriptengines/javascript/data/plasma-scriptengine-applet-simple-javascript.desktop +++ b/scriptengines/javascript/data/plasma-scriptengine-applet-simple-javascript.desktop @@ -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 diff --git a/scriptengines/javascript/data/plasma-scriptengine-dataengine-javascript.desktop b/scriptengines/javascript/data/plasma-scriptengine-dataengine-javascript.desktop index fa57a8651..3b0c00e8a 100644 --- a/scriptengines/javascript/data/plasma-scriptengine-dataengine-javascript.desktop +++ b/scriptengines/javascript/data/plasma-scriptengine-dataengine-javascript.desktop @@ -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 資料引擎 diff --git a/scriptengines/javascript/data/plasma-scriptengine-runner-javascript.desktop b/scriptengines/javascript/data/plasma-scriptengine-runner-javascript.desktop index f752d4c8a..5f47b3933 100644 --- a/scriptengines/javascript/data/plasma-scriptengine-runner-javascript.desktop +++ b/scriptengines/javascript/data/plasma-scriptengine-runner-javascript.desktop @@ -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 執行器 diff --git a/scriptengines/javascript/declarative/packageaccessmanager.cpp b/scriptengines/javascript/declarative/packageaccessmanager.cpp index 9e12194a6..b9f9b0b8e 100644 --- a/scriptengines/javascript/declarative/packageaccessmanager.cpp +++ b/scriptengines/javascript/declarative/packageaccessmanager.cpp @@ -39,6 +39,8 @@ public: qint64 readData(char *data, qint64 maxSize) { + Q_UNUSED(data); + Q_UNUSED(maxSize); return 0; } diff --git a/scriptengines/javascript/plasmoid/declarativeappletscript.cpp b/scriptengines/javascript/plasmoid/declarativeappletscript.cpp index b7d676f10..6f5cc956d 100644 --- a/scriptengines/javascript/plasmoid/declarativeappletscript.cpp +++ b/scriptengines/javascript/plasmoid/declarativeappletscript.cpp @@ -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 DeclarativeAppletScript::contextualActions() +{ + return m_interface->contextualActions(); +} + QScriptEngine *DeclarativeAppletScript::engine() const { return m_engine; diff --git a/scriptengines/javascript/plasmoid/declarativeappletscript.h b/scriptengines/javascript/plasmoid/declarativeappletscript.h index 8fd0e5629..d1c9d5f65 100644 --- a/scriptengines/javascript/plasmoid/declarativeappletscript.h +++ b/scriptengines/javascript/plasmoid/declarativeappletscript.h @@ -49,7 +49,7 @@ public: QString filePath(const QString &type, const QString &file) const; - void executeAction(const QString &name); + QList 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; diff --git a/scriptengines/javascript/plasmoid/simplejavascriptapplet.cpp b/scriptengines/javascript/plasmoid/simplejavascriptapplet.cpp index 0076cd882..dba71f2a4 100644 --- a/scriptengines/javascript/plasmoid/simplejavascriptapplet.cpp +++ b/scriptengines/javascript/plasmoid/simplejavascriptapplet.cpp @@ -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); diff --git a/scriptengines/javascript/simplebindings/dataengine.cpp b/scriptengines/javascript/simplebindings/dataengine.cpp index 98837b2ea..299e00c2f 100644 --- a/scriptengines/javascript/simplebindings/dataengine.cpp +++ b/scriptengines/javascript/simplebindings/dataengine.cpp @@ -54,13 +54,19 @@ void serviceJobFromQScriptValue(const QScriptValue &scriptValue, ServiceJobPtr & serviceJob = static_cast(obj); } +typedef QMap< QString, QString > StringStringMap; +Q_DECLARE_METATYPE(StringStringMap) + void registerDataEngineMetaTypes(QScriptEngine *engine) { qRegisterMetaType("Plasma::DataEngine::Data"); qRegisterMetaType("DataEngine::Data"); - qScriptRegisterMapMetaType(engine); + qScriptRegisterVariantMapMetaType(engine); + qScriptRegisterMapMetaType(engine); qScriptRegisterMetaType(engine, qScriptValueFromService, serviceFromQScriptValue); qScriptRegisterMetaType(engine, qScriptValueFromDataEngine, dataEngineFromQScriptValue); qScriptRegisterMetaType(engine, qScriptValueFromServiceJob, serviceJobFromQScriptValue); + qRegisterMetaType("Service*"); + qRegisterMetaType("ServiceJob*"); } diff --git a/scriptengines/javascript/simplebindings/dataengine.h b/scriptengines/javascript/simplebindings/dataengine.h index 2774ee9a8..02fda0124 100644 --- a/scriptengines/javascript/simplebindings/dataengine.h +++ b/scriptengines/javascript/simplebindings/dataengine.h @@ -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 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 +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 +int qScriptRegisterVariantMapMetaType( + QScriptEngine *engine, + const QScriptValue &prototype = QScriptValue() +#ifndef qdoc + , T * /* dummy */ = 0 +#endif +) +{ + return qScriptRegisterMetaType(engine, qScriptValueFromVariantMap, qScriptValueToMap, prototype); +} + template int qScriptRegisterMapMetaType( QScriptEngine *engine, diff --git a/scriptengines/javascript/simplebindings/icon.cpp b/scriptengines/javascript/simplebindings/icon.cpp index 0b5a5f7f9..62055a571 100644 --- a/scriptengines/javascript/simplebindings/icon.cpp +++ b/scriptengines/javascript/simplebindings/icon.cpp @@ -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); diff --git a/scriptengines/javascript/simplebindings/pixmap.cpp b/scriptengines/javascript/simplebindings/pixmap.cpp index b1f47a3a7..0719dc7d5 100644 --- a/scriptengines/javascript/simplebindings/pixmap.cpp +++ b/scriptengines/javascript/simplebindings/pixmap.cpp @@ -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)); diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 575dea7b8..555096d88 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1 +1,2 @@ add_subdirectory(plasmapkg) +add_subdirectory(plasma-remote-helper) diff --git a/tools/plasma-remote-helper/CMakeLists.txt b/tools/plasma-remote-helper/CMakeLists.txt new file mode 100644 index 000000000..c2eddb20a --- /dev/null +++ b/tools/plasma-remote-helper/CMakeLists.txt @@ -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}) + diff --git a/tools/plasma-remote-helper/Messages.sh b/tools/plasma-remote-helper/Messages.sh new file mode 100755 index 000000000..7b98af468 --- /dev/null +++ b/tools/plasma-remote-helper/Messages.sh @@ -0,0 +1,2 @@ +#! /usr/bin/env bash +$XGETTEXT *.cpp -o $podir/plasma-remote-helper.pot diff --git a/tools/plasma-remote-helper/main.cpp b/tools/plasma-remote-helper/main.cpp new file mode 100644 index 000000000..cda83ab0c --- /dev/null +++ b/tools/plasma-remote-helper/main.cpp @@ -0,0 +1,81 @@ +/* Copyright 2011 Kevin Ottens + + 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 + +#include +#include + +#include +#include +#include + +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 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("+", 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); +} + diff --git a/tools/plasmapkg/main.cpp b/tools/plasmapkg/main.cpp index a113a1b74..b4241eceb 100644 --- a/tools/plasmapkg/main.cpp +++ b/tools/plasmapkg/main.cpp @@ -18,6 +18,7 @@ */ #include +#include #include #include @@ -74,41 +75,93 @@ void listPackages(const QStringList& types) } } +void renderTypeTable(const QMap &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 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 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 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 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()); } } }