From 07d9e11b5de6f0cbca348d7b99c3beaaab52dbcf Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Thu, 29 Jul 2010 09:22:46 +0000
Subject: [PATCH] info_widget, added context menu

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2602 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/gui/share/icons/delete_icon.png    | Bin 769 -> 687 bytes
 modules/gui/src/info_widget/info_widget.cc |  95 +++++++++++++--------
 modules/gui/src/info_widget/info_widget.hh |   3 +
 3 files changed, 61 insertions(+), 37 deletions(-)

diff --git a/modules/gui/share/icons/delete_icon.png b/modules/gui/share/icons/delete_icon.png
index 07b57dcd7f83d499301f1f778330591ce16dee3d..998b49070fc98a0a67dc79392eebb879a9af7937 100644
GIT binary patch
delta 602
zcmZo<ThBTnp<aqjhdofYW-kK+lfI{mV~EA+rBnC%J$4Xj-7lGw-15j{21m=2wydSK
z3~NNbO#CEb<H%Atxs9)r<s-|<XobKFOCKy>a$=d+tPoE|C9f29H@U8<b1P)GIOLVq
zmOlS+W@maDi+AAq>o3c8*N8cB<lIh6PG)X6nbH*0wRWxUx9|1eSB9<jTrZ{`9v;ra
z#;i5fi|fskCoN737d(3Z{CT?I|0P$mRBO+s8T%^v>FMcZY`@)Q`sl}xh$~rJO&(95
zF3zxS{rYgdtnIh8Uw{ApouS7~IW9ha@~)oL8Gg&xNKZbgvUa0DQ;i+}ftN2|_BZOD
zKE<?q-RZk`=W2*>z54deOs+oU(vKfMW-wM&R4^o1$Qa4+9ldx_u-A?G{O5mOhI0Kc
zzg9`Q9}#rDSbwuE(PRJp=WpNU9<<<KvYN}cd-v{@&t@!rz3b$JuA@rk=H?7Hw#|K2
zUsd(!!Gi=to70;%=ydPhyI0;=%xS{ur#EiijAY2q&rg<M^IE%Y<CIU{hmCofKi7Z$
z%(@|n>#zYwQ-bd9m%HYD`}pR&ywBx7B0sc)7;^IRmNf=4T{f9{HZ9w8BBPnr{s}>!
z{{7o0_P9qRP(*R*k?()EO6Y%Aow+QtCGkh@v5k|b1ZB*cW_Kw)Jv}BaF73^;U3rtl
zyN{~qPd|NfqL|Z?J#%)x2siw_YTL$rlE)lA-3exx;<Yrtx}vg{D?+n%-D`_J<wq~|
z@_oHJgSa$P(|+%JKl$|24>tK*Mfx6Jc>Q(8`RCg2o1P~At)9Zq&mX*%|6bMUo2#Ez
SZ((3yVDNPHb6Mw<&;$ULLMo>K

delta 685
zcmZ3_+Q>E`p<bL@N%Yv#?5_+AOpTr{jv*GOmrgnF^*BJJeSh`k7-=iF4Z30rrNfyw
z3$m>$dFUq4V%O>)a3$}~4&jS-O?It$F5yZYhj>DkJ=Rj%ammr!_1AH=y_+vwTjCk`
zBJ%E>JD;DH*FT@fQL}OL=EGmVnjUuIa5S2E#DIq(E-vmuRB~j!*i4_cuV26ZyBCok
zs5gD*?%j(cbl4KKwYAHv=C1obPkU+?Ly{9metmuX_fOT;)sBLDk6ybbwtV^WS%OK4
ziH<orIV_^~wziBL_U@I9EGa8%6JR=Q@WF;(Q+3|+!pcg{1BVYYZ;jH;aNQYmtWbtw
zO3=gy5o^{je818D`ez#kv3e&1Lqo;`uU=)XI3U07HD7K1?J@})d;9YrKYl!4V)gg+
zg9i)^w{J(k`nr8zY;5es3=^gWpFbBf$jQs^+`s?)*|TRi?%wUaGQ^3=#@_z11>e!6
zkL6P)<!%3+`Pgc%-{WV`mg%doUC7$HB5d`Npp^%nEnck5kd~fqX=%x*F#mjUMSTT_
zgVD?{`Txrb3lDzzVsc=1((P><b7!wyxzfXQ-t*d35gZ@$Yij14Jb9A8Kxv|bX6v=8
z7e{IpUwLVonVZ`mh{~Q4v?Xe7;IqS~zMKCmFy6BNC)9u3opt%KW5=2jwkXK;U(Va^
z&Y13$5c;=oiqQ2^cgFvmkr&^VO$@q}W2UTK-)35RAzAZjgXsI>`!7qBwEuXu)rMrx
z{m{RQB_cZ7*-J8L+m<aZdefab4nBIM^s`2;!D*qx!T^aqUA+IdPMP2PF1+pW-;ibT
zg*hL>IX3Ls^XF;b*Mzpj2nSu3Yf;Iw)Nba4eX-${d3#q&GgU#qWx>syq)4%)L7HnM
z6lR}&WTD2le*Jpq<5sWQG?vboIg|6rKjw`-ckk|;Bvi`4z`)??>gTe~DWM4fR~tx{

diff --git a/modules/gui/src/info_widget/info_widget.cc b/modules/gui/src/info_widget/info_widget.cc
index fd582d46b..4eeaa552a 100644
--- a/modules/gui/src/info_widget/info_widget.cc
+++ b/modules/gui/src/info_widget/info_widget.cc
@@ -19,9 +19,10 @@
 /*
  Author: Stefan Scheuber
  */
+#include <QApplication>
 #include <QDir>
+#include <QMenu>
 #include <QVBoxLayout>
-#include <QApplication>
 
 #include <ost/platform.hh>
 
@@ -30,7 +31,8 @@
 
 #include "info_widget.hh"
 
-namespace ost { namespace gui {
+namespace ost {
+namespace gui {
 
 class InfoWidgetFactory: public WidgetFactory {
 public:
@@ -45,7 +47,9 @@ public:
 
 OST_REGISTER_WIDGET(InfoWidget, InfoWidgetFactory);
 
-InfoWidget::InfoWidget(QWidget* parent) : Widget(NULL, parent), model_(new QStandardItemModel(this)), view_(new QListView(this)) {
+InfoWidget::InfoWidget(QWidget* parent) :
+  Widget(NULL, parent), model_(new QStandardItemModel(this)), view_(
+      new QListView(this)) {
   QVBoxLayout* layout = new QVBoxLayout(this);
   layout->setMargin(0);
   layout->setSpacing(0);
@@ -54,9 +58,12 @@ InfoWidget::InfoWidget(QWidget* parent) : Widget(NULL, parent), model_(new QStan
   view_->setModel(model_);
   view_->setSelectionBehavior(QAbstractItemView::SelectRows);
   view_->setDragEnabled(true);
+  view_->setContextMenuPolicy(Qt::CustomContextMenu);
 
   layout->addWidget(view_);
 
+  connect(view_, SIGNAL(customContextMenuRequested(const QPoint&)), this,
+      SLOT(ContextMenuRequested(const QPoint&)));
 
   QDir icon_path(GetSharedDataPath().c_str());
   icon_path.cd("gui");
@@ -64,8 +71,9 @@ InfoWidget::InfoWidget(QWidget* parent) : Widget(NULL, parent), model_(new QStan
 
   QAction* clear_action = new QAction(this);
   clear_action->setToolTip("Clear info panel");
-  clear_action->setIcon(QIcon(icon_path.absolutePath()+QDir::separator()+QString("delete_icon.png")));
-  connect(clear_action,SIGNAL(triggered(bool)), this, SLOT(Clear()));
+  clear_action->setIcon(QIcon(icon_path.absolutePath() + QDir::separator()
+      + QString("delete_icon.png")));
+  connect(clear_action, SIGNAL(triggered(bool)), this, SLOT(Clear()));
   this->actions_.append(clear_action);
 }
 
@@ -73,67 +81,80 @@ void InfoWidget::Update() {
   view_->viewport()->update();
 }
 
-void InfoWidget::LogMessage(const QString& message, QMessageBox::Icon icon){
-  QPixmap pix_icon = this->GetIcon(icon,this);
+void InfoWidget::LogMessage(const QString& message, QMessageBox::Icon icon) {
+  QPixmap pix_icon = this->GetIcon(icon, this);
   QStandardItem* item = new QStandardItem();
   item->setText(message);
   item->setIcon(QIcon(pix_icon));
   this->model_->appendRow(item);
 }
 
-void InfoWidget::LogMessage(QStandardItem* item){
+void InfoWidget::LogMessage(QStandardItem* item) {
   this->model_->appendRow(item);
 }
 
-void InfoWidget::LogMessage(const QString& message, QIcon icon){
+void InfoWidget::LogMessage(const QString& message, QIcon icon) {
   QStandardItem* item = new QStandardItem();
   item->setText(message);
   item->setIcon(icon);
   this->model_->appendRow(item);
 }
 
-QPixmap InfoWidget::GetIcon(QMessageBox::Icon icon, QWidget* widget)
-{
-    QStyle *style = widget ? widget->style() : QApplication::style();
-    int icon_size = style->pixelMetric(QStyle::PM_MessageBoxIconSize, 0, widget);
-    QIcon tmp_icon;
-    switch (icon) {
-    case QMessageBox::Information:
-        tmp_icon = style->standardIcon(QStyle::SP_MessageBoxInformation, 0, widget);
-        break;
-    case QMessageBox::Warning:
-        tmp_icon = style->standardIcon(QStyle::SP_MessageBoxWarning, 0, widget);
-        break;
-    case QMessageBox::Critical:
-        tmp_icon = style->standardIcon(QStyle::SP_MessageBoxCritical, 0, widget);
-        break;
-    case QMessageBox::Question:
-        tmp_icon = style->standardIcon(QStyle::SP_MessageBoxQuestion, 0, widget);
-    default:
-        break;
-    }
-    if (!tmp_icon.isNull())
-        return tmp_icon.pixmap(icon_size, icon_size);
-    return QPixmap();
+QPixmap InfoWidget::GetIcon(QMessageBox::Icon icon, QWidget* widget) {
+  QStyle *style = widget ? widget->style() : QApplication::style();
+  int icon_size = style->pixelMetric(QStyle::PM_MessageBoxIconSize, 0, widget);
+  QIcon tmp_icon;
+  switch (icon) {
+  case QMessageBox::Information:
+    tmp_icon = style->standardIcon(QStyle::SP_MessageBoxInformation, 0, widget);
+    break;
+  case QMessageBox::Warning:
+    tmp_icon = style->standardIcon(QStyle::SP_MessageBoxWarning, 0, widget);
+    break;
+  case QMessageBox::Critical:
+    tmp_icon = style->standardIcon(QStyle::SP_MessageBoxCritical, 0, widget);
+    break;
+  case QMessageBox::Question:
+    tmp_icon = style->standardIcon(QStyle::SP_MessageBoxQuestion, 0, widget);
+  default:
+    break;
+  }
+  if (!tmp_icon.isNull())
+    return tmp_icon.pixmap(icon_size, icon_size);
+  return QPixmap();
 }
 
-void InfoWidget::Clear(){
+void InfoWidget::Clear() {
   this->model_->clear();
 }
 
-void InfoWidget::RemoveSelected(){
+void InfoWidget::RemoveSelected() {
   QItemSelectionModel* selection_model = this->view_->selectionModel();
-  const QItemSelection& item_selection =  selection_model->selection();
+  const QItemSelection& item_selection = selection_model->selection();
   const QModelIndexList& model_indexes = item_selection.indexes();
-  for(int i=0;i<model_indexes.size();i++){
+  for (int i = 0; i < model_indexes.size(); i++) {
     this->model_->removeRow(model_indexes[i].row());
   }
 }
 
-ActionList InfoWidget::GetActions(){
+ActionList InfoWidget::GetActions() {
   return this->actions_;
 }
 
+void InfoWidget::ContextMenuRequested(const QPoint& pos) {
+
+  QAction* remove_selected_action = new QAction("Remove", this);
+  remove_selected_action->setToolTip("Remove this item");
+  connect(remove_selected_action, SIGNAL(triggered(bool)), this,
+      SLOT(RemoveSelected()));
+
+  QMenu* menu = new QMenu();
+  menu->addAction(remove_selected_action);
+  if (menu->actions().size() > 0) {
+    menu->popup(view_->viewport()->mapToGlobal(pos));
+  }
+}
+
 InfoWidget::~InfoWidget() {
 }
 
diff --git a/modules/gui/src/info_widget/info_widget.hh b/modules/gui/src/info_widget/info_widget.hh
index d74ceaa65..65857d37d 100644
--- a/modules/gui/src/info_widget/info_widget.hh
+++ b/modules/gui/src/info_widget/info_widget.hh
@@ -59,6 +59,9 @@ public slots:
   void RemoveSelected();
   void Update();
 
+private slots:
+  void ContextMenuRequested(const QPoint& pos);
+
 private:
   QPixmap GetIcon(QMessageBox::Icon icon, QWidget* widget);
 
-- 
GitLab