/* * Set or clear the component alternate body style ( DeMorgan ). */ bool DIALOG_EDIT_COMPONENT_IN_LIBRARY::SetUnsetConvert() { LIB_PART* component = m_Parent->GetCurPart(); if( component == NULL || ( m_Parent->GetShowDeMorgan() == component->HasConversion() ) ) return false; if( m_Parent->GetShowDeMorgan() ) { if( !IsOK( this, _( "Add new pins for alternate body style ( DeMorgan ) to component?" ) ) ) return false; } else if( component->HasConversion() ) { if( !IsOK( this, _( "Delete alternate body style (DeMorgan) draw items from component?" ) ) ) { m_Parent->SetShowDeMorgan( true ); return false; } } component->SetConversion( m_Parent->GetShowDeMorgan() ); m_Parent->OnModify(); return true; }
void LIB_EDIT_FRAME::OnUpdateDeMorganConvert( wxUpdateUIEvent& event ) { LIB_PART* part = GetCurPart(); event.Enable( GetShowDeMorgan() || ( part && part->HasConversion() ) ); event.Check( m_convert > 1 ); }
bool LIB_EDIT_FRAME::SynchronizePins() { LIB_PART* part = GetCurPart(); return !m_editPinsPerPartOrConvert && ( part && ( part->HasConversion() || part->IsMulti() ) ); }
void LIB_EDIT_FRAME::OnUpdateDeMorganNormal( wxUpdateUIEvent& event ) { if( m_mainToolBar == NULL ) return; LIB_PART* part = GetCurPart(); event.Enable( GetShowDeMorgan() || ( part && part->HasConversion() ) ); event.Check( m_convert <= 1 ); }
void LIB_VIEW_FRAME::onUpdateNormalBodyStyleButton( wxUpdateUIEvent& aEvent ) { LIB_PART* symbol = getSelectedSymbol(); aEvent.Enable( symbol && symbol->HasConversion() ); if( symbol ) aEvent.Check( m_convert <= 1 ); else aEvent.Check( true ); }
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent, wxDC* DC ) { if( !aComponent ) return; LIB_ID id = aComponent->GetLibId(); LIB_PART* part = GetLibPart( id ); if( part ) { wxString msg; if( !part->HasConversion() ) { msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ), id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() ); DisplayError( this, msg ); return; } STATUS_FLAGS flags = aComponent->GetFlags(); if( aComponent->GetFlags() ) aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode, g_GhostColor ); else aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode ); aComponent->SetConvert( aComponent->GetConvert() + 1 ); // ensure m_Convert = 0, 1 or 2 // 0 and 1 = shape 1 = not converted // 2 = shape 2 = first converted shape // > 2 is not used but could be used for more shapes // like multiple shapes for a programmable component // When m_Convert = val max, return to the first shape if( aComponent->GetConvert() > 2 ) aComponent->SetConvert( 1 ); // The alternate symbol may cause a change in the connection status so test the // connections so the connection indicators are drawn correctly. GetScreen()->TestDanglingEnds(); aComponent->ClearFlags(); aComponent->SetFlags( flags ); // Restore m_Flag (modified by SetConvert()) /* Redraw the component in the new position. */ if( aComponent->IsMoving() ) aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode, g_GhostColor ); else aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); OnModify(); } }
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent ) { if( !aComponent ) return; LIB_ID id = aComponent->GetLibId(); LIB_PART* part = GetLibPart( id ); if( part ) { wxString msg; if( !part->HasConversion() ) { msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ), id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() ); DisplayError( this, msg ); return; } STATUS_FLAGS savedFlags = aComponent->GetFlags(); aComponent->SetConvert( aComponent->GetConvert() + 1 ); // ensure m_Convert = 1 or 2 // 1 = shape 1 = not converted // 2 = shape 2 = first converted shape // > 2 is not used but could be used for more shapes // like multiple shapes for a programmable component // When m_Convert = val max, return to the first shape if( aComponent->GetConvert() > LIB_ITEM::LIB_CONVERT::DEMORGAN ) aComponent->SetConvert( LIB_ITEM::LIB_CONVERT::BASE ); // The alternate symbol may cause a change in the connection status so test the // connections so the connection indicators are drawn correctly. aComponent->UpdatePins(); TestDanglingEnds(); aComponent->ClearFlags(); aComponent->SetFlags( savedFlags ); // Restore m_Flags (modified by SetConvert()) // If selected make sure all the now-included pins are selected if( aComponent->IsSelected() ) m_toolManager->RunAction( EE_ACTIONS::addItemToSel, true, aComponent ); RefreshItem( aComponent ); OnModify(); } }
bool LIB_EDIT_FRAME::LoadOneLibraryPartAux( LIB_ALIAS* aEntry, PART_LIB* aLibrary ) { wxString msg, rootName; if( !aEntry || !aLibrary ) return false; if( aEntry->GetName().IsEmpty() ) { wxLogWarning( "Entry in library <%s> has empty name field.", GetChars( aLibrary->GetName() ) ); return false; } wxString cmpName = m_aliasName = aEntry->GetName(); LIB_PART* lib_part = aEntry->GetPart(); wxASSERT( lib_part ); wxLogDebug( "\"<%s>\" is alias of \"<%s>\"", GetChars( cmpName ), GetChars( lib_part->GetName() ) ); LIB_PART* part = new LIB_PART( *lib_part ); // clone it and own it. SetCurPart( part ); m_aliasName = aEntry->GetName(); m_unit = 1; m_convert = 1; m_showDeMorgan = false; if( part->HasConversion() ) m_showDeMorgan = true; GetScreen()->ClrModify(); DisplayLibInfos(); UpdateAliasSelectList(); UpdatePartSelectList(); // Display the document information based on the entry selected just in // case the entry is an alias. DisplayCmpDoc(); return true; }
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent ) { if( !aComponent ) return; LIB_ID id = aComponent->GetLibId(); LIB_PART* part = GetLibPart( id ); if( part ) { wxString msg; if( !part->HasConversion() ) { msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ), id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() ); DisplayError( this, msg ); return; } STATUS_FLAGS flags = aComponent->GetFlags(); aComponent->SetConvert( aComponent->GetConvert() + 1 ); // ensure m_Convert = 0, 1 or 2 // 0 and 1 = shape 1 = not converted // 2 = shape 2 = first converted shape // > 2 is not used but could be used for more shapes // like multiple shapes for a programmable component // When m_Convert = val max, return to the first shape if( aComponent->GetConvert() > 2 ) aComponent->SetConvert( 1 ); // The alternate symbol may cause a change in the connection status so test the // connections so the connection indicators are drawn correctly. aComponent->UpdatePins(); TestDanglingEnds(); aComponent->ClearFlags(); aComponent->SetFlags( flags ); // Restore m_Flag (modified by SetConvert()) RefreshItem( aComponent ); OnModify(); } }
void LIB_EDIT_FRAME::GetComponentFromUndoList( wxCommandEvent& event ) { if( GetScreen()->GetUndoCommandCount() <= 0 ) return; PICKED_ITEMS_LIST* lastcmd = new PICKED_ITEMS_LIST(); LIB_PART* part = GetCurPart(); ITEM_PICKER wrapper( part, UR_LIBEDIT ); lastcmd->PushItem( wrapper ); GetScreen()->PushCommandToRedoList( lastcmd ); lastcmd = GetScreen()->PopCommandFromUndoList(); wrapper = lastcmd->PopItem(); part = (LIB_PART* ) wrapper.GetItem(); // Do not delete the previous part by calling SetCurPart( part ), // which calls delete <previous part>. // <previous part> is now put in redo list and is owned by this list. // Just set the current part to the part which come from the undo list m_my_part = part; if( !part ) return; if( !m_aliasName.IsEmpty() && !part->HasAlias( m_aliasName ) ) m_aliasName = part->GetName(); m_drawItem = NULL; UpdateAliasSelectList(); UpdatePartSelectList(); SetShowDeMorgan( part->HasConversion() ); DisplayLibInfos(); DisplayCmpDoc(); OnModify(); m_canvas->Refresh(); }
bool DIALOG_LIB_EDIT_DRAW_ITEM::TransferDataToWindow() { LIB_PART* symbol = m_item->GetParent(); m_lineWidth.SetValue( m_item->GetWidth() ); m_checkApplyToAllUnits->SetValue( m_item->GetUnit() == 0 ); m_checkApplyToAllUnits->Enable( symbol && symbol->GetUnitCount() > 1 ); m_checkApplyToAllConversions->SetValue( m_item->GetConvert() == 0 ); bool enblConvOptStyle = symbol && symbol->HasConversion(); // if a symbol contains no graphic items, symbol->HasConversion() returns false. // but when creating a new symbol, with DeMorgan option set, the ApplyToAllConversions // must be enabled even if symbol->HasConversion() returns false in order to be able // to create graphic items shared by all body styles if( m_frame->GetShowDeMorgan() ) enblConvOptStyle = true; m_checkApplyToAllConversions->Enable( enblConvOptStyle ); m_fillCtrl->SetSelection( m_item->GetFillMode() ); m_fillCtrl->Enable( m_item->IsFillable() ); return true; }
void LIB_EDIT_FRAME::EditGraphicSymbol( wxDC* DC, LIB_ITEM* DrawItem ) { if( DrawItem == NULL ) return; LIB_PART* symbol = DrawItem->GetParent(); DIALOG_LIB_EDIT_DRAW_ITEM dialog( this, DrawItem->GetTypeName() ); dialog.SetWidthUnits( ReturnUnitSymbol( g_UserUnit ) ); wxString val = StringFromValue( g_UserUnit, DrawItem->GetWidth() ); dialog.SetWidth( val ); dialog.SetApplyToAllUnits( DrawItem->GetUnit() == 0 ); dialog.EnableApplyToAllUnits( symbol && symbol->GetUnitCount() > 1 ); dialog.SetApplyToAllConversions( DrawItem->GetConvert() == 0 ); bool enblConvOptStyle = symbol && symbol->HasConversion(); // if a symbol contains no graphic items, symbol->HasConversion() returns false. // but when creating a new symbol, with DeMorgan option set, the ApplyToAllConversions // must be enabled even if symbol->HasConversion() returns false in order to be able // to create graphic items shared by all body styles if( GetShowDeMorgan() ) enblConvOptStyle = true; dialog.EnableApplyToAllConversions( enblConvOptStyle ); dialog.SetFillStyle( DrawItem->GetFillMode() ); dialog.EnableFillStyle( DrawItem->IsFillable() ); if( dialog.ShowModal() == wxID_CANCEL ) return; // Init default values (used to create a new draw item) val = dialog.GetWidth(); m_drawLineWidth = ValueFromString( g_UserUnit, val ); m_drawSpecificConvert = !dialog.GetApplyToAllConversions(); m_drawSpecificUnit = !dialog.GetApplyToAllUnits(); #if 0 /* TODO: see if m_drawFillStyle must retain the last fill option or not. * if the last is Filled, having next new graphic items created * with filled body is often bad. * currently m_drawFillStyle is left with the default value (not filled) */ if( DrawItem->IsFillable() ) m_drawFillStyle = (FILL_T) dialog.GetFillStyle(); #endif // Save copy for undo if not in edit (edit command already handle the save copy) if( !DrawItem->InEditMode() ) SaveCopyInUndoList( DrawItem->GetParent() ); if( m_drawSpecificUnit ) DrawItem->SetUnit( GetUnit() ); else DrawItem->SetUnit( 0 ); if( m_drawSpecificConvert ) DrawItem->SetConvert( GetConvert() ); else DrawItem->SetConvert( 0 ); if( DrawItem->IsFillable() ) DrawItem->SetFillMode( (FILL_T) dialog.GetFillStyle() ); DrawItem->SetWidth( m_drawLineWidth ); OnModify( ); MSG_PANEL_ITEMS items; DrawItem->GetMsgPanelInfo( items ); SetMsgPanel( items ); m_canvas->Refresh(); }
void AddMenusForEditComponent( wxMenu* PopMenu, SCH_COMPONENT* Component, PART_LIBS* aLibs ) { if( Component->Type() != SCH_COMPONENT_T ) { wxASSERT( 0 ); return; } wxString msg; LIB_PART* part = NULL; LIB_ALIAS* libEntry = aLibs->FindLibraryEntry( Component->GetPartName() ); if( libEntry ) part = libEntry->GetPart(); wxMenu* editmenu = new wxMenu; msg = AddHotkeyName( _( "Edit" ), g_Schematic_Hokeys_Descr, HK_EDIT ); AddMenuItem( editmenu, ID_SCH_EDIT_ITEM, msg, KiBitmap( edit_component_xpm ) ); if( part && part->IsNormal() ) { msg = AddHotkeyName( _( "Value" ), g_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_VALUE ); AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_VALUE, msg, KiBitmap( edit_comp_value_xpm ) ); msg = AddHotkeyName( _( "Reference" ), g_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_REFERENCE ); AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_REFERENCE, msg, KiBitmap( edit_comp_ref_xpm ) ); msg = AddHotkeyName( _( "Footprint" ), g_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_FOOTPRINT ); AddMenuItem( editmenu, ID_SCH_EDIT_COMPONENT_FOOTPRINT, msg, KiBitmap( edit_comp_footprint_xpm ) ); } if( part && part->HasConversion() ) AddMenuItem( editmenu, ID_POPUP_SCH_EDIT_CONVERT_CMP, _( "Convert" ), KiBitmap( component_select_alternate_shape_xpm ) ); if( part && part->GetUnitCount() >= 2 ) { wxMenu* sel_unit_menu = new wxMenu; int ii; for( ii = 0; ii < part->GetUnitCount(); ii++ ) { wxString num_unit; int unit = Component->GetUnit(); num_unit.Printf( _( "Unit %s" ), GetChars( LIB_PART::SubReference( ii + 1, false ) ) ); wxMenuItem * item = sel_unit_menu->Append( ID_POPUP_SCH_SELECT_UNIT1 + ii, num_unit, wxEmptyString, wxITEM_CHECK ); if( unit == ii + 1 ) item->Check(true); // The ID max for these submenus is ID_POPUP_SCH_SELECT_UNIT_CMP_MAX // See eeschema_id to modify this value. if( ii >= (ID_POPUP_SCH_SELECT_UNIT_CMP_MAX - ID_POPUP_SCH_SELECT_UNIT1) ) break; // We have used all IDs for these submenus } AddMenuItem( editmenu, sel_unit_menu, ID_POPUP_SCH_SELECT_UNIT_CMP, _( "Unit" ), KiBitmap( component_select_unit_xpm ) ); } if( !Component->GetFlags() ) { msg = AddHotkeyName( _( "Edit with Library Editor" ), g_Schematic_Hokeys_Descr, HK_EDIT_COMPONENT_WITH_LIBEDIT ); AddMenuItem( editmenu, ID_POPUP_SCH_CALL_LIBEDIT_AND_LOAD_CMP, msg, KiBitmap( libedit_xpm ) ); } AddMenuItem( PopMenu, editmenu, ID_SCH_EDIT_ITEM, _( "Edit Component" ), KiBitmap( edit_component_xpm ) ); }