src/QtRelationalReaderStringHadler.h
author František Kučera <franta-hg@frantovo.cz>
Sun, 30 Sep 2018 01:40:29 +0200
branchv_0
changeset 18 16784291982f
parent 13 c84042d014c9
child 20 b13e7ed9eea3
permissions -rw-r--r--
add QTableWidget with rows and collumns filled with attribute values

#pragma once

#include <QObject>

#include <relpipe/reader/typedefs.h>
#include <relpipe/reader/TypeId.h>
#include <relpipe/reader/handlers/RelationalReaderStringHandler.h>
#include <relpipe/reader/handlers/AttributeMetadata.h>

using namespace relpipe::reader;
using namespace relpipe::reader::handlers;

// signal/slot parameters must be declared here and registered with qRegisterMetaType()

Q_DECLARE_METATYPE(string_t)
Q_DECLARE_METATYPE(std::vector<AttributeMetadata>)

class QtRelationalReaderStringHadler : public QObject, public RelationalReaderStringHadler {
	Q_OBJECT
private:
	RelationalReaderStringHadler* target;
public:

	QtRelationalReaderStringHadler(QObject* parent, RelationalReaderStringHadler* target) :
	QObject(parent), target(target) {

		// see Q_DECLARE_METATYPE above
		qRegisterMetaType<string_t>();
		qRegisterMetaType<std::vector < AttributeMetadata >> ();

		QObject::connect(this, &QtRelationalReaderStringHadler::signal_startRelation, this, &QtRelationalReaderStringHadler::slot_startRelation);
		QObject::connect(this, &QtRelationalReaderStringHadler::signal_attribute, this, &QtRelationalReaderStringHadler::slot_attribute);
		QObject::connect(this, &QtRelationalReaderStringHadler::signal_endOfPipe, this, &QtRelationalReaderStringHadler::slot_endOfPipe);
	}

	virtual ~QtRelationalReaderStringHadler() {

	}

	virtual void startRelation(string_t name, std::vector<AttributeMetadata> attributes) override {
		emit signal_startRelation(name, attributes);
	}

	virtual void attribute(const string_t& value) override {
		emit signal_attribute(value);
	};

	virtual void endOfPipe() override {
		emit signal_endOfPipe();
	};

signals:
	void signal_startRelation(string_t name, std::vector<AttributeMetadata> attributes);
	void signal_attribute(const string_t& value);
	void signal_endOfPipe();

private slots:

	// FIXME: asynchronous signal-slot data passing between two threads

	void slot_startRelation(string_t name, std::vector<AttributeMetadata> attributes) {
		target->startRelation(name, attributes);
	};

	void slot_attribute(const string_t& value) {
		target->attribute(value);
	};

	void slot_endOfPipe() {
		target->endOfPipe();
	};
};