-#include <algorithm>
+#include <msp/core/algorithm.h>
#include <msp/core/maputils.h>
#include <msp/io/print.h>
#include "category.h"
void Filter::write(IO::Base &out) const
{
- for(list<const Category *>::const_iterator i=categories.begin(); i!=categories.end(); ++i)
+ for(list<Block>::const_iterator i=blocks.begin(); i!=blocks.end(); ++i)
{
list<FilterStatement> st;
- //IO::print(out, "# %s\n", i->first);
- (*i)->create_statements(st);
+ st.push_back(FilterStatement());
+ st.back().set_show(i->show);
+ i->appearance.add_lines(st.back());
+ i->category->create_statements(st);
+
+ IO::print(out, "# %s\n", i->category->get_name());
for(list<FilterStatement>::const_iterator j=st.begin(); j!=st.end(); ++j)
j->write(out);
}
-
- out.write("# unmatched\nHide\n");
}
return c1->get_order()<c2->get_order();
}
-void Filter::Loader::hide(const string &name)
+void Filter::Loader::add_categories(const string &name, bool show)
{
- list<const Category *> categs;
+ vector<const Category *> categs;
if(name.find('*')!=string::npos)
{
poe.find_categories(glob_to_re(name), categs);
if(categs.empty())
throw key_error(name);
+
+ sort(categs, &category_order);
}
else
categs.push_back(&poe.get_category(name));
- for(list<const Category *>::const_iterator i=categs.begin(); i!=categs.end(); ++i)
+ for(vector<const Category *>::const_iterator i=categs.begin(); i!=categs.end(); ++i)
{
- list<const Category *>::iterator j = find(obj.categories.begin(), obj.categories.end(), *i);
- if(j!=obj.categories.end())
- obj.categories.erase(j);
+ bool found = false;
+ for(list<Block>::const_iterator j=obj.blocks.begin(); (!found && j!=obj.blocks.end()); ++j)
+ found = (j->category==*i);
+
+ if(!found)
+ {
+ Block blk;
+ blk.show = show;
+ blk.category = *i;
+ blk.appearance = (*i)->get_appearance();
+ if(const Appearance *app = poe.get_theme().find_appearance((*i)->get_name()))
+ blk.appearance.merge_from(*app);
+ obj.blocks.push_back(blk);
+ }
}
}
-void Filter::Loader::include(const string &name)
-{
- const Filter &base = poe.get_filter(name);
- obj.categories.insert(obj.categories.end(), base.categories.begin(), base.categories.end());
-}
-
-void Filter::Loader::show(const string &name)
+void Filter::Loader::cancel(const string &name)
{
- list<const Category *> categs;
+ vector<const Category *> categs;
if(name.find('*')!=string::npos)
{
poe.find_categories(glob_to_re(name), categs);
if(categs.empty())
throw key_error(name);
-
- categs.sort(&category_order);
}
else
categs.push_back(&poe.get_category(name));
- for(list<const Category *>::const_iterator i=categs.begin(); i!=categs.end(); ++i)
- if(find(obj.categories.begin(), obj.categories.end(), *i)==obj.categories.end())
- obj.categories.push_back(*i);
+ for(vector<const Category *>::const_iterator i=categs.begin(); i!=categs.end(); ++i)
+ for(list<Block>::iterator j=obj.blocks.begin(); j!=obj.blocks.end(); ++j)
+ if(j->category==*i)
+ {
+ obj.blocks.erase(j);
+ break;
+ }
+}
+
+void Filter::Loader::hide(const string &name)
+{
+ add_categories(name, false);
+}
+
+void Filter::Loader::include(const string &name)
+{
+ const Filter &base = poe.get_filter(name);
+ obj.blocks.insert(obj.blocks.end(), base.blocks.begin(), base.blocks.end());
+}
+
+void Filter::Loader::show(const string &name)
+{
+ add_categories(name, true);
}