diff options
Diffstat (limited to 'Swift/QtUI/QtChatWindow.cpp')
| -rw-r--r-- | Swift/QtUI/QtChatWindow.cpp | 107 | 
1 files changed, 89 insertions, 18 deletions
| diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp index 1a909fd..b2644b2 100644 --- a/Swift/QtUI/QtChatWindow.cpp +++ b/Swift/QtUI/QtChatWindow.cpp @@ -1,5 +1,5 @@  /* - * Copyright (c) 2010 Kevin Smith + * Copyright (c) 2010-2011 Kevin Smith   * Licensed under the GNU General Public License v3.   * See Documentation/Licenses/GPLv3.txt for more information.   */ @@ -13,10 +13,12 @@  #include "MessageSnippet.h"  #include "SystemMessageSnippet.h"  #include "QtTextEdit.h" +#include "QtSettingsProvider.h"  #include "QtScaledAvatarCache.h"  #include "SwifTools/TabComplete.h" +#include <QLabel>  #include <QApplication>  #include <QBoxLayout>  #include <QCloseEvent> @@ -35,25 +37,27 @@ QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventSt  	inputEnabled_ = true;  	completer_ = NULL;  	theme_ = theme; +	isCorrection_ = false;  	updateTitleWithUnreadCount(); +	QtSettingsProvider settings;  	QBoxLayout *layout = new QBoxLayout(QBoxLayout::TopToBottom, this);  	layout->setContentsMargins(0,0,0,0);  	layout->setSpacing(2); -	 -	QSplitter *logRosterSplitter = new QSplitter(this); -	logRosterSplitter->setAutoFillBackground(true); -	layout->addWidget(logRosterSplitter); +	logRosterSplitter_ = new QSplitter(this); +	logRosterSplitter_->setAutoFillBackground(true); +	layout->addWidget(logRosterSplitter_);  	messageLog_ = new QtChatView(theme, this); -	logRosterSplitter->addWidget(messageLog_); +	logRosterSplitter_->addWidget(messageLog_);  	treeWidget_ = new QtTreeWidget(eventStream_);  	treeWidget_->setEditable(false);  	treeWidget_->hide(); -	logRosterSplitter->addWidget(treeWidget_); -	logRosterSplitter->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); +	logRosterSplitter_->addWidget(treeWidget_); +	logRosterSplitter_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); +	connect(logRosterSplitter_, SIGNAL(splitterMoved(int, int)), this, SLOT(handleSplitterMoved(int, int)));  	QWidget* midBar = new QWidget(this);  	layout->addWidget(midBar); @@ -69,10 +73,17 @@ QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventSt  	labelsWidget_->setSizeAdjustPolicy(QComboBox::AdjustToContents);  	midBarLayout->addWidget(labelsWidget_,0); +	QHBoxLayout* inputBarLayout = new QHBoxLayout(); +	inputBarLayout->setContentsMargins(0,0,0,0); +	inputBarLayout->setSpacing(2);  	input_ = new QtTextEdit(this);  	input_->setAcceptRichText(false); -	layout->addWidget(input_); -	 +	inputBarLayout->addWidget(input_); +	correctingLabel_ = new QLabel(tr("Correcting"), this); +	inputBarLayout->addWidget(correctingLabel_); +	correctingLabel_->hide(); +	layout->addLayout(inputBarLayout); +  	inputClearing_ = false;  	contactIsTyping_ = false; @@ -80,18 +91,23 @@ QtChatWindow::QtChatWindow(const QString &contact, QtChatTheme* theme, UIEventSt  	connect(input_, SIGNAL(returnPressed()), this, SLOT(returnPressed()));  	connect(input_, SIGNAL(textChanged()), this, SLOT(handleInputChanged()));  	setFocusProxy(input_); -	logRosterSplitter->setFocusProxy(input_); +	logRosterSplitter_->setFocusProxy(input_);  	midBar->setFocusProxy(input_);  	messageLog_->setFocusProxy(input_);  	connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(qAppFocusChanged(QWidget*, QWidget*)));  	connect(messageLog_, SIGNAL(gotFocus()), input_, SLOT(setFocus()));  	resize(400,300); +	connect(messageLog_, SIGNAL(fontResized(int)), this, SIGNAL(fontResized(int)));  }  QtChatWindow::~QtChatWindow() {  } +void QtChatWindow::handleFontResized(int fontSizeSteps) { +	messageLog_->resizeFont(fontSizeSteps); +} +  void QtChatWindow::setTabComplete(TabComplete* completer) {  	completer_ = completer;  } @@ -118,11 +134,45 @@ void QtChatWindow::handleKeyPressEvent(QKeyEvent* event) {  		emit requestActiveTab();  	} else if (key == Qt::Key_Tab) {  		tabComplete(); +	} else if ((key == Qt::Key_Up) && input_->toPlainText().isEmpty() && !(lastSentMessage_.isEmpty())) { +		beginCorrection(); +	} else if (key == Qt::Key_Down && isCorrection_ && input_->textCursor().atBlockEnd()) { +		cancelCorrection();  	} else {  		messageLog_->handleKeyPressEvent(event);  	}  } +void QtChatWindow::beginCorrection() { +	QTextCursor cursor = input_->textCursor(); +	cursor.select(QTextCursor::Document); +	cursor.beginEditBlock(); +	cursor.insertText(QString(lastSentMessage_)); +	cursor.endEditBlock(); +	isCorrection_ = true; +	correctingLabel_->show(); +} + +void QtChatWindow::cancelCorrection() { +	QTextCursor cursor = input_->textCursor(); +	cursor.select(QTextCursor::Document); +	cursor.removeSelectedText(); +	isCorrection_ = false; +	correctingLabel_->hide(); +} + +QByteArray QtChatWindow::getSplitterState() { +	return logRosterSplitter_->saveState(); +} + +void QtChatWindow::handleChangeSplitterState(QByteArray state) { +	logRosterSplitter_->restoreState(state); +} + +void QtChatWindow::handleSplitterMoved(int, int) { +	emit splitterMoved(); +} +  void QtChatWindow::tabComplete() {  	if (!completer_) {  		return; @@ -150,7 +200,7 @@ void QtChatWindow::tabComplete() {  }  void QtChatWindow::setRosterModel(Roster* roster) { -	treeWidget_->setRosterModel(roster);	 +	treeWidget_->setRosterModel(roster);  }  void QtChatWindow::setAvailableSecurityLabels(const std::vector<SecurityLabelsCatalog::Item>& labels) { @@ -204,10 +254,13 @@ void QtChatWindow::qAppFocusChanged(QWidget *old, QWidget *now) {  	Q_UNUSED(old);  	Q_UNUSED(now);  	if (isWidgetSelected()) { +		lastLineTracker_.setHasFocus(true);  		input_->setFocus();  		onAllMessagesRead();  	} -	 +	else { +		lastLineTracker_.setHasFocus(false); +	}  }  void QtChatWindow::setInputEnabled(bool enabled) { @@ -236,7 +289,7 @@ void QtChatWindow::setContactChatState(ChatState::ChatStateType state) {  QtTabbable::AlertType QtChatWindow::getWidgetAlertState() {  	if (contactIsTyping_) {  		return ImpendingActivity; -	}  +	}  	if (unreadCount_ > 0) {  		return WaitingActivity;  	} @@ -265,7 +318,6 @@ std::string QtChatWindow::addMessage(const std::string &message, const std::stri  	if (isWidgetSelected()) {  		onAllMessagesRead();  	} -  	QString scaledAvatarPath = QtScaledAvatarCache(32).getScaledAvatarPath(avatarPath.c_str());  	QString htmlString; @@ -281,6 +333,12 @@ std::string QtChatWindow::addMessage(const std::string &message, const std::stri  	htmlString += styleSpanStart + messageHTML + styleSpanEnd;  	bool appendToPrevious = !previousMessageWasSystem_ && !previousMessageWasPresence_ && ((senderIsSelf && previousMessageWasSelf_) || (!senderIsSelf && !previousMessageWasSelf_ && previousSenderName_ == P2QSTRING(senderName))); +	if (lastLineTracker_.getShouldMoveLastLine()) { +		/* should this be queued? */ +		messageLog_->addLastSeenLine(); +		/* if the line is added we should break the snippet */ +		appendToPrevious = false; +	}  	QString qAvatarPath =  scaledAvatarPath.isEmpty() ? "qrc:/icons/avatar.png" : QUrl::fromLocalFile(scaledAvatarPath).toEncoded();  	std::string id = id_.generateID();  	messageLog_->addMessage(boost::shared_ptr<ChatSnippet>(new MessageSnippet(htmlString, Qt::escape(P2QSTRING(senderName)), B2QDATE(time), qAvatarPath, senderIsSelf, appendToPrevious, theme_, P2QSTRING(id)))); @@ -343,6 +401,15 @@ void QtChatWindow::addSystemMessage(const std::string& message) {  	previousMessageWasPresence_ = false;  } +void QtChatWindow::replaceMessage(const std::string& message, const std::string& id, const boost::posix_time::ptime& time) { +	if (!id.empty()) { +		QString messageHTML(Qt::escape(P2QSTRING(message))); +		messageHTML = P2QSTRING(Linkify::linkify(Q2PSTRING(messageHTML))); +		messageHTML.replace("\n","<br/>"); +		messageLog_->replaceMessage(messageHTML, P2QSTRING(id), B2QDATE(time)); +	} +} +  void QtChatWindow::addPresenceMessage(const std::string& message) {  	if (isWidgetSelected()) {  		onAllMessagesRead(); @@ -364,9 +431,11 @@ void QtChatWindow::returnPressed() {  		return;  	}  	messageLog_->scrollToBottom(); -	onSendMessageRequest(Q2PSTRING(input_->toPlainText())); +	lastSentMessage_ = QString(input_->toPlainText()); +	onSendMessageRequest(Q2PSTRING(input_->toPlainText()), isCorrection_);  	inputClearing_ = true;  	input_->clear(); +	cancelCorrection();  	inputClearing_ = false;  } @@ -382,7 +451,9 @@ void QtChatWindow::handleInputChanged() {  }  void QtChatWindow::show() { -	QWidget::show(); +	if (parentWidget() == NULL) { +		QWidget::show(); +	}  	emit windowOpening();  } @@ -399,7 +470,7 @@ void QtChatWindow::resizeEvent(QResizeEvent*) {  }  void QtChatWindow::moveEvent(QMoveEvent*) { -	emit geometryChanged();	 +	emit geometryChanged();  }  void QtChatWindow::replaceLastMessage(const std::string& message) { | 
 Swift
 Swift