treeitem.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include "treeitem.h"
  2. #include <QDebug>
  3. #define tr(x) x
  4. TreeItem::TreeItem(const QVector<QVariant> &data, TreeItem *parent)
  5. : itemData(data),
  6. parentItem(parent),itemType(UnKnown),mSettings(nullptr)
  7. {}
  8. TreeItem::~TreeItem()
  9. {
  10. qDeleteAll(childItems);
  11. }
  12. TreeItem *TreeItem::child(int number)
  13. {
  14. if (number < 0 || number >= childItems.size())
  15. return nullptr;
  16. return childItems.at(number);
  17. }
  18. int TreeItem::childCount() const
  19. {
  20. return childItems.count();
  21. }
  22. int TreeItem::childNumber() const
  23. {
  24. if (parentItem)
  25. return parentItem->childItems.indexOf(const_cast<TreeItem*>(this));
  26. return 0;
  27. }
  28. int TreeItem::columnCount() const
  29. {
  30. return itemData.count();
  31. }
  32. QVariant TreeItem::data(int column) const
  33. {
  34. if (column < 0 || column >= itemData.size())
  35. return QVariant();
  36. return itemData.at(column);
  37. }
  38. bool TreeItem::insertChildren(int position, int count, int columns, TreeItemType type)
  39. {
  40. Q_UNUSED(type);
  41. qDebug() << "Enter TreeItem::insertChildren " << position << " " << count << " " << columns << endl;
  42. if (position < 0 || position > childItems.size())
  43. return false;
  44. for (int row = 0; row < count; ++row) {
  45. QVector<QVariant> data(columns);
  46. TreeItem *item = new TreeItem(data, this);
  47. if(this->itemType == TreeItemType::Root)
  48. item->setItemType(TreeItemType::Section);
  49. else if(this->itemType == TreeItemType::Section)
  50. item->setItemType(TreeItemType::Key);
  51. childItems.insert(position, item);
  52. }
  53. return true;
  54. }
  55. bool TreeItem::insertColumns(int position, int columns)
  56. {
  57. qDebug() << "Enter TreeItem::insertColumns " << position << " " << columns << endl;
  58. if (position < 0 || position > itemData.size())
  59. return false;
  60. for (int column = 0; column < columns; ++column)
  61. itemData.insert(position, QVariant());
  62. for (TreeItem *child : qAsConst(childItems))
  63. child->insertColumns(position, columns);
  64. return true;
  65. }
  66. QSettings* TreeItem::getSettings()
  67. {
  68. if(parentItem)
  69. return parentItem->getSettings();
  70. return mSettings;
  71. }
  72. TreeItem *TreeItem::parent()
  73. {
  74. return parentItem;
  75. }
  76. bool TreeItem::removeChildren(int position, int count)
  77. {
  78. qDebug() << "Enter TreeItem::removeChildren " << data(0) << " " << position << " " << count << endl;
  79. if (position < 0 || position + count > childItems.size())
  80. return false;
  81. for (int row = 0; row < count; ++row)
  82. {
  83. TreeItem* item = childItems.takeAt(position);
  84. if(item != nullptr) {
  85. qDebug() << "data: " << row << " " << item->data(DEFAULT_KEY_COLUMN) << " " << item->data(DEFAULT_VALUE_COLUMN) << endl;
  86. QSettings* settings = getSettings();
  87. if(settings) {
  88. if(item->getItemType() == Key)
  89. {
  90. settings->beginGroup(data(DEFAULT_KEY_COLUMN).toString());
  91. settings->remove(item->data(DEFAULT_KEY_COLUMN).toString());
  92. settings->endGroup();
  93. } else if(item->getItemType() == Section)
  94. {
  95. settings->beginGroup(item->data(DEFAULT_SECTION_COLUMN).toString());
  96. settings->remove("");
  97. settings->endGroup();
  98. }
  99. }
  100. }
  101. delete item;
  102. }
  103. return true;
  104. }
  105. bool TreeItem::removeColumns(int position, int columns)
  106. {
  107. qDebug() << "Enter TreeItem::removeColumns " << position << " " << columns << endl;
  108. if (position < 0 || position + columns > itemData.size())
  109. return false;
  110. for (int column = 0; column < columns; ++column)
  111. itemData.remove(position);
  112. for (TreeItem *child : qAsConst(childItems))
  113. child->removeColumns(position, columns);
  114. return true;
  115. }
  116. static QVariant getValidVariant(const QVariant& value)
  117. {
  118. QVariant result = value;
  119. if(value == QVariant(DEFAULT_KEY_VALUE)
  120. || value == QVariant(DEFAULT_SECTION_VALUE)
  121. || value == QVariant(DEFAULT_UNKNOWN_VALUE)
  122. || value == QVariant("\t")) {
  123. result = QVariant();
  124. }
  125. return result;
  126. }
  127. static bool isValidVariant(const QVariant& value)
  128. {
  129. return (!value.isNull() && value.isValid());
  130. }
  131. bool TreeItem::setData(int column, const QVariant &value)
  132. {
  133. qDebug() << "Enter TreeItem::setData " << column << " " << value << endl;
  134. if (column < 0 || column >= itemData.size())
  135. return false;
  136. const QVariant oldValue = getValidVariant(itemData[column]);
  137. itemData[column] = value;
  138. const QVariant newValue = getValidVariant(itemData[column]);
  139. QVariant brotherValue = getValidVariant(itemData[column == DEFAULT_KEY_COLUMN ? DEFAULT_VALUE_COLUMN : DEFAULT_KEY_COLUMN]);
  140. QSettings* settings = getSettings();
  141. if(oldValue != value && settings != nullptr)
  142. {
  143. if(itemType == Key)
  144. {
  145. QString sectionName = parentItem->data(DEFAULT_SECTION_COLUMN).toString();
  146. settings->beginGroup(sectionName);
  147. qDebug() << "set key : " << sectionName << " " << oldValue.toString() << " " << newValue.toString() << " " << brotherValue.toString() << endl;
  148. if(column == DEFAULT_KEY_COLUMN) { //change the key
  149. if(isValidVariant(newValue)) {
  150. settings->setValue(newValue.toString(), brotherValue);
  151. if(isValidVariant(oldValue)) settings->remove(oldValue.toString());
  152. }
  153. } else if(column == DEFAULT_VALUE_COLUMN) {//change the value
  154. if(isValidVariant(brotherValue)) {
  155. settings->setValue(brotherValue.toString(), newValue);
  156. }
  157. }
  158. settings->endGroup();
  159. }
  160. else if(itemType == Section && column == DEFAULT_SECTION_COLUMN)
  161. {
  162. qDebug() << "set Section : " << oldValue.toString() << " " << newValue.toString() << endl;
  163. if(childCount() > 0) {
  164. settings->beginGroup(newValue.toString());
  165. for (TreeItem *child : qAsConst(childItems))
  166. settings->setValue(child->data(DEFAULT_KEY_COLUMN).toString()
  167. , child->data(DEFAULT_VALUE_COLUMN));
  168. settings->endGroup();
  169. }
  170. if(isValidVariant(oldValue)) {
  171. settings->beginGroup(oldValue.toString());
  172. settings->remove("");
  173. settings->endGroup();
  174. }
  175. }
  176. }
  177. return true;
  178. }