48 #include <DatabaseUtils/GUI/ConfigDataTreeModel.h> 49 #include <DatabaseUtils/DAQConfig/DBColumnParams.h> 50 #include <DatabaseUtils/DAQConfig/NamedConfigUtils.h> 51 #include <DatabaseUtils/SimpleParameterSet.h> 52 #include <NovaDAQUtilities/HexUtils.h> 53 #include <QtGui/QtGui> 54 #include <boost/lexical_cast.hpp> 55 #include <boost/algorithm/string.hpp> 60 #define NUMBER_OF_EXTRA_COLUMNS_WHEN_SELECTORS_ARE_PRESENT 2 62 #define NONE_SPECIFIED_STRING "none specified" 68 return (
"FEB " + febId);
72 return (
"Pixel " + pixelId);
89 size_t pos = workString.rfind(
" ");
90 if (pos != std::string::npos) {
94 result = boost::lexical_cast<int32_t>(idString);
104 size_t pos = workString.rfind(
" ");
105 if (pos != std::string::npos) {
106 workString = workString.substr(pos);
113 ConfigDataTreeModel::
114 ConfigDataTreeModel(QObject *
parent) : QAbstractItemModel(parent)
121 QList<QString> EMPTY_LIST;
127 if (selectorColumn == DBColumnParams::DCMNAME_COLUMN_NAME ||
128 selectorColumn == DBColumnParams::HOSTNAME_COLUMN_NAME) {
132 if (selectorColumn != DBColumnParams::FEBID_COLUMN_NAME &&
133 selectorColumn != DBColumnParams::PIXELID_COLUMN_NAME) {
139 selectedItem->
data(0).toString().toStdString();
141 if (thisChannelId == INVALID_ID) {
return EMPTY_LIST;}
143 QModelIndex previousIndex = this->
index(index.row()-1, index.column(),
145 int previousChannelId = -1;
146 if (previousIndex.isValid()) {
149 previousItem->
data(0).toString().toStdString();
154 for (
int idx = previousChannelId+1;
idx < thisChannelId; ++
idx) {
155 QString idString = QString::number(
idx);
156 results.push_back(idString);
165 QList<QString> EMPTY_LIST;
172 if (selectorColumn == DBColumnParams::DCMNAME_COLUMN_NAME ||
173 selectorColumn == DBColumnParams::HOSTNAME_COLUMN_NAME) {
174 QString nameString =
"unknown";
175 results.push_back(nameString);
179 if (selectorColumn != DBColumnParams::FEBID_COLUMN_NAME &&
180 selectorColumn != DBColumnParams::PIXELID_COLUMN_NAME) {
186 selectedItem->
data(0).toString().toStdString();
188 if (thisChannelId == INVALID_ID) {
return EMPTY_LIST;}
190 QModelIndex nextIndex = this->
index(index.row()+1, index.column(),
192 int nextChannelId = -1;
193 if (nextIndex.isValid()) {
196 nextItem->
data(0).toString().toStdString();
200 if (selectorColumn == DBColumnParams::FEBID_COLUMN_NAME) {
203 if (selectorColumn == DBColumnParams::PIXELID_COLUMN_NAME) {
208 for (
int idx = thisChannelId+1;
idx < nextChannelId; ++
idx) {
209 QString idString = QString::number(
idx);
210 results.push_back(idString);
219 QList<QString> EMPTY_LIST;
226 if (selectorColumn == DBColumnParams::DCMNAME_COLUMN_NAME ||
227 selectorColumn == DBColumnParams::HOSTNAME_COLUMN_NAME) {
228 QString nameString =
"unknown";
229 results.push_back(nameString);
233 if (selectorColumn != DBColumnParams::FEBID_COLUMN_NAME &&
234 selectorColumn != DBColumnParams::PIXELID_COLUMN_NAME) {
238 int nextChannelId = -1;
239 QModelIndex childIndex = this->
index(0, 0, index);
240 if (childIndex.isValid()) {
243 childItem->
data(0).toString().toStdString();
247 if (selectorColumn == DBColumnParams::FEBID_COLUMN_NAME) {
250 if (selectorColumn == DBColumnParams::PIXELID_COLUMN_NAME) {
255 for (
int idx = 0;
idx < nextChannelId; ++
idx) {
256 QString idString = QString::number(
idx);
257 results.push_back(idString);
264 loadData(boost::shared_ptr<daqconfig::ConfigDataTree> dataTree)
269 QVector<QVariant> rootData;
271 rootData <<
"Component";
272 rootData <<
"Row Type";
276 QString tmpQString(dataColumn.c_str());
277 rootData << tmpQString;
282 QModelIndex dummyIndex;
293 std::vector<TreeItem*> modifiedItems;
295 return (modifiedItems.size() > 0);
300 std::vector<dbutils::SimpleParameterSet> newDataList;
302 std::vector<TreeItem*> modifiedItems;
304 for (
int idx = 0;
idx < (
int) modifiedItems.size(); ++
idx) {
307 paramSet.
put(NamedConfigUtils::SUBSYSCFGID_COLUMN_NAME,
308 boost::lexical_cast<std::string>(subsystemConfigId));
310 int dataColumnOffset = 0;
314 std::vector<TreeItem*> ancestorList;
315 ancestorList.push_back(item);
317 while (parent != 0) {
318 ancestorList.push_back(parent);
319 parent = parent->
parent();
323 if (ancestorList.size() > 0) {ancestorList.pop_back();}
324 if (ancestorList.size() > 0) {ancestorList.pop_back();}
327 int selectorIndex = 0;
328 while (ancestorList.size() > 0) {
330 ancestorList.pop_back();
334 if (columnName == DBColumnParams::DCMNAME_COLUMN_NAME &&
335 value ==
"Full System") {
338 if (columnName == DBColumnParams::FEBID_COLUMN_NAME ||
339 columnName == DBColumnParams::PIXELID_COLUMN_NAME) {
343 paramSet.
put(columnName, value);
358 int numberOfEmptyValues = 0;
359 for (
int jdx = dataColumnOffset; jdx < item->
columnCount(); ++jdx) {
363 ++numberOfEmptyValues;
371 value = boost::lexical_cast<
std::string>(i64Value);
378 value = boost::lexical_cast<
std::string>(i32Value);
389 if (numberOfEmptyValues == 0) {
391 newDataList.push_back(paramSet);
393 else if (item->
childCount() != 0 && numberOfEmptyValues ==
401 msgText.append(
"Values may not be left empty ");
402 msgText.append(
"except in new default rows that have ");
403 msgText.append(
"new exceptions underneath them. ");
405 msgText.append(
_dataTree->getTableName());
406 msgText.append(
" table.)");
407 QMessageBox::critical(0,
"ERROR: Empty Value(s)", msgText.c_str());
412 if (newDataList.size() > 0) {
413 if (
_dataTree->saveValues(newDataList)) {
414 for (
int idx = 0;
idx < (
int) modifiedItems.size(); ++
idx) {
431 std::vector<TreeItem*>&
list)
const 434 if (baseItem->
isDirty() || baseItem->
isNew()) {list.push_back(baseItem);}
450 if (!index.isValid()) {
return QVariant();}
453 if (role == Qt::BackgroundRole) {
457 index.column() >= comparator) {
459 QBrush brush(yellow);
464 if (role != Qt::DisplayRole && role != Qt::EditRole)
469 return item->
data(index.column());
474 if (!index.isValid())
481 if (index.column() >= comparator) {
482 return Qt::ItemIsEditable | Qt::ItemIsEnabled | Qt::ItemIsSelectable;
486 if (index.column() == 0 &&
488 (selectorColumnName == DBColumnParams::DCMNAME_COLUMN_NAME ||
489 selectorColumnName == DBColumnParams::HOSTNAME_COLUMN_NAME)) {
492 return Qt::ItemIsEditable | Qt::ItemIsEnabled |
493 Qt::ItemIsSelectable;
496 return Qt::ItemIsEnabled;
502 if (index.isValid()) {
504 if (item)
return item;
512 if (role == Qt::ToolTipRole) {
514 if (selectorCount > 0) {
517 for (
int idx = 0;
idx < selectorCount; ++
idx) {
523 if (
idx == selectorCount-1) {msg.append(
"and ");}
528 return QVariant(QString(msg.c_str()));
530 else if (section == 1) {
532 return QVariant(QString(msg.c_str()));
537 if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
545 if (parent.isValid() && parent.column() != 0) {
546 return QModelIndex();
553 return createIndex(row, column, childItem);
555 return QModelIndex();
562 beginInsertRows(parent, position, position + rows - 1);
576 if (!index.isValid()) {
return QModelIndex();}
582 return QModelIndex();
584 return createIndex(parentItem->
childNumber(), 0, parentItem);
591 beginRemoveRows(parent, position, position + rows - 1);
611 const QVariant &
value,
614 if (role != Qt::EditRole)
618 QVariant oldValue = item->
data(index.column());
619 if (value == oldValue) {
626 QMessageBox::ButtonRole userChoice = QMessageBox::YesRole;
628 QMessageBox choiceBox;
630 std::string msgText =
"You have specified a new default value. ";
631 msgText.append(
"Typically, a new default value overrides ");
632 msgText.append(
"all existing exceptions underneath the default. ");
633 msgText.append(
"However, you should specify the behavior that ");
634 msgText.append(
"you want.");
635 choiceBox.setText(msgText.c_str());
637 msgText =
"Do you want to Keep None of the exceptions underneath ";
638 msgText.append(
"this default, Keep the New exceptions that you ");
639 msgText.append(
"have created or edited during this editor ");
640 msgText.append(
"session, Keep All of the exceptions under ");
641 msgText.append(
"this default, or Cancel your change?");
642 choiceBox.setInformativeText(msgText.c_str());
644 QPushButton* keepNoneButton =
645 choiceBox.addButton(
tr(
"Keep None"), QMessageBox::AcceptRole);
646 QPushButton* keepNewButton =
647 choiceBox.addButton(
tr(
"Keep New"), QMessageBox::ApplyRole);
648 QPushButton* keepAllButton =
649 choiceBox.addButton(
tr(
"Keep All"), QMessageBox::RejectRole);
650 QPushButton* cancelButton =
651 choiceBox.addButton(
tr(
"Cancel"), QMessageBox::ResetRole);
652 choiceBox.setDefaultButton(keepNewButton);
655 if (choiceBox.clickedButton() == cancelButton) {
658 else if (choiceBox.clickedButton() == keepNoneButton) {
659 userChoice = QMessageBox::AcceptRole;
661 else if (choiceBox.clickedButton() == keepNewButton) {
662 userChoice = QMessageBox::ApplyRole;
664 else if (choiceBox.clickedButton() == keepAllButton) {
665 userChoice = QMessageBox::RejectRole;
674 if (userChoice == QMessageBox::AcceptRole) {
678 else if (userChoice == QMessageBox::ApplyRole) {
681 while (childIdx < item->childCount()) {
691 else if (userChoice == QMessageBox::RejectRole) {
699 emit dataChanged(index, index);
709 if (role != Qt::EditRole || orientation != Qt::Horizontal)
715 emit headerDataChanged(orientation, section, section);
733 NO_DEFAULT_KEY_STRING);
748 std::vector<std::string> selectionList)
750 int numberOfNonEmptyItems = 0;
751 int selectorCount = selectionList.size();
758 if (selectorCount > 0) {
759 if (thisLevel == -1) {
760 thisItem->
setData(itemIndex++, QVariant(
"Full System"));
761 thisItem->
setData(itemIndex++, QVariant(
"Default"));
766 DBColumnParams::FEBID_COLUMN_NAME) {
770 DBColumnParams::PIXELID_COLUMN_NAME) {
773 thisItem->
setData(itemIndex++, QVariant(text.c_str()));
775 if (thisLevel < (selectorCount-1)) {
776 thisItem->
setData(itemIndex++, QVariant(
"Default"));
779 thisItem->
setData(itemIndex++, QVariant(
"Individual"));
787 switch (selectorCount) {
789 status =
_dataTree->getTrueValue(dataColumnName, valueString);
792 status =
_dataTree->getTrueValueFor1Key(selectionList[0],
797 status =
_dataTree->getTrueValueFor2Keys(selectionList[0],
803 status =
_dataTree->getTrueValueFor3Keys(selectionList[0],
810 std::cout <<
"Error: unexpected number of selectors (" 814 if (dataColumnName ==
"mask") {
827 thisItem->
setData(itemIndex++, QVariant(valueString.c_str()));
828 ++numberOfNonEmptyItems;
830 else if (thisLevel < (selectorCount-1)) {
836 int nextLevel = thisLevel + 1;
837 if (nextLevel >= 0 && nextLevel < selectorCount &&
839 std::vector<std::string> distinctSelectorValues =
_dataTree->
841 for (uint32_t
idx = 0;
idx < distinctSelectorValues.size(); ++
idx) {
842 if (distinctSelectorValues[
idx] ==
846 selectionList[nextLevel] = distinctSelectorValues[
idx];
856 if (numberOfNonEmptyItems == 0) {
860 return numberOfNonEmptyItems;
871 if (parentIndex.column() != 0) {
872 parentIndex = this->
index(parentIndex.row(), 0,
873 this->
parent(parentIndex));
876 beginInsertRows(parentIndex, position, position);
881 QModelIndex childIndex = this->
index(position, 0, parentIndex);
882 if (childIndex.isValid()) {
886 if (selectorLevel >= 0 &&
889 DBColumnParams::FEBID_COLUMN_NAME) {
894 DBColumnParams::PIXELID_COLUMN_NAME) {
899 childItem->
setData(0, selectorColumnText);
902 childItem->
setData(1, QVariant(
"Individual"));
905 childItem->
setData(1, QVariant(
"Default"));
925 QModelIndex parentIndex = this->
parent(baseIndex);
927 return this->
addChildRow(parentIndex, selectorColumnText, baseOffset);
931 addRowAfter(
const QModelIndex &baseIndex, QString selectorColumnText)
934 QModelIndex parentIndex = this->
parent(baseIndex);
936 return this->
addChildRow(parentIndex, selectorColumnText, baseOffset+1);
957 if (! index.isValid()) {
return false;}
959 int column = index.column();
961 if (column < fixedColumnCount) {
return false;}
963 int idx = column - fixedColumnCount;
976 if (! index.isValid()) {
return false;}
978 int column = index.column();
980 if (column < fixedColumnCount) {
return false;}
982 int idx = column - fixedColumnCount;
994 int startingOffset)
const 998 int column = index.column();
1000 if (column >= fixedColumnCount) {
return false;}
1003 if (parentCount < 0) {
return false;}
1004 int selectorIndex = parentCount + startingOffset;
1005 if (selectorIndex < 0 ||
1015 if (!index.isValid()) {
return -1;}
1017 int parentCount = 0;
1019 while (parent.isValid()) {
1021 parent = this->
parent(parent);
bool insertChildren(int position, int count, int columns)
TreeItem * _getItem(const QModelIndex &index) const
bool addChildRow(QModelIndex index, QString selectorColumnText, int position=0)
const uint16_t HIGH_FEB_ID
QList< QString > allowsInsertBefore(const QModelIndex &index) const
bool dataColumnTypeForIndex(const QModelIndex &index, std::string &dataColumnType) const
int32_t _getIDFromDisplayString(const std::string &displayString)
bool columnKeyToGetDefaultValue(const std::string &columnName, std::string &columnValue)
bool addRowBefore(const QModelIndex &index, QString selectorColumnText)
void put(const std::string &key, const std::string &value)
virtual QVariant headerData(int section, Qt::Orientation orientation, int role=Qt::DisplayRole) const
virtual bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
std::string trim_copy(std::string source, std::string const &t=" ")
bool hasSelectors() const
QList< QString > allowsChildInsert(const QModelIndex &index) const
bool dataColumnNameForIndex(const QModelIndex &index, std::string &dataColumnName) const
int _populateSubTree(TreeItem *parent, int level, std::vector< std::string > selectionList)
std::vector< std::string > _keysForDefaultValues
bool setData(int column, const QVariant &value)
const uint16_t HIGH_PIXEL_ID
std::vector< std::string > _dataColumnNames
QList< QString > allowsInsertAfter(const QModelIndex &index) const
std::vector< std::string > _dataColumnTypes
bool isValidHex(const std::string &hexString)
QString _createFEBDisplayString(const QString &febId)
boost::shared_ptr< daqconfig::ConfigDataTree > _dataTree
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
const XML_Char int const XML_Char * value
std::string _createFEBDisplayString(const std::string &febId)
virtual bool saveChanges(const int64_t &subsystemConfigId)
bool _getSelectorColumnName(const QModelIndex &index, std::string &selectorColumnName, int startingOffset=0) const
bool addRowAfter(const QModelIndex &index, QString selectorColumnText)
virtual Qt::ItemFlags flags(const QModelIndex &index) const
virtual bool loadData(boost::shared_ptr< daqconfig::ConfigDataTree > dataTree)
bool removeChildren(int position, int count)
std::string format(const int32_t &value, const int &ndigits=8)
virtual bool removeRows(int position, int rows, const QModelIndex &parent=QModelIndex())
virtual QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const
virtual QModelIndex parent(const QModelIndex &index) const
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
std::string _getIDFromDisplayString2(const std::string &displayString)
virtual bool insertRows(int position, int rows, const QModelIndex &parent=QModelIndex())
std::string _createPixelDisplayString(const std::string &pixelId)
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
TreeItem * child(int number)
QVariant data(int column) const
bool parse(const std::string &hexString, int32_t &decimalValue)
std::vector< std::string > _selectorColumnNames
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role=Qt::EditRole)
void _getModifiedItems(TreeItem *baseItem, std::vector< TreeItem * > &list) const
int _getParentCount(const QModelIndex &index) const
#define NONE_SPECIFIED_STRING
boost::shared_ptr< TreeItem > _rootItem
virtual bool hasChanges() const
bool selectorColumnNameForChild(const QModelIndex &index, std::string &selectorColumnName) const
bool selectorColumnNameForIndex(const QModelIndex &index, std::string &selectorColumnName) const
QString _createPixelDisplayString(const QString &pixelId)