diff options
author | David Robillard <d@drobilla.net> | 2007-09-19 02:46:47 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-09-19 02:46:47 +0000 |
commit | 49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14 (patch) | |
tree | 4b56e8fe9f01b42e269e5423347a7cc0664599ad | |
parent | cbc7847a12e57176c5bafa9baa007de6865745c7 (diff) | |
download | ingen-49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14.tar.gz ingen-49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14.tar.bz2 ingen-49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14.zip |
More work on dynamic polyphony.
git-svn-id: http://svn.drobilla.net/lad/ingen@721 a436a847-0d15-0410-975c-d299462d15a1
29 files changed, 718 insertions, 544 deletions
diff --git a/src/common/interface/EngineInterface.hpp b/src/common/interface/EngineInterface.hpp index 192357a7..3d28bbd2 100644 --- a/src/common/interface/EngineInterface.hpp +++ b/src/common/interface/EngineInterface.hpp @@ -80,6 +80,10 @@ public: virtual void destroy(const string& path) = 0; virtual void clear_patch(const string& patch_path) = 0; + + virtual void set_polyphony(const string& patch_path, uint32_t poly) = 0; + + virtual void set_polyphonic(const string& path, bool poly) = 0; virtual void enable_patch(const string& patch_path) = 0; diff --git a/src/libs/client/OSCClientReceiver.cpp b/src/libs/client/OSCClientReceiver.cpp index 0479cea9..de51ad22 100644 --- a/src/libs/client/OSCClientReceiver.cpp +++ b/src/libs/client/OSCClientReceiver.cpp @@ -32,6 +32,7 @@ namespace Client { OSCClientReceiver::OSCClientReceiver(int listen_port) : ClientInterface("localhost"), + _listen_port(listen_port), _st(NULL)//, // _receiving_node(false), // _receiving_node_model(NULL), diff --git a/src/libs/client/OSCEngineSender.cpp b/src/libs/client/OSCEngineSender.cpp index 76b094a0..89939b6b 100644 --- a/src/libs/client/OSCEngineSender.cpp +++ b/src/libs/client/OSCEngineSender.cpp @@ -253,6 +253,33 @@ OSCEngineSender::clear_patch(const string& patch_path) patch_path.c_str()); } + +void +OSCEngineSender::set_polyphony(const string& patch_path, uint32_t poly) +{ + assert(_engine_addr); + lo_send(_engine_addr, "/ingen/set_polyphony", "isi", + next_id(), + patch_path.c_str(), + poly); +} + + +void +OSCEngineSender::set_polyphonic(const string& path, bool poly) +{ + assert(_engine_addr); + if (poly) { + lo_send(_engine_addr, "/ingen/set_polyphony", "isT", + next_id(), + path.c_str()); + } else { + lo_send(_engine_addr, "/ingen/set_polyphony", "isF", + next_id(), + path.c_str()); + } +} + void OSCEngineSender::enable_patch(const string& patch_path) diff --git a/src/libs/client/OSCEngineSender.hpp b/src/libs/client/OSCEngineSender.hpp index fc3c100d..c3a9b46a 100644 --- a/src/libs/client/OSCEngineSender.hpp +++ b/src/libs/client/OSCEngineSender.hpp @@ -94,6 +94,10 @@ public: void destroy(const string& path); void clear_patch(const string& patch_path); + + void set_polyphony(const string& patch_path, uint32_t poly); + + void set_polyphonic(const string& path, bool poly); void enable_patch(const string& patch_path); diff --git a/src/libs/engine/LV2Node.cpp b/src/libs/engine/LV2Node.cpp index 36bfd319..8e2e9b81 100644 --- a/src/libs/engine/LV2Node.cpp +++ b/src/libs/engine/LV2Node.cpp @@ -15,12 +15,13 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "LV2Node.hpp" +#include <raul/Maid.hpp> #include <iostream> #include <cassert> #include <float.h> #include <stdint.h> #include <cmath> +#include "LV2Node.hpp" #include "InputPort.hpp" #include "OutputPort.hpp" #include "Plugin.hpp" @@ -50,17 +51,44 @@ LV2Node::LV2Node(const Plugin* plugin, } -void +bool LV2Node::prepare_poly(uint32_t poly) { NodeBase::prepare_poly(poly); + + if (poly <= _prepared_poly) + return true; + + _prepared_poly = poly; + _prepared_instances = new Raul::Array<SLV2Instance>(_prepared_poly, *_instances); + for (uint32_t i=_poly; i < _prepared_poly; ++i) { + _prepared_instances->at(i) = slv2_plugin_instantiate(_lv2_plugin, _srate, NULL); + if ((*_instances)[i] == NULL) { + cerr << "Failed to instantiate plugin!" << endl; + return false; + } + } + + for (uint32_t j=0; j < num_ports(); ++j) + _ports->at(j)->prepare_poly(poly); + + return true; } -void +bool LV2Node::apply_poly(Raul::Maid& maid, uint32_t poly) { + assert(poly <= _prepared_poly); + NodeBase::apply_poly(maid, poly); + + maid.push(_instances); + _instances = _prepared_instances; + _poly = poly; + _prepared_instances = NULL; + + return true; } @@ -80,13 +108,13 @@ LV2Node::instantiate() _ports = new Raul::Array<Port*>(num_ports); - _instances = new SLV2Instance[_poly]; + _instances = new Raul::Array<SLV2Instance>(_poly); uint32_t port_buffer_size = 0; for (uint32_t i=0; i < _poly; ++i) { - _instances[i] = slv2_plugin_instantiate(_lv2_plugin, _srate, NULL); - if (_instances[i] == NULL) { + (*_instances)[i] = slv2_plugin_instantiate(_lv2_plugin, _srate, NULL); + if ((*_instances)[i] == NULL) { cerr << "Failed to instantiate plugin!" << endl; return false; } @@ -156,7 +184,7 @@ LV2Node::instantiate() LV2Node::~LV2Node() { for (uint32_t i=0; i < _poly; ++i) - slv2_instance_free(_instances[i]); + slv2_instance_free((*_instances)[i]); delete[] _instances; } @@ -180,7 +208,7 @@ LV2Node::activate() ((AudioBuffer*)port->buffer(i))->set(0.0f, 0); } } - slv2_instance_activate(_instances[i]); + slv2_instance_activate((*_instances)[i]); } } @@ -191,7 +219,7 @@ LV2Node::deactivate() NodeBase::deactivate(); for (uint32_t i=0; i < _poly; ++i) - slv2_instance_deactivate(_instances[i]); + slv2_instance_deactivate((*_instances)[i]); } @@ -201,7 +229,7 @@ LV2Node::process(SampleCount nframes, FrameTime start, FrameTime end) NodeBase::pre_process(nframes, start, end); for (uint32_t i=0; i < _poly; ++i) - slv2_instance_run(_instances[i], nframes); + slv2_instance_run((*_instances)[i], nframes); NodeBase::post_process(nframes, start, end); } @@ -213,11 +241,11 @@ LV2Node::set_port_buffer(uint32_t voice, uint32_t port_num, Buffer* buf) assert(voice < _poly); if (buf->type() == DataType::FLOAT) { - slv2_instance_connect_port(_instances[voice], port_num, ((AudioBuffer*)buf)->data()); + slv2_instance_connect_port((*_instances)[voice], port_num, ((AudioBuffer*)buf)->data()); } else if (buf->type() == DataType::MIDI) { - slv2_instance_connect_port(_instances[voice], port_num, ((MidiBuffer*)buf)->data()); + slv2_instance_connect_port((*_instances)[voice], port_num, ((MidiBuffer*)buf)->data()); } else if (buf->type() == DataType::OSC) { - slv2_instance_connect_port(_instances[voice], port_num, ((OSCBuffer*)buf)->data()); + slv2_instance_connect_port((*_instances)[voice], port_num, ((OSCBuffer*)buf)->data()); } } diff --git a/src/libs/engine/LV2Node.hpp b/src/libs/engine/LV2Node.hpp index 88ae5ffc..52f7d6a1 100644 --- a/src/libs/engine/LV2Node.hpp +++ b/src/libs/engine/LV2Node.hpp @@ -45,8 +45,8 @@ public: virtual bool instantiate(); - void prepare_poly(uint32_t poly); - void apply_poly(Raul::Maid& maid, uint32_t poly); + bool prepare_poly(uint32_t poly); + bool apply_poly(Raul::Maid& maid, uint32_t poly); void activate(); void deactivate(); @@ -58,9 +58,10 @@ public: protected: //void get_port_vals(ulong port_index, PortInfo* info); - SLV2Plugin _lv2_plugin; - SLV2Instance* _instances; - SLV2Instance* _prepared_instances; + SLV2Plugin _lv2_plugin; + Raul::Array<SLV2Instance>* _instances; + Raul::Array<SLV2Instance>* _prepared_instances; + uint32_t _prepared_poly; }; diff --git a/src/libs/engine/Makefile.am b/src/libs/engine/Makefile.am index 8d082d50..185c7804 100644 --- a/src/libs/engine/Makefile.am +++ b/src/libs/engine/Makefile.am @@ -154,6 +154,10 @@ libingen_engine_la_SOURCES = \ events/SetMetadataEvent.hpp \ events/SetPortValueEvent.cpp \ events/SetPortValueEvent.hpp \ + events/SetPolyphonyEvent.hpp \ + events/SetPolyphonyEvent.cpp \ + events/SetPolyphonicEvent.hpp \ + events/SetPolyphonicEvent.cpp \ events/SetPortValueQueuedEvent.cpp \ events/SetPortValueQueuedEvent.hpp \ events/UnregisterClientEvent.cpp \ diff --git a/src/libs/engine/Node.hpp b/src/libs/engine/Node.hpp index ca495904..3114d369 100644 --- a/src/libs/engine/Node.hpp +++ b/src/libs/engine/Node.hpp @@ -65,17 +65,18 @@ public: /** Prepare for a new (external) polyphony value. * * Preprocessor thread, poly is actually applied by apply_poly. + * \return true on success. */ - virtual void prepare_poly(uint32_t poly) = 0; + virtual bool prepare_poly(uint32_t poly) = 0; - /** Apply a new polyphony value. + /** Apply a new (external) polyphony value. * * Audio thread. * * \param poly Must be < the most recent value passed to prepare_poly. * \param maid Any objects no longer needed will be pushed to this */ - virtual void apply_poly(Raul::Maid& maid, uint32_t poly) = 0; + virtual bool apply_poly(Raul::Maid& maid, uint32_t poly) = 0; /** Parallelism: Reset flags for start of a new cycle. */ diff --git a/src/libs/engine/NodeBase.cpp b/src/libs/engine/NodeBase.cpp index 32b641e0..35d3be4e 100644 --- a/src/libs/engine/NodeBase.cpp +++ b/src/libs/engine/NodeBase.cpp @@ -82,21 +82,25 @@ NodeBase::deactivate() } -void +bool NodeBase::prepare_poly(uint32_t poly) { if (_ports) for (size_t i=0; i < _ports->size(); ++i) _ports->at(i)->prepare_poly(poly); + + return true; } -void +bool NodeBase::apply_poly(Raul::Maid& maid, uint32_t poly) { if (_ports) for (size_t i=0; i < _ports->size(); ++i) _ports->at(i)->apply_poly(maid, poly); + + return true; } diff --git a/src/libs/engine/NodeBase.hpp b/src/libs/engine/NodeBase.hpp index ed3cd80d..e74c0d12 100644 --- a/src/libs/engine/NodeBase.hpp +++ b/src/libs/engine/NodeBase.hpp @@ -55,8 +55,8 @@ public: virtual void deactivate(); bool activated() { return _activated; } - virtual void prepare_poly(uint32_t poly); - virtual void apply_poly(Raul::Maid& maid, uint32_t poly); + virtual bool prepare_poly(uint32_t poly); + virtual bool apply_poly(Raul::Maid& maid, uint32_t poly); virtual void reset_input_ready(); virtual bool process_lock(); diff --git a/src/libs/engine/OSCEngineReceiver.cpp b/src/libs/engine/OSCEngineReceiver.cpp index 75be643c..4d31d836 100644 --- a/src/libs/engine/OSCEngineReceiver.cpp +++ b/src/libs/engine/OSCEngineReceiver.cpp @@ -83,6 +83,7 @@ OSCEngineReceiver::OSCEngineReceiver(Engine& engine, size_t queue_size, uint16_t lo_server_add_method(_server, "/ingen/enable_patch", "is", enable_patch_cb, this); lo_server_add_method(_server, "/ingen/disable_patch", "is", disable_patch_cb, this); lo_server_add_method(_server, "/ingen/clear_patch", "is", clear_patch_cb, this); + lo_server_add_method(_server, "/ingen/set_polyphony", "ii", set_polyphony_cb, this); lo_server_add_method(_server, "/ingen/create_port", "issi", create_port_cb, this); lo_server_add_method(_server, "/ingen/create_node", "issssi", create_node_cb, this); lo_server_add_method(_server, "/ingen/create_node", "issi", create_node_by_uri_cb, this); @@ -206,7 +207,7 @@ OSCEngineReceiver::set_response_address_cb(const char* path, const char* types, if (argc < 1 || types[0] != 'i') // Not a valid Ingen message return 0; // Save liblo the trouble - const int id = argv[0]->i; + const int32_t id = argv[0]->i; const lo_address addr = lo_message_get_source(msg); char* const url = lo_address_get_url(addr); @@ -367,8 +368,8 @@ OSCEngineReceiver::_engine_deactivate_cb(const char* path, const char* types, lo int OSCEngineReceiver::_create_patch_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg) { - const char* patch_path = &argv[1]->s; - const int poly = argv[2]->i; + const char* patch_path = &argv[1]->s; + const int32_t poly = argv[2]->i; create_patch(patch_path, poly); return 0; @@ -438,6 +439,23 @@ OSCEngineReceiver::_clear_patch_cb(const char* path, const char* types, lo_arg** /** \page engine_osc_namespace + * <p> \b /ingen/set_polyphony - Set the polyphony of a patch + * \arg \b response-id (integer) + * \arg \b patch-path - Patch's path + * \arg \b poly (integer) </p> \n \n + */ +int +OSCEngineReceiver::_set_polyphony_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg) +{ + const char* patch_path = &argv[1]->s; + const uint32_t poly = argv[1]->i; + + set_polyphony(patch_path, poly); + return 0; +} + + +/** \page engine_osc_namespace * <p> \b /ingen/create_port - Add a port into a given patch (load a plugin by URI) * \arg \b response-id (integer) * \arg \b path (string) - Full path of the new port (ie. /patch2/subpatch/newport) @@ -447,9 +465,9 @@ OSCEngineReceiver::_clear_patch_cb(const char* path, const char* types, lo_arg** int OSCEngineReceiver::_create_port_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg) { - const char* port_path = &argv[1]->s; - const char* data_type = &argv[2]->s; - const int direction = argv[3]->i; + const char* port_path = &argv[1]->s; + const char* data_type = &argv[2]->s; + const int32_t direction = argv[3]->i; create_port(port_path, data_type, (direction == 1)); return 0; @@ -465,9 +483,9 @@ OSCEngineReceiver::_create_port_cb(const char* path, const char* types, lo_arg** int OSCEngineReceiver::_create_node_by_uri_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg) { - const char* node_path = &argv[1]->s; - const char* plug_uri = &argv[2]->s; - const int poly = argv[3]->i; + const char* node_path = &argv[1]->s; + const char* plug_uri = &argv[2]->s; + const int32_t poly = argv[3]->i; // FIXME: make sure poly is valid @@ -492,11 +510,11 @@ OSCEngineReceiver::_create_node_by_uri_cb(const char* path, const char* types, l int OSCEngineReceiver::_create_node_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg) { - const char* node_path = &argv[1]->s; - const char* type = &argv[2]->s; - const char* lib_name = &argv[3]->s; - const char* plug_label = &argv[4]->s; - const int poly = argv[5]->i; + const char* node_path = &argv[1]->s; + const char* type = &argv[2]->s; + const char* lib_name = &argv[3]->s; + const char* plug_label = &argv[4]->s; + const int32_t poly = argv[5]->i; create_node(node_path, type, lib_name, plug_label, (poly == 1)); return 0; @@ -594,9 +612,9 @@ OSCEngineReceiver::_set_port_value_cb(const char* path, const char* types, lo_ar int OSCEngineReceiver::_set_port_value_voice_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg) { - const char* port_path = &argv[1]->s; - const int voice = argv[2]->i; - const float value = argv[3]->f; + const char* port_path = &argv[1]->s; + const int32_t voice = argv[2]->i; + const float value = argv[3]->f; set_port_value(port_path, voice, value); return 0; diff --git a/src/libs/engine/OSCEngineReceiver.hpp b/src/libs/engine/OSCEngineReceiver.hpp index c08386ec..559a56b2 100644 --- a/src/libs/engine/OSCEngineReceiver.hpp +++ b/src/libs/engine/OSCEngineReceiver.hpp @@ -92,6 +92,7 @@ private: LO_HANDLER(enable_patch); LO_HANDLER(disable_patch); LO_HANDLER(clear_patch); + LO_HANDLER(set_polyphony); LO_HANDLER(destroy); LO_HANDLER(connect); LO_HANDLER(disconnect); diff --git a/src/libs/engine/Patch.cpp b/src/libs/engine/Patch.cpp index a03f2415..e8833da8 100644 --- a/src/libs/engine/Patch.cpp +++ b/src/libs/engine/Patch.cpp @@ -107,6 +107,32 @@ Patch::disable() (*i)->clear_buffers(); } + +bool +Patch::prepare_internal_poly(uint32_t poly) +{ + /* TODO: ports? internal/external poly? */ + + for (Raul::List<Node*>::iterator i = _nodes.begin(); i != _nodes.end(); ++i) + (*i)->prepare_poly(poly); + + /* FIXME: Deal with failure */ + + return true; +} + + +bool +Patch::apply_internal_poly(Raul::Maid& maid, uint32_t poly) +{ + /* TODO: ports? internal/external poly? */ + + for (Raul::List<Node*>::iterator i = _nodes.begin(); i != _nodes.end(); ++i) + (*i)->apply_poly(maid, poly); + + return true; +} + /** Run the patch for the specified number of frames. * diff --git a/src/libs/engine/Patch.hpp b/src/libs/engine/Patch.hpp index 8d17ee7c..32a02f76 100644 --- a/src/libs/engine/Patch.hpp +++ b/src/libs/engine/Patch.hpp @@ -58,6 +58,22 @@ public: void set_buffer_size(size_t size); + /** Prepare for a new (internal) polyphony value. + * + * Preprocessor thread, poly is actually applied by apply_internal_poly. + * \return true on success. + */ + bool prepare_internal_poly(uint32_t poly); + + /** Apply a new (internal) polyphony value. + * + * Audio thread. + * + * \param poly Must be < the most recent value passed to prepare_internal_poly. + * \param maid Any objects no longer needed will be pushed to this + */ + bool apply_internal_poly(Raul::Maid& maid, uint32_t poly); + // Patch specific stuff not inherited from Node void add_node(Raul::ListNode<Node*>* tn); diff --git a/src/libs/engine/Port.cpp b/src/libs/engine/Port.cpp index 8f9e9ce7..fe9e2c09 100644 --- a/src/libs/engine/Port.cpp +++ b/src/libs/engine/Port.cpp @@ -37,6 +37,7 @@ Port::Port(Node* const node, const string& name, uint32_t index, uint32_t poly, , _type(type) , _buffer_size(buffer_size) , _fixed_buffers(false) + , _buffers(new Raul::Array<Buffer*>(poly)) { assert(node != NULL); assert(_poly > 0); @@ -55,7 +56,7 @@ Port::~Port() } -void +bool Port::prepare_poly(uint32_t poly) { /* FIXME: poly never goes down, harsh on memory.. */ @@ -65,10 +66,12 @@ Port::prepare_poly(uint32_t poly) for (uint32_t i = _poly; i < _prepared_poly; ++i) _buffers->at(i) = BufferFactory::create(_type, _buffer_size); } + + return true; } -void +bool Port::apply_poly(Raul::Maid& maid, uint32_t poly) { assert(poly <= _prepared_poly); @@ -80,6 +83,8 @@ Port::apply_poly(Raul::Maid& maid, uint32_t poly) } _poly = poly; + + return true; } diff --git a/src/libs/engine/Port.hpp b/src/libs/engine/Port.hpp index 5b1c86b2..64fde9cc 100644 --- a/src/libs/engine/Port.hpp +++ b/src/libs/engine/Port.hpp @@ -53,7 +53,7 @@ public: * * Preprocessor thread, poly is actually applied by apply_poly. */ - virtual void prepare_poly(uint32_t poly); + virtual bool prepare_poly(uint32_t poly); /** Apply a new polyphony value. * @@ -61,7 +61,7 @@ public: * * \param poly Must be < the most recent value passed to prepare_poly. */ - virtual void apply_poly(Raul::Maid& maid, uint32_t poly); + virtual bool apply_poly(Raul::Maid& maid, uint32_t poly); Buffer* buffer(uint32_t voice) const { return _buffers->at(voice); } diff --git a/src/libs/engine/QueuedEngineInterface.cpp b/src/libs/engine/QueuedEngineInterface.cpp index 511246da..badbf78d 100644 --- a/src/libs/engine/QueuedEngineInterface.cpp +++ b/src/libs/engine/QueuedEngineInterface.cpp @@ -178,6 +178,20 @@ QueuedEngineInterface::clear_patch(const string& patch_path) push_queued(new ClearPatchEvent(_engine, _responder, now(), this, patch_path)); } + +void +QueuedEngineInterface::set_polyphony(const string& patch_path, uint32_t poly) +{ + push_queued(new SetPolyphonyEvent(_engine, _responder, now(), this, patch_path, poly)); +} + + +void +QueuedEngineInterface::set_polyphonic(const string& path, bool poly) +{ + push_queued(new SetPolyphonicEvent(_engine, _responder, now(), this, path, poly)); +} + void QueuedEngineInterface::enable_patch(const string& patch_path) diff --git a/src/libs/engine/QueuedEngineInterface.hpp b/src/libs/engine/QueuedEngineInterface.hpp index eb19923e..396615c0 100644 --- a/src/libs/engine/QueuedEngineInterface.hpp +++ b/src/libs/engine/QueuedEngineInterface.hpp @@ -101,6 +101,10 @@ public: virtual void destroy(const string& path); virtual void clear_patch(const string& patch_path); + + virtual void set_polyphony(const string& patch_path, uint32_t poly); + + virtual void set_polyphonic(const string& path, bool poly); virtual void enable_patch(const string& patch_path); diff --git a/src/libs/engine/QueuedEventSource.cpp b/src/libs/engine/QueuedEventSource.cpp index ac03ef16..634b94da 100644 --- a/src/libs/engine/QueuedEventSource.cpp +++ b/src/libs/engine/QueuedEventSource.cpp @@ -145,18 +145,6 @@ QueuedEventSource::pop_earliest_queued_before(const SampleCount time) // Private // -/** Signal that the blocking event is finished. - * - * When this is called preparing will resume. This MUST be called by - * blocking events in their post_process() method. - */ -void -QueuedEventSource::unblock() -{ - _blocking_semaphore.post(); -} - - /** Pre-process a single event */ void QueuedEventSource::_whipped() diff --git a/src/libs/engine/QueuedEventSource.hpp b/src/libs/engine/QueuedEventSource.hpp index df1a4824..d4cbc1ab 100644 --- a/src/libs/engine/QueuedEventSource.hpp +++ b/src/libs/engine/QueuedEventSource.hpp @@ -105,6 +105,18 @@ QueuedEventSource::pop_earliest_stamped_before(const SampleCount time) } +/** Signal that the blocking event is finished. + * + * When this is called preparing will resume. This MUST be called by + * blocking events in their post_process() method. + */ +inline void +QueuedEventSource::unblock() +{ + _blocking_semaphore.post(); +} + + } // namespace Ingen #endif // QUEUEDEVENTSOURCE_H diff --git a/src/libs/engine/events.hpp b/src/libs/engine/events.hpp index 84bde550..2660c6c1 100644 --- a/src/libs/engine/events.hpp +++ b/src/libs/engine/events.hpp @@ -20,35 +20,37 @@ #include CONFIG_H_PATH -#include "DeactivateEvent.hpp" -#include "EnablePatchEvent.hpp" -#include "DisablePatchEvent.hpp" +#include "AddNodeEvent.hpp" +#include "AddPortEvent.hpp" +#include "AllNotesOffEvent.hpp" #include "ClearPatchEvent.hpp" -#include "SetPortValueEvent.hpp" -#include "SetPortValueQueuedEvent.hpp" #include "ConnectionEvent.hpp" -#include "DisconnectionEvent.hpp" -#include "AddPortEvent.hpp" -#include "AddNodeEvent.hpp" #include "CreatePatchEvent.hpp" +#include "DeactivateEvent.hpp" #include "DestroyEvent.hpp" -#include "SetMetadataEvent.hpp" +#include "DisablePatchEvent.hpp" +#include "DisconnectionEvent.hpp" +#include "DisconnectNodeEvent.hpp" +#include "EnablePatchEvent.hpp" +#include "LoadPluginsEvent.hpp" +#include "MidiLearnEvent.hpp" +#include "NoteOffEvent.hpp" +#include "NoteOnEvent.hpp" +#include "PingQueuedEvent.hpp" +#include "RegisterClientEvent.hpp" +#include "RenameEvent.hpp" +#include "RequestAllObjectsEvent.hpp" #include "RequestMetadataEvent.hpp" #include "RequestObjectEvent.hpp" #include "RequestPluginEvent.hpp" -#include "RequestPortValueEvent.hpp" -#include "RequestAllObjectsEvent.hpp" #include "RequestPluginsEvent.hpp" -#include "LoadPluginsEvent.hpp" -#include "NoteOnEvent.hpp" -#include "NoteOffEvent.hpp" -#include "AllNotesOffEvent.hpp" -#include "DisconnectNodeEvent.hpp" -#include "RegisterClientEvent.hpp" +#include "RequestPortValueEvent.hpp" +#include "SetMetadataEvent.hpp" +#include "SetPolyphonyEvent.hpp" +#include "SetPolyphonicEvent.hpp" +#include "SetPortValueEvent.hpp" +#include "SetPortValueQueuedEvent.hpp" #include "UnregisterClientEvent.hpp" -#include "RenameEvent.hpp" -#include "PingQueuedEvent.hpp" -#include "MidiLearnEvent.hpp" #ifdef HAVE_DSSI #include "DSSIUpdateEvent.hpp" diff --git a/src/libs/engine/events/AddPortEvent.cpp b/src/libs/engine/events/AddPortEvent.cpp index 1d016c5d..28273815 100644 --- a/src/libs/engine/events/AddPortEvent.cpp +++ b/src/libs/engine/events/AddPortEvent.cpp @@ -154,15 +154,15 @@ AddPortEvent::execute(SampleCount nframes, FrameTime start, FrameTime end) _engine.midi_driver()->add_port(_driver_port); else if (_type == "ingen:osc") cerr << "OSC DRIVER PORT" << endl; + + if (_source) + _source->unblock(); } void AddPortEvent::post_process() { - if (_source) - _source->unblock(); - if (!_patch_port) { const string msg = string("Could not create port - ").append(_path); _responder->respond_error(msg); diff --git a/src/libs/engine/events/ClearPatchEvent.cpp b/src/libs/engine/events/ClearPatchEvent.cpp index 5a914901..aa72cd54 100644 --- a/src/libs/engine/events/ClearPatchEvent.cpp +++ b/src/libs/engine/events/ClearPatchEvent.cpp @@ -113,7 +113,7 @@ ClearPatchEvent::post_process() _responder->respond_error(string("Patch ") + _patch_path + " not found"); } - _source->unblock(); + _source->unblock(); // FIXME: can be done earlier in execute? } diff --git a/src/libs/engine/events/DestroyEvent.cpp b/src/libs/engine/events/DestroyEvent.cpp index ba4da6ec..38a8fe3e 100644 --- a/src/libs/engine/events/DestroyEvent.cpp +++ b/src/libs/engine/events/DestroyEvent.cpp @@ -192,15 +192,15 @@ DestroyEvent::execute(SampleCount nframes, FrameTime start, FrameTime end) _driver_port = _engine.midi_driver()->remove_port(_port->path()); } } + + if (_source) + _source->unblock(); } void DestroyEvent::post_process() { - if (_source) - _source->unblock(); - if (_store_iterator != _engine.object_store()->objects().end()) { _engine.broadcaster()->send_destroyed(_path); } else { diff --git a/src/libs/engine/events/LoadPluginsEvent.cpp b/src/libs/engine/events/LoadPluginsEvent.cpp index 2eae055a..df5ff5d9 100644 --- a/src/libs/engine/events/LoadPluginsEvent.cpp +++ b/src/libs/engine/events/LoadPluginsEvent.cpp @@ -31,7 +31,7 @@ namespace Ingen { LoadPluginsEvent::LoadPluginsEvent(Engine& engine, SharedPtr<Responder> responder, SampleCount timestamp, QueuedEventSource* source) : QueuedEvent(engine, responder, timestamp, true, source) { - /* Not sure why this has to be blocking, but it fixes some nasty bugs.. */ + /* FIXME: Not sure why this has to be blocking, but it fixes some nasty bugs.. */ } void diff --git a/src/libs/engine/events/Makefile.am b/src/libs/engine/events/Makefile.am index bc698678..f3190756 100644 --- a/src/libs/engine/events/Makefile.am +++ b/src/libs/engine/events/Makefile.am @@ -60,6 +60,10 @@ EXTRA_DIST = \ RequestPortValueEvent.hpp \ SetMetadataEvent.cpp \ SetMetadataEvent.hpp \ + SetPolyphonyEvent.hpp \ + SetPolyphonyEvent.cpp \ + SetPolyphonicEvent.hpp \ + SetPolyphonicEvent.cpp \ SetPortValueEvent.cpp \ SetPortValueEvent.hpp \ SetPortValueQueuedEvent.cpp \ diff --git a/src/libs/gui/PatchView.cpp b/src/libs/gui/PatchView.cpp index 0a624dc0..c313f5ac 100644 --- a/src/libs/gui/PatchView.cpp +++ b/src/libs/gui/PatchView.cpp @@ -95,7 +95,9 @@ PatchView::set_patch(SharedPtr<PatchModel> patch) _edit_mode_but->signal_toggled().connect(sigc::mem_fun( *this, &PatchView::editable_toggled)); - + + _poly_spin->signal_value_changed().connect( + sigc::mem_fun(*this, &PatchView::poly_changed)); _canvas->grab_focus(); } @@ -154,6 +156,13 @@ PatchView::process_toggled() void +PatchView::poly_changed() +{ + App::instance().engine()->set_polyphony(_patch->path(), _poly_spin->get_value_as_int()); +} + + +void PatchView::clear_clicked() { App::instance().engine()->clear_patch(_patch->path()); diff --git a/src/libs/gui/PatchView.hpp b/src/libs/gui/PatchView.hpp index dcc2ffcc..7952ee72 100644 --- a/src/libs/gui/PatchView.hpp +++ b/src/libs/gui/PatchView.hpp @@ -69,6 +69,7 @@ private: void set_patch(SharedPtr<PatchModel> patch); void process_toggled(); + void poly_changed(); void clear_clicked(); void refresh_clicked(); void on_editable_sig(bool locked); diff --git a/src/libs/gui/ingen_gui.glade b/src/libs/gui/ingen_gui.glade index 402be871..fbe6fedd 100644 --- a/src/libs/gui/ingen_gui.glade +++ b/src/libs/gui/ingen_gui.glade @@ -481,62 +481,53 @@ <property name="n_columns">3</property> <property name="row_spacing">12</property> <child> - <widget class="GtkButton" id="load_plugin_clear_button"> + <widget class="GtkLabel" id="label66"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Clear filter text (show all plugins)</property> - <property name="label">gtk-clear</property> - <property name="use_stock">True</property> - <property name="response_id">0</property> + <property name="xalign">1</property> + <property name="label" translatable="yes">Node Name:</property> + <property name="use_markup">True</property> </widget> <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkComboBox" id="load_plugin_filter_combo"> + <widget class="GtkHSeparator" id="hseparator1"> <property name="visible">True</property> - <property name="items" translatable="yes">Name contains: </property> </widget> <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkEntry" id="load_plugin_search_entry"> + <widget class="GtkHSeparator" id="hseparator2"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="tooltip" translatable="yes">Search string to filter plugin list</property> - <property name="invisible_char">*</property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_padding">6</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> </packing> </child> <child> - <widget class="GtkButton" id="load_plugin_add_button"> + <widget class="GtkHSeparator" id="hseparator3"> <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Add selected plugin to patch</property> - <property name="label">gtk-add</property> - <property name="use_stock">True</property> - <property name="response_id">0</property> </widget> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options">GTK_FILL</property> </packing> </child> <child> @@ -579,51 +570,60 @@ </packing> </child> <child> - <widget class="GtkHSeparator" id="hseparator3"> + <widget class="GtkButton" id="load_plugin_add_button"> <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Add selected plugin to patch</property> + <property name="label">gtk-add</property> + <property name="use_stock">True</property> + <property name="response_id">0</property> </widget> <packing> <property name="left_attach">2</property> <property name="right_attach">3</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> + <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkHSeparator" id="hseparator2"> + <widget class="GtkEntry" id="load_plugin_search_entry"> <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="has_focus">True</property> + <property name="tooltip" translatable="yes">Search string to filter plugin list</property> + <property name="invisible_char">*</property> </widget> <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_padding">6</property> </packing> </child> <child> - <widget class="GtkHSeparator" id="hseparator1"> + <widget class="GtkComboBox" id="load_plugin_filter_combo"> <property name="visible">True</property> + <property name="items" translatable="yes">Name contains: </property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="label66"> + <widget class="GtkButton" id="load_plugin_clear_button"> <property name="visible">True</property> - <property name="xalign">1</property> - <property name="label" translatable="yes">Node Name:</property> - <property name="use_markup">True</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Clear filter text (show all plugins)</property> + <property name="label">gtk-clear</property> + <property name="use_stock">True</property> + <property name="response_id">0</property> </widget> <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> + <property name="left_attach">2</property> + <property name="right_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> @@ -654,61 +654,61 @@ <property name="n_rows">2</property> <property name="n_columns">2</property> <child> - <widget class="GtkEntry" id="new_subpatch_name_entry"> + <widget class="GtkLabel" id="label8"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="has_focus">True</property> - <property name="invisible_char">*</property> - <property name="activates_default">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Name: </property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="y_options"></property> - <property name="y_padding">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_EXPAND</property> + <property name="x_padding">5</property> </packing> </child> <child> - <widget class="GtkSpinButton" id="new_subpatch_polyphony_spinbutton"> + <widget class="GtkLabel" id="label9"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">1 0 100 1 10 10</property> - <property name="climb_rate">1</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Polyphony: </property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - <property name="y_padding">4</property> + <property name="y_options">GTK_EXPAND</property> + <property name="x_padding">5</property> </packing> </child> <child> - <widget class="GtkLabel" id="label9"> + <widget class="GtkSpinButton" id="new_subpatch_polyphony_spinbutton"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Polyphony: </property> + <property name="can_focus">True</property> + <property name="adjustment">1 0 100 1 10 10</property> + <property name="climb_rate">1</property> </widget> <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_EXPAND</property> - <property name="x_padding">5</property> + <property name="y_options"></property> + <property name="y_padding">4</property> </packing> </child> <child> - <widget class="GtkLabel" id="label8"> + <widget class="GtkEntry" id="new_subpatch_name_entry"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Name: </property> + <property name="can_focus">True</property> + <property name="has_focus">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> </widget> <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_EXPAND</property> - <property name="x_padding">5</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"></property> + <property name="y_padding">4</property> </packing> </child> </widget> @@ -810,71 +810,63 @@ <property name="column_spacing">12</property> <property name="row_spacing">4</property> <child> - <widget class="GtkHBox" id="hbox45"> + <widget class="GtkLabel" id="label79"> <property name="visible">True</property> - <child> - <widget class="GtkRadioButton" id="load_subpatch_name_from_user_radio"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Specify the name for the new patch</property> - <property name="label" translatable="yes">Specify: </property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">load_subpatch_name_from_file_radio</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkEntry" id="load_subpatch_name_entry"> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Specify the name for the new patch</property> - <property name="invisible_char">*</property> - <property name="activates_default">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Name: </b></property> + <property name="use_markup">True</property> </widget> <packing> - <property name="left_attach">3</property> - <property name="right_attach">4</property> - <property name="y_options">GTK_FILL</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="label104"> + <widget class="GtkLabel" id="label80"> <property name="visible">True</property> <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Polyphony: </b></property> + <property name="use_markup">True</property> </widget> <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkRadioButton" id="load_subpatch_poly_from_parent_radio"> + <widget class="GtkRadioButton" id="load_subpatch_name_from_file_radio"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Set polyphony to the same value as the parent (containing) patch</property> - <property name="label" translatable="yes">Same as parent (?)</property> + <property name="tooltip" translatable="yes">Use the name stored in the patch file</property> + <property name="label" translatable="yes">Load from file</property> <property name="use_underline">True</property> <property name="response_id">0</property> + <property name="active">True</property> <property name="draw_indicator">True</property> - <property name="group">load_subpatch_poly_from_file_radio</property> </widget> <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="load_subpatch_poly_from_file_radio"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property> + <property name="label" translatable="yes">Load from file</property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> @@ -925,19 +917,19 @@ </packing> </child> <child> - <widget class="GtkRadioButton" id="load_subpatch_poly_from_file_radio"> + <widget class="GtkRadioButton" id="load_subpatch_poly_from_parent_radio"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property> - <property name="label" translatable="yes">Load from file</property> + <property name="tooltip" translatable="yes">Set polyphony to the same value as the parent (containing) patch</property> + <property name="label" translatable="yes">Same as parent (?)</property> <property name="use_underline">True</property> <property name="response_id">0</property> - <property name="active">True</property> <property name="draw_indicator">True</property> + <property name="group">load_subpatch_poly_from_file_radio</property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> + <property name="left_attach">2</property> + <property name="right_attach">3</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> @@ -945,47 +937,55 @@ </packing> </child> <child> - <widget class="GtkRadioButton" id="load_subpatch_name_from_file_radio"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Use the name stored in the patch file</property> - <property name="label" translatable="yes">Load from file</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label80"> + <widget class="GtkLabel" id="label104"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Polyphony: </b></property> - <property name="use_markup">True</property> </widget> <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> + <property name="left_attach">2</property> + <property name="right_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="label79"> + <widget class="GtkHBox" id="hbox45"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Name: </b></property> - <property name="use_markup">True</property> + <child> + <widget class="GtkRadioButton" id="load_subpatch_name_from_user_radio"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Specify the name for the new patch</property> + <property name="label" translatable="yes">Specify: </property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + <property name="group">load_subpatch_name_from_file_radio</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="load_subpatch_name_entry"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Specify the name for the new patch</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> </widget> <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="left_attach">3</property> + <property name="right_attach">4</property> + <property name="y_options">GTK_FILL</property> </packing> </child> </widget> @@ -1047,6 +1047,54 @@ <property name="column_spacing">12</property> <property name="row_spacing">4</property> <child> + <widget class="GtkLabel" id="label123"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Polyphony: </b></property> + <property name="use_markup">True</property> + </widget> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="load_patch_poly_from_current_radio"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Use the same polyphony as the current patch</property> + <property name="label" translatable="yes">Keep current</property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkRadioButton" id="load_patch_poly_from_file_radio"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property> + <property name="label" translatable="yes">Load from file</property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + <property name="group">load_patch_poly_from_current_radio</property> + </widget> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> <widget class="GtkHBox" id="hbox58"> <property name="visible">True</property> <child> @@ -1086,54 +1134,6 @@ <property name="y_options">GTK_FILL</property> </packing> </child> - <child> - <widget class="GtkRadioButton" id="load_patch_poly_from_file_radio"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Use the polyphony value stored in the patch file</property> - <property name="label" translatable="yes">Load from file</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">load_patch_poly_from_current_radio</property> - </widget> - <packing> - <property name="left_attach">2</property> - <property name="right_attach">3</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkRadioButton" id="load_patch_poly_from_current_radio"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Use the same polyphony as the current patch</property> - <property name="label" translatable="yes">Keep current</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="active">True</property> - <property name="draw_indicator">True</property> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label123"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes"><b>Polyphony: </b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> </widget> <packing> <property name="expand">False</property> @@ -1197,22 +1197,46 @@ <placeholder/> </child> <child> - <widget class="GtkVBox" id="control_strip"> + <widget class="GtkVBox" id="control_panel_vbox"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <widget class="GtkHBox" id="hbox1"> + <widget class="GtkAlignment" id="alignment6"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="yalign">0</property> <child> - <widget class="GtkLabel" id="control_strip_name_label"> + <widget class="GtkScrolledWindow" id="scrolledwin1"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">4</property> - <property name="ypad">4</property> - <property name="label" translatable="yes"><b>Name</b></property> - <property name="use_markup">True</property> - <property name="single_line_mode">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> + <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> + <child> + <widget class="GtkViewport" id="viewport1"> + <property name="visible">True</property> + <property name="shadow_type">GTK_SHADOW_NONE</property> + <child> + <widget class="GtkVBox" id="control_panel_controls_box"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + </widget> + </child> + </widget> + </child> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkHBox" id="control_panel_voice_controls_box"> + <property name="visible">True</property> + <property name="homogeneous">True</property> + <child> + <widget class="GtkRadioButton" id="control_panel_all_voices_radio"> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Apply changed controls to all voices</property> + <property name="label" translatable="yes">All Voices</property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> </widget> <packing> <property name="expand">False</property> @@ -1220,67 +1244,54 @@ </packing> </child> <child> - <widget class="GtkAlignment" id="alignment3"> + <widget class="GtkHBox" id="hbox32"> <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="xalign">1</property> - <property name="yalign">1</property> - <property name="xscale">0</property> - <property name="yscale">0</property> - <property name="top_padding">2</property> - <property name="left_padding">2</property> - <property name="right_padding">2</property> + <property name="spacing">5</property> <child> - <widget class="GtkSpinButton" id="control_strip_spinner"> + <widget class="GtkRadioButton" id="control_panel_specific_voice_radio"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="width_chars">12</property> - <property name="adjustment">0 -9.9999999999999999e+45 1.0000000000000001e+63 1 10 10</property> - <property name="digits">4</property> + <property name="tooltip" translatable="yes">Apply changed controls to one voice only</property> + <property name="label" translatable="yes">Specific Voice:</property> + <property name="use_underline">True</property> + <property name="response_id">0</property> + <property name="draw_indicator">True</property> + <property name="group">control_panel_all_voices_radio</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkSpinButton" id="control_panel_voice_spinbutton"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Voice control changes are applied to</property> + <property name="adjustment">1 1 100 1 10 10</property> + <property name="climb_rate">1</property> <property name="numeric">True</property> </widget> + <packing> + <property name="position">1</property> + </packing> </child> </widget> <packing> + <property name="expand">False</property> + <property name="fill">False</property> <property name="position">1</property> </packing> </child> </widget> <packing> <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - <child> - <widget class="GtkHScale" id="control_strip_slider"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - <property name="adjustment">0 -1e+113 1e+137 0 0 0</property> - <property name="digits">63</property> - <property name="draw_value">False</property> - </widget> - <packing> - <property name="expand">False</property> + <property name="padding">5</property> <property name="position">1</property> </packing> </child> </widget> - <packing> - <property name="top_attach">3</property> - <property name="bottom_attach">4</property> - </packing> - </child> - <child> - <widget class="GtkHSeparator" id="hseparator5"> - <property name="visible">True</property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - </packing> </child> <child> <widget class="GtkVBox" id="patch_view_box"> @@ -1546,46 +1557,32 @@ Hold <Ctrl> to play controls in either mode.</property> </packing> </child> <child> - <widget class="GtkVBox" id="control_panel_vbox"> + <widget class="GtkHSeparator" id="hseparator5"> <property name="visible">True</property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <widget class="GtkVBox" id="control_strip"> + <property name="visible">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <widget class="GtkAlignment" id="alignment6"> + <widget class="GtkHBox" id="hbox1"> <property name="visible">True</property> - <property name="yalign">0</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwin1"> + <widget class="GtkLabel" id="control_strip_name_label"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <child> - <widget class="GtkViewport" id="viewport1"> - <property name="visible">True</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> - <child> - <widget class="GtkVBox" id="control_panel_controls_box"> - <property name="visible">True</property> - <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> - </widget> - </child> - </widget> - </child> - </widget> - </child> - </widget> - </child> - <child> - <widget class="GtkHBox" id="control_panel_voice_controls_box"> - <property name="visible">True</property> - <property name="homogeneous">True</property> - <child> - <widget class="GtkRadioButton" id="control_panel_all_voices_radio"> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Apply changed controls to all voices</property> - <property name="label" translatable="yes">All Voices</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> + <property name="xalign">0</property> + <property name="xpad">4</property> + <property name="ypad">4</property> + <property name="label" translatable="yes"><b>Name</b></property> + <property name="use_markup">True</property> + <property name="single_line_mode">True</property> </widget> <packing> <property name="expand">False</property> @@ -1593,54 +1590,57 @@ Hold <Ctrl> to play controls in either mode.</property> </packing> </child> <child> - <widget class="GtkHBox" id="hbox32"> + <widget class="GtkAlignment" id="alignment3"> <property name="visible">True</property> - <property name="spacing">5</property> - <child> - <widget class="GtkRadioButton" id="control_panel_specific_voice_radio"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Apply changed controls to one voice only</property> - <property name="label" translatable="yes">Specific Voice:</property> - <property name="use_underline">True</property> - <property name="response_id">0</property> - <property name="draw_indicator">True</property> - <property name="group">control_panel_all_voices_radio</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="xalign">1</property> + <property name="yalign">1</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <property name="top_padding">2</property> + <property name="left_padding">2</property> + <property name="right_padding">2</property> <child> - <widget class="GtkSpinButton" id="control_panel_voice_spinbutton"> + <widget class="GtkSpinButton" id="control_strip_spinner"> <property name="visible">True</property> - <property name="sensitive">False</property> <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Voice control changes are applied to</property> - <property name="adjustment">1 1 100 1 10 10</property> - <property name="climb_rate">1</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="width_chars">12</property> + <property name="adjustment">0 -9.9999999999999999e+45 1.0000000000000001e+63 1 10 10</property> + <property name="digits">4</property> <property name="numeric">True</property> </widget> - <packing> - <property name="position">1</property> - </packing> </child> </widget> <packing> - <property name="expand">False</property> - <property name="fill">False</property> <property name="position">1</property> </packing> </child> </widget> <packing> <property name="expand">False</property> - <property name="padding">5</property> + <property name="fill">False</property> + </packing> + </child> + <child> + <widget class="GtkHScale" id="control_strip_slider"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="adjustment">0 -1e+113 1e+137 0 0 0</property> + <property name="digits">63</property> + <property name="draw_value">False</property> + </widget> + <packing> + <property name="expand">False</property> <property name="position">1</property> </packing> </child> </widget> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + </packing> </child> </widget> </child> @@ -1730,51 +1730,51 @@ Hold <Ctrl> to play controls in either mode.</property> <property name="n_rows">2</property> <property name="n_columns">2</property> <child> - <widget class="GtkLabel" id="label103"> + <widget class="GtkLabel" id="label90"> <property name="visible">True</property> - <property name="xalign">0</property> + <property name="label" translatable="yes"><b>Patch Search Path: </b></property> + <property name="use_markup">True</property> </widget> <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="label91"> + <widget class="GtkEntry" id="config_path_entry"> <property name="visible">True</property> - <property name="label" translatable="yes"><i>Example: /foo/bar:/home/john/patches:/usr/share/om/patches</i></property> - <property name="use_markup">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">*</property> </widget> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkEntry" id="config_path_entry"> + <widget class="GtkLabel" id="label91"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">*</property> + <property name="label" translatable="yes"><i>Example: /foo/bar:/home/john/patches:/usr/share/om/patches</i></property> + <property name="use_markup">True</property> </widget> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="label90"> + <widget class="GtkLabel" id="label103"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Patch Search Path: </b></property> - <property name="use_markup">True</property> + <property name="xalign">0</property> </widget> <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> @@ -2150,7 +2150,7 @@ Hold <Ctrl> to play controls in either mode.</property> <property name="column_spacing">10</property> <property name="row_spacing">6</property> <child> - <widget class="GtkLabel" id="node_properties_plugin_name_label"> + <widget class="GtkLabel" id="node_properties_plugin_type_label"> <property name="visible">True</property> <property name="xalign">0</property> <property name="label" translatable="yes">-</property> @@ -2158,34 +2158,28 @@ Hold <Ctrl> to play controls in either mode.</property> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="label116"> + <widget class="GtkLabel" id="label114"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes">Name: </property> + <property name="label" translatable="yes">Type: </property> </widget> <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="node_properties_plugin_uri_label"> + <widget class="GtkLabel" id="label120"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes">-</property> + <property name="label" translatable="yes">URI: </property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> @@ -2193,12 +2187,14 @@ Hold <Ctrl> to play controls in either mode.</property> </packing> </child> <child> - <widget class="GtkLabel" id="label120"> + <widget class="GtkLabel" id="node_properties_plugin_uri_label"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes">URI: </property> + <property name="label" translatable="yes">-</property> </widget> <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> <property name="top_attach">1</property> <property name="bottom_attach">2</property> <property name="x_options">GTK_FILL</property> @@ -2206,18 +2202,20 @@ Hold <Ctrl> to play controls in either mode.</property> </packing> </child> <child> - <widget class="GtkLabel" id="label114"> + <widget class="GtkLabel" id="label116"> <property name="visible">True</property> <property name="xalign">0</property> - <property name="label" translatable="yes">Type: </property> + <property name="label" translatable="yes">Name: </property> </widget> <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkLabel" id="node_properties_plugin_type_label"> + <widget class="GtkLabel" id="node_properties_plugin_name_label"> <property name="visible">True</property> <property name="xalign">0</property> <property name="label" translatable="yes">-</property> @@ -2225,6 +2223,8 @@ Hold <Ctrl> to play controls in either mode.</property> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> @@ -2379,33 +2379,64 @@ Contributors: <property name="n_columns">2</property> <property name="row_spacing">8</property> <child> - <widget class="GtkLabel" id="label131"> + <widget class="GtkHBox" id="hbox64"> <property name="visible">True</property> - <property name="xalign">0</property> + <child> + <widget class="GtkSpinButton" id="connect_port_spinbutton"> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="adjustment">16180 1 65535 1 10 10</property> + <property name="climb_rate">1</property> + <property name="numeric">True</property> + </widget> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options">GTK_FILL</property> + <property name="x_padding">8</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox67"> + <property name="visible">True</property> + <child> + <widget class="GtkEntry" id="connect_url_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> + <property name="width_chars">28</property> + <property name="text" translatable="yes">osc.udp://localhost:16180</property> + </widget> + </child> </widget> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> + <property name="y_options">GTK_FILL</property> + <property name="x_padding">8</property> </packing> </child> <child> - <widget class="GtkRadioButton" id="connect_internal_radiobutton"> + <widget class="GtkRadioButton" id="connect_server_radiobutton"> <property name="visible">True</property> - <property name="sensitive">False</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Use internal engine</property> + <property name="label" translatable="yes">Connect to running server at: </property> <property name="use_underline">True</property> <property name="response_id">0</property> <property name="draw_indicator">True</property> - <property name="group">connect_server_radiobutton</property> </widget> <packing> - <property name="top_attach">2</property> - <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> @@ -2428,66 +2459,35 @@ Contributors: </packing> </child> <child> - <widget class="GtkRadioButton" id="connect_server_radiobutton"> + <widget class="GtkRadioButton" id="connect_internal_radiobutton"> <property name="visible">True</property> + <property name="sensitive">False</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Connect to running server at: </property> + <property name="label" translatable="yes">Use internal engine</property> <property name="use_underline">True</property> <property name="response_id">0</property> <property name="draw_indicator">True</property> + <property name="group">connect_server_radiobutton</property> </widget> <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> <child> - <widget class="GtkHBox" id="hbox67"> + <widget class="GtkLabel" id="label131"> <property name="visible">True</property> - <child> - <widget class="GtkEntry" id="connect_url_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="invisible_char">*</property> - <property name="activates_default">True</property> - <property name="width_chars">28</property> - <property name="text" translatable="yes">osc.udp://localhost:16180</property> - </widget> - </child> + <property name="xalign">0</property> </widget> <packing> <property name="left_attach">1</property> <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> <property name="x_options">GTK_FILL</property> - <property name="y_options">GTK_FILL</property> - <property name="x_padding">8</property> - </packing> - </child> - <child> - <widget class="GtkHBox" id="hbox64"> - <property name="visible">True</property> - <child> - <widget class="GtkSpinButton" id="connect_port_spinbutton"> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="adjustment">16180 1 65535 1 10 10</property> - <property name="climb_rate">1</property> - <property name="numeric">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="y_options">GTK_FILL</property> - <property name="x_padding">8</property> + <property name="y_options"></property> </packing> </child> </widget> @@ -2828,26 +2828,19 @@ Contributors: <property name="n_columns">2</property> <property name="row_spacing">8</property> <child> - <widget class="GtkLabel" id="label136"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Short Name: </property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label135"> + <widget class="GtkEntry" id="upload_patch_symbol_entry"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Symbol: </property> + <property name="can_focus">True</property> + <property name="tooltip" translatable="yes">Enter a short name suitable for use as an identifier or filename. + +The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z or 0-9. +</property> + <property name="invisible_char">*</property> + <property name="activates_default">True</property> </widget> <packing> - <property name="x_options">GTK_FILL</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> <property name="y_options"></property> </packing> </child> @@ -2868,19 +2861,26 @@ Contributors: </packing> </child> <child> - <widget class="GtkEntry" id="upload_patch_symbol_entry"> + <widget class="GtkLabel" id="label135"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="tooltip" translatable="yes">Enter a short name suitable for use as an identifier or filename. - -The first character must be one of _, a-z or A-Z and subsequenct characters can be from _, a-z, A-Z or 0-9. -</property> - <property name="invisible_char">*</property> - <property name="activates_default">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Symbol: </property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label136"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Short Name: </property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> @@ -3026,26 +3026,17 @@ Thank you for contributing.</property> <property name="column_spacing">2</property> <property name="row_spacing">4</property> <child> - <widget class="GtkLabel" id="label139"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Maximum Value: </property> - </widget> - <packing> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">GTK_FILL</property> - <property name="y_options"></property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label138"> + <widget class="GtkSpinButton" id="port_properties_min_spinner"> <property name="visible">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Minimum Value: </property> + <property name="can_focus">True</property> + <property name="adjustment">0 -100000000 100000000 1 10 10</property> + <property name="climb_rate">1</property> + <property name="digits">5</property> + <property name="numeric">True</property> </widget> <packing> - <property name="x_options">GTK_FILL</property> + <property name="left_attach">1</property> + <property name="right_attach">2</property> <property name="y_options"></property> </packing> </child> @@ -3067,17 +3058,26 @@ Thank you for contributing.</property> </packing> </child> <child> - <widget class="GtkSpinButton" id="port_properties_min_spinner"> + <widget class="GtkLabel" id="label138"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="adjustment">0 -100000000 100000000 1 10 10</property> - <property name="climb_rate">1</property> - <property name="digits">5</property> - <property name="numeric">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Minimum Value: </property> </widget> <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"></property> + </packing> + </child> + <child> + <widget class="GtkLabel" id="label139"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes">Maximum Value: </property> + </widget> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> <property name="y_options"></property> </packing> </child> |