summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/Controllers/HistoryViewController.cpp')
-rw-r--r--Swift/Controllers/HistoryViewController.cpp46
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);
+ }
+}
+
}