diff --git a/modules/gui/src/CMakeLists.txt b/modules/gui/src/CMakeLists.txt index 16dcf4f6c32b3335a93b637797b230b456cfaf8f..d58e43808d8b7d4db0e6fa3a850ccbc90093a2dd 100644 --- a/modules/gui/src/CMakeLists.txt +++ b/modules/gui/src/CMakeLists.txt @@ -23,6 +23,7 @@ sequence_search_bar.hh set(OST_GUI_SEQUENCE_VIEW_HEADERS sequence_table_view.hh sequence_viewer.hh +sequence_delegate.hh ) set(OST_GUI_TOOLS_HEADERS @@ -200,6 +201,7 @@ sequence_viewer/sequence_scene.cc sequence_viewer/sequence_search_bar.cc sequence/sequence_table_view.cc sequence/sequence_viewer.cc +sequence/sequence_delegate.cc gosty_app.cc change_process_name.cc main_area.cc @@ -318,6 +320,7 @@ sequence_viewer/sequence_scene.hh sequence_viewer/sequence_search_bar.hh sequence/sequence_table_view.hh sequence/sequence_viewer.hh +sequence/sequence_delegate.hh plot_viewer/plot_axis_base.hh plot_viewer/plot_data_graphics_item_base.hh plot_viewer/plot_function_info.hh diff --git a/modules/gui/src/sequence/sequence_table_view.cc b/modules/gui/src/sequence/sequence_table_view.cc index 4ca7ff1318143bd30271022bd6a7cd00e601f308..087e1e8da404a841b7d095639b8cde8c796dd0d9 100644 --- a/modules/gui/src/sequence/sequence_table_view.cc +++ b/modules/gui/src/sequence/sequence_table_view.cc @@ -23,7 +23,9 @@ #include <QHeaderView> #include <QScrollBar> +#include <QTableWidgetItem> +#include <iostream> #include "sequence_table_view.hh" namespace ost { namespace gui { @@ -42,19 +44,59 @@ SequenceTableView::SequenceTableView(QAbstractItemModel * model) this->viewport()->stackUnder(column_not_move_); column_not_move_->setSelectionModel(this->selectionModel()); - for(int col=1; col<this->model()->columnCount(); col++) + for(int col=1; col<this->model()->columnCount(); col++){ column_not_move_->setColumnHidden(col, true); + } column_not_move_->setColumnWidth(0, this->columnWidth(0) ); column_not_move_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); column_not_move_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); column_not_move_->show(); + column_not_move_->setStyleSheet("QTableView { border: 0px;" + "background-color: #8EDE21;" + "selection-background-color: #999}" + "QTableView::item{ border: none;" + "padding: 0px; border-width: 0px; margin: 0px;}"); + column_not_move_->setShowGrid(false); + + column_not_move_->horizontalHeader()->setStyleSheet( + "QHeaderView::section {" + "padding-bottom: 0px;" + "padding-top: 0px;" + "padding-left: 0px;" + "padding-right: 0px;" + "margin: 0px;" + "}" + ); + + this->setStyleSheet("QTableView {" + "show-decoration-selected: 1;" + "}" + "QTableView::item {" + "border: 1px solid #d9d9d9;" + "border-left-color: transparent;" + "border-right-color: transparent;" + "}" + "QTableView::item:hover {" + "background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1);" + "border: 1px solid #bfcde4;" + "}" + "QTableView::item:selected {" + "border: 1px solid #567dbc;" + "}" + "QTableView::item:selected:active{" + "background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc);" + "}" + "QTableView::item:selected:!active {" + "background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6b9be8, stop: 1 #577fbf);" + "}"); + this->setShowGrid(false); this->updateNotMoveColumn(); - setHorizontalScrollMode(ScrollPerPixel); - setVerticalScrollMode(ScrollPerPixel); + this->setHorizontalScrollMode(ScrollPerPixel); + this->setVerticalScrollMode(ScrollPerPixel); column_not_move_->setVerticalScrollMode(ScrollPerPixel); connect(this->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this, SLOT(ResizeWidth(int,int,int))); @@ -110,6 +152,20 @@ void SequenceTableView::updateNotMoveColumn() column_not_move_->setGeometry(x,y,w,h); } +void SequenceTableView::columnCountChanged(const QModelIndex& index, int old_count, int new_count){ + if(old_count > 1 && old_count <= new_count){ + for(int col=old_count-1; col<this->model()->columnCount(); col++){ + column_not_move_->setColumnHidden(col, true); + } + } +} + +void SequenceTableView::resizeColumnsToContents(){ + QTableView::resizeColumnsToContents(); + column_not_move_->setColumnWidth(0,this->columnWidth(0)); + updateNotMoveColumn(); +} + SequenceTableView::~SequenceTableView(){} }} diff --git a/modules/gui/src/sequence/sequence_table_view.hh b/modules/gui/src/sequence/sequence_table_view.hh index 9b2c725189bee696f96ad78dddbb0e24a422ee45..9b873c40a64b5eaf98de1d08b8eb1e0aec4743c2 100644 --- a/modules/gui/src/sequence/sequence_table_view.hh +++ b/modules/gui/src/sequence/sequence_table_view.hh @@ -36,6 +36,10 @@ public: SequenceTableView(QAbstractItemModel * model); ~SequenceTableView(); +public slots: + void columnCountChanged(const QModelIndex& index, int old_count, int new_count); + void resizeColumnsToContents(); + protected: virtual void resizeEvent(QResizeEvent *event); virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers); diff --git a/modules/gui/src/sequence/sequence_viewer.cc b/modules/gui/src/sequence/sequence_viewer.cc index 0c0f1a09579f45accefd493e0d313c28e975917f..97aabad301ca60737f09cf2c00aafad9a3de6cc2 100644 --- a/modules/gui/src/sequence/sequence_viewer.cc +++ b/modules/gui/src/sequence/sequence_viewer.cc @@ -20,34 +20,112 @@ /* Author: Stefan Scheuber */ +#include <boost/pointer_cast.hpp> #include <QStandardItem> #include <QVBoxLayout> +#include <QPushButton> +#include <QHeaderView> + +#include <ost/mol/chain_view.hh> +#include <ost/mol/entity_view.hh> + +#include <ost/seq/sequence_handle.hh> + +#include <ost/gfx/entity.hh> +#include <ost/gfx/entity_fw.hh> #include "sequence_viewer.hh" -#include "sequence_table_view.hh" +#include "sequence_delegate.hh" + namespace ost { namespace gui { SequenceViewerV2::SequenceViewerV2(QWidget* parent): Widget(NULL,parent) { + gfx::Scene::Instance().AttachObserver(this); QStandardItemModel* model=new QStandardItemModel(); - QStandardItem* item = new QStandardItem("Best protein the world has ever seen"); - model->setItem(0, 0, item); - item = new QStandardItem("slakdjjjjjjjjjjjjjjjjjjjjjjjjlakskdjaksdjaksldjalsdjaklsdjalskdjaskdjaksdjaksdjkasjdkasjdklasdjladjkdjfhjksgb,myxcnaiosjh3iklrjakslfjka"); - model->setItem(0, 1, item); - item = new QStandardItem("Worst protein the world has ever seen"); - model->setItem(1, 0, item); - item = new QStandardItem("slakdjjjjjjjjjjjjjjjjjjjjjjjjlakskdjaksdjaksldjalsdjaklsdjalskdjaskdjaksdjaksdjkasjdkasjdklasdjladjkdjfhjksgb,myxcnaiosjh3iklrjakslfjkb"); - model->setItem(1, 1, item); - QVBoxLayout* layout = new QVBoxLayout(this); + seq_table_view_ = new SequenceTableView(model); layout->addWidget(seq_table_view_); - + //seq_table_view_->setItemDelegateForColumn(2,new SequenceDelegate(seq_table_view_)); this->setLayout(layout); + connect(model,SIGNAL(columnsInserted(const QModelIndex&, int, int)),seq_table_view_,SLOT(columnCountChanged(const QModelIndex&, int, int))); + //QPushButton* pb = new QPushButton("BLABLA"); + //seq_table_view_->setIndexWidget(model->index(0,2),pb); + seq_table_view_->verticalHeader()->hide(); + seq_table_view_->horizontalHeader()->setStyleSheet( + "QHeaderView::section {" + "padding-bottom: 0px;" + "padding-top: 0px;" + "padding-left: 0px;" + "padding-right: 0px;" + "margin: 0px;" + "}" + ); +} + +void SequenceViewerV2::NodeAdded(const gfx::GfxNodeP& n) +{ + if (gfx::EntityP o=boost::dynamic_pointer_cast<gfx::Entity>(n)) { + // extract all chains + mol::EntityView v=o->GetView(); + for (mol::ChainViewList::const_iterator c=v.GetChainList().begin(), + e1=v.GetChainList().end(); c!=e1; ++c) { + mol::ChainView chain=*c; + String seq_str; + seq_str.reserve(chain.GetResidueCount()); + for (mol::ResidueViewList::const_iterator r=chain.GetResidueList().begin(), + e2=chain.GetResidueList().end(); r!=e2; ++r) { + mol::ResidueView res=*r; + seq_str.append(1, res.GetOneLetterCode()); + } + if (seq_str.empty()) { + continue; + } + String name=o->GetName(); + if (chain.GetName()!="" && chain.GetName()!=" ") { + name+=" ("+chain.GetName()+")"; + } + seq::SequenceHandle seq=seq::CreateSequence(name, seq_str); + mol::EntityView v_one_chain=v.GetHandle().CreateEmptyView(); + v_one_chain.AddChain(chain, mol::ViewAddFlag::INCLUDE_ALL); + seq.AttachView(v_one_chain); + //SequenceItem* item=new SequenceItem(seq); + //connect(item, SIGNAL(SelectionChanged(SequenceItem*)), + // this, SLOT(ItemSelectionChanged(SequenceItem*))); + //this->AddSequence(item); + //obj_map_.insert(std::make_pair(item, o)); + + QStandardItem* item = new QStandardItem(name.c_str()); + QStandardItemModel* model = qobject_cast<QStandardItemModel*>(seq_table_view_->model()); + if(model){ + int row = model->rowCount(); + model->setHeaderData(0, Qt::Horizontal, QObject::tr("") ); + model->setHeaderData(row, Qt::Vertical, QObject::tr("") ); + model->setItem(row, 0, item); + for(int i = 0; i< seq.GetLength(); i++){ + item = new QStandardItem(QString(seq.GetOneLetterCode(i))); + item->setTextAlignment(Qt::AlignCenter); + item->setFont(QFont("Courier",10)); + model->setItem(row, i+1, item); + model->setHeaderData(i+1, Qt::Horizontal, QObject::tr("") ); + } + } + } + seq_table_view_->resizeColumnsToContents(); + std::cout << seq_table_view_->styleSheet().toStdString() << std::endl; + } +} + +void SequenceViewerV2::NodeRemoved(const gfx::GfxNodeP& node) +{ + if (gfx::EntityP o=boost::dynamic_pointer_cast<gfx::Entity>(node)) { + + } } SequenceViewerV2::~SequenceViewerV2(){} diff --git a/modules/gui/src/sequence/sequence_viewer.hh b/modules/gui/src/sequence/sequence_viewer.hh index c6cb34e3bb294bf0e3eb1793d6248ad3eca61ce0..d81f887f93d474a1e4b94b75e4ad367520f4f018 100644 --- a/modules/gui/src/sequence/sequence_viewer.hh +++ b/modules/gui/src/sequence/sequence_viewer.hh @@ -24,26 +24,33 @@ */ #include <QWidget> -#include <QTableView> + +#include <ost/gfx/scene.hh> +#include <ost/gfx/gfx_object.hh> #include <ost/gui/widget.hh> #include <ost/gui/module_config.hh> +#include "sequence_table_view.hh" + namespace ost { namespace gui { /// \brief QTableView with first column not moving -class DLLEXPORT_OST_GUI SequenceViewerV2 : public Widget { +class DLLEXPORT_OST_GUI SequenceViewerV2 : public Widget, public gfx::SceneObserver { Q_OBJECT public: SequenceViewerV2(QWidget* parent=NULL); ~SequenceViewerV2(); + virtual void NodeAdded(const gfx::GfxNodeP& node); + virtual void NodeRemoved(const gfx::GfxNodeP& node); + virtual bool Restore(const QString&){return true;}; virtual bool Save(const QString&){return true;}; private: - QTableView* seq_table_view_; + SequenceTableView* seq_table_view_; }; }} diff --git a/modules/gui/src/sequence_viewer/sequence_viewer_base.cc b/modules/gui/src/sequence_viewer/sequence_viewer_base.cc index 982b6f215c54076611f467f281f747e523344635..61cae9aac9015f3c3db6a27741a12c7f84da109a 100644 --- a/modules/gui/src/sequence_viewer/sequence_viewer_base.cc +++ b/modules/gui/src/sequence_viewer/sequence_viewer_base.cc @@ -207,7 +207,7 @@ SequenceViewerBase::Style SequenceViewerBase::GetDisplayStyle() const void SequenceViewerBase::AddSequence(SequenceItem* seq) { - seq->SetShowSecStructure(style_==LOOSE); + seq->SetShowSecStructure(style_==LOOSE); scene_->AddSequence(seq); QRectF rect=scene_->itemsBoundingRect(); view_->setSceneRect(QRectF(0, 0, +rect.left()+rect.width(),