KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcbnew/dialogs/dialog_global_edit_text_and_graphics.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) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 1992-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <string_utils.h>
26#include <board_commit.h>
27#include <pcb_edit_frame.h>
30#include <board.h>
32#include <footprint.h>
33#include <pcb_group.h>
34#include <pcb_dimension.h>
35#include <pcb_shape.h>
36#include <pcb_text.h>
37#include <widgets/unit_binder.h>
38#include <widgets/font_choice.h>
39#include <tool/tool_manager.h>
43
44// Columns of layer classes grid
45enum
46{
54};
55
56enum
57{
65};
66
67
69static bool g_modifyValues;
76static bool g_filterByLayer;
77static int g_layerFilter;
79static wxString g_referenceFilter;
81static wxString g_footprintFilter;
82static bool g_filterSelected = false;
83
84
86{
91
96
97public:
100
101protected:
102 void onActionButtonChange( wxCommandEvent& event ) override;
103 void onSpecifiedValueUpdateUI( wxUpdateUIEvent& event ) override;
104 void onDimensionItemCheckbox( wxCommandEvent& aEvent ) override;
105
106 void OnLayerFilterSelect( wxCommandEvent& event ) override
107 {
108 m_layerFilterOpt->SetValue( true );
109 }
110 void OnReferenceFilterText( wxCommandEvent& event ) override
111 {
112 m_referenceFilterOpt->SetValue( true );
113 }
114 void OnFootprintFilterText( wxCommandEvent& event ) override
115 {
116 m_footprintFilterOpt->SetValue( true );
117 }
118
119 bool TransferDataToWindow() override;
120 bool TransferDataFromWindow() override;
121
122 void visitItem( BOARD_COMMIT& aCommit, BOARD_ITEM* aItem );
123 void processItem( BOARD_COMMIT& aCommit, BOARD_ITEM* aItem );
124};
125
126
129 m_lineWidth( parent, m_lineWidthLabel, m_LineWidthCtrl, m_lineWidthUnits ),
130 m_textWidth( parent, m_SizeXlabel, m_SizeXCtrl, m_SizeXunit ),
131 m_textHeight( parent, m_SizeYlabel, m_SizeYCtrl, m_SizeYunit ),
132 m_thickness( parent, m_ThicknessLabel, m_ThicknessCtrl, m_ThicknessUnit )
133{
134 m_parent = parent;
135 m_brdSettings = &m_parent->GetDesignSettings();
136 m_isBoardEditor = dynamic_cast<PCB_EDIT_FRAME*>( m_parent ) != nullptr;
137
138 if( !m_isBoardEditor )
139 {
140 m_otherFootprintTexts->SetLabel( _( "Other footprint text items" ) );
141 m_footprintGraphics->SetLabel( _( "Graphic items" ) );
142 m_footprintDimensions->SetLabel( _( "Dimension items" ) );
143
144 m_boardText->Show( false );
145 m_boardGraphics->Show( false );
146
147 m_referenceFilterOpt->Show( false );
148 m_referenceFilter->Show( false );
149 m_footprintFilterOpt->Show( false );
150 m_footprintFilter->Show( false );
151 }
152
156
161
162 m_grid->SetCellHighlightPenWidth( 0 );
163 m_grid->SetDefaultCellFont( KIUI::GetInfoFont( this ) );
164
166
168}
169
170
172{
173 g_modifyReferences = m_references->GetValue();
174 g_modifyValues = m_values->GetValue();
179
180 if( m_isBoardEditor )
181 {
182 g_modifyBoardText = m_boardText->GetValue();
184 }
185
186 g_filterByLayer = m_layerFilterOpt->GetValue();
188
189 if( m_isBoardEditor )
190 {
195 }
196
198}
199
200
202{
204 m_selection = selTool->GetSelection();
205
206 m_references->SetValue( g_modifyReferences );
207 m_values->SetValue( g_modifyValues );
212
213 if( m_isBoardEditor )
214 {
215 m_boardText->SetValue( g_modifyBoardText );
217 }
218
219 if( m_layerFilter->SetLayerSelection( g_layerFilter ) != wxNOT_FOUND )
221
222 if( m_isBoardEditor )
223 {
224 // SetValue() generates events, ChangeValue() does not
225 m_referenceFilter->ChangeValue( g_referenceFilter );
227 m_footprintFilter->ChangeValue( g_footprintFilter );
229 }
230
232
234
236 m_fontCtrl->SetStringSelection( INDETERMINATE_ACTION );
237
241 m_bold->Set3StateValue( wxCHK_UNDETERMINED );
242 m_italic->Set3StateValue( wxCHK_UNDETERMINED );
243 m_keepUpright->Set3StateValue( wxCHK_UNDETERMINED );
244 m_visible->Set3StateValue( wxCHK_UNDETERMINED );
246
247 wxCommandEvent dummy;
249
250#define SET_INT_VALUE( aRow, aCol, aValue ) \
251 m_grid->SetCellValue( aRow, aCol, m_parent->StringFromValue( aValue, true ) )
252
253#define SET_BOOL_VALUE( aRow, aCol, aValue ) \
254 attr = new wxGridCellAttr; \
255 attr->SetRenderer( new wxGridCellBoolRenderer() ); \
256 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER ); \
257 attr->SetReadOnly(); \
258 m_grid->SetAttr( aRow, aCol, attr ); \
259 m_grid->SetCellValue( aRow, aCol, ( aValue ) ? wxT( "1" ) : wxT( "" ) )
260
261 const BOARD_DESIGN_SETTINGS& bds = m_parent->GetBoard()->GetDesignSettings();
262 wxGridCellAttr* attr;
263
264 m_grid->SetCellValue( ROW_SILK, COL_CLASS_NAME, _( "Silk Layers" ) );
265 m_grid->SetCellValue( ROW_COPPER, COL_CLASS_NAME, _( "Copper Layers" ) );
266 m_grid->SetCellValue( ROW_EDGES, COL_CLASS_NAME, _( "Edge Cuts" ) );
267 m_grid->SetCellValue( ROW_COURTYARD, COL_CLASS_NAME, _( "Courtyards" ) );
268 m_grid->SetCellValue( ROW_FAB, COL_CLASS_NAME, _( "Fab Layers" ) );
269 m_grid->SetCellValue( ROW_OTHERS, COL_CLASS_NAME, _( "Other Layers" ) );
270
271 m_grid->SetCellValue( ROW_HEADER, COL_LINE_THICKNESS, _( "Line Thickness" ) );
278
279 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_WIDTH, _( "Text Width" ) );
284
285 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_HEIGHT, _( "Text Height" ) );
290
291 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_THICKNESS, _( "Text Thickness" ) );
296
297 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_ITALIC, _( "Italic" ) );
302
303 m_grid->SetCellValue( ROW_HEADER, COL_TEXT_UPRIGHT, _( "Upright" ) );
308
309 return true;
310
311#undef SET_INT_VALUE
312#undef SET_BOOL_VALUE
313}
314
315
317{
318 // Update the UNIT_BINDER controls if the action to take is changed
319 bool enable = m_setToSpecifiedValues->GetValue();
320
321 m_LayerLabel->Enable( enable );
322 m_LayerCtrl->Enable( enable );
323
324 m_lineWidth.Enable( enable );
325 m_textWidth.Enable( enable );
326 m_textHeight.Enable( enable );
327 m_thickness.Enable( enable );
328
329 m_fontLabel->Enable( enable );
330 m_fontCtrl->Enable( enable );
331
332 m_centerOnFP->Enable( enable );
333
334 enable = !enable;
335 m_grid->Enable( enable );
336}
337
338
340{
341 // Update the UI for the elements inside the use specified values sizer
342 event.Enable( m_setToSpecifiedValues->GetValue() );
343}
344
345
347{
348 if( m_footprintDimensions->GetValue() || m_boardDimensions->GetValue() )
349 m_setToLayerDefaults->SetLabel( _( "Set to layer and dimension default values:" ) );
350 else
351 m_setToLayerDefaults->SetLabel( _( "Set to layer default values:" ) );
352}
353
354
356{
357 aCommit.Modify( aItem );
358
359 PCB_TEXT* text = dynamic_cast<PCB_TEXT*>( aItem );
360 PCB_SHAPE* shape = dynamic_cast<PCB_SHAPE*>( aItem );
361 PCB_DIMENSION_BASE* dimension = dynamic_cast<PCB_DIMENSION_BASE*>( aItem );
362 FOOTPRINT* parentFP = aItem->GetParentFootprint();
363
364 if( m_setToSpecifiedValues->GetValue() )
365 {
368
369 if( text )
370 {
372 text->SetTextSize( VECTOR2I( m_textWidth.GetValue(), text->GetTextSize().y ) );
373
375 text->SetTextSize( VECTOR2I( text->GetTextSize().x, m_textHeight.GetValue() ) );
376
378 text->SetTextThickness( m_thickness.GetValue() );
379
380 // Must be after SetTextSize()
381 if( m_bold->Get3StateValue() != wxCHK_UNDETERMINED )
382 text->SetBold( m_bold->GetValue() );
383
384 if( m_italic->Get3StateValue() != wxCHK_UNDETERMINED )
385 text->SetItalic( m_italic->GetValue() );
386
387 // Must come after setting bold & italic
388 if( m_fontCtrl->GetStringSelection() != INDETERMINATE_ACTION )
389 {
390 text->SetFont( m_fontCtrl->GetFontSelection( text->IsBold(), text->IsItalic() ) );
391 }
392 else if(( m_italic->Get3StateValue() != wxCHK_UNDETERMINED
393 || m_bold->Get3StateValue() != wxCHK_UNDETERMINED ) )
394 {
395 wxString fontName = text->GetFontName();
396
397 if( !text->GetFontName().IsEmpty() )
398 {
399 text->SetFont( KIFONT::FONT::GetFont( text->GetFontName(), text->IsBold(),
400 text->IsItalic(),
401 m_parent->GetBoard()->GetEmbeddedFiles()->GetFontFiles() ) );
402 }
403 }
404
405 if( parentFP )
406 {
407 if( m_visible->Get3StateValue() != wxCHK_UNDETERMINED )
408 text->SetVisible( m_visible->GetValue() );
409
410 if( m_keepUpright->Get3StateValue() != wxCHK_UNDETERMINED )
411 text->SetKeepUpright( m_keepUpright->GetValue() );
412
413 if( m_centerOnFP->GetValue() == wxCHK_CHECKED )
414 text->SetTextPos( text->GetParent()->GetCenter() );
415 }
416 }
417
419 {
420 if( shape )
421 {
422 STROKE_PARAMS stroke = shape->GetStroke();
423 stroke.SetWidth( m_lineWidth.GetValue() );
424 shape->SetStroke( stroke );
425 }
426
427 if( dimension )
428 dimension->SetLineThickness( m_lineWidth.GetValue() );
429 }
430 }
431 else
432 {
433 PCB_LAYER_ID layer = aItem->GetLayer();
434
435 if( text )
436 {
437 text->SetTextSize( m_brdSettings->GetTextSize( layer ) );
438 text->SetTextThickness( m_brdSettings->GetTextThickness( layer ) );
439 text->SetItalic( m_brdSettings->GetTextItalic( layer ) );
440
441 if( parentFP )
442 text->SetKeepUpright( m_brdSettings->GetTextUpright( layer ) );
443 }
444
445 if( shape )
446 {
447 STROKE_PARAMS stroke = shape->GetStroke();
448 stroke.SetWidth( m_brdSettings->GetLineThickness( layer ) );
449 shape->SetStroke( stroke );
450 }
451
452 if( dimension )
453 {
454 dimension->SetLineThickness( m_brdSettings->GetLineThickness( layer ) );
461 dimension->Update(); // refresh text & geometry
462 }
463 }
464}
465
466
468{
469 if( m_selectedItemsFilter->GetValue() )
470 {
471 BOARD_ITEM* candidate = aItem;
472
473 if( !candidate->IsSelected() )
474 {
475 if( candidate->GetParent() && candidate->GetParent()->Type() == PCB_FOOTPRINT_T )
476 candidate = candidate->GetParent();
477 }
478
479 if( !candidate->IsSelected() )
480 {
481 candidate = candidate->GetParentGroup();
482
483 while( candidate && !candidate->IsSelected() )
484 candidate = candidate->GetParentGroup();
485
486 if( !candidate )
487 return;
488 }
489 }
490
492 {
493 if( aItem->GetLayer() != m_layerFilter->GetLayerSelection() )
494 return;
495 }
496
497 if( m_isBoardEditor )
498 {
499 if( m_referenceFilterOpt->GetValue() && !m_referenceFilter->GetValue().IsEmpty() )
500 {
501 if( FOOTPRINT* fp = aItem->GetParentFootprint() )
502 {
503 if( !WildCompareString( m_referenceFilter->GetValue(), fp->GetReference(), false ) )
504 return;
505 }
506 }
507
508 if( m_footprintFilterOpt->GetValue() && !m_footprintFilter->GetValue().IsEmpty() )
509 {
510 if( FOOTPRINT* fp = aItem->GetParentFootprint() )
511 {
512 if( !WildCompareString( m_footprintFilter->GetValue(), fp->GetFPID().Format(), false ) )
513 return;
514 }
515 }
516 }
517
518 processItem( aCommit, aItem );
519}
520
521
523{
524 int minTextSize = pcbIUScale.mmToIU( TEXT_MIN_SIZE_MM );
525 int maxTextSize = pcbIUScale.mmToIU( TEXT_MAX_SIZE_MM );
526
527 if( !m_textWidth.Validate( minTextSize, maxTextSize )
528 || !m_textHeight.Validate( minTextSize, maxTextSize ) )
529 {
530 return false;
531 }
532
533 BOARD_COMMIT commit( m_parent );
534
535 // Go through the footprints
536 for( FOOTPRINT* fp : m_parent->GetBoard()->Footprints() )
537 {
538 if( m_references->GetValue() )
539 visitItem( commit, &fp->Reference() );
540
541 if( m_values->GetValue() )
542 visitItem( commit, &fp->Value() );
543
544 if( m_footprintFields->GetValue() )
545 {
546 for( PCB_FIELD* field : fp->GetFields() )
547 {
548 if( field->IsReference() )
549 continue;
550
551 if( field->IsValue() )
552 continue;
553
554 visitItem( commit, field );
555 }
556 }
557
558 // Go through all other footprint items
559 for( BOARD_ITEM* boardItem : fp->GraphicalItems() )
560 {
561 KICAD_T itemType = boardItem->Type();
562
563 if( itemType == PCB_TEXT_T || itemType == PCB_TEXTBOX_T )
564 {
565 if( m_otherFootprintTexts->GetValue() )
566 visitItem( commit, boardItem );
567 }
568 else if( BaseType( itemType ) == PCB_DIMENSION_T )
569 {
570 if( m_footprintDimensions->GetValue() )
571 visitItem( commit, boardItem );
572 }
573 else if( itemType == PCB_SHAPE_T )
574 {
575 if( m_footprintGraphics->GetValue() )
576 visitItem( commit, boardItem );
577 }
578 }
579 }
580
581 if( m_isBoardEditor )
582 {
583 // Go through the PCB text & graphic items
584 for( BOARD_ITEM* boardItem : m_parent->GetBoard()->Drawings() )
585 {
586 KICAD_T itemType = boardItem->Type();
587
588 if( itemType == PCB_TEXT_T || itemType == PCB_TEXTBOX_T )
589 {
590 if( m_boardText->GetValue() )
591 visitItem( commit, boardItem );
592 }
593 else if( BaseType( itemType ) == PCB_DIMENSION_T )
594 {
595 if( m_boardDimensions->GetValue() )
596 visitItem( commit, boardItem );
597 }
598 else if( itemType == PCB_SHAPE_T || BaseType( itemType ) == PCB_DIMENSION_T )
599 {
600 if( m_boardGraphics->GetValue() )
601 visitItem( commit, boardItem );
602 }
603 }
604 }
605
606 commit.Push( _( "Edit Text and Graphics" ) );
608
609 return true;
610}
611
612
614{
615 PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
617
618 dlg.ShowModal();
619 return 0;
620}
621
622
624{
625 FOOTPRINT_EDIT_FRAME* editFrame = getEditFrame<FOOTPRINT_EDIT_FRAME>();
627
628 dlg.ShowModal();
629 return 0;
630}
631
632
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
@ LAYER_CLASS_OTHERS
@ LAYER_CLASS_FAB
@ LAYER_CLASS_COURTYARD
@ LAYER_CLASS_SILK
@ LAYER_CLASS_COPPER
@ LAYER_CLASS_EDGES
Container for design settings for a BOARD object.
DIM_PRECISION m_DimensionPrecision
Number of digits after the decimal.
DIM_UNITS_FORMAT m_DimensionUnitsFormat
bool GetTextUpright(PCB_LAYER_ID aLayer) const
int GetTextThickness(PCB_LAYER_ID aLayer) const
Return the default text thickness from the layer class for the given layer.
bool m_TextUpright[LAYER_CLASS_COUNT]
bool GetTextItalic(PCB_LAYER_ID aLayer) const
int m_TextThickness[LAYER_CLASS_COUNT]
int m_LineThickness[LAYER_CLASS_COUNT]
VECTOR2I GetTextSize(PCB_LAYER_ID aLayer) const
Return the default text size from the layer class for the given layer.
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
VECTOR2I m_TextSize[LAYER_CLASS_COUNT]
bool m_TextItalic[LAYER_CLASS_COUNT]
DIM_TEXT_POSITION m_DimensionTextPosition
DIM_UNITS_MODE m_DimensionUnitsMode
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:240
PCB_GROUP * GetParentGroup() const
Definition: board_item.h:93
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:276
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:264
BOARD_ITEM_CONTAINER * GetParent() const
Definition: board_item.h:218
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
Definition: commit.h:105
void processItem(SCH_COMMIT *aCommit, const SCH_SHEET_PATH &aSheetPath, SCH_ITEM *aItem)
void visitItem(SCH_COMMIT *aCommit, const SCH_SHEET_PATH &aSheetPath, SCH_ITEM *aItem)
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
bool IsSelected() const
Definition: eda_item.h:110
KIFONT::FONT * GetFontSelection(bool aBold, bool aItalic) const
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false, const std::vector< wxString > *aEmbeddedFiles=nullptr)
Definition: font.cpp:146
int SetLayerSelection(int layer)
bool SetLayersHotkeys(bool value)
Common, abstract interface for edit frames.
Abstract dimension API.
void Update()
Update the dimension's cached text and geometry.
void SetUnitsFormat(const DIM_UNITS_FORMAT aFormat)
void SetSuppressZeroes(bool aSuppress)
void SetTextPositionMode(DIM_TEXT_POSITION aMode)
void SetLineThickness(int aWidth)
void SetPrecision(DIM_PRECISION aPrecision)
void SetUnitsMode(DIM_UNITS_MODE aMode)
void SetKeepTextAligned(bool aKeepAligned)
The main frame for Pcbnew.
void SetBoardFrame(PCB_BASE_FRAME *aFrame)
void SetUndefinedLayerName(const wxString &aName)
The selection tool: currently supports:
PCB_SELECTION & GetSelection()
STROKE_PARAMS GetStroke() const override
Definition: pcb_shape.h:85
void SetStroke(const STROKE_PARAMS &aStroke) override
Definition: pcb_shape.h:86
SCH_DRAW_PANEL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
Simple container to manage line stroke parameters.
Definition: stroke_params.h:81
void SetWidth(int aWidth)
Definition: stroke_params.h:92
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
Generic, UI-independent tool event.
Definition: tool_event.h:167
virtual long long int GetValue()
Return the current value in Internal Units.
void Enable(bool aEnable)
Enable/disable the label, widget and units label.
bool IsIndeterminate() const
Return true if the control holds the indeterminate value (for instance, if it represents a multiple s...
virtual bool Validate(double aMin, double aMax, EDA_UNITS aUnits=EDA_UNITS::UNSCALED)
Validate the control against the given range, informing the user of any errors found.
virtual void SetValue(long long int aValue)
Set new value (in Internal Units) for the text field, taking care of units conversion.
#define _(s)
#define TEXT_MIN_SIZE_MM
Minimum text size (1 micron).
Definition: eda_text.h:46
#define TEXT_MAX_SIZE_MM
Maximum text size in mm (~10 inches)
Definition: eda_text.h:47
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
PCB_LAYER_ID ToLAYER_ID(int aLayer)
Definition: lset.cpp:875
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
Definition: ui_common.cpp:154
Class to handle a set of BOARD_ITEMs.
#define SET_INT_VALUE(aRow, aCol, aValue)
#define SET_BOOL_VALUE(aRow, aCol, aValue)
std::vector< FAB_LAYER_COLOR > dummy
bool WildCompareString(const wxString &pattern, const wxString &string_to_tst, bool case_sensitive)
Compare a string against wild card (* and ?) pattern using the usual rules.
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
constexpr KICAD_T BaseType(const KICAD_T aType)
Return the underlying type of the given type.
Definition: typeinfo.h:248
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:88
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition: typeinfo.h:93
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:92
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
Definition: typeinfo.h:100
#define INDETERMINATE_ACTION
Definition: ui_common.h:47