[Debtags-commits] [svn] r2041 - in debtags-edit/1.2: . src

Enrico Zini enrico at alioth.debian.org
Wed Nov 1 02:09:20 CET 2006


Author: enrico
Date: Wed Nov  1 02:09:19 2006
New Revision: 2041

Modified:
   debtags-edit/1.2/   (props changed)
   debtags-edit/1.2/src/TagSelector.cc
   debtags-edit/1.2/src/TagSelector.h
Log:
 r3588 at viaza:  enrico | 2006-11-01 02:08:50 +0100
 Use TagsetList also in TagSelector


Modified: debtags-edit/1.2/src/TagSelector.cc
==============================================================================
--- debtags-edit/1.2/src/TagSelector.cc	(original)
+++ debtags-edit/1.2/src/TagSelector.cc	Wed Nov  1 02:09:19 2006
@@ -30,7 +30,64 @@
 
 using namespace std;
 using namespace wibble::operators;
-//using namespace Tagcoll;
+
+bool TagSelector::TagList::fillMenu(const Tag& tag, const std::set<Tag>& selected)
+{
+	if (tag == Tag())
+		return false;
+
+	if (selected.size() < 2)
+	{
+#if 0
+		this->itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Select this tag",
+					sigc::bind< Tag >(
+						sigc::mem_fun(*this, &TagEditor<DOC>::do_signal_select_tag), tag)));
+#endif
+		this->itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Delete this tag",
+					sigc::bind< Tag >(
+						sigc::mem_fun(ts, &TagSelector::on_del_from_selection), tag)));
+	}
+	else
+	{
+#if 0
+		// TODO: build the tag set with all the selected tags
+		this->itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Merge",
+					sigc::mem_fun(*this, &ItemList::do_signal_request_tagset_merge)));
+		this->itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Intersect",
+					sigc::mem_fun(*this, &ItemList::do_signal_request_tagset_intersect)));
+#endif
+	}
+#if 0
+	this->itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Copy to other panel",
+				sigc::mem_fun(*this, &ItemList::do_signal_request_item_copy)));
+	this->itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Move to other panel",
+				sigc::mem_fun(*this, &ItemList::do_signal_request_item_move)));
+#endif
+
+#if 0
+	TagMenu<TagcollDocument<string> >* addMenu = new TagMenu<TagcollDocument<string> >();
+	addMenu->set_manage();
+	addMenu->populateUnselected(doc, ts);
+	string stag = tag;
+	addMenu->signal_selected().connect(
+				sigc::mem_fun(*this, &ItemList::on_add_tag));
+	itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("_Add...", *addMenu));
+#endif	
+
+#if 0
+	if (!ts.empty())
+	{
+		itemPopup.items().push_back(Gtk::Menu_Helpers::SeparatorElem());
+		for (TagSet::const_iterator i = ts.begin();
+				i != ts.end(); i++)
+			itemPopup.items().push_back(Gtk::Menu_Helpers::MenuElem("Remove " + i->fullname(),
+				sigc::bind<Tag>(
+					sigc::mem_fun(*this, &ItemList::on_remove_tag), *i)));
+	}
+#endif
+
+	return true;
+}
 
 void TagSelector::do_changed()
 {
@@ -118,187 +175,16 @@
 }
 
 TagSelector::TagSelector(DebtagsDocument& doc)
