banshee r3363 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.SmartPlaylist src/Libraries/Hyena/Hyena.Query
- From: scottp svn gnome org
- To: svn-commits-list gnome org
- Subject: banshee r3363 - in trunk/banshee: . src/Core/Banshee.Services/Banshee.SmartPlaylist src/Libraries/Hyena/Hyena.Query
- Date: Sat, 1 Mar 2008 23:49:39 +0000 (GMT)
Author: scottp
Date: Sat Mar 1 23:49:39 2008
New Revision: 3363
URL: http://svn.gnome.org/viewvc/banshee?rev=3363&view=rev
Log:
* src/Libraries/Hyena/Hyena.Query/QueryNode.cs: Added methods to search
a QueryNode tree for values of a given type either by depth or
breadth.
* src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs:
Consume the new QueryNode.SearchForValues method.
Modified:
trunk/banshee/ChangeLog
trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs
Modified: trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs (original)
+++ trunk/banshee/src/Core/Banshee.Services/Banshee.SmartPlaylist/SmartPlaylistSource.cs Sat Mar 1 23:49:39 2008
@@ -224,22 +224,6 @@
#region Private Methods
- private void UpdateDependencies (QueryNode node)
- {
- if (node is QueryListNode) {
- foreach (QueryNode child in (node as QueryListNode).Children) {
- UpdateDependencies (child);
- }
- } else {
- QueryTermNode term = node as QueryTermNode;
- if (term != null && term.Field == BansheeQuery.SmartPlaylistField) {
- SmartPlaylistSource s = (term.Value as SmartPlaylistQueryValue).ObjectValue;
- s.Updated += OnDependencyUpdated;
- dependencies.Add (s);
- }
- }
- }
-
private void UpdateDependencies ()
{
foreach (SmartPlaylistSource s in dependencies) {
@@ -248,7 +232,11 @@
dependencies.Clear ();
- UpdateDependencies (ConditionTree);
+ foreach (SmartPlaylistQueryValue value in ConditionTree.SearchForValues<SmartPlaylistQueryValue> ()) {
+ SmartPlaylistSource playlist = value.ObjectValue;
+ playlist.Updated += OnDependencyUpdated;
+ dependencies.Add (playlist);
+ }
}
private void OnDependencyUpdated (object sender, EventArgs args)
Modified: trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs (original)
+++ trunk/banshee/src/Libraries/Hyena/Hyena.Query/QueryNode.cs Sat Mar 1 23:49:39 2008
@@ -28,12 +28,19 @@
//
using System;
+using System.Collections.Generic;
using System.Xml;
using System.IO;
using System.Text;
namespace Hyena.Query
{
+ public enum QueryNodeSearchMethod
+ {
+ DepthFirst,
+ BreadthFirst
+ }
+
public abstract class QueryNode
{
private QueryListNode parent;
@@ -108,6 +115,63 @@
}
}
}
+
+ public IEnumerable<T> SearchForValues<T> () where T : QueryValue
+ {
+ return SearchForValues<T> (QueryNodeSearchMethod.DepthFirst);
+ }
+
+ public IEnumerable<T> SearchForValues<T> (QueryNodeSearchMethod method) where T : QueryValue
+ {
+ if (method == QueryNodeSearchMethod.DepthFirst) {
+ return SearchForValuesByDepth<T> (this);
+ } else {
+ return SearchForValuesByBreadth<T> ();
+ }
+ }
+
+ private static IEnumerable<T> SearchForValuesByDepth<T> (QueryNode node) where T : QueryValue
+ {
+ QueryListNode list = node as QueryListNode;
+ if (list != null) {
+ foreach (QueryNode child in list.Children) {
+ foreach (T item in SearchForValuesByDepth<T> (child)) {
+ yield return item;
+ }
+ }
+ } else {
+ QueryTermNode term = node as QueryTermNode;
+ if (term != null) {
+ T value = term.Value as T;
+ if (value != null) {
+ yield return value;
+ }
+ }
+ }
+ }
+
+ private IEnumerable<T> SearchForValuesByBreadth<T> () where T : QueryValue
+ {
+ Queue<QueryNode> queue = new Queue<QueryNode> ();
+ queue.Enqueue (this);
+ do {
+ QueryNode node = queue.Dequeue ();
+ QueryListNode list = node as QueryListNode;
+ if (list != null) {
+ foreach (QueryNode child in list.Children) {
+ queue.Enqueue (child);
+ }
+ } else {
+ QueryTermNode term = node as QueryTermNode;
+ if (term != null && term.Value is T) {
+ T value = term.Value as T;
+ if (value != null) {
+ yield return value;
+ }
+ }
+ }
+ } while (queue.Count > 0);
+ }
public override string ToString ()
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]