Add new HeaderBanner class for WebFlowCredentialsDialog
authorMichael Schuster <michael@schuster.ms>
Mon, 23 Dec 2019 05:01:00 +0000 (06:01 +0100)
committerMichael Schuster <48932272+misch7@users.noreply.github.com>
Tue, 24 Dec 2019 06:46:57 +0000 (07:46 +0100)
New widget on top of the layout, based on Qt's own modern wizard header banner.

This should improve the user's perception of the dialog.

Encapsulate the existing layout into a container layout to allow the banner taking
the full width of the dialog.

Signed-off-by: Michael Schuster <michael@schuster.ms>
src/gui/CMakeLists.txt
src/gui/creds/webflowcredentialsdialog.cpp
src/gui/creds/webflowcredentialsdialog.h
src/gui/headerbanner.cpp [new file with mode: 0644]
src/gui/headerbanner.h [new file with mode: 0644]
src/gui/wizard/flow2authwidget.cpp
src/gui/wizard/flow2authwidget.ui

index 462173554254355126b5736edd0e968fa9d6e158..381a5d2d178d1ec0e121cac75aca9ad7f0cd462d 100644 (file)
@@ -103,6 +103,7 @@ set(client_SRCS
     servernotificationhandler.cpp
     guiutility.cpp
     elidedlabel.cpp
+    headerbanner.cpp
     iconjob.cpp
     remotewipe.cpp
     creds/credentialsfactory.cpp
index d85b9eb042a2dceac38a6dc91376bd65e7891e6b..3e8d55a39fb57b3949f5824862312cab5b8867a6 100644 (file)
@@ -6,6 +6,7 @@
 #include "theme.h"
 #include "application.h"
 #include "owncloudgui.h"
+#include "headerbanner.h"
 #include "wizard/owncloudwizardcommon.h"
 #include "wizard/webview.h"
 #include "wizard/flow2authwidget.h"
@@ -21,15 +22,30 @@ WebFlowCredentialsDialog::WebFlowCredentialsDialog(Account *account, bool useFlo
     setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
 
     _layout = new QVBoxLayout(this);
+    int spacing = _layout->spacing();
+    int margin = _layout->margin();
+    _layout->setSpacing(0);
+    _layout->setMargin(0);
+
+    if(_useFlow2) {
+        _headerBanner = new HeaderBanner(this);
+        _layout->addWidget(_headerBanner);
+        Theme *theme = Theme::instance();
+        _headerBanner->setup(tr("Log in"), theme->wizardHeaderLogo(), theme->wizardHeaderBanner(),
+                             Qt::AutoText, QString::fromLatin1("color:#fff;"));
+    }
+
+    _containerLayout = new QVBoxLayout(this);
+    _containerLayout->setSpacing(spacing);
+    _containerLayout->setMargin(margin);
 
-    //QString msg = tr("You have been logged out of %1 as user %2, please login again")
-    //        .arg(_account->displayName(), _user);
     _infoLabel = new QLabel();
-    _layout->addWidget(_infoLabel);
+    _containerLayout->addWidget(_infoLabel);
 
     if (_useFlow2) {
         _flow2AuthWidget = new Flow2AuthWidget(account);
-        _layout->addWidget(_flow2AuthWidget);
+        _flow2AuthWidget = new Flow2AuthWidget();
+        _containerLayout->addWidget(_flow2AuthWidget);
 
         connect(_flow2AuthWidget, &Flow2AuthWidget::urlCatched, this, &WebFlowCredentialsDialog::urlCatched);
 
@@ -40,7 +56,7 @@ WebFlowCredentialsDialog::WebFlowCredentialsDialog(Account *account, bool useFlo
         connect(this, &WebFlowCredentialsDialog::onActivate, _flow2AuthWidget, &Flow2AuthWidget::slotPollNow);
     } else {
         _webView = new WebView();
-        _layout->addWidget(_webView);
+        _containerLayout->addWidget(_webView);
 
         connect(_webView, &WebView::urlCatched, this, &WebFlowCredentialsDialog::urlCatched);
     }
@@ -50,10 +66,11 @@ WebFlowCredentialsDialog::WebFlowCredentialsDialog(Account *account, bool useFlo
 
     _errorLabel = new QLabel();
     _errorLabel->hide();
-    _layout->addWidget(_errorLabel);
+    _containerLayout->addWidget(_errorLabel);
 
     WizardCommon::initErrorLabel(_errorLabel);
 
+    _layout->addLayout(_containerLayout);
     setLayout(_layout);
 
     customizeStyle();
index 93755c160f969a7ffa7924b66b0dc306e2a11601..3dfdf744d9d095332a37e2918278b4355cb4db68 100644 (file)
@@ -11,6 +11,7 @@ class QVBoxLayout;
 
 namespace OCC {
 
+class HeaderBanner;
 class WebView;
 class Flow2AuthWidget;
 
@@ -52,6 +53,8 @@ private:
     QLabel *_errorLabel;
     QLabel *_infoLabel;
     QVBoxLayout *_layout;
+    QVBoxLayout *_containerLayout;
+    HeaderBanner *_headerBanner;
 };
 
 } // namespace OCC
diff --git a/src/gui/headerbanner.cpp b/src/gui/headerbanner.cpp
new file mode 100644 (file)
index 0000000..4c42575
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) by Michael Schuster <michael@nextcloud.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.
+ */
+
+/****************************************************************************
+**
+** Based on Qt sourcecode:
+**   qt5/qtbase/src/widgets/dialogs/qwizard.cpp
+**
+** https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qwizard.cpp?h=v5.13.0
+**
+** Original license:
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "headerbanner.h"
+
+#include <QVBoxLayout>
+#include <QLabel>
+
+#include <QPainter>
+#include <QStyle>
+#include <QGuiApplication>
+
+namespace OCC {
+
+// These fudge terms were needed a few places to obtain pixel-perfect results
+const int GapBetweenLogoAndRightEdge = 5;
+const int ModernHeaderTopMargin = 2;
+
+HeaderBanner::HeaderBanner(QWidget *parent)
+    : QWidget(parent)
+{
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+    setBackgroundRole(QPalette::Base);
+    titleLabel = new QLabel(this);
+    titleLabel->setBackgroundRole(QPalette::Base);
+    logoLabel = new QLabel(this);
+    QFont font = titleLabel->font();
+    font.setBold(true);
+    titleLabel->setFont(font);
+    layout = new QGridLayout(this);
+    layout->setContentsMargins(QMargins());
+    layout->setSpacing(0);
+    layout->setRowMinimumHeight(3, 1);
+    layout->setRowStretch(4, 1);
+    layout->setColumnStretch(2, 1);
+    layout->setColumnMinimumWidth(4, 2 * GapBetweenLogoAndRightEdge);
+    layout->setColumnMinimumWidth(6, GapBetweenLogoAndRightEdge);
+    layout->addWidget(titleLabel, 1, 1, 5, 1);
+    layout->addWidget(logoLabel, 1, 5, 5, 1);
+}
+
+void HeaderBanner::setup(const QString &title, const QPixmap &logo, const QPixmap &banner,
+                         const Qt::TextFormat titleFormat, const QString &styleSheet)
+{
+    QStyle *style = parentWidget()->style();
+    //const int layoutHorizontalSpacing = style->pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
+    int topLevelMarginLeft = style->pixelMetric(QStyle::PM_LayoutLeftMargin, 0, parentWidget());
+    int topLevelMarginRight = style->pixelMetric(QStyle::PM_LayoutRightMargin, 0, parentWidget());
+    int topLevelMarginTop = style->pixelMetric(QStyle::PM_LayoutTopMargin, 0, parentWidget());
+    //int topLevelMarginBottom = style->pixelMetric(QStyle::PM_LayoutBottomMargin, 0, parentWidget());
+
+    layout->setRowMinimumHeight(0, ModernHeaderTopMargin);
+    layout->setRowMinimumHeight(1, topLevelMarginTop - ModernHeaderTopMargin - 1);
+    layout->setRowMinimumHeight(6, 3);
+    int minColumnWidth0 = topLevelMarginLeft + topLevelMarginRight;
+    int minColumnWidth1 = topLevelMarginLeft + topLevelMarginRight + 1;
+    layout->setColumnMinimumWidth(0, minColumnWidth0);
+    layout->setColumnMinimumWidth(1, minColumnWidth1);
+    titleLabel->setTextFormat(titleFormat);
+    titleLabel->setText(title);
+    if(!styleSheet.isEmpty())
+        titleLabel->setStyleSheet(styleSheet);
+    logoLabel->setPixmap(logo);
+    bannerPixmap = banner;
+    if (bannerPixmap.isNull()) {
+        QSize size = layout->totalMinimumSize();
+        setMinimumSize(size);
+        setMaximumSize(QWIDGETSIZE_MAX, size.height());
+    } else {
+        setFixedHeight(banner.height() + 2);
+    }
+    updateGeometry();
+}
+
+void HeaderBanner::paintEvent(QPaintEvent * /* event */)
+{
+    QPainter painter(this);
+    painter.drawPixmap(0, 0, width(), bannerPixmap.height(), bannerPixmap);
+    int x = width() - 2;
+    int y = height() - 2;
+    const QPalette &pal = QGuiApplication::palette();
+    painter.setPen(pal.mid().color());
+    painter.drawLine(0, y, x, y);
+    painter.setPen(pal.base().color());
+    painter.drawPoint(x + 1, y);
+    painter.drawLine(0, y + 1, x + 1, y + 1);
+}
+
+} // namespace OCC
diff --git a/src/gui/headerbanner.h b/src/gui/headerbanner.h
new file mode 100644 (file)
index 0000000..c52d73c
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) by Michael Schuster <michael@nextcloud.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.
+ */
+
+/****************************************************************************
+**
+** Based on Qt sourcecode:
+**   qt5/qtbase/src/widgets/dialogs/qwizard.cpp
+**
+** https://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/dialogs/qwizard.cpp?h=v5.13.0
+**
+** Original license:
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtWidgets module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef HEADERBANNER_H
+#define HEADERBANNER_H
+
+#include <QWidget>
+
+class QLabel;
+class QGridLayout;
+class QPixmap;
+
+namespace OCC {
+
+class HeaderBanner : public QWidget
+{
+    Q_OBJECT
+public:
+    HeaderBanner(QWidget *parent = 0);
+
+    void setup(const QString &title, const QPixmap &logo, const QPixmap &banner,
+               const Qt::TextFormat titleFormat, const QString &styleSheet);
+
+protected:
+    void paintEvent(QPaintEvent *event) override;
+
+private:
+    QLabel *titleLabel;
+    QLabel *logoLabel;
+    QGridLayout *layout;
+    QPixmap bannerPixmap;
+};
+
+} // namespace OCC
+
+#endif // HEADERBANNER_H
index d66d1981453f3647acdc46cf2206486dbdd25f13..ee8d6c74903b30ed936b8b50a838116a8f16f4d9 100644 (file)
@@ -25,7 +25,6 @@
 
 #include "common/utility.h"
 #include "account.h"
-#include "theme.h"
 #include "wizard/owncloudwizardcommon.h"
 
 #include "QProgressIndicator.h"
@@ -43,14 +42,6 @@ Flow2AuthWidget::Flow2AuthWidget(Account *account, QWidget *parent)
 {
     _ui.setupUi(this);
 
-    Theme *theme = Theme::instance();
-    _ui.topLabel->hide();
-    _ui.bottomLabel->hide();
-    QVariant variant = theme->customMedia(Theme::oCSetupTop);
-    WizardCommon::setupCustomMedia(variant, _ui.topLabel);
-    variant = theme->customMedia(Theme::oCSetupBottom);
-    WizardCommon::setupCustomMedia(variant, _ui.bottomLabel);
-
     WizardCommon::initErrorLabel(_ui.errorLabel);
 
     connect(_ui.openLinkButton, &QCommandLinkButton::clicked, this, &Flow2AuthWidget::slotOpenBrowser);
index 45664bc7d65a32645b58c8cf33cb94927b1fb649..a07e0e1a93f2cf7e22746ae85f8c7bf1cd4dcec0 100644 (file)
    <string>Browser Authentication</string>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QLabel" name="topLabel">
-     <property name="text">
-      <string notr="true">TextLabel</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">
      </property>
     </spacer>
    </item>
-   <item>
-    <widget class="QLabel" name="bottomLabel">
-     <property name="text">
-      <string notr="true">TextLabel</string>
-     </property>
-     <property name="textFormat">
-      <enum>Qt::RichText</enum>
-     </property>
-    </widget>
-   </item>
   </layout>
  </widget>
  <resources/>