From 8d1158e094213319bf04eaccaaab48b764a524e4 Mon Sep 17 00:00:00 2001 From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08> Date: Wed, 2 Jun 2010 11:51:54 +0000 Subject: [PATCH] New SequenceViewer, methods to change display mode git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2312 5a81b35b-ba03-0410-adc8-b2c5c5119f08 --- modules/gui/pymod/export_sequence_viewerV2.cc | 22 +++++ .../gui/src/sequence/alignment_view_object.cc | 23 ++++- .../gui/src/sequence/alignment_view_object.hh | 6 ++ modules/gui/src/sequence/base_view_object.cc | 24 +++++ modules/gui/src/sequence/base_view_object.hh | 8 ++ modules/gui/src/sequence/sequence_model.cc | 99 +++++++++++++++++-- modules/gui/src/sequence/sequence_model.hh | 17 +++- .../gui/src/sequence/sequence_view_object.cc | 88 ++++++++++++----- .../gui/src/sequence/sequence_view_object.hh | 25 +++++ modules/gui/src/sequence/sequence_viewer.cc | 18 ++++ modules/gui/src/sequence/sequence_viewer.hh | 8 +- 11 files changed, 299 insertions(+), 39 deletions(-) diff --git a/modules/gui/pymod/export_sequence_viewerV2.cc b/modules/gui/pymod/export_sequence_viewerV2.cc index 0a744dccc..4731c1cac 100644 --- a/modules/gui/pymod/export_sequence_viewerV2.cc +++ b/modules/gui/pymod/export_sequence_viewerV2.cc @@ -26,6 +26,25 @@ using namespace boost::python; using namespace ost; using namespace ost::gui; +namespace { + +void change_display_mode_a(SequenceViewerV2* seq_viewer, const QString& mode) +{ + seq_viewer->ChangeDisplayMode(mode); +} + +void change_display_mode_b(SequenceViewerV2* seq_viewer, const gfx::EntityP& entity, const QString& mode) +{ + seq_viewer->ChangeDisplayMode(entity, mode); +} + +void change_display_mode_c(SequenceViewerV2* seq_viewer, const seq::AlignmentHandle& alignment, const QString& mode) +{ + seq_viewer->ChangeDisplayMode(alignment, mode); +} + +} + void export_SequenceViewerV2() { @@ -34,6 +53,9 @@ void export_SequenceViewerV2() .def("Hide", &SequenceViewerV2::hide) .def("AddAlignment", &SequenceViewerV2::AddAlignment) .def("RemoveAlignment", &SequenceViewerV2::RemoveAlignment) + .def("ChangeDisplayMode",&change_display_mode_a) + .def("ChangeDisplayMode",&change_display_mode_b) + .def("ChangeDisplayMode",&change_display_mode_c) .def("GetQObject",&get_py_qobject<SequenceViewerV2>) .add_property("qobject", &get_py_qobject<SequenceViewerV2>) ; diff --git a/modules/gui/src/sequence/alignment_view_object.cc b/modules/gui/src/sequence/alignment_view_object.cc index 40003412f..3217085bf 100644 --- a/modules/gui/src/sequence/alignment_view_object.cc +++ b/modules/gui/src/sequence/alignment_view_object.cc @@ -86,6 +86,8 @@ QColor GetForeGroundColor(QColor background){ QMap<QString,int> AlignmentViewObject::group_map_ = GetGroupMap(); +const QString AlignmentViewObject::conservation_mode = "Highlight conservation"; + AlignmentViewObject::AlignmentViewObject(const seq::AlignmentHandle& alignment, QObject* parent): SequenceViewObject(parent), alignment_(alignment) { for(int i=0; i<alignment.GetCount(); i++){ @@ -127,12 +129,13 @@ AlignmentViewObject::AlignmentViewObject(const seq::AlignmentHandle& alignment, conservation_[j] = Qt::transparent; } } + this->AddDisplayMode(conservation_mode); } QVariant AlignmentViewObject::GetData(int row, int column, int role) { - if(column > 0 && column <= alignment_.GetLength()){ + if(column > 0 && column <= alignment_.GetLength() && this->GetCurrentDisplayMode() == conservation_mode){ if(role == Qt::UserRole+3 ){ if(column -1 < conservation_.size()){ return QVariant(conservation_[column-1]); @@ -152,4 +155,22 @@ QVariant AlignmentViewObject::GetData(int row, int column, int role) return BaseViewObject::GetData(row,column,role); } +void AlignmentViewObject::SetDisplayMode(const QString& mode) +{ + if(this->display_modes_.contains(mode) && mode == conservation_mode){ + for(int i=0 ; i<this->GetRowCount(); i++){ + BaseRow* row = this->GetRow(i); + row->RemovePainter(seq_secondary_structure_painter); + row->RemovePainter(align_properties_painter); + row->InsertPainter(conservation_painter,1); + } + } + SequenceViewObject::SetDisplayMode(mode); +} + +const seq::AlignmentHandle& AlignmentViewObject::GetAlignment() +{ + return alignment_; +} + }} diff --git a/modules/gui/src/sequence/alignment_view_object.hh b/modules/gui/src/sequence/alignment_view_object.hh index 71a9dc322..242e1efea 100644 --- a/modules/gui/src/sequence/alignment_view_object.hh +++ b/modules/gui/src/sequence/alignment_view_object.hh @@ -38,11 +38,17 @@ public: QVariant GetData(int row, int column, int role); + const seq::AlignmentHandle& GetAlignment(); + + void SetDisplayMode(const QString& mode); + private: seq::AlignmentHandle alignment_; QMap<int, QColor> conservation_; static QMap<QString,int> group_map_; + + static const QString conservation_mode; }; diff --git a/modules/gui/src/sequence/base_view_object.cc b/modules/gui/src/sequence/base_view_object.cc index f6292d97b..72953aa3e 100644 --- a/modules/gui/src/sequence/base_view_object.cc +++ b/modules/gui/src/sequence/base_view_object.cc @@ -89,6 +89,30 @@ bool BaseViewObject::SetData(int row, int column, const QVariant& value, int rol return rows_[row]->SetData(column, value, role); } +const QStringList& BaseViewObject::GetDisplayModes() +{ + return display_modes_; +} + +const QString& BaseViewObject::GetCurrentDisplayMode() +{ + return current_display_mode_; +} + +void BaseViewObject::SetDisplayMode(const QString& mode) +{ + if(display_modes_.contains(mode)){ + this->current_display_mode_ = mode; + } +} + +void BaseViewObject::AddDisplayMode(const QString& mode) +{ + if(!display_modes_.contains(mode)){ + this->display_modes_.append(mode); + } +} + void BaseViewObject::DoubleClicked(int row, int column) { if(row>=0 || row < rows_.size()){ diff --git a/modules/gui/src/sequence/base_view_object.hh b/modules/gui/src/sequence/base_view_object.hh index 6f227b9c9..90526bfa3 100644 --- a/modules/gui/src/sequence/base_view_object.hh +++ b/modules/gui/src/sequence/base_view_object.hh @@ -51,12 +51,20 @@ public: virtual bool SetData(int row, int column, const QVariant& value, int role); virtual Qt::ItemFlags Flags(int row, int column) const; + virtual const QStringList& GetDisplayModes(); + virtual const QString& GetCurrentDisplayMode(); + virtual void SetDisplayMode(const QString& mode); + void DoubleClicked(int row, int column); void ZoomIn(); void ZoomOut(); protected: + virtual void AddDisplayMode(const QString& mode); + QList<BaseRow*> rows_; + QString current_display_mode_; + QStringList display_modes_; }; diff --git a/modules/gui/src/sequence/sequence_model.cc b/modules/gui/src/sequence/sequence_model.cc index e054a9046..f5eb3fe14 100644 --- a/modules/gui/src/sequence/sequence_model.cc +++ b/modules/gui/src/sequence/sequence_model.cc @@ -26,9 +26,6 @@ #include <QtGui> -#include "alignment_view_object.hh" -#include "sequence_view_object.hh" - #include "title_row.hh" #include "background_painter.hh" @@ -131,7 +128,19 @@ void SequenceModel::RemoveGfxEntity(gfx::EntityP& entity){ } void SequenceModel::RemoveAlignment(const seq::AlignmentHandle& alignment){ - + if(AlignmentViewObject* obj = this->GetItem(alignment)){ + int index = this->GetGlobalRow(obj,0); + this->beginRemoveRows(QModelIndex(),index,index+obj->GetRowCount()-1); + int cols_before = this->columnCount(); + objects_.removeOne(obj); + this->endRemoveRows(); + int cols = this->GetColumnCount(); + if(cols_before>cols){ + this->max_columns = cols; + this->beginRemoveColumns(QModelIndex(), cols, cols_before); + this->endRemoveColumns(); + } + } } int SequenceModel::GetColumnCount() const{ @@ -145,7 +154,7 @@ int SequenceModel::GetColumnCount() const{ return cols; } -SequenceViewObject* SequenceModel::GetItem(gfx::EntityP& entity){ +SequenceViewObject* SequenceModel::GetItem(const gfx::EntityP& entity){ if(entity != NULL){ for (int i = 0 ; i< objects_.size(); i++){ if(SequenceViewObject* seq_view_object = qobject_cast<SequenceViewObject*>(objects_[i])){ @@ -158,12 +167,23 @@ SequenceViewObject* SequenceModel::GetItem(gfx::EntityP& entity){ return NULL; } +AlignmentViewObject* SequenceModel::GetItem(const seq::AlignmentHandle& alignment){ + for (int i = 0 ; i< objects_.size(); i++){ + if(AlignmentViewObject* alignment_object = qobject_cast<AlignmentViewObject*>(objects_[i])){ + if(alignment == alignment_object->GetAlignment()){ + return alignment_object; + } + } + } + return NULL; +} + const PainterList& SequenceModel::GetPainters(const QModelIndex& index) const{ QPair<int, BaseViewObject*> pair = this->GetRowWithItem(index); if(pair.second){ return pair.second->GetRow(pair.first)->GetPainters(); } - return empty_list_; + return empty_painter_list_; } QPair<int, BaseViewObject*> SequenceModel::GetRowWithItem(int row) const{ @@ -274,6 +294,73 @@ void SequenceModel::DoubleClicked(const QModelIndex& index) } } +const QStringList& SequenceModel::GetDisplayModes(gfx::EntityP& entity) +{ + BaseViewObject* item = this->GetItem(entity); + if(item){ + return item->GetDisplayModes(); + } + else{ + return empty_string_list_; + } +} + +const QStringList& SequenceModel::GetDisplayModes(const seq::AlignmentHandle& alignment) +{ + BaseViewObject* item = this->GetItem(alignment); + if(item){ + return item->GetDisplayModes(); + } + else{ + return empty_string_list_; + } +} + +const QString& SequenceModel::GetCurrentDisplayMode(gfx::EntityP& entity) +{ + BaseViewObject* item = this->GetItem(entity); + if(item){ + return item->GetCurrentDisplayMode(); + } + else{ + return empty_string_; + } +} + +const QString& SequenceModel::GetCurrentDisplayMode(const seq::AlignmentHandle& alignment) +{ + BaseViewObject* item = this->GetItem(alignment); + if(item){ + return item->GetCurrentDisplayMode(); + } + else{ + return empty_string_; + } +} + +void SequenceModel::SetDisplayMode(const QString& mode) +{ + for (int i = 0; i<objects_.size(); i++){ + objects_[i]->SetDisplayMode(mode); + } +} + +void SequenceModel::SetDisplayMode(const gfx::EntityP& entity, const QString& mode) +{ + BaseViewObject* item = this->GetItem(entity); + if(item){ + return item->SetDisplayMode(mode); + } +} + +void SequenceModel::SetDisplayMode(const seq::AlignmentHandle& alignment, const QString& mode) +{ + BaseViewObject* item = this->GetItem(alignment); + if(item){ + return item->SetDisplayMode(mode); + } +} + int SequenceModel::rowCount(const QModelIndex& parent) const { int rows = 0; diff --git a/modules/gui/src/sequence/sequence_model.hh b/modules/gui/src/sequence/sequence_model.hh index 218dbb4c9..1cd719ba7 100644 --- a/modules/gui/src/sequence/sequence_model.hh +++ b/modules/gui/src/sequence/sequence_model.hh @@ -34,6 +34,7 @@ #include <ost/gfx/entity.hh> #include "base_view_object.hh" +#include "alignment_view_object.hh" #include "sequence_view_object.hh" namespace ost { namespace gui { @@ -60,6 +61,14 @@ public: int GetGlobalRow(BaseViewObject* obj, int row) const; + const QStringList& GetDisplayModes(gfx::EntityP& entity); + const QStringList& GetDisplayModes(const seq::AlignmentHandle& alignment); + const QString& GetCurrentDisplayMode(gfx::EntityP& entity); + const QString& GetCurrentDisplayMode(const seq::AlignmentHandle& alignment); + void SetDisplayMode(const QString& mode); + void SetDisplayMode(const gfx::EntityP& entity, const QString& mode); + void SetDisplayMode(const seq::AlignmentHandle& alignment, const QString& mode); + const PainterList& GetPainters(const QModelIndex& index) const; // abstract item model interface @@ -79,17 +88,19 @@ public slots: void ZoomOut(); void DoubleClicked(const QModelIndex& index); void SelectionChanged(const QItemSelection& sel, const QItemSelection& desel); - private: int GetColumnCount() const; - SequenceViewObject* GetItem(gfx::EntityP& entity); + SequenceViewObject* GetItem(const gfx::EntityP& entity); + AlignmentViewObject* GetItem(const seq::AlignmentHandle& alignment); BaseViewObject* GetItem(const QModelIndex& index) const; QPair<int, BaseViewObject*> GetRowWithItem(int row) const; QPair<int, BaseViewObject*> GetRowWithItem(const QModelIndex& index) const; QList<BaseViewObject*> objects_; int max_columns; - PainterList empty_list_; + PainterList empty_painter_list_; + QString empty_string_; + QStringList empty_string_list_; }; diff --git a/modules/gui/src/sequence/sequence_view_object.cc b/modules/gui/src/sequence/sequence_view_object.cc index 0ded72932..e7f0a8e0c 100644 --- a/modules/gui/src/sequence/sequence_view_object.cc +++ b/modules/gui/src/sequence/sequence_view_object.cc @@ -30,40 +30,49 @@ #include "sequence_row.hh" #include "secstr_row.hh" -#include "align_properties_painter.hh" -#include "conservation_painter.hh" -#include "painter.hh" -#include "background_painter.hh" -#include "seq_secstr_painter.hh" -#include "seq_selection_painter.hh" -#include "seq_text_painter.hh" - #include "sequence_view_object.hh" namespace ost { namespace gui { +const QString SequenceViewObject::properties_mode = "Highlight properties"; +const QString SequenceViewObject::secondary_structure_mode = "Secondary structure"; + +AlignPropertiesPainter* SequenceViewObject::align_properties_painter = new AlignPropertiesPainter(); +ConservationPainter* SequenceViewObject::conservation_painter = new ConservationPainter(); +BackgroundPainter* SequenceViewObject::background_painter = new BackgroundPainter(); +SeqSecStrPainter* SequenceViewObject::seq_secondary_structure_painter = new SeqSecStrPainter(); +SeqSelectionPainter* SequenceViewObject::seq_selection_painter = new SeqSelectionPainter(); +SeqTextPainter* SequenceViewObject::seq_text_painter = new SeqTextPainter(); + SequenceViewObject::SequenceViewObject(seq::SequenceList& sequences, const QList<QString>& names, QObject *parent): BaseViewObject(parent), entity_(gfx::EntityP()) { + this->Init(); if(names.size() == sequences.GetCount()){ for(int i=0; i<sequences.GetCount(); i++){ seq::SequenceHandle seq = sequences[i]; this->AddSequence(seq, names[i]); } } + this->SetDisplayMode(properties_mode); } SequenceViewObject::SequenceViewObject(seq::SequenceHandle& sequence, const QString& name, QObject *parent): BaseViewObject(parent), entity_(gfx::EntityP()) { + this->Init(); this->AddSequence(sequence, name); + this->SetDisplayMode(properties_mode); } SequenceViewObject::SequenceViewObject(mol::ChainView& chain, const QString& name, QObject *parent): BaseViewObject(parent), entity_(gfx::EntityP()) { + this->Init(); this->AddChain(chain, name); + this->SetDisplayMode(properties_mode); } SequenceViewObject::SequenceViewObject(gfx::EntityP& entity, QObject* parent): BaseViewObject(parent), entity_(entity) { + this->Init(); mol::EntityView view =entity->GetView(); for (mol::ChainViewList::const_iterator c=view.GetChainList().begin(), e1=view.GetChainList().end(); c!=e1; ++c) { @@ -74,38 +83,40 @@ SequenceViewObject::SequenceViewObject(gfx::EntityP& entity, QObject* parent): B } this->AddChain(chain, name); } + this->SetDisplayMode(secondary_structure_mode); } SequenceViewObject::SequenceViewObject(QObject* parent): BaseViewObject(parent), entity_(gfx::EntityP()) -{ } +{ + this->Init(); + this->SetDisplayMode(properties_mode); +} + +void SequenceViewObject::Init() +{ + this->AddDisplayMode(properties_mode); + if(entity_){ + this->AddDisplayMode(secondary_structure_mode); + } +} void SequenceViewObject::AddSequence(seq::SequenceHandle& sequence, const QString& name) { SequenceRow* new_row = new SequenceRow(name, sequence, this); - Painter* p = new BackgroundPainter(this); - new_row->InsertPainter(p); - p = new AlignPropertiesPainter(this); - new_row->InsertPainter(p); - p = new ConservationPainter(this); - new_row->InsertPainter(p); - p = new SeqTextPainter(this); - new_row->InsertPainter(p); - p = new SeqSelectionPainter(this); - new_row->InsertPainter(p); + new_row->InsertPainter(background_painter); + new_row->InsertPainter(align_properties_painter); + new_row->InsertPainter(seq_text_painter); + new_row->InsertPainter(seq_selection_painter); rows_.append(new_row); } void SequenceViewObject::AddChain(mol::ChainView& chain, const QString& name) { SecStrRow* new_row = new SecStrRow(name, chain, this); - Painter* p = new BackgroundPainter(this); - new_row->InsertPainter(p); - p = new SeqSecStrPainter(this); - new_row->InsertPainter(p); - p = new SeqTextPainter(this); - new_row->InsertPainter(p); - p = new SeqSelectionPainter(this); - new_row->InsertPainter(p); + new_row->InsertPainter(background_painter); + new_row->InsertPainter(seq_secondary_structure_painter); + new_row->InsertPainter(seq_text_painter); + new_row->InsertPainter(seq_selection_painter); rows_.append(new_row); } @@ -119,6 +130,29 @@ gfx::EntityP& SequenceViewObject::GetGfxObject() return entity_; } +void SequenceViewObject::SetDisplayMode(const QString& mode) +{ + if(this->display_modes_.contains(mode)){ + if(mode == properties_mode){ + for(int i=0 ; i<this->GetRowCount(); i++){ + BaseRow* row = this->GetRow(i); + row->RemovePainter(seq_secondary_structure_painter); + row->RemovePainter(conservation_painter); + row->InsertPainter(align_properties_painter,1); + } + } + else if(mode == secondary_structure_mode){ + for(int i=0 ; i<this->GetRowCount(); i++){ + BaseRow* row = this->GetRow(i); + row->RemovePainter(align_properties_painter); + row->RemovePainter(conservation_painter); + row->InsertPainter(seq_secondary_structure_painter,1); + } + } + } + BaseViewObject::SetDisplayMode(mode); +} + QMap<int, QList<int> > SequenceViewObject::GetIndexesForView(const mol::EntityView& view) { if(view.GetChainCount()==0){ diff --git a/modules/gui/src/sequence/sequence_view_object.hh b/modules/gui/src/sequence/sequence_view_object.hh index 9c443095f..2ad390a95 100644 --- a/modules/gui/src/sequence/sequence_view_object.hh +++ b/modules/gui/src/sequence/sequence_view_object.hh @@ -30,8 +30,16 @@ #include <ost/seq/sequence_list.hh> +#include "align_properties_painter.hh" +#include "conservation_painter.hh" +#include "background_painter.hh" +#include "seq_secstr_painter.hh" +#include "seq_selection_painter.hh" +#include "seq_text_painter.hh" + #include "base_view_object.hh" + namespace ost { namespace gui { class SequenceViewObject : public BaseViewObject @@ -45,17 +53,34 @@ public: SequenceViewObject(gfx::EntityP& entity, QObject* parent = 0); SequenceViewObject(QObject* parent = 0); + void Init(); + void AddSequence(seq::SequenceHandle& sequence, const QString& name=QString()); void AddChain(mol::ChainView& chain, const QString& name=QString()); void AttachGfxObject(gfx::EntityP& ent); gfx::EntityP& GetGfxObject(); + virtual void SetDisplayMode(const QString& mode); + QMap<int, QList<int> > GetIndexesForView(const mol::EntityView& view); QMap<int, QList<int> > GetIndexesForSubject(const QString& subject, const QString& sequence_name=QString()); +protected: + static const QString properties_mode; + static const QString secondary_structure_mode; + + static AlignPropertiesPainter* align_properties_painter; + static ConservationPainter* conservation_painter; + static BackgroundPainter* background_painter; + static SeqSecStrPainter* seq_secondary_structure_painter; + static SeqSelectionPainter* seq_selection_painter; + static SeqTextPainter* seq_text_painter; + private: gfx::EntityP entity_; + + }; diff --git a/modules/gui/src/sequence/sequence_viewer.cc b/modules/gui/src/sequence/sequence_viewer.cc index 392309d70..3eafc093f 100644 --- a/modules/gui/src/sequence/sequence_viewer.cc +++ b/modules/gui/src/sequence/sequence_viewer.cc @@ -284,6 +284,24 @@ void SequenceViewerV2::SelectList(const QModelIndexList& list) } } +void SequenceViewerV2::ChangeDisplayMode(const QString& string) +{ + model_->SetDisplayMode(string); + seq_table_view_->viewport()->update(); +} + +void SequenceViewerV2::ChangeDisplayMode(const seq::AlignmentHandle& alignment, const QString& string) +{ + model_->SetDisplayMode(alignment, string); + seq_table_view_->viewport()->update(); +} + +void SequenceViewerV2::ChangeDisplayMode(const gfx::EntityP& entity, const QString& string) +{ + model_->SetDisplayMode(entity, string); + seq_table_view_->viewport()->update(); +} + 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 10af21bb3..1137697e4 100644 --- a/modules/gui/src/sequence/sequence_viewer.hh +++ b/modules/gui/src/sequence/sequence_viewer.hh @@ -58,8 +58,11 @@ public: virtual bool Save(const QString&){return true;}; public slots: -/// \internal -void OnSearchBarUpdate(const QString&, bool, const QString&); + void ChangeDisplayMode(const QString&); + void ChangeDisplayMode(const seq::AlignmentHandle&, const QString&); + void ChangeDisplayMode(const gfx::EntityP&, const QString&); + //internal + void OnSearchBarUpdate(const QString&, bool, const QString&); private: void UpdateSearchBar(); @@ -75,6 +78,7 @@ private slots: void DoubleClicked(const QModelIndex& index); void MouseWheelEvent(QWheelEvent* event); void CopyEvent(QKeyEvent* event); + }; }} -- GitLab