From a5b1c1c4bd44741a54895c4e84846c045facce70 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 5 Apr 2017 13:14:56 +0200 Subject: kube-mail is now kube --- applications/CMakeLists.txt | 2 +- applications/kube/CMakeLists.txt | 50 ++++ applications/kube/main.cpp | 72 +++++ applications/kube/org.kde.kube.appdata.xml | 23 ++ applications/kube/org.kde.kube.desktop | 10 + applications/mail/CMakeLists.txt | 50 ---- applications/mail/main.cpp | 72 ----- applications/mail/org.kde.kube.appdata.xml | 23 -- applications/mail/org.kde.kube.desktop | 10 - components/CMakeLists.txt | 2 +- components/kube/contents/ui/Kube.qml | 455 +++++++++++++++++++++++++++++ components/kube/contents/ui/main.qml | 24 ++ components/kube/metadata.desktop | 8 + components/kube/qmldir | 3 + components/mail/contents/ui/Mail.qml | 455 ----------------------------- components/mail/contents/ui/main.qml | 24 -- components/mail/metadata.desktop | 8 - components/mail/qmldir | 3 - framework/qml/AutocompleteLineEdit.qml | 1 + framework/qml/PositiveButton.qml | 1 + tests/tst_applicationstart.qml | 4 +- 21 files changed, 651 insertions(+), 649 deletions(-) create mode 100644 applications/kube/CMakeLists.txt create mode 100644 applications/kube/main.cpp create mode 100644 applications/kube/org.kde.kube.appdata.xml create mode 100755 applications/kube/org.kde.kube.desktop delete mode 100644 applications/mail/CMakeLists.txt delete mode 100644 applications/mail/main.cpp delete mode 100644 applications/mail/org.kde.kube.appdata.xml delete mode 100755 applications/mail/org.kde.kube.desktop create mode 100644 components/kube/contents/ui/Kube.qml create mode 100644 components/kube/contents/ui/main.qml create mode 100644 components/kube/metadata.desktop create mode 100644 components/kube/qmldir delete mode 100644 components/mail/contents/ui/Mail.qml delete mode 100644 components/mail/contents/ui/main.qml delete mode 100644 components/mail/metadata.desktop delete mode 100644 components/mail/qmldir diff --git a/applications/CMakeLists.txt b/applications/CMakeLists.txt index f7e6f1d6..1c4b36aa 100644 --- a/applications/CMakeLists.txt +++ b/applications/CMakeLists.txt @@ -1 +1 @@ -add_subdirectory(mail) +add_subdirectory(kube) diff --git a/applications/kube/CMakeLists.txt b/applications/kube/CMakeLists.txt new file mode 100644 index 00000000..36ce6a34 --- /dev/null +++ b/applications/kube/CMakeLists.txt @@ -0,0 +1,50 @@ +project(kube) + +cmake_minimum_required(VERSION 2.8.12) +cmake_policy(SET CMP0063 NEW) + +include(CPack) +include(FeatureSummary) + +find_package(PkgConfig) + +################# set KDE specific information ################# + +if(APPLE OR WIN32) + # for an ecm_add_app_icon() implementation acception svg icons + set(ECM_MIN_VERSION 5.29.0) +else() + set(ECM_MIN_VERSION 0.0.8) +endif() +find_package(ECM ${ECM_MIN_VERSION} REQUIRED NO_MODULE) + +# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) + +include(KDEInstallDirs) +include(KDECMakeSettings) +include(KDECompilerSettings) +include(ECMAddAppIcon) + +find_package(Qt5 REQUIRED NO_MODULE COMPONENTS Core Quick Test Gui Widgets WebEngine) + +set (QT_MIN_VERSION "5.6.0") +find_package(KF5 REQUIRED COMPONENTS Package) + +# install executable +set(SRCS main.cpp) + +if(APPLE OR WIN32) + # Sets the icon on Windows and OSX + file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/../../icons/*-apps-kube_icon.*") + ecm_add_app_icon(SRCS ICONS ${ICONS_SRCS}) +endif() + +add_executable(${PROJECT_NAME} ${SRCS}) +qt5_use_modules(${PROJECT_NAME} Gui Quick Widgets WebEngine) +target_link_libraries(${PROJECT_NAME} KF5::Package) + +install(TARGETS ${PROJECT_NAME} DESTINATION ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) + +install(PROGRAMS org.kde.kube.desktop DESTINATION ${KDE_INSTALL_APPDIR} ) +install(FILES org.kde.kube.appdata.xml DESTINATION ${KDE_INSTALL_DATAROOTDIR}/appdata/) diff --git a/applications/kube/main.cpp b/applications/kube/main.cpp new file mode 100644 index 00000000..c893e029 --- /dev/null +++ b/applications/kube/main.cpp @@ -0,0 +1,72 @@ +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +class KubeImageProvider : public QQuickImageProvider +{ +public: + KubeImageProvider() + : QQuickImageProvider(QQuickImageProvider::Pixmap) + { + } + + QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) Q_DECL_OVERRIDE + { + const auto icon = QIcon::fromTheme(id); + auto expectedSize = requestedSize; + if (!icon.availableSizes().contains(requestedSize) && !icon.availableSizes().isEmpty()) { + expectedSize = icon.availableSizes().first(); + } + const auto pixmap = icon.pixmap(expectedSize); + if (size) { + *size = pixmap.size(); + } + return pixmap; + } +}; + +class WebUrlRequestInterceptor : public QWebEngineUrlRequestInterceptor +{ + Q_OBJECT +public: + WebUrlRequestInterceptor(QObject *p = Q_NULLPTR) : QWebEngineUrlRequestInterceptor{p} + {} + + void interceptRequest(QWebEngineUrlRequestInfo &info) + { + qDebug() << info.requestMethod() << info.requestUrl() << info.resourceType() << info.navigationType(); + const bool isNavigationRequest = info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeMainFrame; + if (isNavigationRequest) { + QDesktopServices::openUrl(info.requestUrl()); + info.block(true); + } + //TODO handle mailto to open a composer + } +}; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QtWebEngine::initialize(); + WebUrlRequestInterceptor *wuri = new WebUrlRequestInterceptor(); + QQuickWebEngineProfile::defaultProfile()->setRequestInterceptor(wuri); + QIcon::setThemeName("kube"); + + auto package = KPackage::PackageLoader::self()->loadPackage("KPackage/GenericQML", "org.kube.components.kube"); + Q_ASSERT(package.isValid()); + QQmlApplicationEngine engine; + engine.addImageProvider(QLatin1String("kube"), new KubeImageProvider); + engine.load(QUrl::fromLocalFile(package.filePath("mainscript"))); + return app.exec(); +} + +#include "main.moc" diff --git a/applications/kube/org.kde.kube.appdata.xml b/applications/kube/org.kde.kube.appdata.xml new file mode 100644 index 00000000..1946cac5 --- /dev/null +++ b/applications/kube/org.kde.kube.appdata.xml @@ -0,0 +1,23 @@ + + + org.kde.kube.desktop + CC0-1.0 + GPL-3.0+ + Kube + E-mail client + +

