/** * RobloxPluginHost.h * Copyright (c) 2013 ROBLOX Corp. All Rights Reserved. */ #pragma once // QT Headers #include #include #include #include #include #include #include // Boost Headers #include // Roblox headers #include "v8datamodel/StudioPluginHost.h" #include "reflection/reflection.h" class QToolBar; class QAction; namespace RBX { class DataModel; } namespace Qtitan { class RibbonGroup; class RibbonPage; } class RobloxPluginHost: public QObject, public RBX::IStudioPluginHost { Q_OBJECT public: RobloxPluginHost(QObject *pParent); virtual ~RobloxPluginHost(); void init(); /** * RBX::IStudioPluginHost */ void setNotifier(RBX::IHostNotifier *notifier); void* createToolbar(const std::string& name); void* createButton(void *tbId, const std::string& text, const std::string& tooltip, const std::string& iconFilePath); void setButtonActive(void *bId, bool active); void setButtonIcon_deprecated(void* buttonId, const std::string& iconFilePath); void setButtonIcon(void* butonId, const std::string& iconImage); void buttonIconFailedToLoad(void* buttonId); void hideToolbars(const std::vector &toolbars, bool hide); void disableToolbars(const std::vector &toolbars, bool disable); void deleteToolbars(const std::vector &toolbars); // Finds a setting in the plugin settings file, and changes it to the // specified value, or adds it if no setting is found. void setSetting(int assetId, const std::string& key, const RBX::Reflection::Variant& value); // Returns a setting value from the plugin settings file, or an empty value // if the setitng does not exist. void getSetting(int assetId, const std::string& key, RBX::Reflection::Variant* result); bool getLoggedInUserId(int* userIdOut); void uiAction(std::string uiActionName); // Returns action state if it is valid bool actionState(const QString &actionID, bool &enableState, bool &checkedState); void exportPlace(std::string filePath, RBX::ExporterSaveType saveType); void promptForExistingAssetId(const std::string& assetType, boost::function resumeFunction, boost::function errorFunction); shared_ptr csgUnion(shared_ptr instances, RBX::DataModel* dataModel); shared_ptr csgNegate(shared_ptr instances, RBX::DataModel* dataModel); shared_ptr csgSeparate(shared_ptr instances, RBX::DataModel* dataModel); // Other methods static void loadPlugins(RBX::DataModel *dataModel); static QString builtInPluginPath(); static QString userPluginPath(); static QString modelPluginsPath(); static void processInstallPluginFromWebsite(int assetId, int assetVersion, std::string* result, std::exception* error, boost::function resultCallback); static QString getPluginMetadataJson(); static void setPluginEnabled(int assetId, bool enabled); static void uninstallPlugin(int assetId); void openScriptDoc(shared_ptr instance, int lineNumber); void openWikiPage(const std::string& url); void handleDragEnterEvent(RBX::DataModel* dataModel, shared_ptr instances, RBX::Vector2 location); private Q_SLOTS: void handlePluginAction(); void onCreateToolbar(int toolbarID,QString name); void onCreateButton(int toolbarID,int actionID,QString text,QString tooltip,QString iconName); void onSetButtonActive(int buttonID, bool active); void onShowToolbar(int toolbarID,bool show); void onShowToolbars(QVariant toolbarID,bool show); void onEnableToolbar(int toolbarID,bool enable); void setButtonIconInternal_deprecated(int buttonId, QString iconName); void setButtonIconInternal(int buttonId, QImage icon); void onUIAction(QString uiActionName); private: virtual bool event(QEvent * evt); static void loadPluginsFromPath(RBX::DataModel *dataModel, const QString &srcPath); void loadPluginsInternal(RBX::DataModel *dataModel, const QString &srcPath); static void doLoadPlugin(RBX::DataModel *dataModel, QString filename); static void findAndLoadModelPlugins(RBX::DataModel* dataModel, const QString& srcPath); static void loadInstalledModelPlugins(RBX::DataModel* dataModel); // Caller is responsible for ensuring that filename is a valid file path // to an openable file. static void doLoadModelPlugin(RBX::DataModel* dataModel, const QString& filename, int assetId); void removeActionsFromMap(QObject* parent); void handleTerrainRibbonGroupDeletion(); QString getToolbarName(int id) const; static QDir getSpecificPluginFolder(int assetId); static QString getPluginMetadataFilePath(); static bool readPluginMetadata(boost::shared_ptr& metadata); static void writePluginMetadata(const boost::shared_ptr& metadata); static void readPluginSettings(int assetId, boost::shared_ptr& settings); static void writePluginSettings(int assetId, const boost::shared_ptr& settings); RBX::IHostNotifier* m_pNotifier; QMap m_ToolBarMap; QMap m_ActionMap; QMap m_RibbonGroupMap; Qtitan::RibbonPage* m_PluginsToolbar; Qtitan::RibbonPage* m_TerrainToolbar; // Hack for terrain until these become native int m_TerrainToolbarID; int m_TransformToolbarID; int m_ConvertToSmoothID; QMap m_TextActionMap; static int m_NextID; };