MCPcopy Create free account
hub / github.com/CE-Programming/CEmu / refresh

Method refresh

gui/qt/vartablemodel.cpp:105–166  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

103}
104
105void VarTableModel::refresh() {
106 calc_var_t var;
107
108 std::vector<calc_var_t> newVars;
109
110 vat_search_init(&var);
111 while (vat_search_next(&var)) {
112 if (var.named || var.size > 2) {
113 newVars.push_back(var);
114 }
115 }
116
117 std::sort(newVars.begin(), newVars.end(), varLess);
118
119 auto oldIter = vars.begin();
120 auto newIter = newVars.begin();
121 while (newIter != newVars.end()) {
122 size_t row = oldIter - vars.begin();
123 // Remove old vars smaller than the next new var
124 auto oldRemoveEnd = std::find_if_not(oldIter, vars.end(), [=](const VarData &var) { return varLess(var.info, *newIter); });
125 if (oldIter != oldRemoveEnd) {
126 beginRemoveRows(QModelIndex(), row, row + (oldRemoveEnd - oldIter - 1));
127 oldIter = vars.erase(oldIter, oldRemoveEnd);
128 endRemoveRows();
129 }
130 // Insert new vars smaller than the next old var, or insert all if no more old vars
131 auto newInsertEnd = newVars.end();
132 if (oldIter != vars.end()) {
133 newInsertEnd = std::find_if_not(newIter, newVars.end(), [=](const calc_var_t &var) { return varLess(var, oldIter->info); });
134 }
135 if (newIter != newInsertEnd) {
136 int lastRow = row + (newInsertEnd - newIter - 1);
137 beginInsertRows(QModelIndex(), row, lastRow);
138 oldIter = vars.insert(oldIter, newIter, newInsertEnd);
139 endInsertRows();
140 // Handle header resize because it doesn't care about inserted rows
141 emit dataChanged(index(row, 0), index(lastRow, VAR_NUM_COLS - 1), { Qt::SizeHintRole });
142 oldIter += (newInsertEnd - newIter);
143 newIter = newInsertEnd;
144 } else {
145 // No new vars were smaller, and the old var cannot be smaller because those were already removed, so they're equal
146 assert(oldIter != vars.end());
147 // Update the old variable with the new variable data
148 uint8_t changed = oldIter->updateInfo(*newIter);
149 // Inform the view of changed columns
150 for (uint8_t col = 0; col < VAR_NUM_COLS; col++) {
151 if (changed & (1 << col)) {
152 QModelIndex cell = index(row, col);
153 emit dataChanged(cell, cell);
154 }
155 }
156 oldIter++;
157 newIter++;
158 }
159 }
160 // Remove any remaining old vars
161 if (oldIter != vars.end()) {
162 beginRemoveRows(QModelIndex(), oldIter - vars.begin(), vars.size() - 1);

Callers

nothing calls this directly

Calls 4

vat_search_initFunction · 0.85
vat_search_nextFunction · 0.85
varLessFunction · 0.85
updateInfoMethod · 0.80

Tested by

no test coverage detected