diff --git a/modules/gui/src/sequence/sequence_table_view.cc b/modules/gui/src/sequence/sequence_table_view.cc index c19ca30da29343f0a3fb1e617d62d19d07bab8f4..80018d8dbf38cbb3aace7bb7a8e0674e4d047901 100644 --- a/modules/gui/src/sequence/sequence_table_view.cc +++ b/modules/gui/src/sequence/sequence_table_view.cc @@ -51,90 +51,165 @@ SequenceTableView::SequenceTableView(QAbstractItemModel * model) "margin-bottom: 0px;" "margin-left: 0px;" "margin-right: 0px;" - "}" - "QTableView::item:hover {" - "background-color: #EEEEEE;" - "}" - "QTableView::item:selected:active{" - "background-color: #7ff963;" - "}" - "QTableView::item:selected:!active {" - "background-color: #47ce27;" "}"); this->verticalHeader()->hide(); - this->horizontalHeader()->setStyleSheet( - "QHeaderView::section {" - "padding-bottom: 0px;" - "padding-top: 0px;" - "padding-left: 0px;" - "padding-right: 0px;" - "margin: 0px;" - "}" - ); - - column_not_move_ = new QTableView(this); - - column_not_move_->setModel(this->model()); - column_not_move_->setFocusPolicy(Qt::NoFocus); - column_not_move_->verticalHeader()->hide(); - column_not_move_->horizontalHeader()->setResizeMode(QHeaderView::Fixed); - - this->viewport()->stackUnder(column_not_move_); - - column_not_move_->setSelectionModel(this->selectionModel()); + this->horizontalHeader()->hide(); + + this->setShowGrid(false); + + this->setHorizontalScrollMode(ScrollPerPixel); + this->setVerticalScrollMode(ScrollPerPixel); + + connect(this->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this, SLOT(ResizeWidth(int,int,int))); + connect(this->verticalHeader(),SIGNAL(sectionResized(int,int,int)), this, SLOT(ResizeHeight(int,int,int))); + + delegate_ = new SequenceDelegate(qobject_cast<SequenceModel*>(this->model()),this); + + this->InitStaticRow(); + this->InitStaticColumn(); +// this->viewport()->stackUnder(static_row_); + this->InitStaticField(); +// this->viewport()->stackUnder(static_field_); + } + +void SequenceTableView::InitStaticColumn() +{ + static_column_ = new QTableView(this); + + static_column_->setModel(this->model()); + static_column_->setFocusPolicy(Qt::NoFocus); + static_column_->verticalHeader()->hide(); + static_column_->horizontalHeader()->hide(); + + //this->viewport()->stackUnder(static_column_); + + static_column_->setSelectionModel(this->selectionModel()); for(int col=1; col<this->model()->columnCount(); col++){ - column_not_move_->setColumnHidden(col, true); + static_column_->setColumnHidden(col, true); } - column_not_move_->setColumnWidth(0, this->columnWidth(0) ); + static_column_->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: #dbdbdb;" + static_column_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + static_column_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + static_column_->show(); + static_column_->setStyleSheet("QTableView { border: 0px;" + "background-color: #ff0000;" "selection-background-color: #EEEEEE}" "QTableView::item{ border: none;" "padding: 0px; border-width: 0px; margin: 0px;}"); - column_not_move_->setShowGrid(false); + static_column_->setShowGrid(false); - column_not_move_->horizontalHeader()->setStyleSheet(this->horizontalHeader()->styleSheet()); + static_column_->setVerticalScrollMode(ScrollPerPixel); - this->setShowGrid(false); + connect(static_column_->verticalScrollBar(), SIGNAL(valueChanged(int)), this->verticalScrollBar(), SLOT(setValue(int))); + connect(verticalScrollBar(), SIGNAL(valueChanged(int)), static_column_->verticalScrollBar(), SLOT(setValue(int))); - this->updateNotMoveColumn(); + this->updateStaticColumn(); +} - this->setHorizontalScrollMode(ScrollPerPixel); - this->setVerticalScrollMode(ScrollPerPixel); - column_not_move_->setVerticalScrollMode(ScrollPerPixel); +void SequenceTableView::InitStaticRow() +{ + static_row_ = new QTableView(this); - connect(this->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), this, SLOT(ResizeWidth(int,int,int))); - connect(this->verticalHeader(),SIGNAL(sectionResized(int,int,int)), this, SLOT(ResizeHeight(int,int,int))); + static_row_->setModel(this->model()); + static_row_->setFocusPolicy(Qt::NoFocus); + static_row_->horizontalHeader()->hide(); + static_row_->verticalHeader()->hide(); - connect(column_not_move_->verticalScrollBar(), SIGNAL(valueChanged(int)), this->verticalScrollBar(), SLOT(setValue(int))); - connect(verticalScrollBar(), SIGNAL(valueChanged(int)), column_not_move_->verticalScrollBar(), SLOT(setValue(int))); + static_row_->setSelectionModel(this->selectionModel()); + for(int row=1; row<this->model()->rowCount(); row++){ + static_row_->setRowHidden(row, true); + } - delegate_ = new SequenceDelegate(qobject_cast<SequenceModel*>(this->model()),this); - } + static_row_->setRowHeight(0, this->rowHeight(0)); + + static_row_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + static_row_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + static_row_->show(); + static_row_->setStyleSheet("QTableView { border: 0px;" + "background-color: #00ff00;" + "selection-background-color: #EEEEEE}" + "QTableView::item{ border: none;" + "padding: 0px; border-width: 0px; margin: 0px;}"); + static_row_->setShowGrid(false); + + static_row_->setHorizontalScrollMode(ScrollPerPixel); + + connect(static_row_->horizontalScrollBar(), SIGNAL(valueChanged(int)), this->horizontalScrollBar(), SLOT(setValue(int))); + connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), static_row_->horizontalScrollBar(), SLOT(setValue(int))); + + this->updateStaticRow(); +} + +void SequenceTableView::InitStaticField(){ + static_field_ = new QTableView(this); + static_field_->setModel(this->model()); + static_field_->setFocusPolicy(Qt::NoFocus); + static_field_->horizontalHeader()->hide(); + static_field_->verticalHeader()->hide(); + + static_field_->setSelectionModel(this->selectionModel()); + for(int row=1; row<this->model()->rowCount(); row++){ + static_field_->setRowHidden(row, true); + } + for(int col=1; col<this->model()->columnCount(); col++){ + static_field_->setColumnHidden(col, true); + } + + static_field_->setRowHeight(0, this->rowHeight(0)); + static_field_->setColumnWidth(0, this->columnWidth(0)); + + static_field_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + static_field_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + static_field_->show(); + static_field_->setStyleSheet("QTableView { border: 0px;" + "background-color: #0000ff;" + "selection-background-color: #EEEEEE}" + "QTableView::item{ border: none;" + "padding: 0px; border-width: 0px; margin: 0px;}"); + static_field_->setShowGrid(false); + + static_field_->setHorizontalScrollMode(ScrollPerPixel); + static_field_->setVerticalScrollMode(ScrollPerPixel); + + connect(static_field_->horizontalScrollBar(), SIGNAL(valueChanged(int)), this->horizontalScrollBar(), SLOT(setValue(int))); + connect(horizontalScrollBar(), SIGNAL(valueChanged(int)), static_field_->horizontalScrollBar(), SLOT(setValue(int))); + connect(static_field_->verticalScrollBar(), SIGNAL(valueChanged(int)), this->verticalScrollBar(), SLOT(setValue(int))); + connect(verticalScrollBar(), SIGNAL(valueChanged(int)), static_field_->verticalScrollBar(), SLOT(setValue(int))); + + this->updateStaticField(); +} void SequenceTableView::ResizeWidth(int index, int, int size) { if(index == 0){ - column_not_move_->setColumnWidth(0,size); - updateNotMoveColumn(); + static_column_->setColumnWidth(0,size); + static_field_->setColumnWidth(0,size); + this->updateStaticColumn(); + this->updateStaticField(); } + static_row_->setRowHeight(index,size); } void SequenceTableView::ResizeHeight(int index, int, int size) { - column_not_move_->setRowHeight(index, size); + static_column_->setRowHeight(index, size); + if(index == 0){ + static_row_->setRowHeight(0,size); + static_field_->setRowHeight(0,size); + this->updateStaticRow(); + this->updateStaticField(); + } } void SequenceTableView::resizeEvent(QResizeEvent * event) { QTableView::resizeEvent(event); - updateNotMoveColumn(); + this->updateStaticColumn(); + this->updateStaticRow(); + this->updateStaticField(); } QModelIndex SequenceTableView::moveCursor(CursorAction action, Qt::KeyboardModifiers modifiers) @@ -142,46 +217,105 @@ QModelIndex SequenceTableView::moveCursor(CursorAction action, Qt::KeyboardModif QModelIndex current = QTableView::moveCursor(action, modifiers); if(action == MoveLeft && current.column()>0 - && this->visualRect(current).topLeft().x() < column_not_move_->columnWidth(0) ){ - const int new_value = horizontalScrollBar()->value() + this->visualRect(current).topLeft().x() - column_not_move_->columnWidth(0); + && this->visualRect(current).topLeft().x() < static_column_->columnWidth(0) ){ + const int new_value = horizontalScrollBar()->value() + this->visualRect(current).topLeft().x() - static_column_->columnWidth(0); horizontalScrollBar()->setValue(new_value); } + + + if(action == MoveUp && current.row()>0 + && this->visualRect(current).bottomLeft().y() < static_row_->rowHeight(0) ){ + const int new_value = verticalScrollBar()->value() + this->visualRect(current).bottomRight().y() - static_row_->rowHeight(0); + verticalScrollBar()->setValue(new_value); + } + return current; } void SequenceTableView::scrollTo(const QModelIndex & index, ScrollHint hint){ - if(index.column()>0){ + if(index.column()>0 && index.row()>0){ QTableView::scrollTo(index, hint); } } -void SequenceTableView::updateNotMoveColumn() +void SequenceTableView::updateStaticColumn() { int x = this->verticalHeader()->width()+this->frameWidth(); int y = this->frameWidth(); int w = this->columnWidth(0); int h = this->viewport()->height()+this->horizontalHeader()->height(); - column_not_move_->setGeometry(x,y,w,h); + static_column_->setGeometry(x,y,w,h); +} + +void SequenceTableView::updateStaticRow(){ + int x = this->verticalHeader()->width()+this->frameWidth(); + int y = this->horizontalHeader()->height()+this->frameWidth(); + int w = this->viewport()->width()+this->verticalHeader()->width(); + int h = this->rowHeight(0); + static_row_->setGeometry(x,y,w,h); +} + +void SequenceTableView::updateStaticField(){ + int x = this->verticalHeader()->width()+this->frameWidth(); + int y = this->horizontalHeader()->height()+this->frameWidth(); + int w = this->columnWidth(0); + int h = this->rowHeight(0); + static_field_->setGeometry(x,y,w,h); } void SequenceTableView::columnCountChanged(const QModelIndex& index, int old_count, int new_count){ if(old_count >= 0 && old_count <= new_count){ if(old_count == 0)old_count = 1; for(int col=old_count; col<=new_count; col++){ - column_not_move_->setColumnHidden(col, true); + static_column_->setColumnHidden(col, true); + static_field_->setColumnHidden(col,true); this->setItemDelegateForColumn(col, delegate_); } + this->setItemDelegateForRow(0, new QItemDelegate(this)); } } +void SequenceTableView::rowCountChanged(const QModelIndex& index, int old_count, int new_count){ + if(old_count >= 0 && old_count <= new_count){ + if(old_count == 0){ + old_count = 1; + } + for(int row=old_count; row<=new_count; row++){ + static_row_->setRowHidden(row, true); + static_field_->setRowHidden(row,true); + } + } +} + + void SequenceTableView::resizeColumnsToContents(){ QTableView::resizeColumnsToContents(); - column_not_move_->setColumnWidth(0,this->columnWidth(0)); - updateNotMoveColumn(); + static_column_->setColumnWidth(0,this->columnWidth(0)); + static_field_->setColumnWidth(0,this->columnWidth(0)); + for(int i = 0; i < this->model()->columnCount(); i++){ + static_row_->setColumnWidth(i,this->columnWidth(i)); + } + this->updateStaticColumn(); + this->updateStaticField(); +} + +void SequenceTableView::resizeRowsToContents(){ + QTableView::resizeRowsToContents(); + static_row_->setRowHeight(0,this->rowHeight(0)); + static_field_->setRowHeight(0,this->rowHeight(0)); + for(int i = 0; i < this->model()->columnCount(); i++){ + static_column_->setRowHeight(i,this->rowHeight(i)); + } + this->updateStaticRow(); + this->updateStaticField(); } QTableView* SequenceTableView::GetFirstRow(){ - return column_not_move_; + return static_row_; +} + +QTableView* SequenceTableView::GetFirstColumn(){ + return static_column_; } void SequenceTableView::mouseDoubleClickEvent(QMouseEvent *event) diff --git a/modules/gui/src/sequence/sequence_table_view.hh b/modules/gui/src/sequence/sequence_table_view.hh index 5fc244b2d25f5ff8026b42c5872ccc8eeb3db6c5..f56248c039a82a3967a5aa6bdaeb9daa9715bed1 100644 --- a/modules/gui/src/sequence/sequence_table_view.hh +++ b/modules/gui/src/sequence/sequence_table_view.hh @@ -36,12 +36,15 @@ class DLLEXPORT_OST_GUI SequenceTableView : public QTableView { Q_OBJECT public: SequenceTableView(QAbstractItemModel * model); + QTableView* GetFirstRow(); + QTableView* GetFirstColumn(); ~SequenceTableView(); public slots: void columnCountChanged(const QModelIndex& index, int old_count, int new_count); + void rowCountChanged(const QModelIndex& index, int old_count, int new_count); void resizeColumnsToContents(); - QTableView* GetFirstRow(); + void resizeRowsToContents(); protected: virtual void mouseDoubleClickEvent(QMouseEvent* event); @@ -51,14 +54,21 @@ protected: void scrollTo (const QModelIndex & index, ScrollHint hint = EnsureVisible); private slots: + void InitStaticColumn(); + void InitStaticRow(); + void InitStaticField(); void ResizeWidth(int index, int, int size); void ResizeHeight(int index, int, int size); private: - QTableView* column_not_move_; + QTableView* static_column_; + QTableView* static_row_; + QTableView* static_field_; SequenceDelegate* delegate_; QModelIndex last_double_click_; - void updateNotMoveColumn(); + void updateStaticColumn(); + void updateStaticRow(); + void updateStaticField(); }; }} diff --git a/modules/gui/src/sequence/sequence_viewer.cc b/modules/gui/src/sequence/sequence_viewer.cc index 14b0957613a4cf30901bf54f8758cd2809190856..13dc41e65c653687edd9b189eccb444e18ec85df 100644 --- a/modules/gui/src/sequence/sequence_viewer.cc +++ b/modules/gui/src/sequence/sequence_viewer.cc @@ -55,13 +55,14 @@ SequenceViewerV2::SequenceViewerV2(QWidget* parent): Widget(NULL,parent) layout->addWidget(seq_table_view_); this->setLayout(layout); connect(model_,SIGNAL(columnsInserted(const QModelIndex&, int, int)),seq_table_view_,SLOT(columnCountChanged(const QModelIndex&, int, int))); + connect(model_,SIGNAL(rowsInserted(const QModelIndex&, int, int)),seq_table_view_,SLOT(rowCountChanged(const QModelIndex&, int, int))); seq_table_view_->horizontalHeader()->setMinimumSectionSize(2); seq_table_view_->verticalHeader()->setMinimumSectionSize(2); 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&)),this,SLOT(DoubleClicked(const QModelIndex&))); + connect(seq_table_view_->GetFirstColumn(),SIGNAL(doubleClicked(const QModelIndex&)),this,SLOT(DoubleClicked(const QModelIndex&))); } void SequenceViewerV2::NodeAdded(const gfx::GfxNodeP& n)