public static void toggle_group_select(CraftData craft)
 {
     if (active_craft.Count == 0 || (active_craft.Count == 1 && active_craft[0] == craft))
     {
         toggle_selected(craft);
     }
     else
     {
         if (craft.group_selected)
         {
             craft.group_selected = false;
         }
         else
         {
             CraftData.group_select(craft);
         }
     }
     if (active_craft.Count == 1)
     {
         CraftData.select_craft(active_craft[0]);
     }
 }
        //listen to key press actions
        protected virtual void key_event_handler()
        {
            Event e = Event.current;

            //This is somewhat batshit, allow me to explain. Event.current.control only detects the key press, not a key hold, so we used Input.GetKey(..)
            //but if the focus is on the search text field Input.GetKey won't detect CTRL being held. so...this first bit detects CTRL down while focused on search field
            //also also sets check_ctrl_key to false so the regular check is skipped.  check_ctrl_key is returned to true on key up
            if (GUI.GetNameOfFocusedControl() == "main_search_field" && e.type == EventType.KeyDown && e.control)
            {
                ctrl_key_down  = true;
                check_ctrl_key = false;
            }

            if (e.type == EventType.KeyUp)
            {
                check_ctrl_key = true;
            }

            if (check_ctrl_key)
            {
                ctrl_key_down = (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl));
            }
            shift_key_down = (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift));

            if (e.type == EventType.KeyDown)
            {
                //'esc' - close interface
                if (e.keyCode == KeyCode.Escape)
                {
                    e.Use();
                    this.hide();
                    //'ctrl+f' - focus on main search field
                }
                else if ((ctrl_key_down || e.control) && e.keyCode == KeyCode.F)
                {
                    GUI.FocusControl("main_search_field");
                    ctrl_key_down = false;
                    e.Use();
                    //'ctrl+t' - create new tag
                }
                else if ((ctrl_key_down || e.control) && e.keyCode == KeyCode.T)
                {
                    CraftManager.main_ui.create_tag_dialog(true);
                    ctrl_key_down = false;
                    e.Use();
                }
                else if ((ctrl_key_down || e.control) && e.keyCode == KeyCode.A)
                {
                    foreach (CraftData craft in CraftData.filtered)
                    {
                        CraftData.group_select(craft);
                    }
                    e.Use();
                    //'up arrow' move up in craft list
                }
                else if (e.keyCode == KeyCode.UpArrow && !upload_interface_ready)
                {
                    jump_to_craft(CraftData.filtered.IndexOf(CraftData.selected_craft) - 1);
                    e.Use();
                    //'down arrow' move down in craft list
                }
                else if (e.keyCode == KeyCode.DownArrow && !upload_interface_ready)
                {
                    jump_to_craft(CraftData.filtered.IndexOf(CraftData.selected_craft) + 1);
                    e.Use();
                    //'enter key' - load selected craft (if focus is not on search field)
                }
                else if ((e.keyCode == KeyCode.Return || e.keyCode == KeyCode.KeypadEnter) && GUI.GetNameOfFocusedControl() != "main_search_field" && CraftData.selected_craft != null)
                {
                    load_craft(CraftData.selected_craft.construction_type == "Subassembly" ? "subload" : "load");
                    //'tab' - move focus from search field to craft list.
                }
                else if (GUI.GetNameOfFocusedControl() == "main_search_field" && e.keyCode == KeyCode.Tab)
                {
                    jump_to_craft(0);
                    e.Use();
                }
            }
        }