diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b60011de..d9663e8c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,7 +46,7 @@ find_package(Qt5 REQUIRED NO_MODULE COMPONENTS Quick X11Extras Sql UiTools Qml W find_package(KF5 CONFIG REQUIRED IdleTime ItemModels WidgetsAddons WindowSystem Codecs Archive CoreAddons Solid ThreadWeaver GlobalAccel Config Auth JS Wallet DBusAddons I18n GuiAddons ConfigWidgets Service ItemViews Notifications IconThemes Completion JobWidgets Sonnet TextWidgets XmlGui Crash - Bookmarks Declarative UnitConversion Parts Kross KIO DNSSD KDE4Support) + Bookmarks Declarative UnitConversion Parts Kross KIO DNSSD) find_package(KActivities 5.0.0 CONFIG REQUIRED) diff --git a/examples/applets/dataenginemodel/metadata.desktop b/examples/applets/dataenginemodel/metadata.desktop index 58e73665f..055b5e84a 100644 --- a/examples/applets/dataenginemodel/metadata.desktop +++ b/examples/applets/dataenginemodel/metadata.desktop @@ -1,5 +1,6 @@ [Desktop Entry] Comment=Example applet that shows how to use Models embedded in DataEngines +Comment[de]=Miniprogramm-Beispiel, das die Anwendung von Modellen eingebettet in Datenquellen zeigt Comment[nl]=Voorbeeld van applet dat toont hoe modellen ingebed in gegevensengines zijn te gebruiken Comment[pt]=Uma 'applet' de exemplo que demonstra como usar os modelos incorporados em motores de dados Comment[pt_BR]=Uma miniaplicativo de exemplo que mostra como usar os modelos integrados em mecanismos de dados diff --git a/src/declarativeimports/core/dialog.cpp b/src/declarativeimports/core/dialog.cpp index 2ab823c0c..cb55ae4f1 100644 --- a/src/declarativeimports/core/dialog.cpp +++ b/src/declarativeimports/core/dialog.cpp @@ -134,7 +134,6 @@ void DialogProxy::onVisibleChanged() if (geometry() != screen()->availableGeometry()) { m_cachedGeometry = geometry(); } - setPosition(screen()->availableGeometry().topLeft()); setGeometry(screen()->availableGeometry()); } else { if (!m_cachedGeometry.isNull()) { @@ -412,8 +411,6 @@ void DialogProxy::syncBorders() { const QRect avail = screen()->availableGeometry(); - m_frameSvgItem->setEnabledBorders(Plasma::FrameSvg::AllBorders); - int borders = Plasma::FrameSvg::AllBorders; //Tooltips always have all the borders diff --git a/src/declarativeimports/plasmacomponents/qml/ModelContextMenu.qml b/src/declarativeimports/plasmacomponents/qml/ModelContextMenu.qml new file mode 100644 index 000000000..01c78cd18 --- /dev/null +++ b/src/declarativeimports/plasmacomponents/qml/ModelContextMenu.qml @@ -0,0 +1,83 @@ +/* + * Copyright 2014 David Edmundson + * + * 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 org.kde.plasma.components 2.0 as PlasmaComponents + +import QtQuick 2.0 + +/** + * A ModelMenu creates a context menu with items populated from a model or a QList + * For standard item models, actions are created using the following model role names or properties + * display - a string contains the action name + * decoration - an icon to display + * separator - boolean that will add a seperator in the list + * + * + * + * Example code: + * + * @code + * ModelMenu { + * id: menu + * visualParent: someButton + * model: myModel + * } + * + * Button { + * id: someButton + * onClicked: menu.popup() + * } + * @endcode + */ + +PlasmaComponents.ContextMenu { + id: menu + + /** + * The model containing menu items + */ + property alias model: repeater.model + + /** + * This signal is emitted when a menu item is clicked. + * The attached model properties for that menu item are passed as an argument + */ + signal clicked(QtObject model) + + //ContextMenu cannot have child items, so in order to have ContextMenu as the root object of this item + //we create a new property which contains an item which can then load the child items + property Item _children : Item { + Repeater { + id: repeater + delegate: PlasmaComponents.MenuItem { + //for QList Repeater adds an attached property modelData + //for QAbstractItemModel* it doesn't. Not checking causes errors + text: typeof(modelData) != "undefined" ? modelData.text : model.display + icon: typeof(modelData) != "undefined" ? modelData.icon : model.decoration + separator: typeof(modelData) != "undefined" ? modelData.separator : model.separator + onClicked: { + menu.clicked(typeof(modelData) != "undefined" ? modelData : model) + } + Component.onCompleted: { + parent = menu + } + } + } + } +} diff --git a/src/declarativeimports/plasmacomponents/qml/qmldir b/src/declarativeimports/plasmacomponents/qml/qmldir index ee8edee47..abf7f7ca7 100644 --- a/src/declarativeimports/plasmacomponents/qml/qmldir +++ b/src/declarativeimports/plasmacomponents/qml/qmldir @@ -13,6 +13,7 @@ Dialog 2.0 Dialog.qml Highlight 2.0 Highlight.qml Label 2.0 Label.qml ListItem 2.0 ListItem.qml +ModelContextMenu 2.0 ModelContextMenu.qml Page 2.0 Page.qml PageStack 2.0 PageStack.qml ProgressBar 2.0 ProgressBar.qml diff --git a/src/plasma/CMakeLists.txt b/src/plasma/CMakeLists.txt index aced599c4..064d3ccab 100644 --- a/src/plasma/CMakeLists.txt +++ b/src/plasma/CMakeLists.txt @@ -148,7 +148,6 @@ PRIVATE KF5::XmlGui KF5::GlobalAccel KF5::DNSSD - KF5::KDE4Support #ksharedptr ${PLASMA_EXTRA_LIBS} ) diff --git a/src/plasma/private/svg_p.h b/src/plasma/private/svg_p.h index 5fdebf390..16ed29638 100644 --- a/src/plasma/private/svg_p.h +++ b/src/plasma/private/svg_p.h @@ -21,21 +21,19 @@ #define PLASMA_SVG_P_H #include -#include +#include #include - -#include "ksharedptr.h" +#include namespace Plasma { class Svg; -class SharedSvgRenderer : public QSvgRenderer, public QSharedData +class SharedSvgRenderer : public QSvgRenderer { public: - typedef KSharedPtr Ptr; - + typedef QSharedPointer Ptr; SharedSvgRenderer(QObject *parent = 0); SharedSvgRenderer( const QString &filename, @@ -94,7 +92,7 @@ public: void themeChanged(); void colorsChanged(); - static QHash s_renderers; + static QHash > s_renderers; static QWeakPointer s_systemColorsCache; Svg *q; diff --git a/src/plasma/svg.cpp b/src/plasma/svg.cpp index 6542b34bb..ae9778330 100644 --- a/src/plasma/svg.cpp +++ b/src/plasma/svg.cpp @@ -36,7 +36,6 @@ #include #include #include -#include #include "applet.h" #include "package.h" @@ -419,17 +418,15 @@ void SvgPrivate::createRenderer() QString styleSheet = cacheAndColorsTheme()->d->svgStyleSheet(); styleCrc = qChecksum(styleSheet.toUtf8(), styleSheet.size()); - QHash::const_iterator it = s_renderers.constFind(styleCrc + path); + QHash >::const_iterator it = s_renderers.constFind(styleCrc + path); - if (it != s_renderers.constEnd()) { - //qDebug() << "gots us an existing one!"; - renderer = it.value(); - } else { + renderer = it == s_renderers.constEnd() ? QWeakPointer() : it.value(); + if (!renderer) { if (path.isEmpty()) { - renderer = new SharedSvgRenderer(); + renderer.reset(new SharedSvgRenderer()); } else { QHash interestingElements; - renderer = new SharedSvgRenderer(path, styleSheet, interestingElements); + renderer.reset(new SharedSvgRenderer(path, styleSheet, interestingElements)); // Add interesting elements to the theme's rect cache. QHashIterator i(interestingElements); @@ -455,16 +452,15 @@ void SvgPrivate::createRenderer() void SvgPrivate::eraseRenderer() { - if (renderer && renderer.count() == 2) { - // this and the cache reference it - s_renderers.erase(s_renderers.find(styleCrc + path)); - - if (theme) { + if (renderer) { + QWeakPointer guard = renderer; + renderer.reset(); + if (guard.isNull() && theme) { + // no SvgPrivate instance references this anymore theme.data()->releaseRectsCache(path); } } - renderer = 0; styleCrc = 0; localRectCache.clear(); elementsWithSizeHints.clear(); @@ -646,7 +642,7 @@ void SvgPrivate::colorsChanged() emit q->repaintNeeded(); } -QHash SvgPrivate::s_renderers; +QHash > SvgPrivate::s_renderers; QWeakPointer SvgPrivate::s_systemColorsCache; Svg::Svg(QObject *parent)