diff options
Diffstat (limited to 'src/groupview.h')
-rw-r--r-- | src/groupview.h | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/groupview.h b/src/groupview.h new file mode 100644 index 0000000..4ead256 --- /dev/null +++ b/src/groupview.h @@ -0,0 +1,198 @@ +/*************************************************************************** + copyright : (C) 2001-2006 by Robby Stephenson + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#ifndef GROUPVIEW_H +#define GROUPVIEW_H + +#include "gui/listview.h" +#include "observer.h" + +#include <qdict.h> +#include <qpixmap.h> + +namespace Tellico { + namespace Data { + class EntryGroup; + } + class Filter; + class EntryGroupItem; + class GroupIterator; + +/** + * The GroupView shows the entries grouped, as well as the saved filters. + * + * There is one root item for each collection in the document. The entries are grouped + * by the field defined by each collection. A @ref QDict is used to keep track of the + * group items. + * + * @see Tellico::Data::Collection + * + * @author Robby Stephenson + */ +class GroupView : public GUI::ListView, public Observer { +Q_OBJECT + +public: + /** + * The constructor sets up the single column, and initializes the popup menu. + * + * @param parent A pointer to the parent widget + * @param name The widget name + */ + GroupView(QWidget* parent, const char* name=0); + + /** + * Returns the name of the field by which the entries are grouped + * + * @return The field name + */ + const QString& groupBy() const { return m_groupBy; } + /** + * Sets the name of the field by which the entries are grouped + * + * @param groupFieldName The field name + */ + void setGroupField(const QString& groupFieldName); + /** + * Adds a collection, along with all all the groups for the collection in + * the groupFieldribute. This method gets called as well when the groupFieldribute + * is changed, since it essentially repopulates the listview. + * + * @param coll A pointer to the collection being added + */ + void addCollection(Data::CollPtr coll); + /** + * Removes a root collection item, and all of its children. + * + * @param coll A pointer to the collection + */ + void removeCollection(Data::CollPtr coll); + /** + * Selects the first item which refers to a certain entry. + * + * @param entry A pointer to the entry + */ + void setEntrySelected(Data::EntryPtr entry); + /** + * Refresh all the items for the collection. + * + * @return The item for the collection + */ + void populateCollection(); + + virtual void addField(Data::CollPtr, Data::FieldPtr); + virtual void modifyField(Data::CollPtr coll, Data::FieldPtr oldField, Data::FieldPtr newField); + virtual void removeField(Data::CollPtr, Data::FieldPtr); + +public slots: + /** + * Resets the list view, clearing and deleting all items. + */ + void slotReset(); + /** + * Adds or removes listview items when groups are modified. + * + * @param coll A pointer to the collection of the gorup + * @param groups A vector of pointers to the modified groups + */ + void slotModifyGroups(Tellico::Data::CollPtr coll, PtrVector<Tellico::Data::EntryGroup> groups); + /** + * Expands all items at a certain depth. If depth is -1, the current selected item + * is expanded. If depth is equal to either 0 or 1, then all items at that depth + * are expanded. + * + * @param depth The depth value + */ + void slotExpandAll(int depth=-1); + /** + * Collapses all items at a certain depth. If depth is -1, the current selected item + * is collapsed. If depth is equal to either 0 or 1, then all items at that depth + * are collapsed. + * + * @param depth The depth value + */ + void slotCollapseAll(int depth=-1); + +private: + /** + * Inserts a listviewitem for a given group + * + * @param group The group to be added + * @return A pointer to the created @ ref ParentItem + */ + EntryGroupItem* addGroup(Data::EntryGroup* group); + /** + * Traverse all siblings at a certain depth, setting them open or closed. If depth is -1, + * then the depth of the @ref currentItem() is used. + * + * @param depth Desired depth + * @param open Whether the item should be open or not + */ + void setSiblingsOpen(int depth, bool open); + +private slots: + /** + * Handles the appearance of the popup menu, determining which of the three (collection, + * group, or entry) menus to display. + * + * @param item A pointer to the item underneath the mouse + * @param point The location point + * @param col The column number, not currently used + */ + void contextMenuRequested(QListViewItem* item, const QPoint& point, int col); + /** + * Handles changing the icon when an item is expanded, depended on whether it refers + * to a collection, a group, or an entry. + * + * @param item A pointer to the expanded list item + */ + void slotExpanded(QListViewItem* item); + /** + * Handles changing the icon when an item is collapsed, depended on whether it refers + * to a collection, a group, or an entry. + * + * @param item A pointer to the collapse list item + */ + void slotCollapsed(QListViewItem* item); + /** + * Filter by group + */ + void slotFilterGroup(); + +signals: + /** + * Signals a desire to filter the view. + * + * @param filter A pointer to the filter + */ + void signalUpdateFilter(Tellico::FilterPtr filter); + +private: + friend class GroupIterator; + + virtual void setSorting(int column, bool ascending = true); + void resetComparisons(); + QString groupTitle(); + void updateHeader(Data::FieldPtr field=0); + + bool m_notSortedYet; + Data::CollPtr m_coll; + QDict<EntryGroupItem> m_groupDict; + QString m_groupBy; + + QPixmap m_groupOpenPixmap; + QPixmap m_groupClosedPixmap; +}; + +} // end namespace +#endif |