//Collect currently active filters into a Dictionary<string, object> which is then be passed to
 //filter_craft on CraftData (which does the actual filtering work).
 public void filter_craft()
 {
     if (CraftData.cache != null && !exclude_stock_craft && !stock_craft_loaded) //load stock craft if they've not yet been loaded and option to exclude stock is switched off.
     {
         CraftData.load_stock_craft_from_files();
     }
     search_criteria.Clear();
     search_criteria.Add("search", search_string);
     search_criteria.Add("type", selected_types);
     if (kerbalx_mode)
     {
         List <Version> s_vers = KerbalX.selected_versions;
         if (s_vers.Count > 0)
         {
             search_criteria.Add("versions", s_vers);
         }
     }
     else
     {
         List <string> s_tags = Tags.selected_tags();
         List <string> a_tags = Tags.archived_tags();
         if (s_tags.Count > 0)
         {
             search_criteria.Add("tags", s_tags);
         }
         if (a_tags.Count > 0)
         {
             search_criteria.Add("archived_tags", a_tags);
         }
     }
     search_criteria.Add("tag_filter_mode", tag_filter_mode);
     search_criteria.Add("sort", sort_opt);
     search_criteria.Add("reverse_sort", reverse_sort);
     search_criteria.Add("exclude_stock", exclude_stock_craft);
     CraftData.filter_craft(search_criteria); //pass options to filter logic
 }