/* VariablesView.cpp * * Copyright (C) 2016 Jim Evins * * This file is part of gLabels-qt. * * gLabels-qt is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * gLabels-qt is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gLabels-qt. If not, see . */ #include "VariablesView.h" #include "EditVariableDialog.h" #include #include namespace { enum ICol { I_COL_NAME, I_COL_TYPE, I_COL_VALUE, I_COL_INCREMENT, I_COL_STEP_SIZE, I_COL_DUMMY, N_COLS }; } namespace glabels { /// /// Constructor /// VariablesView::VariablesView( QWidget *parent ) : QWidget(parent), mModel(nullptr), mUndoRedoModel(nullptr) { setupUi( this ); titleLabel->setText( QString( "%1" ).arg( tr("Variables") ) ); table->setColumnCount( N_COLS ); auto* nameHeaderItem = new QTableWidgetItem( tr("Name") ); nameHeaderItem->setFlags( nameHeaderItem->flags() ^ Qt::ItemIsEditable ); table->setHorizontalHeaderItem( I_COL_NAME, nameHeaderItem ); auto* typeHeaderItem = new QTableWidgetItem( tr("Type") ); typeHeaderItem->setFlags( typeHeaderItem->flags() ^ Qt::ItemIsEditable ); table->setHorizontalHeaderItem( I_COL_TYPE, typeHeaderItem ); auto* valueHeaderItem = new QTableWidgetItem( tr("Value") ); valueHeaderItem->setFlags( valueHeaderItem->flags() ^ Qt::ItemIsEditable ); table->setHorizontalHeaderItem( I_COL_VALUE, valueHeaderItem ); auto* incrementHeaderItem = new QTableWidgetItem( tr("Increment") ); incrementHeaderItem->setFlags( incrementHeaderItem->flags() ^ Qt::ItemIsEditable ); table->setHorizontalHeaderItem( I_COL_INCREMENT, incrementHeaderItem ); auto* stepSizeHeaderItem = new QTableWidgetItem( tr("Step Size") ); stepSizeHeaderItem->setFlags( stepSizeHeaderItem->flags() ^ Qt::ItemIsEditable ); table->setHorizontalHeaderItem( I_COL_STEP_SIZE, stepSizeHeaderItem ); auto* dummyHeaderItem = new QTableWidgetItem(); dummyHeaderItem->setFlags( Qt::NoItemFlags ); table->setHorizontalHeaderItem( I_COL_DUMMY, dummyHeaderItem ); table->horizontalHeader()->setStretchLastSection( true ); } /// /// Destructor /// VariablesView::~VariablesView() { // empty } /// /// Set Model /// void VariablesView::setModel( model::Model* model, UndoRedoModel* undoRedoModel ) { mModel = model; mUndoRedoModel = undoRedoModel; updateControls(); loadTable(); connect( mModel, SIGNAL(variablesChanged()), this, SLOT(onVariablesChanged()) ); } /// /// table Selection Changed /// void VariablesView::onTableSelectionChanged() { updateControls(); } /// /// addButton Clicked /// void VariablesView::onAddButtonClicked() { EditVariableDialog dialog( this ); model::Variable v( model::Variable::Type::INTEGER, "x", "0", model::Variable::Increment::NEVER, "1" ); dialog.setVariable( v ); dialog.setWindowTitle( tr("Add Variable") ); if ( dialog.exec() == QDialog::Accepted ) { mModel->variables()->addVariable( dialog.variable() ); selectVariable( dialog.variable().name() ); } } /// /// editButton Clicked /// void VariablesView::onEditButtonClicked() { int iRow = table->selectedItems()[0]->row(); QString name = table->item( iRow, I_COL_NAME )->text(); if ( mModel->variables()->hasVariable( name ) ) { model::Variable v = mModel->variables()->value( name ); EditVariableDialog dialog( this ); dialog.setVariable( v ); dialog.setWindowTitle( tr("Edit Variable") ); if ( dialog.exec() == QDialog::Accepted ) { mModel->variables()->replaceVariable( name, dialog.variable() ); selectVariable( dialog.variable().name() ); } } } /// /// deleteButton Clicked /// void VariablesView::onDeleteButtonClicked() { int iRow = table->selectedItems()[0]->row(); QString name = table->item( iRow, I_COL_NAME )->text(); mModel->variables()->deleteVariable( name ); } /// /// Variables Changed /// void VariablesView::onVariablesChanged() { // Reload table from variables loadTable(); } /// /// update controls /// void VariablesView::updateControls() { bool hasSelection = !table->selectedItems().isEmpty(); editButton->setEnabled( hasSelection ); deleteButton->setEnabled( hasSelection ); } /// /// load table from variables /// void VariablesView::loadTable() { table->clearContents(); table->setRowCount( mModel->variables()->size() ); int iRow = 0; for( const auto& v : *mModel->variables() ) { auto* typeItem = new QTableWidgetItem( model::Variable::typeToI18nString(v.type()) ); typeItem->setFlags( typeItem->flags() ^ Qt::ItemIsEditable ); table->setItem( iRow, I_COL_TYPE, typeItem ); auto* nameItem = new QTableWidgetItem( v.name() ); nameItem->setFlags( nameItem->flags() ^ Qt::ItemIsEditable ); table->setItem( iRow, I_COL_NAME, nameItem ); auto* valueItem = new QTableWidgetItem( v.initialValue() ); valueItem->setFlags( valueItem->flags() ^ Qt::ItemIsEditable ); table->setItem( iRow, I_COL_VALUE, valueItem ); auto* incrementItem = new QTableWidgetItem( model::Variable::incrementToI18nString(v.increment()) ); incrementItem->setFlags( incrementItem->flags() ^ Qt::ItemIsEditable ); table->setItem( iRow, I_COL_INCREMENT, incrementItem ); auto* stepSizeItem = new QTableWidgetItem( v.stepSize() ); stepSizeItem->setFlags( stepSizeItem->flags() ^ Qt::ItemIsEditable ); table->setItem( iRow, I_COL_STEP_SIZE, stepSizeItem ); table->showRow( iRow ); iRow++; } } void VariablesView::selectVariable( const QString& name ) { int iRow = 0; for( const auto& v : *mModel->variables() ) { if ( v.name() == name ) { table->setCurrentCell( iRow, 0, (QItemSelectionModel::Select|QItemSelectionModel::Rows) ); break; } iRow++; } } } // namespace glabels