KiCad PCB EDA Suite
dialog_group_properties.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, you may find one here:
18  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19  * or you may search the http://www.gnu.org website for the version 2 license,
20  * or you may write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22  */
23 
24 #include <tool/tool_manager.h>
25 #include <tools/pcb_actions.h>
26 #include <tools/pcb_picker_tool.h>
27 #include <pcb_base_edit_frame.h>
28 #include <pcb_group.h>
29 #include <status_popup.h>
30 #include <board_commit.h>
31 #include <bitmaps.h>
33 
34 
36  PCB_GROUP* aGroup ) :
38  m_brdEditor( aParent ),
39  m_toolMgr( aParent->GetToolManager() ),
40  m_group( aGroup )
41 {
44 
45  m_nameCtrl->SetValue( m_group->GetName() );
46  m_locked->SetValue( m_group->IsLocked() );
47 
48  for( BOARD_ITEM* item : m_group->GetItems() )
49  m_membersList->Append( item->GetSelectMenuText( m_brdEditor->GetUserUnits() ), item );
50 
51  m_sdbSizerOK->SetDefault();
52 
54 
55  // Now all widgets have the size fixed, call FinishDialogSettings
57 }
58 
59 
61 {
62  if( m_brdEditor->IsBeingDeleted() )
63  return;
64 
65  m_brdEditor->FocusOnItem( nullptr );
67 }
68 
69 
71 {
72  // Don't do anything here; it gets called every time we re-show the dialog after
73  // picking a new member.
74  return true;
75 }
76 
77 
79 {
80  BOARD_COMMIT commit( m_brdEditor );
81  commit.Modify( m_group );
82 
84  [&]( BOARD_ITEM* descendant )
85  {
86  commit.Modify( descendant );
87  } );
88 
89  for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii )
90  {
91  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( m_membersList->GetClientData( ii ) );
92  PCB_GROUP* existingGroup = item->GetParentGroup();
93 
94  if( existingGroup != m_group )
95  {
96  commit.Modify( item );
97 
98  if( existingGroup )
99  commit.Modify( existingGroup );
100  }
101  }
102 
103  m_group->SetName( m_nameCtrl->GetValue() );
104  m_group->SetLocked( m_locked->GetValue() );
105 
107  m_group->RemoveAll();
108 
109  for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii )
110  {
111  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( m_membersList->GetClientData( ii ) );
112  m_group->AddItem( item );
113  }
114 
116 
117  commit.Push( _( "Modified group" ) );
118  return true;
119 }
120 
121 
122 void DIALOG_GROUP_PROPERTIES::OnMemberSelected( wxCommandEvent& aEvent )
123 {
124  int selected = m_membersList->GetSelection();
125 
126  if( selected >= 0 )
127  {
128  WINDOW_THAWER thawer( m_brdEditor );
129  BOARD_ITEM* item = static_cast<BOARD_ITEM*>( m_membersList->GetClientData( selected ) );
130 
131  m_brdEditor->FocusOnItem( item );
133  }
134 
135  aEvent.Skip();
136 }
137 
138 
139 void DIALOG_GROUP_PROPERTIES::OnAddMember( wxCommandEvent& event )
140 {
142 }
143 
144 
146 {
147  for( size_t ii = 0; ii < m_membersList->GetCount(); ++ii )
148  {
149  if( aItem == static_cast<BOARD_ITEM*>( m_membersList->GetClientData( ii ) ) )
150  return;
151  }
152 
153  if( aItem == m_group )
154  return;
155 
156  m_membersList->Append( aItem->GetSelectMenuText( m_brdEditor->GetUserUnits() ), aItem );
157 }
158 
159 
160 void DIALOG_GROUP_PROPERTIES::OnRemoveMember( wxCommandEvent& event )
161 {
162  int selected = m_membersList->GetSelection();
163 
164  if( selected >= 0 )
165  m_membersList->Delete( selected );
166 
167  m_brdEditor->FocusOnItem( nullptr );
169 }
170 
171 
static TOOL_ACTION selectionClear
Clear the current selection.
Definition: pcb_actions.h:59
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:91
void RemoveAll()
Definition: pcb_group.cpp:63
bool AddItem(BOARD_ITEM *aItem)
Add item to group.
Definition: pcb_group.cpp:38
COMMIT & Modify(EDA_ITEM *aItem)
Create an undo entry for an item that has been already modified.
Definition: commit.h:103
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:80
A set of BOARD_ITEMs (i.e., without duplicates).
Definition: pcb_group.h:50
void OnAddMember(wxCommandEvent &event) override
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:143
virtual void SetLocked(bool aLocked)
Modify the 'lock' status for of the item.
Definition: board_item.h:252
virtual bool IsLocked() const
Definition: board_item.cpp:65
std::unordered_set< BOARD_ITEM * > & GetItems()
Definition: pcb_group.h:68
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
Definition: dialog_shim.h:97
wxString GetName() const
Definition: pcb_group.h:65
void OnRemoveMember(wxCommandEvent &event) override
static TOOL_ACTION pickNewGroupMember
Definition: pcb_actions.h:220
void DoAddMember(EDA_ITEM *aItem)
#define _(s)
void RunOnDescendants(const std::function< void(BOARD_ITEM *)> &aFunction) const
Invoke a function on all descendants of the group.
Definition: pcb_group.cpp:344
void OnMemberSelected(wxCommandEvent &event) override
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:105
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
DIALOG_GROUP_PROPERTIES(PCB_BASE_EDIT_FRAME *aParent, PCB_GROUP *aTarget)
Common, abstract interface for edit frames.
virtual wxString GetSelectMenuText(EDA_UNITS aUnits) const
Return the text to display to be used in the selection clarification context menu when multiple items...
Definition: eda_item.cpp:109
static TOOL_ACTION selectItem
Select an item (specified as the event parameter).
Definition: pcb_actions.h:62
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:100
virtual void Push(const wxString &aMessage=wxT("A commit"), bool aCreateUndoEntry=true, bool aSetDirtyBit=true) override
Revert the commit by restoring the modified items state.
PCB_BASE_EDIT_FRAME * m_brdEditor
Class DIALOG_GROUP_PROPERTIES_BASE.
void FocusOnItem(BOARD_ITEM *aItem)
EDA_UNITS GetUserUnits() const
Return the user units currently in use.
void SetName(const wxString &aName)
Definition: pcb_group.h:66