diff --git a/modules/gui/src/sequence/sequence_model.cc b/modules/gui/src/sequence/sequence_model.cc index ee2aba06ac8535a781ce6aec58aac3888cc79d47..c9152e0e57aa9c70cc81c971d609bee88e097539 100644 --- a/modules/gui/src/sequence/sequence_model.cc +++ b/modules/gui/src/sequence/sequence_model.cc @@ -81,22 +81,21 @@ void SequenceModel::InsertGfxEntity(gfx::EntityP& ent){ } void SequenceModel::RemoveGfxEntity(gfx::EntityP& entity){ - ViewObject* obj = this->GetObject(entity); - if(obj){ - int index = objects_.indexOf(obj); + if(ViewObject* obj = this->GetItem(entity)){ + int index = this->GetGlobalRow(obj,0); this->beginRemoveRows(QModelIndex(),index,index+obj->GetRowCount()-1); int cols_before = this->columnCount(); - objects_.removeAt(index); + objects_.removeOne(obj); this->endRemoveRows(); int cols = this->columnCount(); if(cols_before>cols){ - this->beginRemoveColumns(QModelIndex(), cols, cols_before-1); + this->beginRemoveColumns(QModelIndex(), cols, cols_before); this->endRemoveColumns(); } } } -ViewObject* SequenceModel::GetObject(gfx::EntityP& entity){ +ViewObject* SequenceModel::GetItem(gfx::EntityP& entity){ if(entity != NULL){ for (int i = 0 ; i< objects_.size(); i++){ if(entity == objects_[i]->GetGfxObject()){ @@ -160,7 +159,7 @@ int SequenceModel::GetGlobalRow(ViewObject* obj, int row) const QModelIndexList SequenceModel::GetModelIndexes(gfx::EntityP& entity, const mol::EntityView& view) { QModelIndexList list; - if(ViewObject* object = this->GetObject(entity)){ + if(ViewObject* object = this->GetItem(entity)){ QMap<int, QList<int> > indexes = object->GetIndexesForView(view); QMapIterator< int, QList<int> > i(indexes); while (i.hasNext()) { diff --git a/modules/gui/src/sequence/sequence_model.hh b/modules/gui/src/sequence/sequence_model.hh index 173c7f9622bd19000b96f64dab61dfb3ed59eb26..a1a6f8652360a9a61819460dcef21ea669065a31 100644 --- a/modules/gui/src/sequence/sequence_model.hh +++ b/modules/gui/src/sequence/sequence_model.hh @@ -52,10 +52,8 @@ public: QModelIndexList GetModelIndexes(gfx::EntityP& entity, const mol::EntityView& view); int GetGlobalRow(ViewObject* obj, int row) const; - ViewObject* GetObject(gfx::EntityP& entity); - const PainterList& GetPainters(const QModelIndex& index) const; - ViewObject* GetItem(const QModelIndex& index) const; + const PainterList& GetPainters(const QModelIndex& index) const; // abstract item model interface int rowCount(const QModelIndex& parent=QModelIndex()) const; @@ -74,6 +72,8 @@ public slots: void SelectionChanged(const QItemSelection& sel, const QItemSelection& desel); private: + ViewObject* GetItem(gfx::EntityP& entity); + ViewObject* GetItem(const QModelIndex& index) const; QPair<int, ViewObject*> GetRowWithItem(int row) const; QPair<int, ViewObject*> GetRowWithItem(const QModelIndex& index) const; diff --git a/modules/gui/src/sequence/sequence_table_view.cc b/modules/gui/src/sequence/sequence_table_view.cc index 44faeaebf96b00947886752c6f73d52963c1c1e1..c19ca30da29343f0a3fb1e617d62d19d07bab8f4 100644 --- a/modules/gui/src/sequence/sequence_table_view.cc +++ b/modules/gui/src/sequence/sequence_table_view.cc @@ -24,6 +24,7 @@ #include <QHeaderView> #include <QScrollBar> #include <QTableWidgetItem> +#include <QMouseEvent> #include <iostream> #include "sequence_table_view.hh" @@ -183,6 +184,24 @@ QTableView* SequenceTableView::GetFirstRow(){ return column_not_move_; } +void SequenceTableView::mouseDoubleClickEvent(QMouseEvent *event) +{ + QModelIndex index = indexAt(event->pos()); + this->last_double_click_ = index; + QAbstractItemView::mouseDoubleClickEvent(event); +} + + +void SequenceTableView::mouseReleaseEvent(QMouseEvent* event) +{ + QModelIndex index = indexAt(event->pos()); + bool double_click = (index.isValid() && index == this->last_double_click_); + if (double_click) { + return; + } + QAbstractItemView::mouseReleaseEvent(event); +} + SequenceTableView::~SequenceTableView(){} }} diff --git a/modules/gui/src/sequence/sequence_table_view.hh b/modules/gui/src/sequence/sequence_table_view.hh index 9d3af2eac0549d4e11dd0b393bdf4a8193317279..5fc244b2d25f5ff8026b42c5872ccc8eeb3db6c5 100644 --- a/modules/gui/src/sequence/sequence_table_view.hh +++ b/modules/gui/src/sequence/sequence_table_view.hh @@ -44,6 +44,8 @@ public slots: QTableView* GetFirstRow(); protected: + virtual void mouseDoubleClickEvent(QMouseEvent* event); + virtual void mouseReleaseEvent(QMouseEvent* event); virtual void resizeEvent(QResizeEvent *event); virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers); void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible); @@ -55,6 +57,7 @@ private slots: private: QTableView* column_not_move_; SequenceDelegate* delegate_; + QModelIndex last_double_click_; void updateNotMoveColumn(); }; diff --git a/modules/gui/src/sequence/sequence_viewer.cc b/modules/gui/src/sequence/sequence_viewer.cc index 146040fd486c2ebb9f4b88665ee925a0228f94fb..14b0957613a4cf30901bf54f8758cd2809190856 100644 --- a/modules/gui/src/sequence/sequence_viewer.cc +++ b/modules/gui/src/sequence/sequence_viewer.cc @@ -61,7 +61,7 @@ SequenceViewerV2::SequenceViewerV2(QWidget* parent): Widget(NULL,parent) seq_table_view_->setSelectionMode(QAbstractItemView::ExtendedSelection); connect(seq_table_view_->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(SelectionModelChanged(const QItemSelection&, const QItemSelection&))); connect(seq_table_view_,SIGNAL(doubleClicked(const QModelIndex&)),model_,SLOT(DoubleClicked(const QModelIndex&))); - connect(seq_table_view_->GetFirstRow(),SIGNAL(doubleClicked(const QModelIndex&)),model_,SLOT(DoubleClicked(const QModelIndex&))); + connect(seq_table_view_->GetFirstRow(),SIGNAL(doubleClicked(const QModelIndex&)),this,SLOT(DoubleClicked(const QModelIndex&))); } void SequenceViewerV2::NodeAdded(const gfx::GfxNodeP& n) @@ -91,12 +91,10 @@ void SequenceViewerV2::SelectionChanged(const gfx::GfxObjP& o, const mol::EntityView& view) { disconnect(seq_table_view_->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(SelectionModelChanged(const QItemSelection&, const QItemSelection&))); - std::cout << "SELECTION CHANGED!" << std::endl; QItemSelectionModel* model = seq_table_view_->selectionModel(); gfx::EntityP entity=boost::dynamic_pointer_cast<gfx::Entity>(o); if(entity){ const QModelIndexList& list = model_->GetModelIndexes(entity, view); - std::cout << list.size() << std::endl; QSet<int> rows_visited; for(int i = 0; i<list.size(); i++){ int row =list[i].row(); @@ -112,6 +110,12 @@ void SequenceViewerV2::SelectionChanged(const gfx::GfxObjP& o, connect(seq_table_view_->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(SelectionModelChanged(const QItemSelection&, const QItemSelection&))); } +void SequenceViewerV2::DoubleClicked(const QModelIndex& index) +{ + disconnect(seq_table_view_->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(SelectionModelChanged(const QItemSelection&, const QItemSelection&))); + model_->DoubleClicked(index); + connect(seq_table_view_->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), this, SLOT(SelectionModelChanged(const QItemSelection&, const QItemSelection&))); +} SequenceViewerV2::~SequenceViewerV2(){ gfx::Scene::Instance().DetachObserver(this); diff --git a/modules/gui/src/sequence/sequence_viewer.hh b/modules/gui/src/sequence/sequence_viewer.hh index 0963b5b0889b40fde6b25b8498243669b02fc907..bcedf4a970d3bab54654770302fc4095a60fcca9 100644 --- a/modules/gui/src/sequence/sequence_viewer.hh +++ b/modules/gui/src/sequence/sequence_viewer.hh @@ -57,6 +57,8 @@ private: private slots: void SelectionModelChanged(const QItemSelection&, const QItemSelection&); + void DoubleClicked(const QModelIndex& index); + }; }} diff --git a/modules/gui/src/sequence/view_object.cc b/modules/gui/src/sequence/view_object.cc index 90116e04ac30f56cfa8519b838403c330aa2f478..2dc4de045be4ad2f1861591c923ec6d1600e4eed 100644 --- a/modules/gui/src/sequence/view_object.cc +++ b/modules/gui/src/sequence/view_object.cc @@ -182,18 +182,22 @@ void ViewObject::SetSelection(int row, const QSet<int>& added, const QSet<int>& QSetIterator<int> i(removed); while (i.hasNext()){ - int column = i.next(); - if (mol::ResidueView rv=seq.GetResidue(column-1)) { - view.AddResidue(rv, mol::ViewAddFlag::INCLUDE_ATOMS); + int column = i.next()-1; + if(column >= 0 && column < seq.GetLength()){ + if (mol::ResidueView rv=seq.GetResidue(seq.GetResidueIndex(column))) { + view.AddResidue(rv, mol::ViewAddFlag::INCLUDE_ATOMS); + } } } sel = mol::Difference(sel,view); view = seq.GetAttachedView().GetHandle().CreateEmptyView(); i = QSetIterator<int>(added); while (i.hasNext()){ - int column = i.next(); - if (mol::ResidueView rv=seq.GetResidue(column-1)) { - view.AddResidue(rv, mol::ViewAddFlag::INCLUDE_ATOMS); + int column = i.next()-1; + if(column >= 0 && column < seq.GetLength()){ + if (mol::ResidueView rv=seq.GetResidue(seq.GetResidueIndex(column))) { + view.AddResidue(rv, mol::ViewAddFlag::INCLUDE_ATOMS); + } } } sel = mol::Union(sel,view); @@ -256,13 +260,49 @@ void ViewObject::DoubleClicked(int row, int column) { if(column==0){ QSet<int> all; - for(int i = 1; i <= rows_[row].seq.GetLength(); i++){ - all.insert(i); + int seq_length = rows_[row].seq.GetLength(); + for(int i = 0; i < seq_length; i++){ + all.insert(i+1); } this->SetSelection(row,all,QSet<int>()); } else if(column>0){ - + column-=1; + QVarLengthArray<mol::SecStructure> sec = rows_[row].secstr; + if(sec.size()>0 && column < sec.size()){ + mol::SecStructure& src_str = sec[column]; + QVarLengthArray<bool> src_type(3); + src_type[0] = src_str.IsHelical(); + src_type[1] = src_str.IsExtended(); + src_type[2] = src_str.IsCoil(); + int i = column; + QSet<int> cols_to_add; + mol::SecStructure& col_str = sec[i]; + while(i >= 0 && (col_str = sec[i])){ + if(src_type[0] == col_str.IsHelical() + && src_type[1] == col_str.IsExtended() + && src_type[2] == col_str.IsCoil()){ + cols_to_add.insert(i+1); + --i; + } + else{break;} + } + i = column + 1; + if(i < sec.size()){ + while(i < sec.size() && (col_str = sec[i])){ + if(src_type[0] == col_str.IsHelical() + && src_type[1] == col_str.IsExtended() + && src_type[2] == col_str.IsCoil()){ + cols_to_add.insert(i+1); + ++i; + } + else{ + break; + } + } + } + this->SetSelection(row,cols_to_add, QSet<int>()); + } } } @@ -282,7 +322,7 @@ QMap<int, QList<int> > ViewObject::GetIndexesForView(const mol::EntityView& view e2=src_chain.GetResidueList().end(); j!=e2; ++j) { mol::ResidueView dst_res=dst_chain.FindResidue(j->GetHandle()); assert(dst_res.IsValid()); - int p=seq.GetPos(dst_res.GetIndex()+1); + int p=dst_res.GetIndex()+1; assert(p>=0 && p<=seq.GetLength()); selected_indexes[i].append(p); }