diff options
| author | Richard Maudsley <richard.maudsley@isode.com> | 2014-06-27 16:06:49 (GMT) | 
|---|---|---|
| committer | Richard Maudsley <richard.maudsley@isode.com> | 2014-07-07 10:49:04 (GMT) | 
| commit | 14fd8e4363241e04b20da85dfc61e5f315e9b28d (patch) | |
| tree | b7a5450f73e98dd64c0367702575bb3f52e44ab4 /Swift | |
| parent | 9179b54ac93ddc88765c3cd984916d7ffd130d20 (diff) | |
| download | swift-contrib-14fd8e4363241e04b20da85dfc61e5f315e9b28d.zip swift-contrib-14fd8e4363241e04b20da85dfc61e5f315e9b28d.tar.bz2  | |
Show own tooltip when hovering over roster header.
Test-Information:
Made combinations of presence/vcard/avatar changes and verified that the information in the tooltip was synchronized. Connect two clients and verify that the tooltip presence text reflects the local client presence only.
Change-Id: I92af0f58f7045f3a15f2fae2f9cbc6e24a066923
Diffstat (limited to 'Swift')
| -rw-r--r-- | Swift/Controllers/MainController.cpp | 3 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/RosterController.cpp | 30 | ||||
| -rw-r--r-- | Swift/Controllers/Roster/RosterController.h | 5 | ||||
| -rw-r--r-- | Swift/Controllers/UIInterfaces/MainWindow.h | 2 | ||||
| -rw-r--r-- | Swift/Controllers/UnitTest/MockMainWindow.h | 1 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.cpp | 4 | ||||
| -rw-r--r-- | Swift/QtUI/QtMainWindow.h | 1 | ||||
| -rw-r--r-- | Swift/QtUI/QtRosterHeader.cpp | 28 | ||||
| -rw-r--r-- | Swift/QtUI/QtRosterHeader.h | 8 | 
9 files changed, 70 insertions, 12 deletions
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index df137f4..f16f8ad 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -341,3 +341,3 @@ void MainController::handleConnected() {  		fileTransferListController_->setFileTransferOverview(ftOverview_); -		rosterController_ = new RosterController(jid_, client_->getRoster(), client_->getAvatarManager(), uiFactory_, client_->getNickManager(), client_->getNickResolver(), client_->getPresenceOracle(), client_->getSubscriptionManager(), eventController_, uiEventStream_, client_->getIQRouter(), settings_, client_->getEntityCapsProvider(), ftOverview_, client_->getClientBlockListManager(), client_->getVCardManager()); +		rosterController_ = new RosterController(boundJID_, client_->getRoster(), client_->getAvatarManager(), uiFactory_, client_->getNickManager(), client_->getNickResolver(), client_->getPresenceOracle(), client_->getSubscriptionManager(), eventController_, uiEventStream_, client_->getIQRouter(), settings_, client_->getEntityCapsProvider(), ftOverview_, client_->getClientBlockListManager(), client_->getVCardManager());  		rosterController_->onChangeStatusRequest.connect(boost::bind(&MainController::handleChangeStatusRequest, this, _1, _2)); @@ -413,2 +413,3 @@ void MainController::handleConnected() { +	rosterController_->setJID(boundJID_);  	rosterController_->setEnabled(true); diff --git a/Swift/Controllers/Roster/RosterController.cpp b/Swift/Controllers/Roster/RosterController.cpp index d2d024c..6bb5119 100644 --- a/Swift/Controllers/Roster/RosterController.cpp +++ b/Swift/Controllers/Roster/RosterController.cpp @@ -60,6 +60,5 @@ namespace Swift {  RosterController::RosterController(const JID& jid, XMPPRoster* xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, NickManager* nickManager, NickResolver* nickResolver, PresenceOracle* presenceOracle, SubscriptionManager* subscriptionManager, EventController* eventController, UIEventStream* uiEventStream, IQRouter* iqRouter, SettingsProvider* settings, EntityCapsProvider* entityCapsManager, FileTransferOverview* fileTransferOverview, ClientBlockListManager* clientBlockListManager, VCardManager* vcardManager) -	: myJID_(jid), xmppRoster_(xmppRoster), mainWindowFactory_(mainWindowFactory), mainWindow_(mainWindowFactory_->createMainWindow(uiEventStream)), roster_(new Roster()), offlineFilter_(new OfflineRosterFilter()), nickManager_(nickManager), nickResolver_(nickResolver), uiEventStream_(uiEventStream), entityCapsManager_(entityCapsManager), ftOverview_(fileTransferOverview), clientBlockListManager_(clientBlockListManager) { +	: myJID_(jid), xmppRoster_(xmppRoster), mainWindowFactory_(mainWindowFactory), mainWindow_(mainWindowFactory_->createMainWindow(uiEventStream)), roster_(new Roster()), offlineFilter_(new OfflineRosterFilter()), vcardManager_(vcardManager), avatarManager_(avatarManager), nickManager_(nickManager), nickResolver_(nickResolver), presenceOracle_(presenceOracle), uiEventStream_(uiEventStream), entityCapsManager_(entityCapsManager), ftOverview_(fileTransferOverview), clientBlockListManager_(clientBlockListManager) {  	assert(fileTransferOverview);  	iqRouter_ = iqRouter; -	presenceOracle_ = presenceOracle;  	subscriptionManager_ = subscriptionManager; @@ -80,5 +79,7 @@ RosterController::RosterController(const JID& jid, XMPPRoster* xmppRoster, Avata  	uiEventConnection_ = uiEventStream->onUIEvent.connect(boost::bind(&RosterController::handleUIEvent, this, _1)); -	avatarManager_ = avatarManager; + +	vcardManager_->onOwnVCardChanged.connect(boost::bind(&RosterController::handleOwnVCardChanged, this, _1));  	avatarManager_->onAvatarChanged.connect(boost::bind(&RosterController::handleAvatarChanged, this, _1)); -	mainWindow_->setMyAvatarPath(pathToString(avatarManager_->getAvatarPath(myJID_))); +	presenceOracle_->onPresenceChange.connect(boost::bind(&RosterController::handlePresenceChanged, this, _1)); +	mainWindow_->setMyAvatarPath(pathToString(avatarManager_->getAvatarPath(myJID_.toBare()))); @@ -93,2 +94,7 @@ RosterController::RosterController(const JID& jid, XMPPRoster* xmppRoster, Avata  	handleShowOfflineToggled(settings_->getSetting(SettingConstants::SHOW_OFFLINE)); + +	ownContact_ = boost::make_shared<ContactRosterItem>(myJID_.toBare(), myJID_.toBare(), nickManager_->getOwnNick(), (GroupRosterItem*)0); +	ownContact_->setVCard(vcardManager_->getVCard(myJID_.toBare())); +	ownContact_->setAvatarPath(pathToString(avatarManager_->getAvatarPath(myJID_.toBare()))); +	mainWindow_->setMyContactRosterItem(ownContact_);  } @@ -338,2 +344,7 @@ void RosterController::handleSubscriptionRequestDeclined(SubscriptionRequestEven +void RosterController::handleOwnVCardChanged(VCard::ref vcard) { +	ownContact_->setVCard(vcard); +	mainWindow_->setMyContactRosterItem(ownContact_); +} +  void RosterController::handleAvatarChanged(const JID& jid) { @@ -341,5 +352,14 @@ void RosterController::handleAvatarChanged(const JID& jid) {  	roster_->applyOnItems(SetAvatar(jid, path)); -	if (jid.equals(myJID_, JID::WithoutResource)) { +	if (jid.equals(myJID_, JID::WithResource)) {  		mainWindow_->setMyAvatarPath(pathToString(path));  	} +	ownContact_->setAvatarPath(pathToString(path)); +	mainWindow_->setMyContactRosterItem(ownContact_); +} + +void RosterController::handlePresenceChanged(Presence::ref presence) { +	if (presence->getFrom().equals(myJID_, JID::WithResource)) { +		ownContact_->applyPresence(std::string(), presence); +		mainWindow_->setMyContactRosterItem(ownContact_); +	}  } diff --git a/Swift/Controllers/Roster/RosterController.h b/Swift/Controllers/Roster/RosterController.h index 5b26fc7..d0c7024 100644 --- a/Swift/Controllers/Roster/RosterController.h +++ b/Swift/Controllers/Roster/RosterController.h @@ -52,2 +52,3 @@ namespace Swift {  			void showRosterWindow(); +			void setJID(const JID& jid) { myJID_ = jid; }  			MainWindow* getWindow() {return mainWindow_;} @@ -55,3 +56,5 @@ namespace Swift {  			boost::signal<void ()> onSignOutRequest; +			void handleOwnVCardChanged(VCard::ref vcard);  			void handleAvatarChanged(const JID& jid); +			void handlePresenceChanged(Presence::ref presence);  			void setEnabled(bool enabled); @@ -95,2 +98,3 @@ namespace Swift {  			OfflineRosterFilter* offlineFilter_; +			VCardManager* vcardManager_;  			AvatarManager* avatarManager_; @@ -109,2 +113,3 @@ namespace Swift {  			RosterVCardProvider* rosterVCardProvider_; +			boost::shared_ptr<ContactRosterItem> ownContact_; diff --git a/Swift/Controllers/UIInterfaces/MainWindow.h b/Swift/Controllers/UIInterfaces/MainWindow.h index c85106f..82750bf 100644 --- a/Swift/Controllers/UIInterfaces/MainWindow.h +++ b/Swift/Controllers/UIInterfaces/MainWindow.h @@ -17,2 +17,3 @@  #include <Swiften/Base/boost_bsignals.h> +#include <Swift/Controllers/Roster/ContactRosterItem.h> @@ -35,2 +36,3 @@ namespace Swift {  			virtual void setMyStatusType(StatusShow::Type type) = 0; +			virtual void setMyContactRosterItem(boost::shared_ptr<ContactRosterItem> contact) = 0;  			/** Must be able to cope with NULL to clear the roster */ diff --git a/Swift/Controllers/UnitTest/MockMainWindow.h b/Swift/Controllers/UnitTest/MockMainWindow.h index ff3fa4d..b56f352 100644 --- a/Swift/Controllers/UnitTest/MockMainWindow.h +++ b/Swift/Controllers/UnitTest/MockMainWindow.h @@ -22,2 +22,3 @@ namespace Swift {  			virtual void setMyStatusType(StatusShow::Type /*type*/) {} +			virtual void setMyContactRosterItem(boost::shared_ptr<ContactRosterItem> /*contact*/) {}  			virtual void setAvailableAdHocCommands(const std::vector<DiscoItems::Item>& /*commands*/) {} diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp index 1acc519..31a8234 100644 --- a/Swift/QtUI/QtMainWindow.cpp +++ b/Swift/QtUI/QtMainWindow.cpp @@ -342,2 +342,6 @@ void QtMainWindow::setMyStatusType(StatusShow::Type type) { +void QtMainWindow::setMyContactRosterItem(boost::shared_ptr<ContactRosterItem> contact) { +	meView_->setContactRosterItem(contact); +} +  void QtMainWindow::setConnecting() { diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h index c489a9e..f1f6900 100644 --- a/Swift/QtUI/QtMainWindow.h +++ b/Swift/QtUI/QtMainWindow.h @@ -49,2 +49,3 @@ namespace Swift {  			void setMyStatusType(StatusShow::Type type); +			void setMyContactRosterItem(boost::shared_ptr<ContactRosterItem> contact);  			void setConnecting(); diff --git a/Swift/QtUI/QtRosterHeader.cpp b/Swift/QtUI/QtRosterHeader.cpp index 2c8f244..69a0ef6 100644 --- a/Swift/QtUI/QtRosterHeader.cpp +++ b/Swift/QtUI/QtRosterHeader.cpp @@ -8,11 +8,13 @@ -#include <QHBoxLayout> -#include <QVBoxLayout> +#include <QBitmap> +#include <qdebug.h>  #include <QFileInfo> +#include <QHBoxLayout> +#include <QHelpEvent>  #include <QIcon> -#include <QSizePolicy> -#include <qdebug.h>  #include <QMouseEvent>  #include <QPainter> -#include <QBitmap> +#include <QSizePolicy> +#include <QToolTip> +#include <QVBoxLayout> @@ -22,2 +24,3 @@  #include <Swift/QtUI/QtNameWidget.h> +#include <Swift/QtUI/Roster/RosterTooltip.h>  #include "QtScaledAvatarCache.h" @@ -91,2 +94,13 @@ void QtRosterHeader::setStreamEncryptionStatus(bool tlsInPlace) { +bool QtRosterHeader::event(QEvent* event) { +	if (event->type() == QEvent::ToolTip) { +		QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event); +		QtScaledAvatarCache scaledAvatarCache(avatarSize_); +		QString text = RosterTooltip::buildDetailedTooltip(contact_.get(), &scaledAvatarCache); +		QToolTip::showText(helpEvent->globalPos(), text); +		return true; +	} +	return QWidget::event(event); +} +  void QtRosterHeader::setAvatar(const QString& path) { @@ -107,2 +121,6 @@ void QtRosterHeader::setNick(const QString& nick) { +void QtRosterHeader::setContactRosterItem(boost::shared_ptr<ContactRosterItem> contact) { +	contact_ = contact; +} +  void QtRosterHeader::setJID(const QString& jid) { diff --git a/Swift/QtUI/QtRosterHeader.h b/Swift/QtUI/QtRosterHeader.h index ad19178..eafbc02 100644 --- a/Swift/QtUI/QtRosterHeader.h +++ b/Swift/QtUI/QtRosterHeader.h @@ -15,3 +15,5 @@  #include <string> -#include "Swiften/Elements/StatusShow.h" +#include <Swiften/Elements/StatusShow.h> +#include <Swiften/Elements/VCard.h> +#include <Swift/Controllers/Roster/ContactRosterItem.h> @@ -36,2 +38,3 @@ namespace Swift {  		void setNick(const QString& nick); +		void setContactRosterItem(boost::shared_ptr<ContactRosterItem> contact); @@ -41,2 +44,4 @@ namespace Swift {  		void setStreamEncryptionStatus(bool tlsInPlace); +	private: +		bool event(QEvent* event);  	signals: @@ -56,2 +61,3 @@ namespace Swift {  		static const int avatarSize_; +		boost::shared_ptr<ContactRosterItem> contact_;  	};  | 
 Swift