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

Enrico Zini enrico at alioth.debian.org
Mon Oct 30 22:25:57 CET 2006


Author: enrico
Date: Mon Oct 30 22:25:57 2006
New Revision: 2034

Modified:
   debtags-edit/1.2/   (props changed)
   debtags-edit/1.2/debian/changelog
   debtags-edit/1.2/src/DebtagsEditor.cc
   debtags-edit/1.2/src/DebtagsEditor.h
   debtags-edit/1.2/src/TagEditor.cc
   debtags-edit/1.2/src/TagEditor.h
Log:
 r3572 at viaza:  enrico | 2006-10-30 22:25:32 +0100
 Use a list for the current tags
 Do not show add tag menu when no package is selected


Modified: debtags-edit/1.2/debian/changelog
==============================================================================
--- debtags-edit/1.2/debian/changelog	(original)
+++ debtags-edit/1.2/debian/changelog	Mon Oct 30 22:25:57 2006
@@ -1,8 +1,11 @@
 debtags-edit (1.1.4) unstable; urgency=low
 
   * Ported to libept.  Closes: bug#356001, bug#391575.
+  * Do not show tag add menu when no packages are selected.
+    Closes: bug#294678.
+  * Show current tags in a list.  Closes: bug#317883.
 
- -- Enrico Zini <enrico at debian.org>  Mon, 30 Oct 2006 20:23:41 +0100
+ -- Enrico Zini <enrico at debian.org>  Mon, 30 Oct 2006 22:18:58 +0100
 
 debtags-edit (1.1.3) unstable; urgency=low
 

Modified: debtags-edit/1.2/src/DebtagsEditor.cc
==============================================================================
--- debtags-edit/1.2/src/DebtagsEditor.cc	(original)
+++ debtags-edit/1.2/src/DebtagsEditor.cc	Mon Oct 30 22:25:57 2006
@@ -65,8 +65,10 @@
 	dataArea.append_page(*scr, "Description");
 	dataArea.append_page(rpanel, "Related");
 
-	rvbox->pack_start(tagEditor, Gtk::PACK_SHRINK);
-	rvbox->pack_start(dataArea, Gtk::PACK_EXPAND_WIDGET);
+	rvbox->pack_start(mainVPaned, Gtk::PACK_EXPAND_WIDGET);
+
+	mainVPaned.add1(tagEditor);
+	mainVPaned.add2(dataArea);
 
 	fpanel.signal_selected().connect(
 			sigc::mem_fun(doc, &DOC::setCurrent));

Modified: debtags-edit/1.2/src/DebtagsEditor.h
==============================================================================
--- debtags-edit/1.2/src/DebtagsEditor.h	(original)
+++ debtags-edit/1.2/src/DebtagsEditor.h	Mon Oct 30 22:25:57 2006
@@ -69,6 +69,7 @@
 
 	FilterPanel<DOC> fpanel;
 	Gtk::HPaned mainHPaned;
+	Gtk::VPaned mainVPaned;
 	TagEditor<DOC> tagEditor;
 
 	//TagPanel leftTagPanel;

Modified: debtags-edit/1.2/src/TagEditor.cc
==============================================================================
--- debtags-edit/1.2/src/TagEditor.cc	(original)
+++ debtags-edit/1.2/src/TagEditor.cc	Mon Oct 30 22:25:57 2006
@@ -29,17 +29,6 @@
 
 using namespace std;
 using namespace wibble::operators;
-//using namespace Tagcoll;
-
-//template class TagEditor<DebtagsDocument>;
-
-/*
-template<class DOC>
-void TagEditor<DOC>::do_changed()
-{
-	_signal_changed.emit();
-}
-*/
 
 template<class DOC>
 void TagEditor<DOC>::do_add_tag(Tag tag)
@@ -58,12 +47,15 @@
 {
 	if (e->type == GDK_BUTTON_PRESS)
 	{
-		TagMenu<DOC>* addMenu = manage(new TagMenu<DOC>());
-		addMenu->populateUnselected(doc, doc.currentTags());
-		addMenu->signal_selected().connect(
-					sigc::mem_fun(*this, &TagEditor<DOC>::on_add_to_selection));
-		addMenu->popup(e->button.button, e->button.time);
-		return true;
+		if (doc.current() != Package())
+		{
+			TagMenu<DOC>* addMenu = manage(new TagMenu<DOC>());
+			addMenu->populateUnselected(doc, doc.currentTags());
+			addMenu->signal_selected().connect(
+						sigc::mem_fun(*this, &TagEditor<DOC>::on_add_to_selection));
+			addMenu->popup(e->button.button, e->button.time);
+			return true;
+		}
 	}
 	return false;
 }
