Merge PR #224: Add support for browsing things

This commit is contained in:
Jenkins 2019-07-18 01:18:14 +02:00
commit 6c9d6999f5
61 changed files with 4273 additions and 248 deletions

View File

@ -21,6 +21,8 @@
#include "devicemanager.h"
#include "engine.h"
#include "jsonrpc/jsontypes.h"
#include "types/browseritems.h"
#include "types/browseritem.h"
#include <QMetaEnum>
DeviceManager::DeviceManager(JsonRpcClient* jsonclient, QObject *parent) :
@ -312,7 +314,7 @@ void DeviceManager::editDeviceResponse(const QVariantMap &params)
void DeviceManager::executeActionResponse(const QVariantMap &params)
{
// qDebug() << "Execute Action response" << params;
qDebug() << "Execute Action response" << params;
emit executeActionReply(params);
}
@ -425,3 +427,156 @@ int DeviceManager::executeAction(const QUuid &deviceId, const QUuid &actionTypeI
return m_jsonClient->sendCommand("Actions.ExecuteAction", p, this, "executeActionResponse");
}
BrowserItems *DeviceManager::browseDevice(const QUuid &deviceId, const QString &itemId)
{
QVariantMap params;
params.insert("deviceId", deviceId.toString());
params.insert("itemId", itemId);
int id = m_jsonClient->sendCommand("Devices.BrowseDevice", params, this, "browseDeviceResponse");
// Intentionally not parented. The caller takes ownership and needs to destroy when not needed any more.
BrowserItems *itemModel = new BrowserItems(deviceId, itemId);
itemModel->setBusy(true);
QPointer<BrowserItems> itemModelPtr(itemModel);
m_browsingRequests.insert(id, itemModelPtr);
return itemModel;
}
void DeviceManager::refreshBrowserItems(BrowserItems *browserItems)
{
QVariantMap params;
params.insert("deviceId", browserItems->deviceId().toString());
params.insert("itemId", browserItems->itemId());
int id = m_jsonClient->sendCommand("Devices.BrowseDevice", params, this, "browseDeviceResponse");
// Intentionally not parented. The caller takes ownership and needs to destroy when not needed any more.
browserItems->setBusy(true);
QPointer<BrowserItems> itemModelPtr(browserItems);
m_browsingRequests.insert(id, browserItems);
}
BrowserItem *DeviceManager::browserItem(const QUuid &deviceId, const QString &itemId)
{
QVariantMap params;
params.insert("deviceId", deviceId.toString());
params.insert("itemId", itemId);
int id = m_jsonClient->sendCommand("Devices.GetBrowserItem", params, this, "browserItemResponse");
// Intentionally not parented. The caller takes ownership and needs to destroy when not needed any more.
BrowserItem *item = new BrowserItem(itemId);
QPointer<BrowserItem> itemPtr(item);
m_browserDetailsRequests.insert(id, itemPtr);
return item;
}
void DeviceManager::browseDeviceResponse(const QVariantMap &params)
{
qDebug() << "Browsing response:" << qUtf8Printable(QJsonDocument::fromVariant(params).toJson(QJsonDocument::Indented));
int id = params.value("id").toInt();
if (!m_browsingRequests.contains(id)) {
qWarning() << "Received a browsing reply for an id we don't know.";
return;
}
QPointer<BrowserItems> itemModel = m_browsingRequests.take(id);
if (!itemModel) {
qDebug() << "BrowserItems model seems to have disappeared. Discarding browsing result.";
return;
}
QList<BrowserItem*> itemsToRemove = itemModel->list();
foreach (const QVariant &itemVariant, params.value("params").toMap().value("items").toList()) {
QVariantMap itemMap = itemVariant.toMap();
QString itemId = itemMap.value("id").toString();
BrowserItem *item = itemModel->getBrowserItem(itemId);
if (!item) {
item = new BrowserItem(itemId, this);
itemModel->addBrowserItem(item);
}
item->setDisplayName(itemMap.value("displayName").toString());
item->setDescription(itemMap.value("description").toString());
item->setIcon(itemMap.value("icon").toString());
item->setThumbnail(itemMap.value("thumbnail").toString());
item->setExecutable(itemMap.value("executable").toBool());
item->setBrowsable(itemMap.value("browsable").toBool());
item->setDisabled(itemMap.value("disabled").toBool());
item->setActionTypeIds(itemMap.value("actionTypeIds").toStringList());
item->setMediaIcon(itemMap.value("mediaIcon").toString());
if (itemsToRemove.contains(item)) {
itemsToRemove.removeAll(item);
}
}
while (!itemsToRemove.isEmpty()) {
BrowserItem *item = itemsToRemove.takeFirst();
itemModel->removeItem(item);
}
itemModel->setBusy(false);
}
void DeviceManager::browserItemResponse(const QVariantMap &params)
{
qDebug() << "Browser item details response:" << qUtf8Printable(QJsonDocument::fromVariant(params).toJson(QJsonDocument::Indented));
int id = params.value("id").toInt();
if (!m_browserDetailsRequests.contains(id)) {
qWarning() << "Received a browser item details reply for an id we don't know.";
return;
}
QPointer<BrowserItem> item = m_browserDetailsRequests.take(id);
if (!item) {
qDebug() << "BrowserItem seems to have disappeared. Discarding browser item details result.";
return;
}
QVariantMap itemMap = params.value("params").toMap().value("item").toMap();
item->setDisplayName(itemMap.value("displayName").toString());
item->setDescription(itemMap.value("description").toString());
item->setIcon(itemMap.value("icon").toString());
item->setThumbnail(itemMap.value("thumbnail").toString());
item->setExecutable(itemMap.value("executable").toBool());
item->setBrowsable(itemMap.value("browsable").toBool());
item->setDisabled(itemMap.value("disabled").toBool());
item->setActionTypeIds(itemMap.value("actionTypeIds").toStringList());
item->setMediaIcon(itemMap.value("mediaIcon").toString());
}
int DeviceManager::executeBrowserItem(const QUuid &deviceId, const QString &itemId)
{
QVariantMap params;
params.insert("deviceId", deviceId);
params.insert("itemId", itemId);
return m_jsonClient->sendCommand("Actions.ExecuteBrowserItem", params, this, "executeBrowserItemResponse");
}
void DeviceManager::executeBrowserItemResponse(const QVariantMap &params)
{
qDebug() << "Execute Browser Item finished" << params;
emit executeBrowserItemReply(params);
}
int DeviceManager::executeBrowserItemAction(const QUuid &deviceId, const QString &itemId, const QUuid &actionTypeId, const QVariantList &params)
{
QVariantMap data;
data.insert("deviceId", deviceId);
data.insert("itemId", itemId);
data.insert("actionTypeId", actionTypeId);
data.insert("params", params);
qDebug() << "params:" << params;
return m_jsonClient->sendCommand("Actions.ExecuteBrowserItemAction", data, this, "executeBrowserItemActionResponse");
}
void DeviceManager::executeBrowserItemActionResponse(const QVariantMap &params)
{
qDebug() << "Execute Browser Item Action finished" << params;
emit executeBrowserItemActionReply(params);
}

View File

@ -31,6 +31,9 @@
#include "jsonrpc/jsonhandler.h"
#include "jsonrpc/jsonrpcclient.h"
class BrowserItem;
class BrowserItems;
class DeviceManager : public JsonHandler
{
Q_OBJECT
@ -73,6 +76,11 @@ public:
Q_INVOKABLE void reconfigureDevice(const QUuid &deviceId, const QVariantList &deviceParams);
Q_INVOKABLE void reconfigureDiscoveredDevice(const QUuid &deviceId, const QUuid &deviceDescriptorId);
Q_INVOKABLE int executeAction(const QUuid &deviceId, const QUuid &actionTypeId, const QVariantList &params = QVariantList());
Q_INVOKABLE BrowserItems* browseDevice(const QUuid &deviceId, const QString &itemId = QString());
Q_INVOKABLE void refreshBrowserItems(BrowserItems *browserItems);
Q_INVOKABLE BrowserItem* browserItem(const QUuid &deviceId, const QString &itemId);
Q_INVOKABLE int executeBrowserItem(const QUuid &deviceId, const QString &itemId);
Q_INVOKABLE int executeBrowserItemAction(const QUuid &deviceId, const QString &itemId, const QUuid &actionTypeId, const QVariantList &params = QVariantList());
private:
Q_INVOKABLE void notificationReceived(const QVariantMap &data);
@ -89,6 +97,10 @@ private:
Q_INVOKABLE void editDeviceResponse(const QVariantMap &params);
Q_INVOKABLE void executeActionResponse(const QVariantMap &params);
Q_INVOKABLE void reconfigureDeviceResponse(const QVariantMap &params);
Q_INVOKABLE void browseDeviceResponse(const QVariantMap &params);
Q_INVOKABLE void browserItemResponse(const QVariantMap &params);
Q_INVOKABLE void executeBrowserItemResponse(const QVariantMap &params);
Q_INVOKABLE void executeBrowserItemActionResponse(const QVariantMap &params);
public slots:
void savePluginConfig(const QUuid &pluginId);
@ -102,6 +114,8 @@ signals:
void editDeviceReply(const QVariantMap &params);
void reconfigureDeviceReply(const QVariantMap &params);
void executeActionReply(const QVariantMap &params);
void executeBrowserItemReply(const QVariantMap &params);
void executeBrowserItemActionReply(const QVariantMap &params);
void fetchingDataChanged();
void notificationReceived(const QString &deviceId, const QString &eventTypeId, const QVariantList &params);
@ -117,6 +131,9 @@ private:
JsonRpcClient *m_jsonClient = nullptr;
QHash<int, QPointer<BrowserItems> > m_browsingRequests;
QHash<int, QPointer<BrowserItem> > m_browserDetailsRequests;
};
#endif // DEVICEMANAGER_H

View File

