Add support for int

master
Jos van den Oever 2017-08-12 12:49:37 +02:00
parent 76cf366550
commit ca8d60b277
10 changed files with 76 additions and 31 deletions

View File

@ -57,6 +57,7 @@ impl<'a> From<&'a Vec<u8>> for QByteArray {
pub enum Variant {
None,
Bool(bool),
Int(c_int),
String(String),
ByteArray(Vec<u8>),
}
@ -79,6 +80,7 @@ impl From<String> for Variant {
enum VariantType {
Invalid = 0,
Bool = 1,
Int = 2,
String = 10,
ByteArray = 12,
}
@ -100,6 +102,9 @@ impl<'a> QVariant<'a> {
VariantType::Bool => {
Variant::Bool(self.value != 0)
},
VariantType::Int => {
Variant::Int(self.value)
},
VariantType::String => {
let data = unsafe {
let d = self.data as *const uint16_t;
@ -137,6 +142,14 @@ impl<'a> From<&'a Variant> for QVariant<'a> {
phantom: PhantomData,
}
}
Variant::Int(v) => {
QVariant {
data: null(),
value: v,
type_: VariantType::Int,
phantom: PhantomData,
}
}
Variant::String(ref v) => {
QVariant {
data: v.as_ptr(),

View File

@ -526,6 +526,7 @@ namespace {
switch (v.type) {
case QVariant::String: return QString::fromUtf8(static_cast<const char*>(v.data), v.value);
case QVariant::Bool: return QVariant((bool)v.value);
case QVariant::Int: return QVariant(v.value);
case QVariant::ByteArray: return QVariant(QByteArray(v.data, v.value));
default:;
}

View File

@ -45,6 +45,7 @@ namespace {
switch (v.type) {
case QVariant::String: return QString::fromUtf8(static_cast<const char*>(v.data), v.value);
case QVariant::Bool: return QVariant((bool)v.value);
case QVariant::Int: return QVariant(v.value);
case QVariant::ByteArray: return QVariant(QByteArray(v.data, v.value));
default:;
}

View File

@ -57,6 +57,7 @@ impl<'a> From<&'a Vec<u8>> for QByteArray {
pub enum Variant {
None,
Bool(bool),
Int(c_int),
String(String),
ByteArray(Vec<u8>),
}
@ -79,6 +80,7 @@ impl From<String> for Variant {
enum VariantType {
Invalid = 0,
Bool = 1,
Int = 2,
String = 10,
ByteArray = 12,
}
@ -100,6 +102,9 @@ impl<'a> QVariant<'a> {
VariantType::Bool => {
Variant::Bool(self.value != 0)
},
VariantType::Int => {
Variant::Int(self.value)
},
VariantType::String => {
let data = unsafe {
let d = self.data as *const uint16_t;
@ -137,6 +142,14 @@ impl<'a> From<&'a Variant> for QVariant<'a> {
phantom: PhantomData,
}
}
Variant::Int(v) => {
QVariant {
data: null(),
value: v,
type_: VariantType::Int,
phantom: PhantomData,
}
}
Variant::String(ref v) => {
QVariant {
data: v.as_ptr(),

View File

@ -57,6 +57,7 @@ impl<'a> From<&'a Vec<u8>> for QByteArray {
pub enum Variant {
None,
Bool(bool),
Int(c_int),
String(String),
ByteArray(Vec<u8>),
}
@ -79,6 +80,7 @@ impl From<String> for Variant {
enum VariantType {
Invalid = 0,
Bool = 1,
Int = 2,
String = 10,
ByteArray = 12,
}
@ -100,6 +102,9 @@ impl<'a> QVariant<'a> {
VariantType::Bool => {
Variant::Bool(self.value != 0)
},
VariantType::Int => {
Variant::Int(self.value)
},
VariantType::String => {
let data = unsafe {
let d = self.data as *const uint16_t;
@ -137,6 +142,14 @@ impl<'a> From<&'a Variant> for QVariant<'a> {
phantom: PhantomData,
}
}
Variant::Int(v) => {
QVariant {
data: null(),
value: v,
type_: VariantType::Int,
phantom: PhantomData,
}
}
Variant::String(ref v) => {
QVariant {
data: v.as_ptr(),

View File

@ -45,6 +45,7 @@ namespace {
switch (v.type) {
case QVariant::String: return QString::fromUtf8(static_cast<const char*>(v.data), v.value);
case QVariant::Bool: return QVariant((bool)v.value);
case QVariant::Int: return QVariant(v.value);
case QVariant::ByteArray: return QVariant(QByteArray(v.data, v.value));
default:;
}

View File

@ -1,6 +1,7 @@
#include "test_object_types_rust.h"
#include <QTest>
#include <QSignalSpy>
#include <QDebug>
class TestRustObjectTypes : public QObject
{
@ -13,18 +14,19 @@ private slots:
void TestRustObjectTypes::testSetter()
{
// GIVEN
Person person;
const QVariant userName;
QSignalSpy spy(&person, &Person::userNameChanged);
QFETCH(QVariant, value);
Object object;
QSignalSpy spy(&object, &Object::valueChanged);
// WHEN
person.setUserName(userName);
object.setValue(value);
// THEN
QVERIFY(spy.isValid());
QCOMPARE(spy.count(), 1);
QCOMPARE(person.userName().type(), userName.type());
QCOMPARE(person.userName(), userName);
auto resultType = object.value().type();
QCOMPARE(resultType, value.type());
QCOMPARE(object.value(), value);
}
void TestRustObjectTypes::testSetter_data()

View File

@ -6,10 +6,10 @@
"implementationModule": "implementation"
},
"objects": [{
"name": "Person",
"name": "Object",
"type": "Object",
"properties": [{
"name": "userName",
"name": "value",
"type": "QVariant",
"write": true
}]

View File

@ -45,6 +45,7 @@ namespace {
switch (v.type) {
case QVariant::String: return QString::fromUtf8(static_cast<const char*>(v.data), v.value);
case QVariant::Bool: return QVariant((bool)v.value);
case QVariant::Int: return QVariant(v.value);
case QVariant::ByteArray: return QVariant(QByteArray(v.data, v.value));
default:;
}
@ -109,25 +110,25 @@ 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*, QVariant*, qvariant_set);
void person_user_name_set(void*, qvariant_t);
ObjectInterface* object_new(Object*, void (*)(Object*));
void object_free(ObjectInterface*);
void object_value_get(ObjectInterface*, QVariant*, qvariant_set);
void object_value_set(void*, qvariant_t);
};
Person::Person(QObject *parent):
Object::Object(QObject *parent):
QObject(parent),
d(person_new(this,
[](Person* o) { emit o->userNameChanged(); })) {}
d(object_new(this,
[](Object* o) { emit o->valueChanged(); })) {}
Person::~Person() {
person_free(d);
Object::~Object() {
object_free(d);
}
QVariant Person::userName() const
QVariant Object::value() const
{
QVariant v;
person_user_name_get(d, &v, set_qvariant);
object_value_get(d, &v, set_qvariant);
return v;
}
void Person::setUserName(const QVariant& v) {
variant(v, d, person_user_name_set);
void Object::setValue(const QVariant& v) {
variant(v, d, object_value_set);
}

View File

@ -6,20 +6,20 @@
#include <QVariant>
#include <QAbstractItemModel>
class PersonInterface;
class Person : public QObject
class ObjectInterface;
class Object : public QObject
{
Q_OBJECT
PersonInterface * const d;
Q_PROPERTY(QVariant userName READ userName WRITE setUserName NOTIFY userNameChanged FINAL)
ObjectInterface * const d;
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged FINAL)
public:
explicit Person(QObject *parent = nullptr);
~Person();
QVariant userName() const;
void setUserName(const QVariant& v);
explicit Object(QObject *parent = nullptr);
~Object();
QVariant value() const;
void setValue(const QVariant& v);
signals:
void userNameChanged();
void valueChanged();
private:
QVariant m_userName;
QVariant m_value;
};
#endif // TEST_OBJECT_TYPES_RUST_H