diff options
author | Fabian Müller <fmueller@owncloud.com> | 2022-08-18 16:35:54 +0300 |
---|---|---|
committer | Fabian Müller <fmueller@owncloud.com> | 2022-08-22 23:07:24 +0300 |
commit | 6d4577b9b4b962e5cace402aefcde56db7114e18 (patch) | |
tree | 41cfde6bb42c6003e42c3bca73c6d4861be7002c | |
parent | 99e2e6975f75c170b50794302da518f2b4205b80 (diff) |
Use the same login widgets everywherework/loginwidgets-wizard
This commit adapts the new widgets created for the login required dialog (#10011) to be used within the new setup wizard, providing a unified experience for our users.
33 files changed, 868 insertions, 869 deletions
diff --git a/src/gui/accountsettings.cpp b/src/gui/accountsettings.cpp index 4fd6bbc59..c61de6762 100644 --- a/src/gui/accountsettings.cpp +++ b/src/gui/accountsettings.cpp @@ -57,7 +57,7 @@ #include "account.h" #include "askexperimentalvirtualfilesfeaturemessagebox.h" #include "loginrequireddialog.h" -#include "oauthloginrequiredwidget.h" +#include "oauthloginwidget.h" namespace OCC { @@ -805,12 +805,30 @@ void AccountSettings::slotAccountStateChanged() qCDebug(lcAccountSettings) << "showing modal dialog asking user to log in again via OAuth2"; - auto *contentWidget = new OAuthLoginRequiredWidget(account); + auto *contentWidget = new OAuthLoginWidget(); + _askForOAuthLoginDialog = new LoginRequiredDialog(contentWidget, ocApp()->gui()->settingsDialog()); + connect(contentWidget, &OAuthLoginWidget::copyUrlToClipboardButtonClicked, _askForOAuthLoginDialog, [account]() { + // TODO: use authorisationLinkAsync + auto link = qobject_cast<HttpCredentialsGui *>(account->credentials())->authorisationLink().toString(); + ocApp()->clipboard()->setText(link); + }); + + connect(contentWidget, &OAuthLoginWidget::openBrowserButtonClicked, _askForOAuthLoginDialog, [cred]() { + cred->openBrowser(); + }); + + contentWidget->setEnabled(false); + connect(cred, &HttpCredentialsGui::authorisationLinkChanged, this, [contentWidget]() { + contentWidget->setEnabled(true); + }); + // make sure it's cleaned up since it's not owned by the account settings (also prevents memory leaks) _askForOAuthLoginDialog->setAttribute(Qt::WA_DeleteOnClose); + _askForOAuthLoginDialog->setTopLabelText(tr("The account %1 is currently logged out.\n\nPlease authenticate using your browser.").arg(account->displayName())); + connect( cred, &HttpCredentialsGui::authorisationLinkChanged, this, &AccountSettings::slotAccountStateChanged, @@ -825,6 +843,10 @@ void AccountSettings::slotAccountStateChanged() _askForOAuthLoginDialog->show(); ocApp()->gui()->raiseDialog(_askForOAuthLoginDialog); + + QTimer::singleShot(0, [contentWidget]() { + contentWidget->setFocus(Qt::OtherFocusReason); + }); } else { showConnectionLabel(tr("Connecting to %1...").arg(serverWithUser)); } diff --git a/src/gui/accountsettings.h b/src/gui/accountsettings.h index 694366093..2863a888b 100644 --- a/src/gui/accountsettings.h +++ b/src/gui/accountsettings.h @@ -22,9 +22,10 @@ #include <QTimer> #include "folder.h" -#include "quotainfo.h" -#include "progressdispatcher.h" +#include "loginrequireddialog.h" #include "owncloudgui.h" +#include "progressdispatcher.h" +#include "quotainfo.h" class QModelIndex; class QNetworkReply; @@ -105,7 +106,7 @@ private: QAction *_addAccountAction; // needed to make sure we show only one dialog at a time - QPointer<QDialog> _askForOAuthLoginDialog = nullptr; + QPointer<LoginRequiredDialog> _askForOAuthLoginDialog = nullptr; }; } // namespace OCC diff --git a/src/gui/creds/httpcredentialsgui.cpp b/src/gui/creds/httpcredentialsgui.cpp index c35b5295d..707725977 100644 --- a/src/gui/creds/httpcredentialsgui.cpp +++ b/src/gui/creds/httpcredentialsgui.cpp @@ -16,8 +16,8 @@ #include "creds/httpcredentialsgui.h" #include "account.h" #include "application.h" +#include "basicloginwidget.h" #include "common/asserts.h" -#include "httploginrequiredwidget.h" #include "loginrequireddialog.h" #include "networkjobs.h" #include "settingsdialog.h" @@ -113,13 +113,20 @@ void HttpCredentialsGui::asyncAuthResult(OAuth::Result r, const QString &user, void HttpCredentialsGui::showDialog() { - auto *contentWidget = new HttpLoginRequiredWidget(_account->sharedFromThis()); + auto *contentWidget = new BasicLoginWidget(); + contentWidget->setServerUrl(_account->url()); + contentWidget->forceUsername(_account->davUser()); auto *dialog = new LoginRequiredDialog(contentWidget, ocApp()->gui()->settingsDialog()); dialog->setAttribute(Qt::WA_DeleteOnClose, true); + dialog->setTopLabelText(tr("Please enter your password to log in to your account.")); + + // in this case, we want to use the login button + dialog->addLogInButton(); connect(dialog, &LoginRequiredDialog::finished, ocApp()->gui()->settingsDialog(), [this, contentWidget](const int result) { if (result == QDialog::Accepted) { + Q_ASSERT(contentWidget->username() == _account->davUser()); _password = contentWidget->password(); _refreshToken.clear(); _ready = true; @@ -132,12 +139,10 @@ void HttpCredentialsGui::showDialog() dialog->open(); ownCloudGui::raiseDialog(dialog); -} -QString HttpCredentialsGui::requestAppPasswordText(const Account *account) -{ - return tr("<a href=\"%1\">Click here</a> to request an app password from the web interface.") - .arg(Utility::concatUrlPath(account->url(), QStringLiteral("/index.php/settings/personal?sectionid=security#apppasswords")).toString()); + QTimer::singleShot(0, [contentWidget]() { + contentWidget->setFocus(Qt::OtherFocusReason); + }); } QUrl HttpCredentialsGui::authorisationLink() const diff --git a/src/gui/creds/httpcredentialsgui.h b/src/gui/creds/httpcredentialsgui.h index d567ac8a3..c7fba54e8 100644 --- a/src/gui/creds/httpcredentialsgui.h +++ b/src/gui/creds/httpcredentialsgui.h @@ -54,7 +54,6 @@ public: */ void askFromUser() override; - static QString requestAppPasswordText(const Account *account); private slots: void asyncAuthResult(OAuth::Result, const QString &user, const QString &accessToken, const QString &refreshToken, const QString &displayName); void showDialog(); diff --git a/src/gui/loginrequireddialog/CMakeLists.txt b/src/gui/loginrequireddialog/CMakeLists.txt index 6119d99f8..3fca291df 100644 --- a/src/gui/loginrequireddialog/CMakeLists.txt +++ b/src/gui/loginrequireddialog/CMakeLists.txt @@ -2,13 +2,13 @@ add_library(loginrequireddialog STATIC loginrequireddialog.cpp loginrequireddialog.ui - abstractloginrequiredwidget.cpp + abstractloginwidget.cpp - oauthloginrequiredwidget.cpp - oauthloginrequiredwidget.ui + oauthloginwidget.cpp + oauthloginwidget.ui - httploginrequiredwidget.cpp - httploginrequiredwidget.ui + basicloginwidget.cpp + basicloginwidget.ui ) target_link_libraries(loginrequireddialog PUBLIC Qt5::Widgets libsync) set_target_properties(loginrequireddialog PROPERTIES AUTOUIC ON AUTORCC ON) diff --git a/src/gui/loginrequireddialog/abstractloginrequiredwidget.h b/src/gui/loginrequireddialog/abstractloginrequiredwidget.h deleted file mode 100644 index 1017bf666..000000000 --- a/src/gui/loginrequireddialog/abstractloginrequiredwidget.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include <QAbstractButton> -#include <QDialogButtonBox> -#include <QList> -#include <QWidget> - -namespace OCC { - -class AbstractLoginRequiredWidget : public QWidget -{ -public: - /** - * Buttons to add to the parent dialog's lower right corner. - * @return list of buttons - */ - virtual QList<QPair<QAbstractButton *, QDialogButtonBox::ButtonRole>> buttons() = 0; - -protected: - explicit AbstractLoginRequiredWidget(QWidget *parent = nullptr); -}; - -} // OCC diff --git a/src/gui/loginrequireddialog/abstractloginrequiredwidget.cpp b/src/gui/loginrequireddialog/abstractloginwidget.cpp index 536015ee5..d86f65b8a 100644 --- a/src/gui/loginrequireddialog/abstractloginrequiredwidget.cpp +++ b/src/gui/loginrequireddialog/abstractloginwidget.cpp @@ -12,11 +12,11 @@ * for more details. */ -#include "abstractloginrequiredwidget.h" +#include "abstractloginwidget.h" namespace OCC { -AbstractLoginRequiredWidget::AbstractLoginRequiredWidget(QWidget *parent) +AbstractLoginWidget::AbstractLoginWidget(QWidget *parent) : QWidget(parent) { } diff --git a/src/gui/loginrequireddialog/abstractloginwidget.h b/src/gui/loginrequireddialog/abstractloginwidget.h new file mode 100644 index 000000000..0c56b0840 --- /dev/null +++ b/src/gui/loginrequireddialog/abstractloginwidget.h @@ -0,0 +1,16 @@ +#pragma once + +#include <QAbstractButton> +#include <QDialogButtonBox> +#include <QList> +#include <QWidget> + +namespace OCC { + +class AbstractLoginWidget : public QWidget +{ +protected: + explicit AbstractLoginWidget(QWidget *parent = nullptr); +}; + +} // OCC diff --git a/src/gui/loginrequireddialog/basicloginwidget.cpp b/src/gui/loginrequireddialog/basicloginwidget.cpp new file mode 100644 index 000000000..8831184e5 --- /dev/null +++ b/src/gui/loginrequireddialog/basicloginwidget.cpp @@ -0,0 +1,78 @@ +/* +* Copyright (C) Fabian Müller <fmueller@owncloud.com> +* +* 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. +*/ + +#include "basicloginwidget.h" +#include "ui_basicloginwidget.h" + +#include "creds/httpcredentials.h" +#include "gui/guiutility.h" +#include "theme.h" + +#include <QPushButton> +#include <QString> + +namespace OCC { + +BasicLoginWidget::BasicLoginWidget(QWidget *parent) + : AbstractLoginWidget(parent) + , _ui(new ::Ui::BasicLoginWidget) +{ + _ui->setupUi(this); + + const QString usernameLabelText = Utility::enumToDisplayName(Theme::instance()->userIDType()); + _ui->usernameLabel->setText(usernameLabelText); + _ui->usernameLineEdit->setPlaceholderText(usernameLabelText); + + if (!Theme::instance()->userIDHint().isEmpty()) { + _ui->usernameLineEdit->setPlaceholderText(Theme::instance()->userIDHint()); + } + + qDebug() << _ui->usernameLabel->isEnabled(); + qDebug() << _ui->usernameLineEdit->isEnabled(); + + Utility::setModal(this); + + setFocusProxy(_ui->usernameLineEdit); +} + +BasicLoginWidget::~BasicLoginWidget() +{ + delete _ui; +} + +void BasicLoginWidget::setServerUrl(const QUrl &serverUrl, const QString &linkStyle) +{ + const QString appPasswordUrl = QStringLiteral("%1/settings/personal?sectionid=security#apppasswords").arg(serverUrl.toString()); + _ui->appPasswordLabel->setText(tr("Click <a style='%1' href='%2'>here</a> to request an app password on the server.").arg(linkStyle, appPasswordUrl)); +} + +void BasicLoginWidget::forceUsername(const QString &username) +{ + _ui->usernameLineEdit->setText(username); + _ui->usernameLineEdit->setEnabled(false); + + setFocusProxy(_ui->passwordLineEdit); +} + +QString BasicLoginWidget::username() +{ + return _ui->usernameLineEdit->text(); +} + +QString BasicLoginWidget::password() +{ + return _ui->passwordLineEdit->text(); +} + +} // OCC diff --git a/src/gui/loginrequireddialog/basicloginwidget.h b/src/gui/loginrequireddialog/basicloginwidget.h new file mode 100644 index 000000000..4a1d8afa7 --- /dev/null +++ b/src/gui/loginrequireddialog/basicloginwidget.h @@ -0,0 +1,60 @@ +/* +* Copyright (C) Fabian Müller <fmueller@owncloud.com> +* +* 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. +*/ + +#pragma once + +#include "abstractloginwidget.h" +#include "account.h" + +#include <QLabel> +#include <QLineEdit> +#include <QPushButton> +#include <QWidget> + +namespace Ui { +class BasicLoginWidget; +} + +namespace OCC { + +class BasicLoginWidget : public AbstractLoginWidget +{ + Q_OBJECT + +public: + explicit BasicLoginWidget(QWidget *parent = nullptr); + ~BasicLoginWidget() override; + + /** + * Update a label's text to provide a link directly to app password configuration on the web interface. + * @param serverUrl URL to ownCloud server instance + * @param linkStyle custom style to set on the app password link (needed for the setup wizard) + */ + void setServerUrl(const QUrl &serverUrl, const QString &linkStyle = QString()); + + /** + * Enter provided username into line edit and lock it from user interaction. + * For use primarily with WebFinger. + * @param username username to use + */ + void forceUsername(const QString &username); + + QString username(); + QString password(); + +private: + ::Ui::BasicLoginWidget *_ui; +}; + +} // OCC diff --git a/src/gui/loginrequireddialog/basicloginwidget.ui b/src/gui/loginrequireddialog/basicloginwidget.ui new file mode 100644 index 000000000..c526be4d7 --- /dev/null +++ b/src/gui/loginrequireddialog/basicloginwidget.ui @@ -0,0 +1,129 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>BasicLoginWidget</class> + <widget class="QWidget" name="BasicLoginWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>353</width> + <height>93</height> + </rect> + </property> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="windowTitle"> + <string>BasicLoginWidget</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QLabel" name="appPasswordLabel"> + <property name="text"> + <string notr="true">appPasswordLabel [placeholder]</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,1"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QFormLayout" name="formLayout_2"> + <item row="1" column="1"> + <widget class="QLineEdit" name="usernameLineEdit"> + <property name="minimumSize"> + <size> + <width>150</width> + <height>0</height> + </size> + </property> + <property name="placeholderText"> + <string>Username</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLineEdit" name="passwordLineEdit"> + <property name="minimumSize"> + <size> + <width>150</width> + <height>0</height> + </size> + </property> + <property name="echoMode"> + <enum>QLineEdit::Password</enum> + </property> + <property name="placeholderText"> + <string>Password</string> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QLabel" name="passwordLabel"> + <property name="text"> + <string>Password</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="usernameLabel"> + <property name="text"> + <string>Username</string> + </property> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/gui/loginrequireddialog/httploginrequiredwidget.cpp b/src/gui/loginrequireddialog/httploginrequiredwidget.cpp deleted file mode 100644 index 15e810d64..000000000 --- a/src/gui/loginrequireddialog/httploginrequiredwidget.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* -* Copyright (C) Fabian Müller <fmueller@owncloud.com> -* -* 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. -*/ - -#include "httploginrequiredwidget.h" -#include "ui_httploginrequiredwidget.h" - -#include "creds/httpcredentials.h" -#include "gui/guiutility.h" - -#include <QPushButton> -#include <QString> - -namespace OCC { - -HttpLoginRequiredWidget::HttpLoginRequiredWidget(AccountPtr accountPtr, QWidget *parent) - : AbstractLoginRequiredWidget(parent) - , _ui(new ::Ui::HttpLoginRequiredWidget) - , _logInButton(new QPushButton(tr("Log in"), this)) -{ - _ui->setupUi(this); - - Utility::setModal(this); - - const QString appPasswordUrl = QStringLiteral("%1/settings/personal?sectionid=security#apppasswords").arg(accountPtr->url().toString()); - - _ui->loginRequiredLabel->setText(tr("The account %1 is currently logged out.").arg(accountPtr->displayName())); - _ui->appPasswordLabel->setText(tr("Click <a href='%1'>here</a> to request an app password on the server.").arg(appPasswordUrl)); - - _ui->usernameLineEdit->setText(accountPtr->davUser()); -} - -HttpLoginRequiredWidget::~HttpLoginRequiredWidget() -{ - delete _ui; -} -QList<QPair<QAbstractButton *, QDialogButtonBox::ButtonRole>> HttpLoginRequiredWidget::buttons() -{ - return { - { _logInButton, QDialogButtonBox::AcceptRole }, - }; -} - -QString HttpLoginRequiredWidget::password() const -{ - return _ui->passwordLineEdit->text(); -} - -} // OCC diff --git a/src/gui/loginrequireddialog/httploginrequiredwidget.h b/src/gui/loginrequireddialog/httploginrequiredwidget.h deleted file mode 100644 index fce2cefd5..000000000 --- a/src/gui/loginrequireddialog/httploginrequiredwidget.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -* Copyright (C) Fabian Müller <fmueller@owncloud.com> -* -* 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. -*/ - -#pragma once - -#include "abstractloginrequiredwidget.h" -#include "account.h" - -#include <QPushButton> -#include <QWidget> - -namespace Ui { -class HttpLoginRequiredWidget; -} - -namespace OCC { - -class HttpLoginRequiredWidget : public AbstractLoginRequiredWidget -{ - Q_OBJECT - -public: - explicit HttpLoginRequiredWidget(AccountPtr accountPtr, QWidget *parent = nullptr); - ~HttpLoginRequiredWidget() override; - - QList<QPair<QAbstractButton *, QDialogButtonBox::ButtonRole>> buttons() override; - - /** - * Get user-provided password. - * @return password string - */ - QString password() const; - -private: - ::Ui::HttpLoginRequiredWidget *_ui; - - QPushButton *_logInButton; -}; - -} // OCC diff --git a/src/gui/loginrequireddialog/httploginrequiredwidget.ui b/src/gui/loginrequireddialog/httploginrequiredwidget.ui deleted file mode 100644 index 3f372ffa1..000000000 --- a/src/gui/loginrequireddialog/httploginrequiredwidget.ui +++ /dev/null @@ -1,101 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>HttpLoginRequiredWidget</class> - <widget class="QWidget" name="HttpLoginRequiredWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>400</width> - <height>300</height> - </rect> - </property> - <property name="windowTitle"> - <string>HttpLoginRequiredWidget</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="leftMargin"> - <number>0</number> - </property> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QLabel" name="loginRequiredLabel"> - <property name="text"> - <string notr="true">login required [placeholder]</string> - </property> - <property name="textFormat"> - <enum>Qt::RichText</enum> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Please enter your password to log in again.</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="appPasswordLabel"> - <property name="text"> - <string notr="true">appPasswordLabel [placeholder]</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <layout class="QFormLayout" name="formLayout_2"> - <item row="1" column="1"> - <widget class="QLineEdit" name="usernameLineEdit"> - <property name="enabled"> - <bool>false</bool> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QLineEdit" name="passwordLineEdit"> - <property name="echoMode"> - <enum>QLineEdit::Password</enum> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="passwordLabel"> - <property name="text"> - <string>Password</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="usernameLabel"> - <property name="text"> - <string>Username</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/gui/loginrequireddialog/loginrequireddialog.cpp b/src/gui/loginrequireddialog/loginrequireddialog.cpp index 549bca564..aaa86c277 100644 --- a/src/gui/loginrequireddialog/loginrequireddialog.cpp +++ b/src/gui/loginrequireddialog/loginrequireddialog.cpp @@ -24,13 +24,13 @@ namespace OCC { -LoginRequiredDialog::LoginRequiredDialog(AbstractLoginRequiredWidget *contentWidget, QWidget *parent) +LoginRequiredDialog::LoginRequiredDialog(AbstractLoginWidget *contentWidget, QWidget *parent) : QDialog(parent) , _ui(new ::Ui::LoginRequiredDialog) { _ui->setupUi(this); - _ui->iconLabel->setPixmap(Theme::instance()->applicationIcon().pixmap(64, 64)); + _ui->iconLabel->setPixmap(Theme::instance()->applicationIcon().pixmap(128, 128)); // we want a custom text, but we make use of the button box's built-in reject role _ui->rightButtonBox->addButton(tr("Log out"), QDialogButtonBox::RejectRole); @@ -39,17 +39,13 @@ LoginRequiredDialog::LoginRequiredDialog(AbstractLoginRequiredWidget *contentWid connect(_ui->rightButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); connect(_ui->rightButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); - for (auto [button, role] : contentWidget->buttons()) { - _ui->rightButtonBox->addButton(button, role); - } - // using a stacked widget appears to work better than a plain widget // we do this in the setup wizard as well _ui->contentWidget->addWidget(contentWidget); _ui->contentWidget->setCurrentWidget(contentWidget); Utility::setModal(this); - setFixedSize(this->sizeHint()); + setFixedSize(this->minimumSize()); } LoginRequiredDialog::~LoginRequiredDialog() @@ -57,4 +53,14 @@ LoginRequiredDialog::~LoginRequiredDialog() delete _ui; } +void LoginRequiredDialog::setTopLabelText(const QString &newText) +{ + _ui->topLabel->setText(newText); +} + +void LoginRequiredDialog::addLogInButton() +{ + _ui->rightButtonBox->addButton(tr("Log in"), QDialogButtonBox::AcceptRole); +} + } // OCC diff --git a/src/gui/loginrequireddialog/loginrequireddialog.h b/src/gui/loginrequireddialog/loginrequireddialog.h index 725c28789..5ff3821dd 100644 --- a/src/gui/loginrequireddialog/loginrequireddialog.h +++ b/src/gui/loginrequireddialog/loginrequireddialog.h @@ -14,7 +14,7 @@ #pragma once -#include "abstractloginrequiredwidget.h" +#include "abstractloginwidget.h" #include "account.h" #include <QDialog> @@ -29,9 +29,17 @@ class LoginRequiredDialog : public QDialog Q_OBJECT public: - explicit LoginRequiredDialog(AbstractLoginRequiredWidget *contentWidget, QWidget *parent = nullptr); + explicit LoginRequiredDialog(AbstractLoginWidget *contentWidget, QWidget *parent = nullptr); ~LoginRequiredDialog() override; + void setTopLabelText(const QString &newText); + + /** + * Add a "log in" button to the dialog. When clicked, the dialog is accepted. + * For use with HTTP basic authentication. + */ + void addLogInButton(); + private: ::Ui::LoginRequiredDialog *_ui; }; diff --git a/src/gui/loginrequireddialog/loginrequireddialog.ui b/src/gui/loginrequireddialog/loginrequireddialog.ui index 422a5c87d..a10e02bcc 100644 --- a/src/gui/loginrequireddialog/loginrequireddialog.ui +++ b/src/gui/loginrequireddialog/loginrequireddialog.ui @@ -6,65 +6,140 @@ <rect> <x>0</x> <y>0</y> - <width>445</width> - <height>135</height> + <width>508</width> + <height>239</height> </rect> </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> <property name="windowTitle"> <string>Login required</string> </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> + <layout class="QVBoxLayout" name="verticalLayout_2" stretch="1,0,0"> <item> - <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,1"> + <layout class="QHBoxLayout" name="horizontalLayout_3" stretch="0,0"> <item> - <widget class="QLabel" name="iconLabel"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string notr="true">icon (placeholder)</string> - </property> - </widget> + <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1"> + <item> + <widget class="QLabel" name="iconLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>128</width> + <height>128</height> + </size> + </property> + <property name="text"> + <string notr="true">icon (placeholder)</string> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> </item> <item> - <widget class="QStackedWidget" name="contentWidget"> - <widget class="QWidget" name="page"/> - <widget class="QWidget" name="page_2"/> - </widget> + <layout class="QVBoxLayout" name="verticalLayout_3" stretch="0,0,1"> + <item> + <widget class="QLabel" name="topLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>350</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string notr="true">top label [placeholder]</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QStackedWidget" name="contentWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <widget class="OCC::BasicLoginWidget" name="basicLoginWidget"/> + <widget class="OCC::OAuthLoginWidget" name="oauthLoginWidget"/> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>5</height> + </size> + </property> + </spacer> + </item> + </layout> </item> </layout> </item> <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>5</height> + </size> + </property> + </spacer> + </item> + <item> <layout class="QHBoxLayout" name="horizontalLayout"> <item> - <widget class="QDialogButtonBox" name="leftButtonBox"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="minimumSize"> - <size> - <width>10</width> - <height>10</height> - </size> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::NoButton</set> - </property> - </widget> - </item> - <item> <spacer name="horizontalSpacer"> <property name="orientation"> <enum>Qt::Horizontal</enum> @@ -80,17 +155,11 @@ <item> <widget class="QDialogButtonBox" name="rightButtonBox"> <property name="sizePolicy"> - <sizepolicy hsizetype="Maximum" vsizetype="Preferred"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="minimumSize"> - <size> - <width>10</width> - <height>10</height> - </size> - </property> <property name="standardButtons"> <set>QDialogButtonBox::NoButton</set> </property> @@ -100,6 +169,20 @@ </item> </layout> </widget> + <customwidgets> + <customwidget> + <class>OCC::BasicLoginWidget</class> + <extends>QWidget</extends> + <header>gui/loginrequireddialog/basicloginwidget.h</header> + <container>1</container> + </customwidget> + <customwidget> + <class>OCC::OAuthLoginWidget</class> + <extends>QWidget</extends> + <header>gui/loginrequireddialog/oauthloginwidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> <resources> <include location="../../resources/client.qrc"/> </resources> diff --git a/src/gui/loginrequireddialog/oauthloginrequiredwidget.cpp b/src/gui/loginrequireddialog/oauthloginrequiredwidget.cpp deleted file mode 100644 index de81e899b..000000000 --- a/src/gui/loginrequireddialog/oauthloginrequiredwidget.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* -* Copyright (C) Fabian Müller <fmueller@owncloud.com> -* -* 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. -*/ - -#include "oauthloginrequiredwidget.h" -#include "ui_oauthloginrequiredwidget.h" - -#include "gui/application.h" -#include "gui/creds/httpcredentialsgui.h" -#include "gui/guiutility.h" - -#include <QClipboard> - -namespace OCC { - -OAuthLoginRequiredWidget::OAuthLoginRequiredWidget(AccountPtr accountPtr, QWidget *parent) - : AbstractLoginRequiredWidget(parent) - , _ui(new ::Ui::OAuthLoginRequiredWidget) - , _openBrowserButton(new QPushButton(tr("Open Browser"), this)) - , _copyURLToClipboardButton(new QPushButton(Utility::getCoreIcon(QStringLiteral("clipboard")), tr("Copy URL to clipboard"), this)) -{ - _ui->setupUi(this); - - Utility::setModal(this); - - _ui->loginRequiredLabel->setText(tr("The account %1 is currently logged out.\n\nPlease authenticate using your browser.").arg(accountPtr->displayName())); - - auto creds = qobject_cast<HttpCredentialsGui *>(accountPtr->credentials()); - Q_ASSERT(creds != nullptr); - - connect(creds, &HttpCredentialsGui::authorisationLinkChanged, this, [this]() { - _copyURLToClipboardButton->setEnabled(true); - _openBrowserButton->setEnabled(true); - }); - - connect(_openBrowserButton, &QPushButton::clicked, this, [this, accountPtr]() { - qobject_cast<HttpCredentialsGui *>(accountPtr->credentials())->openBrowser(); - _openBrowserButton->setText(tr("Reopen browser")); - }); - connect(_copyURLToClipboardButton, &QPushButton::clicked, this, [accountPtr]() { - // TODO: use authorisationLinkAsync - auto link = qobject_cast<HttpCredentialsGui *>(accountPtr->credentials())->authorisationLink().toString(); - ocApp()->clipboard()->setText(link); - }); -} - -OAuthLoginRequiredWidget::~OAuthLoginRequiredWidget() -{ - delete _ui; -} - -QList<QPair<QAbstractButton *, QDialogButtonBox::ButtonRole>> OAuthLoginRequiredWidget::buttons() -{ - return { - { _openBrowserButton, QDialogButtonBox::ActionRole }, - { _copyURLToClipboardButton, QDialogButtonBox::ActionRole }, - }; -} - -} diff --git a/src/gui/loginrequireddialog/oauthloginrequiredwidget.ui b/src/gui/loginrequireddialog/oauthloginrequiredwidget.ui deleted file mode 100644 index 3e9f04901..000000000 --- a/src/gui/loginrequireddialog/oauthloginrequiredwidget.ui +++ /dev/null @@ -1,45 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>OAuthLoginRequiredWidget</class> - <widget class="QWidget" name="OAuthLoginRequiredWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>334</width> - <height>205</height> - </rect> - </property> - <property name="windowTitle"> - <string>OAuthLoginRequiredWidget</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout" stretch="1"> - <property name="topMargin"> - <number>0</number> - </property> - <property name="rightMargin"> - <number>0</number> - </property> - <property name="bottomMargin"> - <number>0</number> - </property> - <item> - <widget class="QLabel" name="loginRequiredLabel"> - <property name="text"> - <string notr="true">login required [placeholder]</string> - </property> - <property name="alignment"> - <set>Qt::AlignHCenter|Qt::AlignTop</set> - </property> - <property name="wordWrap"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - <resources> - <include location="../../resources/client.qrc"/> - </resources> - <connections/> -</ui> diff --git a/src/gui/loginrequireddialog/oauthloginwidget.cpp b/src/gui/loginrequireddialog/oauthloginwidget.cpp new file mode 100644 index 000000000..91f5e7738 --- /dev/null +++ b/src/gui/loginrequireddialog/oauthloginwidget.cpp @@ -0,0 +1,53 @@ +/* +* Copyright (C) Fabian Müller <fmueller@owncloud.com> +* +* 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. +*/ + +#include "oauthloginwidget.h" +#include "ui_oauthloginwidget.h" + +#include "gui/application.h" +#include "gui/creds/httpcredentialsgui.h" +#include "gui/guiutility.h" + +#include <QClipboard> + +namespace OCC { + +OAuthLoginWidget::OAuthLoginWidget(QWidget *parent) + : AbstractLoginWidget(parent) + , _ui(new ::Ui::OAuthLoginWidget) +{ + _ui->setupUi(this); + + Utility::setModal(this); + + connect(_ui->openBrowserButton, &QPushButton::clicked, this, &OAuthLoginWidget::openBrowserButtonClicked); + connect(_ui->copyUrlToClipboardButton, &QPushButton::clicked, this, &OAuthLoginWidget::copyUrlToClipboardButtonClicked); + + // depending on the theme we have to use a light or dark icon + _ui->copyUrlToClipboardButton->setIcon(Utility::getCoreIcon(QStringLiteral("clipboard"))); + + setFocusProxy(_ui->openBrowserButton); +} + +OAuthLoginWidget::~OAuthLoginWidget() +{ + delete _ui; +} + +void OAuthLoginWidget::setOpenBrowserButtonText(const QString &newText) +{ + _ui->openBrowserButton->setText(newText); +} + +} diff --git a/src/gui/loginrequireddialog/oauthloginrequiredwidget.h b/src/gui/loginrequireddialog/oauthloginwidget.h index 7499f0e48..49eefc878 100644 --- a/src/gui/loginrequireddialog/oauthloginrequiredwidget.h +++ b/src/gui/loginrequireddialog/oauthloginwidget.h @@ -14,33 +14,35 @@ #pragma once -#include "abstractloginrequiredwidget.h" +#include "abstractloginwidget.h" #include "account.h" +#include <QLabel> #include <QPushButton> #include <QWidget> namespace Ui { -class OAuthLoginRequiredWidget; +class OAuthLoginWidget; } namespace OCC { -class OAuthLoginRequiredWidget : public AbstractLoginRequiredWidget +class OAuthLoginWidget : public AbstractLoginWidget { Q_OBJECT public: - explicit OAuthLoginRequiredWidget(AccountPtr accountPtr, QWidget *parent = nullptr); - ~OAuthLoginRequiredWidget() override; + explicit OAuthLoginWidget(QWidget *parent = nullptr); + ~OAuthLoginWidget() override; - QList<QPair<QAbstractButton *, QDialogButtonBox::ButtonRole>> buttons() override; + void setOpenBrowserButtonText(const QString &newText); -private: - ::Ui::OAuthLoginRequiredWidget *_ui; +Q_SIGNALS: + void openBrowserButtonClicked(); + void copyUrlToClipboardButtonClicked(); - QPushButton *_openBrowserButton; - QPushButton *_copyURLToClipboardButton; +private: + ::Ui::OAuthLoginWidget *_ui; }; } diff --git a/src/gui/loginrequireddialog/oauthloginwidget.ui b/src/gui/loginrequireddialog/oauthloginwidget.ui new file mode 100644 index 000000000..5ebed1f68 --- /dev/null +++ b/src/gui/loginrequireddialog/oauthloginwidget.ui @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>OAuthLoginWidget</class> + <widget class="QWidget" name="OAuthLoginWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>300</width> + <height>117</height> + </rect> + </property> + <property name="windowTitle"> + <string>OAuthLoginWidget</string> + </property> + <layout class="QHBoxLayout" name="horizontalLayout" stretch="1,0,1"> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <spacer name="horizontalSpacer_3"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QPushButton" name="openBrowserButton"> + <property name="minimumSize"> + <size> + <width>220</width> + <height>0</height> + </size> + </property> + <property name="font"> + <font> + <pointsize>16</pointsize> + <weight>75</weight> + <bold>true</bold> + </font> + </property> + <property name="text"> + <string>Open Browser</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>25</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="copyUrlToClipboardButton"> + <property name="text"> + <string>Copy URL to clipboard</string> + </property> + <property name="icon"> + <iconset resource="../../resources/client.qrc"> + <normaloff>:/client/resources/light/clipboard.svg</normaloff>:/client/resources/light/clipboard.svg</iconset> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>25</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + </layout> + </item> + <item> + <spacer name="horizontalSpacer_4"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <resources> + <include location="../../resources/client.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/gui/newwizard/CMakeLists.txt b/src/gui/newwizard/CMakeLists.txt index 7824a5d34..377efe0ef 100644 --- a/src/gui/newwizard/CMakeLists.txt +++ b/src/gui/newwizard/CMakeLists.txt @@ -12,18 +12,18 @@ add_library(newwizard STATIC pages/webfingersetupwizardpage.h pages/webfingersetupwizardpage.cpp - pages/basiccredentialssetupwizardpage.ui + pages/credentialssetupwizardpage.ui + pages/basiccredentialssetupwizardpage.h pages/basiccredentialssetupwizardpage.cpp + pages/oauthcredentialssetupwizardpage.h + pages/oauthcredentialssetupwizardpage.cpp + pages/accountconfiguredwizardpage.ui pages/accountconfiguredwizardpage.h pages/accountconfiguredwizardpage.cpp - pages/oauthcredentialssetupwizardpage.ui - pages/oauthcredentialssetupwizardpage.h - pages/oauthcredentialssetupwizardpage.cpp - setupwizardwindow.ui setupwizardwindow.h setupwizardwindow.cpp diff --git a/src/gui/newwizard/pages/basiccredentialssetupwizardpage.cpp b/src/gui/newwizard/pages/basiccredentialssetupwizardpage.cpp index f87ffa622..f87a868ea 100644 --- a/src/gui/newwizard/pages/basiccredentialssetupwizardpage.cpp +++ b/src/gui/newwizard/pages/basiccredentialssetupwizardpage.cpp @@ -13,53 +13,48 @@ */ #include "basiccredentialssetupwizardpage.h" -#include "ui_basiccredentialssetupwizardpage.h" +#include "ui_credentialssetupwizardpage.h" #include "theme.h" namespace OCC::Wizard { BasicCredentialsSetupWizardPage::BasicCredentialsSetupWizardPage(const QUrl &serverUrl) - : _ui(new ::Ui::BasicCredentialsSetupWizardPage) + : _ui(new ::Ui::CredentialsSetupWizardPage) { _ui->setupUi(this); + _ui->topLabel->setText(tr("Please enter your credentials to log in to your account.")); + + // bring the correct widget to the front + _ui->contentWidget->setCurrentWidget(_ui->basicLoginWidget); + + _ui->basicLoginWidget->setServerUrl(serverUrl, QStringLiteral("color: %1").arg(Theme::instance()->wizardHeaderTitleColor().name())); + const QString linkColor = Theme::instance()->wizardHeaderTitleColor().name(); _ui->urlLabel->setText(tr("Connecting to <a href='%1' style='color: %2;'>%1</a>").arg(serverUrl.toString(), linkColor)); connect(this, &AbstractSetupWizardPage::pageDisplayed, this, [this]() { - _ui->usernameLineEdit->setFocus(); + _ui->basicLoginWidget->setFocus(); }); - - const QString usernameLabelText = Utility::enumToDisplayName(Theme::instance()->userIDType()); - _ui->usernameLabel->setText(usernameLabelText); - _ui->usernameLineEdit->setPlaceholderText(usernameLabelText); - - if (!Theme::instance()->userIDHint().isEmpty()) { - _ui->usernameLineEdit->setPlaceholderText(Theme::instance()->userIDHint()); - } - - QString appPasswordUrl = QStringLiteral("%1/settings/personal?sectionid=security#apppasswords").arg(serverUrl.toString()); - _ui->appPasswordLabel->setText(tr("Click <a href='%1' style='color: %2;'>here</a> to set up an app password.").arg(appPasswordUrl, linkColor)); } BasicCredentialsSetupWizardPage *BasicCredentialsSetupWizardPage::createForWebFinger(const QUrl &serverUrl, const QString &username) { auto page = new BasicCredentialsSetupWizardPage(serverUrl); - page->_ui->usernameLineEdit->setText(username); - page->_ui->usernameLineEdit->setEnabled(false); + page->_ui->basicLoginWidget->forceUsername(username); return page; } QString BasicCredentialsSetupWizardPage::username() const { - return _ui->usernameLineEdit->text(); + return _ui->basicLoginWidget->username(); } QString BasicCredentialsSetupWizardPage::password() const { - return _ui->passwordLineEdit->text(); + return _ui->basicLoginWidget->password(); } BasicCredentialsSetupWizardPage::~BasicCredentialsSetupWizardPage() diff --git a/src/gui/newwizard/pages/basiccredentialssetupwizardpage.h b/src/gui/newwizard/pages/basiccredentialssetupwizardpage.h index bcb08f9c9..325cd84b2 100644 --- a/src/gui/newwizard/pages/basiccredentialssetupwizardpage.h +++ b/src/gui/newwizard/pages/basiccredentialssetupwizardpage.h @@ -17,7 +17,7 @@ #include "abstractsetupwizardpage.h" namespace Ui { -class BasicCredentialsSetupWizardPage; +class CredentialsSetupWizardPage; } namespace OCC::Wizard { @@ -38,7 +38,7 @@ public: bool validateInput() override; private: - ::Ui::BasicCredentialsSetupWizardPage *_ui; + ::Ui::CredentialsSetupWizardPage *_ui; }; } diff --git a/src/gui/newwizard/pages/basiccredentialssetupwizardpage.ui b/src/gui/newwizard/pages/basiccredentialssetupwizardpage.ui deleted file mode 100644 index 14ab0b007..000000000 --- a/src/gui/newwizard/pages/basiccredentialssetupwizardpage.ui +++ /dev/null @@ -1,182 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>BasicCredentialsSetupWizardPage</class> - <widget class="QWidget" name="BasicCredentialsSetupWizardPage"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>629</width> - <height>434</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <property name="spacing"> - <number>12</number> - </property> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="enterYourCredentialsLabel"> - <property name="text"> - <string>Enter your credentials</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_3"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Minimum</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="appPasswordLabel"> - <property name="text"> - <string notr="true"><app password text> (placeholder)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <layout class="QFormLayout" name="formLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="usernameLabel"> - <property name="text"> - <string notr="true">Username (placeholder)</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="usernameLineEdit"> - <property name="minimumSize"> - <size> - <width>200</width> - <height>0</height> - </size> - </property> - <property name="placeholderText"> - <string notr="true">Username (placeholder)</string> - </property> - </widget> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="passwordLabel"> - <property name="text"> - <string>Password</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QLineEdit" name="passwordLineEdit"> - <property name="minimumSize"> - <size> - <width>200</width> - <height>0</height> - </size> - </property> - <property name="echoMode"> - <enum>QLineEdit::Password</enum> - </property> - <property name="placeholderText"> - <string>Password</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="urlLabel"> - <property name="text"> - <string notr="true"><server URL> (placeholder)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - <property name="openExternalLinks"> - <bool>true</bool> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/gui/newwizard/pages/credentialssetupwizardpage.ui b/src/gui/newwizard/pages/credentialssetupwizardpage.ui new file mode 100644 index 000000000..6d3d6fe72 --- /dev/null +++ b/src/gui/newwizard/pages/credentialssetupwizardpage.ui @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>CredentialsSetupWizardPage</class> + <widget class="QWidget" name="CredentialsSetupWizardPage"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>409</width> + <height>306</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout" stretch="1,0,1,0,1,0"> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="topLabel"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> + <horstretch>250</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>350</width> + <height>0</height> + </size> + </property> + <property name="text"> + <string notr="true">top label [placeholder]</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <spacer name="verticalSpacer_3"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::Maximum</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>10</height> + </size> + </property> + </spacer> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QStackedWidget" name="contentWidget"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="minimumSize"> + <size> + <width>200</width> + <height>0</height> + </size> + </property> + <property name="maximumSize"> + <size> + <width>500</width> + <height>16777215</height> + </size> + </property> + <property name="currentIndex"> + <number>1</number> + </property> + <widget class="OCC::BasicLoginWidget" name="basicLoginWidget"/> + <widget class="OCC::OAuthLoginWidget" name="oauthLoginWidget"/> + </widget> + </item> + </layout> + </item> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeType"> + <enum>QSizePolicy::MinimumExpanding</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="urlLabel"> + <property name="text"> + <string notr="true"><server URL> (placeholder)</string> + </property> + <property name="alignment"> + <set>Qt::AlignCenter</set> + </property> + </widget> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>OCC::BasicLoginWidget</class> + <extends>QWidget</extends> + <header>gui/loginrequireddialog/basicloginwidget.h</header> + <container>1</container> + </customwidget> + <customwidget> + <class>OCC::OAuthLoginWidget</class> + <extends>QWidget</extends> + <header>gui/loginrequireddialog/oauthloginwidget.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources> + <include location="../../../resources/client.qrc"/> + </resources> + <connections/> +</ui> diff --git a/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.cpp b/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.cpp index e53d90302..42ba026ab 100644 --- a/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.cpp +++ b/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.cpp @@ -13,7 +13,7 @@ */ #include "oauthcredentialssetupwizardpage.h" -#include "ui_oauthcredentialssetupwizardpage.h" +#include "ui_credentialssetupwizardpage.h" #include "gui/guiutility.h" #include "theme.h" @@ -21,33 +21,33 @@ namespace OCC::Wizard { OAuthCredentialsSetupWizardPage::OAuthCredentialsSetupWizardPage(const QUrl &serverUrl) - : _ui(new ::Ui::OAuthCredentialsSetupWizardPage) + : _ui(new ::Ui::CredentialsSetupWizardPage) { _ui->setupUi(this); + // bring the correct widget to the front + _ui->contentWidget->setCurrentWidget(_ui->oauthLoginWidget); + _ui->urlLabel->setText(tr("Connecting to <a href='%1' style='color: %2;'>%1</a>").arg(serverUrl.toString(), Theme::instance()->wizardHeaderTitleColor().name())); // we want to give the user a chance to preserve their privacy when using a private proxy for instance // therefore, we need to make sure the user can manually // using clicked allows a user to "abort the click" (unlike pressed and released) - connect(_ui->openBrowserButton, &QPushButton::clicked, this, [this]() { + connect(_ui->oauthLoginWidget, &OAuthLoginWidget::openBrowserButtonClicked, this, [this]() { Q_EMIT openBrowserButtonPushed(); // change button title after first click - _ui->openBrowserButton->setText(tr("Reopen Browser")); + _ui->oauthLoginWidget->setOpenBrowserButtonText(tr("Reopen Browser")); }); - connect(_ui->copyUrlToClipboardButton, &QPushButton::clicked, this, [this]() { + connect(_ui->oauthLoginWidget, &OAuthLoginWidget::copyUrlToClipboardButtonClicked, this, [this]() { Q_EMIT copyUrlToClipboardButtonPushed(); }); connect(this, &AbstractSetupWizardPage::pageDisplayed, this, [this]() { - _ui->openBrowserButton->setFocus(); + _ui->oauthLoginWidget->setFocus(); }); - _ui->pleaseLogIntoLabel->setText(tr("Please use your browser to log in to %1").arg(Theme::instance()->appNameGUI())); - - // depending on the theme we have to use a light or dark icon - _ui->copyUrlToClipboardButton->setIcon(Utility::getCoreIcon(QStringLiteral("clipboard"))); + _ui->topLabel->setText(tr("Please use your browser to log in to %1.").arg(Theme::instance()->appNameGUI())); } OAuthCredentialsSetupWizardPage::~OAuthCredentialsSetupWizardPage() @@ -64,8 +64,7 @@ bool OAuthCredentialsSetupWizardPage::validateInput() void OAuthCredentialsSetupWizardPage::setButtonsEnabled(bool enabled) { - _ui->copyUrlToClipboardButton->setEnabled(enabled); - _ui->openBrowserButton->setEnabled(enabled); + _ui->oauthLoginWidget->setEnabled(enabled); } } // namespace OCC::Wizard diff --git a/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.h b/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.h index 7416f0e94..b1a6e8927 100644 --- a/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.h +++ b/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.h @@ -17,7 +17,7 @@ #include "abstractsetupwizardpage.h" namespace Ui { -class OAuthCredentialsSetupWizardPage; +class CredentialsSetupWizardPage; } namespace OCC::Wizard { @@ -39,7 +39,7 @@ Q_SIGNALS: void copyUrlToClipboardButtonPushed(); private: - ::Ui::OAuthCredentialsSetupWizardPage *_ui; + ::Ui::CredentialsSetupWizardPage *_ui; }; } // namespace OCC::Wizard diff --git a/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.ui b/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.ui deleted file mode 100644 index 879a0eee3..000000000 --- a/src/gui/newwizard/pages/oauthcredentialssetupwizardpage.ui +++ /dev/null @@ -1,205 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>OAuthCredentialsSetupWizardPage</class> - <widget class="QWidget" name="OAuthCredentialsSetupWizardPage"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>409</width> - <height>306</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="pleaseLogIntoLabel"> - <property name="text"> - <string notr="true">Please use your browser to log in to <app name placeholder></string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_3"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Maximum</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QPushButton" name="openBrowserButton"> - <property name="minimumSize"> - <size> - <width>170</width> - <height>0</height> - </size> - </property> - <property name="font"> - <font> - <pointsize>14</pointsize> - <weight>75</weight> - <italic>false</italic> - <bold>true</bold> - <underline>false</underline> - <strikeout>false</strikeout> - </font> - </property> - <property name="text"> - <string>Open Browser</string> - </property> - </widget> - </item> - <item> - <spacer name="verticalSpacer_4"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::Maximum</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>5</height> - </size> - </property> - </spacer> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <spacer name="horizontalSpacer_4"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>25</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="copyUrlToClipboardButton"> - <property name="text"> - <string>Copy URL to clipboard</string> - </property> - <property name="icon"> - <iconset resource="../../../resources/client.qrc"> - <normaloff>:/client/resources/light/clipboard.svg</normaloff>:/client/resources/light/clipboard.svg</iconset> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_3"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>25</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - </layout> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <spacer name="verticalSpacer_2"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeType"> - <enum>QSizePolicy::MinimumExpanding</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="urlLabel"> - <property name="text"> - <string notr="true"><server URL> (placeholder)</string> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - </layout> - </widget> - <resources> - <include location="../../../resources/client.qrc"/> - </resources> - <connections/> -</ui> diff --git a/src/gui/newwizard/setupwizardwindow.cpp b/src/gui/newwizard/setupwizardwindow.cpp index 385e0d5b8..800ea52e2 100644 --- a/src/gui/newwizard/setupwizardwindow.cpp +++ b/src/gui/newwizard/setupwizardwindow.cpp @@ -128,8 +128,10 @@ void SetupWizardWindow::displayPage(AbstractSetupWizardPage *page, SetupWizardSt // bring to front if necessary ownCloudGui::raiseDialog(this); - // this can optionally be overwritten by the page - Q_EMIT _currentPage->pageDisplayed(); + QTimer::singleShot(0, [this]() { + // this can optionally be overwritten by the page + Q_EMIT _currentPage->pageDisplayed(); + }); } void SetupWizardWindow::slotStartTransition() diff --git a/src/libsync/creds/httpcredentials.cpp b/src/libsync/creds/httpcredentials.cpp index d515ec540..49f172cf0 100644 --- a/src/libsync/creds/httpcredentials.cpp +++ b/src/libsync/creds/httpcredentials.cpp @@ -218,7 +218,7 @@ void HttpCredentials::fetchFromKeychainHelper() return; } const auto data = job->data().toString(); - if (OC_ENSURE(!data.isEmpty())) { + if (OC_ENSURE((!data.isEmpty()))) { if (isUsingOAuth()) { _refreshToken = data; refreshAccessToken(); diff --git a/src/resources/wizard/style.qss b/src/resources/wizard/style.qss index 63bf06c39..492610aa8 100644 --- a/src/resources/wizard/style.qss +++ b/src/resources/wizard/style.qss @@ -31,7 +31,7 @@ #contentWidget #usernameLabel, #contentWidget #passwordLabel, #contentWidget #appPasswordLabel, -#contentWidget #pleaseLogIntoLabel, +#contentWidget #topLabel, #contentWidget #usernameLabel, #contentWidget #passwordLabel, #contentWidget #advancedConfigGroupBox::title |