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
}
pub fn convert(&self) -> Variant {
// TODO
Variant::None
match (self.type_) {
10 => {
Variant::String(String::new())
}
_ => Variant::None
}
}
}

View File

@ -16,8 +16,6 @@ function(rust_test NAME DIRECTORY)
MAIN_DEPENDENCY "${NAME}.json"
DEPENDS "${GENERATOR}"
)
# add_custom_target("${DIRECTORY}"
# DEPENDS "${DIR}/src/inferface.rs")
add_custom_command(
OUTPUT "${DIR}/${RUST_TARGET_DIR}/librust.a"
@ -39,7 +37,8 @@ function(rust_test NAME DIRECTORY)
"${DIR}/${RUST_TARGET_DIR}/librust.a"
)
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}"
"${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target "${NAME}")

View File

@ -96,8 +96,16 @@ impl<'a> QVariant<'a> {
self.type_ as u32
}
pub fn convert(&self) -> Variant {
// TODO
Variant::None
match self.type_ {
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 <QSignalSpy>
#include <QDebug>
class TestRustObject : public QObject
{
@ -26,15 +27,17 @@ void TestRustObject::testStringSetter()
{
// GIVEN
Person person;
const QVariant userName(QString("Konqi"));
QSignalSpy spy(&person, &Person::userNameChanged);
// WHEN
person.setUserName("Konqi");
person.setUserName(userName);
// THEN
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QCOMPARE(person.userName(), QString("Konqi"));
QCOMPARE(person.userName().type(), userName.type());
QCOMPARE(person.userName(), userName);
}
QTEST_MAIN(TestRustObject)

View File

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

View File

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

View File

@ -11,15 +11,15 @@ class Person : public QObject
{
Q_OBJECT
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:
explicit Person(QObject *parent = nullptr);
~Person();
QString userName() const;
void setUserName(const QString& v);
QVariant userName() const;
void setUserName(const QVariant& v);
signals:
void userNameChanged();
private:
QString m_userName;
QVariant m_userName;
};
#endif // TEST_OBJECT_TYPES_RUST_H