1
#include "tabmanager.h"
3
#include <QtAlgorithms>
6
#include "tabbablewidget.h"
7
#include "groupchatdlg.h"
9
#include "psioptions.h"
11
TabManager::TabManager(PsiCon* psiCon, QObject *parent)
15
, userManagement_(true)
17
, simplifiedCaption_(false)
21
TabManager::~TabManager()
26
PsiCon* TabManager::psiCon() const
31
TabDlg* TabManager::getTabs(QWidget *widget)
33
QChar kind = tabKind(widget);
34
if (preferedTabsetForKind_.contains(kind)) {
35
return preferedTabsetForKind_[kind];
37
return newTabs(widget);
41
QChar TabManager::tabKind(QWidget *widget) {
44
if (qobject_cast<ChatDlg*> (widget)) {
46
} else if (qobject_cast<GCMainDlg*> (widget)) {
49
qDebug("Checking if widget should be tabbed: Unknown type");
54
bool TabManager::shouldBeTabbed(QWidget *widget)
56
if (!PsiOptions::instance()->getOption("options.ui.tabs.use-tabs").toBool()) {
60
QString grouping = PsiOptions::instance()->getOption("options.ui.tabs.grouping").toString();
61
if (grouping.contains(tabKind(widget))) {
67
void TabManager::tabResized(QSize size) {
68
if (PsiOptions::instance()->getOption("options.ui.remember-window-sizes").toBool()) {
69
PsiOptions::instance()->mapPut("options.ui.tabs.group-state",
70
tabsetToKinds_[static_cast<TabDlg*>(sender())], "size", size);
74
TabDlg* TabManager::newTabs(QWidget *widget)
76
QChar kind = tabKind(widget);
77
QString group, grouping = PsiOptions::instance()->getOption("options.ui.tabs.grouping").toString();
78
foreach(QString g, grouping.split(":")) {
79
if (g.contains(kind)) {
86
QVariantList savedSizes = PsiOptions::instance()->mapKeyList("options.ui.tabs.group-state");
87
QSize size = PsiOptions::instance()->getOption("options.ui.tabs.size").toSize();
88
if (savedSizes.contains(group)) {
89
size = PsiOptions::instance()->mapGet("options.ui.tabs.group-state", group, "size").toSize();
91
foreach(QVariant v, savedSizes) {
92
if (v.toString().contains(kind)) {
93
size = PsiOptions::instance()->mapGet("options.ui.tabs.group-state", v.toString(), "size").toSize();
97
TabDlg *tab = new TabDlg(this, size, tabDlgDelegate_);
98
tab->setUserManagementEnabled(userManagement_);
99
tab->setTabBarShownForSingles(tabSingles_);
100
tab->setSimplifiedCaptionEnabled(simplifiedCaption_);
101
tabsetToKinds_.insert(tab, group);
102
for (int i=0; i < group.length(); i++) {
103
QChar k = group.at(i);
104
if (!preferedTabsetForKind_.contains(k)) {
105
preferedTabsetForKind_.insert(k, tab);
109
connect(tab, SIGNAL(destroyed(QObject*)), SLOT(tabDestroyed(QObject*)));
110
connect(tab, SIGNAL(resized(QSize)), SLOT(tabResized(QSize)));
111
connect(psiCon_, SIGNAL(emitOptionsUpdate()), tab, SLOT(optionsUpdate()));
115
void TabManager::tabDestroyed(QObject* obj)
117
Q_ASSERT(tabs_.contains(static_cast<TabDlg*>(obj)));
118
tabs_.removeAll(static_cast<TabDlg*>(obj));
119
tabsetToKinds_.remove(static_cast<TabDlg*>(obj));
120
QMutableMapIterator<QChar, TabDlg*> it(preferedTabsetForKind_);
121
while (it.hasNext()) {
123
if (preferedTabsetForKind_[it.key()] != obj) continue;
125
foreach(TabDlg* tabDlg, tabs_) {
126
// currently destroyed tab is removed from the list a few lines above
127
if (tabsetToKinds_[tabDlg].contains(it.key())) {
128
preferedTabsetForKind_[it.key()] = tabDlg;
133
if (!ok) it.remove();
137
TabDlg *TabManager::preferredTabsForKind(QChar kind) {
138
return preferedTabsetForKind_.value(kind);
141
void TabManager::setPreferredTabsForKind(QChar kind, TabDlg *tab) {
142
Q_ASSERT(tabs_.contains(tab));
143
preferedTabsetForKind_[kind] = tab;
146
bool TabManager::isChatTabbed(const TabbableWidget* chat) const
148
foreach(TabDlg* tabDlg, tabs_) {
149
if (tabDlg->managesTab(chat)) {
156
TabDlg* TabManager::getManagingTabs(const TabbableWidget* chat) const
158
//FIXME: this looks like it could be broken to me (KIS)
159
//Does this mean that opening two chats to the same jid will go wrong?
160
foreach(TabDlg* tabDlg, tabs_) {
161
if (tabDlg->managesTab(chat)) {
168
const QList<TabDlg*>& TabManager::tabSets()
173
void TabManager::deleteAll()
179
void TabManager::setTabDlgDelegate(TabDlgDelegate *delegate)
181
tabDlgDelegate_ = delegate;
184
void TabManager::setUserManagementEnabled(bool enabled)
186
if (userManagement_ == enabled) {
190
userManagement_ = enabled;
191
foreach (TabDlg *tab, tabs_) {
192
tab->setUserManagementEnabled(enabled);
196
void TabManager::setTabBarShownForSingles(bool enabled)
198
if (tabSingles_ == enabled) {
202
tabSingles_ = enabled;
203
foreach (TabDlg *tab, tabs_) {
204
tab->setTabBarShownForSingles(enabled);
208
void TabManager::setSimplifiedCaptionEnabled(bool enabled)
210
if (simplifiedCaption_ == enabled) {
214
simplifiedCaption_ = enabled;
215
foreach (TabDlg *tab, tabs_) {
216
tab->setSimplifiedCaptionEnabled(enabled);