Native Options Menu
BogDan
bog_dan_ro at yahoo.com
Fri Mar 2 18:16:14 UTC 2012
Hi Chris,
Thanks for the tip, but I don't think it will help us too much. I'm waiting for other patches [1], [2] which makes the menu implementation truly portable.
Sadly it seems nobody is working on it, so this weekend I'll push your implementation with some small changes.
Cheers,
BogDan.
[1] http://codereview.qt-project.org/#change,16553
[2] http://codereview.qt-project.org/#change,11954 or http://codereview.qt-project.org/#change,17906
>________________________________
> From: Chris Browet <cbro at semperpax.com>
>To: necessitas-devel at kde.org
>Sent: Tuesday, February 21, 2012 5:50 PM
>Subject: Re: Native Options Menu
>
>
>For reference, the full QPlatformMenu patch: https://codereview.qt-project.org/#change,4068
>
>
>On Fri, Feb 17, 2012 at 20:22, BogDan <bog_dan_ro at yahoo.com> wrote:
>
>
>>
>>Hi,
>>
>> I have some bad news, these days I was very busy at work and I didn't had time finish the menu changes, the problem is next two weeks I'll be in Belarus (business travel). Sadly, these weeks, I don't think I'll have enough time to work on it ...
>>
>>
>>
>>Cheers,
>>BogDan.
>>
>>
>>
>>----- Original Message -----
>>> From: BogDan <bog_dan_ro at yahoo.com>
>>> To: "mkruisselbrink at kde.org" <mkruisselbrink at kde.org>
>>> Cc: "cbro at semperpax.com" <cbro at semperpax.com>; Necessitas <necessitas-devel at kde.org>
>>> Sent: Thursday, February 16, 2012 9:21 PM
>>> Subject: Re: Native Options Menu
>>>
>>> Hi,
>>>
>>> + necessitas-devel in CC
>>>
>>> I believe our goal should be to easily port an application *and* that
>>> application should look and fell the same with native applications, otherwise
>>> Android users will fell the difference and some (most) of them will reject any
>>> application which looks odd. So IMHO we should focus on this matter.
>>>
>>>
>>> Regarding active window thing, yes I've seen that message, but I
>>> didn't had time to dig more and to find a proper solution. A quick and dirty
>>> solution will be to set the last top level widget as the active one, but sounds
>>> too easy to be the right solution :).
>>>
>>> Cheers,
>>> BogDan.
>>>
>>> ________________________________
>>> From: Marijn Kruisselbrink <mkruisselbrink at kde.org>;
>>> To: BogDan <bog_dan_ro at yahoo.com>;
>>> Cc: Chris Browet <cbro at semperpax.com>;
>>> Subject: Re: Native Options Menu
>>> Sent: Thu, Feb 16, 2012 7:27:55 AM
>>>
>>>
>>> I don't have a particularly strong opinion either way, for my purposes
>>> having
>>> just QMainWindow be able to have a menu would be fine, but that might indeed
>>> not be flexible enough. For QML and android 3.x and later we might want to
>>> somehow expose some sort of actionbar api to get among other things a
>>> "native"
>>> option menu? Although I'm not sure what our goal there is, minimal effort to
>>>
>>> port an application, or being able to use qt/qml to make an app that looks and
>>> feels native?
>>>
>>> For the activeWindow issue, there is actually a comment in QWidget::destroy in
>>> qwidget_qpa.cpp "we don't have proper focus event handling yet" in
>>> one of the
>>> places where activeWindow should be updated to some correct value, but is
>>> always set to 0 instead. Not sure how hard it would be to fix that though (not
>>> sure if there is anything in Qt5 that solves the
>>> problem in a way that might
>>> be back-portable).
>>>
>>> Marijn
>>>
>>> On Wednesday, February 15, 2012 02:29:35 PM BogDan wrote:
>>>> Hi Chris,
>>>>
>>>>
>>>> >Hi BogDan,
>>>> >
>>>> >I think your approach is too restrictive for at least 2 reasons:
>>>> >
>>>> >1) If only QMainWindow is taken into account, it would be impossible to
>>>> >create an options menu for, e.g., a QDialog descendant
>>>>
>>>> You are right !
>>>>
>>>> >2) I already coded a mechanism in the QML components for Android that
>>>> >would allow to display an options menu in QML, too. It involves adding
>>>> >QAction's to the QDeclarativeView (not via a QMenuBar).
>>>>
>>>> I'll try to backport platform menu from Qt5 [1], this way you can set
>>> the
>>>> menu easily from QML and it will fix the first issue as well.
>>>>
>>>>
>>>>
>>>> Cheers,
>>>> BogDan.
>>>>
>>>>
>>>> [1]
>>>> http://qt.gitorious.org/qt/qtbase/blobs/master/src/widgets/kernel/qplatfor
>>>> mmenu_qpa.h
>>>>
>>>> >- Chris -
>>>> >
>>>> >
>>>> >On Wed, Feb 15, 2012 at 11:23, BogDan <bog_dan_ro at yahoo.com>
>>> wrote:
>>>> >
>>>> >Hello everyone,
>>>> >
>>>> >> First and foremost I'd like to thank you for your work !
>>>> >>
>>>> >> I almost finish the review, I've done some trivial changes to
>>> your
>>>> >>code. I want to discuss with you a particular change which I'm
>>> not very
>>>> >>sure it's ok. It's about "prepareOptionsMenu"
>>> which I'd like to simplify
>>>> >>it a little bit.
>>>> >>
>>>> >> The biggest change in that function is that
>>> I suppose that *ONLY* a
>>>> >>QMainWindow may have menus, and *ONLY* if that window is the active
>>> one
>>>> >>I'm going to show the menu. Of course I must fix the
>>>> >>QApplication::activeWindow() issue first :) !
>>>> >>
>>>> >>
>>>> >>Here is the new code:
>>>> >>
>>>> >>
>>>> >>static jboolean prepareOptionsMenu(JNIEnv *env, jobject /*thiz*/,
>>> jobject
>>>> >>menu) {
>>>> >> // remove all actions from the menu first
>>>> >> env->CallVoidMethod(menu, s_menu_removeGroup, menuGroupId);
>>>> >>
>>>> >> // if the main window is not the active one (e.g a dialog is
>>>> >>displayed), don't show the menu ! const QMainWindow* window =
>>>> >>qobject_cast<QMainWindow*>(QApplication::activeWindow()); if
>>> (!window ||
>>>> >>!window->menuBar())
>>>>
>>>>> return JNI_FALSE;
>>>> >>
>>>> >> QList<QAction*> actions =
>>> window->menuBar()->actions();
>>>> >>
>>>> >> // and add actions to menu
>>>> >> foreach (QAction* action, actions)
>>>> >> {
>>>> >> QMenu *subMenu = action->menu();
>>>> >> if (subMenu)
>>>> >> {
>>>> >> QString txt = action->text();
>>>> >> jstring str =
>>> env->NewString(reinterpret_cast<const
>>>> >>jchar*>(txt.data()), txt.length()); jobject submenu =
>>>> >>env->CallObjectMethod(menu, s_menu_addSubMenu, menuGroupId,
>>> jint(-1),
>>>> >>jint(0) /*order*/, str);
>>> env->DeleteLocalRef(str);
>>>> >>
>>>> >> foreach (QAction* subAction, subMenu->actions())
>>>> >> addActionToMenu(env, submenu, subAction);
>>>> >>
>>>> >> env->DeleteLocalRef(submenu);
>>>> >> }
>>>> >> else
>>>> >> addActionToMenu(env, menu, action);
>>>> >> }
>>>> >> return JNI_TRUE;
>>>> >>}
>>>> >>
>>>> >>
>>>> >>Let me know if this approach is ok for you !
>>>> >>
>>>> >>
>>>> >>Cheers,
>>>> >>BogDan.
>>>
>>
>
>_______________________________________________
>Necessitas-devel mailing list
>Necessitas-devel at kde.org
>https://mail.kde.org/mailman/listinfo/necessitas-devel
>
>
>
More information about the Necessitas-devel
mailing list