From e772196c07ff58022beaabf5e494be3441d1ba4a Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 10 Sep 2006 20:11:40 +0000 Subject: Zoom Full feature in FlowCanvas/Ingenuity. Fix for reattaching to running engine (reponse ID bug). More GUI work. git-svn-id: http://svn.drobilla.net/lad/ingen@126 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/engine/OSCEngineReceiver.cpp | 7 +++++-- src/libs/engine/QueuedEngineInterface.cpp | 2 +- src/libs/engine/QueuedEvent.h | 5 ++++- src/libs/engine/events/ClearPatchEvent.cpp | 4 ++-- src/libs/engine/events/ClearPatchEvent.h | 2 +- src/libs/engine/events/DestroyEvent.cpp | 8 ++++---- src/libs/engine/events/DestroyEvent.h | 4 ++-- src/progs/ingenuity/LoadPluginWindow.cpp | 28 ++++++++++++++++++++++++++-- src/progs/ingenuity/LoadPluginWindow.h | 1 + src/progs/ingenuity/PatchController.cpp | 16 ++++++---------- src/progs/ingenuity/PatchView.cpp | 17 ++++++++++++----- src/progs/ingenuity/PatchView.h | 2 ++ 12 files changed, 66 insertions(+), 30 deletions(-) diff --git a/src/libs/engine/OSCEngineReceiver.cpp b/src/libs/engine/OSCEngineReceiver.cpp index 84c9f0fe..ad985b7e 100644 --- a/src/libs/engine/OSCEngineReceiver.cpp +++ b/src/libs/engine/OSCEngineReceiver.cpp @@ -66,7 +66,7 @@ OSCEngineReceiver::OSCEngineReceiver(CountedPtr engine, size_t queue_siz } // For debugging, print all incoming OSC messages - //lo_server_add_method(_server, NULL, NULL, generic_cb, NULL); + lo_server_add_method(_server, NULL, NULL, generic_cb, NULL); // Set response address for this message. // It's important this is first and returns nonzero. @@ -222,7 +222,7 @@ OSCEngineReceiver::set_response_address_cb(const char* path, const char* types, //cerr << "** osc responder\n"; if (!strcmp(url, me->_osc_responder->url())) { - // Nice one, same address + // Nice one, same address, do nothing (just set the ID below) //cerr << "** Using cached response address, hooray" << endl; } else { // Shitty deal, make a new one @@ -231,6 +231,7 @@ OSCEngineReceiver::set_response_address_cb(const char* path, const char* types, new OSCResponder(me->_engine->broadcaster(), id, url)); me->set_responder(me->_osc_responder); + // (responder takes ownership of url, no leak) } @@ -241,6 +242,8 @@ OSCEngineReceiver::set_response_address_cb(const char* path, const char* types, me->set_responder(me->_osc_responder); //cerr << "** Setting response address to " << url << "(2)" << endl; } + + me->set_next_response_id(id); // Don't respond } else { diff --git a/src/libs/engine/QueuedEngineInterface.cpp b/src/libs/engine/QueuedEngineInterface.cpp index d56b8de1..35e1c99a 100644 --- a/src/libs/engine/QueuedEngineInterface.cpp +++ b/src/libs/engine/QueuedEngineInterface.cpp @@ -189,7 +189,7 @@ QueuedEngineInterface::destroy(const string& path) void QueuedEngineInterface::clear_patch(const string& patch_path) { - push_queued(new ClearPatchEvent(*_engine.get(), _responder, now(), patch_path)); + push_queued(new ClearPatchEvent(*_engine.get(), _responder, now(), this, patch_path)); } diff --git a/src/libs/engine/QueuedEvent.h b/src/libs/engine/QueuedEvent.h index 388630e7..733ebd38 100644 --- a/src/libs/engine/QueuedEvent.h +++ b/src/libs/engine/QueuedEvent.h @@ -80,7 +80,10 @@ protected: QueuedEventSource* source = NULL) : Event(engine, responder, time) , _pre_processed(false), _blocking(blocking), _source(source) - {} + { + if (blocking) + assert(_source); + } // NULL event base (for internal events only!) QueuedEvent(Engine& engine) diff --git a/src/libs/engine/events/ClearPatchEvent.cpp b/src/libs/engine/events/ClearPatchEvent.cpp index b8f31243..5023e89e 100644 --- a/src/libs/engine/events/ClearPatchEvent.cpp +++ b/src/libs/engine/events/ClearPatchEvent.cpp @@ -30,8 +30,8 @@ namespace Ingen { -ClearPatchEvent::ClearPatchEvent(Engine& engine, CountedPtr responder, SampleCount timestamp, const string& patch_path) -: QueuedEvent(engine, responder, true), +ClearPatchEvent::ClearPatchEvent(Engine& engine, CountedPtr responder, FrameTime time, QueuedEventSource* source, const string& patch_path) +: QueuedEvent(engine, responder, time, true, source), m_patch_path(patch_path), m_patch(NULL), m_process(false) diff --git a/src/libs/engine/events/ClearPatchEvent.h b/src/libs/engine/events/ClearPatchEvent.h index 0eb9b495..234b8a51 100644 --- a/src/libs/engine/events/ClearPatchEvent.h +++ b/src/libs/engine/events/ClearPatchEvent.h @@ -35,7 +35,7 @@ class Patch; class ClearPatchEvent : public QueuedEvent { public: - ClearPatchEvent(Engine& engine, CountedPtr responder, SampleCount timestamp, const string& patch_path); + ClearPatchEvent(Engine& engine, CountedPtr responder, FrameTime time, QueuedEventSource* source, const string& patch_path); void pre_process(); void execute(SampleCount nframes, FrameTime start, FrameTime end); diff --git a/src/libs/engine/events/DestroyEvent.cpp b/src/libs/engine/events/DestroyEvent.cpp index ced323a1..bdf5f679 100644 --- a/src/libs/engine/events/DestroyEvent.cpp +++ b/src/libs/engine/events/DestroyEvent.cpp @@ -34,8 +34,8 @@ namespace Ingen { -DestroyEvent::DestroyEvent(Engine& engine, CountedPtr responder, FrameTime time, QueuedEventSource* source, const string& path, bool lock_mutex) -: QueuedEvent(engine, responder, time, true, source), +DestroyEvent::DestroyEvent(Engine& engine, CountedPtr responder, FrameTime time, QueuedEventSource* source, const string& path, bool block) +: QueuedEvent(engine, responder, time, source, source), m_path(path), m_node(NULL), m_patch_listnode(NULL), @@ -47,8 +47,8 @@ DestroyEvent::DestroyEvent(Engine& engine, CountedPtr responder, Fram } -DestroyEvent::DestroyEvent(Engine& engine, CountedPtr responder, SampleCount timestamp, Node* node, bool lock_mutex) -: QueuedEvent(engine, responder, true), +DestroyEvent::DestroyEvent(Engine& engine, CountedPtr responder, FrameTime time, QueuedEventSource* source, Node* node, bool block) +: QueuedEvent(engine, responder, block, source), m_path(node->path()), m_node(node), m_patch_listnode(NULL), diff --git a/src/libs/engine/events/DestroyEvent.h b/src/libs/engine/events/DestroyEvent.h index 92b1c194..fc2995a3 100644 --- a/src/libs/engine/events/DestroyEvent.h +++ b/src/libs/engine/events/DestroyEvent.h @@ -44,8 +44,8 @@ class DisconnectPortEvent; class DestroyEvent : public QueuedEvent { public: - DestroyEvent(Engine& engine, CountedPtr responder, FrameTime timestamp, QueuedEventSource* source, const string& path, bool lock_mutex = true); - DestroyEvent(Engine& engine, CountedPtr responder, FrameTime timestamp, Node* node, bool lock_mutex = true); + DestroyEvent(Engine& engine, CountedPtr responder, FrameTime timestamp, QueuedEventSource* source, const string& path, bool block = true); + DestroyEvent(Engine& engine, CountedPtr responder, FrameTime timestamp, QueuedEventSource* source, Node* node, bool block = true); ~DestroyEvent(); void pre_process(); diff --git a/src/progs/ingenuity/LoadPluginWindow.cpp b/src/progs/ingenuity/LoadPluginWindow.cpp index b6c2ca67..4b4290c4 100644 --- a/src/progs/ingenuity/LoadPluginWindow.cpp +++ b/src/progs/ingenuity/LoadPluginWindow.cpp @@ -47,7 +47,7 @@ LoadPluginWindow::LoadPluginWindow(BaseObjectType* cobject, const Glib::RefPtrget_widget("load_plugin_clear_button", m_clear_button); xml->get_widget("load_plugin_add_button", m_add_button); xml->get_widget("load_plugin_close_button", m_close_button); - //xml->get_widget("load_plugin_ok_button", m_ok_button); + //xml->get_widget("load_plugin_ok_button", m_add_button); xml->get_widget("load_plugin_filter_combo", m_filter_combo); xml->get_widget("load_plugin_search_entry", m_search_entry); @@ -94,10 +94,11 @@ LoadPluginWindow::LoadPluginWindow(BaseObjectType* cobject, const Glib::RefPtrsignal_clicked().connect( sigc::mem_fun(this, &LoadPluginWindow::clear_clicked)); m_add_button->signal_clicked().connect( sigc::mem_fun(this, &LoadPluginWindow::add_clicked)); m_close_button->signal_clicked().connect( sigc::mem_fun(this, &LoadPluginWindow::close_clicked)); - //m_ok_button->signal_clicked().connect( sigc::mem_fun(this, &LoadPluginWindow::ok_clicked)); + //m_add_button->signal_clicked().connect( sigc::mem_fun(this, &LoadPluginWindow::ok_clicked)); m_plugins_treeview->signal_row_activated().connect(sigc::mem_fun(this, &LoadPluginWindow::plugin_activated)); m_search_entry->signal_activate().connect( sigc::mem_fun(this, &LoadPluginWindow::add_clicked)); m_search_entry->signal_changed().connect( sigc::mem_fun(this, &LoadPluginWindow::filter_changed)); + m_node_name_entry->signal_changed().connect( sigc::mem_fun(this, &LoadPluginWindow::name_changed)); m_selection = m_plugins_treeview->get_selection(); m_selection->signal_changed().connect(sigc::mem_fun(this, &LoadPluginWindow::plugin_selection_changed)); @@ -106,6 +107,29 @@ LoadPluginWindow::LoadPluginWindow(BaseObjectType* cobject, const Glib::RefPtrget_text(); + if (!Path::is_valid_name(name)) { + //m_message_label->set_text("Name contains invalid characters."); + m_add_button->property_sensitive() = false; + } else if (m_patch_controller->patch_model()->get_node(name)) { + //m_message_label->set_text("An object already exists with that name."); + m_add_button->property_sensitive() = false; + } else if (name.length() == 0) { + //m_message_label->set_text(""); + m_add_button->property_sensitive() = false; + } else { + //m_message_label->set_text(""); + m_add_button->property_sensitive() = true; + } +} + + /** Sets the patch controller for this window and initializes everything. * * This function MUST be called before using the window in any way! diff --git a/src/progs/ingenuity/LoadPluginWindow.h b/src/progs/ingenuity/LoadPluginWindow.h index 00035b13..9d875358 100644 --- a/src/progs/ingenuity/LoadPluginWindow.h +++ b/src/progs/ingenuity/LoadPluginWindow.h @@ -107,6 +107,7 @@ private: //void ok_clicked(); void filter_changed(); void clear_clicked(); + void name_changed(); void plugin_activated(const Gtk::TreeModel::Path& path, Gtk::TreeViewColumn* col); void plugin_selection_changed(); diff --git a/src/progs/ingenuity/PatchController.cpp b/src/progs/ingenuity/PatchController.cpp index 84c6eb7b..6ef90d32 100644 --- a/src/progs/ingenuity/PatchController.cpp +++ b/src/progs/ingenuity/PatchController.cpp @@ -423,9 +423,9 @@ PatchController::add_node(CountedPtr object) node->y(y); // Set zoom to 1.0 so module isn't messed up (Death to GnomeCanvas) - float old_zoom = m_patch_view->canvas()->zoom(); + float old_zoom = m_patch_view->canvas()->get_zoom(); if (old_zoom != 1.0) - m_patch_view->canvas()->zoom(1.0); + m_patch_view->canvas()->set_zoom(1.0); nc->create_module(m_patch_view->canvas()); assert(nc->module()); @@ -433,7 +433,7 @@ PatchController::add_node(CountedPtr object) // Reset zoom if (old_zoom != 1.0) { - m_patch_view->canvas()->zoom(old_zoom); + m_patch_view->canvas()->set_zoom(old_zoom); nc->module()->zoom(old_zoom); } } @@ -496,17 +496,13 @@ PatchController::add_port(CountedPtr pm) if (m_patch_view != NULL) { // Set zoom to 1.0 so module isn't messed up (Death to GnomeCanvas) - float old_zoom = m_patch_view->canvas()->zoom(); - if (old_zoom != 1.0) - m_patch_view->canvas()->zoom(1.0); + float old_zoom = m_patch_view->canvas()->get_zoom(); + m_patch_view->canvas()->set_zoom(1.0); pc->create_module(m_patch_view->canvas()); // Reset zoom - if (old_zoom != 1.0) { - m_patch_view->canvas()->zoom(old_zoom); - pc->module()->zoom(old_zoom); - } + pc->module()->zoom(old_zoom); } if (m_control_window != NULL) { diff --git a/src/progs/ingenuity/PatchView.cpp b/src/progs/ingenuity/PatchView.cpp index eb1fc1ce..bce44369 100644 --- a/src/progs/ingenuity/PatchView.cpp +++ b/src/progs/ingenuity/PatchView.cpp @@ -42,12 +42,16 @@ PatchView::PatchView(BaseObjectType* cobject, const Glib::RefPtrget_widget("patch_view_scrolledwindow", _canvas_scrolledwindow); + xml->get_widget("patch_view_breadcrumb_container", _breadcrumb_container); + xml->get_widget("patch_view_process_but", _process_but); + xml->get_widget("patch_view_poly_spin", _poly_spin); + xml->get_widget("patch_view_clear_but", _clear_but); + xml->get_widget("patch_view_destroy_but", _destroy_but); + xml->get_widget("patch_view_refresh_but", _refresh_but); + xml->get_widget("patch_view_save_but", _save_but); xml->get_widget("patch_view_zoom_full_but", _zoom_full_but); xml->get_widget("patch_view_zoom_normal_but", _zoom_normal_but); - xml->get_widget("patch_view_poly_spin", _poly_spin); - xml->get_widget("patch_view_process_but", _process_but); - xml->get_widget("patch_view_breadcrumb_container", _breadcrumb_container); + xml->get_widget("patch_view_scrolledwindow", _canvas_scrolledwindow); _process_but->signal_toggled().connect(sigc::mem_fun(this, &PatchView::process_toggled)); } @@ -64,7 +68,7 @@ PatchView::patch_controller(PatchController* pc) _patch = pc; _canvas = new OmFlowCanvas(pc, 1600*2, 1200*2); - + _canvas_scrolledwindow->add(*_canvas); //_canvas->show(); //_canvas_scrolledwindow->show(); @@ -75,6 +79,9 @@ PatchView::patch_controller(PatchController* pc) pc->patch_model()->enabled_sig.connect(sigc::mem_fun(this, &PatchView::enable)); pc->patch_model()->disabled_sig.connect(sigc::mem_fun(this, &PatchView::disable)); + + _zoom_normal_but->signal_clicked().connect(sigc::bind(sigc::mem_fun(static_cast(_canvas), &FlowCanvas::set_zoom), 1.0)); + _zoom_full_but->signal_clicked().connect(sigc::mem_fun(static_cast(_canvas), &FlowCanvas::zoom_full)); } diff --git a/src/progs/ingenuity/PatchView.h b/src/progs/ingenuity/PatchView.h index 7f91f6cf..3c507b94 100644 --- a/src/progs/ingenuity/PatchView.h +++ b/src/progs/ingenuity/PatchView.h @@ -68,6 +68,8 @@ public: void enable(); void disable(); + void zoom_full(); + private: PatchController* _patch; OmFlowCanvas* _canvas; -- cgit v1.2.1