00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "kitmodel.hpp"
00024 #include <algorithm>
00025 #include <cassert>
00026 #include <glib.h>
00027 #include <iostream>
00028 #include <iterator>
00029
00030
00036 void GuiState::reset() {
00037 m_dirty = false;
00038 m_deleted = false;
00039 m_new = false;
00040 }
00041
00042
00043 ModelCategory::ModelCategory() : Category(), GuiState() {
00044 m_removed_children = new ItemMap;
00045 m_added_children = new ItemMap;
00046 }
00047
00048
00049 ModelCategory::~ModelCategory() {
00050 delete m_removed_children;
00051 delete m_added_children;
00052 }
00053
00054
00061 void ModelCategory::reset() {
00062 GuiState::reset();
00063 m_removed_children->clear();
00064 m_added_children->clear();
00065 }
00066
00067
00068 void ModelCategory::purge() {
00069 ItemIter i = m_items.begin();
00070 while (i != m_items.end()) {
00071 Item* item = *i;
00072 if (((ModelItem*) item)->is_deleted()) {
00073 ItemIter iterTemp = i;
00074 m_items.erase(i);
00075 i = iterTemp++;
00076 } else {
00077 i++;
00078 }
00079 }
00080 }
00081
00082
00088 void ModelCategory::add_item(Item* item) {
00089 Category::add_item(item);
00090
00091
00092
00093 ItemMap::size_type n = m_removed_children->erase(item->get_id());
00094 if (n == 0) {
00095
00096 m_added_children->insert(std::make_pair(item->get_id(), (ModelItem*) item));
00097 }
00098 }
00099
00100
00106 void ModelCategory::remove_item(Item* item) {
00107 Category::remove_item(item);
00108
00109
00110 ItemMap::size_type n = m_added_children->erase(item->get_id());
00111 if (n == 0) {
00112 m_removed_children->insert(std::make_pair(item->get_id(), (ModelItem*) item));
00113 }
00114 }
00115
00116
00122 void ModelCategory::remove_items(ModelItemContainer* items) {
00123 for (ModelItemIter i = items->begin(); i != items->end(); ++i) {
00124 remove_item(*i);
00125 }
00126 }
00127
00128
00134 ModelItemContainer* ModelCategory::get_model_items() {
00135 ModelItemContainer* retval = new ModelItemContainer;
00136 for (ItemIter i = m_items.begin(); i != m_items.end(); ++i) {
00137 ModelItem* mi = (ModelItem*)*i;
00138 if (!mi->is_deleted())
00139 retval->push_back(mi);
00140 }
00141 return retval;
00142 }
00143
00144
00151 ItemContainer* ModelCategory::get_items() {
00152 ItemContainer* retval = new ItemContainer;
00153 for (ItemIter i = m_items.begin(); i != m_items.end(); ++i) {
00154 ModelItem* mi = (ModelItem*)*i;
00155 if (!mi->is_deleted()) {
00156 retval->push_back(mi);
00157 }
00158 }
00159 return retval;
00160 }
00161
00162
00166 KitModel::KitModel() : m_dirty(false), m_item_filter(ALL) {
00167 m_item_map = new ItemMap;
00168 m_category_map = new CategoryMap;
00169 }
00170
00171
00177 KitModel::~KitModel() {
00178 for (ItemMapIter i = m_item_map->begin(); i != m_item_map->end(); ++i) {
00179 delete (*i).second;
00180 (*i).second = 0;
00181 }
00182 m_item_map->clear();
00183 for (CategoryMapIter i = m_category_map->begin(); i != m_category_map->end(); ++i) {
00184 delete (*i).second;
00185 (*i).second = 0;
00186 }
00187 m_category_map->clear();
00188 delete m_item_map;
00189 delete m_category_map;
00190 }
00191
00192
00197 void KitModel::foreach_item_iter(const SlotForeachModelItemIter& slot) {
00198 for (ItemMapIter i = m_item_map->begin(); i != m_item_map->end(); ++i) {
00199 if (slot(i))
00200 break;
00201 }
00202 }
00203
00204
00209 void KitModel::foreach_item(const SlotForeachModelItem& slot) {
00210 for (ItemMapIter i = m_item_map->begin(); i != m_item_map->end(); ++i) {
00211 if (slot(*(*i).second))
00212 break;
00213 }
00214 }
00215
00216
00221 void KitModel::foreach_category_iter(const SlotForeachCategoryIter& slot) {
00222 for (CategoryMapIter i = m_category_map->begin(); i != m_category_map->end(); ++i) {
00223 if (slot(i))
00224 break;
00225 }
00226 }
00227
00228
00233 void KitModel::foreach_category(const SlotForeachCategory& slot) {
00234 for (CategoryMapIter i = m_category_map->begin(); i != m_category_map->end(); ++i) {
00235 if (slot(*(*i).second))
00236 break;
00237 }
00238 }
00239
00240
00244 ModelCategory* KitModel::find_category(long id) {
00245 ModelCategory* retval = NULL;
00246 CategoryMapIter i = m_category_map->find(id);
00247 if (i != m_category_map->end()) {
00248 retval = (*i).second;
00249 }
00250 return retval;
00251 }
00252
00253
00257 ModelItem* KitModel::find_item(long id) {
00258 ModelItem* retval = NULL;
00259 ItemMapIter i = m_item_map->find(id);
00260 if (i != m_item_map->end()) {
00261 retval = (*i).second;
00262 }
00263 return retval;
00264 }
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00279 CategoryContainer* KitModel::get_categories() {
00280 CategoryContainer* retval = new CategoryContainer;
00281 for (CategoryMapIter i = m_category_map->begin(); i != m_category_map->end(); ++i) {
00282 ModelCategory* cat = (*i).second;
00283 if (!cat->is_deleted()) {
00284 retval->push_back(cat);
00285 }
00286 }
00287 return retval;
00288 }
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00306 ItemContainer* KitModel::get_all_items() {
00307 ItemContainer* retval = new ItemContainer;
00308 for (ItemMapIter i = m_item_map->begin(); i != m_item_map->end(); ++i) {
00309 if (!((*i).second)->is_deleted()) {
00310 retval->push_back((*i).second);
00311 }
00312 }
00313 return retval;
00314 }
00315
00316
00322 void KitModel::add_category(ModelCategory* category) {
00323 m_category_map->insert(std::make_pair(category->get_id(), category));
00324 }
00325
00326
00332 void KitModel::add_item(ModelItem* item) {
00333 m_item_map->insert(std::make_pair(item->get_id(), item));
00334 }
00335
00336
00343 void KitModel::add_item(ModelItem* item, long cat_id) {
00344 std::pair<long, ModelItem*> pair = std::make_pair(item->get_id(), item);
00345 m_item_map->insert(pair);
00346 ModelCategory* c = find_category(cat_id);
00347 if (c) {
00348 c->add_item(item);
00349 } else
00350 g_warning("category id %d was not found - unable to associate item", cat_id);
00351 }
00352
00353
00360 void KitModel::copy_items(const ModelItemContainer& items, long cat_id) {
00361 assert(cat_id != -1);
00362 ModelCategory* c = find_category(cat_id);
00363 if (c) {
00364 c->set_dirty(true);
00365
00366
00367 ModelItemContainer sourceItems(items);
00368
00369
00370 ModelItemContainer targetItems;
00371 for (ItemIter i = c->m_items.begin(); i != c->m_items.end(); ++i) {
00372 targetItems.push_back((ModelItem*) (*i));
00373 }
00374
00375
00376 sort(sourceItems.begin(), sourceItems.end());
00377
00378 ModelItemContainer newItems;
00379 sort(targetItems.begin(), targetItems.end());
00380 std::set_difference(
00381 sourceItems.begin(),
00382 sourceItems.end(),
00383 targetItems.begin(),
00384 targetItems.end(),
00385 std::back_insert_iterator<ModelItemContainer>(newItems)
00386 );
00387
00388
00389
00390
00391 for (ModelItemIter i = newItems.begin(); i != newItems.end(); ++i) {
00392 c->add_item(*i);
00393 }
00394 } else {
00395 g_error("Warning: category id %d was not found - unable to copy items",
00396 cat_id);
00397 }
00398 }
00399
00400
00407 bool KitModel::filter(bool checked) {
00408 switch (m_item_filter) {
00409 case ALL : return true;
00410 case CHECKED : return checked;
00411 case UNCHECKED : return !checked;
00412 }
00413 return true;
00414 }
00415
00416
00427 void KitModel::reset() {
00428 for (CategoryMapIter i = m_category_map->begin(); i != m_category_map->end(); ++i) {
00429 ModelCategory* cat = (*i).second;
00430 if (!cat->is_deleted())
00431 cat->reset();
00432 }
00433 for (ItemMapIter i = m_item_map->begin(); i != m_item_map->end(); ++i) {
00434 ModelItem* item = (*i).second;
00435 if (!item->is_deleted())
00436 item->reset();
00437 }
00438 m_dirty = false;
00439 }
00440
00447 void KitModel::purge() {
00448 CategoryMapIter c = m_category_map->begin();
00449 while (c != m_category_map->end()) {
00450 ModelCategory* cat = (*c).second;
00451 if (cat->is_deleted()) {
00452 CategoryMapIter iterTemp = c;
00453 iterTemp++;
00454 m_category_map->erase(c);
00455 c = iterTemp;
00456 delete cat;
00457 } else {
00458 cat->purge();
00459 c++;
00460 }
00461 }
00462 ItemMapIter i = m_item_map->begin();
00463 while (i != m_item_map->end()) {
00464 ModelItem* item = (*i).second;
00465 if (item->is_deleted()) {
00466 ItemMapIter iterTemp = i;
00467 iterTemp++;
00468 m_item_map->erase(i);
00469 i = iterTemp;
00470 delete item;
00471 } else {
00472 i++;
00473 }
00474 }
00475 }