diff options
author | Nikita Krupenko <krnekit@gmail.com> | 2017-03-14 23:07:08 +0200 |
---|---|---|
committer | Nikita Krupenko <krnekit@gmail.com> | 2017-04-11 14:39:16 +0000 |
commit | 34f46588aa89537d2c90865694b30ffcda8c421f (patch) | |
tree | d9b0dbd333fc97f31a9fa6ae0980239697db6d61 /src | |
parent | b018a5ecef7b12c2d28df950a207ff3c7fc3abed (diff) |
Add button layout for dialogs on Android
It used macOS layout before, but it differs from the actual layout in
Android/Material Design: affirmative actions are on the right side,
dismissive actions are directly to the left of the affirmative actions
and neutral actions are on the left side.
[ChangeLog][Platform-specific Changes][Android] Android dialogs now have
more appropriate button layout, with affirmative actions on the right.
Task-number: QTBUG-58060
Change-Id: I0755f80261410c64cf4f854b7f2a72e2d959db28
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/kernel/qplatformdialoghelper.cpp | 26 | ||||
-rw-r--r-- | src/gui/kernel/qplatformdialoghelper.h | 5 | ||||
-rw-r--r-- | src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp | 6 | ||||
-rw-r--r-- | src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc | 5 | ||||
-rw-r--r-- | src/widgets/widgets/qdialogbuttonbox.cpp | 2 | ||||
-rw-r--r-- | src/widgets/widgets/qdialogbuttonbox.h | 6 |
6 files changed, 36 insertions, 14 deletions
diff --git a/src/gui/kernel/qplatformdialoghelper.cpp b/src/gui/kernel/qplatformdialoghelper.cpp index 01cf98c7c9..ad134ebe7f 100644 --- a/src/gui/kernel/qplatformdialoghelper.cpp +++ b/src/gui/kernel/qplatformdialoghelper.cpp @@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE */ -static const int buttonRoleLayouts[2][5][14] = +static const int buttonRoleLayouts[2][6][14] = { // Qt::Horizontal { @@ -92,7 +92,15 @@ static const int buttonRoleLayouts[2][5][14] = // MacModelessLayout { QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, - QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL } + QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL }, + + // AndroidLayout (neutral, stretch, dismissive, affirmative) + // https://material.io/guidelines/components/dialogs.html#dialogs-specs + { QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ActionRole, + QPlatformDialogHelper::Stretch, QPlatformDialogHelper::RejectRole | QPlatformDialogHelper::Reverse, + QPlatformDialogHelper::NoRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::DestructiveRole | QPlatformDialogHelper::Reverse, + QPlatformDialogHelper::AlternateRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::AcceptRole | QPlatformDialogHelper::Reverse, + QPlatformDialogHelper::YesRole | QPlatformDialogHelper::Reverse, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL } }, // Qt::Vertical @@ -120,10 +128,20 @@ static const int buttonRoleLayouts[2][5][14] = // MacModelessLayout { QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::ApplyRole, QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, - QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL } + QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL }, + + // AndroidLayout + // (affirmative + // dismissive + // neutral) + // https://material.io/guidelines/components/dialogs.html#dialogs-specs + { QPlatformDialogHelper::YesRole, QPlatformDialogHelper::AcceptRole, QPlatformDialogHelper::AlternateRole, QPlatformDialogHelper::DestructiveRole, + QPlatformDialogHelper::NoRole, QPlatformDialogHelper::RejectRole, QPlatformDialogHelper::Stretch, QPlatformDialogHelper::ActionRole, QPlatformDialogHelper::ApplyRole, + QPlatformDialogHelper::ResetRole, QPlatformDialogHelper::HelpRole, QPlatformDialogHelper::EOL, QPlatformDialogHelper::EOL } } }; + QPlatformDialogHelper::QPlatformDialogHelper() { qRegisterMetaType<StandardButton>(); @@ -917,6 +935,8 @@ const int *QPlatformDialogHelper::buttonLayout(Qt::Orientation orientation, Butt policy = MacLayout; #elif defined (Q_OS_LINUX) || defined (Q_OS_UNIX) policy = KdeLayout; +#elif defined (Q_OS_ANDROID) + policy = AndroidLayout; #else policy = WinLayout; #endif diff --git a/src/gui/kernel/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h index ed88c19c84..f58dcf17f0 100644 --- a/src/gui/kernel/qplatformdialoghelper.h +++ b/src/gui/kernel/qplatformdialoghelper.h @@ -141,13 +141,14 @@ public: Q_ENUM(ButtonRole) enum ButtonLayout { - // keep this in sync with QDialogButtonBox::ButtonLayout and QMessageBox::ButtonLayout + // keep this in sync with QDialogButtonBox::ButtonLayout UnknownLayout = -1, WinLayout, MacLayout, KdeLayout, GnomeLayout, - MacModelessLayout + MacModelessLayout, + AndroidLayout }; QPlatformDialogHelper(); diff --git a/src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp b/src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp index 08498d0582..ced35c4cfa 100644 --- a/src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp +++ b/src/plugins/platforms/android/qandroidplatformdialoghelpers.cpp @@ -103,11 +103,7 @@ bool QAndroidPlatformMessageDialogHelper::show(Qt::WindowFlags windowFlags if (!str.isEmpty()) m_javaMessageDialog.callMethod<void>("setDetailedText", "(Ljava/lang/String;)V", QJNIObjectPrivate::fromString(str).object()); - // http://developer.android.com/design/building-blocks/dialogs.html - // dismissive action on the left, affirmative on the right - // There don't seem to be more fine-grained rules, but the OS X layout - // at least conforms to this one rule and makes the rest deterministic. - const int * currentLayout = buttonLayout(Qt::Horizontal, MacLayout); + const int * currentLayout = buttonLayout(Qt::Horizontal, AndroidLayout); while (*currentLayout != QPlatformDialogHelper::EOL) { int role = (*currentLayout & ~QPlatformDialogHelper::Reverse); addButtons(opt, static_cast<ButtonRole>(role)); diff --git a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc index 1bf6c082a1..f37476a78e 100644 --- a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc +++ b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc @@ -1793,8 +1793,9 @@ a QMessageBox. The possible values are 0 (\l{QDialogButtonBox::}{WinLayout}), 1 (\l{QDialogButtonBox::}{MacLayout}), 2 - (\l{QDialogButtonBox::}{KdeLayout}), and 3 - (\l{QDialogButtonBox::}{GnomeLayout}). + (\l{QDialogButtonBox::}{KdeLayout}), 3 + (\l{QDialogButtonBox::}{GnomeLayout}) and 5 + (\l{QDialogButtonBox::}{AndroidLayout}). If this property is not specified, it defaults to the value specified by the current style for the diff --git a/src/widgets/widgets/qdialogbuttonbox.cpp b/src/widgets/widgets/qdialogbuttonbox.cpp index a3e55114bb..ad16acb96c 100644 --- a/src/widgets/widgets/qdialogbuttonbox.cpp +++ b/src/widgets/widgets/qdialogbuttonbox.cpp @@ -577,6 +577,8 @@ QDialogButtonBox::~QDialogButtonBox() \value MacLayout Use a policy appropriate for applications on \macos. \value KdeLayout Use a policy appropriate for applications on KDE. \value GnomeLayout Use a policy appropriate for applications on GNOME. + \value AndroidLayout Use a policy appropriate for applications on Android. + This enum value was added in Qt 5.10. The button layout is specified by the \l{style()}{current style}. However, on the X11 platform, it may be influenced by the desktop environment. diff --git a/src/widgets/widgets/qdialogbuttonbox.h b/src/widgets/widgets/qdialogbuttonbox.h index af9e705234..02d14dee7c 100644 --- a/src/widgets/widgets/qdialogbuttonbox.h +++ b/src/widgets/widgets/qdialogbuttonbox.h @@ -108,11 +108,13 @@ public: Q_FLAG(StandardButtons) enum ButtonLayout { - // keep this in sync with QMessageBox::ButtonLayout and QPlatformDialogHelper::ButtonLayout + // keep this in sync with QPlatformDialogHelper::ButtonLayout WinLayout, MacLayout, KdeLayout, - GnomeLayout + GnomeLayout, + // MacModelessLayout, + AndroidLayout = GnomeLayout + 2 // ### Qt 6: reorder }; QDialogButtonBox(QWidget *parent = Q_NULLPTR); |