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