Changeset 1346


Ignore:
Timestamp:
08/12/08 15:59:42 (6 years ago)
Author:
drobilla
Message:

Multiple selection of ports (with ctrl).
Easy multi->1 (or 1->Multi) connections (click style).

Location:
flowcanvas
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • flowcanvas/flowcanvas/Canvas.hpp

    r998 r1346  
    136136                       boost::shared_ptr<const Connectable> head); 
    137137     
    138     void selected_port(boost::shared_ptr<Port> p); 
    139     boost::shared_ptr<Port> selected_port() { return _selected_port; } 
    140      
     138    void select_port(boost::shared_ptr<Port> p, bool unique = false); 
     139    void select_port_toggle(boost::shared_ptr<Port> p, int mod_state); 
     140    void unselect_port(boost::shared_ptr<Port> p); 
     141 
     142    void selection_joined_with(boost::shared_ptr<Port> port); 
     143 
    141144    boost::shared_ptr<Port> get_port_at(double x, double y); 
    142145 
     
    150153    void scroll_to_center(); 
    151154 
    152     boost::shared_ptr<Port> _selected_port; ///< Selected port (hilited red from clicking once) 
     155    typedef std::list< boost::shared_ptr<Port> > SelectedPorts; 
     156    SelectedPorts _selected_ports; ///< Selected ports (hilited red) 
    153157    boost::shared_ptr<Port> _connect_port;  ///< Port for which a connection is being made (if applicable) 
     158    boost::shared_ptr<Port> _last_selected_port; 
    154159     
    155160    double _zoom;   ///< Current zoom level 
  • flowcanvas/flowcanvas/Port.hpp

    r1244 r1346  
    6262    void set_fill_color(uint32_t c) { _rect->property_fill_color_rgba() = c; } 
    6363     
     64    void set_selected(bool b); 
     65    bool selected() const { return _selected; } 
     66 
    6467    void set_highlighted(bool highlight, 
    6568                         bool highlight_parent=true, 
     
    123126    double                  _border_width; 
    124127    uint32_t                _color; 
     128    bool                    _selected; 
    125129 
    126130    float _control_value; 
  • flowcanvas/src/Canvas.cpp

    r1345 r1346  
    284284    _connections.clear(); 
    285285 
    286     _selected_port.reset(); 
     286    _selected_ports.clear(); 
    287287    _connect_port.reset(); 
    288288     
     
    296296Canvas::unselect_ports() 
    297297{ 
    298     if (_selected_port) 
    299         _selected_port->set_fill_color(_selected_port->color()); // deselect the old one 
    300      
    301     _selected_port.reset(); 
    302 } 
    303  
    304  
    305 void 
    306 Canvas::selected_port(boost::shared_ptr<Port> p) 
    307 { 
    308     unselect_ports(); 
    309      
    310     _selected_port = p; 
    311      
    312     if (p) 
    313         p->set_fill_color(0xFF0000FF); 
     298    for (SelectedPorts::iterator i = _selected_ports.begin(); i != _selected_ports.end(); ++i) 
     299        (*i)->set_selected(false); 
     300     
     301    _selected_ports.clear(); 
     302    _last_selected_port.reset(); 
     303} 
     304 
     305 
     306void 
     307Canvas::select_port(boost::shared_ptr<Port> p, bool unique) 
     308{ 
     309    if (unique) 
     310        unselect_ports(); 
     311    p->set_selected(true); 
     312    _selected_ports.push_back(p); 
     313    _last_selected_port = p; 
     314} 
     315 
     316     
     317void 
     318Canvas::unselect_port(boost::shared_ptr<Port> p) 
     319{ 
     320    SelectedPorts::iterator i = find(_selected_ports.begin(), _selected_ports.end(), p); 
     321    if (i != _selected_ports.end()) 
     322        _selected_ports.erase(i); 
     323    p->set_selected(false); 
     324    if (_last_selected_port == p) 
     325        _last_selected_port.reset(); 
     326} 
     327 
     328     
     329void 
     330Canvas::select_port_toggle(boost::shared_ptr<Port> p, int mod_state) 
     331{ 
     332    if ((mod_state & GDK_CONTROL_MASK)) { 
     333        if (p->selected()) 
     334            unselect_port(p); 
     335        else 
     336            select_port(p); 
     337    } else { 
     338        if (p->selected()) 
     339            unselect_ports(); 
     340        else 
     341            select_port(p, true); 
     342    } 
    314343} 
    315344 
     
    512541 
    513542 
     543void 
     544Canvas::selection_joined_with(boost::shared_ptr<Port> port) 
     545{ 
     546    for (SelectedPorts::iterator i = _selected_ports.begin(); i != _selected_ports.end(); ++i) 
     547        ports_joined(*i, port); 
     548} 
     549 
     550 
    514551/** Called when two ports are 'toggled' (connected or disconnected) 
    515552 */ 
     
    517554Canvas::ports_joined(boost::shared_ptr<Port> port1, boost::shared_ptr<Port> port2) 
    518555{ 
     556    if (port1 == port2) 
     557        return; 
     558 
    519559    assert(port1); 
    520560    assert(port2); 
     
    590630            } 
    591631        } else if (event->button.button == 3) { 
    592             _selected_port = port; 
     632            select_port(port, true); 
    593633            port->popup_menu(event->button.button, event->button.time); 
    594634        } else { 
     
    625665    case GDK_BUTTON_RELEASE: 
    626666        if (port_dragging) { 
    627             if (_connect_port == NULL) { 
    628                 selected_port(port); 
    629                 _connect_port = port; 
     667            if (_connect_port) { // dragging 
     668                ports_joined(port, _connect_port); 
     669                unselect_ports(); 
    630670            } else { 
    631                 ports_joined(port, _connect_port); 
    632                 _connect_port.reset(); 
    633                 selected_port(boost::shared_ptr<Port>()); 
     671                if (_last_selected_port && _last_selected_port->is_input() != port->is_input()) { 
     672                    selection_joined_with(port); 
     673                    unselect_ports(); 
     674                } else { 
     675                    select_port_toggle(port, event->button.state); 
     676                } 
    634677            } 
    635678            port_dragging = false; 
     
    643686 
    644687    case GDK_ENTER_NOTIFY: 
    645         if (!control_dragging && port != _selected_port) { 
     688        if (!control_dragging && !port->selected()) { 
    646689            port->set_highlighted(true); 
    647690            return true; 
     
    659702            port_dragging = false; 
    660703        } else if (!control_dragging) { 
    661             if (port != _selected_port) 
    662                 port->set_highlighted(false); 
     704            port->set_highlighted(false); 
    663705        } 
    664706        break; 
     
    911953                boost::shared_ptr<Module> m = p->module().lock(); 
    912954                if (m) { 
    913                     if (p != _selected_port) { 
     955                    if (!p->selected()) { 
    914956                        if (snapped_port) 
    915957                            snapped_port->set_highlighted(false); 
     
    9901032        if (p) { 
    9911033            if (p == _connect_port) {   // drag ended on same port it started on 
    992                 if (_selected_port == NULL) {  // no active port, just activate (hilite) it 
    993                     selected_port(_connect_port); 
     1034                if (_selected_ports.empty()) {  // no active port, just activate (hilite) it 
     1035                    select_port(_connect_port); 
    9941036                } else {  // there is already an active port, connect it with this one 
    995                     if (_selected_port != _connect_port) 
    996                         ports_joined(_selected_port, _connect_port); 
     1037                    selection_joined_with(_connect_port); 
    9971038                    unselect_ports(); 
    9981039                    _connect_port.reset(); 
  • flowcanvas/src/Port.cpp

    r1345 r1346  
    2626using namespace std; 
    2727 
     28#define SELECTED_COLOR 0xFF0000FF 
     29 
    2830namespace FlowCanvas { 
    2931     
     
    3941    , _is_input(is_input) 
    4042    , _color(color) 
     43    , _selected(false) 
    4144    , _control_value(0.0f) 
    4245    , _control_min(0.0f) 
     
    222225 
    223226void 
     227Port::set_selected(bool b) 
     228{ 
     229    _selected = b; 
     230    set_fill_color((b ? SELECTED_COLOR : _color)); 
     231} 
     232 
     233 
     234void 
    224235Port::set_highlighted(bool b, bool highlight_parent, bool highlight_connections, bool raise_connections) 
    225236{ 
     
    248259        _rect->property_outline_color_rgba() = _color + 0x33333300; 
    249260    } else { 
    250         _rect->property_fill_color_rgba() = _color; 
     261        _rect->property_fill_color_rgba() = (_selected ? SELECTED_COLOR : _color); 
    251262        _rect->property_outline_color_rgba() = _color; 
    252263    } 
Note: See TracChangeset for help on using the changeset viewer.