From a1d2cc819f381db6b7371c55d3c22ffe56596aed Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Fri, 20 Aug 2010 16:12:16 +0100
Subject: Focus the chat input again when the chat log is clicked.

Resolves: #532

diff --git a/Swift/QtUI/QtChatView.cpp b/Swift/QtUI/QtChatView.cpp
index 3324108..90b567f 100644
--- a/Swift/QtUI/QtChatView.cpp
+++ b/Swift/QtUI/QtChatView.cpp
@@ -19,15 +19,14 @@
 namespace Swift {
 
 QtChatView::QtChatView(QWidget* parent) : QWidget(parent) {
-	setFocusPolicy(Qt::NoFocus);
 
 	QVBoxLayout* mainLayout = new QVBoxLayout(this);
 	mainLayout->setSpacing(0);
 	mainLayout->setContentsMargins(0,0,0,0);
 	webView_ = new QtWebView(this);
-	webView_->setFocusPolicy(Qt::NoFocus);
 	connect(webView_, SIGNAL(linkClicked(const QUrl&)), SLOT(handleLinkClicked(const QUrl&)));
 	connect(webView_, SIGNAL(loadFinished(bool)), SLOT(handleViewLoadFinished(bool)));
+	connect(webView_, SIGNAL(gotFocus()), SIGNAL(gotFocus()));
 #ifdef Q_WS_X11
 	/* To give a border on Linux, where it looks bad without */
 	QStackedWidget* stack = new QStackedWidget(this);
diff --git a/Swift/QtUI/QtChatView.h b/Swift/QtUI/QtChatView.h
index ea64265..f60d049 100644
--- a/Swift/QtUI/QtChatView.h
+++ b/Swift/QtUI/QtChatView.h
@@ -25,6 +25,9 @@ namespace Swift {
 			void addMessage(const ChatSnippet& snippet);
 			bool isScrolledToBottom() const;
 
+		signals:
+			void gotFocus();
+
 		public slots:
 			void copySelectionToClipboard();
 			void scrollToBottom();
diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp
index f39353c..5b73fec 100644
--- a/Swift/QtUI/QtChatWindow.cpp
+++ b/Swift/QtUI/QtChatWindow.cpp
@@ -44,7 +44,6 @@ QtChatWindow::QtChatWindow(const QString &contact, UIEventStream* eventStream) :
 	layout->addWidget(logRosterSplitter);
 
 	messageLog_ = new QtChatView(this);
-	messageLog_->setFocusPolicy(Qt::NoFocus);
 	logRosterSplitter->addWidget(messageLog_);
 
 	treeWidget_ = new QtTreeWidget(eventStream_);
@@ -59,6 +58,7 @@ QtChatWindow::QtChatWindow(const QString &contact, UIEventStream* eventStream) :
 	midBarLayout->setContentsMargins(0,0,0,0);
 	midBarLayout->setSpacing(2);
 	midBarLayout->addStretch();
+
 	labelsWidget_ = new QComboBox(this);
 	labelsWidget_->setFocusPolicy(Qt::NoFocus);
 	labelsWidget_->hide();
@@ -76,9 +76,13 @@ QtChatWindow::QtChatWindow(const QString &contact, UIEventStream* eventStream) :
 	connect(input_, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
 	connect(input_, SIGNAL(textChanged()), this, SLOT(handleInputChanged()));
 	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);
+	input_->setFocus();
 }
 
 QtChatWindow::~QtChatWindow() {
@@ -347,6 +351,7 @@ void QtChatWindow::handleInputChanged() {
 void QtChatWindow::show() {
 	QWidget::show();
 	emit windowOpening();
+	input_->setFocus();
 }
 
 void QtChatWindow::activate() {
@@ -354,6 +359,7 @@ void QtChatWindow::activate() {
 		QWidget::show();
 	}
 	emit wantsToActivate();
+	input_->setFocus();
 }
 
 void QtChatWindow::resizeEvent(QResizeEvent*) {
diff --git a/Swift/QtUI/QtWebView.cpp b/Swift/QtUI/QtWebView.cpp
new file mode 100644
index 0000000..a97357d
--- /dev/null
+++ b/Swift/QtUI/QtWebView.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010 Kevin Smith
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+
+#include "Swift/QtUI/QtWebView.h"
+
+#include <QKeyEvent>
+#include <QFocusEvent>
+
+namespace Swift {
+QtWebView::QtWebView(QWidget* parent) : QWebView(parent) {
+
+}
+
+void QtWebView::keyPressEvent(QKeyEvent* event) {
+	Qt::KeyboardModifiers modifiers = event->modifiers();
+	int key = event->key();
+	if (modifiers == Qt::ShiftModifier && (key == Qt::Key_PageUp || key == Qt::Key_PageDown)) {
+		modifiers = Qt::NoModifier;
+	}
+	QKeyEvent* translatedEvent = new QKeyEvent(QEvent::KeyPress,
+							   key,
+							   modifiers,
+							   event->text(),
+							   event->isAutoRepeat(),
+							   event->count());
+	QWebView::keyPressEvent(translatedEvent);
+	delete translatedEvent;
+}
+
+void QtWebView::focusInEvent(QFocusEvent* event) {
+	QWebView::focusInEvent(event);
+	emit gotFocus();
+}
+
+}
diff --git a/Swift/QtUI/QtWebView.h b/Swift/QtUI/QtWebView.h
index 8ed5842..3ab5c64 100644
--- a/Swift/QtUI/QtWebView.h
+++ b/Swift/QtUI/QtWebView.h
@@ -11,22 +11,14 @@
 
 namespace Swift {
 	class QtWebView : public QWebView {
+		Q_OBJECT
 		public:
-			QtWebView(QWidget* parent) : QWebView(parent) {}
-			void keyPressEvent(QKeyEvent* event) {
-				Qt::KeyboardModifiers modifiers = event->modifiers();
-				int key = event->key();
-				if (modifiers == Qt::ShiftModifier && (key == Qt::Key_PageUp || key == Qt::Key_PageDown)) {
-					modifiers = Qt::NoModifier;
-				}
-				QKeyEvent* translatedEvent = new QKeyEvent(QEvent::KeyPress,
-										   key,
-										   modifiers,
-										   event->text(),
-										   event->isAutoRepeat(),
-										   event->count());
-				QWebView::keyPressEvent(translatedEvent);
-				delete translatedEvent;
-			};
+			QtWebView(QWidget* parent);
+			void keyPressEvent(QKeyEvent* event);
+		signals:
+			void gotFocus();
+
+		protected:
+			void focusInEvent(QFocusEvent* event);
 	};
 }
diff --git a/Swift/QtUI/SConscript b/Swift/QtUI/SConscript
index ddc0b31..6c30f42 100644
--- a/Swift/QtUI/SConscript
+++ b/Swift/QtUI/SConscript
@@ -105,6 +105,7 @@ sources = [
     "ContextMenus/QtContextMenu.cpp",
     "QtSubscriptionRequestWindow.cpp",
     "QtRosterHeader.cpp",
+    "QtWebView.cpp",
     "qrc_DefaultTheme.cc",
     "qrc_Swift.cc",
   ]
-- 
cgit v0.10.2-6-g49f6