+ _helpMenu->addSeparator();
+ _helpDebugMenu = _helpMenu->addMenu(SmallIcon("tools-report-bug"), tr("Debug"));
+ _helpDebugMenu->addAction(coll->action("DebugNetworkModel"));
+ _helpDebugMenu->addAction(coll->action("DebugBufferViewOverlay"));
+ _helpDebugMenu->addAction(coll->action("DebugMessageModel"));
+ _helpDebugMenu->addAction(coll->action("DebugHotList"));
+ _helpDebugMenu->addAction(coll->action("DebugLog"));
+ _helpDebugMenu->addSeparator();
+ _helpDebugMenu->addAction(coll->action("ReloadStyle"));
+
+ // Toggle visibility
+ QAction *showMenuBar = QtUi::actionCollection("General")->action("ToggleMenuBar");
+
+ QtUiSettings uiSettings;
+ bool enabled = uiSettings.value("ShowMenuBar", QVariant(true)).toBool();
+ showMenuBar->setChecked(enabled);
+ enabled ? menuBar()->show() : menuBar()->hide();
+
+ connect(showMenuBar, SIGNAL(toggled(bool)), menuBar(), SLOT(setVisible(bool)));
+ connect(showMenuBar, SIGNAL(toggled(bool)), this, SLOT(saveMenuBarStatus(bool)));
+}
+
+
+void MainWin::setupBufferWidget()
+{
+ _bufferWidget = new BufferWidget(this);
+ _bufferWidget->setModel(Client::bufferModel());
+ _bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
+ setCentralWidget(_bufferWidget);
+}
+
+
+void MainWin::addBufferView(int bufferViewConfigId)
+{
+ addBufferView(Client::bufferViewManager()->clientBufferViewConfig(bufferViewConfigId));
+}
+
+
+void MainWin::addBufferView(ClientBufferViewConfig *config)
+{
+ if (!config)
+ return;
+
+ config->setLocked(QtUiSettings().value("LockLayout", false).toBool());
+ BufferViewDock *dock = new BufferViewDock(config, this);
+
+ //create the view and initialize it's filter
+ BufferView *view = new BufferView(dock);
+ view->setFilteredModel(Client::bufferModel(), config);
+ view->installEventFilter(_inputWidget); // for key presses
+
+ Client::bufferModel()->synchronizeView(view);
+
+ dock->setWidget(view);
+ dock->setVisible(_layoutLoaded); // don't show before state has been restored
+
+ addDockWidget(Qt::LeftDockWidgetArea, dock);
+ _bufferViewsMenu->addAction(dock->toggleViewAction());
+
+ connect(dock->toggleViewAction(), SIGNAL(toggled(bool)), this, SLOT(bufferViewToggled(bool)));
+ connect(dock, SIGNAL(visibilityChanged(bool)), SLOT(bufferViewVisibilityChanged(bool)));
+ _bufferViews.append(dock);
+
+ if (!activeBufferView())
+ nextBufferView();
+}
+
+
+void MainWin::removeBufferView(int bufferViewConfigId)
+{
+ QVariant actionData;
+ BufferViewDock *dock;
+ foreach(QAction *action, _bufferViewsMenu->actions()) {
+ actionData = action->data();
+ if (!actionData.isValid())
+ continue;
+
+ dock = qobject_cast<BufferViewDock *>(action->parent());
+ if (dock && actionData.toInt() == bufferViewConfigId) {
+ removeAction(action);
+ Client::bufferViewOverlay()->removeView(dock->bufferViewId());
+ _bufferViews.removeAll(dock);
+
+ if (dock->isActive()) {
+ dock->setActive(false);
+ _activeBufferViewIndex = -1;
+ nextBufferView();
+ }
+
+ dock->deleteLater();
+ }
+ }
+}
+
+
+void MainWin::bufferViewToggled(bool enabled)
+{
+ if (!enabled && !isVisible()) {
+ // hiding the mainwindow triggers a toggle of the bufferview (which pretty much sucks big time)
+ // since this isn't our fault and we can't do anything about it, we suppress the resulting calls
+ return;
+ }
+ QAction *action = qobject_cast<QAction *>(sender());
+ Q_ASSERT(action);
+ BufferViewDock *dock = qobject_cast<BufferViewDock *>(action->parent());
+ Q_ASSERT(dock);
+
+ // Make sure we don't toggle backlog fetch for a view we've already removed
+ if (!_bufferViews.contains(dock))
+ return;
+
+ if (enabled)
+ Client::bufferViewOverlay()->addView(dock->bufferViewId());
+ else
+ Client::bufferViewOverlay()->removeView(dock->bufferViewId());
+}
+
+
+void MainWin::bufferViewVisibilityChanged(bool visible)
+{
+ Q_UNUSED(visible);
+ BufferViewDock *dock = qobject_cast<BufferViewDock *>(sender());
+ Q_ASSERT(dock);
+ if ((!dock->isHidden() && !activeBufferView()) || (dock->isHidden() && dock->isActive()))
+ nextBufferView();
+}
+
+
+BufferView *MainWin::allBuffersView() const
+{
+ // "All Buffers" is always the first dock created
+ if (_bufferViews.count() > 0)
+ return _bufferViews[0]->bufferView();
+ return 0;
+}
+
+
+BufferView *MainWin::activeBufferView() const
+{
+ if (_activeBufferViewIndex < 0 || _activeBufferViewIndex >= _bufferViews.count())
+ return 0;
+ BufferViewDock *dock = _bufferViews.at(_activeBufferViewIndex);
+ return dock->isActive() ? qobject_cast<BufferView *>(dock->widget()) : 0;
+}
+
+
+void MainWin::changeActiveBufferView(int bufferViewId)
+{
+ if (bufferViewId < 0)
+ return;
+
+ BufferView *current = activeBufferView();
+ if (current) {
+ qobject_cast<BufferViewDock *>(current->parent())->setActive(false);
+ _activeBufferViewIndex = -1;
+ }
+
+ for (int i = 0; i < _bufferViews.count(); i++) {
+ BufferViewDock *dock = _bufferViews.at(i);
+ if (dock->bufferViewId() == bufferViewId && !dock->isHidden()) {
+ _activeBufferViewIndex = i;
+ dock->setActive(true);
+ return;
+ }
+ }
+
+ nextBufferView(); // fallback
+}
+
+
+void MainWin::changeActiveBufferView(bool backwards)
+{
+ BufferView *current = activeBufferView();
+ if (current)
+ qobject_cast<BufferViewDock *>(current->parent())->setActive(false);
+
+ if (!_bufferViews.count())
+ return;
+
+ int c = _bufferViews.count();
+ while (c--) { // yes, this will reactivate the current active one if all others fail
+ if (backwards) {
+ if (--_activeBufferViewIndex < 0)
+ _activeBufferViewIndex = _bufferViews.count()-1;
+ }
+ else {
+ if (++_activeBufferViewIndex >= _bufferViews.count())
+ _activeBufferViewIndex = 0;
+ }
+
+ BufferViewDock *dock = _bufferViews.at(_activeBufferViewIndex);
+ if (dock->isHidden())
+ continue;
+
+ dock->setActive(true);
+ return;
+ }
+
+ _activeBufferViewIndex = -1;
+}
+
+
+void MainWin::nextBufferView()
+{
+ changeActiveBufferView(false);
+}
+
+
+void MainWin::previousBufferView()
+{
+ changeActiveBufferView(true);
+}
+
+
+void MainWin::nextBuffer()
+{
+ BufferView *view = activeBufferView();
+ if (view)
+ view->nextBuffer();
+}
+
+
+void MainWin::previousBuffer()
+{
+ BufferView *view = activeBufferView();
+ if (view)
+ view->previousBuffer();
+}
+
+
+void MainWin::hideCurrentBuffer()
+{
+ BufferView *view = activeBufferView();
+ if (view)
+ view->hideCurrentBuffer();
+}
+
+
+void MainWin::showNotificationsDlg()
+{
+ SettingsPageDlg dlg(new NotificationsSettingsPage(this), this);
+ dlg.exec();
+}
+
+
+void MainWin::on_actionConfigureNetworks_triggered()
+{
+ SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
+ dlg.exec();
+}
+
+
+void MainWin::on_actionConfigureViews_triggered()
+{
+ SettingsPageDlg dlg(new BufferViewSettingsPage(this), this);
+ dlg.exec();
+}
+
+
+void MainWin::on_actionLockLayout_toggled(bool lock)
+{
+ QList<VerticalDock *> docks = findChildren<VerticalDock *>();
+ foreach(VerticalDock *dock, docks) {
+ dock->showTitle(!lock);
+ }
+ if (Client::bufferViewManager()) {
+ foreach(ClientBufferViewConfig *config, Client::bufferViewManager()->clientBufferViewConfigs()) {
+ config->setLocked(lock);
+ }
+ }
+ QtUiSettings().setValue("LockLayout", lock);
+}
+
+
+void MainWin::setupNickWidget()
+{
+ // create nick dock
+ NickListDock *nickDock = new NickListDock(tr("Nicks"), this);
+ nickDock->setObjectName("NickDock");
+ nickDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
+
+ _nickListWidget = new NickListWidget(nickDock);
+ nickDock->setWidget(_nickListWidget);
+
+ addDockWidget(Qt::RightDockWidgetArea, nickDock);
+ _viewMenu->addAction(nickDock->toggleViewAction());
+ nickDock->toggleViewAction()->setText(tr("Show Nick List"));
+
+ // See NickListDock::NickListDock();
+ // connect(nickDock->toggleViewAction(), SIGNAL(triggered(bool)), nickListWidget, SLOT(showWidget(bool)));
+
+ // attach the NickListWidget to the BufferModel and the default selection
+ _nickListWidget->setModel(Client::bufferModel());
+ _nickListWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
+}
+
+
+void MainWin::setupChatMonitor()
+{
+ VerticalDock *dock = new VerticalDock(tr("Chat Monitor"), this);
+ dock->setObjectName("ChatMonitorDock");
+
+ ChatMonitorFilter *filter = new ChatMonitorFilter(Client::messageModel(), this);
+ _chatMonitorView = new ChatMonitorView(filter, this);
+ _chatMonitorView->setFocusProxy(_inputWidget);
+ _chatMonitorView->show();
+ dock->setWidget(_chatMonitorView);
+ dock->hide();
+
+ addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical);
+ _viewMenu->addAction(dock->toggleViewAction());
+ dock->toggleViewAction()->setText(tr("Show Chat Monitor"));
+}
+
+
+void MainWin::setupInputWidget()
+{
+ VerticalDock *dock = new VerticalDock(tr("Inputline"), this);
+ dock->setObjectName("InputDock");
+
+ _inputWidget = new InputWidget(dock);
+ dock->setWidget(_inputWidget);
+
+ addDockWidget(Qt::BottomDockWidgetArea, dock);
+
+ _viewMenu->addAction(dock->toggleViewAction());
+ dock->toggleViewAction()->setText(tr("Show Input Line"));
+
+ _inputWidget->setModel(Client::bufferModel());
+ _inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
+
+ _bufferWidget->setFocusProxy(_inputWidget);
+
+ _inputWidget->inputLine()->installEventFilter(_bufferWidget);
+
+ connect(_topicWidget, SIGNAL(switchedPlain()), _bufferWidget, SLOT(setFocus()));
+}
+
+
+void MainWin::setupTopicWidget()
+{
+ VerticalDock *dock = new VerticalDock(tr("Topic"), this);
+ dock->setObjectName("TopicDock");
+ _topicWidget = new TopicWidget(dock);
+
+ dock->setWidget(_topicWidget);
+
+ _topicWidget->setModel(Client::bufferModel());
+ _topicWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());