A modern groupware client based on QtQuick and Sink. + + The code can be found at: git://anongit.kde.org/kube + + The documentation can be found at: http://api.kde.org/doc/kube/.

+
+ https://phabricator.kde.org/project/view/43/ + https://bugs.kde.org/enter_bug.cgi?format=guided&product=kube + + + KDE + + kube + +
diff --git a/applications/kube/org.kde.kube.desktop b/applications/kube/org.kde.kube.desktop new file mode 100755 index 00000000..290fd503 --- /dev/null +++ b/applications/kube/org.kde.kube.desktop @@ -0,0 +1,10 @@ +[Desktop Entry] +Name=Kube +Type=Application +Exec=kube +Icon=kube_icon +GenericName=Mail Client +Comment=Send, receive and manage your mail with Kube +Terminal=false +StartupNotify=true +Categories=Qt;KDE;Office;Network;Email; diff --git a/applications/mail/CMakeLists.txt b/applications/mail/CMakeLists.txt deleted file mode 100644 index 56bbf98a..00000000 --- a/applications/mail/CMakeLists.txt +++ /dev/null @@ -1,50 +0,0 @@ -project(kube-mail) - -cmake_minimum_required(VERSION 2.8.12) -cmake_policy(SET CMP0063 NEW) - -include(CPack) -include(FeatureSummary) - -find_package(PkgConfig) - -################# set KDE specific information ################# - -if(APPLE OR WIN32) - # for an ecm_add_app_icon() implementation acception svg icons - set(ECM_MIN_VERSION 5.29.0) -else() - set(ECM_MIN_VERSION 0.0.8) -endif() -find_package(ECM ${ECM_MIN_VERSION} REQUIRED NO_MODULE) - -# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked -set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) - -include(KDEInstallDirs) -include(KDECMakeSettings) -include(KDECompilerSettings) -include(ECMAddAppIcon) - -find_package(Qt5 REQUIRED NO_MODULE COMPONENTS Core Quick Test Gui Widgets WebEngine) - -set (QT_MIN_VERSION "5.6.0") -find_package(KF5 REQUIRED COMPONENTS Package) - -# install executable -set(kube_mail_SRCS main.cpp) - -if(APPLE OR WIN32) - # Sets the icon on Windows and OSX - file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/../../icons/*-apps-kube_icon.*") - ecm_add_app_icon(kube_mail_SRCS ICONS ${ICONS_SRCS}) -endif() - -add_executable(${PROJECT_NAME} ${kube_mail_SRCS}) -qt5_use_modules(${PROJECT_NAME} Gui Quick Widgets WebEngine) -target_link_libraries(${PROJECT_NAME} KF5::Package) - -install(TARGETS ${PROJECT_NAME} DESTINATION ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) - -install(PROGRAMS org.kde.kube.desktop DESTINATION ${KDE_INSTALL_APPDIR} ) -install(FILES org.kde.kube.appdata.xml DESTINATION ${KDE_INSTALL_DATAROOTDIR}/appdata/) diff --git a/applications/mail/main.cpp b/applications/mail/main.cpp deleted file mode 100644 index b02c62d2..00000000 --- a/applications/mail/main.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -class KubeImageProvider : public QQuickImageProvider -{ -public: - KubeImageProvider() - : QQuickImageProvider(QQuickImageProvider::Pixmap) - { - } - - QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) Q_DECL_OVERRIDE - { - const auto icon = QIcon::fromTheme(id); - auto expectedSize = requestedSize; - if (!icon.availableSizes().contains(requestedSize) && !icon.availableSizes().isEmpty()) { - expectedSize = icon.availableSizes().first(); - } - const auto pixmap = icon.pixmap(expectedSize); - if (size) { - *size = pixmap.size(); - } - return pixmap; - } -}; - -class WebUrlRequestInterceptor : public QWebEngineUrlRequestInterceptor -{ - Q_OBJECT -public: - WebUrlRequestInterceptor(QObject *p = Q_NULLPTR) : QWebEngineUrlRequestInterceptor{p} - {} - - void interceptRequest(QWebEngineUrlRequestInfo &info) - { - qDebug() << info.requestMethod() << info.requestUrl() << info.resourceType() << info.navigationType(); - const bool isNavigationRequest = info.resourceType() == QWebEngineUrlRequestInfo::ResourceTypeMainFrame; - if (isNavigationRequest) { - QDesktopServices::openUrl(info.requestUrl()); - info.block(true); - } - //TODO handle mailto to open a composer - } -}; - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - QtWebEngine::initialize(); - WebUrlRequestInterceptor *wuri = new WebUrlRequestInterceptor(); - QQuickWebEngineProfile::defaultProfile()->setRequestInterceptor(wuri); - QIcon::setThemeName("kube"); - - auto package = KPackage::PackageLoader::self()->loadPackage("KPackage/GenericQML", "org.kube.components.mail"); - Q_ASSERT(package.isValid()); - QQmlApplicationEngine engine; - engine.addImageProvider(QLatin1String("kube"), new KubeImageProvider); - engine.load(QUrl::fromLocalFile(package.filePath("mainscript"))); - return app.exec(); -} - -#include "main.moc" diff --git a/applications/mail/org.kde.kube.appdata.xml b/applications/mail/org.kde.kube.appdata.xml deleted file mode 100644 index 90bef45b..00000000 --- a/applications/mail/org.kde.kube.appdata.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - org.kde.kube.desktop - CC0-1.0 - GPL-3.0+ - Kube - E-mail client - -

