- return;
- }
-
- if(model()) {
- disconnect(this, 0, model(), 0);
- }
-
- if(!model_) {
- setModel(model_);
- } else {
- BufferViewFilter *filter = new BufferViewFilter(model_, config);
- setModel(filter);
- connect(this, SIGNAL(removeBuffer(const QModelIndex &)),
- filter, SLOT(removeBuffer(const QModelIndex &)));
- }
- setConfig(config);
-}
-
-void BufferView::setSelectionModel(QItemSelectionModel *selectionModel) {
- if(QTreeView::selectionModel())
- disconnect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)),
- model(), SIGNAL(checkPreviousCurrentForRemoval(QModelIndex, QModelIndex)));
-
- QTreeView::setSelectionModel(selectionModel);
- BufferViewFilter *filter = qobject_cast<BufferViewFilter *>(model());
- if(filter) {
- connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)),
- filter, SLOT(checkPreviousCurrentForRemoval(QModelIndex, QModelIndex)));
- }
-}
-
-void BufferView::setConfig(BufferViewConfig *config) {
- if(_config == config)
- return;
-
- if(_config) {
- disconnect(_config, 0, this, 0);
- }
-
- _config = config;
- if(config) {
- connect(config, SIGNAL(networkIdSet(const NetworkId &)), this, SLOT(setRootIndexForNetworkId(const NetworkId &)));
- setRootIndexForNetworkId(config->networkId());
- } else {
- setRootIndex(QModelIndex());
- }
-}
-
-void BufferView::setRootIndexForNetworkId(const NetworkId &networkId) {
- if(!networkId.isValid() || !model()) {
- setRootIndex(QModelIndex());
- } else {
- int networkCount = model()->rowCount();
- QModelIndex child;
- for(int i = 0; i < networkCount; i++) {
- child = model()->index(i, 0);
- if(networkId == model()->data(child, NetworkModel::NetworkIdRole).value<NetworkId>())
- setRootIndex(child);
- }
- }
-}
-
-void BufferView::joinChannel(const QModelIndex &index) {
- BufferInfo::Type bufferType = (BufferInfo::Type)index.data(NetworkModel::BufferTypeRole).value<int>();
-
- if(bufferType != BufferInfo::ChannelBuffer)
- return;
-
- BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
-
- Client::userInput(bufferInfo, QString("/JOIN %1").arg(bufferInfo.bufferName()));
-}
-
-void BufferView::keyPressEvent(QKeyEvent *event) {
- if(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) {
- event->accept();
- QModelIndex index = selectionModel()->selectedIndexes().first();
- if(index.isValid()) {
- emit removeBuffer(index);
- }
- }
- QTreeView::keyPressEvent(event);
-}
-
-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);
- }
-}
-
-void BufferView::layoutChanged() {
- Q_ASSERT(model());
-
- // expand all active networks
- QModelIndex networkIdx;
- for(int row = 0; row < model()->rowCount(); row++) {
- networkIdx = model()->index(row, 0);
- update(networkIdx);
- if(model()->rowCount(networkIdx) > 0 && model()->data(networkIdx, NetworkModel::ItemActiveRole) == true) {
- expand(networkIdx);
- } else {
- collapse(networkIdx);
- }
- }
-
- // update selection to current one
- MappedSelectionModel *mappedSelectionModel = qobject_cast<MappedSelectionModel *>(selectionModel());
- if(!config() || !mappedSelectionModel)
- return;
-
- mappedSelectionModel->mappedSetCurrentIndex(Client::bufferModel()->standardSelectionModel()->currentIndex(), QItemSelectionModel::Current);
- mappedSelectionModel->mappedSelect(Client::bufferModel()->standardSelectionModel()->selection(), QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
-}
-
-void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) {
- QTreeView::dataChanged(topLeft, bottomRight);
-
- // determine how many items have been changed and if any of them is a networkitem
- // which just swichted from active to inactive or vice versa
- if(topLeft.data(NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType)
- return;
-
- for(int i = topLeft.row(); i <= bottomRight.row(); i++) {
- QModelIndex networkIdx = topLeft.sibling(topLeft.row(), 0);
- if(model()->rowCount(networkIdx) == 0)
- continue;
-
- bool isActive = networkIdx.data(NetworkModel::ItemActiveRole).toBool();
-#ifdef SPUTDEV
- if(isExpanded(networkIdx) != isActive) setExpanded(networkIdx, true);
-#else
- if(isExpanded(networkIdx) != isActive) setExpanded(networkIdx, isActive);
-#endif
- }
-}
-
-
-void BufferView::toggleHeader(bool checked) {
- QAction *action = qobject_cast<QAction *>(sender());
- header()->setSectionHidden((action->property("column")).toInt(), !checked);
-}
-
-void BufferView::showContextMenu(const QPoint &pos) {
- QModelIndex index = indexAt(pos);
- if(!index.isValid()) return;
- QMenu contextMenu(this);
- QAction *connectNetAction = new QAction(tr("Connect"), this);
- QAction *disconnectNetAction = new QAction(tr("Disconnect"), this);
- QAction *joinChannelAction = new QAction(tr("Join Channel"), this);
-
- QAction *joinBufferAction = new QAction(tr("Join"), this);
- QAction *partBufferAction = new QAction(tr("Part"), this);
- QAction *removeBufferAction = new QAction(tr("Delete buffer"), this);
-
- QMenu *hideEventsMenu = new QMenu(tr("Hide Events"), this);
- QAction *hideJoinAction = hideEventsMenu->addAction(tr("Join Events"));
- QAction *hidePartAction = hideEventsMenu->addAction(tr("Part Events"));
- QAction *hideKillAction = hideEventsMenu->addAction(tr("Kill Events"));
- QAction *hideQuitAction = hideEventsMenu->addAction(tr("Quit Events"));
- QAction *hideModeAction = hideEventsMenu->addAction(tr("Mode Events"));
- hideJoinAction->setCheckable(true);
- hidePartAction->setCheckable(true);
- hideKillAction->setCheckable(true);
- hideQuitAction->setCheckable(true);
- hideModeAction->setCheckable(true);
- hideJoinAction->setEnabled(false);
- hidePartAction->setEnabled(false);
- hideKillAction->setEnabled(false);
- hideQuitAction->setEnabled(false);
- hideModeAction->setEnabled(false);
-
- QAction *ignoreListAction = new QAction(tr("Ignore list"), this);
- ignoreListAction->setEnabled(false);
- QAction *whoBufferAction = new QAction(tr("WHO"), this);
-
- if(index.data(NetworkModel::ItemTypeRole) == NetworkModel::NetworkItemType) {
- if(index.data(NetworkModel::ItemActiveRole).toBool()) {
- contextMenu.addAction(disconnectNetAction);
- contextMenu.addSeparator();
- contextMenu.addAction(joinChannelAction);
- } else {
- contextMenu.addAction(connectNetAction);
- }
- }
-
- BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
- QString channelname = index.sibling(index.row(), 0).data().toString();
-
- if(index.data(NetworkModel::ItemTypeRole) == NetworkModel::BufferItemType) {
- if(bufferInfo.type() != BufferInfo::ChannelBuffer && bufferInfo.type() != BufferInfo::QueryBuffer) return;
- contextMenu.addAction(joinBufferAction);
- contextMenu.addAction(partBufferAction);
- contextMenu.addAction(removeBufferAction);
- contextMenu.addMenu(hideEventsMenu);
- contextMenu.addAction(ignoreListAction);
- contextMenu.addAction(whoBufferAction);
-
- if(bufferInfo.type() == BufferInfo::ChannelBuffer) {
- if(index.data(NetworkModel::ItemActiveRole).toBool()) {
- removeBufferAction->setEnabled(false);
- removeBufferAction->setToolTip("To delete the buffer, part the channel first.");
- joinBufferAction->setVisible(false);
- whoBufferAction->setVisible(false);
- } else {
- partBufferAction->setVisible(false);
- }
- } else {
- joinBufferAction->setVisible(false);
- partBufferAction->setVisible(false);
- }
- }
-
- QAction *result = contextMenu.exec(QCursor::pos());
- if(result == connectNetAction || result == disconnectNetAction) {
- const Network *network = Client::network(index.data(NetworkModel::NetworkIdRole).value<NetworkId>());
- if(!network) return;
- if(network->connectionState() == Network::Disconnected)
- network->requestConnect();
- else
- network->requestDisconnect();
- } else
- if(result == joinChannelAction) {
- // FIXME no QInputDialog in Qtopia
-#ifndef Q_WS_QWS
- bool ok;
- QString channelName = QInputDialog::getText(this, tr("Join Channel"),
- tr("Input channel name:"),QLineEdit::Normal,
- QDir::home().dirName(), &ok);
-
- if (ok && !channelName.isEmpty()) {
- BufferInfo bufferInfo = index.child(0,0).data(NetworkModel::BufferInfoRole).value<BufferInfo>();
- if(bufferInfo.isValid()) {
- Client::instance()->userInput(bufferInfo, QString("/J %1").arg(channelName));
- }