From c067b6ba51aec65b7fd99aa5f55d07c07e0854e7 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Tue, 11 May 2010 15:23:34 +0000
Subject: [PATCH] New SequenceViewer, fixed copy behavior

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2241 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 .../gui/src/sequence/sequence_table_view.cc   | 10 +++++++
 .../gui/src/sequence/sequence_table_view.hh   |  4 ++-
 modules/gui/src/sequence/sequence_viewer.cc   | 29 +++++++++++++++++--
 modules/gui/src/sequence/sequence_viewer.hh   |  8 ++---
 4 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/modules/gui/src/sequence/sequence_table_view.cc b/modules/gui/src/sequence/sequence_table_view.cc
index 4529101fe..628301d37 100644
--- a/modules/gui/src/sequence/sequence_table_view.cc
+++ b/modules/gui/src/sequence/sequence_table_view.cc
@@ -349,6 +349,16 @@ void SequenceTableView::wheelEvent(QWheelEvent* event)
   }
 }
 
+void SequenceTableView::keyPressEvent(QKeyEvent* event)
+{
+  if(event->matches(QKeySequence::Copy)){
+    emit CopyEvent(event);
+  }
+  else{
+    QTableView::keyPressEvent(event);
+  }
+}
+
 SequenceTableView::~SequenceTableView(){}
 
 }}
diff --git a/modules/gui/src/sequence/sequence_table_view.hh b/modules/gui/src/sequence/sequence_table_view.hh
index f8c07ee81..e138d07ea 100644
--- a/modules/gui/src/sequence/sequence_table_view.hh
+++ b/modules/gui/src/sequence/sequence_table_view.hh
@@ -44,6 +44,7 @@ public:
 
 signals:
   void MouseWheelEvent(QWheelEvent* event);
+  void CopyEvent(QKeyEvent* event);
 
 public slots:
   void columnCountChanged(const QModelIndex& index, int old_count, int new_count);
@@ -55,7 +56,8 @@ protected:
   virtual void mouseDoubleClickEvent(QMouseEvent* event);
   virtual void mouseReleaseEvent(QMouseEvent* event);
   virtual void resizeEvent(QResizeEvent* event);
-  virtual void wheelEvent (QWheelEvent* event);
+  virtual void wheelEvent(QWheelEvent* event);
+  virtual void keyPressEvent(QKeyEvent* event);
   virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
   void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible);
 
diff --git a/modules/gui/src/sequence/sequence_viewer.cc b/modules/gui/src/sequence/sequence_viewer.cc
index 722c962d7..4164bbeec 100644
--- a/modules/gui/src/sequence/sequence_viewer.cc
+++ b/modules/gui/src/sequence/sequence_viewer.cc
@@ -23,10 +23,13 @@
 #include <boost/pointer_cast.hpp>
 
 #include <QAbstractItemView>
+#include <QApplication>
+#include <QClipboard>
 #include <QHeaderView>
 #include <QPushButton>
 #include <QShortcut>
 #include <QVBoxLayout>
+#include <QVarLengthArray>
 
 #include <ost/mol/chain_view.hh>
 #include <ost/mol/entity_view.hh>
@@ -96,6 +99,7 @@ SequenceViewerV2::SequenceViewerV2(QWidget* parent): Widget(NULL,parent)
   connect(seq_table_view_,SIGNAL(doubleClicked(const QModelIndex&)),model_,SLOT(DoubleClicked(const QModelIndex&)));
   connect(seq_table_view_->GetStaticColumn(),SIGNAL(doubleClicked(const QModelIndex&)),this,SLOT(DoubleClicked(const QModelIndex&)));
   connect(seq_table_view_->GetStaticRow(),SIGNAL(doubleClicked(const QModelIndex&)),this,SLOT(DoubleClicked(const QModelIndex&)));
+  connect(seq_table_view_,SIGNAL(CopyEvent(QKeyEvent*)),this,SLOT(CopyEvent(QKeyEvent*)));
   connect(seq_table_view_,SIGNAL(MouseWheelEvent(QWheelEvent*)),this,SLOT(MouseWheelEvent(QWheelEvent*)));
 
   gfx::GfxNodeP root_node = gfx::Scene::Instance().GetRootNode();
@@ -128,8 +132,8 @@ void SequenceViewerV2::UpdateSearchBar()
 {
   QStringList sequence_names_;
   for(int i = 1; i< model_->rowCount(); i++){
-        QString name = model_->data(model_->index(i,0),Qt::DisplayRole).toString();
-        sequence_names_.append(name);
+    QString name = model_->data(model_->index(i,0),Qt::DisplayRole).toString();
+    sequence_names_.append(name);
   }
   seq_search_bar_->UpdateItems(sequence_names_);
 }
@@ -180,6 +184,27 @@ void SequenceViewerV2::MouseWheelEvent(QWheelEvent* event)
   event->accept();
 }
 
+void SequenceViewerV2::CopyEvent(QKeyEvent* event)
+{
+  const QModelIndexList& list = seq_table_view_->selectionModel()->selectedIndexes();
+  if(list.size()>0){
+    QString clipboard_string;
+
+    QVarLengthArray<QString> clipboard_array(model_->rowCount());
+    for(int i = 0; i < list.size(); i++){
+      const QModelIndex& index = list[i];
+      clipboard_array[index.row()].append(model_->data(index,Qt::DisplayRole).toString());
+    }
+    for(int i = 0; i < clipboard_array.size(); i++){
+      if(clipboard_array[i].size()>0){
+        clipboard_string.append(clipboard_array[i]+"\n");
+      }
+    }
+    QApplication::clipboard()->setText(clipboard_string);
+  }
+  event->accept();
+}
+
 void SequenceViewerV2::FindInSequence()
 {
   if(seq_search_bar_->isHidden()){
diff --git a/modules/gui/src/sequence/sequence_viewer.hh b/modules/gui/src/sequence/sequence_viewer.hh
index 112bb1c4b..b04d242dc 100644
--- a/modules/gui/src/sequence/sequence_viewer.hh
+++ b/modules/gui/src/sequence/sequence_viewer.hh
@@ -56,10 +56,6 @@ public slots:
 /// \internal
 void OnSearchBarUpdate(const QString&, bool, const QString&);
 
-private slots:
-/// \brief show sequence search bar
-void FindInSequence();
-
 private:
   void UpdateSearchBar();
   void SelectList(const QModelIndexList& list);
@@ -68,10 +64,12 @@ private:
   SequenceTableView* seq_table_view_;
 
 private slots:
+  /// \brief show sequence search bar
+  void FindInSequence();
   void SelectionModelChanged(const QItemSelection&, const QItemSelection&);
   void DoubleClicked(const QModelIndex& index);
   void MouseWheelEvent(QWheelEvent* event);
-
+  void CopyEvent(QKeyEvent* event);
 };
 
 }}
-- 
GitLab