-	: doc(doc), table(0)
+	: doc(doc), itemList(doc, *this)
 {
-	//set_shadow_type(Gtk::SHADOW_NONE);
-
-	updateView();
-
-	pack_start(tableBox, false, true);
-	pack_start(*manage(new Gtk::Label("")), true, true);
-	/*
-	Gtk::VBox* vbox = manage(new Gtk::VBox());
-	vbox->pack_start(tableBox, false, true);
-	vbox->pack_start(*manage(new Gtk::Label("CIPS")), true, true);
-	add(*vbox);
-	*/
-
-	//add(table);
-
-	//Only show the scrollbars when they are necessary
-	//set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
-
-	/*
-	// Create the Tree models
-	selectedTagListModel = Gtk::ListStore::create(tagListModelColumns);
-	availableTagListModel = Gtk::ListStore::create(tagListModelColumns);
-	unavailableTagListModel = Gtk::ListStore::create(tagListModelColumns);
-
-	selectedTagList.set_model(selectedTagListModel);
-	availableTagList.set_model(availableTagListModel);
-	unavailableTagList.set_model(unavailableTagListModel);
-	*/
-
-	// Initially fill the available list with all tags
-	/*
-	Gtk::TreeModel::Row row;
-	
-	allTags = doc.collection().getAllTags();
-
-	for (OpSet<string>::const_iterator i = allTags.begin(); i != allTags.end(); i++)
-	{
-		row = *(availableTagListModel->append());
-		row[tagListModelColumns.tag] = *i;
-	}
-
-	// Add the view columns
-	selectedTagList.append_column("Selected", tagListModelColumns.tag);
-	availableTagList.append_column("Available", tagListModelColumns.tag);
-	unavailableTagList.append_column("Unavailable", tagListModelColumns.tag);
-
-	// Setup the lists as drag sources
-	std::list<Gtk::TargetEntry> listTargets;
-	listTargets.push_back(Gtk::TargetEntry("TAG"));
-	listTargets.push_back(Gtk::TargetEntry("text/plain"));
-
-	selectedTagList.drag_source_set(listTargets, Gdk::ModifierType(GDK_BUTTON1_MASK), Gdk::ACTION_COPY);
-	availableTagList.drag_source_set(listTargets, Gdk::ModifierType(GDK_BUTTON1_MASK), Gdk::ACTION_COPY);
-	unavailableTagList.drag_source_set(listTargets, Gdk::ModifierType(GDK_BUTTON1_MASK), Gdk::ACTION_COPY);
-	*/
-
-	doc.signal_changed().connect(sigc::mem_fun(*this, &TagSelector::on_document_changed));
-}
-
-void TagSelector::on_selectedTagList_drag_data_get(
-		const Glib::RefPtr<Gdk::DragContext>&, Gtk::SelectionData& selection_data, guint, guint, DebtagsDocument::Tag tag)
-{
-	string stag = tag.fullname();
-	selection_data.set(selection_data.get_target(), 8, (const guchar*)stag.data(), stag.size());
-}
-
-void TagSelector::updateView()
-{
-	time_t start = time(NULL);
-
-	if (table)
-	{
-		tableBox.remove(*table);
-		delete table;
-	}
-	//table.children().clear();
-
-	// Create the facet/tag hierarchy
-	int facets = 0, tags = 0;
-	std::map<DebtagsDocument::Facet, std::vector<DebtagsDocument::Tag> > contents;
-    for (std::set<DebtagsDocument::Tag>::const_iterator i = _selected.begin(); i != _selected.end(); i++)
-	{
-		std::map<DebtagsDocument::Facet, vector<DebtagsDocument::Tag> >::iterator j = contents.find(i->facet());
-		if (j != contents.end())
-		{
-			j->second.push_back(*i);
-			tags++;
-		}
-		else
-		{
-			std::vector<DebtagsDocument::Tag> v;
-			v.push_back(*i);
-			contents.insert(pair<DebtagsDocument::Facet, vector<DebtagsDocument::Tag> >(i->facet(), v));
-			facets++;
-			tags++;
-		}
-	}
-
-	// Resize the table to fit everything
-	//printf("Resized: %dx%d\n", facets+tags+1, 4);
-	//table.resize(facets + tags + 1, 4);
-	table = new Gtk::Table(facets + tags + 1, 3);
-	tableBox.pack_start(*table);
-
-	// Setup the lists as drag sources
-	std::list<Gtk::TargetEntry> listTargets;
-	listTargets.push_back(Gtk::TargetEntry("TAG"));
-	listTargets.push_back(Gtk::TargetEntry("text/plain"));
-
-	// Add facets and tags
-	int row = 0;
-	for (std::map<DebtagsDocument::Facet, std::vector<DebtagsDocument::Tag> >::const_iterator i = contents.begin(); i != contents.end(); i++)
-	{
-		//printf("Add facet: %.*s\n", PFSTR(i->first));
-
-		Gtk::Button* delFacet = manage(new Gtk::Button("-"));
-		table->attach(*delFacet, 0, 1, row, row + 1, Gtk::SHRINK);
-
-		Gtk::Label* facet = manage(new Gtk::Label(i->first.name().size() ? i->first.name() : "(legacy)", Gtk::ALIGN_LEFT));
-		table->attach(*facet, 1, 2, row, row + 1);
-		int px, py;
-		facet->get_padding(px, py);
-		facet->set_padding(4, py);
-
-		Gtk::Button* addTag = manage(new Gtk::Button("+"));
-		table->attach(*addTag, 2, 3, row, row + 1, Gtk::SHRINK);
-		addTag->add_events(Gdk::BUTTON_PRESS_MASK);
-		addTag->signal_event().connect(sigc::bind<DebtagsDocument::Facet>(
-				sigc::mem_fun(*this, &TagSelector::on_facetAdd_event),
-				i->first));
-
-		++row;
-		
-		for (vector<DebtagsDocument::Tag>::const_iterator j = i->second.begin(); j != i->second.end(); j++)
-		{
-			//printf("Add tag: %.*s\n", PFSTR(*j));
-			//table->attach(*manage(new Gtk::Label("")), 0, 1, row, row+1, Gtk::SHRINK);
-
-			Gtk::Button* delTag = manage(new Gtk::Button("-"));
-			table->attach(*delTag, 0, 1, row, row + 1, Gtk::SHRINK);
-			delTag->signal_clicked().connect(sigc::bind<DebtagsDocument::Tag>(
-						sigc::mem_fun(*this, &TagSelector::on_del_from_selection),
-						*j));
-
-			Gtk::Label* tag = manage(new Gtk::Label(j->name(), Gtk::ALIGN_LEFT));
-			int px, py;
-			tag->get_padding(px, py);
-			tag->set_padding(14, py);
-			Gtk::EventBox* ebox = manage(new Gtk::EventBox());
-			ebox->add(*tag);
-			ebox->add_events(Gdk::BUTTON_PRESS_MASK);
-			ebox->signal_event().connect(sigc::bind<DebtagsDocument::Tag>(
-					sigc::mem_fun(*this, &TagSelector::on_tag_popup_event),
-					*j));
-			//ebox->drag_source_set(listTargets, Gdk::ModifierType(GDK_BUTTON1_MASK), Gdk::ACTION_COPY);
-			ebox->drag_source_set(listTargets);
-			ebox->signal_drag_data_get().connect(sigc::bind<DebtagsDocument::Tag>(
-						sigc::mem_fun(*this, &TagSelector::on_selectedTagList_drag_data_get),
-						*j));
-
-			table->attach(*ebox, 1, 3, row, row + 1);
-			
-			++row;
-		}
-	}
-
-	// Create the title
-	//Gtk::Label* title = manage(new Gtk::Label("Selected"));
-	////table->attach(*title, 0, 2, 0, 1);
-	
-	//Gtk::Button* titleAdd = manage(new Gtk::Button("+"));
-	//table->attach(*titleAdd, 2, 3, 0, 1, Gtk::SHRINK);
-	//titleAdd->add_events(Gdk::BUTTON_PRESS_MASK);
-	//titleAdd->signal_event().connect(SigC::slot(*this, &TagSelector::on_titleAdd_event));
-	//titleAdd->signal_clicked().connect(
-			//SigC::slot(*this, &TagcollEditor::on_titleAdd_clicked));
+	// Add the TreeView, inside a ScrolledWindow
+	scrolledItemList.add(itemList);
+	// Only show the scrollbars when they are necessary:
+	scrolledItemList.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+	pack_start(scrolledItemList, true, true);
 
 	Gtk::HBox* hbox = manage(new Gtk::HBox());
-	table->attach(*hbox, 0, 3, row, row+1);
+	pack_start(*hbox, false, false);
 
 	AddButton<DebtagsDocument>* add = newAddAllButton(doc, *this, "Add");
 	manage(add);
@@ -315,50 +201,21 @@
 	hbox->pack_start(*addR, true, true);
 	addR->signal_selected().connect(sigc::mem_fun(*this, &TagSelector::on_add_to_selection));
 
-	table->show();
-	table->show_all_children(true);
-
-/*
-	OpSet<string> companions = doc.collection().getCompanionTags(_selected);
-	OpSet<string> unavl = allTags - _selected - companions;
-
-	Gtk::TreeModel::Row row;
-
-	selectedTagListModel->clear();
-	for (OpSet<string>::const_iterator i = _selected.begin(); i != _selected.end(); i++)
-	{
-		// Selected tags remain unfiltered, to avoid loosing the operating context
-		//if (filter.empty() || i->find(filter) != string::npos)
-		//{
-			row = *(selectedTagListModel->append());
-			row[tagListModelColumns.tag] = *i;
-		//}
-	}
+	updateView();
 
-	availableTagListModel->clear();
-	for (OpSet<string>::const_iterator i = companions.begin(); i != companions.end(); i++)
-	{
-		if (filter.empty() || i->find(filter) != string::npos)
-		{
-			row = *(availableTagListModel->append());
-			row[tagListModelColumns.tag] = *i;
-		}
-	}
+	doc.signal_changed().connect(sigc::mem_fun(*this, &TagSelector::on_document_changed));
+}
 
-	unavailableTagListModel->clear();
-	for (OpSet<string>::const_iterator i = unavl.begin(); i != unavl.end(); i++)
-	{
-		if (filter.empty() || i->find(filter) != string::npos)
-		{
-			row = *(unavailableTagListModel->append());
-			row[tagListModelColumns.tag] = *i;
-		}
-	}
-*/
+void TagSelector::on_selectedTagList_drag_data_get(
+		const Glib::RefPtr<Gdk::DragContext>&, Gtk::SelectionData& selection_data, guint, guint, DebtagsDocument::Tag tag)
+{
+	string stag = tag.fullname();
+	selection_data.set(selection_data.get_target(), 8, (const guchar*)stag.data(), stag.size());
+}
 
-	time_t end = time(NULL);
-	if (end != start)
-		fprintf(stderr, "TagSelector::updateList: %ld seconds\n", (end-start));
+void TagSelector::updateView()
+{
+	itemList.display(_selected);
 }
 
 #include "TagMenu.tcc"

Modified: debtags-edit/1.2/src/TagSelector.h
==============================================================================
--- debtags-edit/1.2/src/TagSelector.h	(original)
+++ debtags-edit/1.2/src/TagSelector.h	Wed Nov  1 02:09:19 2006
@@ -23,8 +23,8 @@
 
 #include <gtkmm/scrolledwindow.h>
 #include <gtkmm/box.h>
-#include <gtkmm/table.h>
 #include "DebtagsDocument.h"
+#include "TagsetList.h"
 
 class TagSelector : public Gtk::VBox
 {
@@ -39,13 +39,30 @@
 	typedef SigC::Signal1<void, DebtagsDocument::Tag> type_signal_remove_tag;
 
 protected:
+	class TagList : public TagsetList<DebtagsDocument>
+	{
+	protected:
+		// Format the tag description from a tag
+		virtual std::string format(const Tag& tag)
+		{
+			return tag.fullname();
+		}
+
+		virtual bool fillMenu(const Tag& tag, const std::set<Tag>& selected);
+
+		DebtagsDocument& doc;
+		TagSelector& ts;
+
+	public:
+		TagList(DebtagsDocument& doc, TagSelector& ts) : doc(doc), ts(ts) {}
+	};
+
 	DebtagsDocument& doc;
 
 	std::set<DebtagsDocument::Tag> _selected;
 	
-	Gtk::Table* table;
-	Gtk::VBox tableBox;
-	Gtk::VBox tagVBox;
+	TagList itemList;
+	Gtk::ScrolledWindow scrolledItemList;
 
 	type_signal_changed _signal_changed;
 	type_signal_add_tag _signal_add_tag;



More information about the Debtags-commits mailing list