r5844 - software/ui/src
Miriam Ruiz
baby-guest at alioth.debian.org
Tue Feb 19 09:52:32 UTC 2008
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 <little_miry at yahoo.es>
+ * Copyright (C) 2007, 2008 Miriam Ruiz <little_miry at yahoo.es>
*
* 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 <little_miry at yahoo.es>
+ * Copyright (C) 2007, 2008 Miriam Ruiz <little_miry at yahoo.es>
*
* 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 <enrico at debian.org>
- * Copyright (C) 2007 Miriam Ruiz <little_miry at yahoo.es>
+ * Copyright (C) 2007, 2008 Miriam Ruiz <little_miry at yahoo.es>
*
* 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 <little_miry at yahoo.es>
+ * Copyright (C) 2007, 2008 Miriam Ruiz <little_miry at yahoo.es>
*
* VersatileBrowser uses ColResizeBrowser, written by Greg Ercolano
* ColResizeBrowser (C) Greg Ercolano <erco at seriss.com>
@@ -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(_("@B12 at C7@b at .FACET\t at B12@C7 at b@.TAG"));
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 <little_miry at yahoo.es>
+ * Copyright (C) 2007, 2008 Miriam Ruiz <little_miry at yahoo.es>
*
* VersatileBrowser uses ColResizeBrowser, written by Greg Ercolano
* ColResizeBrowser (C) Greg Ercolano <erco at seriss.com>
@@ -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 <little_miry at yahoo.es>
+ * Copyright (C) 2007, 2008 Miriam Ruiz <little_miry at yahoo.es>
*
* 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 <little_miry at yahoo.es>
+ * Copyright (C) 2007, 2008 Miriam Ruiz <little_miry at yahoo.es>
*
* 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:
More information about the Pkg-games-commits
mailing list