@@ -167,64 +159,124 @@
 }
 
 template<class DOC>
-TagEditor<DOC>::TagEditor(DOC& doc)
-	: doc(doc), table(0)
+bool TagEditor<DOC>::on_event_from_list(GdkEvent* e)
 {
-	//set_shadow_type(Gtk::SHADOW_NONE);
+	if (e->type == GDK_BUTTON_PRESS && e->button.button == 3)
+	{
+		Gtk::TreeModel::Path path;
+		Gtk::TreeViewColumn* column;
+		int cell_x, cell_y;
+		if (itemList.get_path_at_pos(
+				(int)e->button.x, (int)e->button.y,
+				path, column,
+				cell_x, cell_y))
+		{
+			// Clicked on an item
+			debug("Cell %d, %d\n", cell_x, cell_y);
 
-	updateView();
+			Gtk::TreeModel::Row row = *itemListModel->get_iter(path);
+			Tag tag = row[itemListModelColumns.tag];
+			
+			debug("Tag: %s\n", tag.fullname().c_str());
 
-	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);
-	*/
+			Glib::RefPtr<Gtk::TreeSelection> sel = itemList.get_selection();
+			int rows = sel->count_selected_rows();
 
-	//add(table);
+			this->itemPopup.items().clear();
 
-	//Only show the scrollbars when they are necessary
-	//set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+			debug("%d selected rows\n");
 
-	/*
-	// 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;
+			if (rows == 1)
+			{
+#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(*this, &TagEditor<DOC>::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
+
+			this->itemPopup.popup(e->button.button, e->button.time);
+
+			return true;
+		} else {
+			// Clicked outside
+			warning("itemList.get_path_at_pos failed\n");
+			return false;
+		}
 	}
+	return false;
+}
+
+template<class DOC>
+TagEditor<DOC>::TagEditor(DOC& doc)
+	: doc(doc)
+{
+	// 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);
+
+	// Create the Tree model
+	itemListModel = Gtk::ListStore::create(itemListModelColumns);
+	itemList.set_model(itemListModel);
+	itemList.add_events(Gdk::BUTTON_PRESS_MASK);
+	itemList.signal_event().connect(sigc::mem_fun(*this, &TagEditor<DOC>::on_event_from_list));
 
 	// 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);
-	*/
+	itemList.append_column("Tag", itemListModelColumns.desc);
+
+	pack_start(scrolledItemList, true, true);
+
+	Gtk::Button* titleAdd = manage(new Gtk::Button("Add"));
+	pack_start(*titleAdd, false, false);
+	titleAdd->add_events(Gdk::BUTTON_PRESS_MASK);
+	titleAdd->signal_event().connect(sigc::mem_fun(*this, &TagEditor<DOC>::on_titleAdd_event));
+
+	updateView();
+
+	//Only show the scrollbars when they are necessary
+	//set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
 
 	doc.signal_changed().connect(sigc::mem_fun(*this, &TagEditor<DOC>::on_changed));
 	doc.signal_reselected().connect(sigc::mem_fun(*this, &TagEditor<DOC>::on_changed));
@@ -238,15 +290,6 @@
 	selection_data.set(selection_data.get_target(), 8, (const guchar*)fullname.data(), fullname.size());
 }
 
-/*
-template<class DOC>
-void TagEditor<DOC>::setSelected(const TagSet& tagset) throw ()
-{
-	_selected = tagset;
-	updateView();
-}
-*/
-
 template<class DOC>
 void TagEditor<DOC>::updateView()
 {
@@ -254,12 +297,7 @@
 
 	std::set<Tag> _selected = doc.currentTags();
 
-	if (table)
-	{
-		tableBox.remove(*table);
-		delete table;
-	}
-
+#if 0
 	if (doc.current() == typename DOC::Package())
 	{
 		table = new Gtk::Table(1, 1);
@@ -270,159 +308,23 @@
 		table->show_all_children(true);
 		return;
 	}
+#endif
 
-	//table.children().clear();
-
-	// Create the facet/tag hierarchy
-	int facets = 0, tags = 0;
-	std::map< Facet, std::set<Tag> > contents;
+	itemListModel->clear();
+	cerr << "Adding" << endl;
     for (typename std::set<Tag>::const_iterator i = _selected.begin(); i != _selected.end(); i++)
 	{
-//		fprintf(stderr, "Tag %.*s facet %.*s name %.*s\n",
-//				PFSTR(i->fullname()), PFSTR(i->facet().name()), PFSTR(i->name()));
-		typename std::map< Facet, std::set<Tag> >::iterator j = contents.find(i->facet());
-		if (j != contents.end())
-		{
-			j->second |= *i;
-			++tags;
-		}
-		else
-		{
-			std::set<Tag> v;
-			v |= *i;
-			contents.insert(pair< Facet, std::set<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 (typename std::map< Facet, std::set<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() + "] " + i->first.shortDescription(), 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<Facet>(
-				sigc::mem_fun(*this, &TagEditor<DOC>::on_facetAdd_event),
-				i->first));
-
-		++row;
-		
-		for (typename std::set<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<Tag>(
-						sigc::mem_fun(*this, &TagEditor<DOC>::on_del_from_selection),
-						*j));
-
-			Gtk::Label* tag = manage(new Gtk::Label("[" + j->name() + "] " + j->shortDescription(), 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<Tag>(
-					sigc::mem_fun(*this, &TagEditor<DOC>::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<Tag>(
-						sigc::mem_fun(*this, &TagEditor<DOC>::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, &TagEditor<DOC>::on_titleAdd_event));
-	//titleAdd->signal_clicked().connect(
-			//SigC::slot(*this, &TagcollEditor<DOC>::on_titleAdd_clicked));
-
-	Gtk::Button* titleAdd = manage(new Gtk::Button("Add"));
-	table->attach(*titleAdd, 0, 3, row, row+1, Gtk::SHRINK);
-	titleAdd->add_events(Gdk::BUTTON_PRESS_MASK);
-	titleAdd->signal_event().connect(sigc::mem_fun(*this, &TagEditor<DOC>::on_titleAdd_event));
-
-	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;
-		//}
-	}
-
-	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;
-		}
-	}
-
-	unavailableTagListModel->clear();
-	for (OpSet<string>::const_iterator i = unavl.begin(); i != unavl.end(); i++)
-	{
-		if (filter.empty() || i->find(filter) != string::npos)
+		if (*i != Tag())
 		{
-			row = *(unavailableTagListModel->append());
-			row[tagListModelColumns.tag] = *i;
+			cerr << "Add: " << i->fullname() << endl;
+			Gtk::TreeModel::Row row;
+			row = *(itemListModel->append());
+			row[itemListModelColumns.tag] = *i;
+			row[itemListModelColumns.desc] =
+				"[" + i->fullname() + "] " +
+				i->facet().shortDescription() + " :: " + i->shortDescription();
 		}
 	}
-*/
 
 	time_t end = time(NULL);
 	if (end != start)

Modified: debtags-edit/1.2/src/TagEditor.h
==============================================================================
--- debtags-edit/1.2/src/TagEditor.h	(original)
+++ debtags-edit/1.2/src/TagEditor.h	Mon Oct 30 22:25:57 2006
@@ -24,6 +24,9 @@
 #include <gtkmm/scrolledwindow.h>
 #include <gtkmm/box.h>
 #include <gtkmm/table.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/liststore.h>
+#include <gtkmm/menu.h>
 
 template<class DOC>
 class TagEditor : public Gtk::VBox
@@ -31,6 +34,7 @@
 protected:
 	typedef typename DOC::Facet Facet;
 	typedef typename DOC::Tag Tag;
+	typedef typename DOC::Package Package;
 
 public:
 	//typedef SigC::Signal0<void> type_signal_changed;
@@ -39,12 +43,24 @@
 
 protected:
 	DOC& doc;
-
-	//Debtags::TagSet _selected;
 	
-	Gtk::Table* table;
-	Gtk::VBox tableBox;
-	Gtk::VBox tagVBox;
+	Gtk::Menu itemPopup;
+
+	Gtk::TreeView itemList;
+	Gtk::ScrolledWindow scrolledItemList;
+	Glib::RefPtr<Gtk::ListStore> itemListModel;
+
+	// Tree model columns
+	class ItemListModelColumns : public Gtk::TreeModel::ColumnRecord
+	{
+	public:
+		ItemListModelColumns() { add(tag); add(desc); }
+
+		Gtk::TreeModelColumn<Tag> tag;
+		Gtk::TreeModelColumn<Glib::ustring> desc;
+	};
+
+	ItemListModelColumns itemListModelColumns;
 
 	//type_signal_changed _signal_changed;
 	type_signal_add_tag _signal_add_tag;
@@ -57,6 +73,7 @@
 	bool on_tag_popup_event(GdkEvent* e, Tag tag);
 	void on_add_to_selection(Tag tag);
 	void on_del_from_selection(Tag tag);
+	bool on_event_from_list(GdkEvent* e);
 
 	void on_changed();
 



More information about the Debtags-commits mailing list