Author: baby-guest
Date: 2008-02-19 09:52:32 +0000 (Tue, 19 Feb 2008)
New Revision: 5844

Added:
   software/ui/src/filter_test.cpp
Modified:
   software/ui/src/filter.cpp
   software/ui/src/filter.h
   software/ui/src/goplay.cpp
   software/ui/src/pkgbrowser.cpp
   software/ui/src/pkgbrowser.h
   software/ui/src/taghandler.cpp
   software/ui/src/taghandler.h
Log:
Reestructured filtering system to make it configurable in the future, and also 
to make it quicker



Modified: software/ui/src/filter.cpp
===================================================================
--- software/ui/src/filter.cpp  2008-02-19 09:25:15 UTC (rev 5843)
+++ software/ui/src/filter.cpp  2008-02-19 09:52:32 UTC (rev 5844)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007  Miriam Ruiz <[EMAIL PROTECTED]>
+ * Copyright (C) 2007, 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -31,102 +31,171 @@
 
 PackageFilter::PackageFilter()
 {
-       tagdata.SetTag(&green_tags,  "rating:violence::none");
-       tagdata.SetTag(&green_tags,  "rating:violence::minor:optional");
-       tagdata.SetTag(&yellow_tags, "rating:violence::minor");
-       tagdata.SetTag(&yellow_tags, "rating:violence::brief");
-       tagdata.SetTag(&red_tags,    "rating:violence::non-realistic:optional");
-       tagdata.SetTag(&red_tags,    "rating:violence::non-realistic");
-       tagdata.SetTag(&red_tags,    "rating:violence::realistic:optional");
-       tagdata.SetTag(&red_tags,    "rating:violence::realistic");
+       list = NULL;
+       ResultList *element = NULL;
 
-       tagdata.SetTag(&green_tags,  "rating:sex::none");
-       tagdata.SetTag(&green_tags,  "rating:sex::nudity:optional");
-       tagdata.SetTag(&yellow_tags, "rating:sex::nudity");
-       tagdata.SetTag(&yellow_tags, "rating:sex::non-realistic:optional");
-       tagdata.SetTag(&red_tags,    "rating:sex::non-realistic");
-       tagdata.SetTag(&red_tags,    "rating:sex::realistic:optional");
-       tagdata.SetTag(&red_tags,    "rating:sex::realistic");
-       tagdata.SetTag(&red_tags,    "rating:sex::hard:optional");
-       tagdata.SetTag(&red_tags,    "rating:sex::hard");
-       tagdata.SetTag(&red_tags,    "rating:sex::violence:optional");
-       tagdata.SetTag(&black_tags,  "rating:sex::violence");
+       // BLACK
 
-       //tagdata.SetTag(&green_tags,  "rating:language::benign");
+       element = new ResultList("black 1", PackageFilter::Black);
+       tagdata.SetTag(element, "rating:sex::violence");
+       AddLast(element);
 
-       //tagdata.SetTag(&green_tags,  "rating:discrimination::none");
+       // RED
 
-       tagdata.SetTag(&yellow_tags, "rating:theme::death");
-       tagdata.SetTag(&yellow_tags, "rating:theme::horror");
-       tagdata.SetTag(&red_tags,    "rating:theme::cruelty");
+       element = new ResultList("red 1", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:violence::non-realistic:optional");
+       AddLast(element);
 
-       //std::cerr << "Green Tags: "; tagdata.Print(&green_tags);
-       //std::cerr << "Yellow Tags: "; tagdata.Print(&yellow_tags);
-       //std::cerr << "Red Tags: "; tagdata.Print(&red_tags);
-       //std::cerr << "Black Tags: "; tagdata.Print(&black_tags);
+       element = new ResultList("red 2", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:violence::non-realistic");
+       AddLast(element);
+
+       element = new ResultList("red 3", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:violence::realistic:optional");
+       AddLast(element);
+
+       element = new ResultList("red 4", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:violence::realistic");
+       AddLast(element);
+
+       element = new ResultList("red 5", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:sex::non-realistic");
+       AddLast(element);
+
+       element = new ResultList("red 6", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:sex::realistic:optional");
+       AddLast(element);
+
+       element = new ResultList("red 7", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:sex::realistic");
+       AddLast(element);
+
+       element = new ResultList("red 8", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:sex::hard:optional");
+       AddLast(element);
+
+       element = new ResultList("red 9", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:sex::hard");
+       AddLast(element);
+
+       element = new ResultList("red A", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:sex::violence:optional");
+       AddLast(element);
+
+       element = new ResultList("red B", PackageFilter::Red);
+       tagdata.SetTag(element, "rating:theme::cruelty");
+       AddLast(element);
+
+       // YELLOW
+
+       element = new ResultList("yellow 1", PackageFilter::Yellow);
+       tagdata.SetTag(element, "rating:violence::minor");
+       AddLast(element);
+
+       element = new ResultList("yellow 2", PackageFilter::Yellow);
+       tagdata.SetTag(element, "rating:violence::brief");
+       AddLast(element);
+
+       element = new ResultList("yellow 3", PackageFilter::Yellow);
+       tagdata.SetTag(element, "rating:sex::nudity");
+       AddLast(element);
+
+       element = new ResultList("yellow 4", PackageFilter::Yellow);
+       tagdata.SetTag(element, "rating:sex::non-realistic:optional");
+       AddLast(element);
+
+       element = new ResultList("yellow 5", PackageFilter::Yellow);
+       tagdata.SetTag(element, "rating:theme::death");
+       AddLast(element);
+
+       element = new ResultList("yellow 6", PackageFilter::Yellow);
+       tagdata.SetTag(element, "rating:theme::horror");
+       AddLast(element);
+
+       // GREEN
+
+       element = new ResultList("green 1", PackageFilter::Green);
+       tagdata.SetTag(element,  "rating:violence::none");
+       tagdata.SetTag(element,  "rating:sex::none");
+       tagdata.SetTag(element,  "rating:language::benign");
+       tagdata.SetTag(element,  "rating:discrimination::none");
+       AddLast(element);
+
+       element = new ResultList("green 2", PackageFilter::Green);
+       tagdata.SetTag(element,  "rating:violence::minor:optional");
+       tagdata.SetTag(element,  "rating:sex::none");
+       tagdata.SetTag(element,  "rating:language::benign");
+       tagdata.SetTag(element,  "rating:discrimination::none");
+       AddLast(element);
+
+       element = new ResultList("green 3", PackageFilter::Green);
+       tagdata.SetTag(element,  "rating:violence::none");
+       tagdata.SetTag(element,  "rating:sex::nudity:optional");
+       tagdata.SetTag(element,  "rating:language::benign");
+       tagdata.SetTag(element,  "rating:discrimination::none");
+       AddLast(element);
+
+       element = new ResultList("green 4", PackageFilter::Green);
+       tagdata.SetTag(element,  "rating:violence::minor:optional");
+       tagdata.SetTag(element,  "rating:sex::nudity:optional");
+       tagdata.SetTag(element,  "rating:language::benign");
+       tagdata.SetTag(element,  "rating:discrimination::none");
+       AddLast(element);
 }
 
 PackageFilter::~PackageFilter()
 {
+       DeleteList();
 }
 
+/* Find out the color of a single tag */
 int PackageFilter::TagValue(const Tag &tag)
 {
-       //std::string name = tag.fullname();
+       std::string name = tag.fullname();
        //std::string facet_name = tag.facet().name();
        //std::string tag_name = tag.name();
 
-       // 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;
+       // The order is important
+       PackageFilter::ResultList *item = list;
+       while (item != NULL) {
+               if (tagdata.CheckTag(item, name))
+                       return item->type;
+               item = item->next;
+       }
+
        return PackageFilter::Unknown;
 }
 
-bool PackageFilter::GreenTag(const Tag &tag)
+/* Find out the color of a set of tags */
+int PackageFilter::TagsValue(const TagSet &tags)
 {
-       std::string name = tag.fullname();
-       return tagdata.CheckTag(&green_tags, name);
-}
+       FilterTagHandler::Result t;
+//     unsigned int i = 0;
 
-bool PackageFilter::YellowTag(const Tag &tag)
-{
-       std::string name = tag.fullname();
-       return tagdata.CheckTag(&yellow_tags, name);
-}
+//     tagdata.PrintAll();
 
-bool PackageFilter::RedTag(const Tag &tag)
-{
-       std::string name = tag.fullname();
-       return tagdata.CheckTag(&red_tags, name);
-}
+       for (TagSet::const_iterator i = tags.begin(); i != tags.end(); ++i) {
+               std::string name = i->fullname();
+               //std::string facet_name = i->facet().name();
+               //std::string tag_name = i->name();
+//             std::cerr << "Add Tag: " << name << std::endl;
+               tagdata.SetTagIfExists(&t, name);
+       }
 
-bool PackageFilter::BlackTag(const Tag &tag)
-{
-       std::string name = tag.fullname();
-       return tagdata.CheckTag(&black_tags, name);
-}
-
-int PackageFilter::TagsValue(const TagSet &tags)
-{
-       int black = 0, red = 0, yellow = 0, green = 1 - GREEN_MINIMUM;
-       for (TagSet::const_iterator i = tags.begin(); i != tags.end(); ++i)
-       {
-               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;
-               }
+       // The order is important
+       PackageFilter::ResultList *item = list;
+       while (item != NULL) {
+//             std::cerr << "Compare: ";
+//             t.Print();
+//             std::cerr << "With table value " << i++ << ": ";
+//             item->Print();
+//             std::cerr << std::endl;
+               if (t.CompareAll(*item))
+                       return item->type;
+               item = item->next;
        }
 
-       if (black > 0)  return PackageFilter::Black;
-       if (red > 0)    return PackageFilter::Red;
-       if (yellow > 0) return PackageFilter::Yellow;
-       if (green > 0)  return PackageFilter::Green;
-
        return PackageFilter::Unknown;
 }
+
+PackageFilter pkgfilter;

Modified: software/ui/src/filter.h
===================================================================
--- software/ui/src/filter.h    2008-02-19 09:25:15 UTC (rev 5843)
+++ software/ui/src/filter.h    2008-02-19 09:52:32 UTC (rev 5844)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007  Miriam Ruiz <[EMAIL PROTECTED]>
+ * Copyright (C) 2007, 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -30,30 +30,84 @@
        PackageFilter();
        ~PackageFilter();
 
-       enum {
-               Green = 1, // Green light, the tag/package is safe
-               Unknown,   // The calification for the tag/package is unknown
+       typedef enum {
+               Unknown = 1,   // The calification for the tag/package is 
unknown
+               Green, // Green light, the tag/package is safe
                Yellow,    // Yellow light, handle with care
                Red,       // Green light, the tag/package is definitely unsafe
                Black,     // Mayday, mayday, the tag/package might be really 
dangerous!
-       };
+       } Type;
 
        typedef ept::debtags::Tag Tag;
        typedef std::set<Tag> TagSet;
 
-       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);
 
 protected:
+       class ResultList : public FilterTagHandler::Result
+       {
+               public:
+                       inline ResultList(const std::string str, Type t) {
+                               name = str;
+                               type = t;
+                               next= NULL;
+                       }
+
+                       inline PackageFilter::ResultList *GetLast() {
+                               PackageFilter::ResultList *l = this, *t;
+                               while ( (t = l->next) != NULL) l = t;
+                               return l;
+                       }
+
+                       std::string name;
+                       Type type;
+                       PackageFilter::ResultList *next;
+       };
+
        FilterTagHandler tagdata;
-       FilterTagHandler::Result green_tags;
-       FilterTagHandler::Result yellow_tags;
-       FilterTagHandler::Result red_tags;
-       FilterTagHandler::Result black_tags;
+       PackageFilter::ResultList *list;
+
+       inline PackageFilter::ResultList *GetFirst() {
+               return list;
+       }
+
+       inline PackageFilter::ResultList *GetLast() {
+               return list ? list->GetLast() : NULL;
+       }
+
+       inline void AddFirst(PackageFilter::ResultList *new_list) {
+               if (!new_list) return;
+               PackageFilter::ResultList *old_list = list;
+               list = new_list;
+               list->GetLast()->next = old_list;
+       }
+
+       inline void AddLast(PackageFilter::ResultList *new_list) {
+               if (!list) { list = new_list; }
+               else { list->GetLast()->next = new_list; }
+       }
+
+       inline void DeleteList() {
+               while (list) {
+                       PackageFilter::ResultList *rest = list->next;
+                       list->next = NULL;
+                       delete list;
+                       list = rest;
+               }
+       }
+
+       public:
+               inline void Print() {
+                       PackageFilter::ResultList *item = list;
+                       while (item) {
+                               std::cerr << item->name << ": ";
+                               tagdata.Print(item);
+                               item = item->next;
+                       }
+               }
 };
 
+extern PackageFilter pkgfilter;
+
 #endif

Added: software/ui/src/filter_test.cpp
===================================================================
--- software/ui/src/filter_test.cpp                             (rev 0)
+++ software/ui/src/filter_test.cpp     2008-02-19 09:52:32 UTC (rev 5844)
@@ -0,0 +1,13 @@
+#include "filter.h"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+int main(int argc, const char* argv[])
+{
+       PackageFilter filter;
+
+       filter.Print();
+       return 0;
+}

Modified: software/ui/src/goplay.cpp
===================================================================
--- software/ui/src/goplay.cpp  2008-02-19 09:25:15 UTC (rev 5843)
+++ software/ui/src/goplay.cpp  2008-02-19 09:52:32 UTC (rev 5844)
@@ -2,7 +2,7 @@
  * debtags - Implement package tags support for Debian
  *
  * Copyright (C) 2007  Enrico Zini <[EMAIL PROTECTED]>
- * Copyright (C) 2007  Miriam Ruiz <[EMAIL PROTECTED]>
+ * Copyright (C) 2007, 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -210,8 +210,6 @@
        }
        ui.InterfaceSelection->value(newIdx);
 
-       PackageFilter filter;
-
        const std::vector<Result> res = engine.results();
        for (vector<Result>::const_iterator i = res.begin();
                        i != res.end(); ++i)
@@ -226,7 +224,7 @@
                Fl_Color bk(FL_WHITE);
                Fl_Color fr(FL_BLACK);
                set<Tag> tags = ui.engine->debtags().getTagsOfItem((const char 
*)rec.package().c_str());
-               switch (filter.TagsValue(tags))
+               switch (pkgfilter.TagsValue(tags))
                {
                        case PackageFilter::Green:
                                fr = FL_BLACK; bk = FL_GREEN; break;

Modified: software/ui/src/pkgbrowser.cpp
===================================================================
--- software/ui/src/pkgbrowser.cpp      2008-02-19 09:25:15 UTC (rev 5843)
+++ software/ui/src/pkgbrowser.cpp      2008-02-19 09:52:32 UTC (rev 5844)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007  Miriam Ruiz <[EMAIL PROTECTED]>
+ * Copyright (C) 2007, 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
  * VersatileBrowser uses ColResizeBrowser, written by Greg Ercolano
  * ColResizeBrowser (C) Greg Ercolano <[EMAIL PROTECTED]>
@@ -35,13 +35,14 @@
 #include "pkgbrowser.h"
 #include "ui.h"
 #include "common.h"
-#include "filter.h"
 #include "aux.h"
 
 #include "Environment.h"
 #include "GamesOptions.h"
 #include "Engine.h"
 
+#include "filter.h"
+
 #include <ept/apt/packagerecord.h>
 
 #include <stdio.h>
@@ -222,7 +223,6 @@
                        ui->DebTagsBrowser->add(_("@[EMAIL PROTECTED]@[EMAIL 
PROTECTED]@[EMAIL PROTECTED]@[EMAIL PROTECTED]"));
 
                        set<Tag> tags = 
ui->engine->debtags().getTagsOfItem((const char *)data);
-                       PackageFilter filter;
                        char *tag_txt = new char[512];
                        for (set<Tag>::const_iterator i = tags.begin(); i != 
tags.end(); ++i)
                        {
@@ -232,7 +232,7 @@
 
                                Fl_Color bk(FL_WHITE);
                                Fl_Color fr(FL_BLACK);
-                               switch (filter.TagValue(*i))
+                               switch (pkgfilter.TagValue(*i))
                                {
                                        case PackageFilter::Green:
                                                fr = FL_BLACK; bk = FL_GREEN; 
break;

Modified: software/ui/src/pkgbrowser.h
===================================================================
--- software/ui/src/pkgbrowser.h        2008-02-19 09:25:15 UTC (rev 5843)
+++ software/ui/src/pkgbrowser.h        2008-02-19 09:52:32 UTC (rev 5844)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007  Miriam Ruiz <[EMAIL PROTECTED]>
+ * Copyright (C) 2007, 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
  * VersatileBrowser uses ColResizeBrowser, written by Greg Ercolano
  * ColResizeBrowser (C) Greg Ercolano <[EMAIL PROTECTED]>
@@ -31,6 +31,7 @@
 #include <FL/Fl_Browser.H>
 #include <FL/Fl_Help_View.H>
 #include <FL/fl_draw.H>
+
 //
 // Demonstrate how to derive a class extending Fl_Browser with interactively 
resizable columns
 // erco 1.10 12/09/2005

Modified: software/ui/src/taghandler.cpp
===================================================================
--- software/ui/src/taghandler.cpp      2008-02-19 09:25:15 UTC (rev 5843)
+++ software/ui/src/taghandler.cpp      2008-02-19 09:52:32 UTC (rev 5844)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007  Miriam Ruiz <[EMAIL PROTECTED]>
+ * Copyright (C) 2007, 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,6 +49,14 @@
        elements.push_back(tag);
 }
 
+bool FilterTagHandler::TagExists(const std::string name)
+{
+       for (std::vector<Element>::const_iterator i = elements.begin();
+                       i != elements.end(); ++i)
+       { if (i->name == name) return true; }
+       return false;
+}
+
 void FilterTagHandler::PrintAll()
 {
        for (std::vector<Element>::const_iterator i = elements.begin();

Modified: software/ui/src/taghandler.h
===================================================================
--- software/ui/src/taghandler.h        2008-02-19 09:25:15 UTC (rev 5843)
+++ software/ui/src/taghandler.h        2008-02-19 09:52:32 UTC (rev 5844)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007  Miriam Ruiz <[EMAIL PROTECTED]>
+ * Copyright (C) 2007, 2008  Miriam Ruiz <[EMAIL PROTECTED]>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -101,9 +101,21 @@
 
                void Print()
                {
+                       unsigned int tmp_position = 0;
+                       unsigned int tmp_index = 0;
                        for (unsigned int i=0; i<size; i++)
-                               std::cerr << data[i] << " " ;
-                       std::cerr << std::endl;
+                       {
+                               unsigned int tmp_flag = 1;
+                               unsigned int tmp_data = data[tmp_index];
+                               while (tmp_flag) {
+                                       std::cerr << ( tmp_data & tmp_flag ? 
"*" : "-" ) ;
+                                       tmp_flag = tmp_flag << 1;
+                                       tmp_position++;
+                                       if (tmp_position % 8 == 0) std::cerr << 
" " ;
+                               }
+                               tmp_index++;
+                               std::cerr << "  " ;
+                       }
                }
 
        protected:
@@ -133,6 +145,7 @@
 
        const Element *GetTag(const std::string name);
        void AddTag(const std::string name);
+       bool TagExists(const std::string name);
        void PrintAll();
        void Print(Result *result);
 
@@ -146,6 +159,12 @@
                result->SetTag(e->position, e->flag);
        }
 
+       inline void SetTagIfExists(Result *result, const std::string name)
+       {
+               const Element *e = GetTag(name);
+               if (e) result->SetTag(e->position, e->flag);
+       }
+
        inline void ResetTag(Result *result, const std::string name)
        {
                AddTag(name);
@@ -153,11 +172,17 @@
                result->ResetTag(e->position, e->flag);
        }
 
+       inline void ResetTagIfExists(Result *result, const std::string name)
+       {
+               const Element *e = GetTag(name);
+               if (e) result->ResetTag(e->position, e->flag);
+       }
+
        inline bool CheckTag(Result *result, const std::string name)
        {
-               AddTag(name);
+               //AddTag(name);
                const Element *e = GetTag(name);
-               return result->CheckAny(e->position, e->flag);
+               return e ? result->CheckAny(e->position, e->flag) : false;
        }
 
 protected:


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

Reply via email to