/***
Olive - Non-Linear Video Editor
Copyright (C) 2022 Olive Team
Modifications Copyright (C) 2026 Oak Team
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
***/
#include "engineeventbridge.h"
#include
#include "oakengine/node.h"
namespace olive
{
EngineEventBridge::EngineEventBridge(QObject *parent) : QObject(parent) {}
EngineEventBridge::~EngineEventBridge()
{
foreach (int64_t id, subscriptions_) {
oakengine_event_unsubscribe(id);
}
}
int64_t EngineEventBridge::subscribe(void *handle, int32_t event_id)
{
const int64_t id =
oakengine_event_subscribe(handle, event_id, &on_engine_event, this);
if (id > 0) {
subscriptions_.append(id);
}
return id;
}
void EngineEventBridge::unsubscribe(int64_t id)
{
if (oakengine_event_unsubscribe(id) == OAKENGINE_OK) {
subscriptions_.removeAll(id);
}
}
void EngineEventBridge::unsubscribe_all()
{
foreach (int64_t id, subscriptions_) {
oakengine_event_unsubscribe(id);
}
subscriptions_.clear();
}
void EngineEventBridge::on_engine_event(const oakengine_event *event,
void *userdata)
{
static_cast(userdata)->dispatch(event);
}
void EngineEventBridge::dispatch(const oakengine_event *event)
{
switch (event->id) {
case OAKENGINE_EVENT_PROJECT_MODIFIED_CHANGED:
emit project_modified_changed(event->a != 0);
break;
case OAKENGINE_EVENT_PROJECT_NAME_CHANGED:
emit project_name_changed();
break;
case OAKENGINE_EVENT_FOLDER_BEGIN_INSERT_ITEM:
emit folder_begin_insert_item(
static_cast(event->source),
static_cast(event->handle), int(event->a));
break;
case OAKENGINE_EVENT_FOLDER_END_INSERT_ITEM:
emit folder_end_insert_item(static_cast(event->source));
break;
case OAKENGINE_EVENT_FOLDER_BEGIN_REMOVE_ITEM:
emit folder_begin_remove_item(
static_cast(event->source),
static_cast(event->handle), int(event->a));
break;
case OAKENGINE_EVENT_FOLDER_END_REMOVE_ITEM:
emit folder_end_remove_item(static_cast(event->source));
break;
case OAKENGINE_EVENT_SEQUENCE_TRACK_ADDED:
emit sequence_track_added(static_cast(event->handle),
int(event->a));
break;
case OAKENGINE_EVENT_SEQUENCE_TRACK_REMOVED:
emit sequence_track_removed(
static_cast(event->handle), int(event->a));
break;
case OAKENGINE_EVENT_SEQUENCE_TRACK_LIST_CHANGED:
emit sequence_track_list_changed(
static_cast(event->source), int(event->a));
break;
case OAKENGINE_EVENT_SEQUENCE_TRACK_HEIGHT_CHANGED:
emit sequence_track_height_changed(
static_cast(event->source),
static_cast(event->handle), int(event->a),
int(event->b));
break;
case OAKENGINE_EVENT_SEQUENCE_SUBTITLES_CHANGED:
emit sequence_subtitles_changed(
static_cast(event->source), event->a,
event->b);
break;
case OAKENGINE_EVENT_TRACK_INDEX_CHANGED:
emit track_index_changed(static_cast(event->source),
int(event->a), int(event->b));
break;
case OAKENGINE_EVENT_TRACK_HEIGHT_CHANGED: {
double h;
memcpy(&h, &event->a, sizeof(h));
emit track_height_changed(static_cast(event->source),
h);
break;
}
case OAKENGINE_EVENT_TRACK_BLOCKS_REFRESHED:
emit track_blocks_refreshed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_TRACK_MUTED_CHANGED:
emit track_muted_changed(static_cast(event->source),
event->a != 0);
break;
case OAKENGINE_EVENT_BLOCK_ENABLED_CHANGED:
emit block_enabled_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_BLOCK_PREVIEW_CHANGED:
emit block_preview_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_MARKER_LIST_MARKER_ADDED:
emit marker_list_marker_added(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_MARKER_LIST_MARKER_REMOVED:
emit marker_list_marker_removed(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_MARKER_LIST_MARKER_MODIFIED:
emit marker_list_marker_modified(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_WORKAREA_RANGE_CHANGED:
emit workarea_range_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_WORKAREA_ENABLED_CHANGED:
emit workarea_enabled_changed(
static_cast(event->source), event->a != 0);
break;
case OAKENGINE_EVENT_TRACK_BLOCK_ADDED:
emit track_block_added(static_cast(event->handle),
event->a, event->b);
break;
case OAKENGINE_EVENT_TRACK_BLOCK_REMOVED:
emit track_block_removed(static_cast(event->handle),
event->a, event->b);
break;
case OAKENGINE_EVENT_SEQUENCE_MARKER_ADDED:
emit sequence_marker_added(event->a);
break;
case OAKENGINE_EVENT_SEQUENCE_MARKER_REMOVED:
emit sequence_marker_removed(event->a);
break;
case OAKENGINE_EVENT_SEQUENCE_MARKER_MODIFIED:
emit sequence_marker_modified(event->a);
break;
case OAKENGINE_EVENT_SEQUENCE_WORKAREA_RANGE_CHANGED:
emit sequence_workarea_range_changed(event->a, event->b);
break;
case OAKENGINE_EVENT_SEQUENCE_WORKAREA_ENABLED_CHANGED:
emit sequence_workarea_enabled_changed(event->a != 0);
break;
case OAKENGINE_EVENT_NODE_LABEL_CHANGED:
emit node_label_changed(static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""));
break;
case OAKENGINE_EVENT_NODE_INPUT_VALUE_CHANGED:
emit node_input_value_changed(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""), int(event->a),
event->b, event->c);
break;
case OAKENGINE_EVENT_NODE_INPUT_CONNECTED:
emit node_input_connected(
static_cast(event->source),
static_cast(event->handle),
QString::fromUtf8(event->s ? event->s : ""), int(event->a));
break;
case OAKENGINE_EVENT_NODE_INPUT_DISCONNECTED:
emit node_input_disconnected(
static_cast(event->source),
static_cast(event->handle),
QString::fromUtf8(event->s ? event->s : ""), int(event->a));
break;
case OAKENGINE_EVENT_NODE_INPUT_FLAGS_CHANGED:
emit node_input_flags_changed(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""), event->a);
break;
case OAKENGINE_EVENT_NODE_INPUT_PROPERTY_CHANGED:
emit node_input_property_changed(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""));
break;
case OAKENGINE_EVENT_NODE_INPUT_DATA_TYPE_CHANGED:
emit node_input_data_type_changed(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""), int(event->a));
break;
case OAKENGINE_EVENT_NODE_INPUT_ARRAY_SIZE_CHANGED:
emit node_input_array_size_changed(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""), int(event->a),
int(event->b));
break;
case OAKENGINE_EVENT_NODE_KEYFRAME_ENABLE_CHANGED:
emit node_keyframe_enable_changed(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""), int(event->a),
event->b != 0);
break;
case OAKENGINE_EVENT_NODE_KEYFRAME_ADDED:
emit node_keyframe_added(
static_cast(event->source),
static_cast(event->handle),
QString::fromUtf8(event->s ? event->s : ""), int(event->a),
int(event->b));
break;
case OAKENGINE_EVENT_NODE_KEYFRAME_REMOVED:
emit node_keyframe_removed(
static_cast(event->source),
static_cast(event->handle),
QString::fromUtf8(event->s ? event->s : ""), int(event->a),
int(event->b));
break;
case OAKENGINE_EVENT_NODE_KEYFRAME_TIME_CHANGED:
emit node_keyframe_time_changed(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_NODE_KEYFRAME_TYPE_CHANGED:
emit node_keyframe_type_changed(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_NODE_KEYFRAME_VALUE_CHANGED:
emit node_keyframe_value_changed(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_NODE_NODE_ADDED_TO_CONTEXT:
emit node_node_added_to_context(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_NODE_NODE_REMOVED_FROM_CONTEXT:
emit node_node_removed_from_context(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_NODE_MESSAGE_COUNT_CHANGED:
emit node_message_count_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_NODE_LINKS_CHANGED:
emit node_links_changed(static_cast(event->source));
break;
case OAKENGINE_EVENT_NODE_COLOR_CHANGED:
emit node_color_changed(static_cast(event->source));
break;
case OAKENGINE_EVENT_NODE_INPUT_ADDED:
emit node_input_added(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""));
break;
case OAKENGINE_EVENT_NODE_INPUT_REMOVED:
emit node_input_removed(
static_cast(event->source),
QString::fromUtf8(event->s ? event->s : ""));
break;
case OAKENGINE_EVENT_NODE_REMOVED_FROM_GRAPH:
emit node_removed_from_graph(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_GROUP_INPUT_PASSTHROUGH_ADDED:
emit group_input_passthrough_added(
static_cast(event->source),
static_cast(event->handle),
QString::fromUtf8(event->s ? event->s : ""),
static_cast(event->a));
break;
case OAKENGINE_EVENT_GROUP_INPUT_PASSTHROUGH_REMOVED:
emit group_input_passthrough_removed(
static_cast(event->source),
static_cast(event->handle),
QString::fromUtf8(event->s ? event->s : ""),
static_cast(event->a));
break;
case OAKENGINE_EVENT_GROUP_OUTPUT_PASSTHROUGH_CHANGED:
emit group_output_passthrough_changed(
static_cast(event->source),
static_cast(event->handle));
break;
case OAKENGINE_EVENT_NODE_CONTEXT_POSITION_CHANGED: {
double x, y;
memcpy(&x, &event->a, sizeof(x));
memcpy(&y, &event->b, sizeof(y));
emit node_context_position_changed(
static_cast(event->source),
static_cast(event->handle), x, y);
break;
}
case OAKENGINE_EVENT_VIEWER_LENGTH_CHANGED:
emit viewer_length_changed(static_cast(event->source),
event->a, event->b);
break;
case OAKENGINE_EVENT_VIEWER_PLAYHEAD_CHANGED:
emit viewer_playhead_changed(
static_cast(event->source), event->a, event->b);
break;
case OAKENGINE_EVENT_VIEWER_FRAME_RATE_CHANGED:
emit viewer_frame_rate_changed(
static_cast(event->source), event->a, event->b);
break;
case OAKENGINE_EVENT_VIEWER_SIZE_CHANGED:
emit viewer_size_changed(static_cast(event->source),
int(event->a), int(event->b));
break;
case OAKENGINE_EVENT_VIEWER_PIXEL_ASPECT_CHANGED:
emit viewer_pixel_aspect_changed(
static_cast(event->source), event->a, event->b);
break;
case OAKENGINE_EVENT_VIEWER_INTERLACING_CHANGED:
emit viewer_interlacing_changed(
static_cast(event->source), int(event->a));
break;
case OAKENGINE_EVENT_VIEWER_VIDEO_PARAMS_CHANGED:
emit viewer_video_params_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_VIEWER_AUDIO_PARAMS_CHANGED:
emit viewer_audio_params_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_VIEWER_TEXTURE_INPUT_CHANGED:
emit viewer_texture_input_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_VIEWER_SAMPLE_RATE_CHANGED:
emit viewer_sample_rate_changed(
static_cast(event->source), int(event->a));
break;
case OAKENGINE_EVENT_VIEWER_CONNECTED_WAVEFORM_CHANGED:
emit viewer_connected_waveform_changed(
static_cast(event->source));
break;
case OAKENGINE_EVENT_TASK_MANAGER_TASK_ADDED:
emit task_manager_task_added(
static_cast(event->handle),
QString::fromUtf8(event->s ? event->s : ""));
break;
case OAKENGINE_EVENT_TASK_MANAGER_TASK_REMOVED:
emit task_manager_task_removed(
static_cast(event->handle));
break;
case OAKENGINE_EVENT_TASK_MANAGER_TASK_FAILED:
emit task_manager_task_failed(
static_cast(event->handle));
break;
case OAKENGINE_EVENT_TASK_MANAGER_LIST_CHANGED:
emit task_manager_list_changed();
break;
case OAKENGINE_EVENT_TASK_STARTED:
emit task_started(static_cast(event->source),
event->a);
break;
case OAKENGINE_EVENT_TASK_PROGRESS: {
double d;
memcpy(&d, &event->a, sizeof(d));
emit task_progress(static_cast(event->source), d);
break;
}
case OAKENGINE_EVENT_TASK_FINISHED:
emit task_finished(static_cast(event->source),
event->a != 0);
break;
case OAKENGINE_EVENT_UNDO_INDEX_CHANGED:
emit undo_index_changed(int(event->a));
break;
case OAKENGINE_EVENT_AUDIO_MANAGER_OUTPUT_PARAMS_CHANGED:
emit audio_output_params_changed();
break;
case OAKENGINE_EVENT_PLAYBACK_CACHE_INVALIDATED:
emit playback_cache_invalidated(event->source, event->a, event->b);
break;
case OAKENGINE_EVENT_PLAYBACK_CACHE_VALIDATED:
emit playback_cache_validated(event->source, event->a, event->b);
break;
case OAKENGINE_EVENT_FRAME_CACHE_INVALIDATED:
emit frame_cache_invalidated(event->source, event->a, event->b);
break;
default:
break;
}
}
}