Commit 8010739a authored by Nicolas Fella's avatar Nicolas Fella
Browse files

[smsapp] Refactor and fix argument handling

Use a singleton instead of context properties for data handling

Fix passing initial message

Make device menu creation more declarative

Fix initial device handling

Update current device when new instance with initial device is requested
parent d76207db
Pipeline #180169 passed with stage
in 3 minutes and 35 seconds
......@@ -53,6 +53,7 @@ DevicesModel::DevicesModel(QObject* parent)
QHash< int, QByteArray > DevicesModel::roleNames() const
{
QHash<int, QByteArray> names = QAbstractItemModel::roleNames();
names.insert(NameModelRole, "name");
names.insert(IdModelRole, "deviceId");
names.insert(IconNameRole, "iconName");
names.insert(DeviceRole, "device");
......
......@@ -24,6 +24,20 @@
#include "smshelper.h"
class AppData : public QObject
{
Q_OBJECT
Q_PROPERTY(QString initialMessage MEMBER m_initialMessage NOTIFY initialMessageChanged)
Q_PROPERTY(QString initialDevice MEMBER m_initialDevice NOTIFY initialDeviceChanged)
public:
Q_SIGNAL void initialMessageChanged();
Q_SIGNAL void initialDeviceChanged();
QString m_initialMessage;
QString m_initialDevice;
};
int main(int argc, char *argv[])
{
QIcon::setFallbackThemeName(QStringLiteral("breeze"));
......@@ -53,37 +67,47 @@ int main(int argc, char *argv[])
QQuickStyle::setStyle(QStringLiteral("org.kde.desktop"));
}
QString initialMessage, deviceid;
AppData data;
{
QCommandLineParser parser;
aboutData.setupCommandLine(&parser);
parser.addOption(QCommandLineOption(QStringLiteral("device"), i18n("Select a device"), i18n("id")));
parser.addOption(QCommandLineOption(QStringLiteral("message"), i18n("Send a message"), i18n("message")));
parser.process(app);
aboutData.processCommandLine(&parser);
QCommandLineParser parser;
aboutData.setupCommandLine(&parser);
parser.addOption(QCommandLineOption(QStringLiteral("device"), i18n("Select a device"), i18n("id")));
parser.addOption(QCommandLineOption(QStringLiteral("message"), i18n("Send a message"), i18n("message")));
parser.process(app);
aboutData.processCommandLine(&parser);
initialMessage = parser.value(QStringLiteral("message"));
deviceid = parser.value(QStringLiteral("device"));
}
data.m_initialMessage = parser.value(QStringLiteral("message"));
data.m_initialDevice = parser.value(QStringLiteral("device"));
KDBusService service(KDBusService::Unique);
QObject::connect(&service, &KDBusService::activateRequested, &service, [&parser, &data](const QStringList &args, const QString &/*workDir*/) {
parser.parse(args);
data.m_initialMessage = parser.value(QStringLiteral("message"));
data.m_initialDevice = parser.value(QStringLiteral("device"));
Q_EMIT data.initialDeviceChanged();
Q_EMIT data.initialMessageChanged();
});
qmlRegisterType<ConversationsSortFilterProxyModel>("org.kde.kdeconnect.sms", 1, 0, "QSortFilterProxyModel");
qmlRegisterType<ConversationModel>("org.kde.kdeconnect.sms", 1, 0, "ConversationModel");
qmlRegisterType<ConversationListModel>("org.kde.kdeconnect.sms", 1, 0, "ConversationListModel");
qmlRegisterSingletonType<SmsHelper>("org.kde.kdeconnect.sms", 1, 0, "SmsHelper", SmsHelper::singletonProvider);
qmlRegisterSingletonInstance<AppData>("org.kde.kdeconnect.sms", 1,0, "AppData", &data);
QQmlApplicationEngine engine;
engine.rootContext()->setContextObject(new KLocalizedContext(&engine));
engine.addImageProvider(QStringLiteral("thumbnailsProvider"), new ThumbnailsProvider);
engine.rootContext()->setContextProperties({
{ QStringLiteral("initialMessage"), initialMessage },
{ QStringLiteral("initialDevice"), deviceid },
{ QStringLiteral("aboutData"), QVariant::fromValue(KAboutData::applicationData()) }
});
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
return app.exec();
}
#include "main.moc"
......@@ -43,7 +43,7 @@ Kirigami.ScrollablePage
Component.onCompleted: {
if (initialMessage.length > 0) {
messageField.text = initialMessage;
sendingArea.text = initialMessage;
initialMessage = ""
}
if (conversationId == invalidId) {
......@@ -175,6 +175,8 @@ Kirigami.ScrollablePage
}
footer: SendingArea {
id: sendingArea
width: parent.width
addresses: page.addresses
}
......
......@@ -72,9 +72,7 @@ Kirigami.ScrollablePage
}
}
property string initialMessage
property string initialDevice
property int currentDeviceIndex: -1
property string initialMessage : AppData.initialMessage
header: Kirigami.InlineMessage {
Layout.fillWidth: true
......
......@@ -17,6 +17,7 @@ ColumnLayout {
property var addresses
property var selectedFileUrls: []
readonly property int maxMessageSize: 600000
property alias text: messageField.text
MessageDialog {
id: messageDialog
......
......@@ -18,64 +18,68 @@ Kirigami.ApplicationWindow
width: 800
height: 600
property int currentDeviceIndex
property int devicesCount
property string initialDevice
property alias devicesCount : instantiator.count
property QtObject device
property var deviceActions : []
Component {
id: deviceActionComponent
Kirigami.Action {
property int deviceIndex
required property string deviceId
required property string name
required property var device
text: name
onTriggered: {
root.currentDeviceIndex = deviceIndex
root.device = device
AppData.initialDevice = ""
}
icon.name: root.currentDeviceIndex === deviceIndex ? "checkmark" : ""
icon.name: root.device === device ? "checkmark" : ""
}
}
DevicesSortProxyModel {
id: devicesModel
//TODO: make it possible to filter if they can do sms
sourceModel: DevicesModel { displayFilter: DevicesModel.Paired | DevicesModel.Reachable }
function populateDevicesMenu() {
root.globalDrawer.actions[0].children = [];
for (var i = 0; i < devicesModel.rowCount(); i++) {
var dev = devicesModel.data(devicesModel.index(i, 0), DevicesSortProxyModel.DisplayRole);
var obj = deviceActionComponent.createObject(root.globalDrawer.actions[0], {
text: dev,
deviceIndex: i
});
root.globalDrawer.actions[0].children.push(obj);
Connections {
target: AppData
function onInitialDeviceChanged() {
for (var action of root.deviceActions) {
if (action.deviceId == AppData.initialDevice) {
root.device = action.device
}
}
}
onRowsInserted: {
if (root.currentDeviceIndex < 0) {
if (root.initialDevice) {
root.currentDeviceIndex = devicesModel.rowForDevice(root.initialDevice);
} else {
root.currentDeviceIndex = 0;
}
}
Instantiator {
id: instantiator
model: DevicesSortProxyModel {
id: devicesModel
//TODO: make it possible to filter if they can do sms
sourceModel: DevicesModel { displayFilter: DevicesModel.Paired | DevicesModel.Reachable }
}
onObjectAdded: (idx, obj) => {
root.deviceActions.push(obj)
root.globalDrawer.actions[0].children = root.deviceActions
if (!root.device && (AppData.initialDevice == "" || AppData.initialDevice === obj.deviceId)) {
root.device = obj.device
}
root.device = root.currentDeviceIndex >= 0 ? devicesModel.data(devicesModel.index(root.currentDeviceIndex, 0), DevicesModel.DeviceRole) : null
root.devicesCount = devicesModel.rowCount();
populateDevicesMenu();
}
onRowsRemoved: {
root.devicesCount = devicesModel.rowCount();
populateDevicesMenu();
onObjectRemoved: (idx, obj) => {
root.deviceActions.splice(idx, 1)
root.globalDrawer.actions[0].children = root.deviceActions
}
}
onCurrentDeviceIndexChanged: {
root.device = root.currentDeviceIndex >= 0 ? devicesModel.data(devicesModel.index(root.currentDeviceIndex, 0), DevicesModel.DeviceRole) : null
delegate: deviceActionComponent
}
pageStack.initialPage: ConversationList {
title: i18nd("kdeconnect-sms", "KDE Connect SMS")
initialMessage: initialMessage
device: root.device;
initialDevice: initialDevice
currentDeviceIndex: root.currentDeviceIndex;
devicesCount: root.devicesCount;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment