From ca0d6d669b88336d0c00f09ca9b645397a023e6d Mon Sep 17 00:00:00 2001 From: Michael Bohlender Date: Mon, 9 Jan 2017 14:51:43 +0100 Subject: create gmail account controller and dialog --- components/accounts/AccountWizard.qml | 18 ++++ components/accounts/CreateGmail.qml | 192 +++++++++++++++++++++++++++++++++ framework/accounts/CMakeLists.txt | 1 + framework/accounts/accountsplugin.cpp | 2 + framework/accounts/gmailcontroller.cpp | 89 +++++++++++++++ framework/accounts/gmailcontroller.h | 55 ++++++++++ 6 files changed, 357 insertions(+) create mode 100644 components/accounts/CreateGmail.qml create mode 100644 framework/accounts/gmailcontroller.cpp create mode 100644 framework/accounts/gmailcontroller.h diff --git a/components/accounts/AccountWizard.qml b/components/accounts/AccountWizard.qml index ccac252b..8cc90acb 100644 --- a/components/accounts/AccountWizard.qml +++ b/components/accounts/AccountWizard.qml @@ -62,6 +62,17 @@ Controls2.Popup { } } + Controls2.Button { + + Layout.fillWidth: true + + text: "gmail account" + + onClicked: { + stack.push(gmail) + } + } + Controls2.Button { Layout.fillWidth: true @@ -94,6 +105,13 @@ Controls2.Popup { } } + Component { + id: gmail + + CreateGmail { + } + } + Component { id: imap diff --git a/components/accounts/CreateGmail.qml b/components/accounts/CreateGmail.qml new file mode 100644 index 00000000..ca432f1d --- /dev/null +++ b/components/accounts/CreateGmail.qml @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2016 Michael Bohlender, + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +import QtQuick 2.7 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.4 as Controls +import QtQuick.Controls 2.0 as Controls2 +import org.kde.kirigami 1.0 as Kirigami + +import org.kube.framework.accounts 1.0 as KubeAccounts + +Item { + + KubeAccounts.GmailController { + id: account + } + + Controls.ToolButton { + iconName: "go-previous" + + tooltip: "go back" + + onClicked: { + stack.pop() + } + } + + //Item to avoid anchors conflict with stack + Item { + + anchors { + fill: parent + margins: Kirigami.Units.largeSpacing * 2 + } + + Kirigami.Heading { + id: heading + text: "Connect your Gmail account" + + color: Kirigami.Theme.highlightColor + } + + Kirigami.Label { + id: subHeadline + + anchors { + left: heading.left + top: heading.bottom + } + + width: parent.width + + text: "To let Kube access your account, fill in email address, username, password and give the account a title that will be displayed inside Kube." + + color: Kirigami.Theme.disabledTextColor + + wrapMode: Text.Wrap + } + + GridLayout { + anchors { + top:subHeadline.bottom + bottom: parent.bottom + left: parent.left + right: parent.right + topMargin: Kirigami.Units.largeSpacing * 2 + } + + columns: 2 + columnSpacing: Kirigami.Units.largeSpacing + rowSpacing: Kirigami.Units.largeSpacing + + Controls.Label { + text: "Title of Account" + Layout.alignment: Qt.AlignRight + } + Controls.TextField { + Layout.fillWidth: true + + placeholderText: "E.g. \"Work\", \"Home\" that will be displayed in Kube as name" + + text: account.name + + onTextChanged: { + account.name = text + } + } + + Controls.Label { + text: "Email address" + Layout.alignment: Qt.AlignRight + } + + Controls.TextField { + Layout.fillWidth: true + + text: account.emailAddress + + onTextChanged: { + account.emailAddress = text + } + + placeholderText: "Your email address" + } + + Kirigami.Label { + text: "Password" + Layout.alignment: Qt.AlignRight + } + + RowLayout { + Layout.fillWidth: true + + Controls.TextField { + id: pwField + Layout.fillWidth: true + + placeholderText: "Password of your email account" + + text: account.password + + onTextChanged: { + account.password = text + } + + echoMode: TextInput.Password + } + + Controls.CheckBox { + text: "Show Password" + onClicked: { + if(pwField.echoMode == TextInput.Password) { + pwField.echoMode = TextInput.Normal; + } else { + pwField.echoMode = TextInput.Password; + } + } + } + } + + Item { + Layout.fillHeight: true + } + + Kirigami.Label { + text: "" + } + + Kirigami.Label { + text: "" + } + + Item { + Layout.fillWidth: true + + Controls.Button { + text: "Discard" + + onClicked: { + popup.close() + } + } + + Controls.Button { + anchors.right: parent.right + + text: "Save" + + onClicked: { + account.createAction.execute() + popup.close() + } + } + } + } + } +} diff --git a/framework/accounts/CMakeLists.txt b/framework/accounts/CMakeLists.txt index 327d360e..06fcbf08 100644 --- a/framework/accounts/CMakeLists.txt +++ b/framework/accounts/CMakeLists.txt @@ -4,6 +4,7 @@ set(accountsplugin_SRCS accountsmodel.cpp maildircontroller.cpp kolabnowcontroller.cpp + gmailcontroller.cpp ) add_library(accountsplugin SHARED ${accountsplugin_SRCS}) diff --git a/framework/accounts/accountsplugin.cpp b/framework/accounts/accountsplugin.cpp index 0d77376b..83ae6f0b 100644 --- a/framework/accounts/accountsplugin.cpp +++ b/framework/accounts/accountsplugin.cpp @@ -22,6 +22,7 @@ #include "accountfactory.h" #include "maildircontroller.h" #include "kolabnowcontroller.h" +#include "gmailcontroller.h" #include @@ -32,4 +33,5 @@ void AccountsPlugin::registerTypes (const char *uri) qmlRegisterType(uri, 1, 0, "AccountsModel"); qmlRegisterType(uri, 1, 0, "MaildirController"); qmlRegisterType(uri, 1, 0, "KolabNowController"); + qmlRegisterType(uri, 1, 0, "GmailController"); } diff --git a/framework/accounts/gmailcontroller.cpp b/framework/accounts/gmailcontroller.cpp new file mode 100644 index 00000000..bc644ae9 --- /dev/null +++ b/framework/accounts/gmailcontroller.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2017 Michael Bohlender, + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "gmailcontroller.h" + +#include + +using namespace Sink; +using namespace Sink::ApplicationDomain; + +GmailController::GmailController() : Kube::Controller(), +action_create{new Kube::ControllerAction{this, &GmailController::create}}, +action_modify{new Kube::ControllerAction{this, &GmailController::modify}}, +action_remove{new Kube::ControllerAction{this, &GmailController::remove}} +{ + +} + +void GmailController::create() { + + //account + auto account = ApplicationDomainType::createEntity(); + account.setProperty("type", "imap"); + account.setProperty("name", getName()); + Store::create(account).exec().waitForFinished(); + + //imap + auto resource = ApplicationDomainType::createEntity(); + resource.setResourceType("sink.imap"); + resource.setAccount(account); + resource.setProperty("server","imaps://imap.gmail.com:993"); + resource.setProperty("username", getEmailAddress()); + resource.setProperty("password", getPassword()); + Store::create(resource).exec().waitForFinished(); + + //smtp + resource = ApplicationDomainType::createEntity(); + resource.setResourceType("sink.smtp"); + resource.setAccount(account); + resource.setProperty("server", "smtps://smtp.gmail.com:465"); + resource.setProperty("username", getEmailAddress()); + resource.setProperty("password", getPassword()); + Store::create(resource).exec().waitForFinished(); + + //identity + auto identity = ApplicationDomainType::createEntity(); + m_identityId = identity.identifier(); + identity.setAccount(account); + identity.setName(getIdentityName()); + identity.setAddress(getEmailAddress()); + Store::create(identity).exec(); +} + +void GmailController::modify() { + //TODO +} + +void GmailController::remove() { + SinkAccount account(m_accountId); + Store::remove(account).exec(); +} + +void GmailController::load(const QByteArray &id) { + + m_accountId = id; + + Store::fetchOne(Query().filter(m_accountId)) + .syncThen([this](const SinkAccount &account) { + setName(account.getName()); + }).exec(); + + //TODO +} + diff --git a/framework/accounts/gmailcontroller.h b/framework/accounts/gmailcontroller.h new file mode 100644 index 00000000..2a5ead65 --- /dev/null +++ b/framework/accounts/gmailcontroller.h @@ -0,0 +1,55 @@ +/* + Copyright (C) 2017 Michael Bohlender, + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#pragma once + +#include +#include +#include + +#include + +class GmailController : public Kube::Controller +{ + Q_OBJECT + + //Interface properties + KUBE_CONTROLLER_PROPERTY(QString, Name, name) + + KUBE_CONTROLLER_PROPERTY(QString, EmailAddress, emailAddress) + KUBE_CONTROLLER_PROPERTY(QString, Password, password) + KUBE_CONTROLLER_PROPERTY(QString, IdentityName, identityName) + + //Actions + KUBE_CONTROLLER_ACTION(create) + KUBE_CONTROLLER_ACTION(modify) + KUBE_CONTROLLER_ACTION(remove) + +public: + explicit GmailController(); + +public slots: + void load(const QByteArray &id); + +private: + QByteArray m_accountId; + QByteArray m_smtpId; + QByteArray m_imapId; + QByteArray m_identityId; +}; + -- cgit v1.2.3