/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2024 Jon Evans * Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef KICAD_API_HANDLER_EDITOR_H #define KICAD_API_HANDLER_EDITOR_H #include #include #include #include using namespace kiapi::common; using kiapi::common::types::DocumentSpecifier; using kiapi::common::types::ItemRequestStatus; using kiapi::common::commands::ItemDeletionStatus; class EDA_BASE_FRAME; /** * Base class for API handlers related to editor frames */ class API_HANDLER_EDITOR : public API_HANDLER { public: API_HANDLER_EDITOR( EDA_BASE_FRAME* aFrame = nullptr ); protected: /// If the header is valid, returns the item container HANDLER_RESULT> validateItemHeaderDocument( const kiapi::common::types::ItemHeader& aHeader ); HANDLER_RESULT validateDocument( const DocumentSpecifier& aDocument ); /** * Checks if the editor can accept commands * @return an error status if busy, std::nullopt if not busy */ virtual std::optional checkForBusy(); HANDLER_RESULT handleBeginCommit( commands::BeginCommit& aMsg, const HANDLER_CONTEXT& aCtx ); HANDLER_RESULT handleEndCommit( commands::EndCommit& aMsg, const HANDLER_CONTEXT& aCtx ); COMMIT* getCurrentCommit( const HANDLER_CONTEXT& aCtx ); virtual void pushCurrentCommit( const HANDLER_CONTEXT& aCtx, const wxString& aMessage ); HANDLER_RESULT handleCreateItems( commands::CreateItems& aMsg, const HANDLER_CONTEXT& aCtx ); HANDLER_RESULT handleUpdateItems( commands::UpdateItems& aMsg, const HANDLER_CONTEXT& aCtx ); HANDLER_RESULT handleDeleteItems( commands::DeleteItems& aMsg, const HANDLER_CONTEXT& aCtx ); HANDLER_RESULT handleHitTest( commands::HitTest& aMsg, const HANDLER_CONTEXT& aCtx ); /** * Override this to create an appropriate COMMIT subclass for the frame in question * @return a new COMMIT, bound to the editor frame */ virtual std::unique_ptr createCommit() = 0; /** * Override this to specify which document type this editor handles */ virtual kiapi::common::types::DocumentType thisDocumentType() const = 0; /** * @return true if the given document is valid for this editor and is currently open */ virtual bool validateDocumentInternal( const DocumentSpecifier& aDocument ) const = 0; virtual HANDLER_RESULT handleCreateUpdateItemsInternal( bool aCreate, const HANDLER_CONTEXT& aCtx, const types::ItemHeader &aHeader, const google::protobuf::RepeatedPtrField& aItems, std::function aItemHandler ) = 0; virtual void deleteItemsInternal( std::map& aItemsToDelete, const HANDLER_CONTEXT& aCtx ) = 0; virtual std::optional getItemFromDocument( const DocumentSpecifier& aDocument, const KIID& aId ) = 0; protected: std::map>> m_commits; std::set m_activeClients; EDA_BASE_FRAME* m_frame; }; #endif //KICAD_API_HANDLER_EDITOR_H