[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