[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