Integrating Qt Quick components in Ministro

Kate Alhola kate.alhola at gmail.com
Thu Feb 2 18:58:09 UTC 2012


On Thu, Feb 2, 2012 at 4:19 PM, BogDan <bog_dan_ro at yahoo.com> wrote:
>
>
> Hi,
>
>     Excuse me if I'm wrong, but why we don't do the same technique as Nokia did with qml components for desktop ? They are using the application current QStyle plugin to paint all qml controls ! Is there any reason not to do the same thing ?

The model is upside down for Android case for several reasons.
1: We do not have ready desktop style for Android, that's different
when Qt can use on desktop system ready made desktop style.
2: We have mobile style already as NinePatch/BoderImage format, what
do we gain if we do NinePatch->Widget->BorderImage and not
NinePatch->BorderImage ?
3: Mobile components set and graphics is much more rich than desktop
widgets in mapping AndroidStyle->Widgets->BorderImage we lose a lot

Better idea is to do mthemedaemon that reads NinePatch Images from
JSon DB and returns BorderImages, then this class can be used
rendering both components and widgets. When I briefly checked zip file
you sent, it won't be a big deal. The large work will be mapping
names of hundreds image names between Android styles and names used by
components.

I can do proof-of-concept version of themedaemon if i got just
function to return named NinePatch from JSonDB, backport of Qt5
class would be best choice because then we have engine ready for Qt5.
I don't have resources to do all huge work for mapping
all theme assets.

Kate

