X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=26ddf00e475aa14cecf03ff1f471444049636ca3;hp=8fbbdd349e66f8e72acbd6d2181f36c093725fcd;hb=2b5d210cb6e61a25a6a9d0c119aec025322b3b84;hpb=a540a0285feef171e16fd6225b0e045fc5fc52e4 diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 8fbbdd34..26ddf00e 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -60,6 +60,10 @@ BufferView::BufferView(QWidget *parent) BufferViewDelegate *tristateDelegate = new BufferViewDelegate(this); setItemDelegate(tristateDelegate); delete oldDelegate; + + UiStyleSettings s("QtUiStyle/Fonts"); // li'l dirty here, but fonts are stored in QtUiStyle :/ + s.notify("BufferView", this, SLOT(setCustomFont(QVariant))); + setCustomFont(s.value("BufferView", QFont())); } void BufferView::init() { @@ -82,9 +86,11 @@ void BufferView::init() { // activated() fails on X11 and Qtopia at least #if defined Q_WS_QWS || defined Q_WS_X11 + disconnect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(joinChannel(QModelIndex))); connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(joinChannel(QModelIndex))); #else // afaik this is better on Mac and Windows + disconnect(this, SIGNAL(activated(QModelIndex)), this, SLOT(joinChannel(QModelIndex))); connect(this, SIGNAL(activated(QModelIndex)), SLOT(joinChannel(QModelIndex))); #endif } @@ -116,6 +122,7 @@ void BufferView::setModel(QAbstractItemModel *model) { header()->addAction(showSection); } + connect(model, SIGNAL(layoutChanged()), this, SLOT(on_layoutChanged())); } void BufferView::setFilteredModel(QAbstractItemModel *model_, BufferViewConfig *config) { @@ -188,6 +195,13 @@ void BufferView::setRootIndexForNetworkId(const NetworkId &networkId) { } } +void BufferView::setCustomFont(const QVariant &v) { + QFont font = v.value(); + if(font.family().isEmpty()) + font = QApplication::font(); + setFont(font); +} + void BufferView::joinChannel(const QModelIndex &index) { BufferInfo::Type bufferType = (BufferInfo::Type)index.data(NetworkModel::BufferTypeRole).value(); @@ -262,7 +276,9 @@ void BufferView::removeSelectedBuffers(bool permanently) { continue; removedRows << bufferId; + } + foreach(BufferId bufferId, removedRows) { if(permanently) config()->requestRemoveBufferPermanently(bufferId); else @@ -270,17 +286,21 @@ void BufferView::removeSelectedBuffers(bool permanently) { } } -void BufferView::rowsInserted(const QModelIndex & parent, int start, int end) { +void BufferView::rowsInserted(const QModelIndex &parent, int start, int end) { QTreeView::rowsInserted(parent, start, end); // ensure that newly inserted network nodes are expanded per default if(parent.data(NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType) return; - if(model()->rowCount(parent) == 1 && parent.data(NetworkModel::ItemActiveRole) == true) { - // without updating the parent the expand will have no effect... Qt Bug? - update(parent); - expand(parent); + setExpandedState(parent); +} + +void BufferView::on_layoutChanged() { + int numNets = model()->rowCount(QModelIndex()); + for(int row = 0; row < numNets; row++) { + QModelIndex networkIdx = model()->index(row, 0, QModelIndex()); + setExpandedState(networkIdx); } } @@ -299,7 +319,6 @@ void BufferView::on_configChanged() { if(!networkId.isValid()) continue; - update(networkIdx); setExpandedState(networkIdx); } @@ -307,8 +326,6 @@ void BufferView::on_configChanged() { // update selection to current one Client::bufferModel()->synchronizeView(this); } - - return; } void BufferView::storeExpandedState(const QModelIndex &networkIdx) { @@ -340,9 +357,11 @@ void BufferView::setExpandedState(const QModelIndex &networkIdx) { expandNetwork = (bool)(oldState & WasExpanded); } - storeExpandedState(networkIdx); // this call is needed to keep track of the isActive state - if(expandNetwork != isExpanded(networkIdx)) + if(expandNetwork != isExpanded(networkIdx)) { + update(networkIdx); setExpanded(networkIdx, expandNetwork); + } + storeExpandedState(networkIdx); // this call is needed to keep track of the isActive state } void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { @@ -465,9 +484,44 @@ QSize BufferView::sizeHint() const { // **************************************** // BufferViewDelgate // **************************************** +class ColorsChangedEvent : public QEvent { +public: + ColorsChangedEvent() : QEvent(QEvent::User) {}; +}; + BufferViewDelegate::BufferViewDelegate(QObject *parent) - : QStyledItemDelegate(parent) + : QStyledItemDelegate(parent), + _updateColors(false) { + loadColors(); + + UiSettings s("QtUiStyle/Colors"); + s.notify("inactiveActivityFG", this, SLOT(colorsChanged())); + s.notify("noActivityFG", this, SLOT(colorsChanged())); + s.notify("highlightActivityFG", this, SLOT(colorsChanged())); + s.notify("newMessageActivityFG", this, SLOT(colorsChanged())); + s.notify("otherActivityFG", this, SLOT(colorsChanged())); +} + +void BufferViewDelegate::colorsChanged() { + // avoid mutliple unneded reloads of all colors + if(_updateColors) + return; + _updateColors = true; + QCoreApplication::postEvent(this, new ColorsChangedEvent()); +} + +void BufferViewDelegate::customEvent(QEvent *event) { + if(event->type() != QEvent::User) + return; + + loadColors(); + _updateColors = false; + + event->accept(); +} + +void BufferViewDelegate::loadColors() { UiSettings s("QtUiStyle/Colors"); _FgColorInactiveActivity = s.value("inactiveActivityFG", QVariant(QColor(Qt::gray))).value(); _FgColorNoActivity = s.value("noActivityFG", QVariant(QColor(Qt::black))).value(); @@ -546,3 +600,22 @@ void BufferViewDock::bufferViewRenamed(const QString &newName) { setWindowTitle(newName); toggleViewAction()->setText(newName); } + +int BufferViewDock::bufferViewId() const { + BufferView *view = bufferView(); + if(!view) + return 0; + + if(view->config()) + return view->config()->bufferViewId(); + else + return 0; +} + +BufferViewConfig *BufferViewDock::config() const { + BufferView *view = bufferView(); + if(!view) + return 0; + else + return view->config(); +}