Skip to content

Commit

Permalink
plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
zmoth committed Feb 13, 2023
1 parent 5465ddc commit 15260c5
Show file tree
Hide file tree
Showing 17 changed files with 754 additions and 3 deletions.
23 changes: 20 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,23 @@ option(QT_NODES_FORCE_TEST_COLOR "Force colorized unit test output" OFF)
enable_testing()

if(QT_NODES_DEVELOPER_DEFAULTS)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
# Set Output Path
include(GNUInstallDirs)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR})

if(NOT DEFINED CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES ${CMAKE_BUILD_TYPE})
endif()

foreach(OUTPUT_TYPES ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${OUTPUT_TYPES} OUTPUT_CONFIG)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/${OUTPUT_TYPES})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${OUTPUT_TYPES})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${OUTPUT_TYPES})
message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} : ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG}}")
endforeach(OUTPUT_TYPES CMAKE_CONFIGURATION_TYPES)
endif()

if(BUILD_DEBUG_POSTFIX_D)
Expand Down Expand Up @@ -89,6 +103,7 @@ set(CPP_SOURCE_FILES
src/StyleCollection.cpp
src/UndoCommands.cpp
src/locateNode.cpp
src/PluginsManager.cpp
)

set(HPP_HEADER_FILES
Expand Down Expand Up @@ -122,6 +137,8 @@ set(HPP_HEADER_FILES
include/QtNodes/internal/Serializable.hpp
include/QtNodes/internal/Style.hpp
include/QtNodes/internal/StyleCollection.hpp
include/QtNodes/internal/PluginInterface.hpp
include/QtNodes/internal/PluginsManager.hpp
src/ConnectionPainter.hpp
src/DefaultHorizontalNodeGeometry.hpp
src/DefaultVerticalNodeGeometry.hpp
Expand Down
4 changes: 4 additions & 0 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,7 @@ add_subdirectory(dynamic_ports)

add_subdirectory(lock_nodes_and_connections)

add_subdirectory(plugin_text)

add_subdirectory(plugins_load)

18 changes: 18 additions & 0 deletions examples/plugin_text/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
file(GLOB_RECURSE CPPS ./*.cpp)
file(GLOB_RECURSE HPPS ./*.hpp)

foreach(OUTPUT_TYPES ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER ${OUTPUT_TYPES} OUTPUT_CONFIG)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUT_CONFIG}}/plugins)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUT_CONFIG}}/plugins)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG}}/plugins)
# message(STATUS "CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG} : ${CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUT_CONFIG}}")
endforeach(OUTPUT_TYPES CMAKE_CONFIGURATION_TYPES)

add_library(plugin_text SHARED ${CPPS} ${HPPS})

target_link_libraries(plugin_text QtNodes)

target_compile_definitions(plugin_text PUBLIC NODE_EDITOR_SHARED)

set_target_properties(plugin_text PROPERTIES SUFFIX ".node")
22 changes: 22 additions & 0 deletions examples/plugin_text/PluginDefinition.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#include "PluginDefinition.hpp"

#include "TextModel.hpp"

Plugin *Plugin::_this_plugin = nullptr;

Plugin::Plugin()
{
_this_plugin = this;
}

Plugin::~Plugin()
{
// TODO: Unregister all models here
}

void Plugin::registerDataModels(std::shared_ptr<QtNodes::NodeDelegateModelRegistry> &reg)
{
assert(reg);

reg->registerModel<TextModel>();
}
34 changes: 34 additions & 0 deletions examples/plugin_text/PluginDefinition.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
#pragma once

#include <QObject>
#include <QtNodes/NodeDelegateModelRegistry>
#include <QtNodes/PluginInterface>

// This needs to be the same as the name of your project file ${PROJECT_NAME}
#ifdef plugin_text_EXPORTS
#define DLL_EXPORT Q_DECL_EXPORT
#else
#define DLL_EXPORT Q_DECL_IMPORT
#endif

#define PLUGIN_NAME "Text"

class DLL_EXPORT Plugin
: public QObject
, public QtNodes::PluginInterface
{
Q_OBJECT
Q_INTERFACES(QtNodes::PluginInterface)
Q_PLUGIN_METADATA(IID PLUGIN_NAME)

public:
Plugin();
~Plugin();

QString name() const override { return PLUGIN_NAME; };

void registerDataModels(std::shared_ptr<QtNodes::NodeDelegateModelRegistry> &reg) override;

private:
static Plugin *_this_plugin;
};
25 changes: 25 additions & 0 deletions examples/plugin_text/TextData.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#pragma once

#include <QtNodes/NodeData>

using QtNodes::NodeData;
using QtNodes::NodeDataType;

/// The class can potentially incapsulate any user data which
/// need to be transferred within the Node Editor graph
class TextData : public NodeData
{
public:
TextData() {}

TextData(QString const &text)
: _text(text)
{}

NodeDataType type() const override { return NodeDataType{"text", "Text"}; }

QString text() const { return _text; }

private:
QString _text;
};
69 changes: 69 additions & 0 deletions examples/plugin_text/TextModel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
#include "TextModel.hpp"

#include <QtWidgets/QTextEdit>

TextModel::TextModel()
{
//
}

unsigned int TextModel::nPorts(PortType portType) const
{
unsigned int result = 1;

switch (portType) {
case PortType::In:
result = 1;
break;

case PortType::Out:
result = 1;

default:
break;
}

return result;
}

void TextModel::onTextEdited()
{
Q_EMIT dataUpdated(0);
}

NodeDataType TextModel::dataType(PortType, PortIndex) const
{
return TextData().type();
}

std::shared_ptr<NodeData> TextModel::outData(PortIndex const portIndex)
{
Q_UNUSED(portIndex);
return std::make_shared<TextData>(_textEdit->toPlainText());
}

QWidget *TextModel::embeddedWidget()
{
if (!_textEdit) {
_textEdit = new QTextEdit();

connect(_textEdit, &QTextEdit::textChanged, this, &TextModel::onTextEdited);
}

return _textEdit;
}

void TextModel::setInData(std::shared_ptr<NodeData> data, PortIndex const)
{
auto textData = std::dynamic_pointer_cast<TextData>(data);

QString inputText;

if (textData) {
inputText = textData->text();
} else {
inputText = "";
}

_textEdit->setText(inputText);
}
55 changes: 55 additions & 0 deletions examples/plugin_text/TextModel.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#pragma once

#include <QtCore/QObject>

#include "TextData.hpp"

#include <QtNodes/NodeDelegateModel>

#include <iostream>

using QtNodes::NodeData;
using QtNodes::NodeDelegateModel;
using QtNodes::PortIndex;
using QtNodes::PortType;

class QTextEdit;

/// The model dictates the number of inputs and outputs for the Node.
/// In this example it has no logic.
class TextModel : public NodeDelegateModel
{
Q_OBJECT

public:
TextModel();

public:
QString caption() const override { return QString("Text"); }

bool captionVisible() const override { return true; }

static QString Name() { return QString("Text"); }

QString name() const override { return TextModel::Name(); }

public:
unsigned int nPorts(PortType portType) const override;

NodeDataType dataType(PortType portType, PortIndex portIndex) const override;

std::shared_ptr<NodeData> outData(PortIndex const portIndex) override;

void setInData(std::shared_ptr<NodeData>, PortIndex const) override;

QWidget *embeddedWidget() override;

bool resizable() const override { return true; }

private Q_SLOTS:

void onTextEdited();

private:
QTextEdit *_textEdit = nullptr;
};
6 changes: 6 additions & 0 deletions examples/plugins_load/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
file(GLOB_RECURSE CPPS ./*.cpp)
file(GLOB_RECURSE HPPS ./*.hpp)

add_executable(plugins_load ${CPPS} ${HPPS})

target_link_libraries(plugins_load QtNodes)
Loading

0 comments on commit 15260c5

Please sign in to comment.