Ejemplo n.º 1
0
void SharedUiItemsTreeModel::changeItem(
    SharedUiItem newItem, SharedUiItem oldItem, QString idQualifier) {
  if (!itemQualifierFilter().isEmpty()
      && !itemQualifierFilter().contains(idQualifier))
    return;
  //qDebug() << "SharedUiItemsTreeModel::changeItem" << newItem.id()
  //         << oldItem.id() << idQualifier;
  if (newItem.isNull()) {
    if (!oldItem.isNull()) { // delete
      QModelIndex oldIndex = indexOf(oldItem);
      //qDebug() << "delete" << newItem << oldItem << oldIndex.isValid();
      if (oldIndex.isValid()) {
        removeRows(treeItemByIndex(oldIndex)->row(), 1, oldIndex.parent());
      }
    } else {
      // ignore changeItem(null,null)
    }
  } else {
    if (oldItem.isNull()) {
      // if an item with same id exists, change create into update
      TreeItem *treeItem = _itemsIndex.value(newItem.qualifiedId());
      if (treeItem)
        oldItem = treeItem->item();
    } else {
      // if no item with oldItem id exists, change update into create
      TreeItem *treeItem = _itemsIndex.value(oldItem.qualifiedId());
      if (!treeItem)
        oldItem = SharedUiItem();
    }
    if (oldItem.isNull()) { // create
      //qDebug() << "create" << newItem << oldItem; // << _itemsIndex.keys();
      QModelIndex parent;
      int row = -1; // -1 will be replaced by size() in adjustTreeItemAndRow()
      determineItemPlaceInTree(newItem, &parent, &row);
      TreeItem *parentTreeItem = treeItemByIndex(parent);
      adjustTreeItemAndRow(&parentTreeItem, &row);
      beginInsertRows(parent, row, row);
      new TreeItem(this, newItem, parentTreeItem, row);
      endInsertRows();
    } else { // update (incl. rename)
      //qDebug() << "update" << newItem << oldItem;
      QModelIndex oldIndex = indexOf(oldItem);
      TreeItem *treeItem = treeItemByIndex(oldIndex);
      QModelIndex oldParent = oldIndex.parent(), newParent = oldParent;
      QString newId = newItem.qualifiedId(), oldId = oldItem.qualifiedId();
      int newRow = -1; // -1 will be replaced by size() in adjustTreeItemAndRow()
      determineItemPlaceInTree(newItem, &newParent, &newRow);
      TreeItem *newParentTreeItem = treeItemByIndex(newParent);
      adjustTreeItemAndRow(&newParentTreeItem, &newRow);
      treeItem->item() = newItem;
      updateIndexIfIdChanged(newId, oldId, treeItem);
      emit dataChanged(oldIndex, oldIndex);
      // LATER make it possible for determineItemPlaceInTree to change row without changing parent
      if (newParent != oldParent) { // need to move item in the tree
        if (newParentTreeItem->isDescendantOf(treeItem)) {
          qDebug() << "SharedUiItemsTreeModel::changeItem denies item moving "
                      "because new parent would be a descendant of moved "
                      "child.";
        } else {
          //qDebug() << "reparenting:" << treeItem->item().id()
          //         <<"parent:" << oldParent << treeItem
          //        << treeItem->row() << "->" << newParent
          //        << newParentTreeItem << newRow << "/"
          //        << newParentTreeItem->childrenCount();
          //qDebug() << "  root:" << _root << _root->item().id();
          Q_ASSERT_X(beginMoveRows(
                       oldParent, treeItem->row(), treeItem->row(),
                       newParent, newRow),
                     "SharedUiItemsTreeModel::changeItem",
                     "inconsistent reparenting according to beginMoveRows");
          newParentTreeItem->adoptChild(treeItem, newRow);
          updateIndexIfIdChanged(newId, oldId, treeItem); // LATER not sure needed
          endMoveRows();
        }
      }
    }
  }
  emit itemChanged(newItem, oldItem);
}