KDE theme colors API for QML
Albert Astals Cid
aacid at kde.org
Sun Aug 25 22:00:42 BST 2013
El Dimecres, 14 d'agost de 2013, a les 23:49:23, Денис Купляков va escriure:
> Hey all!
Hi
> I want to implement API to access KDE theme colors from QML to use in
> games or other applications. For example it will allow us to implement
> KGamePopupItem substitution for QML.
>
> Now developer need to make own custom c++ writen class to access
> colors through Q_PROPERTY using. But we can't provide hundreds of
> props for every KDE color.
>
> So I decided to make universal API, that will use enums that are
> declared at KColorScheme class to access colors.
>
> I have started investigating what we can use for this:
>
> What we have:
> 1) Q_ENUMS macro that allows to use enumeration in MOS (metaobject
> system), can only be used at QObject derived class as other macros. We
> can also use it like this:
>
> Class A : QObject {
> Q_OBJECT
> public:
> enum TestEnum {
> FOO,
> BAR
> }
> }
>
> Class B: QObject {
> Q_OBJECT
> Q_ENUMS(A::TestEnum)
> PROPERTY(A::TestEnum someprop READ ... WRITE ... )
> }
>
> It allows to register enum from other QObject derived class at MOS,
> but if we get instance of B at QML we have no way to use enum. Also
> because of QObject we can't use it because KColorScheme is not QObject
> derived.
>
> OK, still if we write
>
> Class A : QObject {
> Q_OBJECT
> Q_ENUMS(TestEnum)
> public:
> enum TestEnum {
> FOO,
> BAR
> }
> }
>
> we can assign FOO and BAR only to properties of A or other class, we
> can't pass it as arguments (so we even can't do smth like
> console.log(A.FOO) from QML)
>
> 2) Q_INVOKABLE macro that allows to use function in MOS, can only be
> used at QObject derived class, at its arguments seems to be only MOS
> classes and primitive classes (for example: int, QString, QObject *)
>
> 3) Q_DECLARE_METATYPE macro it allows to register class at MOS and use
> as functions arguments. Here [1] and here [2] we see that people say
> it is applicable for enums.
>
> So there is a lot of limitations, and I have tried two approaches:
> FIRST) we are creating uncreatable (I usually say static class) (if
> smth go wrong can be creatable) ColorScheme (with
> qmlRegisterUncreatableType function) that will have functions like:
>
> Q_INVOKABLE QColor background(KColorScheme::
> ColorSet,
> KColorScheme::BackgroundRole, QPalette::ColorGroup)
>
> SECOND) we are creating ColorToken class that will have propeties like:
> colorSet, backgroundRole, colorGroup (it is arguments READ WRITE access)
> backgroundColor (it is what we need it has only READ access)
>
> Now I can't do normally nor first neither second, because I can't
> access KColorScheme enums as it is not QObject derived... And making
> copy of all of them will be hardly to maintain I think. Previously I
> was thinking that such thing will make a trick:
>
> class ColorScheme: public QObject, public KColorScheme {
> Q_OBEJECT
> Q_ENUMS(....)
> }
>
> but was disappointed looking at moc file, it don't see enums.
>
> Also even making KColorScheme Q_OBJECT derived don't gives ability to
> use enums as arguments for functions. So we have only SECOND approach.
>
> We simply doing all our stuff by directly changing
> KColorScheme class: adding Q_OBJECT and Q_ENUMS statements to it, than
> going by SECOND approach. But its also bad because of binary
> compatibility of libraries, as was discussed at another maillinglist
> [3].
Yes, changing the KColorScheme ABI is not possible for 4.x, you may want to
take this to kde-frameworks-devel for 5.x though.
Regarding your problem, have you tried something like
#include "kcolorscheme.h"
class ColorSchemeWrapper : public QObject {
Q_OBJECT
Q_ENUMS(ColorSet)
public:
enum ColorSet {
View = KColorSchme::View, // Keeps enum values in sync!
Window = KColorSchme::Window,
Button = KColorSchme::Button,
Selection = KColorSchme::Selection,
Tooltip = KColorSchme::Tooltip
};
};
?
That should help, it's a bit of a pain, but probably is your only option at
the moment.
Cheers,
Albert
>
> So I have found about Q_GADGET [4], can we use it to expose
> KColorScheme enums instead of Q_OBJECT. What are you think about all
> of this?
>
> [1] http://qt-project.org/forums/viewreply/39427/
> [2] http://qt-project.org/forums/viewthread/10308/
> [3] http://lists.kde.org/?t=137573624500003&r=1&w=2
> [4]
> http://harmattan-dev.nokia.com/docs/platform-api-reference/xml/daily-docs/l
> ibqt4/qobject.html search for Q_GADGET
>
> Best regards,
> Denis Kuplyakov
More information about the kde-core-devel
mailing list