fixed focus when switching to plain topic view
[quassel.git] / src / qtui / chatscene.cpp
index e2b5f80..ed90582 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   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  *
 #include <QDrag>
 #include <QGraphicsSceneMouseEvent>
 #include <QMenu>
+#include <QMenuBar>
 #include <QPersistentModelIndex>
 
+#ifdef HAVE_KDE
+#  include <KMenuBar>
+#else
+#  include <QMenuBar>
+#endif
+
 #ifdef HAVE_WEBKIT
 #  include <QWebView>
 #endif
@@ -131,8 +138,10 @@ ColumnHandleItem *ChatScene::secondColumnHandle() const {
 }
 
 ChatItem *ChatScene::chatItemAt(const QPointF &scenePos) const {
-  QGraphicsItem *item = itemAt(scenePos);
-  return dynamic_cast<ChatItem *>(item);
+  ChatLine *line = qgraphicsitem_cast<ChatLine*>(itemAt(scenePos));
+  if(line)
+    return line->itemAt(line->mapFromScene(scenePos));
+  return 0;
 }
 
 bool ChatScene::containsBuffer(const BufferId &id) const {
@@ -170,7 +179,6 @@ void ChatScene::rowsInserted(const QModelIndex &index, int start, int end) {
   qreal width = _sceneRect.width();
   bool atBottom = (start == _lines.count());
   bool atTop = !atBottom && (start == 0);
-  bool moveTop = false;
 
   if(start < _lines.count()) {
     y = _lines.value(start)->y();
@@ -599,6 +607,9 @@ void ChatScene::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
     // no item -> default scene actions
     GraphicalUi::contextMenuActionProvider()->addActions(&menu, filter(), BufferId());
 
+  if (QtUi::mainWindow()->menuBar()->isHidden())
+    menu.addAction(QtUi::actionCollection("General")->action("ToggleMenuBar"));
+
   menu.exec(event->screenPos());
 
 }
@@ -750,10 +761,10 @@ QString ChatScene::selection() const {
     QString result;
     for(int l = start; l <= end; l++) {
       if(_selectionMinCol == ChatLineModel::TimestampColumn)
-        result += _lines[l]->item(ChatLineModel::TimestampColumn).data(MessageModel::DisplayRole).toString() + " ";
+        result += _lines[l]->item(ChatLineModel::TimestampColumn)->data(MessageModel::DisplayRole).toString() + " ";
       if(_selectionMinCol <= ChatLineModel::SenderColumn)
-        result += _lines[l]->item(ChatLineModel::SenderColumn).data(MessageModel::DisplayRole).toString() + " ";
-      result += _lines[l]->item(ChatLineModel::ContentsColumn).data(MessageModel::DisplayRole).toString() + "\n";
+        result += _lines[l]->item(ChatLineModel::SenderColumn)->data(MessageModel::DisplayRole).toString() + " ";
+      result += _lines[l]->item(ChatLineModel::ContentsColumn)->data(MessageModel::DisplayRole).toString() + "\n";
     }
     return result;
   } else if(selectingItem())
@@ -807,12 +818,15 @@ ChatLineModel::ColumnType ChatScene::columnByScenePos(qreal x) const {
 }
 
 int ChatScene::rowByScenePos(qreal y) const {
-  // This is somewhat hacky... we look at the contents item that is at the given y position, since
-  // it has the full height. From this item, we can then determine the row index and hence the ChatLine.
-  // ChatItems cover their ChatLine, so we won't get to the latter directly.
-  ChatItem *contentItem = static_cast<ChatItem *>(itemAt(QPointF(_secondColHandle->sceneRight() + 1, y)));
-  if(!contentItem) return -1;
-  return contentItem->row();
+  QList<QGraphicsItem*> itemList = items(QPointF(0, y));
+
+  // ChatLine should be at the bottom of the list
+  for(int i = itemList.count()-1; i >= 0; i--) {
+    ChatLine *line = qgraphicsitem_cast<ChatLine *>(itemList.at(i));
+    if(line)
+      return line->row();
+  }
+  return -1;
 }
 
 void ChatScene::updateSceneRect(qreal width) {
@@ -883,7 +897,7 @@ void ChatScene::loadWebPreview(ChatItem *parentItem, const QUrl &url, const QRec
     // prepare to load a different URL
     if(webPreview.previewItem) {
       if(webPreview.previewItem->scene())
-       removeItem(webPreview.previewItem);
+        removeItem(webPreview.previewItem);
       delete webPreview.previewItem;
       webPreview.previewItem = 0;
     }
@@ -931,10 +945,10 @@ void ChatScene::webPreviewNextStep() {
       qreal previewY = webPreview.urlRect.bottom();
       qreal previewX = webPreview.urlRect.x();
       if(previewY + webPreview.previewItem->boundingRect().height() > sceneRect().bottom())
-       previewY = webPreview.urlRect.y() - webPreview.previewItem->boundingRect().height();
+        previewY = webPreview.urlRect.y() - webPreview.previewItem->boundingRect().height();
 
       if(previewX + webPreview.previewItem->boundingRect().width() > sceneRect().width())
-       previewX = sceneRect().right() - webPreview.previewItem->boundingRect().width();
+        previewX = sceneRect().right() - webPreview.previewItem->boundingRect().width();
 
       webPreview.previewItem->setPos(previewX, previewY);
     }
@@ -969,7 +983,7 @@ void ChatScene::clearWebPreview(ChatItem *parentItem) {
   case WebPreview::ShowPreview:
     if(parentItem == 0 || webPreview.parentItem == parentItem) {
       if(webPreview.previewItem && webPreview.previewItem->scene())
-       removeItem(webPreview.previewItem);
+        removeItem(webPreview.previewItem);
     }
     // fall through into to set hidden state
   case WebPreview::DelayPreview: