diff --git a/accounts/kolabnow/qml/Login.qml b/accounts/kolabnow/qml/Login.qml index 87d0ca7c..fa07481f 100644 --- a/accounts/kolabnow/qml/Login.qml +++ b/accounts/kolabnow/qml/Login.qml @@ -1,73 +1,73 @@ /* Copyright (C) 2016 Michael Bohlender, Copyright (C) 2017 Christian Mollekopf, 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.4 import QtQuick.Layouts 1.1 import org.kube.framework 1.0 as Kube import org.kube.accounts.kolabnow 1.0 as KolabnowAccount Item { property alias accountId: settings.accountIdentifier property string heading: qsTr("Login") property string subheadline: settings.accountName property bool valid: pwField.acceptableInput KolabnowAccount.KolabnowSettings { id: settings accountType: "kolabnow" } function login(){ settings.login({accountSecret: pwField.text}) if (!!extensionPoint.item) { extensionPoint.item.storeSecret(accountId, settings.emailAddress, {accountSecret: pwField.text}) } } GridLayout { anchors { fill: parent } columns: 2 columnSpacing: Kube.Units.largeSpacing rowSpacing: Kube.Units.largeSpacing Kube.Label { text: qsTr("Password") Layout.alignment: Qt.AlignRight } Kube.PasswordField { id: pwField Layout.fillWidth: true focus: true placeholderText: qsTr("Password of your Kolab Now account") - text: !!extensionPoint.item ? extensionPoint.item.secret.accountSecret : "" + text: (!!extensionPoint.item && !!extensionPoint.item.secret) ? extensionPoint.item.secret.accountSecret : "" } Row { Layout.columnSpan: 2 Kube.ExtensionPoint { id: extensionPoint extensionPoint: "extensions/login" context: {"accountId": settings.accountIdentifier} } } } } diff --git a/framework/src/accounts/accountsmodel.cpp b/framework/src/accounts/accountsmodel.cpp index 4b26bb5b..2ce47926 100644 --- a/framework/src/accounts/accountsmodel.cpp +++ b/framework/src/accounts/accountsmodel.cpp @@ -1,127 +1,125 @@ /* Copyright (c) 2016 Christian Mollekopf This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "accountsmodel.h" #include using namespace Sink; using namespace Sink::ApplicationDomain; AccountsModel::AccountsModel(QObject *parent) : QIdentityProxyModel(parent) { Sink::Query query; query.setFlags(Query::LiveQuery); query.request(); query.request(); query.request(); runQuery(query); } AccountsModel::~AccountsModel() { } QHash< int, QByteArray > AccountsModel::roleNames() const { return { {Name, "name"}, {Icon, "icon"}, {AccountId, "accountId"}, {Status, "status"} }; } QVariant AccountsModel::data(const QModelIndex &idx, int role) const { auto srcIdx = mapToSource(idx); auto account = srcIdx.data(Sink::Store::DomainObjectRole).value(); switch (role) { case Name: return account->getName(); case Icon: return account->getIcon(); case AccountId: return account->identifier(); case Status: switch (account->getStatus()) { case Sink::ApplicationDomain::ErrorStatus: return ErrorStatus; case Sink::ApplicationDomain::BusyStatus: return BusyStatus; case Sink::ApplicationDomain::ConnectedStatus: return ConnectedStatus; case Sink::ApplicationDomain::OfflineStatus: return OfflineStatus; } return NoStatus; } return QIdentityProxyModel::data(idx, role); } void AccountsModel::runQuery(const Sink::Query &query) { mModel = Sink::Store::loadModel(query); setSourceModel(mModel.data()); } void AccountsModel::setAccountId(const QByteArray &accountId) { - qWarning() << "Setting account id" << accountId; if (accountId.isEmpty()) { setSourceModel(nullptr); mModel.clear(); return; } Sink::Query query; query.filter(accountId); query.setFlags(Query::LiveQuery); query.request(); query.request(); query.request(); runQuery(query); } QByteArray AccountsModel::accountId() const { return {}; } void AccountsModel::setResourceId(const QByteArray &resourceId) { - qWarning() << "Setting resource id" << resourceId; if (resourceId.isEmpty()) { setSourceModel(nullptr); mModel.clear(); return; } Sink::Store::fetchOne(Sink::Query{}.filter(resourceId)).guard(this).then([this] (const Sink::ApplicationDomain::SinkResource &resource) { Sink::Query query; query.filter(resource.getAccount()); query.request(); query.request(); query.request(); runQuery(query); }).exec(); } QByteArray AccountsModel::resourceId() const { return {}; } diff --git a/framework/src/domain/recepientautocompletionmodel.cpp b/framework/src/domain/recepientautocompletionmodel.cpp index 0fa7c0ac..c1a11751 100644 --- a/framework/src/domain/recepientautocompletionmodel.cpp +++ b/framework/src/domain/recepientautocompletionmodel.cpp @@ -1,134 +1,132 @@ /* Copyright (c) 2016 Christian Mollekopf This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "recepientautocompletionmodel.h" #include #include #include #include #include #include #include #include using namespace Sink::ApplicationDomain; RecipientAutocompletionModel::RecipientAutocompletionModel(QObject *parent) : QSortFilterProxyModel(parent), mSourceModel(new QStandardItemModel), mTimer(new QTimer) { setSourceModel(mSourceModel.data()); setDynamicSortFilter(true); setFilterCaseSensitivity(Qt::CaseInsensitive); mTimer->setSingleShot(true); QObject::connect(mTimer.data(), &QTimer::timeout, this, &RecipientAutocompletionModel::save); load(); } RecipientAutocompletionModel::~RecipientAutocompletionModel() { save(); } static QString getPath() { return QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/kube/recepientautocompletion.ini"; } void RecipientAutocompletionModel::save() { QSet list; for (int row = 0; row < mSourceModel->rowCount(); row++) { list << mSourceModel->item(row)->data(Text).toString(); } - qWarning() << "Path " << getPath(); QSettings settings(getPath(), QSettings::IniFormat); settings.setValue("list", QStringList{list.toList()}); } void RecipientAutocompletionModel::load() { - qWarning() << "Path " << getPath(); QSettings settings(getPath(), QSettings::IniFormat); auto list = settings.value("list").toStringList(); auto add = [] (const QString &n) { auto item = new QStandardItem{n}; item->setData(n, Text); return item; }; for (const auto &entry : list) { mSourceModel->appendRow(add(entry)); } Sink::Query query; query.request(); query.request(); Sink::Store::fetchAll(query) .then([this] (const QList &list) { for (const auto &c : list) { for (const auto &email : c->getEmails()) { addToModel(email.email, c->getFn()); } } }).exec(); } QHash< int, QByteArray > RecipientAutocompletionModel::roleNames() const { QHash roles; roles[Text] = "text"; roles[Color] = "color"; return roles; } bool RecipientAutocompletionModel::addToModel(const QString &address, const QString &name) { auto add = [] (const QString &n) { auto item = new QStandardItem{n}; item->setData(n, Text); return item; }; auto formattedName = [&] () { if (name.isEmpty()) { return QString(address); } return QString("%1 <%2>").arg(QString(name), QString(address)); }(); auto matches = mSourceModel->findItems(formattedName); if (matches.isEmpty()) { mSourceModel->appendRow(add(formattedName)); return true; } return false; } void RecipientAutocompletionModel::addEntry(const QByteArray &address, const QByteArray &name) { if (addToModel(address, name)) { mTimer->start(100); } } void RecipientAutocompletionModel::setFilter(const QString &filter) { setFilterWildcard("*" + filter +"*"); }