diff options
| author | Kevin Smith <git@kismith.co.uk> | 2009-08-08 14:18:43 (GMT) | 
|---|---|---|
| committer | Kevin Smith <git@kismith.co.uk> | 2009-08-08 14:18:43 (GMT) | 
| commit | 47d75bf5a3f58ce582e5715a9d5ba6e89a38b033 (patch) | |
| tree | 20345d9b84af4650076440e6a2f57a4661143ca4 | |
| parent | 40d35626023f12d8ebea3a53672968b1b80f5974 (diff) | |
| download | swift-contrib-47d75bf5a3f58ce582e5715a9d5ba6e89a38b033.zip swift-contrib-47d75bf5a3f58ce582e5715a9d5ba6e89a38b033.tar.bz2 | |
Plumbing in place for roster group expansion. \nDoesn't work.
| -rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.cpp | 5 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/QtTreeWidget.h | 1 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/QtTreeWidgetFactory.h | 1 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/QtTreeWidgetItem.cpp | 22 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/QtTreeWidgetItem.h | 6 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/RosterModel.cpp | 30 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/RosterModel.h | 6 | ||||
| -rw-r--r-- | Swift/QtUI/Roster/main.cpp | 4 | 
8 files changed, 59 insertions, 16 deletions
| diff --git a/Swift/QtUI/Roster/QtTreeWidget.cpp b/Swift/QtUI/Roster/QtTreeWidget.cpp index 67afd14..18b28d2 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.cpp +++ b/Swift/QtUI/Roster/QtTreeWidget.cpp @@ -20,6 +20,7 @@ QtTreeWidget::QtTreeWidget(QWidget* parent) : QTreeView(parent) {  	setIndentation(0);  	setRootIsDecorated(true);  	connect(this, SIGNAL(activated(const QModelIndex&)), this, SLOT(handleItemActivated(const QModelIndex&))); +	connect(model_, SIGNAL(itemExpanded(const QModelIndex&, bool)), this, SLOT(handleItemExpanded(const QModelIndex&, bool)));  }  QtTreeWidget::~QtTreeWidget() { @@ -38,6 +39,10 @@ void QtTreeWidget::handleItemActivated(const QModelIndex& index) {  	}  } +void QtTreeWidget::handleItemExpanded(const QModelIndex& index, bool expanded) { +	setExpanded(index, expanded); +} +  void QtTreeWidget::drawBranches(QPainter*, const QRect&, const QModelIndex&) const {  } diff --git a/Swift/QtUI/Roster/QtTreeWidget.h b/Swift/QtUI/Roster/QtTreeWidget.h index bb8f618..8c76d60 100644 --- a/Swift/QtUI/Roster/QtTreeWidget.h +++ b/Swift/QtUI/Roster/QtTreeWidget.h @@ -22,6 +22,7 @@ class QtTreeWidget : public QTreeView, public TreeWidget {  		QtTreeWidgetItem* getRoot();  	private slots:  		void handleItemActivated(const QModelIndex&); +		void handleItemExpanded(const QModelIndex&, bool expanded);  	private:  		void drawBranches(QPainter*, const QRect&, const QModelIndex&) const;  		RosterModel* model_; diff --git a/Swift/QtUI/Roster/QtTreeWidgetFactory.h b/Swift/QtUI/Roster/QtTreeWidgetFactory.h index 2ca1e21..db20044 100644 --- a/Swift/QtUI/Roster/QtTreeWidgetFactory.h +++ b/Swift/QtUI/Roster/QtTreeWidgetFactory.h @@ -33,6 +33,7 @@ class QtTreeWidgetFactory : public TreeWidgetFactory {  			QtTreeWidgetItem* newItem = new QtTreeWidgetItem(qtItem);  			//qtItem->setItemWidget(newItem, 0, newItem->getCollapsedRosterWidget());  			qtItem->addChild(newItem); +			newItem->setExpanded(true);  			return newItem;  		}  }; diff --git a/Swift/QtUI/Roster/QtTreeWidgetItem.cpp b/Swift/QtUI/Roster/QtTreeWidgetItem.cpp index aa1836c..1b77b26 100644 --- a/Swift/QtUI/Roster/QtTreeWidgetItem.cpp +++ b/Swift/QtUI/Roster/QtTreeWidgetItem.cpp @@ -8,6 +8,7 @@ namespace Swift {  QtTreeWidgetItem::QtTreeWidgetItem(QtTreeWidgetItem* parentItem) : QObject(), textColor_(0,0,0), backgroundColor_(255,255,255) {  	parent_ = parentItem;  	shown_ = true; +	expanded_ = true;  }  void QtTreeWidgetItem::setText(const String& text) { @@ -38,17 +39,18 @@ void QtTreeWidgetItem::setBackgroundColor(unsigned long color) {  }  void QtTreeWidgetItem::setExpanded(bool b) { -	//treeWidget()->setItemExpanded(this, b); +	expanded_ = true; +	emit changed(this);  }  void QtTreeWidgetItem::hide() {  	shown_ = false; -	emit changed(); +	emit changed(this);  }  void QtTreeWidgetItem::show() {  	shown_ = true; -	emit changed(); +	emit changed(this);  }  bool QtTreeWidgetItem::isShown() { @@ -77,18 +79,18 @@ QtTreeWidgetItem* QtTreeWidgetItem::getParentItem() {  void QtTreeWidgetItem::addChild(QtTreeWidgetItem* child) {  	children_.append(child); -	connect(child, SIGNAL(changed()), this, SLOT(handleChanged())); -	handleChanged(); +	connect(child, SIGNAL(changed(QtTreeWidgetItem*)), this, SLOT(handleChanged(QtTreeWidgetItem*))); +	handleChanged(child);  } -void QtTreeWidgetItem::handleChanged() { +void QtTreeWidgetItem::handleChanged(QtTreeWidgetItem* child) {  	shownChildren_.clear();  	for (int i = 0; i < children_.size(); i++) {  		if (children_[i]->isShown()) {  			shownChildren_.append(children_[i]);  		}  	} -	emit changed(); +	emit changed(child);  }  int QtTreeWidgetItem::rowCount() { @@ -106,6 +108,8 @@ int QtTreeWidgetItem::row() {  QtTreeWidgetItem* QtTreeWidgetItem::getItem(int row) {  	//qDebug() << "Returning row " << row << " from item " << displayName_; +	Q_ASSERT(row >= 0); +	Q_ASSERT(row < rowCount());  	return shownChildren_[row];  } @@ -125,4 +129,8 @@ bool QtTreeWidgetItem::isContact() {  	return children_.size() == 0;  } +bool QtTreeWidgetItem::isExpanded() { +	return expanded_; +} +  }
\ No newline at end of file diff --git a/Swift/QtUI/Roster/QtTreeWidgetItem.h b/Swift/QtUI/Roster/QtTreeWidgetItem.h index 0a32940..73da92f 100644 --- a/Swift/QtUI/Roster/QtTreeWidgetItem.h +++ b/Swift/QtUI/Roster/QtTreeWidgetItem.h @@ -43,14 +43,15 @@ class QtTreeWidgetItem : public QObject, public TreeWidgetItem {  			void show();  			bool isShown();  			bool isContact(); +			bool isExpanded();  			QWidget* getCollapsedRosterWidget();  			QWidget* getExpandedRosterWidget();  		signals: -			void changed(); +			void changed(QtTreeWidgetItem*);  		private slots: -			void handleChanged(); +			void handleChanged(QtTreeWidgetItem* item);  		private:  			QList<QtTreeWidgetItem*> children_;  			QList<QtTreeWidgetItem*> shownChildren_; @@ -61,6 +62,7 @@ class QtTreeWidgetItem : public QObject, public TreeWidgetItem {  			QColor backgroundColor_;  			QVariant avatar_;  			bool shown_; +			bool expanded_;  };  } diff --git a/Swift/QtUI/Roster/RosterModel.cpp b/Swift/QtUI/Roster/RosterModel.cpp index f322792..30d8135 100644 --- a/Swift/QtUI/Roster/RosterModel.cpp +++ b/Swift/QtUI/Roster/RosterModel.cpp @@ -11,16 +11,23 @@ RosterModel::~RosterModel() {  void RosterModel::setRoot(QtTreeWidgetItem* root) {  	tree_ = root; -	connect(tree_, SIGNAL(changed()), this, SLOT(handleItemChanged())); +	connect(tree_, SIGNAL(changed(QtTreeWidgetItem*)), this, SLOT(handleItemChanged(QtTreeWidgetItem*)));  } -void RosterModel::handleItemChanged() { -	//FIXME: This is just a lazy hack to cause the view to refresh until it works. -	// Then I'll replace it with the proper implementation. -	//printf("Changed\n"); +void RosterModel::handleItemChanged(QtTreeWidgetItem* item) { +	if (!item->isShown()) { +		return; +	} +	//these two lines should be redundant, but...  	reset();  	emit layoutChanged(); +	//These lines don't seem to be enough +	Q_ASSERT(item); +	QModelIndex modelIndex = index(item); +	emit itemExpanded(modelIndex, item->isExpanded()); +	emit dataChanged(modelIndex, modelIndex); +	  }  int RosterModel::columnCount(const QModelIndex& parent) const { @@ -40,6 +47,19 @@ QModelIndex RosterModel::index(int row, int column, const QModelIndex& parent) c  	return row < parentItem->rowCount() ? createIndex(row, column, parentItem->getItem(row)) : QModelIndex();  } +QModelIndex RosterModel::index(QtTreeWidgetItem* item) const { +	QtTreeWidgetItem* parentItem = item->getParentItem(); +	Q_ASSERT(parentItem); +	QModelIndex parentIndex = parent(item); +	return index(item->row(), 0, parentIndex); +} + +QModelIndex RosterModel::parent(QtTreeWidgetItem* item) const { +	QtTreeWidgetItem* parentItem = item->getParentItem(); +	return parentItem == tree_ ? QModelIndex() : index(parentItem->row(), 0, parent(parentItem)); +} + +  QModelIndex RosterModel::parent(const QModelIndex& index) const {  	if (!index.isValid()) {  		return QModelIndex(); diff --git a/Swift/QtUI/Roster/RosterModel.h b/Swift/QtUI/Roster/RosterModel.h index e75bc2f..c1d998c 100644 --- a/Swift/QtUI/Roster/RosterModel.h +++ b/Swift/QtUI/Roster/RosterModel.h @@ -15,10 +15,14 @@ public:  	int columnCount(const QModelIndex& parent = QModelIndex()) const;  	QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;  	QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const; +	QModelIndex index(QtTreeWidgetItem* item) const;  	QModelIndex parent(const QModelIndex& index) const; +	QModelIndex parent(QtTreeWidgetItem* item) const;  	int rowCount(const QModelIndex& parent = QModelIndex()) const; +signals: +	void itemExpanded(const QModelIndex& item, bool expanded);  private slots: -	void handleItemChanged(); +	void handleItemChanged(QtTreeWidgetItem* item);  private:  	QtTreeWidgetItem* tree_;  }; diff --git a/Swift/QtUI/Roster/main.cpp b/Swift/QtUI/Roster/main.cpp index 60ee592..660dce9 100644 --- a/Swift/QtUI/Roster/main.cpp +++ b/Swift/QtUI/Roster/main.cpp @@ -15,6 +15,7 @@ int main(int argc, char *argv[])  	Swift::QtTreeWidgetFactory treeWidgetFactory;  	Swift::QtTreeWidget* tree = dynamic_cast<Swift::QtTreeWidget*>(treeWidgetFactory.createTreeWidget()); +	tree->show();  	for (int i = 0; i < 500; i++) {  		Swift::QtTreeWidgetItem* group = dynamic_cast<Swift::QtTreeWidgetItem*>(treeWidgetFactory.createTreeWidgetItem(tree));  		group->setText("People"); @@ -26,8 +27,9 @@ int main(int argc, char *argv[])  		item1->setText("Remko");  		item2->setText("Kevin");  		item3->setText("Cath"); +		item4->setText("KimTypo");  		item4->setText("Kim");  	} -	tree->show(); +	      return app.exec();  }
\ No newline at end of file | 
 Swift
 Swift