Add string conversion to QVariant

master
Jos van den Oever 2017-08-11 23:47:56 +02:00
parent acd4c0852a
commit e468359100
7 changed files with 36 additions and 22 deletions

View File

@ -96,8 +96,12 @@ impl<'a> QVariant<'a> {
self.type_ as u32 self.type_ as u32
} }
pub fn convert(&self) -> Variant { pub fn convert(&self) -> Variant {
// TODO match (self.type_) {
Variant::None 10 => {
Variant::String(String::new())
}
_ => Variant::None
}
} }
} }

View File

@ -16,8 +16,6 @@ function(rust_test NAME DIRECTORY)
MAIN_DEPENDENCY "${NAME}.json" MAIN_DEPENDENCY "${NAME}.json"
DEPENDS "${GENERATOR}" DEPENDS "${GENERATOR}"
) )
# add_custom_target("${DIRECTORY}"
# DEPENDS "${DIR}/src/inferface.rs")
add_custom_command( add_custom_command(
OUTPUT "${DIR}/${RUST_TARGET_DIR}/librust.a" OUTPUT "${DIR}/${RUST_TARGET_DIR}/librust.a"
@ -39,7 +37,8 @@ function(rust_test NAME DIRECTORY)
"${DIR}/${RUST_TARGET_DIR}/librust.a" "${DIR}/${RUST_TARGET_DIR}/librust.a"
) )
set_property(TARGET ${NAME} set_property(TARGET ${NAME}
APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "${SRC}/${NAME}_rust.h") APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "${SRC}/${NAME}_rust.h"
APPEND PROPERTY AUTOGEN_TARGET_DEPENDS "${SRC}/${NAME}_rust.cpp")
add_test("build_${NAME}" add_test("build_${NAME}"
"${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target "${NAME}") "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target "${NAME}")

View File

@ -96,8 +96,16 @@ impl<'a> QVariant<'a> {
self.type_ as u32 self.type_ as u32
} }
pub fn convert(&self) -> Variant { pub fn convert(&self) -> Variant {
// TODO match self.type_ {
Variant::None 10 => {
let data = unsafe {
let d = self.data as *const uint16_t;
slice::from_raw_parts(d, self.len as usize)
};
Variant::String(String::from_utf16_lossy(data))
}
_ => Variant::None
}
} }
} }

View File

@ -1,6 +1,7 @@
#include "test_object_rust.h" #include "test_object_types_rust.h"
#include <QTest> #include <QTest>
#include <QSignalSpy> #include <QSignalSpy>
#include <QDebug>
class TestRustObject : public QObject class TestRustObject : public QObject
{ {
@ -26,15 +27,17 @@ void TestRustObject::testStringSetter()
{ {
// GIVEN // GIVEN
Person person; Person person;
const QVariant userName(QString("Konqi"));
QSignalSpy spy(&person, &Person::userNameChanged); QSignalSpy spy(&person, &Person::userNameChanged);
// WHEN // WHEN
person.setUserName("Konqi"); person.setUserName(userName);
// THEN // THEN
QVERIFY(spy.isValid()); QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1); QCOMPARE(spy.count(), 1);
QCOMPARE(person.userName(), QString("Konqi")); QCOMPARE(person.userName().type(), userName.type());
QCOMPARE(person.userName(), userName);
} }
QTEST_MAIN(TestRustObject) QTEST_MAIN(TestRustObject)

View File

@ -10,7 +10,7 @@
"type": "Object", "type": "Object",
"properties": [{ "properties": [{
"name": "userName", "name": "userName",
"type": "QString", "type": "QVariant",
"write": true "write": true
}] }]
}] }]

View File

@ -110,8 +110,8 @@ void set_qvariant(QVariant* v, qvariant_t* val) {
extern "C" { extern "C" {
PersonInterface* person_new(Person*, void (*)(Person*)); PersonInterface* person_new(Person*, void (*)(Person*));
void person_free(PersonInterface*); void person_free(PersonInterface*);
void person_user_name_get(PersonInterface*, QString*, qstring_set); void person_user_name_get(PersonInterface*, QVariant*, qvariant_set);
void person_user_name_set(void*, qstring_t); void person_user_name_set(void*, qvariant_t);
}; };
Person::Person(QObject *parent): Person::Person(QObject *parent):
QObject(parent), QObject(parent),
@ -121,12 +121,12 @@ Person::Person(QObject *parent):
Person::~Person() { Person::~Person() {
person_free(d); person_free(d);
} }
QString Person::userName() const QVariant Person::userName() const
{ {
QString v; QVariant v;
person_user_name_get(d, &v, set_qstring); person_user_name_get(d, &v, set_qvariant);
return v; return v;
} }
void Person::setUserName(const QString& v) { void Person::setUserName(const QVariant& v) {
person_user_name_set(d, v); variant(v, d, person_user_name_set);
} }

View File

@ -11,15 +11,15 @@ class Person : public QObject
{ {
Q_OBJECT Q_OBJECT
PersonInterface * const d; PersonInterface * const d;
Q_PROPERTY(QString userName READ userName WRITE setUserName NOTIFY userNameChanged FINAL) Q_PROPERTY(QVariant userName READ userName WRITE setUserName NOTIFY userNameChanged FINAL)
public: public:
explicit Person(QObject *parent = nullptr); explicit Person(QObject *parent = nullptr);
~Person(); ~Person();
QString userName() const; QVariant userName() const;
void setUserName(const QString& v); void setUserName(const QVariant& v);
signals: signals:
void userNameChanged(); void userNameChanged();
private: private:
QString m_userName; QVariant m_userName;
}; };
#endif // TEST_OBJECT_TYPES_RUST_H #endif // TEST_OBJECT_TYPES_RUST_H