Choreonoid  1.1
LinkTreeWidget.h
説明を見る。
1 
5 #ifndef CNOID_BODYPLUGIN_LINK_TREE_WIDGET_H_INCLUDED
6 #define CNOID_BODYPLUGIN_LINK_TREE_WIDGET_H_INCLUDED
7 
8 #include "BodyItem.h"
9 #include <cnoid/SignalProxy>
10 #include <cnoid/ComboBox>
11 #include <cnoid/TreeWidget>
12 #include <boost/dynamic_bitset.hpp>
13 #include <vector>
14 #include "exportdecl.h"
15 
16 namespace cnoid {
17 
18  class MenuManager;
19  class LinkGroup;
20  class LinkTreeWidget;
21  class LinkTreeWidgetImpl;
22 
23  class CNOID_EXPORT LinkTreeItem : public QTreeWidgetItem
24  {
25  public:
26  LinkTreeItem(const std::string& name);
27 
28  inline int rowIndex() const { return rowIndex_; }
29 
30  inline const std::string& name() const { return name_; }
31  inline const Link* link() const { return link_; }
32  inline Link* link() { return link_; }
33  inline bool isLinkGroup() const { return isLinkGroup_; }
34 
35  virtual QVariant data(int column, int role) const;
36  virtual void setData(int column, int role, const QVariant& value);
37 
38  private:
39  int rowIndex_;
40  std::string name_;
41  Link* link_;
42  bool isLinkGroup_;
43 
44  LinkTreeItem(Link* link, LinkTreeWidgetImpl* treeImpl);
45  LinkTreeItem(LinkGroup* linkGroup, LinkTreeWidgetImpl* treeImpl);
46 
47  friend class LinkTreeWidget;
48  friend class LinkTreeWidgetImpl;
49  };
50 
51 
52  class CNOID_EXPORT LinkTreeWidget : public TreeWidget
53  {
54  Q_OBJECT
55 
56  public:
57 
58  LinkTreeWidget(QWidget* parent = 0);
59  virtual ~LinkTreeWidget();
60 
61  void setDefaultExpansionLevel(int level);
62  void enableCache(bool on);
63 
64  enum ListingMode {
65  LINK_LIST, LINK_TREE, JOINT_LIST, JOINT_TREE, PART_TREE };
66 
67  ComboBox* listingModeCombo();
68  void setListingMode(ListingMode mode);
69  void fixListingMode(bool on = true);
70 
71  SignalProxy< boost::signal<void(bool isInitialCreation)> > sigUpdateRequest();
72 
73  void setBodyItem(BodyItemPtr bodyItem);
74  BodyItem* bodyItem();
75 
76  typedef boost::function<void(const LinkTreeItem* item, int role, QVariant& out_value)> ColumnDataFunction;
77  typedef boost::function<void(const LinkTreeItem* item, int role, const QVariant& value)> ColumnSetDataFunction;
78  typedef boost::function<QWidget*(const LinkTreeItem* item)> ColumnWidgetFunction;
79 
80  int addColumn();
81  int addColumn(const QString& headerText);
82  void setColumnDataFunction(int column, ColumnDataFunction func);
83  void setColumnSetDataFunction(int column, ColumnSetDataFunction func);
84  void setColumnWidgetFunction(int column, ColumnWidgetFunction func);
85  void moveVisualColumnIndex(int column, int visualIndex);
86  int nameColumn();
87  int jointIdColumn();
88 
89  void setAlignedItemWidget(LinkTreeItem* item, int column, QWidget* widget, Qt::Alignment alignment = Qt::AlignCenter);
90  QWidget* alignedItemWidget(LinkTreeItem* item, int column);
91 
92  void addCustomRow(LinkTreeItem* treeItem);
93 
94  LinkTreeItem* itemOfLink(int linkIndex);
95 
96  int numLinkTreeItems();
97 
98  SignalProxy< boost::signal<void(LinkTreeItem* item, int column)> > sigItemChanged();
99 
100  SignalProxy< boost::signal<void()> > sigSelectionChanged();
101  const std::vector<int>& getSelectedLinkIndices();
102  const boost::dynamic_bitset<>& getLinkSelection();
103 
105  SignalProxy< boost::signal<void()> > sigSelectionChanged(BodyItemPtr bodyItem);
107  const std::vector<int>& getSelectedLinkIndices(BodyItemPtr bodyItem);
109  const boost::dynamic_bitset<>& getLinkSelection(BodyItemPtr bodyItem);
110 
111  MenuManager& popupMenuManager();
112 
113  bool makeSingleSelection(BodyItemPtr bodyItem, int linkIndex);
114 
115  void enableArchiveOfCurrentBodyItem(bool on);
116  bool storeState(Archive& archive);
117  bool restoreState(const Archive& archive);
118 
119  protected:
120  virtual void changeEvent(QEvent* event);
121 
122  private Q_SLOTS:
123  void onItemChanged(QTreeWidgetItem* item, int column);
124  void onSelectionChanged();
125  void onCustomContextMenuRequested(const QPoint& pos);
126  void onItemExpanded(QTreeWidgetItem* treeWidgetItem);
127  void onItemCollapsed(QTreeWidgetItem* treeWidgetItem);
128  void onHeaderSectionResized();
129 
130  private:
131 
132  LinkTreeWidgetImpl* impl;
133 
134  friend class LinkTreeItem;
135  };
136 }
137 
138 #endif