diff options
Diffstat (limited to 'Swift/Controllers/Roster')
| -rw-r--r-- | Swift/Controllers/Roster/ContactRosterItem.cpp | 4 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/GroupRosterItem.cpp | 25 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/GroupRosterItem.h | 4 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/Roster.cpp | 6 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp | 1 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/RosterItem.cpp | 4 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/RosterItem.h | 4 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/TableRoster.cpp | 36 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/TableRoster.h | 51 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp | 1 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/UnitTest/RosterTest.cpp | 17 | 
11 files changed, 140 insertions, 13 deletions
| diff --git a/Swift/Controllers/Roster/ContactRosterItem.cpp b/Swift/Controllers/Roster/ContactRosterItem.cpp index 0fe88aa..bbe81e6 100644 --- a/Swift/Controllers/Roster/ContactRosterItem.cpp +++ b/Swift/Controllers/Roster/ContactRosterItem.cpp @@ -7,6 +7,8 @@  #include "Swift/Controllers/Roster/ContactRosterItem.h"  #include "Swift/Controllers/Roster/GroupRosterItem.h" +#include <Swiften/Base/foreach.h> +  namespace Swift { @@ -89,7 +91,7 @@ void ContactRosterItem::applyPresence(const std::string& resource, boost::shared  				presences_.erase(resource);  			}  		} -		if (presences_.size() == 0) { +		if (presences_.empty()) {  			offlinePresence_ = presence;  		}  	} else { diff --git a/Swift/Controllers/Roster/GroupRosterItem.cpp b/Swift/Controllers/Roster/GroupRosterItem.cpp index f0a377a..2a7bfa5 100644 --- a/Swift/Controllers/Roster/GroupRosterItem.cpp +++ b/Swift/Controllers/Roster/GroupRosterItem.cpp @@ -12,7 +12,7 @@  namespace Swift { -GroupRosterItem::GroupRosterItem(const std::string& name, GroupRosterItem* parent, bool sortByStatus) : RosterItem(name, parent), sortByStatus_(sortByStatus) { +GroupRosterItem::GroupRosterItem(const std::string& name, GroupRosterItem* parent, bool sortByStatus) : RosterItem(name, parent), sortByStatus_(sortByStatus), manualSort_(false) {  	expanded_ = true;  } @@ -20,6 +20,20 @@ GroupRosterItem::~GroupRosterItem() {  } +void GroupRosterItem::setManualSort(const std::string& manualSortValue) { +	manualSort_ = true; +	bool changed = manualSortValue_ != manualSortValue; +	manualSortValue_ = manualSortValue; +	if (changed) { +		onChildrenChanged(); +		onDataChanged(); +	} +} + +const std::string& GroupRosterItem::getSortableDisplayName() const { +	return manualSort_ ? manualSortValue_ : RosterItem::getSortableDisplayName(); +} +  bool GroupRosterItem::isExpanded() const {  	return expanded_;  } @@ -75,7 +89,7 @@ void GroupRosterItem::removeAll() {  				delete group;  			}  		} -		it++; +		++it;  	}  	children_.clear();  } @@ -103,7 +117,7 @@ ContactRosterItem* GroupRosterItem::removeChild(const JID& jid) {  				removed = groupRemoved;  			}  		} -		it++; +		++it;  	}  	onChildrenChanged();  	onDataChanged(); @@ -122,7 +136,7 @@ GroupRosterItem* GroupRosterItem::removeGroupChild(const std::string& groupName)  			it = children_.erase(it);  			continue;  		} -		it++; +		++it;  	}  	onChildrenChanged();  	onDataChanged(); @@ -210,7 +224,8 @@ void GroupRosterItem::handleChildrenChanged(GroupRosterItem* group) {  	} else {  		displayedChildren_.erase(std::remove(displayedChildren_.begin(), displayedChildren_.end(), group), displayedChildren_.end());  	} -	if (oldSize != getDisplayedChildren().size()) { + +	if (oldSize != getDisplayedChildren().size() || sortDisplayed()) {  		onChildrenChanged();  		onDataChanged();  	} diff --git a/Swift/Controllers/Roster/GroupRosterItem.h b/Swift/Controllers/Roster/GroupRosterItem.h index 57fa9fa..beb7705 100644 --- a/Swift/Controllers/Roster/GroupRosterItem.h +++ b/Swift/Controllers/Roster/GroupRosterItem.h @@ -31,6 +31,8 @@ class GroupRosterItem : public RosterItem {  		void setExpanded(bool expanded);  		bool isExpanded() const;  		boost::signal<void (bool)> onExpandedChanged; +		void setManualSort(const std::string& manualSortValue); +		virtual const std::string& getSortableDisplayName() const;  	private:  		void handleChildrenChanged(GroupRosterItem* group);  		void handleDataChanged(RosterItem* item); @@ -40,6 +42,8 @@ class GroupRosterItem : public RosterItem {  		std::vector<RosterItem*> children_;  		std::vector<RosterItem*> displayedChildren_;  		bool sortByStatus_; +		bool manualSort_; +		std::string manualSortValue_;  };  } diff --git a/Swift/Controllers/Roster/Roster.cpp b/Swift/Controllers/Roster/Roster.cpp index 4e34105..a62a18a 100644 --- a/Swift/Controllers/Roster/Roster.cpp +++ b/Swift/Controllers/Roster/Roster.cpp @@ -107,7 +107,7 @@ void Roster::removeAll() {  void Roster::removeContact(const JID& jid) {  	std::vector<ContactRosterItem*>* items = &itemMap_[fullJIDMapping_ ? jid : jid.toBare()];  	items->erase(std::remove_if(items->begin(), items->end(), JIDEqualsTo(jid)), items->end()); -	if (items->size() == 0) { +	if (items->empty()) {  		itemMap_.erase(fullJIDMapping_ ? jid : jid.toBare());  	}  	//Causes the delete @@ -124,7 +124,7 @@ void Roster::removeContactFromGroup(const JID& jid, const std::string& groupName  			std::vector<ContactRosterItem*>* items = &itemMap_[fullJIDMapping_ ? jid : jid.toBare()];  			items->erase(std::remove(items->begin(), items->end(), deleted), items->end());  		} -		it++; +		++it;  	}  	foreach (ContactRosterItem* item, itemMap_[fullJIDMapping_ ? jid : jid.toBare()]) {  		item->removeGroup(groupName); @@ -179,7 +179,7 @@ void Roster::filterContact(ContactRosterItem* contact, GroupRosterItem* group) {  	foreach (RosterFilter *filter, filters_) {  		hide &= (*filter)(contact);  	} -	group->setDisplayed(contact, filters_.size() == 0 || !hide); +	group->setDisplayed(contact, filters_.empty() || !hide);  	int newDisplayedSize = group->getDisplayedChildren().size();  	if (oldDisplayedSize == 0 && newDisplayedSize > 0) {  		onGroupAdded(group); diff --git a/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp b/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp index c1045ee..0a242ae 100644 --- a/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp +++ b/Swift/Controllers/Roster/RosterGroupExpandinessPersister.cpp @@ -9,6 +9,7 @@  #include <boost/bind.hpp>  #include <vector> +#include <Swiften/Base/foreach.h>  #include "Swiften/Base/String.h"  #include "Swift/Controllers/Roster/GroupRosterItem.h" diff --git a/Swift/Controllers/Roster/RosterItem.cpp b/Swift/Controllers/Roster/RosterItem.cpp index 3f130bb..77db8a3 100644 --- a/Swift/Controllers/Roster/RosterItem.cpp +++ b/Swift/Controllers/Roster/RosterItem.cpp @@ -33,11 +33,11 @@ void RosterItem::setDisplayName(const std::string& name) {  	onDataChanged();  } -std::string RosterItem::getDisplayName() const { +const std::string& RosterItem::getDisplayName() const {  	return name_;  } -std::string RosterItem::getSortableDisplayName() const { +const std::string& RosterItem::getSortableDisplayName() const {  	return sortableDisplayName_;  } diff --git a/Swift/Controllers/Roster/RosterItem.h b/Swift/Controllers/Roster/RosterItem.h index ed8cb16..769f72d 100644 --- a/Swift/Controllers/Roster/RosterItem.h +++ b/Swift/Controllers/Roster/RosterItem.h @@ -20,8 +20,8 @@ class RosterItem {  		boost::signal<void ()> onDataChanged;  		GroupRosterItem* getParent() const;  		void setDisplayName(const std::string& name); -		std::string getDisplayName() const; -		std::string getSortableDisplayName() const; +		const std::string& getDisplayName() const; +		virtual const std::string& getSortableDisplayName() const;  	private:  		std::string name_;  		std::string sortableDisplayName_; diff --git a/Swift/Controllers/Roster/TableRoster.cpp b/Swift/Controllers/Roster/TableRoster.cpp new file mode 100644 index 0000000..fda7de8 --- /dev/null +++ b/Swift/Controllers/Roster/TableRoster.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2011 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swift/Controllers/Roster/TableRoster.h> + +#include <boost/cast.hpp> + +#include <Swift/Controllers/Roster/Roster.h> +#include <Swift/Controllers/Roster/GroupRosterItem.h> + +using namespace Swift; + +TableRoster::TableRoster(Roster* model) : model(model) { +} +			 +size_t TableRoster::getNumberOfSections() const { +	return model ? model->getRoot()->getDisplayedChildren().size() : 0; +} + +size_t TableRoster::getNumberOfRowsInSection(size_t section) const { +	return boost::polymorphic_downcast<Swift::GroupRosterItem*>(model->getRoot()->getDisplayedChildren()[section])->getDisplayedChildren().size(); +} + +const std::string& TableRoster::getSectionTitle(size_t section) { +	return model->getRoot()->getDisplayedChildren()[section]->getDisplayName(); +} + +TableRoster::Item TableRoster::getItem(const Index& index) const { +	Item item; +	item.name = boost::polymorphic_downcast<Swift::GroupRosterItem*>(model->getRoot()->getDisplayedChildren().at(index.section))->getDisplayedChildren().at(index.row)->getDisplayName(); +	item.description = "My Status"; +	return item; +} diff --git a/Swift/Controllers/Roster/TableRoster.h b/Swift/Controllers/Roster/TableRoster.h new file mode 100644 index 0000000..7d92995 --- /dev/null +++ b/Swift/Controllers/Roster/TableRoster.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2011 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <string> +#include <vector> +#include <Swiften/Base/boost_bsignals.h> + +#include <Swiften/JID/JID.h> + +namespace Swift { +	class Roster; + +	class TableRoster { +		public: +			struct Item { +				std::string name; +				std::string description; +				JID jid; +			}; +			struct Index { +				Index(size_t section, size_t row) : section(section), row(row) {  +				} +				size_t section; +				size_t row; +			}; + +			TableRoster(Roster* model); +			 +			size_t getNumberOfSections() const; +			size_t getNumberOfRowsInSection(size_t section) const; + +			const std::string& getSectionTitle(size_t); + +			Item getItem(const Index&) const; + +			boost::signal<void ()> onBeginUpdates; +			boost::signal<void (const std::vector<Index>&)> onRowsInserted; +			boost::signal<void (const std::vector<Index>&)> onRowsDeleted; +			boost::signal<void (const std::vector<size_t>&)> onSectionsInserted; +			boost::signal<void (const std::vector<size_t>&)> onSectionsDeleted; +			boost::signal<void ()> onEndUpdates; + +		private: +			Roster* model; +	}; +} diff --git a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp index 16f2745..ca74dbb 100644 --- a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp +++ b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp @@ -8,6 +8,7 @@  #include <cppunit/extensions/HelperMacros.h>  #include <cppunit/extensions/TestFactoryRegistry.h> +#include <Swiften/Base/foreach.h>  #include "Swift/Controllers/Roster/RosterController.h"  #include "Swift/Controllers/UnitTest/MockMainWindowFactory.h"  // #include "Swiften/Elements/Payload.h" diff --git a/Swift/Controllers/Roster/UnitTest/RosterTest.cpp b/Swift/Controllers/Roster/UnitTest/RosterTest.cpp index cbef787..4444e8a 100644 --- a/Swift/Controllers/Roster/UnitTest/RosterTest.cpp +++ b/Swift/Controllers/Roster/UnitTest/RosterTest.cpp @@ -21,6 +21,7 @@ class RosterTest : public CppUnit::TestFixture {  		CPPUNIT_TEST(testRemoveSecondContact);  		CPPUNIT_TEST(testRemoveSecondContactSameBare);  		CPPUNIT_TEST(testApplyPresenceLikeMUC); +		CPPUNIT_TEST(testReSortLikeMUC);  		CPPUNIT_TEST_SUITE_END();  	public: @@ -117,6 +118,22 @@ class RosterTest : public CppUnit::TestFixture {  		} +		void testReSortLikeMUC() { +			JID jid4a("a@b/c"); +			JID jid4b("a@b/d"); +			JID jid4c("a@b/e"); +			roster_->addContact(jid4a, JID(), "Bird", "group1", ""); +			roster_->addContact(jid4b, JID(), "Cookie", "group2", ""); +			roster_->addContact(jid4b, JID(), "Ernie", "group1", ""); +			roster_->getGroup("group1")->setManualSort("2"); +			roster_->getGroup("group2")->setManualSort("1"); +			GroupRosterItem* root = roster_->getRoot(); +			const std::vector<RosterItem*> kids = root->getDisplayedChildren(); +			CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), kids.size()); +			CPPUNIT_ASSERT_EQUAL(std::string("group2"), kids[0]->getDisplayName()); +			CPPUNIT_ASSERT_EQUAL(std::string("group1"), kids[1]->getDisplayName()); +		} +  	private:  		Roster *roster_;  		JID jid1_; | 
 Swift
 Swift