added function to set all parent links in tree
[rocksndiamonds.git] / src / libgame / setup.c
index 23579d277ba5b92503aac35cfabdcd26625613de..192e2ce67e4d2b5307bdccf257e5ac9a4421563c 100644 (file)
@@ -2882,7 +2882,7 @@ static TreeInfo *createParentTreeInfoNode(TreeInfo *node_parent)
   ti_new->parent_link = TRUE;
 
   setString(&ti_new->identifier, node_parent->identifier);
-  setString(&ti_new->name, ".. (parent directory)");
+  setString(&ti_new->name, BACKLINK_TEXT_PARENT);
   setString(&ti_new->name_sorting, ti_new->name);
 
   setString(&ti_new->subdir, STRING_PARENT_DIRECTORY);
@@ -2900,19 +2900,19 @@ static TreeInfo *createParentTreeInfoNode(TreeInfo *node_parent)
 
 static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first)
 {
-  TreeInfo *ti_new, *ti_new2;
-
   if (node_first == NULL)
     return NULL;
 
-  ti_new = newTreeInfo();
-  setTreeInfoToDefaults(ti_new, TREE_TYPE_LEVEL_DIR);
+  TreeInfo *ti_new = newTreeInfo();
+  int type = node_first->type;
+
+  setTreeInfoToDefaults(ti_new, type);
 
   ti_new->node_parent = NULL;
   ti_new->parent_link = FALSE;
 
   setString(&ti_new->identifier, node_first->identifier);
-  setString(&ti_new->name, INFOTEXT_LEVEL_DIR);
+  setString(&ti_new->name, TREE_INFOTEXT(type));
   setString(&ti_new->name_sorting, ti_new->name);
 
   setString(&ti_new->subdir, STRING_TOP_DIRECTORY);
@@ -2921,19 +2921,32 @@ static TreeInfo *createTopTreeInfoNode(TreeInfo *node_first)
   ti_new->sort_priority = node_first->sort_priority;;
   ti_new->latest_engine = node_first->latest_engine;
 
-  setString(&ti_new->class_desc, INFOTEXT_LEVEL_DIR);
+  setString(&ti_new->class_desc, TREE_INFOTEXT(type));
 
   ti_new->node_group = node_first;
   ti_new->level_group = TRUE;
 
-  ti_new2 = createParentTreeInfoNode(ti_new);
+  TreeInfo *ti_new2 = createParentTreeInfoNode(ti_new);
 
-  setString(&ti_new2->name, ".. (main menu)");
+  setString(&ti_new2->name, TREE_BACKLINK_TEXT(type));
   setString(&ti_new2->name_sorting, ti_new2->name);
 
   return ti_new;
 }
 
+static void setTreeInfoParentNodes(TreeInfo *node, TreeInfo *node_parent)
+{
+  while (node)
+  {
+    if (node->node_group)
+      setTreeInfoParentNodes(node->node_group, node);
+
+    node->node_parent = node_parent;
+
+    node = node->next;
+  }
+}
+
 
 // ----------------------------------------------------------------------------
 // functions for handling level and custom artwork info cache
@@ -3923,6 +3936,29 @@ void LoadArtworkInfo(void)
 #endif
 }
 
+static void MoveArtworkInfoIntoSubTree(ArtworkDirTree **artwork_node)
+{
+  ArtworkDirTree *artwork_new = newTreeInfo();
+  char *top_node_name = "dedicated custom artwork";
+
+  setTreeInfoToDefaults(artwork_new, (*artwork_node)->type);
+
+  artwork_new->level_group = TRUE;
+
+  setString(&artwork_new->identifier,   top_node_name);
+  setString(&artwork_new->name,         top_node_name);
+  setString(&artwork_new->name_sorting, top_node_name);
+
+  // create node to link back to current custom artwork directory
+  createParentTreeInfoNode(artwork_new);
+
+  // move existing custom artwork tree into newly created sub-tree
+  artwork_new->node_group->next = *artwork_node;
+
+  // change custom artwork tree to contain only newly created node
+  *artwork_node = artwork_new;
+}
+
 static void LoadArtworkInfoFromLevelInfoExt(ArtworkDirTree **artwork_node,
                                            ArtworkDirTree *node_parent,
                                            LevelDirTree *level_node,
@@ -4025,8 +4061,15 @@ static void LoadArtworkInfoFromLevelInfoExt(ArtworkDirTree **artwork_node,
 
 static void LoadArtworkInfoFromLevelInfo(ArtworkDirTree **artwork_node)
 {
+  // move peviously loaded artwork tree into separate sub-tree
+  MoveArtworkInfoIntoSubTree(artwork_node);
+
+  // load artwork from level sets into separate sub-trees
   LoadArtworkInfoFromLevelInfoExt(artwork_node, NULL, leveldir_first_all, TRUE);
   LoadArtworkInfoFromLevelInfoExt(artwork_node, NULL, leveldir_first_all, FALSE);
+
+  // set all parent links (back links) in complete artwork tree
+  setTreeInfoParentNodes(*artwork_node, NULL);
 }
 
 void LoadLevelArtworkInfo(void)