[Kde-games-devel] KDE theme colors API for QML
Albert Astals Cid
aacid at kde.org
Mon Aug 5 22:21:40 UTC 2013
El Dimarts, 6 d'agost de 2013, a les 00:54:37, Денис Купляков va escriure:
> Hey all!
Hi Denis, since you want to make QML-fy KColorScheme, which is a kdelibs
class, i think you should try to also mail kde-core-devel to involve kdelibs
developers that may have interesting input.
Cheers,
Albert
>
> 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.
>
> I see only one way: 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. What is your opinion about all of this?
>
> [1] http://qt-project.org/forums/viewreply/39427/
> [2] http://qt-project.org/forums/viewthread/10308/
>
> Best regards,
> Denis Kuplyakov
> _______________________________________________
> kde-games-devel mailing list
> kde-games-devel at kde.org
> https://mail.kde.org/mailman/listinfo/kde-games-devel
More information about the kde-games-devel
mailing list