#pragma once #include "Util/AsyncHttpQueue.h" #include "V8Tree/Instance.h" #include "V8DataModel/PluginMouse.h" #include "V8Tree/Service.h" #include "V8DataModel/ChangeHistory.h" #include "V8DataModel/DataModel.h" #include "V8DataModel/Workspace.h" #include "StudioPluginHost.h" #include "Tool/ToolsArrow.h" LOGGROUP(Plugins); namespace RBX { class PluginManager; class Toolbar; extern const char *const sButton; class Button : public DescribedNonCreatable { void *id; IStudioPluginHost *host; Toolbar *toolbar; bool isDeleted; bool active; public: Button(); void SetId(void *id) { this->id = id; } void setToolbar(Toolbar *toolbar); void setHost(IStudioPluginHost *host) { this->host = host; } void markDeleted(); void processIconLoaded(ContentId id, AsyncHttpQueue::RequestResult result, std::istream* stream, shared_ptr response); void setActive(bool value); rbx::signal clickSignal; }; extern const char *const sToolbar; class Toolbar : public DescribedNonCreatable { IStudioPluginHost *host; DataModel* dataModel; void *id; bool isDeleted; typedef std::map >::iterator buttonsIter; std::map > buttonsMap; public: Toolbar(); void SetId(void *id) { this->id = id; } void *getId() const { return id; } void setHost(IStudioPluginHost *host) { this->host = host; } void setDataModel(DataModel* dataModel) { this->dataModel = dataModel; } DataModel* getDataModel() const { return dataModel; } void reset(); void markDeleted(); shared_ptr createButton(std::string text, std::string tooltip, std::string iconName); Button *getButton(void *id); }; extern const char *const sPlugin; class Plugin : public DescribedNonCreatable { private: PluginManager *pluginManager; DataModel *dataModel; shared_ptr luaMouse; PluginMouse *mouse; bool active; bool tool; int assetId; public: Plugin(); ~Plugin(); void setPluginManager(PluginManager *pluginManager_) { pluginManager = pluginManager_; } void setDataModel(DataModel *dataModel); DataModel *getDataModel() const { return dataModel; } bool isTool() const { return tool; }; PluginMouse *getMouse() const { return mouse; } shared_ptr getMouseLua(); shared_ptr createToolbar(std::string name); void saveSelectedToRoblox(); void setSetting(std::string key, Reflection::Variant value); Reflection::Variant getSetting(std::string key); int getStudioUserId(); bool isCollisionOn() const; float getGridSize() const; AdvArrowToolBase::JointCreationMode getJoinMode(); void activate(bool exclusiveMouse); void setActive(bool state); rbx::signal deactivationSignal; void setAssetId(int assetId); void openScriptDoc(shared_ptr script, int lineNumber); void openWikiPage(std::string url); shared_ptr csgUnion( shared_ptr instances ); shared_ptr csgNegate( shared_ptr instances ); shared_ptr csgSeparate( shared_ptr instances ); void promptForExistingAssetId(std::string assetType, boost::function resumeFunction, boost::function errorFunction); }; extern const char *const sPluginManager; class PluginManager : public DescribedNonCreatable, IHostNotifier { private: std::string lastPluginPath; // this dataModel refers to the currently selected dataModel (as in the selected tab in studio) DataModel *currentDataModel; IStudioPluginHost *studioHost; struct StateDataEntry { typedef std::map >::iterator toolbarsIter; StateDataEntry() : active(NULL), hidden(false) {} std::map > toolbars; std::list > plugins; Plugin *active; bool hidden; void addPlugin(shared_ptr p) { plugins.push_back(p); } void setActivePlugin(Plugin *p) { active = p; p->setActive(true); } shared_ptr getToolbar(std::string name, IStudioPluginHost *host, DataModel* dataModel); void fireButtonClick(void *id); void disableStudioUI(bool hide, IStudioPluginHost *host); void hideStudioUI(bool hide, IStudioPluginHost *host); void deleteStudioUI(IStudioPluginHost *host); }; typedef std::map::iterator stateIter; typedef std::list > pluginsList; typedef std::list >::iterator pluginsIter; typedef std::pair statePair; std::map state; public: PluginManager(); static shared_ptr singleton(); boost::mutex mutex; rbx::signal allPluginsDeactivatedSignal; virtual shared_ptr createToolbar(Plugin *plugin, std::string name); virtual void activate(Plugin *plugin, DataModel *dataModel); virtual void DeactivatePlugins(); virtual void buttonClick(DataModel *dataModel, void *id); void setStudioHost(IStudioPluginHost *host) { studioHost = host; host->setNotifier(this); } IStudioPluginHost* getStudioHost() { return studioHost; } void setCurrentDataModel(DataModel *dataModel) { currentDataModel = dataModel; } std::string getLastPath() const { return lastPluginPath; } void setLastPath(std::string path) { lastPluginPath = path; } void addModelPlugin(DataModel* dataModel, Instances instances, int assetId); void startModelPluginScripts(DataModel* dataModel); int createPlugin(lua_State* L); void deletePlugins(DataModel *dataModel); void deleteStudioUI(DataModel *dataModel); Plugin *getActivePlugin(DataModel *dataModel); void hideStudioUI(DataModel *dataModel, bool hide); void disableStudioUI(DataModel *dataModel, bool hide); void exportPlace(std::string filePath); void exportSelection(std::string filePath); virtual void fireDragEnterEvent(DataModel* dataModel, shared_ptr instances, Vector2 location); }; };