TsgFilter::IdTree *TsgFilter::BuildTree( const std::vector<TreeFragmentToken> &tokens, int &i, std::vector<IdTree *> &leaves) { // The subtree starting at tokens[i] is either: // 1. a single non-variable symbol (like NP or dog), or // 2. a variable symbol (like [NP]), or // 3. a subtree with children (like [NP [DT] [NN dog]]) // First check for case 1. if (tokens[i].type == TreeFragmentToken_WORD) { Vocabulary::IdType id = m_testVocab.Lookup(tokens[i++].value, StringPieceCompatibleHash(), StringPieceCompatibleEquals()); if (id == Vocabulary::NullId()) { return 0; } leaves.push_back(new IdTree(id)); return leaves.back(); } // We must be dealing with either case 2 or 3. Case 2 looks like case 3 but // without the children. assert(tokens[i].type == TreeFragmentToken_LSB); // Skip over the opening [ ++i; // Read the root symbol of the subtree. Vocabulary::IdType id = m_testVocab.Lookup(tokens[i++].value, StringPieceCompatibleHash(), StringPieceCompatibleEquals()); if (id == Vocabulary::NullId()) { return 0; } IdTree *root = new IdTree(id); // Read the children (in case 2 there won't be any). while (tokens[i].type != TreeFragmentToken_RSB) { IdTree *child = BuildTree(tokens, i, leaves); if (!child) { delete root; return 0; } root->children().push_back(child); child->parent() = root; } if (root->IsLeaf()) { leaves.push_back(root); } // Skip over the closing ] and we're done. ++i; return root; }
CSMWorld::AddNestedCommand::AddNestedCommand(IdTree& model, const std::string& id, int nestedRow, int parentColumn, QUndoCommand* parent) : QUndoCommand(parent), NestedTableStoring(model, id, parentColumn), mModel(model), mId(id), mNewRow(nestedRow), mParentColumn(parentColumn) { std::string title = model.headerData(parentColumn, Qt::Horizontal, Qt::DisplayRole).toString().toUtf8().constData(); setText (("Add row in " + title + " sub-table of " + mId).c_str()); }
CSMWorld::DeleteNestedCommand::DeleteNestedCommand (IdTree& model, const std::string& id, int nestedRow, int parentColumn, QUndoCommand* parent) : QUndoCommand(parent), NestedTableStoring(model, id, parentColumn), mModel(model), mId(id), mParentColumn(parentColumn), mNestedRow(nestedRow) { std::string title = model.headerData(parentColumn, Qt::Horizontal, Qt::DisplayRole).toString().toUtf8().constData(); setText (("Delete row in " + title + " sub-table of " + mId).c_str()); QModelIndex parentIndex = mModel.getModelIndex(mId, mParentColumn); mModifyParentCommand = new ModifyCommand(mModel, parentIndex, parentIndex.data(Qt::EditRole), this); }
CSMWorld::NestedTableStoring::NestedTableStoring(const IdTree& model, const std::string& id, int parentColumn) : mOld(model.nestedTable(model.getModelIndex(id, parentColumn))) {}