> Cheers,
> BogDan.
>
>>
>>
>>There is the possibility of encapsulating widgets in QGraphicItem (as QGraphicWidget), thus allowing them to be used in QML.
>>
>>I don't know how these QGraphicWidget's handle QStyle, though....
>>
>>- Chris -
>>
>>
>>On Thu, Feb 2, 2012 at 14:28, BogDan <bog_dan_ro at yahoo.com> wrote:
>>
>>
>>>
>>>Hi,
>>>
>>>
>>>Yes ! BorderImage seems to be exactly the same thing with NinePatch, thanks for the tip !
>>>
>>>
>>>   Anyway, as I said before I'd like to have a QStyle plugin which paints the classic widget also the qml ones, because it seems classic widgets are sill use by a lot of people !
>>>
>>>
>>>Cheers,
>>>
>>>BogDan.
>>>
>>>
>>>
>>>----- Original Message -----
>>>> From: Kate Alhola <kate.alhola at gmail.com>
>>>
>>>> Sent: Wednesday, February 1, 2012 10:59 PM
>>>> Subject: Re: Integrating Qt Quick components in Ministro
>>>>
>>>
>>>> Some quick look comments:
>>>>
>>>> On Wed, Feb 1, 2012 at 9:20 PM, BogDan <bog_dan_ro at yahoo.com> wrote:
>>>>>  Hello everyone,
>>>>>
>>>>>    I have good news on this topic, I manage to check (a little bit)
>>>> Android's source code and to extract, the exact, android's look and
>>>> style informations for a few widgets (buttonStyle, editTextStyle,
>>>> radioButtonStyle, checkboxStyle, etc.) and store them into a .json file (check
>>>> the attachment). Because qt 4.x doesn't come with json support, IMHO we have
>>>> two options:
>>>>>    1 - to use this [1] qt json implementation.
>>>>>    2 - or to backport Qt 5.x json implementation (my favorite option,
>>>> because it seems more complex and complete than the first one).
>>>>>
>>>>>    I need more time to finish the extraction class (which will be part of
>>>> the next Ministro release), so, if someone wants to step in and begin the Qt
>>>> implementation it will be very appreciated !
>>>>>
>>>>>    To understand how android paints the widgets you have to check a simple
>>>> widget how it's painted. So let's check Button class [2], which extends
>>>> TextView class [3] which extends the View class [4].
>>>>>
>>>>>  How it works:
>>>>>    - Button class only pass to its super class (TextView)  the style
>>>> attribute (com.android.internal.R.attr.buttonStyle)
>>>>>    - TextView class pass the same information to its super class (View) then
>>>> in its constructor (check "public TextView(Context context, AttributeSet
>>>> attrs, int defStyle)" ) extracts text informations
>>>> (e.g.TextAppearance_textColor,TextAppearance_textSize, TextAppearance_typeface,
>>>> etc.) which are used to draw the text (check onDraw (...)).
>>>>>    - View class in its constructor (check "public View(Context context,
>>>> AttributeSet attrs, int defStyle)") extracts a few informations e.g.
>>>> View_background, View_paddingLeft, etc. which are used to paint the basic parts
>>>> of the widget (e.g. the background).
>>>>>
>>>>>    If you check the json file, you'll see that there are more than one
>>>> .png files used to paint the background, one for every view state (enabled,
>>>> disabled, pressed, etc.). Android split every .png file into nine pieces (it
>>>> uses nine patch technique [5], [6]) which are used to seamlessly resize the
>>>> widget. AFAIK there is no support for such a thing into Qt, so IMHO this is the
>>>> first thing which must be implemented.
>>>>>
>>>>
>>>> The nime patch looks exactly same than Qt BorderImage (
>>>> http://developer.qt.nokia.com/doc/qt-4.8/qml-borderimage.html )
>>>>
>>>>
>>>> Also, system that uses different images for different states is
>>>> exactly same that is used on components
>>>> meegotouch-button-background-pressed.png
>>>> meegotouch-button-background.png
>>>> meegotouch-button-background-selected.png
>>>> ....
>>>> and this for all combinations, inverted, disabled ...
>>>>
>>>> The problem then comes more than could we do some mapping of Android
>>>> and MeeGotouch states like
>>>> meegotouch-button-background -> buttonStyle_View-background_Enabled.png
>>>>
>>>> MeeGocomponents uses mthemedaemon plugin that fetch images, so, if we
>>>> could make just mapping names
>>>> and json query, we could in theory get theme engine.
>>>>
>>>> Symbian components uses svg images , meegocomponents borderimages .
>>>> There is very little
>>>> difference in component API's. Least what I have used, porting on apps
>>>> were mostly changing import statements
>>>> and change of some colors.
>>>>
>>>> Kate
>>>>
>>>>>  This weekend I hope to have enough time to create a wiki page which will
>>>> describe the content of the json file.
>>>>>
>>>>>  Cheers,
>>>>>  BogDan.
>>>>>
>>>>>
>>>>>  [1] https://github.com/ereilin/qt-json
>>>>>  [2]
>>>> http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/widget/Button.java.htm
>>>>>  [3]
>>>> http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/widget/TextView.java.htm
>>>>>  [4]
>>>> http://www.java2s.com/Open-Source/Android/android-core/platform-frameworks-base/android/view/View.java.htm
>>>>>  [5] http://developer.android.com/reference/android/graphics/NinePatch.html
>>>>>
>>>>>  [6]
>>>> http://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch
>>>>>
>>>>>
>>>>>>
>>>>>>  Hi,
>>>>>>
>>>>>>     Yes, sadly we have to get our hands  very dirty.
>>>>>>     First step is to identify all Qt components then we have to find
>>>>>>  Android's corresponding components, then we must extract the style
>>>> &
>>>>>>  look information to a central location (IMHO Ministro should do this
>>>> job), then
>>>>>>  any application which starts will peek this infos from that location
>>>> and use
>>>>>>  them to paint all controls.
>>>>>>     Second step is to check how Android paints the controls, here the
>>>> things will
>>>>>>  become dirty, we have to check
>>>>>>  "frameworks/base/core/java/android/widget/TextView.java" from
>>>> Android
>>>>>>  source code and it seems we have to use a lot of private data, I hope
>>>> the
>>>>>>  Android versions are not so different.
>>>>>>    Third step is to change Ministro in order to extract all the infos we
>>>> need to
>>>>>>  paint our controls.
>>>>>>     Fourth step is to create a QStyle plugin (which will be used by QML
>>>> as well)
>>>>>>  which loads the data extracted by Ministro and use it to paint the
>>>> controls. If
>>>>>>  the extract procedure is very fast (less than 10ms), I doubt it will be
>>>> that
>>>>>>  fast :),  we can skip the third step and extract the data directly in
>>>> QStyle.
>>>>>>     Fifth step, if everything works, we must get drunk !
>>>>>>
>>>>>>
>>>>>>  Cheers,
>>>>>>  BogDan.
>>>>>>
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>  While I don't agree on "almost all applications have the
>>>> same
>>>>>>  look" (as far as I can see, the only fully common UI element is
>>>> the
>>>>>>  menu/toolbar combo), I respect your choice.
>>>>>>>
>>>>>>>  The first step would be to define what is the "Android
>>>> style". Is
>>>>>>  there some Google guidelines you plan to follow?
>>>>>>>
>>>>>>>  Regards
>>>>>>>  - Chris -
>>>>>>>
>>>>>>>
>>>>>>>  On Tue, Jan 3, 2012 at 17:45, BogDan <bog_dan_ro at yahoo.com>
>>>> wrote:
>>>>>>>
>>>>>>>  Hi,
>>>>>>>>
>>>>>>>>
>>>>>>>>    I think none of your examples are good to follow :) The
>>>> reason why
>>>>>>  meego doesn't use QtStyle to draw the widgets is because meego
>>>> doesn't
>>>>>>  have a "native" style. Symbian is even worst, open any two
>>>>>>  applications on symbian and you'll see that none of them have the
>>>> same look
>>>>>>  & style :) On Android is a different story, almost all applications
>>>> have the
>>>>>>  same look & style, so if we want to have a first class citizen
>>>> port, all Qt
>>>>>>  applications *MUST* look the same as any android application. I'm
>>>> choosing
>>>>>>  to make QStyle plugin because this way all Qt applications will benefit
>>>> from it,
>>>>>>  either they are made using old-fashion widgets or QML components.
>>>>>>>>  For me a good android style is a top priority, I don't
>>>> believe
>>>>>>  I'll have enough time to finish it till beta 1 but who knows ...:)
>>>> maybe if
>>>>>>  other people will join me we can split the work and we can have this
>>>> feature in
>>>>>>  time for beta1.
>>>>>>>>
>>>>>>>>
>>>>>>>>  Cheers,
>>>>>>>>  BogDan.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>>  and please note that the Qt quick components (either
>>>> symbian or
>>>>>>  meego) don't use Qt widget styles. All the components are drawn in
>>>> qml so
>>>>>>  the componenets would unfortunately not benefit from your work on a
>>>> widget
>>>>>>  style.
>>>>>>>>>>  - Chris -
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>  On Thu, Dec 22, 2011 at 21:53, BogDan
>>>> <bog_dan_ro at yahoo.com>
>>>>>>  wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>  Hi Chris,
>>>>>>>>>>
>>>>>>>>>>  Please accept my apologize for the slow reply.
>>>>>>>>>>  I think before we'll integrate the components into
>>>> Ministro,
>>>>>>  we must do a few things:
>>>>>>>>>>   - the components MUST use Android's style, next
>>>> year
>>>>>>  I'm planning to create a style plugin for
>>>>>>>>>>
>>>>>>>>>>  widgets which should be used by Qt Quick Components for
>>>> Android.
>>>>>>>>>>   - wait until Nokia finishes to define the API for Qt
>>>> Quick
>>>>>>  components [1]. We can't afford to break the API after we release
>>>> it :)
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>  Cheers,
>>>>>>>>>>  BogDan.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>  [1]
>>>> https://bugreports.qt.nokia.com/browse/QTCOMPONENTS-200
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>  Hi guys,
>>>>>>>>>>>
>>>>>>>>>>>  What would the steps be to integrate the Qt quick
>>>> components
>>>>>>  for Android to Ministro as a package?
>>>>>>>>>>>
>>>>>>>>>>>  - Chris -
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>  _______________________________________________
>>>>>>  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