/** * ScriptAnalysisWidget.h * Copyright (c) 2014 ROBLOX Corp. All Rights Reserved. */ #pragma once //this will make sure that we can use qt with boost (else moc compiler errors) #ifndef QT_NO_KEYWORDS #define QT_NO_KEYWORDS #endif #include #include #include #include "rbx/signal.h" #include "script/ScriptAnalyzer.h" #include "v8datamodel/DataModel.h" #include "LuaSourceBuffer.h" class QCheckBox; class QToolButton; class QFrame; class ScriptAnalysisTreeWidget: public QTreeWidget { Q_OBJECT public: ScriptAnalysisTreeWidget(QWidget* parent); void setDataModel(boost::shared_ptr dataModel); void updateResults(const LuaSourceBuffer& script, const RBX::ScriptAnalyzer::Result& result, bool showErrors, bool showWarnings); void reset(); void scrollTo(const LuaSourceBuffer& script); void updateCategoryItem(QTreeWidgetItem* pItem); void instanceRemoving(boost::shared_ptr instance); QTreeWidgetItem* getCategoryItem(const LuaSourceBuffer& script); bool hasHyperLinkText(const QPoint& pos); void setFilter(const LuaSourceBuffer& script, bool showErrors, bool showWarnings); void showAll(bool showErrors, bool showWarnings); QTreeWidgetItem* itemFromIndex(const QModelIndex &index) const { return QTreeWidget::itemFromIndex(index); } using QTreeWidget::indexFromItem; void categoryItemBecomingLinked(QTreeWidgetItem*); void removeGameScriptAssets(); rbx::signal)> embeddedSourceRemoved; Q_SIGNALS: void resultsUpdated(); private Q_SLOTS: void onItemActivated(QTreeWidgetItem* pItem); private: /*override*/ void mousePressEvent(QMouseEvent *evt); /*override*/ void mouseMoveEvent(QMouseEvent * event); QTreeWidgetItem* getOrCreateCategoryItem(const LuaSourceBuffer& script); bool removeCategoryItem(const LuaSourceBuffer& script); QTreeWidgetItem* getOrCreateMessageItem(QTreeWidgetItem* categoryItem, int childPos); LuaSourceBuffer getScript(QTreeWidgetItem* item); void onScriptParentChanged(boost::shared_ptr instance, boost::shared_ptr newParent); Q_INVOKABLE void updateItemName(const QModelIndex& index); typedef boost::unordered_map InstanceMap; InstanceMap m_InstanceMap; boost::shared_ptr m_dataModel; }; class LinkedSourceInstance : public boost::enable_shared_from_this { public: LinkedSourceInstance(boost::shared_ptr instance); boost::shared_ptr getInstance() { return m_LuaSourceContainer; } rbx::signal)> linkedSourceRemoved; private: void onPropertyChanged(const RBX::Reflection::PropertyDescriptor* pDescriptor); boost::shared_ptr m_LuaSourceContainer; rbx::signals::scoped_connection m_cPropertyChangedConnection; }; class ScriptAnalysisWidget: public QWidget { Q_OBJECT public: ScriptAnalysisWidget(QWidget* parent); void updateResults(const LuaSourceBuffer& script, const RBX::ScriptAnalyzer::Result& result); void setDataModel(boost::shared_ptr dataModel); void setCurrentScript(const LuaSourceBuffer& script); private Q_SLOTS: void onResultsUpdated(); void onToolButtonClicked(); void onCheckBoxClicked(); void onCurrentDocChanged(); void onNamedAssetsLoaded(int gameId); void onNamedAssetModified(int gameId, const QString& assetName); private: void updateTreeWidget(); void updateButtonsTextAndState(int currentErrors = 0, int totalErrors = 0, int currentWarnings = 0, int totalWarnings = 0); void updateResultsInstance(const shared_ptr& instance); void onInstanceRemoving(boost::shared_ptr instance); void onLinkedSourceRemoved(boost::shared_ptr linkedSourceInstance); void updateResultsGameScriptAssets(); void requestAnalyzeScriptAssetSource(const QString& scriptAssetName); Q_INVOKABLE void analyzeScriptAssetSource(const QString& scriptAssetName, RBX::HttpFuture future); void updateResultsScriptAsset(const QString& scriptAssetName, const RBX::ScriptAnalyzer::Result& scriptResults); Q_INVOKABLE void updateResultsInternal(shared_ptr script, const RBX::ScriptAnalyzer::Result& result); Q_INVOKABLE void analyzeAndUpdateResults(shared_ptr script); typedef std::set > LinkedSourceInstanceCollection; LinkedSourceInstanceCollection m_LinkedSources; boost::shared_ptr m_dataModel; rbx::signals::scoped_connection m_dataModelDescendantAdded; rbx::signals::scoped_connection m_dataModelDescendantRemoving; rbx::signals::scoped_connection m_treeWidgetEmbeddedSourceRemoved; LuaSourceBuffer m_currentScriptInstance; QCheckBox* m_pDisplayCurrentScript; QToolButton* m_pErrorsToolButton; QToolButton* m_pWarningsToolButton; QFrame* m_pVertSeparator; ScriptAnalysisTreeWidget* m_pTreeWidget; int m_currentGameId; bool m_bDisplayCurrentScriptState; };