Browse Source

Add qml type registration

- Add qml type registration for messages
- Update examples accordingly
Alexey Edelev 5 years ago
parent
commit
91e749457e

+ 0 - 5
examples/addressbook/main.cpp

@@ -51,11 +51,6 @@ int main(int argc, char *argv[])
     PhoneNumber::registerTypes();
 
     qmlRegisterType<ContactsListModel>("examples.addressbook", 1, 0, "ContactsListModel");
-    qmlRegisterType<qtprotobuf::examples::Job>("qtprotobuf.examples.addressbook", 1, 0, "Job");
-    qmlRegisterType<qtprotobuf::examples::Address>("qtprotobuf.examples.addressbook", 1, 0, "Address");
-    qmlRegisterType<qtprotobuf::examples::Contact>("qtprotobuf.examples.addressbook", 1, 0, "Contact");
-    qmlRegisterType<qtprotobuf::examples::Contacts>("qtprotobuf.examples.addressbook", 1, 0, "Contacts");
-    qmlRegisterType<qtprotobuf::examples::PhoneNumber>("qtprotobuf.examples.addressbook", 1, 0, "PhoneNumber");
 
     QGuiApplication app(argc, argv);
     AddressBookEngine abEngine;

+ 1 - 1
examples/addressbook/qml/AddContactView.qml

@@ -1,7 +1,7 @@
 import QtQuick 2.0
 import QtQuick.Controls 2.4
 
-import qtprotobuf.examples.addressbook 1.0
+import qtprotobuf.examples 1.0
 
 StackItem {
     id: root

+ 1 - 1
examples/addressbook/qml/ContactList.qml

@@ -25,7 +25,7 @@
 
 import QtQuick 2.9
 import QtQuick.Layouts 1.1
-import qtprotobuf.examples.addressbook 1.0
+import qtprotobuf.examples 1.0
 
 StackItem {
     id: root

+ 1 - 1
examples/addressbook/qml/main.qml

@@ -26,7 +26,7 @@
 import QtQuick 2.9
 import QtQuick.Controls 2.9
 
-import qtprotobuf.examples.addressbook 1.0
+import qtprotobuf.examples 1.0
 import examples.addressbook 1.0
 
 ApplicationWindow {

+ 1 - 0
src/generator/classsourcegeneratorbase.cpp

@@ -47,6 +47,7 @@ void ClassSourceGeneratorBase::printClassHeaderInclude()
     std::string includeFileName = mClassName;
     utils::tolower(includeFileName);
     mPrinter.Print({{"include", includeFileName}}, Templates::InternalIncludeTemplate);
+    mPrinter.Print({{"include", "QQmlEngine"}}, Templates::ExternalIncludeTemplate);
 }
 
 void ClassSourceGeneratorBase::printUsingNamespaces(const std::unordered_set<std::string> &namespaces)

+ 5 - 1
src/generator/protobufsourcegenerator.cpp

@@ -42,12 +42,16 @@ ProtobufSourceGenerator::ProtobufSourceGenerator(const google::protobuf::Descrip
 
 void ProtobufSourceGenerator::printRegisterBody()
 {
-    const std::map<std::string, std::string> registrationProperties = {{"classname", mClassName}, {"namespaces", mNamespacesColonDelimited}};
+    const std::map<std::string, std::string> registrationProperties = {{"classname", mClassName},
+                                                                       {"namespaces", mNamespacesColonDelimited},
+                                                                       {"package", mMessage->file()->package()}
+                                                                      };
     mPrinter.Print(registrationProperties,
                    Templates::ComplexTypeRegistrationTemplate);
     Indent();
     Indent();
     mPrinter.Print(registrationProperties, Templates::RegisterQmlListPropertyMetaTypeTemplate);
+    mPrinter.Print(registrationProperties, Templates::QmlRegisterTypeTemplate);
     Outdent();
     Outdent();
 

+ 2 - 1
src/generator/templates.cpp

@@ -191,7 +191,8 @@ const char *Templates::ClientMethodDefinitionAsyncTemplate = "\nbool $classname$
                                                              "    return false;\n"
                                                              "}\n";
 const char *Templates::SerializersTemplate = "Q_DECLARE_PROTOBUF_SERIALIZERS($classname$)\n";
-const char *Templates::RegisterSerializersTemplate = "qtprotobuf::ProtobufObjectPrivate::registerSerializers<$classname$>();";
+const char *Templates::RegisterSerializersTemplate = "qtprotobuf::ProtobufObjectPrivate::registerSerializers<$classname$>();\n";
+const char *Templates::QmlRegisterTypeTemplate = "qmlRegisterType<$namespaces$::$classname$>(\"$package$\", 1, 0, \"$classname$\");\n";
 
 const std::unordered_map<::google::protobuf::FieldDescriptor::Type, std::string> Templates::TypeReflection = {
     {::google::protobuf::FieldDescriptor::TYPE_DOUBLE, "double"},

+ 2 - 0
src/generator/templates.h

@@ -103,6 +103,8 @@ public:
     static const char *MapSerializationRegisterTemplate;
     static const char *SerializersTemplate;
     static const char *RegisterSerializersTemplate;
+    static const char *QmlRegisterTypeTemplate;
+
     //Service templates
     static const char *ConstructorDefinitionSyncTemplate;