@ -75,6 +75,7 @@ DeviceClass *JsonTypes::unpackDeviceClass(const QVariantMap &deviceClassMap, QOb
deviceClass->setDisplayName(deviceClassMap.value("displayName").toString());
deviceClass->setId(deviceClassMap.value("id").toUuid());
deviceClass->setVendorId(deviceClassMap.value("vendorId").toUuid());
deviceClass->setBrowsable(deviceClassMap.value("browsable").toBool());
QVariantList createMethodsList = deviceClassMap.value("createMethods").toList();
QStringList createMethods;
foreach (QVariant method, createMethodsList) {
@ -126,6 +127,13 @@ DeviceClass *JsonTypes::unpackDeviceClass(const QVariantMap &deviceClassMap, QOb
}
deviceClass->setActionTypes(actionTypes);
// BrowserItemActionTypes
ActionTypes *browserItemActionTypes = new ActionTypes(deviceClass);
foreach (QVariant actionType, deviceClassMap.value("browserItemActionTypes").toList()) {
browserItemActionTypes->addActionType(JsonTypes::unpackActionType(actionType.toMap(), actionTypes));
}
deviceClass->setBrowserItemActionTypes(browserItemActionTypes);
return deviceClass;
}
@ -310,6 +318,9 @@ QVariantList JsonTypes::packRuleActions(RuleActions *ruleActions)
if (!ra->actionTypeId().isNull() && !ra->deviceId().isNull()) {
ruleAction.insert("deviceId", ra->deviceId());
ruleAction.insert("actionTypeId", ra->actionTypeId());
} else if (!ra->deviceId().isNull() && !ra->browserItemId().isEmpty()) {
ruleAction.insert("deviceId", ra->deviceId());
ruleAction.insert("browserItemId", ra->browserItemId());
} else {
ruleAction.insert("interface", ra->interfaceName());
ruleAction.insert("interfaceAction", ra->interfaceAction());

View File

@ -31,6 +31,8 @@
#include "types/statedescriptor.h"
#include "types/stateevaluator.h"
#include "types/stateevaluators.h"
#include "types/browseritems.h"
#include "types/browseritem.h"
#include "models/logsmodel.h"
#include "models/logsmodelng.h"
#include "models/valuelogsproxymodel.h"
@ -109,6 +111,9 @@ void registerQmlTypes() {
qmlRegisterUncreatableType<State>(uri, 1, 0, "State", "Can't create this in QML. Get it from the States.");
qmlRegisterUncreatableType<States>(uri, 1, 0, "States", "Can't create this in QML. Get it from the Device.");
qmlRegisterUncreatableType<BrowserItems>(uri, 1, 0, "BrowserItems", "Can't create this in QML. Get it from DeviceManager.");
qmlRegisterUncreatableType<BrowserItem>(uri, 1, 0, "BrowserItem", "Can't create this in QML. Get it from BroweserItems.");
qmlRegisterUncreatableType<Vendor>(uri, 1, 0, "Vendor", "Can't create this in QML. Get it from the Vendors.");
qmlRegisterUncreatableType<Vendors>(uri, 1, 0, "Vendors", "Can't create this in QML. Get it from the DeviceManager.");
qmlRegisterType<VendorsProxy>(uri, 1, 0, "VendorsProxy");

View File

@ -286,6 +286,9 @@ RuleAction *RuleManager::parseRuleAction(const QVariantMap &ruleAction)
if (ruleAction.contains("deviceId") && ruleAction.contains("actionTypeId")) {
ret->setDeviceId(ruleAction.value("deviceId").toUuid());
ret->setActionTypeId(ruleAction.value("actionTypeId").toUuid());
} else if (ruleAction.contains("deviceId") && ruleAction.contains("browserItemId")) {
ret->setDeviceId(ruleAction.value("deviceId").toUuid());
ret->setBrowserItemId(ruleAction.value("browserItemId").toString());
} else {
ret->setInterfaceName(ruleAction.value("interface").toString());
ret->setInterfaceAction(ruleAction.value("interfaceAction").toString());

View File

@ -8,6 +8,8 @@ QT -= gui
QT += network
HEADERS += \
types/browseritem.h \
types/browseritems.h \
types/networkdevice.h \
types/networkdevices.h \
types/package.h \
@ -62,6 +64,8 @@ HEADERS += \
types/wirelessaccesspoints.h \
SOURCES += \
types/browseritem.cpp \
types/browseritems.cpp \
types/networkdevice.cpp \
types/networkdevices.cpp \
types/package.cpp \

View File

@ -0,0 +1,130 @@
#include "browseritem.h"
BrowserItem::BrowserItem(const QString &id, QObject *parent):
QObject(parent),
m_id(id)
{
}
QString BrowserItem::id() const
{
return m_id;
}
QString BrowserItem::displayName() const
{
return m_displayName;
}
void BrowserItem::setDisplayName(const QString &displayName)
{
if (m_displayName != displayName) {
m_displayName = displayName;
emit displayNameChanged();
}
}
QString BrowserItem::description() const
{
return m_description;
}
void BrowserItem::setDescription(const QString &description)
{
if (m_description != description) {
m_description = description;
emit descriptionChanged();
}
}
QString BrowserItem::icon() const
{
return m_icon;
}
void BrowserItem::setIcon(const QString &icon)
{
if (m_icon != icon) {
m_icon = icon;
emit iconChanged();
}
}
QString BrowserItem::thumbnail() const
{
return m_thumbnail;
}
void BrowserItem::setThumbnail(const QString &thumbnail)
{
if (m_thumbnail != thumbnail) {
m_thumbnail = thumbnail;
emit thumbnailChanged();
}
}
bool BrowserItem::executable() const
{
return m_executable;
}
void BrowserItem::setExecutable(bool executable)
{
if (m_executable != executable) {
m_executable = executable;
emit executableChanged();
}
}
bool BrowserItem::browsable() const
{
return m_browsable;
}
void BrowserItem::setBrowsable(bool browsable)
{
if (m_browsable != browsable) {
m_browsable = browsable;
emit browsableChanged();
}
}
bool BrowserItem::disabled() const
{
return m_disabled;
}
void BrowserItem::setDisabled(bool disabled)
{
if (m_disabled != disabled) {
m_disabled = disabled;
emit disabledChanged();
}
}
QStringList BrowserItem::actionTypeIds() const
{
return m_actionTypeIds;
}
void BrowserItem::setActionTypeIds(const QStringList &actionTypeIds)
{
if (m_actionTypeIds != actionTypeIds) {
m_actionTypeIds = actionTypeIds;
emit actionTypeIdsChanged();
}
}
QString BrowserItem::mediaIcon() const
{
return m_mediaIcon;
}
void BrowserItem::setMediaIcon(const QString &mediaIcon)
{
if (m_mediaIcon != mediaIcon) {
m_mediaIcon = mediaIcon;
emit mediaIconChanged();
}
}

View File

@ -0,0 +1,80 @@
#ifndef BROWSERITEM_H
#define BROWSERITEM_H
#include <QObject>
#include <QUuid>
class BrowserItem : public QObject
{
Q_OBJECT
Q_PROPERTY(QUuid id READ id CONSTANT)
Q_PROPERTY(QString displayName READ displayName NOTIFY displayNameChanged)
Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
Q_PROPERTY(QString icon READ icon NOTIFY iconChanged)
Q_PROPERTY(QString thumbnail READ thumbnail NOTIFY thumbnailChanged)
Q_PROPERTY(bool executable READ executable NOTIFY executableChanged)
Q_PROPERTY(bool browsable READ browsable NOTIFY browsableChanged)
Q_PROPERTY(bool disabled READ disabled NOTIFY disabledChanged)
Q_PROPERTY(QStringList actionTypeIds READ actionTypeIds NOTIFY actionTypeIdsChanged)
Q_PROPERTY(QString mediaIcon READ mediaIcon NOTIFY mediaIconChanged)
public:
explicit BrowserItem(const QString &id, QObject *parent = nullptr);
QString id() const;
QString displayName() const;
void setDisplayName(const QString &displayName);
QString description() const;
void setDescription(const QString &description);
QString icon() const;
void setIcon(const QString &icon);
QString thumbnail() const;
void setThumbnail(const QString &thumbnail);
bool executable() const;
void setExecutable(bool executable);
bool browsable() const;
void setBrowsable(bool browsable);
bool disabled() const;
void setDisabled(bool disabled);
QStringList actionTypeIds() const;
void setActionTypeIds(const QStringList &actionTypeIds);
QString mediaIcon() const;
void setMediaIcon(const QString &mediaIcon);
signals:
void displayNameChanged();
void descriptionChanged();
void iconChanged();
void thumbnailChanged();
void executableChanged();
void browsableChanged();
void disabledChanged();
void actionTypeIdsChanged();
void mediaIconChanged();
private:
QString m_id;
QString m_displayName;
QString m_description;
QString m_icon;
QString m_thumbnail;
bool m_executable = false;
bool m_browsable = false;
bool m_disabled = false;
QStringList m_actionTypeIds;
QString m_mediaIcon;
};
#endif // BROWSERITEM_H

View File

@ -0,0 +1,134 @@
#include "browseritems.h"
#include "browseritem.h"
#include <QDebug>
BrowserItems::BrowserItems(const QUuid &deviceId, const QString &itemId, QObject *parent):
QAbstractListModel (parent),
m_deviceId(deviceId),
m_itemId(itemId)
{
}
BrowserItems::~BrowserItems()
{
qDebug() << "Deleting BrowserItems";
}
QUuid BrowserItems::deviceId() const
{
return m_deviceId;
}
QString BrowserItems::itemId() const
{
return m_itemId;
}
bool BrowserItems::busy() const
{
return m_busy;
}
int BrowserItems::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_list.count();
}
QVariant BrowserItems::data(const QModelIndex &index, int role) const
{
switch (role) {
case RoleId:
return m_list.at(index.row())->id();
case RoleDisplayName:
return m_list.at(index.row())->displayName();
case RoleDescription:
return m_list.at(index.row())->description();
case RoleIcon:
return m_list.at(index.row())->icon();
case RoleThumbnail:
return m_list.at(index.row())->thumbnail();
case RoleExecutable:
return m_list.at(index.row())->executable();
case RoleBrowsable:
return m_list.at(index.row())->browsable();
case RoleActionTypeIds:
return m_list.at(index.row())->actionTypeIds();
case RoleDisabled:
return m_list.at(index.row())->disabled();
case RoleMediaIcon:
return m_list.at(index.row())->mediaIcon();
}
return QVariant();
}
QHash<int, QByteArray> BrowserItems::roleNames() const
{
QHash<int, QByteArray> roles;
roles.insert(RoleId, "id");
roles.insert(RoleDisplayName, "displayName");
roles.insert(RoleDescription, "description");
roles.insert(RoleIcon, "icon");
roles.insert(RoleThumbnail, "thumbnail");
roles.insert(RoleExecutable, "executable");
roles.insert(RoleBrowsable, "browsable");
roles.insert(RoleDisabled, "disabled");
roles.insert(RoleActionTypeIds, "actionTypeIds");
roles.insert(RoleMediaIcon, "mediaIcon");
return roles;
}
void BrowserItems::addBrowserItem(BrowserItem *browserItem)
{
browserItem->setParent(this);
beginInsertRows(QModelIndex(), m_list.count(), m_list.count());
m_list.append(browserItem);
endInsertRows();
emit countChanged();
}
void BrowserItems::removeItem(BrowserItem *browserItem)
{
int idx = m_list.indexOf(browserItem);
if (idx < 0) {
return;
}
beginRemoveRows(QModelIndex(), idx, idx);
m_list.takeAt(idx)->deleteLater();
endRemoveRows();
}
QList<BrowserItem *> BrowserItems::list() const
{
return m_list;
}
void BrowserItems::setBusy(bool busy)
{
if (m_busy != busy) {
m_busy = busy;
emit busyChanged();
}
}
BrowserItem *BrowserItems::get(int index) const
{
if (index < 0 || index >= m_list.count()) {
return nullptr;
}
return m_list.at(index);
}
BrowserItem *BrowserItems::getBrowserItem(const QString &itemId)
{
foreach (BrowserItem *item, m_list) {
if (item->id() == itemId) {
return item;
}
}
return nullptr;
}

View File

@ -0,0 +1,66 @@
#ifndef BROWSERITEMS_H
#define BROWSERITEMS_H
#include <QAbstractListModel>
#include <QUuid>
class BrowserItem;
class BrowserItems: public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
Q_PROPERTY(bool busy READ busy NOTIFY busyChanged)
public:
enum Roles {
RoleId,
RoleDisplayName,
RoleDescription,
RoleIcon,
RoleThumbnail,
RoleBrowsable,
RoleExecutable,
RoleDisabled,
RoleActionTypeIds,
RoleMediaIcon,
};
Q_ENUM(Roles)
explicit BrowserItems(const QUuid &deviceId, const QString &itemId, QObject *parent = nullptr);
virtual ~BrowserItems() override;
QUuid deviceId() const;
QString itemId() const;
bool busy() const;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
virtual QHash<int, QByteArray> roleNames() const override;
virtual void addBrowserItem(BrowserItem *browserItem);
void removeItem(BrowserItem *browserItem);
QList<BrowserItem*> list() const;
void setBusy(bool busy);
Q_INVOKABLE virtual BrowserItem* get(int index) const;
Q_INVOKABLE virtual BrowserItem* getBrowserItem(const QString &itemId);
// void clear();
signals:
void countChanged();
void busyChanged();
protected:
bool m_busy = false;
QList<BrowserItem*> m_list;
QUuid m_deviceId;
QString m_itemId;
};
#endif // BROWSERITEMS_H

View File

@ -167,6 +167,16 @@ QString DeviceClass::baseInterface() const
}
bool DeviceClass::browsable() const
{
return m_browsable;
}
void DeviceClass::setBrowsable(bool browsable)
{
m_browsable = browsable;
}
ParamTypes *DeviceClass::paramTypes() const
{
return m_paramTypes;
@ -251,6 +261,20 @@ void DeviceClass::setActionTypes(ActionTypes *actionTypes)
emit actionTypesChanged();
}
ActionTypes *DeviceClass::browserItemActionTypes() const
{
return m_browserItemActionTypes;
}
void DeviceClass::setBrowserItemActionTypes(ActionTypes *browserActionTypes)
{
if (m_browserItemActionTypes) {
m_browserItemActionTypes->deleteLater();
}
m_browserItemActionTypes = browserActionTypes;
emit browserItemActionTypesChanged();
}
bool DeviceClass::hasActionType(const QString &actionTypeId)
{
foreach (ActionType *actionType, m_actionTypes->actionTypes()) {

View File

@ -46,12 +46,14 @@ class DeviceClass : public QObject
Q_PROPERTY(SetupMethod setupMethod READ setupMethod CONSTANT)
Q_PROPERTY(QStringList interfaces READ interfaces CONSTANT)
Q_PROPERTY(QString baseInterface READ baseInterface CONSTANT)
Q_PROPERTY(bool browsable READ browsable CONSTANT)
Q_PROPERTY(ParamTypes *paramTypes READ paramTypes NOTIFY paramTypesChanged)
Q_PROPERTY(ParamTypes *settingsTypes READ settingsTypes NOTIFY settingsTypesChanged)
Q_PROPERTY(ParamTypes *discoveryParamTypes READ discoveryParamTypes NOTIFY discoveryParamTypesChanged)
Q_PROPERTY(StateTypes *stateTypes READ stateTypes NOTIFY stateTypesChanged)
Q_PROPERTY(EventTypes *eventTypes READ eventTypes NOTIFY eventTypesChanged)
Q_PROPERTY(ActionTypes *actionTypes READ actionTypes NOTIFY actionTypesChanged)
Q_PROPERTY(ActionTypes *browserItemActionTypes READ browserItemActionTypes NOTIFY browserItemActionTypesChanged)
public:
@ -91,6 +93,9 @@ public:
QString baseInterface() const;
bool browsable() const;
void setBrowsable(bool browsable);
ParamTypes *paramTypes() const;
void setParamTypes(ParamTypes *paramTypes);
@ -109,8 +114,20 @@ public:
ActionTypes *actionTypes() const;
void setActionTypes(ActionTypes *actionTypes);
ActionTypes *browserItemActionTypes() const;
void setBrowserItemActionTypes(ActionTypes *browserActionTypes);
Q_INVOKABLE bool hasActionType(const QString &actionTypeId);
signals:
void paramTypesChanged();
void settingsTypesChanged();
void discoveryParamTypesChanged();
void stateTypesChanged();
void eventTypesChanged();
void actionTypesChanged();
void browserItemActionTypesChanged();
private:
QUuid m_id;
QUuid m_vendorId;
@ -120,6 +137,7 @@ private:
QStringList m_createMethods;
SetupMethod m_setupMethod;
QStringList m_interfaces;
bool m_browsable = false;
ParamTypes *m_paramTypes = nullptr;
ParamTypes *m_settingsTypes = nullptr;
@ -127,13 +145,6 @@ private:
StateTypes *m_stateTypes = nullptr;
EventTypes *m_eventTypes = nullptr;
ActionTypes *m_actionTypes = nullptr;
signals:
void paramTypesChanged();
void settingsTypesChanged();
void discoveryParamTypesChanged();
void stateTypesChanged();
void eventTypesChanged();
void actionTypesChanged();
ActionTypes *m_browserItemActionTypes = nullptr;
};
#endif // DEVICECLASS_H

View File

@ -62,6 +62,19 @@ void RuleAction::setInterfaceAction(const QString &interfaceAction)
}
}
QString RuleAction::browserItemId() const
{
return m_browserItemId;
}
void RuleAction::setBrowserItemId(const QString &browserItemId)
{
if (m_browserItemId != browserItemId) {
m_browserItemId = browserItemId;
emit browserItemIdChanged();
}
}
RuleActionParams *RuleAction::ruleActionParams() const
{
return m_ruleActionParams;
@ -72,6 +85,7 @@ RuleAction *RuleAction::clone() const
RuleAction *ret = new RuleAction();
ret->setDeviceId(deviceId());
ret->setActionTypeId(actionTypeId());
ret->setBrowserItemId(browserItemId());
ret->setInterfaceName(interfaceName());
ret->setInterfaceAction(interfaceAction());
for (int i = 0; i < ruleActionParams()->rowCount(); i++) {
@ -88,6 +102,7 @@ bool RuleAction::operator==(RuleAction *other) const
COMPARE(m_actionTypeId, other->actionTypeId());
COMPARE(m_interfaceName, other->interfaceName());
COMPARE(m_interfaceAction, other->interfaceAction());
COMPARE(m_browserItemId, other->browserItemId());
COMPARE_PTR(m_ruleActionParams, other->ruleActionParams());
return true;
}

View File

@ -13,6 +13,7 @@ class RuleAction : public QObject
Q_PROPERTY(QUuid actionTypeId READ actionTypeId WRITE setActionTypeId NOTIFY actionTypeIdChanged)
Q_PROPERTY(QString interfaceName READ interfaceName WRITE setInterfaceName NOTIFY interfaceNameChanged)
Q_PROPERTY(QString interfaceAction READ interfaceAction WRITE setInterfaceAction NOTIFY interfaceActionChanged)
Q_PROPERTY(QString browserItemId READ browserItemId WRITE setBrowserItemId NOTIFY browserItemIdChanged)
Q_PROPERTY(RuleActionParams* ruleActionParams READ ruleActionParams CONSTANT)
public:
@ -30,6 +31,9 @@ public:
QString interfaceAction() const;
void setInterfaceAction(const QString &interfaceAction);
QString browserItemId() const;
void setBrowserItemId(const QString &browserItemId);
RuleActionParams* ruleActionParams() const;
RuleAction *clone() const;
@ -40,12 +44,14 @@ signals:
void actionTypeIdChanged();
void interfaceNameChanged();
void interfaceActionChanged();
bool browserItemIdChanged();
private:
QUuid m_deviceId;
QUuid m_actionTypeId;
QString m_interfaceName;
QString m_interfaceAction;
QString m_browserItemId;
RuleActionParams *m_ruleActionParams;
};

View File

@ -181,5 +181,32 @@
<file>ui/images/lock-closed.svg</file>
<file>ui/images/lock-open.svg</file>
<file>ui/images/system-update.svg</file>
<file>ui/images/folder-symbolic.svg</file>
<file>ui/images/browser/BrowserIconFile.svg</file>
<file>ui/images/browser/BrowserIconFolder.svg</file>
<file>ui/images/browser/MediaBrowserIconSpotify.svg</file>
<file>ui/images/browser/MediaBrowserIconAirable.svg</file>
<file>ui/images/browser/MediaBrowserIconAmazon.svg</file>
<file>ui/images/browser/MediaBrowserIconAux.svg</file>
<file>ui/images/browser/MediaBrowserIconLibrary.svg</file>
<file>ui/images/browser/MediaBrowserIconMusicLibrary.svg</file>
<file>ui/images/browser/MediaBrowserIconNetwork.svg</file>
<file>ui/images/browser/MediaBrowserIconPictureLibrary.svg</file>
<file>ui/images/browser/MediaBrowserIconPlaylist.svg</file>
<file>ui/images/browser/MediaBrowserIconRecentlyPlayed.svg</file>
<file>ui/images/browser/MediaBrowserIconSiriusXM.svg</file>
<file>ui/images/browser/MediaBrowserIconTidal.svg</file>
<file>ui/images/browser/MediaBrowserIconTuneIn.svg</file>
<file>ui/images/browser/MediaBrowserIconUSB.svg</file>
<file>ui/images/browser/MediaBrowserIconVideoLibrary.svg</file>
<file>ui/images/browser/MediaBrowserIconVTuner.svg</file>
<file>ui/images/browser/MediaBrowserIconDisk.svg</file>
<file>ui/images/browser/BrowserIconFavorites.svg</file>
<file>ui/images/browser/BrowserIconMusic.svg</file>
<file>ui/images/browser/BrowserIconPicture.svg</file>
<file>ui/images/browser/BrowserIconVideo.svg</file>
<file>ui/images/browser/BrowserIconApplication.svg</file>
<file>ui/images/browser/BrowserIconDocument.svg</file>
<file>ui/images/browser/BrowserIconPackage.svg</file>
</qresource>
</RCC>

View File

