From e963c5e939f4e1b7cd8f8d653ec2d1cadbec4a8d Mon Sep 17 00:00:00 2001
From: Tobias Markmann <tm@ayena.de>
Date: Mon, 23 Feb 2015 13:09:55 +0100
Subject: Fix chat window title showing wrong chat title

Setup an application wide focus handler which updates the title if a
focus change to a QtTabWidget happened.

Test-Information:

Tested on OS X 10.9.5 with Qt 5.4.0.

Change-Id: Ib2e2f4c4a93deddb286350bdef685eb7aee504c9

diff --git a/Swift/QtUI/QtChatTabs.cpp b/Swift/QtUI/QtChatTabs.cpp
index 60ffbea..e869028 100644
--- a/Swift/QtUI/QtChatTabs.cpp
+++ b/Swift/QtUI/QtChatTabs.cpp
@@ -40,6 +40,7 @@ QtChatTabs::QtChatTabs(bool singleWindow, SettingsProvider* settingsProvider, bo
 #endif
 	dynamicGrid_ = new QtDynamicGridLayout(this, trellisMode);
 	connect(dynamicGrid_, SIGNAL(tabCloseRequested(int)), this, SLOT(handleTabCloseRequested(int)));
+	connect(dynamicGrid_, SIGNAL(onCurrentIndexChanged(int)), this, SLOT(handleCurrentTabIndexChanged(int)));
 
 	QVBoxLayout *layout = new QVBoxLayout;
 	layout->setSpacing(0);
@@ -172,6 +173,10 @@ void QtChatTabs::handleWidgetShown() {
 	show();
 }
 
+void QtChatTabs::handleCurrentTabIndexChanged(int newIndex) {
+	handleTabTitleUpdated(dynamicGrid_->widget(newIndex));
+}
+
 void QtChatTabs::handleWantsToActivate() {
 	QtTabbable* widget = qobject_cast<QtTabbable*>(sender());
 	Q_ASSERT(widget);
diff --git a/Swift/QtUI/QtChatTabs.h b/Swift/QtUI/QtChatTabs.h
index 04e9eca..bee03ec 100644
--- a/Swift/QtUI/QtChatTabs.h
+++ b/Swift/QtUI/QtChatTabs.h
@@ -42,6 +42,7 @@ namespace Swift {
 			void moveEvent(QMoveEvent* event);
 
 		private slots:
+			void handleCurrentTabIndexChanged(int newIndex);
 			void handleTabClosing();
 			void handleTabTitleUpdated();
 			void handleTabTitleUpdated(QWidget* widget);
diff --git a/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp b/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp
index e0bfa33..cc3208b 100644
--- a/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp
+++ b/Swift/QtUI/Trellis/QtDynamicGridLayout.cpp
@@ -8,6 +8,8 @@
 
 #include <cassert>
 
+#include <QApplication>
+#include <QEvent>
 #include <QLayoutItem>
 #include <QGridLayout>
 #include <QtDebug>
@@ -23,6 +25,7 @@ QtDynamicGridLayout::QtDynamicGridLayout(QWidget* parent, bool enableDND) : QWid
 	gridLayout_ = new QGridLayout(this);
 	setContentsMargins(0,0,0,0);
 	setDimensions(QSize(1,1));
+	connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(handleApplicationFocusChanged(QWidget*,QWidget*)));
 }
 
 QtDynamicGridLayout::~QtDynamicGridLayout() {
@@ -103,6 +106,17 @@ int QtDynamicGridLayout::indexOf(const QWidget* widget) const {
 	return -1;
 }
 
+void QtDynamicGridLayout::handleApplicationFocusChanged(QWidget*, QWidget* newFocus) {
+	if (newFocus) {
+		if (isAncestorOf(newFocus)) {
+			QtTabbable *newTab = dynamic_cast<QtTabbable*>(newFocus->parentWidget());
+			if (newTab) {
+				onCurrentIndexChanged(currentIndex());
+			}
+		}
+	}
+}
+
 int QtDynamicGridLayout::currentIndex() const {
 	return indexOf(currentWidget());
 }
diff --git a/Swift/QtUI/Trellis/QtDynamicGridLayout.h b/Swift/QtUI/Trellis/QtDynamicGridLayout.h
index 3b798bd..616ee5e 100644
--- a/Swift/QtUI/Trellis/QtDynamicGridLayout.h
+++ b/Swift/QtUI/Trellis/QtDynamicGridLayout.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Isode Limited.
+ * Copyright (c) 2014-2015 Isode Limited.
  * All rights reserved.
  * See the COPYING file for more information.
  */
@@ -47,6 +47,7 @@ namespace Swift {
 
 	signals:
 		void tabCloseRequested(int index);
+		void onCurrentIndexChanged(int newIndex);
 
 	public slots:
 		void setDimensions(const QSize& dim);
@@ -62,6 +63,7 @@ namespace Swift {
 	private slots:
 		void handleTabCloseRequested(int index);
 		void handleTabCurrentChanged(int index);
+		void handleApplicationFocusChanged(QWidget* oldFocus, QWidget* newFocus);
 
 	private:
 		void moveTab(QtTabWidget* tabWidget, int oldIndex, int newIndex);
-- 
cgit v0.10.2-6-g49f6