From bd0e173efa596a9238dcf5837a723c84dfd3fd9b Mon Sep 17 00:00:00 2001 From: Ning Shi Date: Mon, 14 Jan 2008 10:57:09 +0800 Subject: [PATCH] Use a vector to hold selected nodes so that multiple selections are allowed. Use STL find to look up an element. --- gtk/src/tree_model.cpp | 51 ++++++++++++++++++++++++++++---------------------- gtk/src/tree_model.hpp | 3 ++- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/gtk/src/tree_model.cpp b/gtk/src/tree_model.cpp index 81449cb..c212b38 100644 --- a/gtk/src/tree_model.cpp +++ b/gtk/src/tree_model.cpp @@ -4,15 +4,6 @@ #include "tree_model.hpp" -bool is_ptr_equal(const Edge *i, const Edge *e) -{ - if (i == e) { - return true; - } - - return false; -} - TreeModel::TreeModel(GtkDrawingArea *cobject, Glib::RefPtr &glade) : Gtk::DrawingArea(cobject), @@ -23,7 +14,6 @@ TreeModel::TreeModel(GtkDrawingArea *cobject, _vscale(1), _alignment(NULL), _highlighted(NULL), - _selected(NULL), _dragging_node(NULL), _dragging_edge(NULL) { @@ -48,7 +38,7 @@ void TreeModel::clear(void) _hscale = 1; _vscale = 1; _highlighted = NULL; - _selected = NULL; + _selected.clear(); _dragging_node = NULL; _dragging_edge = NULL; } @@ -148,21 +138,25 @@ bool TreeModel::on_expose_event(GdkEventExpose *event) bool TreeModel::on_button_press_event(GdkEventButton *event) { - Vertex *v = NULL; + Node *n = NULL; Edge *e = NULL; + std::vector::const_iterator iter; gdouble x = _d2c_x(event->x); gdouble y = _d2c_y(event->y); - if ((v = _select(_source, x, y)) || - (v = _select(_target, x, y))) { - if (_selected && v != _selected) { - _selected->deselect(); + if ((n = _select(_source, x, y)) || + (n = _select(_target, x, y)) || + (n = _select(_nodes, x, y))) { + iter = std::find(_selected.begin(), _selected.end(), n); + + if (!_selected.empty() && iter == _selected.end()) { + _clear_selected(); } - _selected = v; - _dragging_node = v; + _selected.push_back(n); + _dragging_node = n; - _word_selected_signal.emit(v->get_word()); + _word_selected_signal.emit(dynamic_cast(n)->get_word()); } else if ((e = _drag(_edges, x, y))) { _dragging_edge = e; } @@ -261,9 +255,7 @@ bool TreeModel::on_key_release_event(GdkEventKey *event) if (event->keyval == GDK_Delete) { if (_highlighted) { - iter = std::find_if(_edges.begin(), _edges.end(), - std::bind2nd(std::ptr_fun(is_ptr_equal), - _highlighted)); + iter = std::find(_edges.begin(), _edges.end(), _highlighted); if (iter != _edges.end()) { _edges.erase(iter); @@ -302,6 +294,21 @@ void TreeModel::_clear_edges(std::vector &edges) edges.clear(); } +void TreeModel::_clear_selected(void) +{ + std::vector::iterator iter; + + if (_selected.empty()) { + return; + } + + for (iter = _selected.begin(); iter != _selected.end(); iter++) { + (*iter)->deselect(); + } + + _selected.clear(); +} + void TreeModel::_add_source(void) { std::vector &words = _alignment->get_source().get_words(); diff --git a/gtk/src/tree_model.hpp b/gtk/src/tree_model.hpp index 62a16ce..20edb6b 100644 --- a/gtk/src/tree_model.hpp +++ b/gtk/src/tree_model.hpp @@ -35,6 +35,7 @@ protected: private: void _clear_vertices(std::vector &vertices); void _clear_edges(std::vector &edges); + void _clear_selected(void); void _add_source(void); void _add_target(void); void _add_word(Word &word, bool source); @@ -75,7 +76,7 @@ private: std::vector _nodes; std::vector _edges; Drawable *_highlighted; - Node *_selected; + std::vector _selected; Node *_dragging_node; Edge *_dragging_edge; }; -- 2.11.4.GIT