diff --git a/glabels/Merge.cpp b/glabels/Merge.cpp index 2d41442..6028855 100644 --- a/glabels/Merge.cpp +++ b/glabels/Merge.cpp @@ -126,6 +126,19 @@ void Merge::unselect( MergeRecord* record ) } +/// +/// Select/unselect i'th record +/// +void Merge::setSelected( int i, bool state ) +{ + if ( (i >= 0) && (i < mRecordList.size()) ) + { + mRecordList[i]->setSelected( state ); + emit selectionChanged(); + } +} + + /// /// Select all records /// diff --git a/glabels/Merge.h b/glabels/Merge.h index 70bdf36..fcd4685 100644 --- a/glabels/Merge.h +++ b/glabels/Merge.h @@ -70,6 +70,7 @@ public: public: void select( MergeRecord* record ); void unselect( MergeRecord* record ); + void setSelected( int i, bool state = true ); void selectAll(); void unselectAll(); const QList selectedRecords() const; diff --git a/glabels/MergeView.cpp b/glabels/MergeView.cpp index 7f4cad5..17b3988 100644 --- a/glabels/MergeView.cpp +++ b/glabels/MergeView.cpp @@ -29,7 +29,7 @@ /// Constructor /// MergeView::MergeView( QWidget *parent ) - : QWidget(parent), mModel(0) + : QWidget(parent), mModel(0), mBlock(false) { setupUi( this ); @@ -96,6 +96,76 @@ void MergeView::onMergeChanged() loadHeaders( mModel->merge() ); loadTable( mModel->merge() ); + + connect( mModel->merge(), SIGNAL(sourceChanged()), this, SLOT(onMergeSourceChanged()) ); + connect( mModel->merge(), SIGNAL(selectionChanged()), this, SLOT(onMergeSelectionChanged()) ); + + connect( recordsTable, SIGNAL(cellChanged(int,int)), this, SLOT(onCellChanged(int,int)) ); +} + + +/// +/// Merge source changed handler +/// +void MergeView::onMergeSourceChanged() +{ + loadHeaders( mModel->merge() ); + loadTable( mModel->merge() ); +} + + +/// +/// Merge selection changed handler +/// +void MergeView::onMergeSelectionChanged() +{ + mBlock = true; // Don't recurse + + const QList& records = mModel->merge()->recordList(); + + int iRow = 0; + foreach ( MergeRecord* record, records ) + { + QTableWidgetItem* item = recordsTable->item( iRow, 0 ); + item->setCheckState( record->isSelected() ? Qt::Checked : Qt::Unchecked ); + + iRow++; + } + + mBlock = false; +} + + +/// +/// Select all button clicked handler +/// +void MergeView::onSelectAllButtonClicked() +{ + mModel->merge()->selectAll(); +} + + +/// +/// Unselect all button clicked handler +/// +void MergeView::onUnselectAllButtonClicked() +{ + mModel->merge()->unselectAll(); +} + + +/// +/// Cell changed handler +/// +void MergeView::onCellChanged( int iRow, int iCol ) +{ + if ( !mBlock ) + { + QTableWidgetItem* item = recordsTable->item( iRow, 0 ); + bool state = (item->checkState() == Qt::Unchecked) ? false : true; + + mModel->merge()->setSelected( iRow, state ); + } } @@ -142,6 +212,8 @@ void MergeView::loadHeaders( Merge* merge ) /// void MergeView::loadTable( Merge* merge ) { + mBlock = true; + const QList& records = merge->recordList(); recordsTable->setRowCount( records.size() ); @@ -185,5 +257,5 @@ void MergeView::loadTable( Merge* merge ) iRow++; } - + mBlock = false; } diff --git a/glabels/MergeView.h b/glabels/MergeView.h index b29b4cf..488e6df 100644 --- a/glabels/MergeView.h +++ b/glabels/MergeView.h @@ -57,6 +57,12 @@ public: ///////////////////////////////// private slots: void onMergeChanged(); + void onMergeSourceChanged(); + void onMergeSelectionChanged(); + + void onSelectAllButtonClicked(); + void onUnselectAllButtonClicked(); + void onCellChanged( int iRow, int iCol ); ///////////////////////////////// @@ -79,6 +85,8 @@ private: QStringList mKeys; QString mPrimaryKey; + bool mBlock; + };