@ -184,5 +184,12 @@
<file>ui/components/UpdateRunningOverlay.qml</file>
<file>ui/connection/SetupWizard.qml</file>
<file>ui/system/NetworkSettingsPage.qml</file>
<file>ui/devicepages/DeviceBrowserPage.qml</file>
<file>ui/devicelistpages/MediaDeviceListPage.qml</file>
<file>ui/components/MediaControls.qml</file>
<file>ui/components/MediaArtworkImage.qml</file>
<file>ui/components/BrowserContextMenu.qml</file>
<file>ui/magic/SelectBrowserItemActionPage.qml</file>
<file>ui/delegates/BrowserItemDelegate.qml</file>
</qresource>
</RCC>

View File

@ -77,8 +77,8 @@ Page {
delegate: NymeaListItemDelegate {
id: ruleDelegate
width: parent.width
iconName: "../images/" + (model.executable ? (iconTag ? iconTag.value : "slideshow") : "magic") + ".svg"
iconColor: model.executable ? (colorTag ? colorTag.value : app.accentColor) : !model.enabled ? "red" : (model.active ? app.accentColor : "grey")
iconName: "../images/" + (model.executable ? (iconTag.value.length > 0 ? iconTag.value : "slideshow") : "magic") + ".svg"
iconColor: model.executable ? (colorTag.value.length > 0 ? colorTag.value : app.accentColor) : !model.enabled ? "red" : (model.active ? app.accentColor : "grey")
text: model.name
canDelete: true

View File

@ -0,0 +1,93 @@
import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1
import Nymea 1.0
import "../delegates"
MeaDialog {
id: root
property Device device
property string itemId
property alias actionTypeIds: actionListView.model
signal activated(var actionTypeId, var params)
standardButtons: Dialog.NoButton
StackView {
id: stackView
Layout.fillWidth: true
Layout.minimumHeight: actionListView.implicitHeight
property var actionTypeId
initialItem: ListView {
id: actionListView
width: parent.width
implicitHeight: contentHeight
interactive: contentHeight > height
clip: true
delegate: NymeaListItemDelegate {
width: parent.width
text: actionType.displayName
progressive: false
property ActionType actionType: root.device.deviceClass.browserItemActionTypes.getActionType(modelData)
onClicked: {
var hasParams = actionType.paramTypes.count > 0
if (hasParams) {
stackView.actionTypeId = actionType.id
stackView.push(paramComponent, {model: actionType.paramTypes})
return;
}
var params = []
root.activated(actionType.id, params)
root.accept()
}
}
}
Component {
id: paramComponent
Repeater {
id: paramListView
delegate: ParamDelegate {
width: parent.width
paramType: paramListView.model.get(index)
}
}
}
}
RowLayout {
Layout.fillWidth: true
Button {
text: qsTr("Cancel")
onClicked: root.reject()
}
Item { Layout.fillWidth: true }
Button {
text: qsTr("OK")
visible: stackView.depth > 1
onClicked: {
var params = []
print("k", stackView.currentItem.count)
for (var i = 0; i < stackView.currentItem.count; i++) {
print("juhu", i)
var param = {}
param["paramTypeId"] = stackView.currentItem.itemAt(i).paramType.id
param["value"] = stackView.currentItem.itemAt(i).value
params.push(param)
}
print("have params", params.length)
root.activated(stackView.actionTypeId, params)
root.accept();
}
}
}
}

View File

@ -9,6 +9,7 @@ Item {
property alias iconName: colorIcon.name
property alias fallbackIconName: fallbackIcon.name
property alias iconColor: colorIcon.color
property alias backgroundImage: background.source
property string text
property bool disconnected: false
property bool batteryCritical: false
@ -24,6 +25,21 @@ Item {
Material.elevation: 1
padding: 0
Image {
id: background
anchors.fill: parent
anchors.margins: 1
z: -1
fillMode: Image.PreserveAspectCrop
// horizontalAlignment: Image.AlignTop
// opacity: .5
// Rectangle {
// anchors.fill: parent
// color: Material.background
// opacity: .5
// }
}
contentItem: ItemDelegate {
padding: 0; topPadding: 0; bottomPadding: 0
onClicked: root.clicked()
@ -35,6 +51,7 @@ Item {
Layout.fillHeight: true
Layout.margins: app.margins
Item {
visible: background.status !== Image.Ready
Layout.fillWidth: true
Layout.fillHeight: true
@ -55,6 +72,7 @@ Item {
Item {
Layout.fillWidth: true
Layout.fillHeight: true
visible: background.status !== Image.Ready
Label {
id: label
@ -77,6 +95,11 @@ Item {
Layout.preferredHeight: app.iconSize + app.margins * 2
visible: root.contentItem.length > 1
Rectangle {
anchors.fill: parent
color: Material.background
}
Rectangle {
anchors.fill: parent
color: Material.foreground

View File

@ -0,0 +1,47 @@
import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1
import QtQuick.Layouts 1.1
import Nymea 1.0
Item {
id: root
property Device device: null
readonly property StateType artworkStateType: device ? device.deviceClass.stateTypes.findByName("artwork") : null
readonly property State artworkState: artworkStateType ? device.states.getState(artworkStateType.id) : null
readonly property StateType playerTypeStateType: device ? device.deviceClass.stateTypes.findByName("playerType") : null
readonly property State playerTypeState: playerTypeStateType ? device.states.getState(playerTypeStateType.id) : null
Pane {
Material.elevation: 2
anchors.centerIn: parent
height: fallback.visible ? Math.min(parent.height, parent.width) : artworkImage.paintedHeight - 1
width: fallback.visible ? Math.min(parent.height, parent.width) : artworkImage.paintedWidth - 1
padding: 0
contentItem: Rectangle {
color: "black"
}
}
Image {
id: artworkImage
anchors.fill: parent
fillMode: Image.PreserveAspectFit
source: root.artworkState.value
visible: source !== ""
}
ColorIcon {
id: fallback
anchors.centerIn: parent
width: Math.min(parent.height, parent.width) - app.margins * 2
height: Math.min(parent.height, parent.width) - app.margins * 2
name: root.playerTypeState.value === "video" ? "../images/stock_video.svg" : "../images/stock_music.svg"
visible: artworkImage.status !== Image.Ready || artworkImage.source === ""
// color: app.primaryColor
color: "white"
}
}

View File

@ -0,0 +1,76 @@
import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1
import QtQuick.Layouts 1.1
import Nymea 1.0
RowLayout {
id: root
implicitHeight: iconSize + app.margins
property Device device: null
property int iconSize: app.iconSize * 1.5
readonly property StateType playbackStateType: device ? device.deviceClass.stateTypes.findByName("playbackStatus") : null
readonly property State playbackState: playbackStateType ? device.states.getState(playbackStateType.id) : null
function executeAction(actionName, params) {
var actionTypeId = device.deviceClass.actionTypes.findByName(actionName).id;
engine.deviceManager.executeAction(device.id, actionTypeId, params)
}
Item { Layout.fillWidth: true }
ProgressButton {
Layout.preferredHeight: root.iconSize * .6
Layout.preferredWidth: height
imageSource: "../images/media-skip-backward.svg"
longpressImageSource: "../images/media-seek-backward.svg"
enabled: root.playbackState.value !== "Stopped"
opacity: enabled ? 1 : .5
repeat: true
onClicked: {
root.executeAction("skipBack")
}
onLongpressed: {
root.executeAction("fastRewind")
}
}
Item { Layout.fillWidth: true }
ProgressButton {
Layout.preferredHeight: root,iconSize
Layout.preferredWidth: height
imageSource: root.playbackState && root.playbackState.value === "Playing" ? "../images/media-playback-pause.svg" : "../images/media-playback-start.svg"
longpressImageSource: "../images/media-playback-stop.svg"
longpressEnabled: root.playbackState.value !== "Stopped"
onClicked: {
if (root.playbackState.value === "Playing") {
root.executeAction("pause")
} else {
root.executeAction("play")
}
}
onLongpressed: {
root.executeAction("stop")
}
}
Item { Layout.fillWidth: true }
ProgressButton {
Layout.preferredHeight: root.iconSize * .6
Layout.preferredWidth: height
imageSource: "../images/media-skip-forward.svg"
longpressImageSource: "../images/media-seek-forward.svg"
enabled: root.playbackState.value !== "Stopped"
opacity: enabled ? 1 : .5
repeat: true
onClicked: {
root.executeAction("skipNext")
}
onLongpressed: {
root.executeAction("fastForward")
}
}
Item { Layout.fillWidth: true }
}

View File

@ -3,10 +3,9 @@ import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1
import QtQuick.Controls.Material 2.1
ToolBar {
Item {
id: root
Material.elevation: 1
implicitHeight: toolBar.implicitHeight + infoPane.height
property string text
property alias backButtonVisible: backButton.visible
property alias menuButtonVisible: menuButton.visible
@ -15,33 +14,103 @@ ToolBar {
signal backPressed();
signal menuPressed();
RowLayout {
id: layout
anchors { fill: parent; leftMargin: app.margins; rightMargin: app.margins }
function showInfo(text, isError, isSticky) {
if (isError === undefined) isError = false;
if (isSticky === undefined) isSticky = false;
HeaderButton {
id: menuButton
objectName: "headerMenuButton"
imageSource: "../images/navigation-menu.svg"
visible: false
onClicked: root.menuPressed();
}
infoPane.text = text;
infoPane.isError = isError;
infoPane.isSticky = isSticky;
HeaderButton {
id: backButton
objectName: "backButton"
imageSource: "../images/back.svg"
onClicked: root.backPressed();
}
Label {
id: label
Layout.fillWidth: true
Layout.fillHeight: true
verticalAlignment: Text.AlignVCenter
font.pixelSize: app.mediumFont
elide: Text.ElideRight
text: root.text
color: app.headerForegroundColor
if (!isSticky) {
infoPaneTimer.start();
}
}
ToolBar {
id: toolBar
Material.elevation: 3
anchors { left: parent.left; top: parent.top; right: parent.right }
RowLayout {
id: layout
anchors { fill: parent; leftMargin: app.margins; rightMargin: app.margins }
HeaderButton {
id: menuButton
objectName: "headerMenuButton"
imageSource: "../images/navigation-menu.svg"
visible: false
onClicked: root.menuPressed();
}
HeaderButton {
id: backButton
objectName: "backButton"
imageSource: "../images/back.svg"
onClicked: root.backPressed();
}
Label {
id: label
Layout.fillWidth: true
Layout.fillHeight: true
verticalAlignment: Text.AlignVCenter
font.pixelSize: app.mediumFont
elide: Text.ElideRight
text: root.text
color: app.headerForegroundColor
}
}
}
Pane {
id: infoPane
Material.elevation: 1
property string text
property bool isError: false
property bool isSticky: false
property bool shown: isSticky || infoPaneTimer.running
visible: height > 0
height: shown ? contentRow.implicitHeight : 0
Behavior on height { NumberAnimation {} }
anchors { left: parent.left; top: toolBar.bottom; right: parent.right }
padding: 0
contentItem: Rectangle {
color: infoPane.isError ? "red" : app.accentColor
implicitHeight: contentRow.implicitHeight
RowLayout {
id: contentRow
anchors { left: parent.left; top: parent.top; right: parent.right; leftMargin: app.margins; rightMargin: app.margins }
Item {
Layout.fillWidth: true
height: app.iconSize
}
Label {
text: infoPane.text
visible: infoPane.alertState
font.pixelSize: app.smallFont
color: "white"
}
ColorIcon {
height: app.iconSize / 2
width: height
visible: true
color: "white"
name: "../images/dialog-warning-symbolic.svg"
}
}
}
}
Timer {
id: infoPaneTimer
interval: 5000
repeat: false
running: false
}
}

View File

@ -15,31 +15,57 @@ SwipeDelegate {
property bool prominentSubText: true
property string iconName
property string fallbackIcon
property int iconSize: app.iconSize
property color iconColor: app.accentColor
property alias iconKeyColor: icon.keyColor
property alias secondaryIconName: secondaryIcon.name
property alias secondaryIconColor: secondaryIcon.color
property alias secondaryIconKeyColor: secondaryIcon.keyColor
property alias secondaryIconClickable: secondaryIconMouseArea.enabled
property alias tertiaryIconName: tertiaryIcon.name
property alias tertiaryIconColor: tertiaryIcon.color
property alias tertiaryIconKeyColor: tertiaryIcon.keyColor
property alias tertiaryIconClickable: tertiaryIconMouseArea.enabled
property alias additionalItem: additionalItemContainer.children
property alias busy: busyIndicator.running
signal deleteClicked()
signal secondaryIconClicked()
contentItem: RowLayout {
id: innerLayout
spacing: app.margins
ColorIcon {
id: icon
Item {
Layout.preferredHeight: root.iconSize
Layout.preferredWidth: height
name: root.iconName
color: root.iconColor
visible: root.iconName
visible: root.iconName || root.fallbackIcon
ColorIcon {
id: icon
anchors.fill: parent
name: root.iconName
color: root.iconColor
visible: root.iconName
}
ColorIcon {
anchors.fill: parent
name: root.fallbackIcon
color: root.iconColor
visible: root.fallbackIcon && (!root.iconName || icon.status === Image.Error)
}
BusyIndicator {
id: busyIndicator
anchors.centerIn: parent
visible: running
running: false
}
}
ColumnLayout {
Layout.fillWidth: true
Layout.fillHeight: true
@ -72,6 +98,13 @@ SwipeDelegate {
Layout.preferredHeight: app.iconSize * .5
Layout.preferredWidth: height
visible: name.length > 0
MouseArea {
id: secondaryIconMouseArea
enabled: false
anchors.fill: parent
anchors.margins: -app.margins
onClicked: root.secondaryIconClicked();
}
}
ColorIcon {
@ -79,6 +112,13 @@ SwipeDelegate {
Layout.preferredHeight: app.iconSize * .5
Layout.preferredWidth: height
visible: name.length > 0
MouseArea {
id: tertiaryIconMouseArea
enabled: false
anchors.fill: parent
anchors.margins: -app.margins
onClicked: root.tertiaryIconClicked();
}
}
ColorIcon {

View File

@ -0,0 +1,40 @@
import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1
import QtQuick.Layouts 1.1
import Nymea 1.0
import "../components"
NymeaListItemDelegate {
id: root
width: parent.width
text: model.displayName
progressive: model.browsable
subText: model.description
prominentSubText: false
iconName: model.thumbnail
fallbackIcon: "../images/browser/" + model.icon + ".svg"
enabled: model.browsable || model.executable
secondaryIconName: model.actionTypeIds.length > 0 ? "../images/navigation-menu.svg" : ""
secondaryIconClickable: true
property Device device: null
onPressAndHold: openContextMenu()
onSecondaryIconClicked: openContextMenu()
signal contextMenuActionTriggered(var actionTypeId, var params)
function openContextMenu() {
if (model.actionTypeIds.length === 0) {
return;
}
var actionDialogComponent = Qt.createComponent(Qt.resolvedUrl("../components/BrowserContextMenu.qml"));
var popup = actionDialogComponent.createObject(root, {device: root.device, title: model.displayName, itemId: model.id, actionTypeIds: model.actionTypeIds});
popup.activated.connect(function(actionTypeId, params) {
root.contextMenuActionTriggered(actionTypeId, params)
})
popup.open()
}
}

View File

@ -0,0 +1,202 @@
import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Controls.Material 2.1
import QtQuick.Layouts 1.1
import Nymea 1.0
import QtGraphicalEffects 1.0
import "../components"
DeviceListPageBase {
id: root
header: NymeaHeader {
text: qsTr("Media")
onBackPressed: pageStack.pop()
}
Flickable {
anchors.fill: parent
contentHeight: contentGrid.implicitHeight
GridLayout {
id: contentGrid
width: parent.width
columns: Math.ceil(width / 500)
rowSpacing: 0
columnSpacing: 0
Repeater {
model: root.devicesProxy
delegate: ItemDelegate {
id: itemDelegate
Layout.preferredWidth: contentGrid.width / contentGrid.columns
property bool inline: width > 500
property Device device: devicesProxy.get(index);
property DeviceClass deviceClass: device.deviceClass
readonly property StateType playbackStateType: deviceClass.stateTypes.findByName("playbackStatus")
readonly property State playbackState: playbackStateType ? device.states.getState(playbackStateType.id) : null
readonly property StateType playerTypeStateType: deviceClass.stateTypes.findByName("playerType")
readonly property State playerTypeState: playerTypeStateType ? device.states.getState(playerTypeStateType.id) : null
bottomPadding: index === ListView.view.count - 1 ? topPadding : 0
contentItem: Pane {
id: contentItem
Material.elevation: 2
leftPadding: 0
rightPadding: 0
topPadding: 0
bottomPadding: 0
contentItem: ItemDelegate {
leftPadding: 0
rightPadding: 0
topPadding: 0
bottomPadding: 0
contentItem: ColumnLayout {
spacing: 0
Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: app.mediumFont + app.margins
color: Qt.rgba(app.foregroundColor.r, app.foregroundColor.g, app.foregroundColor.b, .05)
RowLayout {
anchors { verticalCenter: parent.verticalCenter; left: parent.left; right: parent.right; margins: app.margins }
Label {
Layout.fillWidth: true
text: model.name
elide: Text.ElideRight
}
ColorIcon {
Layout.preferredHeight: app.iconSize * .5
Layout.preferredWidth: height
name: "../images/battery/battery-020.svg"
visible: itemDelegate.deviceClass.interfaces.indexOf("battery") >= 0 && itemDelegate.device.states.getState(itemDelegate.deviceClass.stateTypes.findByName("batteryCritical").id).value === true
}
ColorIcon {
Layout.preferredHeight: app.iconSize * .5
Layout.preferredWidth: height
name: "../images/dialog-warning-symbolic.svg"
visible: itemDelegate.deviceClass.interfaces.indexOf("connectable") >= 0 && itemDelegate.device.states.getState(itemDelegate.deviceClass.stateTypes.findByName("connected").id).value === false
color: "red"
}
}
}
RowLayout {
ColumnLayout {
id: leftColummn
Layout.margins: app.margins
Label {
Layout.fillWidth: true
text: itemDelegate.playbackState.value === "Stopped" ?
qsTr("No playback")
: itemDelegate.device.states.getState(itemDelegate.deviceClass.stateTypes.findByName("title").id).value
horizontalAlignment: Text.AlignHCenter
// font.pixelSize: app.largeFont
elide: Text.ElideRight
}
Label {
Layout.fillWidth: true
text: itemDelegate.device.states.getState(itemDelegate.deviceClass.stateTypes.findByName("artist").id).value
font.pixelSize: app.smallFont
horizontalAlignment: Text.AlignHCenter
elide: Text.ElideRight
}
Label {
Layout.fillWidth: true
text: itemDelegate.device.states.getState(itemDelegate.deviceClass.stateTypes.findByName("collection").id).value
horizontalAlignment: Text.AlignHCenter
font.pixelSize: app.smallFont
elide: Text.ElideRight
}
MediaControls {
visible: itemDelegate.deviceClass.interfaces.indexOf("mediacontroller") >= 0
device: itemDelegate.device
}
}
Item {
Layout.preferredHeight: leftColummn.height + app.margins * 2
Layout.preferredWidth: height * .7
Item {
id: artworkContainer
anchors.fill: parent
Image {
id: artworkImage
width: artworkImage.sourceSize.width * height / artworkImage.sourceSize.height
anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
readonly property StateType artworkStateType: device ? device.deviceClass.stateTypes.findByName("artwork") : null
readonly property State artworkState: artworkStateType ? device.states.getState(artworkStateType.id) : null
source: artworkState ? artworkState.value : ""
}
Rectangle {
visible: artworkImage.status !== Image.Ready || artworkImage.source === ""
anchors.fill: parent
color: "black"
}
ColorIcon {
width: Math.min(parent.width, parent.height) - app.margins * 2
height: width
anchors.centerIn: parent
name: itemDelegate.playerTypeState && itemDelegate.playerTypeState.value === "video" ? "../images/stock_video.svg" : "../images/stock_music.svg"
visible: artworkImage.status !== Image.Ready || artworkImage.source === ""
color: "white"
}
}
Rectangle {
id: maskRect
anchors.centerIn: parent
height: parent.width
width: parent.height
gradient: Gradient {
GradientStop { position: 0; color: "#00FF0000" }
GradientStop { position: 0.2; color: "#15FF0000" }
GradientStop { position: 1; color: "#FFFF0000" }
}
}
ShaderEffect {
anchors.fill: parent
property variant source: ShaderEffectSource {
sourceItem: artworkContainer
hideSource: true
}
property variant mask: ShaderEffectSource {
sourceItem: maskRect
hideSource: true
}
fragmentShader: "
varying highp vec2 qt_TexCoord0;
uniform sampler2D source;
uniform sampler2D mask;
void main(void)
{
highp vec4 sourceColor = texture2D(source, qt_TexCoord0);
highp float alpha = texture2D(mask, vec2(qt_TexCoord0.y, qt_TexCoord0.x)).a;
sourceColor *= alpha;
gl_FragColor = sourceColor;
}
"
}
}
}
}
onClicked: {
enterPage(index, false)
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,89 @@
import QtQuick 2.5
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1
import Nymea 1.0
import "../components"
import "../delegates"
Page {
id: root
header: NymeaHeader {
text: qsTr("Browse %1").arg(root.device.name)
onBackPressed: pageStack.pop()
}
property Device device: null
property string nodeId: ""
Component.onCompleted: {
d.model = engine.deviceManager.browseDevice(root.device.id, root.nodeId);
}
function executeBrowserItem(itemId) {
d.pendingItemId = itemId
d.pendingBrowserItemId = engine.deviceManager.executeBrowserItem(root.device.id, itemId)
}
function executeBrowserItemAction(itemId, actionTypeId, params) {
d.pendingItemId = itemId
d.pendingBrowserItemId = engine.deviceManager.executeBrowserItemAction(root.device.id, itemId, actionTypeId, params)
}
QtObject {
id: d
property BrowserItems model: null
property int pendingBrowserItemId: -1
property string pendingItemId: ""
}
Connections {
target: engine.deviceManager
onExecuteBrowserItemReply: actionExecuted(params)
onExecuteBrowserItemActionReply: actionExecuted(params)
}
function actionExecuted(params) {
print("Execute Action reply:", params, params.id, params["id"], d.pendingBrowserItemId)
if (params.id === d.pendingBrowserItemId) {
d.pendingBrowserItemId = -1;
d.pendingItemId = ""
print("yep finished")
if (params.status !== "success") {
header.showInfo(params.error, true);
} else if (params.params.deviceError !== "DeviceErrorNoError") {
header.showInfo(qsTr("Error: %1").arg(params.params.deviceError), true)
}
}
engine.deviceManager.refreshBrowserItems(d.model)
}
ListView {
id: listView
anchors.fill: parent
model: d.model
ScrollBar.vertical: ScrollBar {}
delegate: BrowserItemDelegate {
id: delegate
busy: d.pendingItemId === model.id
device: root.device
onClicked: {
print("clicked:", model.id)
if (model.executable) {
root.executeBrowserItem(model.id)
} else if (model.browsable) {
pageStack.push(Qt.resolvedUrl("DeviceBrowserPage.qml"), {device: root.device, nodeId: model.id})
}
}
onContextMenuActionTriggered: {
root.executeBrowserItemAction(model.id, actionTypeId, params)
}
}
BusyIndicator {
anchors.centerIn: parent
running: listView.model.busy
visible: running
}
}
}

View File

@ -11,12 +11,29 @@ Page {
property bool showLogsButton: true
property bool showDetailsButton: true
property bool showBrowserButton: true
property bool popStackOnBackButton: true
default property alias data: contentItem.data
signal backPressed()
header: NymeaHeader {
text: device.name
onBackPressed: pageStack.pop()
onBackPressed: {
root.backPressed();
if (root.popStackOnBackButton) {
pageStack.pop()
}
}
HeaderButton {
imageSource: "../images/folder-symbolic.svg"
visible: root.deviceClass.browsable && root.showBrowserButton
onClicked: {
pageStack.push(Qt.resolvedUrl("DeviceBrowserPage.qml"), {device: root.device})
}
}
HeaderButton {
imageSource: "../images/navigation-menu.svg"

View File

@ -6,9 +6,30 @@ import QtGraphicalEffects 1.0
import Nymea 1.0
import "../components"
import "../customviews"
import "../delegates"
DevicePageBase {
id: root
popStackOnBackButton: false
showBrowserButton: false
onBackPressed: {
if (swipeView.currentIndex > 0) {
if (internalPageStack.depth > 1) {
internalPageStack.pop();
} else {
swipeView.currentIndex = 0;
}
} else {
pageStack.pop();
}
}
Component.onCompleted: {
if (root.deviceClass.browsable && playbackState.value === "Stopped") {
swipeView.currentIndex = 1;
}
}
function stateValue(name) {
var stateType = root.deviceClass.stateTypes.findByName(name);
@ -22,134 +43,159 @@ DevicePageBase {
engine.deviceManager.executeAction(device.id, actionTypeId, params)
}
function executeBrowserItem(itemId) {
d.pendingItemId = itemId
d.pendingBrowserItemId = engine.deviceManager.executeBrowserItem(device.id, itemId);
}
function executeBrowserItemAction(itemId, actionTypeId, params) {
print("params2:", JSON.stringify(params))
d.pendingItemId = itemId
d.pendingBrowserItemId = engine.deviceManager.executeBrowserItemAction(device.id, itemId, actionTypeId, params);
}
readonly property State playbackState: device.states.getState(deviceClass.stateTypes.findByName("playbackStatus").id)
GridLayout {
id: contentColumn
anchors.fill: parent
anchors.margins: app.margins
columns: app.landscape ? 2 : 1
columnSpacing: app.margins
rowSpacing: app.margins
QtObject {
id: d
property int pendingBrowserItemId: -1
property string pendingItemId: ""
}
Pane {
Layout.fillWidth: true
Layout.fillHeight: true
Material.elevation: 2
padding: 0
contentItem: Rectangle {
color: app.foregroundColor
Image {
id: artworkImage
anchors.fill: parent
fillMode: Image.PreserveAspectFit
source: root.stateValue("artwork")
}
ColorIcon {
id: fallback
anchors.fill: parent
anchors.margins: app.margins * 2
name: root.stateValue("playerType") === "video" ? "../images/stock_video.svg" : "../images/stock_music.svg"
visible: artworkImage.status !== Image.Ready || artworkImage.source === ""
color: app.primaryColor
}
}
}
ColumnLayout {
Layout.fillWidth: true
spacing: app.margins
Label {
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
maximumLineCount: 2
elide: Text.ElideRight
font.pixelSize: app.largeFont
font.bold: true
text: root.stateValue("title")
}
Label {
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
maximumLineCount: 2
elide: Text.ElideRight
text: root.stateValue("artist")
}
Label {
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
maximumLineCount: 2
elide: Text.ElideRight
text: root.stateValue("collection")
}
RowLayout {
Layout.fillWidth: true
Item { Layout.fillWidth: true }
ProgressButton {
Layout.preferredHeight: app.iconSize
Layout.preferredWidth: height
imageSource: "../images/media-skip-backward.svg"
longpressImageSource: "../images/media-seek-backward.svg"
repeat: true
onClicked: {
root.executeAction("skipBack")
}
onLongpressed: {
root.executeAction("fastRewind")
}
}
Item { Layout.fillWidth: true }
ProgressButton {
Layout.preferredHeight: app.iconSize * 2
Layout.preferredWidth: height
imageSource: root.playbackState.value === "Playing" ? "../images/media-playback-pause.svg" : "../images/media-playback-start.svg"
longpressImageSource: "../images/media-playback-stop.svg"
longpressEnabled: root.playbackState.value !== "Stopped"
onClicked: {
if (root.playbackState.value === "Playing") {
root.executeAction("pause")
} else {
root.executeAction("play")
}
}
onLongpressed: {
root.executeAction("stop")
}
}
Item { Layout.fillWidth: true }
ProgressButton {
Layout.preferredHeight: app.iconSize
Layout.preferredWidth: height
imageSource: "../images/media-skip-forward.svg"
longpressImageSource: "../images/media-seek-forward.svg"
repeat: true
onClicked: {
root.executeAction("skipNext")
}
onLongpressed: {
root.executeAction("fastForward")
}
}
Item { Layout.fillWidth: true }
Connections {
target: engine.deviceManager
onExecuteBrowserItemReply: executionFinished(params)
onExecuteBrowserItemActionReply: executionFinished(params)
}
function executionFinished(params) {
print("Execute reply:", params, params.id, params["id"], d.pendingBrowserItemId)
if (params.id === d.pendingBrowserItemId) {
d.pendingBrowserItemId = -1;
d.pendingItemId = ""
print("yep finished")
if (params.params.deviceError === "DeviceErrorNoError") {
swipeView.currentIndex = 0;
} else {
header.showInfo(qsTr("Error: %1").arg(params.params.deviceError), true)
}
}
}
SwipeView {
id: swipeView
anchors.fill: parent
interactive: root.deviceClass.browsable
Item {
GridLayout {
id: contentColumn
anchors.fill: parent
anchors.margins: app.margins
columns: app.landscape ? 2 : 1
columnSpacing: app.margins
rowSpacing: app.margins
MediaArtworkImage {
Layout.fillHeight: true
Layout.preferredWidth: parent.width / parent.columns
device: root.device
}
ColumnLayout {
Layout.fillWidth: true
spacing: app.margins
Label {
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
maximumLineCount: 2
elide: Text.ElideRight
font.pixelSize: app.largeFont
font.bold: true
text: root.stateValue("title")
}
Label {
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
maximumLineCount: 2
elide: Text.ElideRight
text: root.stateValue("artist")
}
Label {
Layout.fillWidth: true
horizontalAlignment: Text.AlignHCenter
wrapMode: Text.WordWrap
maximumLineCount: 2
elide: Text.ElideRight
text: root.stateValue("collection")
}
MediaControls {
device: root.device
iconSize: app.iconSize * 2
}
}
}
}
Item {
StackView {
id: internalPageStack
anchors.fill: parent
initialItem: internalBrowserPage
Component {
id: internalBrowserPage
ListView {
id: listView
anchors.fill: parent
model: browserItems
ScrollBar.vertical: ScrollBar {}
property string nodeId: ""
// Need to keep a explicit property here or the GC will eat it too early
property BrowserItems browserItems: null
Component.onCompleted: {
browserItems = engine.deviceManager.browseDevice(root.device.id, nodeId);
}
delegate: BrowserItemDelegate {
fallbackIcon: "../images/browser/" + (model.mediaIcon && model.mediaIcon !== "MediaBrowserIconNone" ? model.mediaIcon : model.icon) + ".svg"
busy: d.pendingItemId === model.id
device: root.device
onClicked: {
print("clicked:", model.id)
if (model.executable) {
root.executeBrowserItem(model.id)
} else if (model.browsable) {
internalPageStack.push(internalBrowserPage, {device: root.device, nodeId: model.id})
}
}
onContextMenuActionTriggered: {
root.executeBrowserItemAction(model.id, actionTypeId, params)
}
}
BusyIndicator {
anchors.centerIn: parent
running: listView.model.busy
visible: running
}
}
}
}
}
}
Component {
id: volumeSliderPaneComponent
Dialog {
@ -158,6 +204,7 @@ DevicePageBase {
topPadding: app.margins / 2
rightPadding: 0
bottomPadding: app.margins / 2
modal: true
contentItem: ColumnLayout {
Slider {
@ -193,71 +240,103 @@ DevicePageBase {
footer: Pane {
Material.elevation: 1
height: 50
height: 52
padding: 0
contentItem: RowLayout {
// Item {
// Layout.fillWidth: true; Layout.fillHeight: true
// HeaderButton {
// anchors.centerIn: parent
// imageSource: "../images/media-playlist.svg"
// }
// }
contentItem: ColumnLayout {
Item {
Layout.fillWidth: true; Layout.fillHeight: true
visible: root.deviceClass.interfaces.indexOf("shufflerepeat") >= 0
HeaderButton {
anchors.centerIn: parent
imageSource: root.stateValue("repeat") === "One" ? "../images/media-playlist-repeat-one.svg" : "../images/media-playlist-repeat.svg"
color: root.stateValue("repeat") === "None" ? keyColor : app.accentColor
property var allowedValues: ["None", "All", "One"]
onClicked: {
var params = []
var param = {}
param["paramTypeId"] = root.deviceClass.actionTypes.findByName("repeat").id;
param["value"] = allowedValues[(allowedValues.indexOf(root.stateValue("repeat")) + 1) % 3]
params.push(param)
root.executeAction("repeat", params)
}
Layout.fillWidth: true
Layout.preferredHeight: 2
visible: root.deviceClass.browsable
Rectangle {
height: parent.height
width: parent.width / 2
color: app.accentColor
x: swipeView.currentIndex * width
Behavior on x { NumberAnimation { duration: 150 } }
}
}
Item {
Layout.fillWidth: true; Layout.fillHeight: true
visible: root.deviceClass.interfaces.indexOf("shufflerepeat") >= 0
HeaderButton {
anchors.centerIn: parent
imageSource: "../images/media-playlist-shuffle.svg"
color: root.stateValue("shuffle") ? app.accentColor: keyColor
onClicked: {
var params = []
var param = {}
param["paramTypeId"] = root.deviceClass.actionTypes.findByName("shuffle").id;
param["value"] = !root.stateValue("shuffle")
params.push(param)
root.executeAction("shuffle", params)
RowLayout {
Item {
Layout.fillHeight: true
Layout.preferredWidth: root.deviceClass.browsable && swipeView.currentIndex > 0 ? parent.width / 4 : 0
Behavior on Layout.preferredWidth { NumberAnimation {} }
HeaderButton {
anchors.centerIn: parent
imageSource: "../images/back.svg"
opacity: root.deviceClass.browsable && swipeView.currentIndex == 1 ? 1 : 0
Behavior on opacity { NumberAnimation {} }
onClicked: swipeView.currentIndex = 0
}
}
}
Item {
id: volumeButtonContainer
Layout.fillWidth: true; Layout.fillHeight: true
HeaderButton {
id: volumeButton
anchors.centerIn: parent
imageSource: "../images/audio-speakers-symbolic.svg"
onClicked: {
print("...");
print(volumeButton.x, volumeButton.y)
print(Qt.point(volumeButton.x, volumeButton.y))
print(volumeButton.mapToItem(root, volumeButton.x,0))
var buttonPosition = root.mapFromItem(volumeButtonContainer, volumeButton.x, 0)
var sliderHeight = 200
var props = {}
props["x"] = buttonPosition.x
props["y"] = root.height - sliderHeight - root.footer.height
props["height"] = sliderHeight
var sliderPane = volumeSliderPaneComponent.createObject(root, props)
sliderPane.open()
Item {
Layout.fillWidth: true; Layout.fillHeight: true
visible: root.deviceClass.interfaces.indexOf("shufflerepeat") >= 0
HeaderButton {
anchors.centerIn: parent
imageSource: root.stateValue("repeat") === "One" ? "../images/media-playlist-repeat-one.svg" : "../images/media-playlist-repeat.svg"
color: root.stateValue("repeat") === "None" ? keyColor : app.accentColor
property var allowedValues: ["None", "All", "One"]
onClicked: {
var params = []
var param = {}
param["paramTypeId"] = root.deviceClass.actionTypes.findByName("repeat").id;
param["value"] = allowedValues[(allowedValues.indexOf(root.stateValue("repeat")) + 1) % 3]
params.push(param)
root.executeAction("repeat", params)
}
}
}
Item {
Layout.fillWidth: true; Layout.fillHeight: true
visible: root.deviceClass.interfaces.indexOf("shufflerepeat") >= 0
HeaderButton {
anchors.centerIn: parent
imageSource: "../images/media-playlist-shuffle.svg"
color: root.stateValue("shuffle") ? app.accentColor: keyColor
onClicked: {
var params = []
var param = {}
param["paramTypeId"] = root.deviceClass.actionTypes.findByName("shuffle").id;
param["value"] = !root.stateValue("shuffle")
params.push(param)
root.executeAction("shuffle", params)
}
}
}
Item {
id: volumeButtonContainer
Layout.fillWidth: true; Layout.fillHeight: true
HeaderButton {
id: volumeButton
anchors.centerIn: parent
imageSource: "../images/audio-speakers-symbolic.svg"
onClicked: {
print("...");
print(volumeButton.x, volumeButton.y)
print(Qt.point(volumeButton.x, volumeButton.y))
print(volumeButton.mapToItem(root, volumeButton.x,0))
var buttonPosition = root.mapFromItem(volumeButtonContainer, volumeButton.x, 0)
var sliderHeight = 200
var props = {}
props["x"] = buttonPosition.x
props["y"] = root.height - sliderHeight - root.footer.height
props["height"] = sliderHeight
var sliderPane = volumeSliderPaneComponent.createObject(root, props)
sliderPane.open()
}
}
}
Item {
Layout.fillHeight: true
Layout.preferredWidth: root.deviceClass.browsable && swipeView.currentIndex == 0 ? parent.width / 4 : 0
Behavior on Layout.preferredWidth { NumberAnimation {} }
HeaderButton {
anchors.centerIn: parent
imageSource: "../images/next.svg"
onClicked: swipeView.currentIndex = 1
opacity: root.deviceClass.browsable && swipeView.currentIndex == 0 ? 1 : 0
Behavior on opacity { NumberAnimation {} }
}
}
}

View File

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91 r13725"
viewBox="0 0 96 96.000001"
sodipodi:docname="stock_application04d.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8774395"
inkscape:cx="-39.276042"
inkscape:cy="49.870684"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="false"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="false"
inkscape:guide-bbox="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="-1,6.123234e-17"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="1,0"
position="84,-8.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
<sodipodi:guide
position="92,-8.0000001"
orientation="1,0"
id="guide4760" />
<sodipodi:guide
position="103,12"
orientation="0,1"
id="guide4206" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:16.00316429;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 43.033203 8 C 35.250484 24.47567 28.618983 39.253149 23.072266 52 L 35.111328 52 C 40.040151 40.312853 45.664646 27.27057 51.939453 13.251953 C 58.329407 26.949689 64.047621 40.107692 69.011719 52 L 73.75 52 C 68.209735 38.675566 61.667225 23.637294 54.292969 8.0136719 C 54.294969 8.0086739 54.298781 8.0046981 54.300781 8 L 43.033203 8 z M 15.380859 70 C 12.370121 77.190289 9.8584433 83.346665 8 88 L 20.34375 88 C 22.338134 82.984379 24.809599 76.856258 27.621094 70 L 15.380859 70 z M 76.349609 70 C 79.087239 76.884331 81.469123 83.042129 83.341797 88 L 88.017578 88 C 86.185539 83.125868 83.81163 76.957042 81.056641 70 L 76.349609 70 z "
transform="matrix(0,-1,-1.0003957,0,438.00245,441.36222)"
id="path4177" />
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00019777;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="M 16.001953,50 C 8.9995331,50 7.999996,50 8,57 c 4e-6,7 0.9995331,7 8.001953,7 l 63.996094,0 c 7.00241,0 8.001949,4e-6 8.001953,-7 4e-6,-7.000004 -0.999543,-7 -8.001953,-7 z M 15,54 49,54 c 2.00082,0 3.000004,-4e-6 3,3 -4e-6,3.000004 -0.99918,3 -3,3 l -34,0 c -2.00083,0 -3.000004,4e-6 -3,-3 4e-6,-3.000004 0.99917,-3 3,-3 z"
transform="matrix(0,-1,-1.0003957,0,438.00245,441.36222)"
id="rect4188"
inkscape:connector-curvature="0"
sodipodi:nodetypes="szsszsssszsszs" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,177 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="90"
height="90"
id="svg4874"
version="1.1"
inkscape:version="0.48+devel r"
viewBox="0 0 90 90.000001"
sodipodi:docname="text-x-generic-symbolic.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.259629"
inkscape:cx="5.0926006"
inkscape:cy="70.49882"
inkscape:document-units="px"
inkscape:current-layer="g5283"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="6" />
<sodipodi:guide
orientation="1,0"
position="6,77"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="3,78"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="55,84"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="53,87"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="20,3"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="20,6"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="87,7"
id="guide4075" />
<sodipodi:guide
orientation="1,0"
position="84,7"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="58,81"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="9,74"
id="guide4076" />
<sodipodi:guide
orientation="0,1"
position="21,9"
id="guide4078" />
<sodipodi:guide
orientation="1,0"
position="81,4"
id="guide4080" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-84.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
id="g5283"
transform="matrix(0,-1,-1,0,-293.63782,2219.3622)">
<rect
y="-725.63782"
x="1778"
height="90"
width="90"
id="rect5285"
style="fill:none;stroke:none" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
d="m 9,3 0,84 51,0 3,0 18,-18 0,-3 0,-63 z m 6,6 60,0 0,57 -15,0 0,15 -45,0 z"
transform="translate(1778,-725.63782)"
id="path5289"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccc" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="rect5293"
d="m 1802,-707.63781 42,0 0,3.99999 -42,0 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
d="m 1802,-699.63781 42,0 0,3.99999 -42,0 z"
id="path4615"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path4617"
d="m 1802,-691.63781 42,0 0,3.99999 -42,0 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
d="m 1802,-683.63781 42,0 0,3.99999 -42,0 z"
id="path4619"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path4621"
d="m 1802,-675.63781 21,0 0,3.99999 -21,0 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@ -0,0 +1 @@
../starred.svg

View File

@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="90"
height="90"
id="svg4874"
version="1.1"
inkscape:version="0.48+devel r"
viewBox="0 0 90 90.000001"
sodipodi:docname="empty-symbolic.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="9.9475982"
inkscape:cx="46.217185"
inkscape:cy="7.7254828"
inkscape:document-units="px"
inkscape:current-layer="g5283"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="6" />
<sodipodi:guide
orientation="1,0"
position="6,77"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="3,78"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="55,84"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="53,87"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="20,3"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="20,6"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="87,7"
id="guide4075" />
<sodipodi:guide
orientation="1,0"
position="84,7"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="58,81"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="9,74"
id="guide4076" />
<sodipodi:guide
orientation="0,1"
position="21,9"
id="guide4078" />
<sodipodi:guide
orientation="1,0"
position="81,4"
id="guide4080" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-84.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
id="g5283"
transform="matrix(0,-1,-1,0,-293.63782,2219.3622)">
<rect
y="-725.63782"
x="1778"
height="90"
width="90"
id="rect5285"
style="fill:none;stroke:none" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
d="m 9,3 0,84 51,0 3,0 18,-18 0,-3 0,-63 z m 6,6 60,0 0,57 -15,0 0,15 -45,0 z"
transform="translate(1778,-725.63782)"
id="path5289"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccccccccccccc" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg4874" width="96" height="96" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata id="metadata4879">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1" transform="translate(67.857 -78.505)">
<rect id="rect4782" transform="rotate(90)" x="78.505" y="-28.143" width="96" height="96" style="color:#000000;fill:none"/>
<path id="path4643" d="m-47.869 86.504-0.01172 2e-3c-5.0328 0.05818-8.7136-0.12027-11.725 1.541-1.5055 0.83064-2.6968 2.2356-3.3555 3.9902-0.65866 1.7547-0.89648 3.8364-0.89648 6.4668v54.002c0 2.6304 0.23782 4.7121 0.89648 6.4668 0.65866 1.7546 1.85 3.1596 3.3555 3.9902 3.011 1.6613 6.6918 1.4848 11.725 1.543h0.01172 56.023 0.011719c5.0328-0.0582 8.7136 0.11832 11.725-1.543 1.5055-0.83064 2.6968-2.2356 3.3555-3.9902 0.65866-1.7547 0.89648-3.8364 0.89648-6.4668v-38c0-2.6333-0.24451-4.7263-0.91016-6.4883-0.66565-1.762-1.8593-3.1729-3.3691-4.0117-3.0197-1.6776-6.7207-1.5-11.721-1.5h-46c-5 0-8.701-0.17761-11.721 1.5-1.5098 0.8388-2.7035 2.2497-3.3691 4.0117-0.66565 1.762-0.91016 3.855-0.91016 6.4883v40h4v-40c0-2.3667 0.25549-4.0257 0.65234-5.0762 0.39685-1.0505 0.82821-1.5146 1.5684-1.9258 1.4803-0.82239 4.7793-0.99805 9.7793-0.99805h46c5 0 8.299 0.17566 9.7793 0.99805 0.74015 0.41119 1.1715 0.87528 1.5684 1.9258 0.39685 1.0505 0.65234 2.7095 0.65234 5.0762v38c0 2.3696-0.25037 4.0209-0.64062 5.0606-0.39025 1.0396-0.80933 1.4898-1.543 1.8945-1.4645 0.80804-4.7782 0.98616-9.8164 1.0449h-55.977-0.02344c-5.0383-0.0588-8.3519-0.23688-9.8164-1.0449-0.73364-0.40478-1.1508-0.85491-1.541-1.8945-0.39025-1.0396-0.64258-2.691-0.64258-5.0606v-54.002c0-2.3696 0.25232-4.0209 0.64258-5.0605 0.39025-1.0396 0.80738-1.4898 1.541-1.8945 1.4645-0.80804 4.7782-0.98616 9.8164-1.0449l20.172 2e-3 6 6 33.828-2e-3v-4l-32.172 2e-3 -6-6z" style="color-rendering:auto;color:#000000;dominant-baseline:auto;fill:#808080;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;image-rendering:auto;isolation:auto;mix-blend-mode:normal;shape-padding:0;shape-rendering:auto;solid-color:#000000;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,173 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="stock_music.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8.7812488"
inkscape:cx="56.506765"
inkscape:cy="41.753728"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="false"
inkscape:guide-bbox="true"
inkscape:snap-global="false">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077"
inkscape:locked="false" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076"
inkscape:locked="false" />
<sodipodi:guide
orientation="1,0"
position="84,-8.0000001"
id="guide4080"
inkscape:locked="false" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170"
inkscape:locked="false" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172"
inkscape:locked="false" />
<sodipodi:guide
position="92,-8.0000001"
orientation="1,0"
id="guide4760"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<path
inkscape:connector-curvature="0"
id="path4393"
d="m 434.94803,360.83478 c 0.0125,1.12499 -0.16349,2.62112 -0.46267,4.61114 l -5.32748,33.94069 c -1.70308,7.99492 -2.23261,7.99488 -8.98973,7.99488 h -13.23182 -42.13175 c 0.41314,0.58986 0.82896,1.17197 1.23767,1.78162 h -0.002 c 1.70285,2.54004 2.91458,5.24656 2.9146,8.88277 0,4.55464 -1.74495,7.27171 -4.04296,8.91596 -2.298,1.64421 -5.19476,2.18946 -7.43386,2.18946 -2.70005,0 -5.58147,-0.92217 -7.77745,-2.92125 -2.19598,-1.99908 -3.73443,-5.0725 -3.73449,-9.4916 0,-4.99015 1.39467,-8.50054 4.11712,-10.48487 2.14348,-1.56235 5.00648,-2.4256 8.53879,-2.73391 h 0.006 0.004 c 0.42854,-0.0432 0.86812,-0.0742 1.32161,-0.10147 0.69823,-0.0419 2.00489,-0.0332 2.00489,-0.0332 h 41.97951 c 5.99707,0 6.35516,3e-4 7.72278,-7.99684 l 3.95705,-25.9536 c 1.04913,-8.01156 0.3143,-8.01245 -4.1835,-8.01245 h -38.63347 c 0.41315,0.58987 0.82897,1.17198 1.23769,1.78163 h -0.002 c 1.70285,2.54004 2.91458,5.24655 2.91459,8.88277 0,4.55464 -1.74494,7.27171 -4.04294,8.91594 -2.29802,1.64423 -5.19477,2.18947 -7.43388,2.18947 -2.70004,0 -5.58147,-0.92217 -7.77745,-2.92125 -2.19598,-1.99909 -3.73442,-5.07248 -3.7345,-9.4916 0,-4.99014 1.39468,-8.50055 4.11714,-10.48486 2.14348,-1.56237 5.00647,-2.4256 8.53879,-2.73391 h 0.006 0.004 c 0.42856,-0.0432 0.86813,-0.0742 1.32163,-0.10148 0.69823,-0.0418 2.00488,-0.0331 2.00488,-0.0331 h 45.9775 11.97656 c 5.25982,0 7.00192,0.0341 7.03953,3.4091 z"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:15px;line-height:125%;font-family:Ubuntu;-inkscape-font-specification:Ubuntu;text-align:center;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;display:inline;fill:#808080;fill-opacity:1;stroke:none;stroke-width:3.33608699;enable-background:new" />
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -0,0 +1 @@
../plugin.svg

View File

@ -0,0 +1,175 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="stock_image.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6199992"
inkscape:cx="2.6423423"
inkscape:cy="65.68504"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="92,-8.0000001"
id="guide4075" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="0,1"
position="-5,12"
id="guide4078" />
<sodipodi:guide
orientation="1,0"
position="84,-9.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
inkscape:connector-curvature="0"
id="path4527"
d="m 417.99457,375.36222 c 0,5.52284 -4.47892,10 -10.00397,10 -5.52503,0 -10.00397,-4.47716 -10.00397,-10 0,-5.52284 4.47894,-10 10.00397,-10 5.52505,0 10.00397,4.47715 10.00397,10 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate" />
<path
sodipodi:nodetypes="cccccccccc"
inkscape:connector-curvature="0"
id="rect4520"
d="m 429.99929,433.36135 -80.0299,0 0,-79.99824 80.0299,0 z m -4.00159,-3.99913 0,-72 -60.02374,0 0,72 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;enable-background:accumulate" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:6;marker:none;enable-background:accumulate"
d="m 406.99022,403.98292 -33.01306,17.37932 0,-16.30902 0,-25.691 24.40093,12.84568 -6.87783,3.62069 15.48996,8.15433 z"
id="path4156"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="stock_video.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.024999"
inkscape:cx="32.83274"
inkscape:cy="55.067605"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="92,-8.0000001"
id="guide4075" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="0,1"
position="-5,12"
id="guide4078" />
<sodipodi:guide
orientation="1,0"
position="84,-9.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="M 4 11 L 4 85 L 8 85 L 8 81 L 16 81 L 16 81.001953 L 16 85 L 20 85 L 76 85 L 80 85 L 80 81.001953 L 80 81 L 88 81 L 88 85 L 92 85 L 92 11 L 88 11 L 88 15 L 80 15 L 80 14.998047 L 80 11 L 20 11 L 16 11 L 16 14.998047 L 16 15 L 8 15 L 8 11 L 4 11 z M 20 14.998047 L 76 14.998047 L 76 46 L 20 46 L 20 14.998047 z M 8 21 L 16 21 L 16 27 L 8 27 L 8 21 z M 80 21 L 88 21 L 88 27 L 80 27 L 80 21 z M 8 33 L 16 33 L 16 39 L 8 39 L 8 33 z M 80 33 L 88 33 L 88 39 L 80 39 L 80 33 z M 8 45 L 16 45 L 16 46 L 16 49.998047 L 16 51 L 8 51 L 8 45 z M 80 45 L 88 45 L 88 51 L 80 51 L 80 45 z M 20 49.998047 L 76 49.998047 L 76 81.001953 L 20 81.001953 L 20 49.998047 z M 8 57 L 16 57 L 16 63 L 8 63 L 8 57 z M 80 57 L 88 57 L 88 63 L 80 63 L 80 57 z M 8 69 L 16 69 L 16 75 L 8 75 L 8 69 z M 80 69 L 88 69 L 88 75 L 80 75 L 80 69 z "
transform="matrix(0,-1,-1.0003957,0,438.00245,441.36222)"
id="rect4175" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
viewBox="0 0 25.399999 25.400001"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="MediaBrowserIconAirable.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.9195959"
inkscape:cx="12.366716"
inkscape:cy="58.901736"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="2792"
inkscape:window-height="1698"
inkscape:window-x="88"
inkscape:window-y="44"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid815" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-271.59998)">
<path
style="fill:#808080;stroke-width:0.99999994;fill-opacity:1"
d="m 11.71525,295.52375 c -1.262524,-0.11989 -2.4371381,-0.4226 -3.5766391,-0.92163 -2.6099423,-1.1429 -4.7863242,-3.38259 -5.8667202,-6.03684 -0.5848379,-1.43697 -0.8168005,-2.64908 -0.8168005,-4.268 0,-1.39185 0.1415035,-2.30393 0.5467858,-3.52369 0.5928209,-1.78477 1.4972102,-3.22603 2.8549395,-4.54952 1.7523449,-1.70825 3.912092,-2.75964 6.3667075,-3.09933 0.708043,-0.098 2.242325,-0.098 2.950328,0 2.454644,0.33969 4.614367,1.39108 6.366714,3.09933 1.850447,1.80391 2.975993,4.03339 3.330882,6.59832 0.09795,0.70787 0.09795,2.24224 0,2.95011 -0.288844,2.08749 -1.10284,3.97841 -2.416759,5.61406 -0.4613,0.574 -1.372438,1.45579 -1.95715,1.89409 -1.585855,1.1883 -3.380796,1.92764 -5.303196,2.18401 -0.587982,0.0789 -1.936303,0.1105 -2.479092,0.0588 z m 1.890855,-2.04923 c 3.174891,-0.32014 5.963496,-2.26436 7.37341,-5.14091 2.236351,-4.56229 0.338099,-10.07055 -4.244605,-12.31701 -4.562411,-2.23628 -10.0707499,-0.33799 -12.3170314,4.24469 -2.2363329,4.56228 -0.3381117,10.07052 4.244598,12.31702 0.9254842,0.45363 2.0768864,0.78989 3.0548574,0.89196 0.497425,0.0527 1.395772,0.0537 1.888771,0.0115 z m -2.166663,-1.10454 c -1.267125,-0.17879 -2.0726418,-0.82804 -2.3644136,-1.90552 -0.1028136,-0.37966 -0.1261256,-1.04757 -0.049167,-1.40809 0.22431,-1.05098 1.0612796,-1.77203 2.2883956,-1.971 0.141667,-0.0237 0.918737,-0.0415 1.726777,-0.0415 l 1.469232,-0.002 -0.01556,-0.64539 c -0.01422,-0.5897 -0.02443,-0.66495 -0.121124,-0.87264 -0.292338,-0.62858 -0.808637,-0.87023 -1.859396,-0.87023 -0.871493,0 -1.294407,0.14479 -1.748291,0.59862 -0.281877,0.28183 -0.178604,0.32417 -0.9285479,-0.38036 l -0.4997517,-0.46946 0.2155618,-0.22042 c 0.7805518,-0.79836 1.7869228,-1.12282 3.2888378,-1.06058 1.272886,0.053 2.054727,0.31738 2.674977,0.90517 0.242341,0.22966 0.333483,0.35368 0.481826,0.6556 0.329234,0.67017 0.317616,0.52169 0.335153,4.2755 l 0.01554,3.32935 h -0.90196 -0.902004 l -0.01165,-0.39094 -0.01172,-0.39091 -0.242123,0.2049 c -0.314741,0.26625 -0.719524,0.4766 -1.118274,0.58092 -0.365159,0.0956 -1.29879,0.13797 -1.722326,0.0783 z m 2.047551,-1.59458 c 0.481849,-0.18679 0.812021,-0.50311 0.937398,-0.89785 0.0262,-0.0825 0.05632,-0.47809 0.0665,-0.87815 l 0.01868,-0.72719 -1.161576,0.009 c -0.788425,0.006 -1.261126,0.0192 -1.471468,0.0575 -0.510498,0.091 -0.799062,0.27668 -1.003256,0.64529 -0.111719,0.2017 -0.120972,0.25013 -0.120062,0.62832 0.0013,0.36365 0.01337,0.43336 0.110676,0.61952 0.272183,0.5206 0.684704,0.67682 1.732311,0.65613 0.559945,-0.0115 0.689938,-0.0279 0.890736,-0.10431 z m -3.5882653,-9.87213 -0.5656376,-0.56673 0.2447756,-0.2266 c 0.6118003,-0.5663 1.4515843,-0.96637 2.3627563,-1.12537 0.545382,-0.0951 1.465068,-0.0576 1.999438,0.0823 0.733766,0.19174 1.472932,0.58373 2.016315,1.06968 l 0.204881,0.18324 -0.573145,0.57523 c -0.315206,0.31631 -0.584161,0.57523 -0.597676,0.57523 -0.01342,0 -0.140724,-0.0931 -0.282724,-0.20705 -1.055902,-0.84748 -2.559743,-0.91322 -3.702971,-0.16201 -0.161386,0.10587 -0.328551,0.2323 -0.371484,0.28102 -0.04292,0.049 -0.0985,0.0879 -0.123475,0.0879 -0.02495,0 -0.299954,-0.25509 -0.6110533,-0.56673 z m -2.1781382,-2.17804 c -0.3100604,-0.31079 -0.5568856,-0.58373 -0.5485074,-0.60669 0.00832,-0.0233 0.1350755,-0.14839 0.2815787,-0.2789 2.7151852,-2.4157 6.7002492,-2.69417 9.6953872,-0.67726 0.508055,0.34224 1.163467,0.88431 1.163467,0.96254 0,0.0239 -0.251987,0.29803 -0.559984,0.60659 l -0.55999,0.56087 -0.2698,-0.24574 c -0.563238,-0.51273 -1.460517,-1.03821 -2.182728,-1.278 -0.715944,-0.23766 -1.095602,-0.29378 -1.979835,-0.29335 -0.626666,0.002 -0.905989,0.0189 -1.186843,0.0747 -1.111256,0.22413 -2.0986858,0.70918 -2.9565039,1.45192 l -0.3324971,0.28784 z"
id="path946"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.4 KiB

View File

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="amazon-symbolic.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6199993"
inkscape:cx="21.788253"
inkscape:cy="55.204611"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="1,0"
position="84,-8.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
<sodipodi:guide
position="92,-8.0000001"
orientation="1,0"
id="guide4760" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
style="fill:#808080;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.00019777"
d="m 426.99809,393.22427 c 0,9.84856 -3.67327,20.84806 -15.85755,23.16451 -1.29708,0.23309 -1.98188,-0.69914 -2.17134,-1.54413 l -1.07912,-10.05241 c 0.0444,-0.9324 0.96238,-1.61738 1.89512,-1.79222 4.19744,-0.85956 6.22343,-4.38504 6.22343,-8.33319 0,-2.12706 -0.78687,-4.54557 -2.69644,-5.81307 -2.12774,-1.44233 -5.04267,-1.25318 -7.50594,-1.25318 l -1.341,0 c -0.685,6.00237 -1.12208,13.85544 -3.59972,19.47902 -2.79819,6.48313 -8.52628,11.04267 -16.93614,11.04267 -10.77046,0 -16.14835,-6.78883 -16.14835,-15.50101 0,-7.37185 1.73447,-11.3929 7.53529,-17.07476 -2.72547,-1.89394 -4.05209,-2.50602 -6.90886,-5.94427 -0.40784,-0.77213 -0.36384,-1.76236 0.24835,-2.4471 l -0.0299,-0.0291 c 1.83643,-2.06879 5.11611,-5.82767 6.87972,-7.94015 0.69947,-0.845 1.82166,-0.69925 2.7545,-0.0291 2.62339,1.89395 4.75103,3.90448 9.60445,3.90448 l 16.14888,0 c 6.83571,0 13.11699,-0.48093 17.82476,4.55989 3.81842,3.9773 5.1594,10.5623 5.1594,15.60311 z m -30.84042,-5.62369 -2.24418,0 c -4.03722,0 -7.40399,-0.10192 -10.98935,1.93769 -2.91492,1.64629 -4.70776,4.25405 -4.70776,7.16782 0,3.9773 3.03176,6.29393 7.50615,6.29393 8.83228,0 10.43514,-7.91105 10.43514,-15.39944 z m -23.17828,-32.69373 c 0.0392,3.22128 -0.61724,7.1796 -2.69644,10.13228 -0.59741,0.85955 -1.42776,0.71357 -1.31123,-0.24069 0.37179,-3.13229 1.20979,-10.11061 -0.37892,-11.34896 -1.59574,-1.24563 -8.16193,1.38435 -11.09132,2.55714 -0.88914,0.35694 -1.24625,-0.40799 -0.57592,-1.20927 4.36511,-5.22291 13.51059,-6.56344 14.82957,-5.49992 0.61518,0.49852 1.19007,2.76709 1.22426,5.60942 z m -1.75007,82.04379 c 0.0423,0.76204 -0.82395,1.16196 -1.49285,0.42213 -10.4719,-11.58946 -16.76765,-26.90841 -16.76765,-43.92473 0,-12.13578 3.82544,-26.23083 10.99607,-35.95549 1.19523,-1.60985 2.9736,-0.23333 2.27392,1.41293 -4.62718,10.89744 -6.8572,22.74906 -6.8572,33.52266 0,15.97466 4.37925,31.43967 11.65928,43.94695 0.11963,0.20488 0.17851,0.39969 0.18843,0.57555 z"
id="path8"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1 @@
../action.svg

View File

@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="media-optical-symbolic.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.0249991"
inkscape:cx="-22.569403"
inkscape:cy="71.871878"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="false"
inkscape:snap-smooth-nodes="false"
inkscape:snap-midpoints="false"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true"
inkscape:snap-others="false">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="1,0"
position="84,-8.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
<sodipodi:guide
position="92,-8.0000001"
orientation="1,0"
id="guide4760" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 432,393.36133 c 0,23.17269 -18.83505,42 -42.01562,42 -23.18058,0 -42.01758,-18.82731 -42.01758,-42 0,-23.17269 18.837,-42 42.01758,-42 23.18057,0 42.01562,18.82731 42.01562,42 z m -4.00195,0 c 0,-21.00965 -16.99443,-37.99805 -38.01367,-37.99805 -21.01925,0 -38.01563,16.9884 -38.01563,37.99805 0,21.00965 16.99638,38 38.01563,38 21.01924,0 38.01367,-16.99035 38.01367,-38 z"
id="path4184"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:8.00158215;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 405.98828,393.36133 c 0,8.78984 -7.21312,16 -16.0039,16 -8.79079,0 -16.00586,-7.21016 -16.00586,-16 0,-8.78984 7.21507,-15.99805 16.00586,-15.99805 8.79078,0 16.0039,7.20821 16.0039,15.99805 z m -8.00195,0 c 0,-4.46368 -3.53376,-7.99805 -8.00195,-7.99805 -4.4682,0 -8.00391,3.53437 -8.00391,7.99805 0,4.46368 3.53571,7.99805 8.00391,7.99805 4.46819,0 8.00195,-3.53437 8.00195,-7.99805 z"
id="ellipse4200"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1 @@
../mediaplayer-app-symbolic.svg

View File

@ -0,0 +1 @@
BrowserIconMusic.svg

View File

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="server03.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6199993"
inkscape:cx="-10.373672"
inkscape:cy="59.564043"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="1,0"
position="84,-8.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
<sodipodi:guide
position="92,-8.0000001"
orientation="1,0"
id="guide4760" />
<sodipodi:guide
position="108,12"
orientation="0,1"
id="guide4182" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:4.00079107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 351.96844,433.36223 v -80"
id="path4205"
inkscape:connector-curvature="0" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="M 364.97358,393.36222 H 350.96804"
id="path4207"
inkscape:connector-curvature="0" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="M 7.9980469 6 L 7.9980469 8 L 7.9980469 22 L 12 22 L 12 9.9980469 L 83.998047 9.9980469 L 83.998047 22 L 88 22 L 88 6 L 7.9980469 6 z M 7.9980469 28 L 7.9980469 44 L 12 44 L 12 28 L 7.9980469 28 z M 83.998047 28 L 83.998047 44 L 88 44 L 88 28 L 83.998047 28 z M 7.9980469 50 L 7.9980469 76 L 88 76 L 88 50 L 83.998047 50 L 83.998047 72.001953 L 12 72.001953 L 12 50 L 7.9980469 50 z "
transform="matrix(0,-1,-1.0003957,0,438.00245,441.36222)"
id="rect4236" />
<path
inkscape:connector-curvature="0"
id="path4238"
d="m 407.9906,433.36223 v -80"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:4.00079107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:4.00079107;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 385.98192,433.36223 v -80"
id="path4240"
inkscape:connector-curvature="0" />
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="rect4242"
width="12.000004"
height="6.0023742"
x="-375.36224"
y="-421.99612"
transform="matrix(0,-1,-1,0,0,0)" />
<rect
transform="matrix(0,-1,-1,0,0,0)"
y="-399.9874"
x="-375.36224"
height="6.0023742"
width="12.000004"
id="rect4244"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="rect4246"
width="12.000004"
height="6.0023742"
x="-375.36224"
y="-377.97867"
transform="matrix(0,-1,-1,0,0,0)" />
<ellipse
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:10.79999924;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path4208"
cx="-393.36221"
cy="-351.96841"
transform="matrix(0,-1,-1,0,0,0)"
rx="6.0000005"
ry="6.0023746" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1 @@
BrowserIconPicture.svg

View File

@ -0,0 +1,193 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="media-playlist.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.024999"
inkscape:cx="1.5729484"
inkscape:cy="43.174365"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="92,-8.0000001"
id="guide4075" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="0,1"
position="-5,12"
id="guide4078" />
<sodipodi:guide
orientation="1,0"
position="84,-9.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
d="M 12 4 L 11.996094 60 C 11.996094 60 38.67204 48.520868 62 31.982422 C 62 31.978423 61.997094 31.973494 61.996094 31.966797 C 61.993094 31.962798 61.990375 31.954817 61.984375 31.949219 C 61.981375 31.94522 61.975256 31.935285 61.972656 31.929688 C 61.969656 31.925689 61.966797 31.91956 61.966797 31.914062 C 37.360487 14.848185 12 4 12 4 z M 16.052734 10.435547 C 22.210524 13.23248 36.461491 20.11424 54.519531 31.978516 C 37.108361 43.569719 22.328791 50.699781 16.050781 53.556641 L 16.052734 10.435547 z "
transform="matrix(0,-1,-1.0003957,0,438.00245,441.36222)"
id="path4176" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"
d="m 388.43206,361.07316 c -0.12331,-0.0552 -0.008,-0.0131 -0.0996,-0.0586 a 4.0244714,4.0244712 0 0 1 -0.21883,-0.10547 c -0.002,-0.001 0.01,0.007 0.008,0.006 l 0.31067,0.15821 z"
id="path2194-5" />
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="rect4178"
width="8"
height="8.0031652"
x="-429.36221"
y="-353.96921"
transform="matrix(0,-1,-1,0,0,0)" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 347.9668,357.36133 0,56 4,0 0,-56 -4,0 z"
id="path4180"
inkscape:connector-curvature="0" />
<rect
transform="matrix(0,-1,-1,0,0,0)"
y="-369.97556"
x="-429.36221"
height="8.0031652"
width="8"
id="rect4182"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<path
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:none;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 363.97461,357.36133 0,56 4,0 0,-56 -4,0 z"
id="path4184"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -0,0 +1 @@
MediaBrowserIconPlaylist.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg4479" width="90" height="90" version="1.1" viewBox="0 0 90 90" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata id="metadata4484">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1" transform="translate(833.57 -695.93)">
<rect id="rect4821" x="-833.57" y="695.93" width="90" height="90" style="fill:none"/>
<path id="circle4113-5" d="m-788.57 699.93c-22.645 0-41.003 18.358-41.003 41.003s18.358 41.003 41.003 41.003c22.645 0 40.997-18.358 40.997-41.003s-18.352-41.003-40.997-41.003zm-6.3914 19.413c12.597 0 24.974 3.3577 35.787 9.7094 1.6046 0.9425 2.1418 3.0115 1.1992 4.616-0.6281 1.0689-1.7547 1.6591-2.9105 1.6591-0.5793 0-1.1693-0.1444-1.7056-0.46-9.7796-5.7441-20.972-8.7838-32.37-8.7838-6.1581 0-12.258 0.8787-18.127 2.6079-1.787 0.526-3.6587-0.4971-4.1852-2.2819-0.5255-1.785 0.4968-3.6593 2.2818-4.1853 6.4877-1.9115 13.227-2.8814 20.03-2.8814zm0 13.964c10.689 0 21.111 2.9824 30.141 8.6268 1.4207 0.8876 1.854 2.7594 0.9662 4.1795-0.5753 0.9201-1.5676 1.4261-2.5787 1.4261-0.5492 0-1.1009-0.1475-1.6006-0.4598-8.0651-5.0409-17.377-7.707-26.928-7.707-5.3065 0-10.543 0.8178-15.56 2.4274-1.5948 0.5106-3.3009-0.367-3.8127-1.9618-0.5116-1.5946 0.3671-3.3008 1.9617-3.8127 5.6165-1.8014 11.474-2.7185 17.41-2.7185zm0 13.819c8.8197 0 17.31 2.653 24.547 7.672 1.2238 0.8485 1.523 2.5254 0.6751 3.7488-0.5234 0.7548-1.3635 1.1582-2.2178 1.1582-0.5297 0-1.0621-0.1537-1.5308-0.4771-6.3316-4.3911-13.757-6.7116-21.474-6.7116-4.4635 0-8.8307 0.7731-12.981 2.2934-1.3979 0.5123-2.9451-0.2093-3.4575-1.6065-0.5122-1.3982 0.2026-2.9456 1.6007-3.4577 4.7463-1.739 9.7392-2.6195 14.838-2.6195z" style="fill:#808080"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -0,0 +1,99 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
viewBox="0 0 25.399999 25.400001"
version="1.1"
id="svg8"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
sodipodi:docname="MediaBrowserIconTidal.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.6"
inkscape:cx="7.55591"
inkscape:cy="67.715205"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="2792"
inkscape:window-height="1698"
inkscape:window-x="88"
inkscape:window-y="44"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid815" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-271.59998)">
<g
id="g914"
transform="matrix(0.94444584,0,0,0.94444584,0.20578737,16.293807)"
style="stroke-width:1.05882192">
<rect
transform="rotate(-45)"
y="198.78537"
x="-196.91451"
height="5.6126623"
width="5.6126623"
id="rect902"
style="opacity:0.97000002;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1.05882192;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
style="opacity:0.97000002;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1.05882192;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect904"
width="5.6126623"
height="5.6126623"
x="-191.30183"
y="204.39804"
transform="rotate(-45)" />
<rect
transform="rotate(-45)"
y="210.01068"
x="-185.68919"
height="5.6126623"
width="5.6126623"
id="rect906"
style="opacity:0.97000002;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1.05882192;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<rect
transform="rotate(-45)"
y="210.01071"
x="-196.91451"
height="5.6126623"
width="5.6126623"
id="rect908"
style="opacity:0.97000002;fill:#808080;fill-opacity:1;stroke:none;stroke-width:1.05882192;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="56 56 96 96"
xml:space="preserve"
id="svg12"
sodipodi:docname="MediaBrowserIconTuneIn.svg"
width="96"
height="96"
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
id="metadata18"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs16">
</defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2792"
inkscape:window-height="1698"
id="namedview14"
showgrid="true"
inkscape:zoom="7.5853273"
inkscape:cx="58.524091"
inkscape:cy="41.923043"
inkscape:window-x="88"
inkscape:window-y="44"
inkscape:window-maximized="1"
inkscape:current-layer="svg12"><inkscape:grid
type="xygrid"
id="grid828" /></sodipodi:namedview>
<style
type="text/css"
id="style2">
.st0{display:none;}
.st1{fill:#1C203C;}
</style>
<g
id="Other_Stuff"
class="st0"
style="display:none"
transform="translate(0,8)">
</g>
<g
id="Clear_Space"
transform="translate(0,8)">
</g>
<g
style="stroke-width:2.24266672;fill:#808080;fill-opacity:1"
id="Logo__x2013__Horizontal_1A_12_"
transform="matrix(0.44589774,0,0,0.44589774,34.439953,59.410226)">
<g
style="stroke-width:2.24266672;fill:#808080;fill-opacity:1"
id="Logo_2_">
<path
style="fill:#808080;stroke-width:2.24266672;fill-opacity:1"
inkscape:connector-curvature="0"
id="path6"
d="m 95,96.8 v 4 c 0,0.4 -0.4,0.8 -0.8,0.8 h -5 c -0.2,0 -0.4,0.2 -0.4,0.4 v 21.2 c 0,0.4 -0.4,0.8 -0.8,0.8 h -4 c -0.4,0 -0.8,-0.4 -0.8,-0.8 V 102 c 0,-0.2 -0.2,-0.4 -0.4,-0.4 h -5 c -0.4,0 -0.8,-0.4 -0.8,-0.8 v -4 C 77,96.4 77.4,96 77.8,96 h 16.4 c 0.4,0 0.8,0.4 0.8,0.8 z M 117,96 h -4 c -0.4,0 -0.8,0.4 -0.8,0.8 v 18.8 c 0,1.8 -1.4,3.2 -3.9,3.2 -2.4,0 -3.8,-1.4 -3.8,-3.2 V 96.8 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 h -4 c -0.4,0 -0.8,0.4 -0.8,0.8 v 18.8 c 0,4.8 4,8.8 9.4,8.8 5.5,0 9.5,-4 9.5,-8.8 V 96.8 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 z m 22.6,0 h -4 c -0.4,0 -0.8,0.4 -0.8,0.8 v 15 c 0,0.2 -0.3,0.3 -0.4,0.1 l -5.5,-15.2 c -0.1,-0.4 -0.4,-0.7 -1,-0.7 h -4.8 c -0.4,0 -0.8,0.4 -0.8,0.8 v 26.4 c 0,0.4 0.4,0.8 0.8,0.8 h 4 c 0.4,0 0.8,-0.4 0.8,-0.8 v -13.8 c 0,-0.2 0.3,-0.3 0.4,-0.1 l 5.4,14 c 0.1,0.3 0.4,0.7 1.1,0.7 h 4.7 c 0.4,0 0.8,-0.4 0.8,-0.8 V 96.8 C 140.4,96.4 140,96 139.6,96 Z m 20.7,22.4 h -9.5 c -0.2,0 -0.4,-0.2 -0.4,-0.4 v -4.8 c 0,-0.2 0.2,-0.4 0.4,-0.4 h 9 c 0.4,0 0.8,-0.4 0.8,-0.8 v -4 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 h -9 c -0.2,0 -0.4,-0.2 -0.4,-0.4 V 102 c 0,-0.2 0.2,-0.4 0.4,-0.4 h 9.3 c 0.4,0 0.8,-0.4 0.8,-0.8 v -4 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 h -14.5 c -0.4,0 -0.8,0.4 -0.8,0.8 v 26.4 c 0,0.4 0.4,0.8 0.8,0.8 h 14.7 c 0.4,0 0.8,-0.4 0.8,-0.8 v -4 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 z M 256,59 v 62 c 0,1.7 -1.3,3 -3,3 h -69 v 17 c 0,1.7 -1.3,3 -3,3 H 59 c -1.7,0 -3,-1.3 -3,-3 V 79 c 0,-1.7 1.3,-3 3,-3 H 178 V 59 c 0,-1.7 1.3,-3 3,-3 h 72 c 1.7,0 3,1.3 3,3 z M 178,82 H 62.5 C 62.2,82 62,82.2 62,82.5 v 55 c 0,0.3 0.2,0.5 0.5,0.5 h 115 c 0.3,0 0.5,-0.2 0.5,-0.5 z m 35.8,17.4 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 h -3.4 c -0.2,0 -0.4,-0.2 -0.4,-0.4 V 81.8 c 0,-0.2 0.2,-0.4 0.4,-0.4 h 3 c 0.4,0 0.8,-0.4 0.8,-0.8 v -3.8 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 h -12.4 c -0.4,0 -0.8,0.4 -0.8,0.8 v 3.8 c 0,0.4 0.4,0.8 0.8,0.8 h 3 c 0.2,0 0.4,0.2 0.4,0.4 v 16.4 c 0,0.2 -0.2,0.4 -0.4,0.4 h -3.4 c -0.4,0 -0.8,0.4 -0.8,0.8 v 3.8 c 0,0.4 0.4,0.8 0.8,0.8 H 213 c 0.4,0 0.8,-0.4 0.8,-0.8 z m 22.4,-22.6 c 0,-0.4 -0.4,-0.8 -0.8,-0.8 h -4 c -0.4,0 -0.8,0.4 -0.8,0.8 v 15 c 0,0.2 -0.3,0.3 -0.4,0.1 l -5.5,-15.2 c -0.1,-0.4 -0.4,-0.7 -1,-0.7 H 219 c -0.4,0 -0.8,0.4 -0.8,0.8 v 26.4 c 0,0.4 0.4,0.8 0.8,0.8 h 4 c 0.4,0 0.8,-0.4 0.8,-0.8 V 89.4 c 0,-0.2 0.3,-0.3 0.4,-0.1 l 5.4,14 c 0.1,0.3 0.4,0.7 1.1,0.7 h 4.7 c 0.4,0 0.8,-0.4 0.8,-0.8 z"
class="st1" />
</g>
</g>
<g
id="Anatomy"
class="st0"
style="display:none"
transform="translate(0,8)">
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1,203 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="96"
height="96"
id="svg4874"
version="1.1"
inkscape:version="0.91+devel r"
viewBox="0 0 96 96.000001"
sodipodi:docname="stock_usb.svg">
<defs
id="defs4876" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="7.0249991"
inkscape:cx="35.629893"
inkscape:cy="53.907462"
inkscape:document-units="px"
inkscape:current-layer="g4780"
showgrid="true"
showborder="true"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:snap-intersection-paths="true"
inkscape:object-nodes="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-center="true"
showguides="true"
inkscape:guide-bbox="true"
inkscape:snap-global="true">
<inkscape:grid
type="xygrid"
id="grid5451"
empspacing="8" />
<sodipodi:guide
orientation="1,0"
position="8,-8.0000001"
id="guide4063" />
<sodipodi:guide
orientation="1,0"
position="4,-8.0000001"
id="guide4065" />
<sodipodi:guide
orientation="0,1"
position="-8,88.000001"
id="guide4067" />
<sodipodi:guide
orientation="0,1"
position="-8,92.000001"
id="guide4069" />
<sodipodi:guide
orientation="0,1"
position="104,4"
id="guide4071" />
<sodipodi:guide
orientation="0,1"
position="-5,8.0000001"
id="guide4073" />
<sodipodi:guide
orientation="1,0"
position="88,-8.0000001"
id="guide4077" />
<sodipodi:guide
orientation="0,1"
position="-8,84.000001"
id="guide4074" />
<sodipodi:guide
orientation="1,0"
position="12,-8.0000001"
id="guide4076" />
<sodipodi:guide
orientation="1,0"
position="84,-8.0000001"
id="guide4080" />
<sodipodi:guide
position="48,-8.0000001"
orientation="1,0"
id="guide4170" />
<sodipodi:guide
position="-8,48"
orientation="0,1"
id="guide4172" />
<sodipodi:guide
position="92,-8.0000001"
orientation="1,0"
id="guide4760" />
</sodipodi:namedview>
<metadata
id="metadata4879">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(67.857146,-78.50504)">
<g
transform="matrix(0,-1,-1,0,373.50506,516.50504)"
id="g4845"
style="display:inline">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="next01.png"
transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)"
id="g4778"
inkscape:label="Layer 1">
<g
transform="matrix(-1,0,0,1,575.99999,611)"
id="g4780"
style="display:inline">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"
id="rect4782"
width="96.037987"
height="96"
x="-438.00244"
y="345.36221"
transform="scale(-1,1)" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.00059342;marker:none;enable-background:accumulate"
d="m 421.99612,401.93458 0,-17.14379 c 0,0 9.50358,4.04713 16.00635,8.57143 -6.50277,4.5243 -16.00635,8.57236 -16.00635,8.57236 z"
id="path4198"
inkscape:connector-curvature="0"
inkscape:transform-center-x="0.00046899999"
inkscape:transform-center-y="8.0000098" />
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="rect4192"
width="10.000016"
height="10.003973"
x="-383.36221"
y="-411.99216"
transform="matrix(0,-1,-1,0,0,0)" />
<ellipse
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
id="path4194"
cx="-408.36221"
cy="-393.98505"
transform="matrix(0,-1,-1,0,0,0)"
rx="5.9999971"
ry="6.0023713" />
<ellipse
ry="7.0027828"
rx="7.0000129"
transform="matrix(0,-1,-1,0,0,0)"
cy="-348.96722"
cx="-393.36221"
id="ellipse4196"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 422.99651,393.36222 -70.02769,0"
id="path4199"
inkscape:connector-curvature="0" />
<path
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate"
d="m 363.97317,393.36222 c 11.00436,0 12.00475,15 22.0087,15 l 4.00159,0"
id="path4201"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccc" />
<path
sodipodi:nodetypes="ccc"
inkscape:connector-curvature="0"
id="path4203"
d="m 376.97833,393.36222 c 11.00436,0 12.00475,-15 22.0087,-15 l 4.00159,0"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#808080;stroke-width:4.00079155;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1 @@
BrowserIconVideo.svg

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg id="svg4874" width="96" height="96" version="1.1" viewBox="0 0 96 96" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<metadata id="metadata4879">
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g id="layer1" transform="translate(67.857 -78.505)">
<rect id="rect4782" transform="rotate(90)" x="78.505" y="-28.143" width="96" height="96" style="color:#000000;fill:none"/>
<path id="path4643" d="m-47.869 86.504-0.01172 2e-3c-5.0328 0.05818-8.7136-0.12027-11.725 1.541-1.5055 0.83064-2.6968 2.2356-3.3555 3.9902-0.65866 1.7547-0.89648 3.8364-0.89648 6.4668v54.002c0 2.6304 0.23782 4.7121 0.89648 6.4668 0.65866 1.7546 1.85 3.1596 3.3555 3.9902 3.011 1.6613 6.6918 1.4848 11.725 1.543h0.01172 56.023 0.011719c5.0328-0.0582 8.7136 0.11832 11.725-1.543 1.5055-0.83064 2.6968-2.2356 3.3555-3.9902 0.65866-1.7547 0.89648-3.8364 0.89648-6.4668v-38c0-2.6333-0.24451-4.7263-0.91016-6.4883-0.66565-1.762-1.8593-3.1729-3.3691-4.0117-3.0197-1.6776-6.7207-1.5-11.721-1.5h-46c-5 0-8.701-0.17761-11.721 1.5-1.5098 0.8388-2.7035 2.2497-3.3691 4.0117-0.66565 1.762-0.91016 3.855-0.91016 6.4883v40h4v-40c0-2.3667 0.25549-4.0257 0.65234-5.0762 0.39685-1.0505 0.82821-1.5146 1.5684-1.9258 1.4803-0.82239 4.7793-0.99805 9.7793-0.99805h46c5 0 8.299 0.17566 9.7793 0.99805 0.74015 0.41119 1.1715 0.87528 1.5684 1.9258 0.39685 1.0505 0.65234 2.7095 0.65234 5.0762v38c0 2.3696-0.25037 4.0209-0.64062 5.0606-0.39025 1.0396-0.80933 1.4898-1.543 1.8945-1.4645 0.80804-4.7782 0.98616-9.8164 1.0449h-55.977-0.02344c-5.0383-0.0588-8.3519-0.23688-9.8164-1.0449-0.73364-0.40478-1.1508-0.85491-1.541-1.8945-0.39025-1.0396-0.64258-2.691-0.64258-5.0606v-54.002c0-2.3696 0.25232-4.0209 0.64258-5.0605 0.39025-1.0396 0.80738-1.4898 1.541-1.8945 1.4645-0.80804 4.7782-0.98616 9.8164-1.0449l20.172 2e-3 6 6 33.828-2e-3v-4l-32.172 2e-3 -6-6z" style="color-rendering:auto;color:#000000;dominant-baseline:auto;fill:#808080;font-feature-settings:normal;font-variant-alternates:normal;font-variant-caps:normal;font-variant-ligatures:normal;font-variant-numeric:normal;font-variant-position:normal;image-rendering:auto;isolation:auto;mix-blend-mode:normal;shape-padding:0;shape-rendering:auto;solid-color:#000000;text-decoration-color:#000000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-orientation:mixed;text-transform:none;white-space:normal"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -317,7 +317,7 @@ Page {
Behavior on opacity { NumberAnimation {duration: 200; easing.type: Easing.InOutQuad } }
Label {
Layout.fillWidth: true
text: qsTr("This is a scene" + root.ruleColor, root.ruleIcon)
text: qsTr("This is a scene")
}
CheckBox {
@ -603,6 +603,15 @@ Page {
implicitWidth: parent.width
ruleAction: root.rule.actions.get(index)
onRemoveRuleAction: root.rule.actions.removeRuleAction(index)
onClicked: {
var ruleActionPage = pageStack.push(Qt.resolvedUrl("SelectRuleActionPage.qml"), {text: "Select action", ruleAction: ruleAction, rule: root.rule });
ruleActionPage.onBackPressed.connect(function() {
pageStack.pop();
})
ruleActionPage.onDone.connect(function() {
pageStack.pop(root);
})
}
}
}

View File

@ -12,18 +12,22 @@ NymeaListItemDelegate {
property RuleAction ruleAction: null
property var device: ruleAction.deviceId ? engine.deviceManager.devices.getDevice(ruleAction.deviceId) : null
property var iface: ruleAction.interfaceName ? Interfaces.findByName(ruleAction.interfaceName) : null
property var deviceClass: device ? engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId) : null
property var actionType: deviceClass ? deviceClass.actionTypes.getActionType(ruleAction.actionTypeId)
readonly property Device device: ruleAction.deviceId ? engine.deviceManager.devices.getDevice(ruleAction.deviceId) : null
readonly property Interface iface: ruleAction.interfaceName ? Interfaces.findByName(ruleAction.interfaceName) : null
readonly property DeviceClass deviceClass: device ? engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId) : null
readonly property ActionType actionType: deviceClass ? deviceClass.actionTypes.getActionType(ruleAction.actionTypeId)
: iface ? iface.actionTypes.findByName(ruleAction.interfaceAction) : null
readonly property string browserItemId: ruleAction.browserItemId
readonly property BrowserItem browserItem: device && browserItemId.length > 0 ? engine.deviceManager.browserItem(device.id, browserItemId) : null
signal removeRuleAction()
onDeleteClicked: root.removeRuleAction()
iconName: root.device ? "../images/action.svg" : "../images/action-interface.svg"
text: qsTr("%1 - %2").arg(root.device ? root.device.name : root.iface.displayName).arg(root.actionType.displayName)
iconName: root.device ? (root.browserItemId ? "../images/browser/BrowserIconFolder.svg" : "../images/action.svg") : "../images/action-interface.svg"
text: qsTr("%1 - %2")
.arg(root.device ? root.device.name : root.iface.displayName)
.arg(root.actionType ? root.actionType.displayName : (root.browserItem.displayName.length > 0 ? root.browserItem.displayName : qsTr("Unknown item")))
subText: {
var ret = [];
for (var i = 0; i < root.ruleAction.ruleActionParams.count; i++) {

View File

@ -0,0 +1,48 @@
import QtQuick 2.4
import QtQuick.Controls 2.1
import Nymea 1.0
import "../components"
import "../delegates"
Page {
id: root
property Device device: null
property string itemId: ""
signal selected(string itemId)
header: NymeaHeader {
onBackPressed: pageStack.pop()
text: qsTr("Select item")
}
Component.onCompleted: {
listView.model = engine.deviceManager.browseDevice(root.device.id, root.itemId)
}
ListView {
id: listView
anchors.fill: parent
ScrollBar.vertical: ScrollBar {}
delegate: BrowserItemDelegate {
width: parent.width
device: root.device
secondaryIconName: "" // We don't support BrowserItemActions in rules yet
onClicked: {
if (model.browsable) {
var page = pageStack.push(Qt.resolvedUrl("SelectBrowserItemActionPage.qml"), {device: root.device, itemId: model.id});
page.selected.connect(function() {
pageStack.pop();
root.selected(model.id);
})
} else if (model.executable) {
pageStack.pop();
root.selected(model.id);
}
}
}
}
}

View File

@ -8,13 +8,13 @@ Page {
property alias text: header.text
// a ruleAction object needs to be set and prefilled with either deviceId or interfaceName
property var ruleAction: null
property RuleAction ruleAction: null
// optionally, a rule which will be used when determining params for the actions
property var rule: null
property Rule rule: null
readonly property var device: ruleAction && ruleAction.deviceId ? engine.deviceManager.devices.getDevice(ruleAction.deviceId) : null
readonly property var deviceClass: device ? engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId) : null
readonly property Device device: ruleAction && ruleAction.deviceId ? engine.deviceManager.devices.getDevice(ruleAction.deviceId) : null
readonly property DeviceClass deviceClass: device ? engine.deviceManager.deviceClasses.getDeviceClass(device.deviceClassId) : null
signal backPressed();
signal done();
@ -65,7 +65,20 @@ Page {
}
} else {
if (root.device) {
listView.model = deviceClass.actionTypes
generatedModel.clear();
for (var i = 0; i < deviceClass.actionTypes.count; i++) {
var actionType = deviceClass.actionTypes.get(i);
generatedModel.append({displayName: actionType.displayName, actionTypeId: actionType.id})
}
// Append an item for browse mode
if (root.deviceClass.browsable) {
generatedModel.append({displayName: qsTr("Open an item on this thing..."), actionTypeId: "browse"})
}
listView.model = generatedModel;
// listView.model = deviceClass.actionTypes
}
}
}
@ -73,14 +86,22 @@ Page {
ListView {
id: listView
anchors.fill: parent
ScrollBar.vertical: ScrollBar {}
delegate: ItemDelegate {
delegate: NymeaListItemDelegate {
id: delegate
text: model.displayName
width: parent.width
iconName: model.actionTypeId === "browse" ? "../images/browser/BrowserIconFolder.svg" : "../images/action.svg"
property ActionType actionType: root.deviceClass.actionTypes.getActionType(model.actionTypeId)
progressive: model.actionTypeId === "browse" || actionType.paramTypes.count > 0
onClicked: {
if (header.interfacesMode) {
if (root.device) {
root.ruleAction.actionTypeId = model.actionTypeId;
root.ruleAction.browserItemId = "";
root.ruleAction.interfaceAction = "";
var actionType = root.deviceClass.actionTypes.getActionType(model.actionTypeId)
if (actionType.paramTypes.count > 0) {
var paramsPage = pageStack.push(Qt.resolvedUrl("SelectRuleActionParamsPage.qml"), {ruleAction: root.ruleAction, rule: root.rule})
@ -94,6 +115,8 @@ Page {
}
} else if (root.ruleAction.interfaceName !== "") {
root.ruleAction.interfaceAction = model.name;
root.ruleAction.browserItemId = "";
root.ruleAction.actionTypeId = "";
if (listView.model.get(index).paramTypes.count > 0) {
var paramsPage = pageStack.push(Qt.resolvedUrl("SelectRuleActionParamsPage.qml"), {ruleAction: root.ruleAction, rule: root.rule})
paramsPage.onBackPressed.connect(function() {pageStack.pop()});
@ -109,18 +132,31 @@ Page {
}
} else {
if (root.device) {
var actionType = root.deviceClass.actionTypes.getActionType(model.id);
console.log("ActionType", actionType.id, "selected. Has", actionType.paramTypes.count, "params");
root.ruleAction.actionTypeId = actionType.id;
if (actionType.paramTypes.count > 0) {
var paramsPage = pageStack.push(Qt.resolvedUrl("SelectRuleActionParamsPage.qml"), {ruleAction: root.ruleAction, rule: root.rule})
paramsPage.onBackPressed.connect(function() { pageStack.pop(); });
paramsPage.onCompleted.connect(function() {
if (model.actionTypeId === "browse") {
var page = pageStack.push(Qt.resolvedUrl("SelectBrowserItemActionPage.qml"), {device: root.device});
page.selected.connect(function(itemId) {
root.ruleAction.browserItemId = itemId;
root.ruleAction.actionTypeId = "";
root.ruleAction.interfaceAction = "";
pageStack.pop();
root.done();
})
} else {
root.done();
var actionType = root.deviceClass.actionTypes.getActionType(model.actionTypeId);
console.log("ActionType", actionType.id, "selected. Has", actionType.paramTypes.count, "params");
root.ruleAction.actionTypeId = actionType.id;
root.ruleAction.browserItemId = "";
root.ruleAction.interfaceAction = "";
if (actionType.paramTypes.count > 0) {
var paramsPage = pageStack.push(Qt.resolvedUrl("SelectRuleActionParamsPage.qml"), {ruleAction: root.ruleAction, rule: root.rule})
paramsPage.onBackPressed.connect(function() { pageStack.pop(); });
paramsPage.onCompleted.connect(function() {
pageStack.pop();
root.done();
})
} else {
root.done();
}
}
}
}

View File

@ -13,6 +13,8 @@ MainPageTile {
disconnected: devicesSubProxyConnectables.count > 0
batteryCritical: devicesSubProxyBattery.count > 0
backgroundImage: inlineControlLoader.item && inlineControlLoader.item.hasOwnProperty("backgroundImage") ? inlineControlLoader.item.backgroundImage : ""
onClicked: {
var page;
switch (model.name) {
@ -47,6 +49,9 @@ MainPageTile {
case "powersocket":
page = "PowerSocketsDeviceListPage.qml";
break;
case "media":
page = "MediaDeviceListPage.qml";
break;
default:
page = "GenericDeviceListPage.qml"
}
@ -76,6 +81,9 @@ MainPageTile {
filterBatteryCritical: true
}
property int currentDeviceIndex: 0
readonly property Device currentDevice: devicesProxy.get(currentDeviceIndex)
contentItem: Loader {
id: inlineControlLoader
anchors {
@ -97,7 +105,6 @@ MainPageTile {
// return labelComponent;
case "light":
case "media":
case "garagegate":
case "blind":
case "extendedblind":
@ -107,12 +114,66 @@ MainPageTile {
case "extendedawning":
case "powersocket":
return buttonComponent
case "media":
return mediaControlComponent
default:
console.warn("DevicesPageDelegate, inlineControl: Unhandled interface", model.name)
}
}
}
Component {
id: mediaControlComponent
RowLayout {
id: inlineMediaControl
property string backgroundImage: artworkState ? artworkState.value : ""
property int currentDeviceIndex: 0
readonly property Device currentDevice: devicesProxy.get(currentDeviceIndex)
readonly property StateType playbackStateType: currentDevice.deviceClass.stateTypes.findByName("playbackStatus")
readonly property State playbackState: currentDevice.states.getState(playbackStateType.id)
readonly property StateType artworkStateType: currentDevice.deviceClass.stateTypes.findByName("artwork")
readonly property State artworkState: artworkStateType ? currentDevice.states.getState(artworkStateType.id) : null
Component.onCompleted: {
for (var i = 0; i < devicesProxy.count; i++) {
var d = devicesProxy.get(i);
var st = d.deviceClass.stateTypes.findByName("playbackStatus")
var s = d.states.getState(st.id)
s.valueChanged.connect(function() {updateTile()})
}
updateTile();
}
function updateTile() {
var playingIndex = -1;
var pausedIndex = -1;
for (var i = 0; i < devicesProxy.count; i++) {
var d = devicesProxy.get(i);
var st = d.deviceClass.stateTypes.findByName("playbackStatus");
if (!st) continue;
var s = d.states.getState(st.id);
if (playingIndex === -1 && s.value === "Playing") {
playingIndex = i;
} else if (pausedIndex === -1 && s.value === "Paused") {
pausedIndex = -i;
}
}
if (playingIndex !== -1) {
currentDeviceIndex = playingIndex;
} else if (pausedIndex !== -1) {
currentDeviceIndex = pausedIndex;
}
}
MediaControls {
iconSize: app.iconSize * 1.2
device: inlineMediaControl.currentDevice
}
}
}
Component {
id: buttonComponent
ColumnLayout {

View File

@ -31,7 +31,7 @@ Item {
height: interfacesGridView.cellHeight
iconName: iconTag ? "../images/" + iconTag.value + ".svg" : "../images/slideshow.svg";
fallbackIconName: "../images/slideshow.svg"
iconColor: colorTag ? colorTag.value : app.accentColor;
iconColor: colorTag.value.length > 0 ? colorTag.value : app.accentColor;
text: model.name.toUpperCase()
property var colorTag: engine.tagsManager.tags.findRuleTag(model.id, "color")