Author: baby-guest
Date: 2007-07-06 16:17:48 +0000 (Fri, 06 Jul 2007)
New Revision: 3255

Modified:
   software/ui/src/filter.cpp
   software/ui/src/filter.h
Log:
Added support for kids rating tags



Modified: software/ui/src/filter.cpp
===================================================================
--- software/ui/src/filter.cpp  2007-07-06 15:28:00 UTC (rev 3254)
+++ software/ui/src/filter.cpp  2007-07-06 16:17:48 UTC (rev 3255)
@@ -18,24 +18,115 @@
 
 #include "filter.h"
 
+#include <string>
+#include <ept/debtags/tag.h>
+
+#define FACET_VIOLENCE "rating:violence"
+#define FACET_SEX "rating:sex"
+#define FACET_LANGUAGE "rating:language"
+#define FACET_DISCRIMINATION "rating:discrimination"
+#define FACET_CONTROL "rating:control"
+
+#define GREEN_MINIMUM 2
+
 int PackageFilter::TagValue(const Tag &tag)
 {
-       //const char *facet_name = tag.facet().name().c_str();
-       //const char *tag_name = tag.name().c_str();
+       // The order is important to minimize calculation costs
+       if (GreenTag(tag)) return PackageFilter::Green;
        if (BlackTag(tag)) return PackageFilter::Black;
+       if (YellowTag(tag)) return PackageFilter::Yellow;
        if (RedTag(tag)) return PackageFilter::Red;
-       if (YellowTag(tag)) return PackageFilter::Yellow;
-       if (GreenTag(tag)) return PackageFilter::Green;
        return PackageFilter::Unknown;
 }
 
+bool PackageFilter::GreenTag(const Tag &tag)
+{
+       const char *name = tag.fullname().c_str();
+       if (strcmp(name, FACET_VIOLENCE "::none") == 0) return true;
+       if (strcmp(name, FACET_SEX "::none") == 0) return true;
+       if (strcmp(name, FACET_LANGUAGE "::benign") == 0) return true;
+       if (strcmp(name, FACET_DISCRIMINATION "::none") == 0) return true;
+       return false;
+}
+
+bool PackageFilter::YellowTag(const Tag &tag)
+{
+       const char *name = tag.fullname().c_str();
+       if (strcmp(name, FACET_VIOLENCE "::brief") == 0) return true;
+       if (strcmp(name, FACET_SEX "::minor") == 0) return true;
+       if (strcmp(name, FACET_SEX "::nudity") == 0) return true;
+       return false;
+}
+
+bool PackageFilter::RedTag(const Tag &tag)
+{
+       const char *facet_name = tag.facet().name().c_str();
+       const char *tag_name = tag.name().c_str();
+       if (strcmp(facet_name, FACET_VIOLENCE) == 0)
+       {
+               if (strcmp(tag_name, "none") == 0) return false;
+               if (strcmp(tag_name, "brief") == 0) return false;
+               if (strcmp(tag_name, "minor") == 0) return false;
+               return true;
+       }
+       else if (strcmp(facet_name, FACET_SEX) == 0)
+       {
+               if (strcmp(tag_name, "none") == 0) return false;
+               if (strcmp(tag_name, "nudity") == 0) return false;
+               return true;
+       }
+       else if (strcmp(facet_name, FACET_LANGUAGE) == 0)
+       {
+               if (strcmp(tag_name, "benign") == 0) return false;
+               return true;
+       }
+       else if (strcmp(facet_name, FACET_DISCRIMINATION) == 0)
+       {
+               if (strcmp(tag_name, "none") == 0) return false;
+               return true;
+       }
+       return false;
+}
+
+bool PackageFilter::BlackTag(const Tag &tag)
+{
+       const char *name = tag.fullname().c_str();
+       if (strcmp(name, FACET_VIOLENCE "::hard") == 0) return true;
+       if (strcmp(name, FACET_SEX "::hard") == 0) return true;
+       if (strcmp(name, FACET_SEX "::violence") == 0) return true;
+       return false;
+}
+
 int PackageFilter::TagsValue(const TagSet &tags)
 {
+       int black = 0, red = 0, yellow = 0, green = 1 - GREEN_MINIMUM, control 
= 0;
        for (TagSet::const_iterator i = tags.begin(); i != tags.end(); ++i)
        {
-               //const char *facet_name = i->facet().name().c_str();
-               //const char *tag_name = i->name().c_str();
+               const char *facet_name = i->facet().name().c_str();
+               if (strcmp(facet_name, FACET_CONTROL) == 0)
+               {
+                       const char *tag_name = i->name().c_str();
+                       if (strcmp(tag_name, "all") == 0) control = 2;
+                       if (strcmp(tag_name, "some") == 0) control = 1;
+               }
+               else switch (TagValue(*i))
+               {
+                       case PackageFilter::Black: black++; break;
+                       case PackageFilter::Red: red++; break;
+                       case PackageFilter::Yellow: yellow++; break;
+                       case PackageFilter::Green: green++; break;
+                       default: break;
+               }
        }
 
+       if (black > 0) return PackageFilter::Black;
+       if (control == 2) return PackageFilter::Green;
+       if (red > 0)
+       {
+               if (control == 1) return PackageFilter::Yellow;
+               return PackageFilter::Red;
+       }
+       if (yellow > 0) return PackageFilter::Yellow;
+       if (green > 0) return PackageFilter::Green;
        return PackageFilter::Unknown;
 }

Modified: software/ui/src/filter.h
===================================================================
--- software/ui/src/filter.h    2007-07-06 15:28:00 UTC (rev 3254)
+++ software/ui/src/filter.h    2007-07-06 16:17:48 UTC (rev 3255)
@@ -36,10 +36,10 @@
        typedef ept::debtags::Tag Tag;
        typedef std::set<Tag> TagSet;
 
-       bool GreenTag(const Tag &tag) { return false; } 
-       bool YellowTag(const Tag &tag) { return false; } 
-       bool RedTag(const Tag &tag) { return false; } 
-       bool BlackTag(const Tag &tag) { return false; } 
+       bool GreenTag(const Tag &tag);
+       bool YellowTag(const Tag &tag);
+       bool RedTag(const Tag &tag);
+       bool BlackTag(const Tag &tag);
        int TagValue(const Tag &tag);
        int TagsValue(const TagSet &tags);
 };


_______________________________________________
Pkg-games-commits mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/pkg-games-commits

Reply via email to