diff options
Diffstat (limited to 'Swift/Controllers/HistoryViewController.cpp')
| -rw-r--r-- | Swift/Controllers/HistoryViewController.cpp | 46 | 
1 files changed, 34 insertions, 12 deletions
diff --git a/Swift/Controllers/HistoryViewController.cpp b/Swift/Controllers/HistoryViewController.cpp index b7b71cd..8efdc99 100644 --- a/Swift/Controllers/HistoryViewController.cpp +++ b/Swift/Controllers/HistoryViewController.cpp @@ -31,7 +31,7 @@ HistoryViewController::HistoryViewController(  			historyWindowFactory_(historyWindowFactory),  			historyWindow_(NULL),  			selectedItem_(NULL), -			currentDate_(boost::gregorian::not_a_date_time) { +			currentResultDate_(boost::gregorian::not_a_date_time) {  	uiEventStream_->onUIEvent.connect(boost::bind(&HistoryViewController::handleUIEvent, this, _1));  	historyController_->onNewMessage.connect(boost::bind(&HistoryViewController::handleNewMessage, this, _1)); @@ -44,6 +44,8 @@ HistoryViewController::~HistoryViewController() {  	if (historyWindow_) {  		historyWindow_->onSelectedContactChanged.disconnect(boost::bind(&HistoryViewController::handleSelectedContactChanged, this, _1));  		historyWindow_->onReturnPressed.disconnect(boost::bind(&HistoryViewController::handleReturnPressed, this, _1)); +		historyWindow_->onScrollReachedTop.disconnect(boost::bind(&HistoryViewController::handleScrollReachedTop, this, _1)); +		historyWindow_->onScrollReachedBottom.disconnect(boost::bind(&HistoryViewController::handleScrollReachedBottom, this, _1));  		delete historyWindow_;  	}  	delete roster_; @@ -57,6 +59,8 @@ void HistoryViewController::handleUIEvent(boost::shared_ptr<UIEvent> rawEvent) {  			historyWindow_ = historyWindowFactory_->createHistoryWindow(uiEventStream_);  			historyWindow_->onSelectedContactChanged.connect(boost::bind(&HistoryViewController::handleSelectedContactChanged, this, _1));  			historyWindow_->onReturnPressed.connect(boost::bind(&HistoryViewController::handleReturnPressed, this, _1)); +			historyWindow_->onScrollReachedTop.connect(boost::bind(&HistoryViewController::handleScrollReachedTop, this, _1)); +			historyWindow_->onScrollReachedBottom.connect(boost::bind(&HistoryViewController::handleScrollReachedBottom, this, _1));  			historyWindow_->setRosterModel(roster_);  		} @@ -84,20 +88,23 @@ void HistoryViewController::handleSelectedContactChanged(RosterItem* newContact)  	std::vector<HistoryMessage> messages;  	if (roomPrivateContacts_.count(contactJID)) { -		currentDate_ = *roomPrivateContacts_[contactJID].rbegin(); -		messages = historyController_->getMessages(selfJID_, contactJID, HistoryMessage::PrivateMessage, currentDate_); +		currentResultDate_ = *roomPrivateContacts_[contactJID].rbegin(); +		messages = historyController_->getMessagesFromDate(selfJID_, contactJID, HistoryMessage::PrivateMessage, currentResultDate_); +		currentItemType_ = HistoryMessage::PrivateMessage;  	}  	else if (contacts_.count(contactJID)) { -		currentDate_ = *contacts_[contactJID].rbegin(); -		messages = historyController_->getMessages(selfJID_, contactJID, HistoryMessage::Chat, currentDate_); +		currentResultDate_ = *contacts_[contactJID].rbegin(); +		messages = historyController_->getMessagesFromDate(selfJID_, contactJID, HistoryMessage::Chat, currentResultDate_); +		currentItemType_ = HistoryMessage::Chat;  	}  	else { -		currentDate_ = *rooms_[contactJID].rbegin(); -		messages = historyController_->getMessages(selfJID_, contactJID, HistoryMessage::Groupchat, currentDate_); +		currentResultDate_ = *rooms_[contactJID].rbegin(); +		messages = historyController_->getMessagesFromDate(selfJID_, contactJID, HistoryMessage::Groupchat, currentResultDate_); +		currentItemType_ = HistoryMessage::Groupchat;  	}  	foreach (const HistoryMessage& message, messages) { -		addNewMessage(message); +		addNewMessage(message, false);  	}  } @@ -114,7 +121,7 @@ void HistoryViewController::handleNewMessage(const HistoryMessage& message) {  	// check current conversation  	if (selectedItem_ && selectedItem_->getJID() == displayJID) { -		addNewMessage(message); +		addNewMessage(message, false);  	}  	// add new contact  	else if (message.getType() == HistoryMessage::Groupchat && !rooms_.count(displayJID)) { @@ -133,10 +140,10 @@ void HistoryViewController::handleNewMessage(const HistoryMessage& message) {  	}  } -void HistoryViewController::addNewMessage(const HistoryMessage& message) { +void HistoryViewController::addNewMessage(const HistoryMessage& message, bool addAtTheTop) {  	bool senderIsSelf = message.getFromJID().toBare() == selfJID_;  	std::string avatarPath = avatarManager_->getAvatarPath(message.getFromJID()).string(); -	historyWindow_->addMessage(message.getMessage(), nickResolver_->jidToNick(message.getFromJID()), senderIsSelf, avatarPath, message.getTime()); +	historyWindow_->addMessage(message.getMessage(), nickResolver_->jidToNick(message.getFromJID()), senderIsSelf, avatarPath, message.getTime(), addAtTheTop);  }  void HistoryViewController::handleReturnPressed(const std::string& keyword) { @@ -146,7 +153,6 @@ void HistoryViewController::handleReturnPressed(const std::string& keyword) {  	roomPrivateContacts_.clear();  	selectedItem_ = NULL;  	historyWindow_->resetConversationView(); -	// TODO set date  	// MUCs  	rooms_ = historyController_->getContacts(selfJID_, HistoryMessage::Groupchat, keyword); @@ -170,4 +176,20 @@ void HistoryViewController::handleReturnPressed(const std::string& keyword) {  	}  } +void HistoryViewController::handleScrollReachedTop(const boost::gregorian::date& date) { +	std::vector<HistoryMessage> messages = historyController_->getMessagesFromPreviousDate(selfJID_, selectedItem_->getJID(), currentItemType_, date); + +	reverse_foreach (const HistoryMessage& message, messages) { +		addNewMessage(message, true); +	} +} + +void HistoryViewController::handleScrollReachedBottom(const boost::gregorian::date& date) { +	std::vector<HistoryMessage> messages = historyController_->getMessagesFromNextDate(selfJID_, selectedItem_->getJID(), currentItemType_, date); + +	foreach (const HistoryMessage& message, messages) { +		addNewMessage(message, true); +	} +} +  }  | 
 Swift