- 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);
+void BufferView::addItemToMenu(QMenu *subMenu, QMenu *menu, const QModelIndex &index, ItemActiveStates requiredActiveState) {
+ if(checkRequirements(index, requiredActiveState)) {
+ menu->addMenu(subMenu);
+ subMenu->setVisible(true);
+ } else {
+ subMenu->setVisible(false);
+ }
+}
+
+void BufferView::addSeparatorToMenu(QMenu *menu, const QModelIndex &index, ItemActiveStates requiredActiveState) {
+ if(checkRequirements(index, requiredActiveState)) {
+ menu->addSeparator();
+ }
+}
+
+QMenu *BufferView::createHideEventsSubMenu(QMenu *menu, BufferId bufferId) {
+ int filter = BufferSettings(bufferId).messageFilter();
+ _menuActions.action("HideJoin")->setChecked(filter & Message::Join);
+ _menuActions.action("HidePart")->setChecked(filter & Message::Part);
+ _menuActions.action("HideQuit")->setChecked(filter & Message::Quit);
+ _menuActions.action("HideNick")->setChecked(filter & Message::Nick);
+ _menuActions.action("HideMode")->setChecked(filter & Message::Mode);
+ _menuActions.action("HideDayChange")->setChecked(filter & Message::DayChange);
+
+ QMenu *hideEventsMenu = menu->addMenu(tr("Hide Events"));
+ hideEventsMenu->addAction(_menuActions.action("HideJoin"));
+ hideEventsMenu->addAction(_menuActions.action("HidePart"));
+ hideEventsMenu->addAction(_menuActions.action("HideQuit"));
+ hideEventsMenu->addAction(_menuActions.action("HideNick"));
+ hideEventsMenu->addAction(_menuActions.action("HideMode"));
+ hideEventsMenu->addAction(_menuActions.action("HideDayChange"));
+ return hideEventsMenu;
+}
+
+void BufferView::contextMenuEvent(QContextMenuEvent *event) {
+ QModelIndex index = indexAt(event->pos());
+ if(!index.isValid())
+ index = rootIndex();
+ if(!index.isValid())
+ return;
+
+ QMenu contextMenu(this);
+ addActionsToMenu(&contextMenu, index);
+ if(!contextMenu.actions().isEmpty())
+ contextMenu.exec(QCursor::pos());
+
+}
+
+void BufferView::addActionsToMenu(QMenu *contextMenu, const QModelIndex &index) {
+ _menuIndex = index;
+ const Network *network = Client::network(index.data(NetworkModel::NetworkIdRole).value<NetworkId>());
+ Q_CHECK_PTR(network);
+
+ NetworkModel::itemType itemType = static_cast<NetworkModel::itemType>(index.data(NetworkModel::ItemTypeRole).toInt());
+
+ switch(itemType) {
+ case NetworkModel::NetworkItemType:
+ showChannelList.setData(index.data(NetworkModel::NetworkIdRole));
+ addItemToMenu(&showChannelList, contextMenu, index, ActiveState);
+ addItemToMenu(_menuActions.action("DisconnectNet"), contextMenu, network->connectionState() != Network::Disconnected);
+ addItemToMenu(_menuActions.action("ConnectNet"), contextMenu, network->connectionState() == Network::Disconnected);
+ addSeparatorToMenu(contextMenu, index, ActiveState);
+ addItemToMenu(_menuActions.action("JoinChannel"), contextMenu, index, ActiveState);
+ break;
+ case NetworkModel::BufferItemType:
+ {
+ BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
+ switch(bufferInfo.type()) {
+ case BufferInfo::ChannelBuffer:
+ addItemToMenu(_menuActions.action("JoinBuffer"), contextMenu, index, InactiveState);
+ addItemToMenu(_menuActions.action("PartBuffer"), contextMenu, index, ActiveState);
+ addItemToMenu(_menuActions.action("HideBuffersTemporarily"), contextMenu, (bool)config());
+ addItemToMenu(_menuActions.action("HideBuffersPermanently"), contextMenu, (bool)config());
+ addItemToMenu(_menuActions.action("RemoveBuffer"), contextMenu, index, InactiveState);
+ createHideEventsSubMenu(contextMenu, bufferInfo.bufferId());
+ addItemToMenu(_menuActions.action("IgnoreList"), contextMenu);
+ break;
+ case BufferInfo::QueryBuffer:
+ addItemToMenu(_menuActions.action("HideBuffersTemporarily"), contextMenu, (bool)config());
+ addItemToMenu(_menuActions.action("HideBuffersPermanently"), contextMenu, (bool)config());
+ addItemToMenu(_menuActions.action("RemoveBuffer"), contextMenu);
+ createHideEventsSubMenu(contextMenu, bufferInfo.bufferId());
+ break;
+ default:
+ addItemToMenu(_menuActions.action("HideBuffersTemporarily"), contextMenu, (bool)config());
+ addItemToMenu(_menuActions.action("HideBuffersPermanently"), contextMenu, (bool)config());
+ break;