A modern groupware client based on QtQuick and Sink. - - The code can be found at: git://anongit.kde.org/kube - - The documentation can be found at: http://api.kde.org/doc/kube/.

-
- https://phabricator.kde.org/project/view/43/ - https://bugs.kde.org/enter_bug.cgi?format=guided&product=kube - - - KDE - - kube-mail - -
diff --git a/applications/mail/org.kde.kube.desktop b/applications/mail/org.kde.kube.desktop deleted file mode 100755 index 83d57dd8..00000000 --- a/applications/mail/org.kde.kube.desktop +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Name=Kube -Type=Application -Exec=kube-mail -Icon=kube_icon -GenericName=Mail Client -Comment=Send, receive and manage your mail with Kube -Terminal=false -StartupNotify=true -Categories=Qt;KDE;Office;Network;Email; diff --git a/components/CMakeLists.txt b/components/CMakeLists.txt index e339a700..3283286f 100644 --- a/components/CMakeLists.txt +++ b/components/CMakeLists.txt @@ -29,6 +29,6 @@ macro(install_component name) kpackage_install_package(${name} org.kube.components.${name} "genericqml") endmacro(install_component) -install_component(mail) +install_component(kube) install_component(accounts) install_component(mailviewer) diff --git a/components/kube/contents/ui/Kube.qml b/components/kube/contents/ui/Kube.qml new file mode 100644 index 00000000..7cabf9a9 --- /dev/null +++ b/components/kube/contents/ui/Kube.qml @@ -0,0 +1,455 @@ +/* + * 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. + */ + + +import QtQuick 2.7 +import QtQuick.Controls 1.3 +import QtQuick.Layouts 1.1 + +import QtQuick.Controls 2.0 as Controls2 + +import org.kube.framework 1.0 as Kube +import org.kube.components.accounts 1.0 as KubeAccounts + +Controls2.ApplicationWindow { + id: app + + //FIXME remove fixed pixel hight + //for now just convinience during testing + height: 1080 * 0.8 + width: 1920 * 0.8 + + visible: true + + Kube.NotificationHandler { + id: notificationHandler + function handler(n) { + console.warn("We got a notification: ", n.message) + if (n.type == Kube.Notification.Warning) { + console.warn("And it's a warning!", n.type) + } + notificationPopup.notify(n.message); + } + } + + //BEGIN Actions + Kube.Context { + id: maillistcontext + property variant mail + property bool isDraft + mail: mailListView.currentMail + isDraft: mailListView.isDraft + } + + Kube.Action { + id: replyAction + actionId: "org.kde.kube.actions.reply" + context: maillistcontext + } + //END Actions + + //BEGIN ActionHandler + Kube.ActionHandler { + actionId: "org.kde.kube.actions.reply" + function isReady(context) { + return context.mail ? true : false; + } + + function handler(context) { + composer.loadMessage(context.mail, false) + composer.open() + } + } + + Kube.ActionHandler { + actionId: "org.kde.kube.actions.edit" + function isReady(context) { + return context.mail && context.isDraft; + } + function handler(context) { + composer.loadMessage(context.mail, true) + composer.open() + } + } + //END ActionHandler + + //Controller + Kube.MailController { + id: mailController + Binding on threadLeader { + //!! checks for the availability of the type + when: !!mailListView.currentMail + value: mailListView.currentMail + } + } + + Kube.FolderController { + id: folderController + Binding on folder { + //!! checks for the availability of the type + when: !!folderListView.currentFolder + value: folderListView.currentFolder + } + } + + //Model + Kube.AccountsModel { + id: currentAccountModel + accountId: accountSwitcher.accountId + } + + //BEGIN Shortcuts + Shortcut { + sequence: StandardKey.Refresh + onActivated: folderController.synchronizeAction.execute() + enabled: folderController.synchronizeAction.enabled + } + Shortcut { + sequence: StandardKey.Delete + onActivated: mailController.moveToTrashAction.execute() + enabled: mailController.moveToTrashAction.enabled + } + Shortcut { + sequence: StandardKey.MoveToNextLine + onActivated: mailListView.currentIndex++ + } + Shortcut { + sequence: StandardKey.MoveToPreviousLine + onActivated: mailListView.currentIndex-- + } + //END Shortcuts + + //BEGIN background + Rectangle { + anchors.fill: parent + + color: Kube.Colors.backgroundColor + } + //END background + + //BEGIN Main content + SplitView { + anchors { + top: app.top + left: app.left + } + + height: app.height + width: app.width + + Rectangle { + width: Kube.Units.gridUnit * 10 + Layout.maximumWidth: app.width * 0.25 + Layout.minimumWidth: Kube.Units.gridUnit * 5 + + color: Kube.Colors.textColor + + Controls2.ToolBar { + id: toolBar + + anchors { + top: parent.top + left: parent.left + right: parent.right + } + + RowLayout { + anchors.centerIn: parent + + spacing: Kube.Units.largeSpacing + + Kube.AccountSwitcher { + id: accountSwitcher + iconName: Kube.Icons.menu + height: Kube.Units.gridUnit * 1.5 + width: height + } + + ToolButton { + iconName: Kube.Icons.user + height: Kube.Units.gridUnit * 1.5 + width: height + + onClicked: { + people.open() + } + } + + ToolButton { + iconName: Kube.Icons.search + height: Kube.Units.gridUnit * 1.5 + width: height + + onClicked: { + search.open() + } + } + } + } + + Kube.PositiveButton { + id: newMailButton + + anchors { + top: toolBar.bottom + left: parent.left + right: parent.right + margins: Kube.Units.largeSpacing + } + + text: qsTr("New Email") + + onClicked: { + composer.open() + } + } + + Item { + id: accountName + + Kube.FolderController { + id: accountNameFolderController + accountId: accountSwitcher.accountId + } + + Menu { + id: contextMenu + title: "Edit" + + MenuItem { + text: "Synchronize" + onTriggered: { + accountNameFolderController.synchronizeAction.execute() + } + } + } + + anchors { + top: newMailButton.bottom + topMargin: Kube.Units.smallSpacing + } + + width: parent.width + height: Kube.Units.gridUnit * 2 + + MouseArea { + anchors.fill: parent + acceptedButtons: Qt.RightButton + onClicked: { + contextMenu.popup() + } + } + + Repeater { + model: currentAccountModel + Row { + spacing: Kube.Units.smallSpacing + anchors { + bottom: parent.bottom + left: parent.left + leftMargin: Kube.Units.smallSpacing + } + Layout.fillHeight: true + + Text { + text: model.name + font.weight: Font.DemiBold + color: Kube.Colors.highlightedTextColor + } + + Kube.Icon { + id: statusIcon + visible: false + iconName: "" + states: [ + State { + name: "busy"; when: model.status == Kube.AccountsModel.BusyStatus + PropertyChanges { target: statusIcon; iconName: Kube.Icons.busy; visible: true } + }, + State { + name: "error"; when: model.status == Kube.AccountsModel.ErrorStatus + PropertyChanges { target: statusIcon; iconName: Kube.Icons.error; visible: true } + }, + State { + name: "checkmark"; when: model.status == Kube.AccountsModel.ConnectedStatus + PropertyChanges { target: statusIcon; iconName: Kube.Icons.connected; visible: true } + }, + State { + name: "disconnected"; when: model.status == Kube.AccountsModel.OfflineStatus + PropertyChanges { target: statusIcon; iconName: Kube.Icons.noNetworkConnection; visible: true } + } + ] + } + } + } + } + + Kube.FolderListView { + id: folderListView + + anchors { + top: accountName.bottom + topMargin: Kube.Units.smallSpacing + bottom: statusBar.top + left: parent.left + right: parent.right + } + + focus: true + accountId: accountSwitcher.accountId + } + + Item { + id: statusBar + anchors { + topMargin: Kube.Units.smallSpacing + bottom: outbox.top + left: parent.left + right: parent.right + } + + height: Kube.Units.gridUnit + + Repeater { + model: currentAccountModel + Text { + id: statusText + anchors.centerIn: parent + visible: false + color: Kube.Colors.highlightedTextColor + states: [ + State { + name: "disconnected"; when: model.status == Kube.AccountsModel.OfflineStatus + PropertyChanges { target: statusText; text: "Offline"; visible: true } + } + ] + } + } + } + + Kube.Outbox { + id: outbox + + anchors { + bottom: parent.bottom + left: parent.left + right: parent.right + } + height: Kube.Units.gridUnit * 1.5 + } + } + + Kube.MailListView { + id: mailListView + parentFolder: folderListView.currentFolder + width: Kube.Units.gridUnit * 20 + height: parent.height + Layout.maximumWidth: app.width * 0.4 + Layout.minimumWidth: Kube.Units.gridUnit * 10 + focus: true + } + + Kube.ConversationView { + id: mailView + mail: mailListView.currentMail + Layout.fillWidth: true + } + } + //END Main content + + //BEGIN Composer + Kube.FocusComposer { + id: composer + + height: app.height * 0.85 + width: app.width * 0.85 + + x: app.width * 0.075 + y: app.height * 0.075 + } + //END Composer + + //BEGIN AccountWizard + KubeAccounts.AccountWizard { + id: accountWizard + + height: app.height * 0.85 + width: app.width * 0.85 + + x: app.width * 0.075 + y: app.height * 0.075 + } + //END AccountWizard + + //BEGIN Notification + Kube.NotificationPopup { + id: notificationPopup + + anchors { + top: parent.top + horizontalCenter: parent.horizontalCenter + } + } + //END Notification + + //BEGIN Search + Controls2.Popup { + id: search + + width: app.width * 0.6 + height: Kube.Units.gridUnit * 3 + + x: app.width * 0.2 + y: app.height * 0.2 + + modal: true + focus: true + + RowLayout { + anchors.fill: parent + + Controls2.TextField { + id: searchField + Layout.fillWidth: true + placeholderText: "Search... is not available in this beta" + } + + Controls2.Button { + text: "Go" + + onClicked: { + search.close() + } + } + } + } + //END Search + + //BEGIN People + Kube.People { + id: people + + height: app.height * 0.85 + width: app.width * 0.85 + + x: app.width * 0.075 + y: app.height * 0.075 + + } + //END People +} diff --git a/components/kube/contents/ui/main.qml b/components/kube/contents/ui/main.qml new file mode 100644 index 00000000..4391ebe5 --- /dev/null +++ b/components/kube/contents/ui/main.qml @@ -0,0 +1,24 @@ +/* + * 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. + */ + +import QtQuick 2.7 +import org.kube.components.kube 1.0 as KubeComponent + +KubeComponent.Kube { + +} diff --git a/components/kube/metadata.desktop b/components/kube/metadata.desktop new file mode 100644 index 00000000..581bbdf4 --- /dev/null +++ b/components/kube/metadata.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Name=Kube +X-KDE-PluginInfo-Name=org.kube.components.kube +Exec=kpackagelauncherqml -a org.kube.components.kube +X-Plasma-MainScript=ui/main.qml +X-KDE-ServiceTypes=KPackage/GenericQML +Icon=kmail2 +Type=Service diff --git a/components/kube/qmldir b/components/kube/qmldir new file mode 100644 index 00000000..f663c916 --- /dev/null +++ b/components/kube/qmldir @@ -0,0 +1,3 @@ +module org.kube.components.kube + +Kube 1.0 Kube.qml diff --git a/components/mail/contents/ui/Mail.qml b/components/mail/contents/ui/Mail.qml deleted file mode 100644 index 7cabf9a9..00000000 --- a/components/mail/contents/ui/Mail.qml +++ /dev/null @@ -1,455 +0,0 @@ -/* - * 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. - */ - - -import QtQuick 2.7 -import QtQuick.Controls 1.3 -import QtQuick.Layouts 1.1 - -import QtQuick.Controls 2.0 as Controls2 - -import org.kube.framework 1.0 as Kube -import org.kube.components.accounts 1.0 as KubeAccounts - -Controls2.ApplicationWindow { - id: app - - //FIXME remove fixed pixel hight - //for now just convinience during testing - height: 1080 * 0.8 - width: 1920 * 0.8 - - visible: true - - Kube.NotificationHandler { - id: notificationHandler - function handler(n) { - console.warn("We got a notification: ", n.message) - if (n.type == Kube.Notification.Warning) { - console.warn("And it's a warning!", n.type) - } - notificationPopup.notify(n.message); - } - } - - //BEGIN Actions - Kube.Context { - id: maillistcontext - property variant mail - property bool isDraft - mail: mailListView.currentMail - isDraft: mailListView.isDraft - } - - Kube.Action { - id: replyAction - actionId: "org.kde.kube.actions.reply" - context: maillistcontext - } - //END Actions - - //BEGIN ActionHandler - Kube.ActionHandler { - actionId: "org.kde.kube.actions.reply" - function isReady(context) { - return context.mail ? true : false; - } - - function handler(context) { - composer.loadMessage(context.mail, false) - composer.open() - } - } - - Kube.ActionHandler { - actionId: "org.kde.kube.actions.edit" - function isReady(context) { - return context.mail && context.isDraft; - } - function handler(context) { - composer.loadMessage(context.mail, true) - composer.open() - } - } - //END ActionHandler - - //Controller - Kube.MailController { - id: mailController - Binding on threadLeader { - //!! checks for the availability of the type - when: !!mailListView.currentMail - value: mailListView.currentMail - } - } - - Kube.FolderController { - id: folderController - Binding on folder { - //!! checks for the availability of the type - when: !!folderListView.currentFolder - value: folderListView.currentFolder - } - } - - //Model - Kube.AccountsModel { - id: currentAccountModel - accountId: accountSwitcher.accountId - } - - //BEGIN Shortcuts - Shortcut { - sequence: StandardKey.Refresh - onActivated: folderController.synchronizeAction.execute() - enabled: folderController.synchronizeAction.enabled - } - Shortcut { - sequence: StandardKey.Delete - onActivated: mailController.moveToTrashAction.execute() - enabled: mailController.moveToTrashAction.enabled - } - Shortcut { - sequence: StandardKey.MoveToNextLine - onActivated: mailListView.currentIndex++ - } - Shortcut { - sequence: StandardKey.MoveToPreviousLine - onActivated: mailListView.currentIndex-- - } - //END Shortcuts - - //BEGIN background - Rectangle { - anchors.fill: parent - - color: Kube.Colors.backgroundColor - } - //END background - - //BEGIN Main content - SplitView { - anchors { - top: app.top - left: app.left - } - - height: app.height - width: app.width - - Rectangle { - width: Kube.Units.gridUnit * 10 - Layout.maximumWidth: app.width * 0.25 - Layout.minimumWidth: Kube.Units.gridUnit * 5 - - color: Kube.Colors.textColor - - Controls2.ToolBar { - id: toolBar - - anchors { - top: parent.top - left: parent.left - right: parent.right - } - - RowLayout { - anchors.centerIn: parent - - spacing: Kube.Units.largeSpacing - - Kube.AccountSwitcher { - id: accountSwitcher - iconName: Kube.Icons.menu - height: Kube.Units.gridUnit * 1.5 - width: height - } - - ToolButton { - iconName: Kube.Icons.user - height: Kube.Units.gridUnit * 1.5 - width: height - - onClicked: { - people.open() - } - } - - ToolButton { - iconName: Kube.Icons.search - height: Kube.Units.gridUnit * 1.5 - width: height - - onClicked: { - search.open() - } - } - } - } - - Kube.PositiveButton { - id: newMailButton - - anchors { - top: toolBar.bottom - left: parent.left - right: parent.right - margins: Kube.Units.largeSpacing - } - - text: qsTr("New Email") - - onClicked: { - composer.open() - } - } - - Item { - id: accountName - - Kube.FolderController { - id: accountNameFolderController - accountId: accountSwitcher.accountId - } - - Menu { - id: contextMenu - title: "Edit" - - MenuItem { - text: "Synchronize" - onTriggered: { - accountNameFolderController.synchronizeAction.execute() - } - } - } - - anchors { - top: newMailButton.bottom - topMargin: Kube.Units.smallSpacing - } - - width: parent.width - height: Kube.Units.gridUnit * 2 - - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.RightButton - onClicked: { - contextMenu.popup() - } - } - - Repeater { - model: currentAccountModel - Row { - spacing: Kube.Units.smallSpacing - anchors { - bottom: parent.bottom - left: parent.left - leftMargin: Kube.Units.smallSpacing - } - Layout.fillHeight: true - - Text { - text: model.name - font.weight: Font.DemiBold - color: Kube.Colors.highlightedTextColor - } - - Kube.Icon { - id: statusIcon - visible: false - iconName: "" - states: [ - State { - name: "busy"; when: model.status == Kube.AccountsModel.BusyStatus - PropertyChanges { target: statusIcon; iconName: Kube.Icons.busy; visible: true } - }, - State { - name: "error"; when: model.status == Kube.AccountsModel.ErrorStatus - PropertyChanges { target: statusIcon; iconName: Kube.Icons.error; visible: true } - }, - State { - name: "checkmark"; when: model.status == Kube.AccountsModel.ConnectedStatus - PropertyChanges { target: statusIcon; iconName: Kube.Icons.connected; visible: true } - }, - State { - name: "disconnected"; when: model.status == Kube.AccountsModel.OfflineStatus - PropertyChanges { target: statusIcon; iconName: Kube.Icons.noNetworkConnection; visible: true } - } - ] - } - } - } - } - - Kube.FolderListView { - id: folderListView - - anchors { - top: accountName.bottom - topMargin: Kube.Units.smallSpacing - bottom: statusBar.top - left: parent.left - right: parent.right - } - - focus: true - accountId: accountSwitcher.accountId - } - - Item { - id: statusBar - anchors { - topMargin: Kube.Units.smallSpacing - bottom: outbox.top - left: parent.left - right: parent.right - } - - height: Kube.Units.gridUnit - - Repeater { - model: currentAccountModel - Text { - id: statusText - anchors.centerIn: parent - visible: false - color: Kube.Colors.highlightedTextColor - states: [ - State { - name: "disconnected"; when: model.status == Kube.AccountsModel.OfflineStatus - PropertyChanges { target: statusText; text: "Offline"; visible: true } - } - ] - } - } - } - - Kube.Outbox { - id: outbox - - anchors { - bottom: parent.bottom - left: parent.left - right: parent.right - } - height: Kube.Units.gridUnit * 1.5 - } - } - - Kube.MailListView { - id: mailListView - parentFolder: folderListView.currentFolder - width: Kube.Units.gridUnit * 20 - height: parent.height - Layout.maximumWidth: app.width * 0.4 - Layout.minimumWidth: Kube.Units.gridUnit * 10 - focus: true - } - - Kube.ConversationView { - id: mailView - mail: mailListView.currentMail - Layout.fillWidth: true - } - } - //END Main content - - //BEGIN Composer - Kube.FocusComposer { - id: composer - - height: app.height * 0.85 - width: app.width * 0.85 - - x: app.width * 0.075 - y: app.height * 0.075 - } - //END Composer - - //BEGIN AccountWizard - KubeAccounts.AccountWizard { - id: accountWizard - - height: app.height * 0.85 - width: app.width * 0.85 - - x: app.width * 0.075 - y: app.height * 0.075 - } - //END AccountWizard - - //BEGIN Notification - Kube.NotificationPopup { - id: notificationPopup - - anchors { - top: parent.top - horizontalCenter: parent.horizontalCenter - } - } - //END Notification - - //BEGIN Search - Controls2.Popup { - id: search - - width: app.width * 0.6 - height: Kube.Units.gridUnit * 3 - - x: app.width * 0.2 - y: app.height * 0.2 - - modal: true - focus: true - - RowLayout { - anchors.fill: parent - - Controls2.TextField { - id: searchField - Layout.fillWidth: true - placeholderText: "Search... is not available in this beta" - } - - Controls2.Button { - text: "Go" - - onClicked: { - search.close() - } - } - } - } - //END Search - - //BEGIN People - Kube.People { - id: people - - height: app.height * 0.85 - width: app.width * 0.85 - - x: app.width * 0.075 - y: app.height * 0.075 - - } - //END People -} diff --git a/components/mail/contents/ui/main.qml b/components/mail/contents/ui/main.qml deleted file mode 100644 index abf0465d..00000000 --- a/components/mail/contents/ui/main.qml +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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. - */ - -import QtQuick 2.7 -import org.kube.components.mail 1.0 as MailComponent - -MailComponent.Mail { - -} diff --git a/components/mail/metadata.desktop b/components/mail/metadata.desktop deleted file mode 100644 index 470ad18c..00000000 --- a/components/mail/metadata.desktop +++ /dev/null @@ -1,8 +0,0 @@ -[Desktop Entry] -Name=Kube Mail -X-KDE-PluginInfo-Name=org.kube.components.mail -Exec=kpackagelauncherqml -a org.kube.components.mail -X-Plasma-MainScript=ui/main.qml -X-KDE-ServiceTypes=KPackage/GenericQML -Icon=kmail2 -Type=Service diff --git a/components/mail/qmldir b/components/mail/qmldir deleted file mode 100644 index 2c0088f6..00000000 --- a/components/mail/qmldir +++ /dev/null @@ -1,3 +0,0 @@ -module org.kube.components.mail - -Mail 1.0 Mail.qml diff --git a/framework/qml/AutocompleteLineEdit.qml b/framework/qml/AutocompleteLineEdit.qml index c9b8e708..a232ee68 100644 --- a/framework/qml/AutocompleteLineEdit.qml +++ b/framework/qml/AutocompleteLineEdit.qml @@ -21,6 +21,7 @@ import QtQuick.Controls 2.0 as Controls2 import QtQuick.Layouts 1.1 import org.kde.kirigami 1.0 as Kirigami +import org.kube.framework 1.0 as Kube Controls2.TextField { id: textField diff --git a/framework/qml/PositiveButton.qml b/framework/qml/PositiveButton.qml index 37ddae51..9e23ee5d 100644 --- a/framework/qml/PositiveButton.qml +++ b/framework/qml/PositiveButton.qml @@ -18,6 +18,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.0 as Controls +import org.kube.framework 1.0 as Kube Controls.AbstractButton { id: root diff --git a/tests/tst_applicationstart.qml b/tests/tst_applicationstart.qml index 15809395..b5d7a396 100644 --- a/tests/tst_applicationstart.qml +++ b/tests/tst_applicationstart.qml @@ -21,7 +21,7 @@ import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.Window 2.1 import QtTest 1.0 -import org.kube.components.mail 1.0 as KubeMail +import org.kube.components.kube 1.0 as Kube TestCase { @@ -30,7 +30,7 @@ TestCase { height: 400 name: "ApplicationStart" - KubeMail.Mail { + Kube.Kube { } function test_stuff() { -- cgit v1.2.3