#pragma once #include #include #include #include #include class EditorCommandExecuteContext; class EditorCommand { public: std::string name; std::function callback; std::function subsequentCallback; std::function terminate; }; class EditorCommandExecuteContext { friend class EditorCommandPalette; private: const EditorCommand* mCommand = nullptr; std::vector mCurrentOptions; int mDepth = 0; public: bool IsInitiated() const; const EditorCommand* GetCurrentCommand() const; void Initiate(const EditorCommand& command); void Prompt(std::vector options); void Finish(); /// Return the number of prompts that the user is currently completing. For example, when the user opens command /// palette fresh and selects a command, 0 is returned. If the command asks some prompt, and then the user selects /// again, 1 is returned. int GetExecutionDepth() const; }; class EditorCommandPalette { private: struct SearchResult; struct Item; std::vector mCommands; std::vector mItems; std::vector mSearchResults; std::string mSearchText; EditorCommandExecuteContext mExeCtx; int mFocusedItemId = 0; bool mFocusSearchBox = false; bool mShouldCloseNextFrame = false; public: EditorCommandPalette(); ~EditorCommandPalette(); EditorCommandPalette(const EditorCommandPalette&) = delete; EditorCommandPalette& operator=(const EditorCommandPalette&) = delete; EditorCommandPalette(EditorCommandPalette&&) = default; EditorCommandPalette& operator=(EditorCommandPalette&&) = default; void AddCommand(std::string_view category, std::string_view name, EditorCommand command); void RemoveCommand(std::string_view category, std::string_view name); void RemoveCommand(const std::string& commandName); void Show(bool* open = nullptr); enum ItemType { CommandItem, CommandOptionItem, }; enum IndexType { DirectIndex, SearchResultIndex, }; struct ItemInfo { const char* text; const EditorCommand* command; int itemId; ItemType itemType; IndexType indexType; }; size_t GetItemCount() const; ItemInfo GetItem(size_t idx) const; void SelectFocusedItem(); private: void InvalidateSearchResults(); };