added buffering to minimise GtkTextBuffer insert calls
[xonotic/netradiant.git] / plugins / entity / filters.h
1 /*
2 Copyright (C) 2001-2006, William Joseph.
3 All Rights Reserved.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #if !defined(INCLUDED_FILTERS_H)
23 #define INCLUDED_FILTERS_H
24
25 #include "ifilter.h"
26
27 #include "generic/callback.h"
28 #include "scenelib.h"
29
30 class Entity;
31
32 class EntityFilter
33 {
34 public:
35   virtual bool filter(const Entity& entity) const = 0;
36 };
37
38 bool entity_filtered(Entity& entity);
39 void add_entity_filter(EntityFilter& filter, int mask, bool invert = false);
40
41 class ClassnameFilter : public Filterable
42 {
43   scene::Node& m_node;
44 public:
45   Entity& m_entity;
46
47   ClassnameFilter(Entity& entity, scene::Node& node) : m_node(node), m_entity(entity)
48   {
49   }
50   ~ClassnameFilter()
51   {
52   }
53
54   void instanceAttach()
55   {
56     GlobalFilterSystem().registerFilterable(*this);
57   }
58   void instanceDetach()
59   {
60     GlobalFilterSystem().unregisterFilterable(*this);
61   }
62
63   void updateFiltered()
64   {
65     if(entity_filtered(m_entity))
66     {
67       m_node.enable(scene::Node::eFiltered);
68     }
69     else
70     {
71       m_node.disable(scene::Node::eFiltered);
72     }
73   }
74
75   void classnameChanged(const char* value)
76   {
77     updateFiltered();
78   }
79   typedef MemberCaller1<ClassnameFilter, const char*, &ClassnameFilter::classnameChanged> ClassnameChangedCaller;
80 };
81
82 #endif