diff --git a/include/eepp/ui/models/csspropertiesmodel.hpp b/include/eepp/ui/models/csspropertiesmodel.hpp index 441ad5201..f43d1addb 100644 --- a/include/eepp/ui/models/csspropertiesmodel.hpp +++ b/include/eepp/ui/models/csspropertiesmodel.hpp @@ -49,8 +49,6 @@ class CSSPropertiesModel final : public Model { return {}; } - virtual void update() { onModelUpdate(); } - CSSPropertiesModel() {} explicit CSSPropertiesModel( UIWidget* widget ) { setWidget( widget ); } diff --git a/include/eepp/ui/models/filesystemmodel.hpp b/include/eepp/ui/models/filesystemmodel.hpp index a3ea53cd8..4980680ad 100644 --- a/include/eepp/ui/models/filesystemmodel.hpp +++ b/include/eepp/ui/models/filesystemmodel.hpp @@ -233,8 +233,6 @@ class EE_API DiskDrivesModel : public Model { virtual Variant data( const ModelIndex& index, ModelRole role = ModelRole::Display ) const; - virtual void update() { onModelUpdate(); } - private: explicit DiskDrivesModel( const std::vector& data ) : mData( data ) {} diff --git a/include/eepp/ui/models/itemlistmodel.hpp b/include/eepp/ui/models/itemlistmodel.hpp index 33c654b9b..579cf0d28 100644 --- a/include/eepp/ui/models/itemlistmodel.hpp +++ b/include/eepp/ui/models/itemlistmodel.hpp @@ -35,8 +35,6 @@ template class ItemListModel final : public Model { return {}; } - virtual void update() { onModelUpdate(); } - private: const std::vector& mData; }; @@ -84,8 +82,6 @@ template class ItemPairListModel final : public Model { return {}; } - virtual void update() { onModelUpdate(); } - virtual bool isEditable( const ModelIndex& ) const { return mIsEditable; } void setIsEditable( bool isEditable ) { mIsEditable = isEditable; } @@ -135,8 +131,6 @@ template class ItemListOwnerModel final : public Model { return {}; } - virtual void update() { onModelUpdate(); } - virtual bool isEditable( const ModelIndex& ) const { return mIsEditable; } void setIsEditable( bool isEditable ) { mIsEditable = isEditable; } @@ -196,8 +190,6 @@ template class ItemPairListOwnerModel final : public Mo return {}; } - virtual void update() { onModelUpdate(); } - virtual bool isEditable( const ModelIndex& ) const { return mIsEditable; } void setIsEditable( bool isEditable ) { mIsEditable = isEditable; } @@ -267,8 +259,6 @@ template class ItemVectorListOwnerModel final : public Model { return {}; } - virtual void update() { onModelUpdate(); } - virtual bool isEditable( const ModelIndex& ) const { return mIsEditable; } void setIsEditable( bool isEditable ) { mIsEditable = isEditable; } diff --git a/include/eepp/ui/models/model.hpp b/include/eepp/ui/models/model.hpp index 27582bf02..00195e0ab 100644 --- a/include/eepp/ui/models/model.hpp +++ b/include/eepp/ui/models/model.hpp @@ -70,7 +70,7 @@ class EE_API Model { virtual Variant data( const ModelIndex&, ModelRole = ModelRole::Display ) const = 0; - virtual void update() = 0; + virtual void update() { onModelUpdate(); } virtual ModelIndex parentIndex( const ModelIndex& ) const { return {}; } diff --git a/include/eepp/ui/models/widgettreemodel.hpp b/include/eepp/ui/models/widgettreemodel.hpp index 43a409c1b..13c0f22dc 100644 --- a/include/eepp/ui/models/widgettreemodel.hpp +++ b/include/eepp/ui/models/widgettreemodel.hpp @@ -34,8 +34,6 @@ class EE_API WidgetTreeModel : public Model { virtual ModelIndex parentIndex( const ModelIndex& ) const override; - virtual void update() override; - ModelIndex getRoot() const; ModelIndex getModelIndex( const Node* node ) const; diff --git a/src/eepp/ui/models/widgettreemodel.cpp b/src/eepp/ui/models/widgettreemodel.cpp index 7c6357905..aa6c52901 100644 --- a/src/eepp/ui/models/widgettreemodel.cpp +++ b/src/eepp/ui/models/widgettreemodel.cpp @@ -91,10 +91,6 @@ ModelIndex WidgetTreeModel::parentIndex( const ModelIndex& index ) const { return createIndex( node->getParent()->getNodeIndex(), 0, node->getParent() ); } -void WidgetTreeModel::update() { - onModelUpdate(); -} - ModelIndex WidgetTreeModel::getRoot() const { return createIndex( 0, 0, mRoot ); } diff --git a/src/tools/ecode/featureshealth.cpp b/src/tools/ecode/featureshealth.cpp index 3ffc8093c..2abcc0fb9 100644 --- a/src/tools/ecode/featureshealth.cpp +++ b/src/tools/ecode/featureshealth.cpp @@ -332,8 +332,6 @@ class HealthModel : public Model { return {}; } - virtual void update() { onModelUpdate(); } - virtual bool classModelRoleEnabled() { return true; } const FeaturesHealth::LangHealth& getHealthRow( size_t idx ) { diff --git a/src/tools/ecode/plugins/git/git.hpp b/src/tools/ecode/plugins/git/git.hpp index e14dbd339..25e5c2d07 100644 --- a/src/tools/ecode/plugins/git/git.hpp +++ b/src/tools/ecode/plugins/git/git.hpp @@ -23,8 +23,8 @@ class Git { std::size_t line{ 0 }; }; - enum class FileStatus { - Unknown, + enum class FileStatus : char { + Unknown = ' ', Modified = 'M', Added = 'A', Renamed = 'R', @@ -34,6 +34,7 @@ class Git { Untracked = '?', ModifiedSubmodule = 'm', }; + struct DiffFile { std::string file; int inserts{ 0 }; @@ -45,10 +46,12 @@ class Git { } }; + using FilesStatus = std::map; + struct Status { int totalInserts{ 0 }; int totalDeletions{ 0 }; - std::map files; + FilesStatus files; bool operator==( const Status& other ) const { return totalInserts == other.totalInserts && totalDeletions == other.totalDeletions && @@ -72,6 +75,23 @@ class Git { All = 0x7, }; + static constexpr const char* HEAD = "head"; + static constexpr const char* REMOTE = "remote"; + static constexpr const char* TAG = "tag"; + static constexpr const char* ALL = "all"; + + static const char* refTypeToString( RefType type ) { + switch ( type ) { + case Head: + return HEAD; + case Remote: + return REMOTE; + case Tag: + return TAG; + case All: + return ALL; + } + } struct Branch { /** Branch name */ std::string name; @@ -81,6 +101,8 @@ class Git { RefType type = All; /** last commit on this branch, may be empty **/ std::string lastCommit; + + const char* typeStr() const { return refTypeToString( type ); } }; Git( const std::string& projectDir = "", const std::string& gitPath = "" ); diff --git a/src/tools/ecode/plugins/git/gitplugin.hpp b/src/tools/ecode/plugins/git/gitplugin.hpp index 73a99a26b..587c2dee4 100644 --- a/src/tools/ecode/plugins/git/gitplugin.hpp +++ b/src/tools/ecode/plugins/git/gitplugin.hpp @@ -4,9 +4,13 @@ #include "../plugin.hpp" #include "../pluginmanager.hpp" #include "git.hpp" +#include #include #include +using namespace EE::UI::Models; +using namespace EE::UI; + namespace ecode { class Git; @@ -97,6 +101,72 @@ class GitPlugin : public PluginBase { void updateUINow( bool force = false ); }; +class GitBranchModel : public Model { + public: + enum Column { Name, Remote, Type, LastCommit }; + + GitBranchModel( std::vector&& branches ) : mBranches( std::move( branches ) ) {} + + size_t rowCount( const ModelIndex& ) const { return mBranches.size(); } + + size_t columnCount( const ModelIndex& ) const { return 4; } + + Variant data( const ModelIndex& index, ModelRole role ) const { + if ( role == ModelRole::Display && index.row() < mBranches.size() ) { + const Git::Branch& branch = mBranches[index.row()]; + switch ( index.column() ) { + case Column::Name: + return branch.name.c_str(); + case Column::Remote: + return branch.remote.c_str(); + case Column::Type: + return branch.typeStr(); + case Column::LastCommit: + return branch.lastCommit.c_str(); + } + } + return {}; + } + + protected: + std::vector mBranches; +}; + +class GitStatusModel : public Model { + public: + enum Column { File, Inserted, Removed, FileStatus }; + + GitStatusModel( Git::FilesStatus&& status ) { + mStatus.reserve( status.size() ); + for ( auto& s : status ) + mStatus.emplace_back( std::move( s.second ) ); + } + + size_t rowCount( const ModelIndex& ) const { return mStatus.size(); } + + size_t columnCount( const ModelIndex& ) const { return 4; } + + Variant data( const ModelIndex& index, ModelRole role ) const { + if ( role == ModelRole::Display && index.row() < mStatus.size() ) { + const Git::DiffFile& s = mStatus[index.row()]; + switch ( index.column() ) { + case Column::File: + return s.file.c_str(); + case Column::Inserted: + return s.inserts; + case Column::Removed: + return s.deletes; + case Column::FileStatus: + return Variant( std::string( static_cast( s.status ), 1 ) ); + } + } + return {}; + } + + protected: + std::vector mStatus; +}; + } // namespace ecode #endif // ECODE_GITPLUGIN_HPP diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp index b77ee7ce2..220ecd198 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp @@ -58,8 +58,6 @@ class LSPLocationModel : public Model { return {}; } - void update() override { onModelUpdate(); } - protected: struct Location { LSPLocation loc; @@ -108,8 +106,6 @@ class LSPCodeActionModel : public Model { bool hasCodeActions() const { return !mCodeActions.empty(); } - void update() override { onModelUpdate(); } - const LSPCodeAction& getCodeAction( size_t row ) const { return mCodeActions[row]; } protected: diff --git a/src/tools/ecode/plugins/pluginmanager.hpp b/src/tools/ecode/plugins/pluginmanager.hpp index 4757ddbe9..49b7a3c30 100644 --- a/src/tools/ecode/plugins/pluginmanager.hpp +++ b/src/tools/ecode/plugins/pluginmanager.hpp @@ -398,8 +398,6 @@ class PluginsModel : public Model { virtual Variant data( const ModelIndex& index, ModelRole role = ModelRole::Display ) const; - virtual void update() { onModelUpdate(); } - PluginManager* getManager() const; protected: diff --git a/src/tools/ecode/projectdirectorytree.hpp b/src/tools/ecode/projectdirectorytree.hpp index 4e1526fbb..c47c5d797 100644 --- a/src/tools/ecode/projectdirectorytree.hpp +++ b/src/tools/ecode/projectdirectorytree.hpp @@ -60,8 +60,6 @@ class FileListModel : public Model { mIcons[idx] = icon; } - virtual void update() { onModelUpdate(); } - protected: std::vector mFiles; std::vector mNames; diff --git a/src/tools/ecode/projectsearch.hpp b/src/tools/ecode/projectsearch.hpp index 10ae7b7a9..cd9fd5121 100644 --- a/src/tools/ecode/projectsearch.hpp +++ b/src/tools/ecode/projectsearch.hpp @@ -182,8 +182,6 @@ class ProjectSearch { return Variant( EMPTY ); } - virtual void update() { onModelUpdate(); } - const Result& getResult() const { return mResult; } void removeLastNewLineCharacter(); diff --git a/src/tools/ecode/statusbuildoutputcontroller.cpp b/src/tools/ecode/statusbuildoutputcontroller.cpp index 07697835c..6bd2b046d 100644 --- a/src/tools/ecode/statusbuildoutputcontroller.cpp +++ b/src/tools/ecode/statusbuildoutputcontroller.cpp @@ -437,8 +437,6 @@ class StatusMessageModel : public Model { return {}; } - virtual void update() { onModelUpdate(); } - virtual std::string columnName( const size_t& idx ) const { switch ( idx ) { case 2: diff --git a/src/tools/ecode/uibuildsettings.cpp b/src/tools/ecode/uibuildsettings.cpp index 75fe08f24..aee0587c9 100644 --- a/src/tools/ecode/uibuildsettings.cpp +++ b/src/tools/ecode/uibuildsettings.cpp @@ -63,8 +63,6 @@ class OutputParserModel final : public Model { return {}; } - virtual void update() { onModelUpdate(); } - private: std::vector& mData; std::function i18n; diff --git a/src/tools/ecode/universallocator.cpp b/src/tools/ecode/universallocator.cpp index ca0039bc4..829ee8dde 100644 --- a/src/tools/ecode/universallocator.cpp +++ b/src/tools/ecode/universallocator.cpp @@ -50,8 +50,6 @@ class LSPSymbolInfoModel : public Model { return {}; } - void update() override { onModelUpdate(); } - const LSPSymbolInformationList& getInfo() const { return mInfo; } LSPSymbolInformation at( const size_t& idx ) {