Read/write group locked state. Show locked state in dialog & statusbar.
Fixes https://gitlab.com/kicad/code/kicad/issues/8796
This commit is contained in:
parent
49e1b5785f
commit
a16b85db67
|
@ -244,10 +244,7 @@ public:
|
||||||
/**
|
/**
|
||||||
* @return true if the object is locked, else false.
|
* @return true if the object is locked, else false.
|
||||||
*/
|
*/
|
||||||
virtual bool IsLocked() const
|
virtual bool IsLocked() const;
|
||||||
{
|
|
||||||
return GetState( LOCKED );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modify the 'lock' status for of the item.
|
* Modify the 'lock' status for of the item.
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <wx/debug.h>
|
#include <wx/debug.h>
|
||||||
#include <i18n_utility.h>
|
#include <i18n_utility.h>
|
||||||
#include <board.h>
|
#include <board.h>
|
||||||
|
#include <pcb_group.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <wx/msgdlg.h>
|
#include <wx/msgdlg.h>
|
||||||
|
|
||||||
|
@ -61,6 +62,15 @@ BOARD* BOARD_ITEM::GetBoard() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool BOARD_ITEM::IsLocked() const
|
||||||
|
{
|
||||||
|
if( GetParentGroup() )
|
||||||
|
return GetParentGroup()->IsLocked();
|
||||||
|
|
||||||
|
return GetState( LOCKED );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
wxString BOARD_ITEM::GetLayerName() const
|
wxString BOARD_ITEM::GetLayerName() const
|
||||||
{
|
{
|
||||||
BOARD* board = GetBoard();
|
BOARD* board = GetBoard();
|
||||||
|
|
|
@ -43,6 +43,7 @@ DIALOG_GROUP_PROPERTIES::DIALOG_GROUP_PROPERTIES( PCB_BASE_EDIT_FRAME* aParent,
|
||||||
m_bpRemoveMember->SetBitmap( KiBitmap( BITMAPS::small_trash ) );
|
m_bpRemoveMember->SetBitmap( KiBitmap( BITMAPS::small_trash ) );
|
||||||
|
|
||||||
m_nameCtrl->SetValue( m_group->GetName() );
|
m_nameCtrl->SetValue( m_group->GetName() );
|
||||||
|
m_locked->SetValue( m_group->IsLocked() );
|
||||||
|
|
||||||
for( BOARD_ITEM* item : m_group->GetItems() )
|
for( BOARD_ITEM* item : m_group->GetItems() )
|
||||||
m_membersList->Append( item->GetSelectMenuText( m_brdEditor->GetUserUnits() ), item );
|
m_membersList->Append( item->GetSelectMenuText( m_brdEditor->GetUserUnits() ), item );
|
||||||
|
@ -100,6 +101,7 @@ bool DIALOG_GROUP_PROPERTIES::TransferDataFromWindow()
|
||||||
}
|
}
|
||||||
|
|
||||||
m_group->SetName( m_nameCtrl->GetValue() );
|
m_group->SetName( m_nameCtrl->GetValue() );
|
||||||
|
m_group->SetLocked( m_locked->GetValue() );
|
||||||
|
|
||||||
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true );
|
||||||
m_group->RemoveAll();
|
m_group->RemoveAll();
|
||||||
|
|
|
@ -33,7 +33,12 @@ DIALOG_GROUP_PROPERTIES_BASE::DIALOG_GROUP_PROPERTIES_BASE( wxWindow* parent, wx
|
||||||
fgSizer1->Add( m_nameCtrl, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
|
fgSizer1->Add( m_nameCtrl, 0, wxALL|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 );
|
||||||
|
|
||||||
|
|
||||||
bSizerUpper->Add( fgSizer1, 0, wxEXPAND|wxBOTTOM, 5 );
|
bSizerUpper->Add( fgSizer1, 0, wxEXPAND, 5 );
|
||||||
|
|
||||||
|
m_locked = new wxCheckBox( this, wxID_ANY, _("Locked"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
|
m_locked->SetToolTip( _("Prevents group from being moved on canvas") );
|
||||||
|
|
||||||
|
bSizerUpper->Add( m_locked, 0, wxALL, 5 );
|
||||||
|
|
||||||
m_membersLabel = new wxStaticText( this, wxID_ANY, _("Group members:"), wxDefaultPosition, wxDefaultSize, 0 );
|
m_membersLabel = new wxStaticText( this, wxID_ANY, _("Group members:"), wxDefaultPosition, wxDefaultSize, 0 );
|
||||||
m_membersLabel->Wrap( -1 );
|
m_membersLabel->Wrap( -1 );
|
||||||
|
|
|
@ -70,7 +70,7 @@
|
||||||
<property name="permission">none</property>
|
<property name="permission">none</property>
|
||||||
<object class="sizeritem" expanded="1">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxEXPAND|wxBOTTOM</property>
|
<property name="flag">wxEXPAND</property>
|
||||||
<property name="proportion">0</property>
|
<property name="proportion">0</property>
|
||||||
<object class="wxFlexGridSizer" expanded="1">
|
<object class="wxFlexGridSizer" expanded="1">
|
||||||
<property name="cols">2</property>
|
<property name="cols">2</property>
|
||||||
|
@ -211,6 +211,70 @@
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="sizeritem" expanded="1">
|
||||||
|
<property name="border">5</property>
|
||||||
|
<property name="flag">wxALL</property>
|
||||||
|
<property name="proportion">0</property>
|
||||||
|
<object class="wxCheckBox" expanded="1">
|
||||||
|
<property name="BottomDockable">1</property>
|
||||||
|
<property name="LeftDockable">1</property>
|
||||||
|
<property name="RightDockable">1</property>
|
||||||
|
<property name="TopDockable">1</property>
|
||||||
|
<property name="aui_layer"></property>
|
||||||
|
<property name="aui_name"></property>
|
||||||
|
<property name="aui_position"></property>
|
||||||
|
<property name="aui_row"></property>
|
||||||
|
<property name="best_size"></property>
|
||||||
|
<property name="bg"></property>
|
||||||
|
<property name="caption"></property>
|
||||||
|
<property name="caption_visible">1</property>
|
||||||
|
<property name="center_pane">0</property>
|
||||||
|
<property name="checked">0</property>
|
||||||
|
<property name="close_button">1</property>
|
||||||
|
<property name="context_help"></property>
|
||||||
|
<property name="context_menu">1</property>
|
||||||
|
<property name="default_pane">0</property>
|
||||||
|
<property name="dock">Dock</property>
|
||||||
|
<property name="dock_fixed">0</property>
|
||||||
|
<property name="docking">Left</property>
|
||||||
|
<property name="enabled">1</property>
|
||||||
|
<property name="fg"></property>
|
||||||
|
<property name="floatable">1</property>
|
||||||
|
<property name="font"></property>
|
||||||
|
<property name="gripper">0</property>
|
||||||
|
<property name="hidden">0</property>
|
||||||
|
<property name="id">wxID_ANY</property>
|
||||||
|
<property name="label">Locked</property>
|
||||||
|
<property name="max_size"></property>
|
||||||
|
<property name="maximize_button">0</property>
|
||||||
|
<property name="maximum_size"></property>
|
||||||
|
<property name="min_size"></property>
|
||||||
|
<property name="minimize_button">0</property>
|
||||||
|
<property name="minimum_size"></property>
|
||||||
|
<property name="moveable">1</property>
|
||||||
|
<property name="name">m_locked</property>
|
||||||
|
<property name="pane_border">1</property>
|
||||||
|
<property name="pane_position"></property>
|
||||||
|
<property name="pane_size"></property>
|
||||||
|
<property name="permission">protected</property>
|
||||||
|
<property name="pin_button">1</property>
|
||||||
|
<property name="pos"></property>
|
||||||
|
<property name="resize">Resizable</property>
|
||||||
|
<property name="show">1</property>
|
||||||
|
<property name="size"></property>
|
||||||
|
<property name="style"></property>
|
||||||
|
<property name="subclass">; ; forward_declare</property>
|
||||||
|
<property name="toolbar_pane">0</property>
|
||||||
|
<property name="tooltip">Prevents group from being moved on canvas</property>
|
||||||
|
<property name="validator_data_type"></property>
|
||||||
|
<property name="validator_style">wxFILTER_NONE</property>
|
||||||
|
<property name="validator_type">wxDefaultValidator</property>
|
||||||
|
<property name="validator_variable"></property>
|
||||||
|
<property name="window_extra_style"></property>
|
||||||
|
<property name="window_name"></property>
|
||||||
|
<property name="window_style"></property>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
<object class="sizeritem" expanded="1">
|
<object class="sizeritem" expanded="1">
|
||||||
<property name="border">5</property>
|
<property name="border">5</property>
|
||||||
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
|
<property name="flag">wxTOP|wxRIGHT|wxLEFT</property>
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <wx/settings.h>
|
#include <wx/settings.h>
|
||||||
#include <wx/textctrl.h>
|
#include <wx/textctrl.h>
|
||||||
#include <wx/sizer.h>
|
#include <wx/sizer.h>
|
||||||
|
#include <wx/checkbox.h>
|
||||||
#include <wx/listbox.h>
|
#include <wx/listbox.h>
|
||||||
#include <wx/bmpbuttn.h>
|
#include <wx/bmpbuttn.h>
|
||||||
#include <wx/bitmap.h>
|
#include <wx/bitmap.h>
|
||||||
|
@ -41,6 +42,7 @@ class DIALOG_GROUP_PROPERTIES_BASE : public DIALOG_SHIM
|
||||||
protected:
|
protected:
|
||||||
wxStaticText* m_nameLabel;
|
wxStaticText* m_nameLabel;
|
||||||
wxTextCtrl* m_nameCtrl;
|
wxTextCtrl* m_nameCtrl;
|
||||||
|
wxCheckBox* m_locked;
|
||||||
wxStaticText* m_membersLabel;
|
wxStaticText* m_membersLabel;
|
||||||
wxListBox* m_membersList;
|
wxListBox* m_membersList;
|
||||||
wxBitmapButton* m_bpAddMember;
|
wxBitmapButton* m_bpAddMember;
|
||||||
|
|
|
@ -321,6 +321,9 @@ void PCB_GROUP::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_I
|
||||||
{
|
{
|
||||||
aList.emplace_back( _( "Group" ), m_name.empty() ? _( "<unnamed>" ) : m_name );
|
aList.emplace_back( _( "Group" ), m_name.empty() ? _( "<unnamed>" ) : m_name );
|
||||||
aList.emplace_back( _( "Members" ), wxString::Format( "%zu", m_items.size() ) );
|
aList.emplace_back( _( "Members" ), wxString::Format( "%zu", m_items.size() ) );
|
||||||
|
|
||||||
|
if( IsLocked() )
|
||||||
|
aList.emplace_back( _( "Status" ), _( "Locked" ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1728,8 +1728,9 @@ void PCB_IO::format( const PCB_GROUP* aGroup, int aNestLevel ) const
|
||||||
if( aGroup->GetItems().empty() )
|
if( aGroup->GetItems().empty() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
m_out->Print( aNestLevel, "(group %s (id %s)\n",
|
m_out->Print( aNestLevel, "(group %s%s (id %s)\n",
|
||||||
m_out->Quotew( aGroup->GetName() ).c_str(),
|
m_out->Quotew( aGroup->GetName() ).c_str(),
|
||||||
|
aGroup->IsLocked() ? " locked" : "",
|
||||||
TO_UTF8( aGroup->m_Uuid.AsString() ) );
|
TO_UTF8( aGroup->m_Uuid.AsString() ) );
|
||||||
|
|
||||||
m_out->Print( aNestLevel + 1, "(members\n" );
|
m_out->Print( aNestLevel + 1, "(members\n" );
|
||||||
|
|
|
@ -98,7 +98,8 @@ class PCB_TEXT;
|
||||||
//#define SEXPR_BOARD_FILE_VERSION 20210228 // Move global margins back to board file
|
//#define SEXPR_BOARD_FILE_VERSION 20210228 // Move global margins back to board file
|
||||||
//#define SEXPR_BOARD_FILE_VERSION 20210424 // Correct locked flag syntax (remove parens).
|
//#define SEXPR_BOARD_FILE_VERSION 20210424 // Correct locked flag syntax (remove parens).
|
||||||
//#define SEXPR_BOARD_FILE_VERSION 20210606 // Change overbar syntax from `~...~` to `~{...}`.
|
//#define SEXPR_BOARD_FILE_VERSION 20210606 // Change overbar syntax from `~...~` to `~{...}`.
|
||||||
#define SEXPR_BOARD_FILE_VERSION 20210623 // Add support for reading/writing arcs in polygons
|
//#define SEXPR_BOARD_FILE_VERSION 20210623 // Add support for reading/writing arcs in polygons
|
||||||
|
#define SEXPR_BOARD_FILE_VERSION 20210722 // Reading/writing group locked flags
|
||||||
|
|
||||||
#define BOARD_FILE_HOST_VERSION 20200825 ///< Earlier files than this include the host tag
|
#define BOARD_FILE_HOST_VERSION 20200825 ///< Earlier files than this include the host tag
|
||||||
|
|
||||||
|
|
|
@ -964,6 +964,9 @@ void PCB_PARSER::resolveGroups( BOARD_ITEM* aParent )
|
||||||
group->SetName( aGrp.name );
|
group->SetName( aGrp.name );
|
||||||
const_cast<KIID&>( group->m_Uuid ) = aGrp.uuid;
|
const_cast<KIID&>( group->m_Uuid ) = aGrp.uuid;
|
||||||
|
|
||||||
|
if( aGrp.locked )
|
||||||
|
group->SetLocked( true );
|
||||||
|
|
||||||
if( aGrp.parent->Type() == PCB_FOOTPRINT_T )
|
if( aGrp.parent->Type() == PCB_FOOTPRINT_T )
|
||||||
static_cast<FOOTPRINT*>( aGrp.parent )->Add( group );
|
static_cast<FOOTPRINT*>( aGrp.parent )->Add( group );
|
||||||
else
|
else
|
||||||
|
@ -4472,23 +4475,20 @@ void PCB_PARSER::parseGROUP( BOARD_ITEM* aParent )
|
||||||
|
|
||||||
token = NextTok();
|
token = NextTok();
|
||||||
|
|
||||||
if( token != T_LEFT )
|
while( ( token = NextTok() ) != T_LEFT )
|
||||||
{
|
{
|
||||||
// Optional group name present.
|
if( token == T_STRING )
|
||||||
|
groupInfo.name = FromUTF8();
|
||||||
if( !IsSymbol( token ) )
|
else if( token == T_locked )
|
||||||
Expecting( DSN_SYMBOL );
|
groupInfo.locked = true;
|
||||||
|
else
|
||||||
groupInfo.name = FromUTF8();
|
Expecting( "group name or locked" );
|
||||||
}
|
}
|
||||||
|
|
||||||
NeedLEFT();
|
|
||||||
token = NextTok();
|
token = NextTok();
|
||||||
|
|
||||||
if( token != T_id )
|
if( token != T_id )
|
||||||
{
|
|
||||||
Expecting( T_id );
|
Expecting( T_id );
|
||||||
}
|
|
||||||
|
|
||||||
NextTok();
|
NextTok();
|
||||||
groupInfo.uuid = CurStrToKIID();
|
groupInfo.uuid = CurStrToKIID();
|
||||||
|
@ -4498,9 +4498,7 @@ void PCB_PARSER::parseGROUP( BOARD_ITEM* aParent )
|
||||||
token = NextTok();
|
token = NextTok();
|
||||||
|
|
||||||
if( token != T_members )
|
if( token != T_members )
|
||||||
{
|
|
||||||
Expecting( T_members );
|
Expecting( T_members );
|
||||||
}
|
|
||||||
|
|
||||||
while( ( token = NextTok() ) != T_RIGHT )
|
while( ( token = NextTok() ) != T_RIGHT )
|
||||||
{
|
{
|
||||||
|
|
|
@ -381,6 +381,7 @@ private:
|
||||||
{
|
{
|
||||||
BOARD_ITEM* parent;
|
BOARD_ITEM* parent;
|
||||||
wxString name;
|
wxString name;
|
||||||
|
bool locked;
|
||||||
KIID uuid;
|
KIID uuid;
|
||||||
std::vector<KIID> memberUuids;
|
std::vector<KIID> memberUuids;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue