diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index 219301a092..6360375d8d 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -99,6 +99,7 @@ set( PCBNEW_DIALOGS dialogs/dialog_global_edit_text_and_graphics.cpp dialogs/dialog_global_edit_text_and_graphics_base.cpp dialogs/dialog_global_fp_lib_table_config.cpp + dialogs/dialog_group_properties.cpp dialogs/dialog_group_properties_base.cpp dialogs/dialog_push_pad_properties.cpp dialogs/dialog_push_pad_properties_base.cpp diff --git a/pcbnew/dialogs/dialog_group_properties.cpp b/pcbnew/dialogs/dialog_group_properties.cpp new file mode 100644 index 0000000000..79d5a0f61b --- /dev/null +++ b/pcbnew/dialogs/dialog_group_properties.cpp @@ -0,0 +1,143 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2020 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 2 + * 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, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include + + +DIALOG_GROUP_PROPERTIES::DIALOG_GROUP_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, + PCB_GROUP* aGroup ) : + DIALOG_GROUP_PROPERTIES_BASE( aParent ), + m_brdEditor( aParent ), + m_toolMgr( aParent->GetToolManager() ), + m_group( aGroup ) +{ + m_bpAddMember->SetBitmap( KiBitmap( small_plus_xpm ) ); + m_bpRemoveMember->SetBitmap( KiBitmap( trash_xpm ) ); + + m_nameCtrl->SetValue( m_group->GetName() ); + + for( BOARD_ITEM* item : m_group->GetItems() ) + m_membersList->Append( item->GetSelectMenuText( m_brdEditor->GetUserUnits() ), item ); + + m_sdbSizerOK->SetDefault(); + + SetInitialFocus( m_nameCtrl ); + + // Now all widgets have the size fixed, call FinishDialogSettings + finishDialogSettings(); +} + + +bool DIALOG_GROUP_PROPERTIES::TransferDataToWindow() +{ + // Don't do anything here; it gets called every time we re-show the dialog after + // picking a new member. + return true; +} + + +bool DIALOG_GROUP_PROPERTIES::TransferDataFromWindow() +{ + BOARD_COMMIT commit( m_brdEditor ); + commit.Modify( m_group ); + + m_group->SetName( m_nameCtrl->GetValue() ); + + + m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true ); + m_group->RemoveAll(); + + for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii ) + { + BOARD_ITEM* item = static_cast( m_membersList->GetClientData( ii ) ); + PCB_GROUP* existingGroup = item->GetParentGroup(); + + if( existingGroup ) + { + commit.Modify( existingGroup ); + existingGroup->RemoveItem( item ); + } + + m_group->AddItem( item ); + } + + commit.Push( _( "Modified group" ) ); + m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, m_group ); + + return true; +} + + +void DIALOG_GROUP_PROPERTIES::OnMemberSelected( wxCommandEvent& aEvent ) +{ + int selected = m_membersList->GetSelection(); + + if( selected >= 0 ) + { + WINDOW_THAWER thawer( m_brdEditor ); + BOARD_ITEM* item = static_cast( m_membersList->GetClientData( selected ) ); + + m_brdEditor->FocusOnItem( item ); + m_brdEditor->GetCanvas()->Refresh(); + } + + aEvent.Skip(); +} + + +void DIALOG_GROUP_PROPERTIES::OnAddMember( wxCommandEvent& event ) +{ + m_toolMgr->RunAction( PCB_ACTIONS::pickNewGroupMember, true ); +} + + +void DIALOG_GROUP_PROPERTIES::DoAddMember( EDA_ITEM* aItem ) +{ + for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii ) + { + if( aItem == static_cast( m_membersList->GetClientData( ii ) ) ) + return; + } + + if( aItem == m_group ) + return; + + m_membersList->Append( aItem->GetSelectMenuText( m_brdEditor->GetUserUnits() ), aItem ); +} + + +void DIALOG_GROUP_PROPERTIES::OnRemoveMember( wxCommandEvent& event ) +{ + int selected = m_membersList->GetSelection(); + + if( selected >= 0 ) + m_membersList->Delete( selected ); +} + + diff --git a/pcbnew/dialogs/dialog_group_properties.h b/pcbnew/dialogs/dialog_group_properties.h new file mode 100644 index 0000000000..420824e9d9 --- /dev/null +++ b/pcbnew/dialogs/dialog_group_properties.h @@ -0,0 +1,56 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2020 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 2 + * 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, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef DIALOG_GROUP_PROPERTIES_H +#define DIALOG_GROUP_PROPERTIES_H + +#include + +class PCB_BASE_EDIT_FRAME; +class TOOL_MANAGER; +class PCB_GROUP; + + +class DIALOG_GROUP_PROPERTIES : public DIALOG_GROUP_PROPERTIES_BASE +{ +private: + PCB_BASE_EDIT_FRAME* m_brdEditor; + TOOL_MANAGER* m_toolMgr; + PCB_GROUP* m_group; + +public: + DIALOG_GROUP_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, PCB_GROUP* aTarget ); + ~DIALOG_GROUP_PROPERTIES() { } + + void OnMemberSelected( wxCommandEvent& event ) override; + void OnAddMember( wxCommandEvent& event ) override; + void OnRemoveMember( wxCommandEvent& event ) override; + + void DoAddMember( EDA_ITEM* aItem ); + +private: + bool TransferDataToWindow() override; + bool TransferDataFromWindow() override; +}; + +#endif // DIALOG_GROUP_PROPERTIES_H \ No newline at end of file diff --git a/pcbnew/tools/group_tool.cpp b/pcbnew/tools/group_tool.cpp index 79c7c3543a..b8b766673c 100644 --- a/pcbnew/tools/group_tool.cpp +++ b/pcbnew/tools/group_tool.cpp @@ -29,141 +29,7 @@ #include #include #include -#include -#include "edit_tool.h" - -class DIALOG_GROUP_PROPERTIES : public DIALOG_GROUP_PROPERTIES_BASE -{ -private: - PCB_BASE_EDIT_FRAME* m_brdEditor; - TOOL_MANAGER* m_toolMgr; - PCB_GROUP* m_group; - -public: - DIALOG_GROUP_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, PCB_GROUP* aTarget ); - ~DIALOG_GROUP_PROPERTIES() { } - - void OnMemberSelected( wxCommandEvent& event ) override; - void OnAddMember( wxCommandEvent& event ) override; - void OnRemoveMember( wxCommandEvent& event ) override; - - void DoAddMember( EDA_ITEM* aItem ); - -private: - bool TransferDataToWindow() override; - bool TransferDataFromWindow() override; -}; - - -DIALOG_GROUP_PROPERTIES::DIALOG_GROUP_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent, - PCB_GROUP* aGroup ) : - DIALOG_GROUP_PROPERTIES_BASE( aParent ), - m_brdEditor( aParent ), - m_toolMgr( aParent->GetToolManager() ), - m_group( aGroup ) -{ - m_bpAddMember->SetBitmap( KiBitmap( small_plus_xpm ) ); - m_bpRemoveMember->SetBitmap( KiBitmap( trash_xpm ) ); - - m_nameCtrl->SetValue( m_group->GetName() ); - - for( BOARD_ITEM* item : m_group->GetItems() ) - m_membersList->Append( item->GetSelectMenuText( m_brdEditor->GetUserUnits() ), item ); - - m_sdbSizerOK->SetDefault(); - - SetInitialFocus( m_nameCtrl ); - - // Now all widgets have the size fixed, call FinishDialogSettings - finishDialogSettings(); -} - - -bool DIALOG_GROUP_PROPERTIES::TransferDataToWindow() -{ - // Don't do anything here; it gets called every time we re-show the dialog after - // picking a new member. - return true; -} - - -bool DIALOG_GROUP_PROPERTIES::TransferDataFromWindow() -{ - BOARD_COMMIT commit( m_brdEditor ); - commit.Modify( m_group ); - - m_group->SetName( m_nameCtrl->GetValue() ); - - - m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true ); - m_group->RemoveAll(); - - for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii ) - { - BOARD_ITEM* item = static_cast( m_membersList->GetClientData( ii ) ); - PCB_GROUP* existingGroup = item->GetParentGroup(); - - if( existingGroup ) - { - commit.Modify( existingGroup ); - existingGroup->RemoveItem( item ); - } - - m_group->AddItem( item ); - } - - commit.Push( _( "Modified group" ) ); - m_toolMgr->RunAction( PCB_ACTIONS::selectItem, true, m_group ); - - return true; -} - - -void DIALOG_GROUP_PROPERTIES::OnMemberSelected( wxCommandEvent& aEvent ) -{ - int selected = m_membersList->GetSelection(); - - if( selected >= 0 ) - { - WINDOW_THAWER thawer( m_brdEditor ); - BOARD_ITEM* item = static_cast( m_membersList->GetClientData( selected ) ); - - m_brdEditor->FocusOnItem( item ); - m_brdEditor->GetCanvas()->Refresh(); - } - - aEvent.Skip(); -} - - -void DIALOG_GROUP_PROPERTIES::OnAddMember( wxCommandEvent& event ) -{ - m_toolMgr->RunAction( PCB_ACTIONS::pickNewGroupMember, true ); -} - - -void DIALOG_GROUP_PROPERTIES::DoAddMember( EDA_ITEM* aItem ) -{ - for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii ) - { - if( aItem == static_cast( m_membersList->GetClientData( ii ) ) ) - return; - } - - if( aItem == m_group ) - return; - - m_membersList->Append( aItem->GetSelectMenuText( m_brdEditor->GetUserUnits() ), aItem ); -} - - -void DIALOG_GROUP_PROPERTIES::OnRemoveMember( wxCommandEvent& event ) -{ - int selected = m_membersList->GetSelection(); - - if( selected >= 0 ) - m_membersList->Delete( selected ); -} +#include class GROUP_CONTEXT_MENU : public ACTION_MENU