diff --git a/common/dialogs/dialog_page_settings.cpp b/common/dialogs/dialog_page_settings.cpp index e38b28adc0..dfce4aa33c 100644 --- a/common/dialogs/dialog_page_settings.cpp +++ b/common/dialogs/dialog_page_settings.cpp @@ -51,33 +51,6 @@ #define MAX_PAGE_EXAMPLE_SIZE 200 -// List of page formats. -// they are prefixed by "_HKI" (already in use for hotkeys) instead of "_", -// because we need both the translated and the not translated version. -// when displayed in dialog we should explicitly call wxGetTranslation() -// to show the translated version. -// See hotkeys_basic.h for more info -#define _HKI( x ) wxT( x ) -static const wxString pageFmts[] = -{ - _HKI("A5 148x210mm"), - _HKI("A4 210x297mm"), - _HKI("A3 297x420mm"), - _HKI("A2 420x594mm"), - _HKI("A1 594x841mm"), - _HKI("A0 841x1189mm"), - _HKI("A 8.5x11in"), - _HKI("B 11x17in"), - _HKI("C 17x22in"), - _HKI("D 22x34in"), - _HKI("E 34x44in"), - _HKI("USLetter 8.5x11in"), // USLetter without space is correct - _HKI("USLegal 8.5x14in"), // USLegal without space is correct - _HKI("USLedger 11x17in"), // USLedger without space is correct - _HKI("User (Custom)"), // size defined by user. The string must contain "Custom" - // to be recognized in code -}; - DIALOG_PAGES_SETTINGS::DIALOG_PAGES_SETTINGS( EDA_DRAW_FRAME* aParent, EMBEDDED_FILES* aEmbeddedFiles, double aIuPerMils, const VECTOR2D& aMaxUserSizeMils ) : DIALOG_PAGES_SETTINGS_BASE( aParent ), @@ -141,17 +114,25 @@ bool DIALOG_PAGES_SETTINGS::TransferDataToWindow() // The first shows translated strings, the second contains not translated strings m_paperSizeComboBox->Clear(); - for( const wxString& pageFmt : pageFmts ) + int selectedIdx = -1; + m_pageInfo = m_parent->GetPageSettings(); + + for( const PAGE_INFO& pageFmt : PAGE_INFO::GetPageFormatsList() ) { - m_pageFmt.Add( pageFmt ); - m_paperSizeComboBox->Append( wxGetTranslation( pageFmt ) ); + int idx = m_paperSizeComboBox->Append( wxGetTranslation( pageFmt.GetPageFormatDescription() ), + reinterpret_cast( static_cast( pageFmt.GetType() ) ) ); + + if( pageFmt.GetType() == m_pageInfo.GetType() ) + { + selectedIdx = idx; + } } + m_paperSizeComboBox->SetSelection( selectedIdx ); + // initialize the drawing sheet filename SetWksFileName( BASE_SCREEN::m_DrawingSheetFileName ); - m_pageInfo = m_parent->GetPageSettings(); - SetCurrentPageSizeSelection( m_pageInfo.GetType() ); m_orientationComboBox->SetSelection( m_pageInfo.IsPortrait() ); // only a click fires the "selection changed" event, so have to fabricate this check @@ -217,9 +198,10 @@ bool DIALOG_PAGES_SETTINGS::TransferDataToWindow() bool DIALOG_PAGES_SETTINGS::TransferDataFromWindow() { int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 ); - const wxString paperType = m_pageFmt[idx]; + void* clientData = m_paperSizeComboBox->GetClientData( idx ); + PAGE_SIZE_TYPE pageType = static_cast( reinterpret_cast( clientData ) ); - if( paperType.Contains( PAGE_INFO::Custom ) ) + if( pageType == PAGE_SIZE_TYPE::User ) { if( !m_customSizeX.Validate( MIN_PAGE_SIZE_MILS, m_maxPageSizeMils.x, EDA_UNITS::MILS ) ) return false; @@ -250,9 +232,10 @@ void DIALOG_PAGES_SETTINGS::OnPaperSizeChoice( wxCommandEvent& event ) if( idx < 0 ) idx = 0; - const wxString paperType = m_pageFmt[idx]; + void* clientData = m_paperSizeComboBox->GetClientData( idx ); + PAGE_SIZE_TYPE pageType = static_cast( reinterpret_cast( clientData ) ); - if( paperType.Contains( PAGE_INFO::Custom ) ) + if( pageType == PAGE_SIZE_TYPE::User ) { m_staticTextOrient->Enable( false ); m_orientationComboBox->Enable( false ); @@ -482,14 +465,15 @@ bool DIALOG_PAGES_SETTINGS::SavePageSettings() m_localPrjConfigChanged = true; - int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 ); - const wxString paperType = m_pageFmt[idx]; + int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 ); + void* clientData = m_paperSizeComboBox->GetClientData( idx ); + PAGE_SIZE_TYPE pageType = static_cast( reinterpret_cast( clientData ) ); - if( paperType.Contains( PAGE_INFO::Custom ) ) + if( pageType == PAGE_SIZE_TYPE::User ) { GetCustomSizeMilsFromDialog(); - success = m_pageInfo.SetType( PAGE_INFO::Custom ); + success = m_pageInfo.SetType( PAGE_SIZE_TYPE::User ); if( success ) { @@ -502,22 +486,7 @@ bool DIALOG_PAGES_SETTINGS::SavePageSettings() } else { - // search for longest common string first, e.g. A4 before A - if( paperType.Contains( PAGE_INFO::USLetter ) ) success = m_pageInfo.SetType( PAGE_INFO::USLetter ); - else if( paperType.Contains( PAGE_INFO::USLegal ) ) success = m_pageInfo.SetType( PAGE_INFO::USLegal ); - else if( paperType.Contains( PAGE_INFO::USLedger ) ) success = m_pageInfo.SetType( PAGE_INFO::USLedger ); - else if( paperType.Contains( PAGE_INFO::GERBER ) ) success = m_pageInfo.SetType( PAGE_INFO::GERBER ); - else if( paperType.Contains( PAGE_INFO::A5 ) ) success = m_pageInfo.SetType( PAGE_INFO::A5 ); - else if( paperType.Contains( PAGE_INFO::A4 ) ) success = m_pageInfo.SetType( PAGE_INFO::A4 ); - else if( paperType.Contains( PAGE_INFO::A3 ) ) success = m_pageInfo.SetType( PAGE_INFO::A3 ); - else if( paperType.Contains( PAGE_INFO::A2 ) ) success = m_pageInfo.SetType( PAGE_INFO::A2 ); - else if( paperType.Contains( PAGE_INFO::A1 ) ) success = m_pageInfo.SetType( PAGE_INFO::A1 ); - else if( paperType.Contains( PAGE_INFO::A0 ) ) success = m_pageInfo.SetType( PAGE_INFO::A0 ); - else if( paperType.Contains( PAGE_INFO::A ) ) success = m_pageInfo.SetType( PAGE_INFO::A ); - else if( paperType.Contains( PAGE_INFO::B ) ) success = m_pageInfo.SetType( PAGE_INFO::B ); - else if( paperType.Contains( PAGE_INFO::C ) ) success = m_pageInfo.SetType( PAGE_INFO::C ); - else if( paperType.Contains( PAGE_INFO::D ) ) success = m_pageInfo.SetType( PAGE_INFO::D ); - else if( paperType.Contains( PAGE_INFO::E ) ) success = m_pageInfo.SetType( PAGE_INFO::E ); + success = m_pageInfo.SetType( pageType ); if( success ) { @@ -529,7 +498,7 @@ bool DIALOG_PAGES_SETTINGS::SavePageSettings() if( !success ) { wxFAIL_MSG( "The translation for paper size must preserve original spellings" ); - m_pageInfo.SetType( PAGE_INFO::A4 ); + m_pageInfo.SetType( PAGE_SIZE_TYPE::A4 ); } m_parent->SetPageSettings( m_pageInfo ); @@ -554,26 +523,6 @@ bool DIALOG_PAGES_SETTINGS::SavePageSettings() } -void DIALOG_PAGES_SETTINGS::SetCurrentPageSizeSelection( const wxString& aPaperSize ) -{ - // search all the not translated label list containing our paper type - for( unsigned i = 0; i < m_pageFmt.GetCount(); ++i ) - { - // parse each label looking for aPaperSize within it - wxStringTokenizer st( m_pageFmt[i] ); - - while( st.HasMoreTokens() ) - { - if( st.GetNextToken() == aPaperSize ) - { - m_paperSizeComboBox->SetSelection( i ); - return; - } - } - } -} - - void DIALOG_PAGES_SETTINGS::UpdateDrawingSheetExample() { int lyWidth, lyHeight; @@ -629,9 +578,11 @@ void DIALOG_PAGES_SETTINGS::UpdateDrawingSheetExample() if( idx < 0 ) idx = 0; - wxString pageFmtName = m_pageFmt[idx].BeforeFirst( ' ' ); + void* clientData = m_paperSizeComboBox->GetClientData( idx ); + PAGE_SIZE_TYPE pageType = static_cast( reinterpret_cast( clientData ) ); + bool portrait = clamped_layout_size.x < clamped_layout_size.y; - pageDUMMY.SetType( pageFmtName, portrait ); + pageDUMMY.SetType( pageType, portrait ); if( m_customFmt ) { @@ -681,11 +632,11 @@ void DIALOG_PAGES_SETTINGS::UpdateDrawingSheetExample() void DIALOG_PAGES_SETTINGS::GetPageLayoutInfoFromDialog() { - int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 ); - const wxString paperType = m_pageFmt[idx]; + int idx = std::max( m_paperSizeComboBox->GetSelection(), 0 ); + void* clientData = m_paperSizeComboBox->GetClientData( idx ); + PAGE_SIZE_TYPE pageType = static_cast( reinterpret_cast( clientData ) ); - // here we assume translators will keep original paper size spellings - if( paperType.Contains( PAGE_INFO::Custom ) ) + if( pageType == PAGE_SIZE_TYPE::User ) { GetCustomSizeMilsFromDialog(); @@ -701,36 +652,7 @@ void DIALOG_PAGES_SETTINGS::GetPageLayoutInfoFromDialog() { PAGE_INFO pageInfo; // SetType() later to lookup size - static const wxChar* papers[] = { - // longest common string first, since sequential search below - PAGE_INFO::A5, - PAGE_INFO::A4, - PAGE_INFO::A3, - PAGE_INFO::A2, - PAGE_INFO::A1, - PAGE_INFO::A0, - PAGE_INFO::A, - PAGE_INFO::B, - PAGE_INFO::C, - PAGE_INFO::D, - PAGE_INFO::E, - PAGE_INFO::USLetter, - PAGE_INFO::USLegal, - PAGE_INFO::USLedger, - }; - - unsigned i; - - for( i=0; i < arrayDim( papers ); ++i ) - { - if( paperType.Contains( papers[i] ) ) - { - pageInfo.SetType( papers[i] ); - break; - } - } - - wxASSERT( i != arrayDim(papers) ); // dialog UI match the above list? + pageInfo.SetType( pageType ); VECTOR2D sz = pageInfo.GetSizeMils(); m_layout_size = VECTOR2D( sz.x, sz.y ); diff --git a/common/drawing_sheet/ds_draw_item.cpp b/common/drawing_sheet/ds_draw_item.cpp index da60b5a66a..72262daf3c 100644 --- a/common/drawing_sheet/ds_draw_item.cpp +++ b/common/drawing_sheet/ds_draw_item.cpp @@ -549,7 +549,7 @@ void DS_DRAW_ITEM_LIST::BuildDrawItemsList( const PAGE_INFO& aPageInfo, DS_DATA_MODEL& model = DS_DATA_MODEL::GetTheInstance(); m_titleBlock = &aTitleBlock; - m_paperFormat = aPageInfo.GetType(); + m_paperFormat = aPageInfo.GetTypeAsString(); // Build the basic layout shape, if the layout list is empty if( model.GetCount() == 0 && !model.VoidListAllowed() ) diff --git a/common/page_info.cpp b/common/page_info.cpp index a4db85526f..0a48fc0e22 100644 --- a/common/page_info.cpp +++ b/common/page_info.cpp @@ -27,36 +27,7 @@ #include #include // for OUTPUTFORMATTER and IO_ERROR #include - - -// late arriving wxPAPER_A0, wxPAPER_A1 -#if wxABI_VERSION >= 20999 - #define PAPER_A0 wxPAPER_A0 - #define PAPER_A1 wxPAPER_A1 -#else - #define PAPER_A0 wxPAPER_A2 - #define PAPER_A1 wxPAPER_A2 -#endif - - -// Standard paper sizes nicknames. -const wxChar PAGE_INFO::A5[] = wxT( "A5" ); -const wxChar PAGE_INFO::A4[] = wxT( "A4" ); -const wxChar PAGE_INFO::A3[] = wxT( "A3" ); -const wxChar PAGE_INFO::A2[] = wxT( "A2" ); -const wxChar PAGE_INFO::A1[] = wxT( "A1" ); -const wxChar PAGE_INFO::A0[] = wxT( "A0" ); -const wxChar PAGE_INFO::A[] = wxT( "A" ); -const wxChar PAGE_INFO::B[] = wxT( "B" ); -const wxChar PAGE_INFO::C[] = wxT( "C" ); -const wxChar PAGE_INFO::D[] = wxT( "D" ); -const wxChar PAGE_INFO::E[] = wxT( "E" ); - -const wxChar PAGE_INFO::GERBER[] = wxT( "GERBER" ); -const wxChar PAGE_INFO::USLetter[] = wxT( "USLetter" ); -const wxChar PAGE_INFO::USLegal[] = wxT( "USLegal" ); -const wxChar PAGE_INFO::USLedger[] = wxT( "USLedger" ); -const wxChar PAGE_INFO::Custom[] = wxT( "User" ); +#include // Standard page sizes in mils, all constants @@ -66,29 +37,34 @@ const wxChar PAGE_INFO::Custom[] = wxT( "User" ); // local readability macro for millimeter wxSize #define MMsize( x, y ) VECTOR2D( EDA_UNIT_UTILS::Mm2mils( x ), EDA_UNIT_UTILS::Mm2mils( y ) ) -// All MUST be defined as landscape. -const PAGE_INFO PAGE_INFO::pageA5( MMsize( 210, 148 ), wxT( "A5" ), wxPAPER_A5 ); -const PAGE_INFO PAGE_INFO::pageA4( MMsize( 297, 210 ), wxT( "A4" ), wxPAPER_A4 ); -const PAGE_INFO PAGE_INFO::pageA3( MMsize( 420, 297 ), wxT( "A3" ), wxPAPER_A3 ); -const PAGE_INFO PAGE_INFO::pageA2( MMsize( 594, 420 ), wxT( "A2" ), wxPAPER_A2 ); -const PAGE_INFO PAGE_INFO::pageA1( MMsize( 841, 594 ), wxT( "A1" ), PAPER_A1 ); -const PAGE_INFO PAGE_INFO::pageA0( MMsize( 1189, 841 ), wxT( "A0" ), PAPER_A0 ); +// List of page formats. +// they are prefixed by "_HKI" (already in use for hotkeys) instead of "_", +// because we need both the translated and the not translated version. +// when displayed in dialog we should explicitly call wxGetTranslation() +#define _HKI( x ) wxT( x ) -const PAGE_INFO PAGE_INFO::pageA( VECTOR2D( 11000, 8500 ), wxT( "A" ), wxPAPER_LETTER ); -const PAGE_INFO PAGE_INFO::pageB( VECTOR2D( 17000, 11000 ), wxT( "B" ), wxPAPER_TABLOID ); -const PAGE_INFO PAGE_INFO::pageC( VECTOR2D( 22000, 17000 ), wxT( "C" ), wxPAPER_CSHEET ); -const PAGE_INFO PAGE_INFO::pageD( VECTOR2D( 34000, 22000 ), wxT( "D" ), wxPAPER_DSHEET ); -const PAGE_INFO PAGE_INFO::pageE( VECTOR2D( 44000, 34000 ), wxT( "E" ), wxPAPER_ESHEET ); +std::vector PAGE_INFO::standardPageSizes = { + // All MUST be defined as landscape. + PAGE_INFO( MMsize( 210, 148 ), PAGE_SIZE_TYPE::A5, wxPAPER_A5, _HKI( "A5 148 x 210mm" ) ), + PAGE_INFO( MMsize( 297, 210 ), PAGE_SIZE_TYPE::A4, wxPAPER_A4, _HKI( "A4 210 x 297mm" ) ), + PAGE_INFO( MMsize( 420, 297 ), PAGE_SIZE_TYPE::A3, wxPAPER_A3, _HKI( "A3 297 x 420mm" ) ), + PAGE_INFO( MMsize( 594, 420 ), PAGE_SIZE_TYPE::A2, wxPAPER_A2, _HKI( "A2 420 x 594mm" ) ), + PAGE_INFO( MMsize( 841, 594 ), PAGE_SIZE_TYPE::A1, wxPAPER_A1, _HKI( "A1 594 x 841mm" ) ), + PAGE_INFO( MMsize( 1189, 841 ), PAGE_SIZE_TYPE::A0, wxPAPER_A0, _HKI( "A0 841 x 1189mm" ) ), + PAGE_INFO( VECTOR2D( 11000, 8500 ), PAGE_SIZE_TYPE::A, wxPAPER_LETTER, _HKI( "A 8.5 x 11in" ) ), + PAGE_INFO( VECTOR2D( 17000, 11000 ), PAGE_SIZE_TYPE::B, wxPAPER_TABLOID, _HKI( "B 11 x 17in" ) ), + PAGE_INFO( VECTOR2D( 22000, 17000 ), PAGE_SIZE_TYPE::C, wxPAPER_CSHEET, _HKI( "C 17 x 22in" ) ), + PAGE_INFO( VECTOR2D( 34000, 22000 ), PAGE_SIZE_TYPE::D, wxPAPER_DSHEET, _HKI( "D 22 x 34in" ) ), + PAGE_INFO( VECTOR2D( 44000, 34000 ), PAGE_SIZE_TYPE::E, wxPAPER_ESHEET, _HKI( "E 34 x 44in" ) ), -const PAGE_INFO PAGE_INFO::pageGERBER( VECTOR2D( 32000, 32000 ), wxT( "GERBER" ), wxPAPER_NONE ); -const PAGE_INFO PAGE_INFO::pageUser( VECTOR2D( 17000, 11000 ), Custom, wxPAPER_NONE ); + // US paper sizes + PAGE_INFO( VECTOR2D( 32000, 32000 ), PAGE_SIZE_TYPE::GERBER, wxPAPER_NONE ), + PAGE_INFO( VECTOR2D( 17000, 11000 ), PAGE_SIZE_TYPE::User, wxPAPER_NONE, _HKI( "User (Custom)" ) ), -// US paper sizes -const PAGE_INFO PAGE_INFO::pageUSLetter( VECTOR2D( 11000, 8500 ), wxT( "USLetter" ), - wxPAPER_LETTER ); -const PAGE_INFO PAGE_INFO::pageUSLegal( VECTOR2D( 14000, 8500 ), wxT( "USLegal" ), wxPAPER_LEGAL ); -const PAGE_INFO PAGE_INFO::pageUSLedger( VECTOR2D( 17000, 11000 ), wxT( "USLedger" ), - wxPAPER_TABLOID ); + PAGE_INFO( VECTOR2D( 11000, 8500 ), PAGE_SIZE_TYPE::USLetter, wxPAPER_LETTER, _HKI("US Letter 8.5 x 11in") ), + PAGE_INFO( VECTOR2D( 14000, 8500 ), PAGE_SIZE_TYPE::USLegal, wxPAPER_LEGAL, _HKI("US Legal 8.5 x 14in") ), + PAGE_INFO( VECTOR2D( 17000, 11000 ), PAGE_SIZE_TYPE::USLedger, wxPAPER_TABLOID, _HKI("US Ledger 11 x 17in") ) +}; // Custom paper size for next instantiation of type "User" double PAGE_INFO::s_user_width = 17000; @@ -102,8 +78,12 @@ inline void PAGE_INFO::updatePortrait() } -PAGE_INFO::PAGE_INFO( const VECTOR2D& aSizeMils, const wxString& aType, wxPaperSize aPaperId ) : - m_type( aType ), m_size( aSizeMils ), m_paper_id( aPaperId ) +PAGE_INFO::PAGE_INFO( const VECTOR2D& aSizeMils, PAGE_SIZE_TYPE aType, wxPaperSize aPaperId, + const wxString& aDescription ) : + m_type( aType ), + m_size( aSizeMils ), + m_paper_id( aPaperId ), + m_description( aDescription ) { updatePortrait(); @@ -113,61 +93,52 @@ PAGE_INFO::PAGE_INFO( const VECTOR2D& aSizeMils, const wxString& aType, wxPaperS } -PAGE_INFO::PAGE_INFO( const wxString& aType, bool aIsPortrait ) +PAGE_INFO::PAGE_INFO( PAGE_SIZE_TYPE aType, bool aIsPortrait ) { SetType( aType, aIsPortrait ); } -bool PAGE_INFO::SetType( const wxString& aType, bool aIsPortrait ) +bool PAGE_INFO::SetType( const wxString& aPageSize, bool aIsPortrait ) +{ + auto type = + magic_enum::enum_cast( aPageSize.ToStdString(), magic_enum::case_insensitive ); + + if( !type.has_value() ) + return false; + + return SetType( type.value(), aIsPortrait ); +} + + +bool PAGE_INFO::SetType( PAGE_SIZE_TYPE aType, bool aIsPortrait ) { bool rc = true; - // all are landscape initially - if( aType == pageA5.GetType() ) - *this = pageA5; - else if( aType == pageA4.GetType() ) - *this = pageA4; - else if( aType == pageA3.GetType() ) - *this = pageA3; - else if( aType == pageA2.GetType() ) - *this = pageA2; - else if( aType == pageA1.GetType() ) - *this = pageA1; - else if( aType == pageA0.GetType() ) - *this = pageA0; - else if( aType == pageA.GetType() ) - *this = pageA; - else if( aType == pageB.GetType() ) - *this = pageB; - else if( aType == pageC.GetType() ) - *this = pageC; - else if( aType == pageD.GetType() ) - *this = pageD; - else if( aType == pageE.GetType() ) - *this = pageE; - else if( aType == pageGERBER.GetType() ) - *this = pageGERBER; - else if( aType == pageUSLetter.GetType() ) - *this = pageUSLetter; - else if( aType == pageUSLegal.GetType() ) - *this = pageUSLegal; - else if( aType == pageUSLedger.GetType() ) - *this = pageUSLedger; - else if( aType == pageUser.GetType() ) - { - // pageUser is const, and may not and does not hold the custom size, - // so customize *this later - *this = pageUser; + auto result = std::find_if( standardPageSizes.begin(), standardPageSizes.end(), + [aType]( const PAGE_INFO& p ) + { + return p.m_type == aType; + } ); - // customize: + if( result != standardPageSizes.end() ) + { + *this = *result; + } + else + { + rc = false; + } + + if( aType == PAGE_SIZE_TYPE::User ) + { + m_type = PAGE_SIZE_TYPE::User; + m_paper_id = wxPAPER_NONE; m_size.x = s_user_width; m_size.y = s_user_height; updatePortrait(); } - else - rc = false; if( aIsPortrait ) { @@ -180,9 +151,16 @@ bool PAGE_INFO::SetType( const wxString& aType, bool aIsPortrait ) } +wxString PAGE_INFO::GetTypeAsString() const +{ + std::string typeStr( magic_enum::enum_name( m_type ) ); + return wxString( typeStr ); +} + + bool PAGE_INFO::IsCustom() const { - return m_type == Custom; + return m_type == PAGE_SIZE_TYPE::User; } @@ -251,7 +229,7 @@ void PAGE_INFO::SetWidthMils( double aWidthInMils ) { m_size.x = clampWidth( aWidthInMils ); - m_type = Custom; + m_type = PAGE_SIZE_TYPE::User; m_paper_id = wxPAPER_NONE; updatePortrait(); @@ -265,7 +243,7 @@ void PAGE_INFO::SetHeightMils( double aHeightInMils ) { m_size.y = clampHeight( aHeightInMils ); - m_type = Custom; + m_type = PAGE_SIZE_TYPE::User; m_paper_id = wxPAPER_NONE; updatePortrait(); @@ -275,11 +253,12 @@ void PAGE_INFO::SetHeightMils( double aHeightInMils ) void PAGE_INFO::Format( OUTPUTFORMATTER* aFormatter ) const { - aFormatter->Print( "(paper %s", aFormatter->Quotew( GetType() ).c_str() ); + std::string typeStr( magic_enum::enum_name( GetType() ) ); + aFormatter->Print( "(paper %s", aFormatter->Quotew( typeStr ).c_str() ); // The page dimensions are only required for user defined page sizes. // Internally, the page size is in mils - if( GetType() == PAGE_INFO::Custom ) + if( GetType() == PAGE_SIZE_TYPE::User ) { aFormatter->Print( " %s %s", FormatDouble2Str( GetWidthMils() * 25.4 / 1000.0 ).c_str(), @@ -291,3 +270,9 @@ void PAGE_INFO::Format( OUTPUTFORMATTER* aFormatter ) const aFormatter->Print( ")" ); } + + +const std::vector& PAGE_INFO::GetPageFormatsList() +{ + return PAGE_INFO::standardPageSizes; +} \ No newline at end of file diff --git a/common/plotters/PS_plotter.cpp b/common/plotters/PS_plotter.cpp index a02dceef74..a06b40ae74 100644 --- a/common/plotters/PS_plotter.cpp +++ b/common/plotters/PS_plotter.cpp @@ -828,7 +828,7 @@ bool PS_PLOTTER::StartPlot( const wxString& aPageNumber ) // Also note pageSize is given in mils, not in internal units and must be // converted to internal units. - wxString pageType = m_pageInfo.GetType(); + wxString pageType = m_pageInfo.GetTypeAsString(); if( m_pageInfo.IsCustom() ) pageType = "Custom"; diff --git a/eeschema/dialogs/panel_eeschema_color_settings.cpp b/eeschema/dialogs/panel_eeschema_color_settings.cpp index 4cb1de3c60..4bbc1c18f5 100644 --- a/eeschema/dialogs/panel_eeschema_color_settings.cpp +++ b/eeschema/dialogs/panel_eeschema_color_settings.cpp @@ -247,7 +247,7 @@ void PANEL_EESCHEMA_COLOR_SETTINGS::createPreviewItems() std::vector endPointsByType; - m_page = new PAGE_INFO( PAGE_INFO::Custom ); + m_page = new PAGE_INFO( PAGE_SIZE_TYPE::User ); m_titleBlock = new TITLE_BLOCK; m_titleBlock->SetTitle( _( "Color Preview" ) ); m_titleBlock->SetDate( wxDateTime::Now().FormatDate() ); diff --git a/eeschema/eeschema_jobs_handler.cpp b/eeschema/eeschema_jobs_handler.cpp index befb3766a8..5dafd76da8 100644 --- a/eeschema/eeschema_jobs_handler.cpp +++ b/eeschema/eeschema_jobs_handler.cpp @@ -888,7 +888,7 @@ int EESCHEMA_JOBS_HANDLER::doSymExportSvg( JOB_SYM_EXPORT_SVG* aSvgJob, SCH_REND // Get the symbol bounding box to fit the plot page to it BOX2I symbolBB = symbol->Flatten()->GetUnitBoundingBox( unit, bodyStyle, !aSvgJob->m_includeHiddenFields ); - PAGE_INFO pageInfo( PAGE_INFO::Custom ); + PAGE_INFO pageInfo( PAGE_SIZE_TYPE::User ); pageInfo.SetHeightMils( schIUScale.IUToMils( symbolBB.GetHeight() * 1.2 ) ); pageInfo.SetWidthMils( schIUScale.IUToMils( symbolBB.GetWidth() * 1.2 ) ); diff --git a/eeschema/sch_io/altium/sch_io_altium.cpp b/eeschema/sch_io/altium/sch_io_altium.cpp index 4e0c1da5b5..a6af110927 100644 --- a/eeschema/sch_io/altium/sch_io_altium.cpp +++ b/eeschema/sch_io/altium/sch_io_altium.cpp @@ -4040,7 +4040,7 @@ void SCH_IO_ALTIUM::ParseSheet( const std::map& aProperties { PAGE_INFO::SetCustomWidthMils( schIUScale.IUToMils( m_altiumSheet->customSize.x ) ); PAGE_INFO::SetCustomHeightMils( schIUScale.IUToMils( m_altiumSheet->customSize.y ) ); - pageInfo.SetType( PAGE_INFO::Custom, isPortrait ); + pageInfo.SetType( PAGE_SIZE_TYPE::User, isPortrait ); } else { diff --git a/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.cpp b/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.cpp index c5f4fea3ca..46330005c8 100644 --- a/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.cpp +++ b/eeschema/sch_io/kicad_legacy/sch_io_kicad_legacy.cpp @@ -424,7 +424,7 @@ void SCH_IO_KICAD_LEGACY::loadPageSettings( LINE_READER& aReader, SCH_SCREEN* aS int pagew = parseInt( aReader, line, &line ); int pageh = parseInt( aReader, line, &line ); - if( buf == PAGE_INFO::Custom ) + if( pageInfo.GetType() == PAGE_SIZE_TYPE::User ) { pageInfo.SetWidthMils( pagew ); pageInfo.SetHeightMils( pageh ); @@ -1541,7 +1541,7 @@ void SCH_IO_KICAD_LEGACY::Format( SCH_SHEET* aSheet ) const TITLE_BLOCK& tb = screen->GetTitleBlock(); const PAGE_INFO& page = screen->GetPageSettings(); - m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetType() ), + m_out->Print( 0, "$Descr %s %d %d%s\n", TO_UTF8( page.GetTypeAsString() ), (int)page.GetWidthMils(), (int)page.GetHeightMils(), !page.IsCustom() && page.IsPortrait() ? " portrait" : "" ); diff --git a/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr_parser.cpp b/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr_parser.cpp index 01a5898a5c..8f4e8fd118 100644 --- a/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr_parser.cpp +++ b/eeschema/sch_io/kicad_sexpr/sch_io_kicad_sexpr_parser.cpp @@ -2120,7 +2120,7 @@ void SCH_IO_KICAD_SEXPR_PARSER::parsePAGE_INFO( PAGE_INFO& aPageInfo ) CurOffset() ); } - if( pageType == PAGE_INFO::Custom ) + if( aPageInfo.GetType() == PAGE_SIZE_TYPE::User ) { double width = parseDouble( "width" ); diff --git a/eeschema/sch_screen.cpp b/eeschema/sch_screen.cpp index cb490acc2d..06fbfaa0cc 100644 --- a/eeschema/sch_screen.cpp +++ b/eeschema/sch_screen.cpp @@ -80,7 +80,7 @@ static const wxChar DanglingProfileMask[] = wxT( "DANGLING_PROFILE" ); SCH_SCREEN::SCH_SCREEN( EDA_ITEM* aParent ) : BASE_SCREEN( aParent, SCH_SCREEN_T ), m_fileFormatVersionAtLoad( 0 ), - m_paper( wxT( "A4" ) ), + m_paper( PAGE_SIZE_TYPE::A4 ), m_isReadOnly( false ), m_fileExists( false ) { diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index 3184cf3e59..274649aea7 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -130,7 +130,7 @@ GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent ) : SetIcons( icon_bundle ); // Be sure a page info is set. this default value will be overwritten later. - PAGE_INFO pageInfo( wxT( "GERBER" ) ); + PAGE_INFO pageInfo( PAGE_SIZE_TYPE::GERBER ); SetLayout( new GBR_LAYOUT() ); SetPageSettings( pageInfo ); @@ -327,7 +327,7 @@ void GERBVIEW_FRAME::LoadSettings( APP_SETTINGS_BASE* aCfg ) SetElementVisibility( LAYER_GERBVIEW_DRAWINGSHEET, cfg->m_Appearance.show_border_and_titleblock ); SetElementVisibility( LAYER_GERBVIEW_PAGE_LIMITS, cfg->m_Display.m_DisplayPageLimits ); - PAGE_INFO pageInfo( wxT( "GERBER" ) ); + PAGE_INFO pageInfo( PAGE_SIZE_TYPE::GERBER ); pageInfo.SetType( cfg->m_Appearance.page_type ); SetPageSettings( pageInfo ); @@ -346,7 +346,7 @@ void GERBVIEW_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg ) if( GERBVIEW_SETTINGS* cfg = dynamic_cast( aCfg ) ) { - cfg->m_Appearance.page_type = GetPageSettings().GetType(); + cfg->m_Appearance.page_type = GetPageSettings().GetTypeAsString(); m_drillFileHistory.Save( &cfg->m_DrillFileHistory ); m_zipFileHistory.Save( &cfg->m_ZipFileHistory ); @@ -1196,7 +1196,10 @@ void GERBVIEW_FRAME::CommonSettingsChanged( int aFlags ) { GetGalDisplayOptions().ReadWindowSettings( cfg->m_Window ); - SetPageSettings( PAGE_INFO( cfg->m_Appearance.page_type ) ); + PAGE_INFO pgInfo; + pgInfo.SetType( cfg->m_Appearance.page_type ); + + SetPageSettings( pgInfo ); SetElementVisibility( LAYER_DCODES, cfg->m_Appearance.show_dcodes ); } diff --git a/include/dialogs/dialog_page_settings.h b/include/dialogs/dialog_page_settings.h index 093d58b23c..61427023ad 100644 --- a/include/dialogs/dialog_page_settings.h +++ b/include/dialogs/dialog_page_settings.h @@ -102,8 +102,6 @@ private: // return true if changes are made, or false if not bool SavePageSettings(); - void SetCurrentPageSizeSelection( const wxString& aPaperSize ); - // Update drawing sheet example void UpdateDrawingSheetExample(); @@ -121,7 +119,6 @@ protected: EDA_DRAW_FRAME* m_parent; BASE_SCREEN* m_screen; wxString m_projectPath; // the curr project path - wxArrayString m_pageFmt; /// list of page sizes (not translated) bool m_initialized; bool m_localPrjConfigChanged; /// the page layuout filename was changed wxBitmap* m_pageBitmap; /// Temporary bitmap for the drawing sheet example. diff --git a/include/page_info.h b/include/page_info.h index 3c0f9772f3..82de816e13 100644 --- a/include/page_info.h +++ b/include/page_info.h @@ -30,6 +30,7 @@ #ifndef PAGE_INFO_H #define PAGE_INFO_H +#include #include #include #include @@ -46,6 +47,30 @@ class OUTPUTFORMATTER; +/* + * @brief Standard paper sizes nicknames + * Do not rename entires as these names are saved to file and parsed back + */ +enum class PAGE_SIZE_TYPE +{ + A5, + A4, + A3, + A2, + A1, + A0, + A, + B, + C, + D, + E, + GERBER, + USLetter, + USLegal, + USLedger, + User +}; + /** * Describe the page size and margins of a paper page on which to eventually print or plot. * @@ -58,29 +83,11 @@ class OUTPUTFORMATTER; class KICOMMON_API PAGE_INFO { public: - PAGE_INFO( const wxString& aType = PAGE_INFO::A3, bool IsPortrait = false ); + PAGE_INFO( PAGE_SIZE_TYPE aType = PAGE_SIZE_TYPE::A3, bool IsPortrait = false ); // paper size names which are part of the public API, pass to SetType() or // above constructor. - // these were once wxStrings, but it caused static construction sequence problems: - static const wxChar A5[]; - static const wxChar A4[]; - static const wxChar A3[]; - static const wxChar A2[]; - static const wxChar A1[]; - static const wxChar A0[]; - static const wxChar A[]; - static const wxChar B[]; - static const wxChar C[]; - static const wxChar D[]; - static const wxChar E[]; - static const wxChar GERBER[]; - static const wxChar USLetter[]; - static const wxChar USLegal[]; - static const wxChar USLedger[]; - static const wxChar Custom[]; ///< "User" defined page type - /** * Set the name of the page type and also the sizes and margins commonly associated with @@ -95,13 +102,17 @@ public: * @param aIsPortrait Set to true to set page orientation to portrait mode. * @return true if @a aStandarePageDescription was a recognized type. */ - bool SetType( const wxString& aStandardPageDescriptionName, bool aIsPortrait = false ); - const wxString& GetType() const { return m_type; } + bool SetType( PAGE_SIZE_TYPE aPageSize, bool aIsPortrait = false ); + bool SetType( const wxString& aPageSize, bool aIsPortrait = false ); + const PAGE_SIZE_TYPE& GetType() const { return m_type; } + wxString GetTypeAsString() const; + + const wxString& GetPageFormatDescription() const { return m_description; } /** * @return True if the object has the default page settings which are A3, landscape. */ - bool IsDefault() const { return m_type == PAGE_INFO::A3 && !m_portrait; } + bool IsDefault() const { return m_type == PAGE_SIZE_TYPE::A3 && !m_portrait; } /** * @return true if the type is Custom. @@ -203,39 +214,25 @@ public: */ void Format( OUTPUTFORMATTER* aFormatter ) const; + static const std::vector& GetPageFormatsList(); + protected: // only the class implementation(s) may use this constructor - PAGE_INFO( const VECTOR2D& aSizeMils, const wxString& aName, wxPaperSize aPaperId ); + PAGE_INFO( const VECTOR2D& aSizeMils, const PAGE_SIZE_TYPE aType, wxPaperSize aPaperId, + const wxString& aDescription = wxEmptyString ); private: - // standard pre-defined sizes - static const PAGE_INFO pageA5; - static const PAGE_INFO pageA4; - static const PAGE_INFO pageA3; - static const PAGE_INFO pageA2; - static const PAGE_INFO pageA1; - static const PAGE_INFO pageA0; - static const PAGE_INFO pageA; - static const PAGE_INFO pageB; - static const PAGE_INFO pageC; - static const PAGE_INFO pageD; - static const PAGE_INFO pageE; - static const PAGE_INFO pageGERBER; - - static const PAGE_INFO pageUSLetter; - static const PAGE_INFO pageUSLegal; - static const PAGE_INFO pageUSLedger; - - static const PAGE_INFO pageUser; + static std::vector standardPageSizes; // all dimensions here are in mils - wxString m_type; ///< paper type: A4, A3, etc. + PAGE_SIZE_TYPE m_type; ///< paper type: A4, A3, etc. VECTOR2D m_size; ///< mils bool m_portrait; ///< true if portrait, false if landscape wxPaperSize m_paper_id; ///< wx' style paper id. + wxString m_description; ///< more human friendly description of page size static double s_user_height; static double s_user_width; diff --git a/pagelayout_editor/dialogs/design_inspector.cpp b/pagelayout_editor/dialogs/design_inspector.cpp index 424994268c..73567db25a 100644 --- a/pagelayout_editor/dialogs/design_inspector.cpp +++ b/pagelayout_editor/dialogs/design_inspector.cpp @@ -226,7 +226,7 @@ void DIALOG_INSPECTOR::ReCreateDesignList() GetGridList()->SetCellValue( row, COL_TYPENAME, _( "Layout" ) ); // Display page format name. - GetGridList()->SetCellValue( row, COL_COMMENT, page_info.GetType() ); + GetGridList()->SetCellValue( row, COL_COMMENT, page_info.GetTypeAsString() ); GetGridList()->SetCellValue( row, COL_REPEAT_NUMBER, "-" ); VECTOR2I page_sizeIU = m_editorFrame->GetPageSizeIU(); GetGridList()->SetCellValue( row, COL_TEXTSTRING, diff --git a/pagelayout_editor/pl_draw_panel_gal.cpp b/pagelayout_editor/pl_draw_panel_gal.cpp index 6485f54892..96f3786c5d 100644 --- a/pagelayout_editor/pl_draw_panel_gal.cpp +++ b/pagelayout_editor/pl_draw_panel_gal.cpp @@ -98,7 +98,7 @@ void PL_DRAW_PANEL_GAL::DisplayDrawingSheet() // To show the formatted texts instead of raw texts in drawing sheet editor, we need // a dummy DS_DRAW_ITEM_LIST. DS_DRAW_ITEM_LIST dummy( drawSheetIUScale ); - dummy.SetPaperFormat( m_edaFrame->GetPageSettings().GetType() ); + dummy.SetPaperFormat( m_edaFrame->GetPageSettings().GetTypeAsString() ); dummy.SetTitleBlock( &m_edaFrame->GetTitleBlock() ); dummy.SetProject( &m_edaFrame->Prj() ); diff --git a/pagelayout_editor/pl_editor_frame.cpp b/pagelayout_editor/pl_editor_frame.cpp index 0e4ea80f68..68eedafc0c 100644 --- a/pagelayout_editor/pl_editor_frame.cpp +++ b/pagelayout_editor/pl_editor_frame.cpp @@ -559,7 +559,7 @@ void PL_EDITOR_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg ) cfg->m_PropertiesFrameWidth = m_propertiesFrameWidth; cfg->m_CornerOrigin = m_originSelectChoice; cfg->m_BlackBackground = GetDrawBgColor() == BLACK; - cfg->m_LastPaperSize = GetPageSettings().GetType(); + cfg->m_LastPaperSize = GetPageSettings().GetTypeAsString(); cfg->m_LastWasPortrait = GetPageSettings().IsPortrait(); cfg->m_LastCustomWidth = PAGE_INFO::GetCustomWidthMils(); cfg->m_LastCustomHeight = PAGE_INFO::GetCustomHeightMils(); diff --git a/pagelayout_editor/pl_editor_layout.cpp b/pagelayout_editor/pl_editor_layout.cpp index 20e0e2b332..75f2124e60 100644 --- a/pagelayout_editor/pl_editor_layout.cpp +++ b/pagelayout_editor/pl_editor_layout.cpp @@ -29,7 +29,7 @@ PL_EDITOR_LAYOUT::PL_EDITOR_LAYOUT() : m_drawItemList( drawSheetIUScale ) { - PAGE_INFO pageInfo( wxT( "A4" ) ); + PAGE_INFO pageInfo( PAGE_SIZE_TYPE::A4 ); SetPageSettings( pageInfo ); } diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index d2159b1c80..7a896ff58a 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -84,7 +84,7 @@ BOARD::BOARD() : m_LegacyNetclassesLoaded( false ), m_boardUse( BOARD_USE::NORMAL ), m_timeStamp( 1 ), - m_paper( PAGE_INFO::A4 ), + m_paper( PAGE_SIZE_TYPE::A4 ), m_project( nullptr ), m_userUnits( EDA_UNITS::MM ), m_designSettings( new BOARD_DESIGN_SETTINGS( nullptr, "board.design_settings" ) ), diff --git a/pcbnew/dialogs/panel_pcbnew_color_settings.cpp b/pcbnew/dialogs/panel_pcbnew_color_settings.cpp index 230cf79836..bbe43ae4b8 100644 --- a/pcbnew/dialogs/panel_pcbnew_color_settings.cpp +++ b/pcbnew/dialogs/panel_pcbnew_color_settings.cpp @@ -796,7 +796,7 @@ void PANEL_PCBNEW_COLOR_SETTINGS::onNewThemeSelected() void PANEL_PCBNEW_COLOR_SETTINGS::createPreviewItems() { - m_page = new PAGE_INFO( PAGE_INFO::Custom ); + m_page = new PAGE_INFO( PAGE_SIZE_TYPE::User ); m_titleBlock = new TITLE_BLOCK; m_titleBlock->SetTitle( _( "Color Preview" ) ); m_titleBlock->SetDate( wxDateTime::Now().FormatDate() ); diff --git a/pcbnew/exporters/gen_drill_report_files.cpp b/pcbnew/exporters/gen_drill_report_files.cpp index b95d8290ff..6c8bf7401e 100644 --- a/pcbnew/exporters/gen_drill_report_files.cpp +++ b/pcbnew/exporters/gen_drill_report_files.cpp @@ -94,7 +94,7 @@ bool GENDRILL_WRITER_BASE::genDrillMapFile( const wxString& aFullFileName, PLOT_ double scale = 1.0; VECTOR2I offset = GetOffset(); PLOTTER* plotter = nullptr; - PAGE_INFO dummy( PAGE_INFO::A4, false ); + PAGE_INFO dummy( PAGE_SIZE_TYPE::A4, false ); int bottom_limit = 0; // Y coord limit of page. 0 mean do not use PCB_PLOT_PARAMS plot_opts; // starts plotting with default options diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp index c0be9a5439..58aa710c18 100644 --- a/pcbnew/footprint_edit_frame.cpp +++ b/pcbnew/footprint_edit_frame.cpp @@ -156,7 +156,7 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : GetGalDisplayOptions().m_axesEnabled = true; // In Footprint Editor, set the default paper size to A4 for plot/print - SetPageSettings( PAGE_INFO( PAGE_INFO::A4 ) ); + SetPageSettings( PAGE_INFO( PAGE_SIZE_TYPE::A4 ) ); SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS ) ) ); // Create the manager and dispatcher & route draw panel events to the dispatcher diff --git a/pcbnew/pcb_io/kicad_legacy/pcb_io_kicad_legacy.cpp b/pcbnew/pcb_io/kicad_legacy/pcb_io_kicad_legacy.cpp index 5a22128b3a..dd7162a4a0 100644 --- a/pcbnew/pcb_io/kicad_legacy/pcb_io_kicad_legacy.cpp +++ b/pcbnew/pcb_io/kicad_legacy/pcb_io_kicad_legacy.cpp @@ -801,7 +801,7 @@ void PCB_IO_KICAD_LEGACY::loadSHEET() char* orient = strtok_r( nullptr, delims, &data ); // only parse the width and height if page size is custom ("User") - if( wname == PAGE_INFO::Custom ) + if( page.GetType() == PAGE_SIZE_TYPE::User ) { if( width && height ) { diff --git a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp index c21611fed7..e1d368023b 100644 --- a/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp +++ b/pcbnew/pcb_io/kicad_sexpr/pcb_io_kicad_sexpr_parser.cpp @@ -1445,7 +1445,7 @@ void PCB_IO_KICAD_SEXPR_PARSER::parsePAGE_INFO() THROW_PARSE_ERROR( err, CurSource(), CurLine(), CurLineNumber(), CurOffset() ); } - if( pageType == PAGE_INFO::Custom ) + if( pageInfo.GetType() == PAGE_SIZE_TYPE::User ) { double width = parseDouble( "width" ); // width in mm diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp index a41cd5f6f2..75ec73bb7b 100644 --- a/pcbnew/plot_board_layers.cpp +++ b/pcbnew/plot_board_layers.cpp @@ -1088,7 +1088,7 @@ void GenerateLayerPoly( SHAPE_POLY_SET* aResult, BOARD *aBoard, PCB_LAYER_ID aLa */ static void initializePlotter( PLOTTER* aPlotter, const BOARD* aBoard, const PCB_PLOT_PARAMS* aPlotOpts ) { - PAGE_INFO pageA4( wxT( "A4" ) ); + PAGE_INFO pageA4( PAGE_SIZE_TYPE::A4 ); const PAGE_INFO& pageInfo = aBoard->GetPageSettings(); const PAGE_INFO* sheet_info; double paperscale; // Page-to-paper ratio