For things like keyboard navigation, we need to mark a given bufferview as the active
one, so concepts like "next/previous channel" have something to refer to. We now mark
the active bufferview by a little dot. The user can switch through the visible views
using the "Forward" and "Back" standard keys, which usually map to Alt + Right/Left.
No (re)storing of the active view yet.
_coreConnectionStatusWidget(new CoreConnectionStatusWidget(Client::coreConnection(), this)),
_titleSetter(this),
_awayLog(0),
- _layoutLoaded(false)
+ _layoutLoaded(false),
+ _activeBufferViewIndex(-1)
{
setAttribute(Qt::WA_DeleteOnClose, false); // we delete the mainwin manually
QKeySequence(jumpModifier + Qt::Key_8)))->setProperty("Index", 8);
coll->addAction("JumpKey9", new Action(tr("Quick Access #9"), coll, this, SLOT(onJumpKey()),
QKeySequence(jumpModifier + Qt::Key_9)))->setProperty("Index", 9);
+
+ // Buffer navigation
+ coll->addAction("NextBufferView", new Action(SmallIcon("go-next-view"), tr("Activate Next Chat List"), coll,
+ this, SLOT(nextBufferView()), QKeySequence(QKeySequence::Forward)));
+ coll->addAction("PreviousBufferView", new Action(SmallIcon("go-previous-view"), tr("Activate Previous Chat List"), coll,
+ this, SLOT(previousBufferView()), QKeySequence(QKeySequence::Back)));
}
void MainWin::setupMenus() {
_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) {
dock = qobject_cast<BufferViewDock *>(action->parent());
if(dock && actionData.toInt() == bufferViewConfigId) {
removeAction(action);
- _bufferViews.removeAll(dock);
Client::bufferViewOverlay()->removeView(dock->bufferViewId());
+ _bufferViews.removeAll(dock);
+
+ if(dock->isActive()) {
+ dock->setActive(false);
+ _activeBufferViewIndex = -1;
+ nextBufferView();
+ }
+
dock->deleteLater();
}
}
if(!_bufferViews.contains(dock))
return;
- if(enabled) {
+ if(enabled)
Client::bufferViewOverlay()->addView(dock->bufferViewId());
- } else {
+ 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 {
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(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::showNotificationsDlg() {
SettingsPageDlg dlg(new NotificationsSettingsPage(this), this);
dlg.exec();
void addBufferView(ClientBufferViewConfig *config);
BufferView *allBuffersView() const;
+ BufferView *activeBufferView() const;
inline BufferWidget *bufferWidget() const { return _bufferWidget; }
inline SystemTray *systemTray() const { return _systemTray; }
public slots:
void showStatusBarMessage(const QString &message);
+ void nextBufferView(); //!< Activate the next bufferview
+ void previousBufferView(); //!< Activate the previous bufferview
//! Quit application
void quit();
void saveLayout();
void bufferViewToggled(bool enabled);
+ void bufferViewVisibilityChanged(bool visible);
+ void changeActiveBufferView(bool backwards);
signals:
void connectToCore(const QVariantMap &connInfo);
BufferHotListFilter *_bufferHotList;
QHash<int, BufferId> _jumpKeyMap;
+ int _activeBufferViewIndex;
friend class QtUi;
};
/***************************************************************************
- * Copyright (C) 2005-09 by the Quassel Project *
+ * Copyright (C) 2005-2010 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
return QTreeView::dropEvent(event);
int res = QMessageBox::question(0, tr("Merge buffers permanently?"),
- tr("Do you want to merge the buffer \"%1\" permanently into buffer \"%2\"?\n This cannot be reversed!").arg(Client::networkModel()->bufferName(bufferId2)).arg(Client::networkModel()->bufferName(bufferId1)),
- QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
+ tr("Do you want to merge the buffer \"%1\" permanently into buffer \"%2\"?\n This cannot be reversed!").arg(Client::networkModel()->bufferName(bufferId2)).arg(Client::networkModel()->bufferName(bufferId1)),
+ QMessageBox::Yes|QMessageBox::No, QMessageBox::No);
if(res == QMessageBox::Yes) {
Client::mergeBuffersPermanently(bufferId1, bufferId2);
}
if(!filterActions.isEmpty()) {
contextMenu->addSeparator();
foreach(QAction *action, filterActions) {
- contextMenu->addAction(action);
+ contextMenu->addAction(action);
}
}
}
QModelIndex parent = currentIndex.parent();
QModelIndex aunt = parent.sibling( parent.row() + rowDelta, parent.column() );
if( rowDelta == -1 )
- resultingIndex = aunt.child( model()->rowCount( aunt ) - 1, 0 );
+ resultingIndex = aunt.child( model()->rowCount( aunt ) - 1, 0 );
else
- resultingIndex = aunt.child( 0, 0 );
+ resultingIndex = aunt.child( 0, 0 );
if( !resultingIndex.isValid() )
- return;
+ return;
}
selectionModel()->setCurrentIndex( resultingIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
selectionModel()->select( resultingIndex, QItemSelectionModel::ClearAndSelect );
// BufferView Dock
// ==============================
BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent)
- : QDockWidget(config->bufferViewName(), parent)
+ : QDockWidget(parent),
+ _active(false),
+ _title(config->bufferViewName())
{
setObjectName("BufferViewDock-" + QString::number(config->bufferViewId()));
toggleViewAction()->setData(config->bufferViewId());
setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea);
connect(config, SIGNAL(bufferViewNameSet(const QString &)), this, SLOT(bufferViewRenamed(const QString &)));
+ updateTitle();
+}
+
+void BufferViewDock::updateTitle() {
+ QString title = _title;
+ if(isActive())
+ title.prepend(QString::fromUtf8("• "));
+ setWindowTitle(title);
+}
+
+void BufferViewDock::setActive(bool active) {
+ if(active != isActive()) {
+ _active = active;
+ updateTitle();
+ if(active)
+ raise(); // for tabbed docks
+ }
}
void BufferViewDock::bufferViewRenamed(const QString &newName) {
- setWindowTitle(newName);
+ _title = newName;
+ updateTitle();
toggleViewAction()->setText(newName);
}
/***************************************************************************
- * Copyright (C) 2005-09 by the Quassel Project *
+ * Copyright (C) 2005-2010 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
int bufferViewId() const;
BufferViewConfig *config() const;
inline BufferView *bufferView() const { return qobject_cast<BufferView *>(widget()); }
+ inline bool isActive() const { return _active; }
public slots:
+ void setActive(bool active = true);
+
+private slots:
void bufferViewRenamed(const QString &newName);
+ void updateTitle();
+
+private:
+
+ bool _active;
+ QString _title;
};
#endif