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); + } +} + } |