summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext/selector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/gtkmm2ext/selector.cc')
-rw-r--r--libs/gtkmm2ext/selector.cc238
1 files changed, 238 insertions, 0 deletions
diff --git a/libs/gtkmm2ext/selector.cc b/libs/gtkmm2ext/selector.cc
new file mode 100644
index 0000000000..371c946fe7
--- /dev/null
+++ b/libs/gtkmm2ext/selector.cc
@@ -0,0 +1,238 @@
+/*
+ Copyright (C) 1999 Paul Barton-Davis
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ $Id$
+*/
+
+#include <algorithm>
+#include <functional>
+#include <vector>
+#include <string>
+
+#include <gtkmm2ext/selector.h>
+#include <gtkmm2ext/utils.h>
+#include <pbd/pathscanner.h>
+#include <pbd/error.h>
+
+using namespace std;
+using namespace Gtkmm2ext;
+
+Selector::Selector (void (*func)(Glib::RefPtr<Gtk::ListStore>, void *), void *arg,
+ vector<string> titles)
+{
+ scroll.add (tview);
+ scroll.set_policy (Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
+
+ pack_start (scroll, true, true);
+
+ vector<string>::iterator i;
+ for (i = titles.begin(); i != titles.end(); ++i) {
+ Gtk::TreeModelColumn<Glib::ustring> title;
+ column_records.add(title);
+ }
+
+ lstore = Gtk::ListStore::create(column_records);
+ tview.set_model(lstore);
+
+ update_contents.connect(mem_fun(*this,&Selector::rescan));
+
+ tview.show ();
+
+ refiller = func;
+ refill_arg = arg;
+ selected_row = -1;
+ selected_column = -1;
+}
+
+Selector::~Selector ()
+
+{
+ /* ensure that any row data set with set_row_data_full() is deleted */
+ hide_all ();
+ lstore.clear ();
+}
+
+void
+Selector::on_map()
+
+{
+ Gtk::VBox::on_map ();
+
+ selected_row = -1;
+ selected_column = -1;
+ refill();
+}
+
+void
+Selector::on_show()
+{
+ VBox::on_show();
+
+ rescan();
+}
+
+void
+Selector::reset (void (*func)(Glib::RefPtr<Gtk::ListStore>, void *), void *arg)
+
+{
+ refiller = func;
+ refill_arg = arg;
+ selected_row = -1;
+ selected_column = -1;
+
+ refill();
+}
+
+void
+Selector::refill ()
+
+{
+ if (refiller) {
+ lstore.clear ();
+ refiller (lstore, refill_arg);
+ }
+}
+
+gint
+Selector::_accept (gpointer arg)
+
+{
+ ((Selector *) arg)->accept ();
+ return FALSE;
+}
+
+gint
+Selector::_chosen (gpointer arg)
+
+{
+ ((Selector *) arg)->chosen ();
+ return FALSE;
+}
+
+gint
+Selector::_shift_clicked (gpointer arg)
+{
+ ((Selector *) arg)->shift_clicked ();
+ return FALSE;
+}
+
+gint
+Selector::_control_clicked (gpointer arg)
+{
+ ((Selector *) arg)->control_clicked ();
+ return FALSE;
+}
+
+void
+Selector::accept ()
+{
+ Glib::RefPtr<Gtk::TreeSelection> tree_sel = tview.get_selection();
+ Gtk::TreeModel::iterator iter = tree_sel->get_selected();
+
+ if (iter) {
+ selection_made (tview, tree_sel);
+ } else {
+ cancel ();
+ }
+}
+
+void
+Selector::chosen ()
+
+{
+ Glib::RefPtr<Gtk::TreeSelection> tree_sel = tview.get_selection();
+ Gtk::TreeModel::iterator iter = tree_sel->get_selected();
+
+ if (iter) {
+ choice_made (tview, tree_sel);
+ } else {
+ cancel ();
+ }
+}
+
+void
+Selector::shift_clicked ()
+
+{
+ Glib::RefPtr<Gtk::TreeSelection> tree_sel = tview.get_selection();
+ Gtk::TreeModel::iterator iter = tree_sel->get_selected();
+
+ if (iter) {
+ shift_made (tview, tree_sel);
+ } else {
+ cancel ();
+ }
+}
+
+void
+Selector::control_clicked ()
+
+{
+ Glib::RefPtr<Gtk::TreeSelection> tree_sel = tview.get_selection();
+ Gtk::TreeModel::iterator iter = tree_sel->get_selected();
+
+ if (iter) {
+ control_made (tview, tree_sel);
+ } else {
+ cancel ();
+ }
+}
+
+void
+Selector::cancel ()
+
+{
+ Glib::RefPtr<Gtk::TreeSelection> tree_sel = tview.get_selection();
+ tree_sel->unselect_all();
+
+ selection_made (tview, tree_sel);
+}
+
+void
+Selector::rescan ()
+
+{
+ selected_row = -1;
+ selected_column = -1;
+ refill ();
+ show_all ();
+}
+
+struct string_cmp {
+ bool operator()(const string* a, const string* b) {
+ return *a < *b;
+ }
+};
+
+bool
+TreeView_Selector::on_button_press_event(GdkEventButton* ev)
+{
+ bool return_value = TreeView::on_button_press_event(ev);
+
+ if (ev && (ev->type == GDK_BUTTON_RELEASE || ev->type == GDK_2BUTTON_PRESS)) {
+ if (ev->state & Gdk::CONTROL_MASK) {
+ gtk_idle_add (Selector::_control_clicked, this);
+ } else if (ev->state & Gdk::SHIFT_MASK) {
+ gtk_idle_add (Selector::_shift_clicked, this);
+ } else if (ev->type == GDK_2BUTTON_PRESS) {
+ gtk_idle_add (Selector::_accept, this);
+ } else {
+ gtk_idle_add (Selector::_chosen, this);
+ }
+ }
+
+ return return_value;
+}