Przeglądaj źródła

Make all of the prefs sections into subclasses of PreferencesSectionUI

David Robertson 5 lat temu
rodzic
commit
1fc076b158

+ 9 - 2
flatcamGUI/preferences/PreferencesUIManager.py

@@ -543,8 +543,15 @@ class PreferencesUIManager:
         }
 
         self.sections = [
-            # FIXME!
-            ui.general_defaults_form
+            # FIXME
+            ui.general_defaults_form,
+            ui.gerber_defaults_form,
+            ui.excellon_defaults_form,
+            ui.geometry_defaults_form,
+            ui.cncjob_defaults_form,
+            ui.tools_defaults_form,
+            ui.tools2_defaults_form,
+            ui.util_defaults_form
         ]
 
     def get_form_fields(self) -> Dict[str, Any]:

+ 11 - 14
flatcamGUI/preferences/cncjob/CNCJobPreferencesUI.py

@@ -1,27 +1,24 @@
 from PyQt5 import QtWidgets
 
+from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
+from flatcamGUI.preferences.PreferencesSectionUI import PreferencesSectionUI
 from flatcamGUI.preferences.cncjob.CNCJobAdvOptPrefGroupUI import CNCJobAdvOptPrefGroupUI
 from flatcamGUI.preferences.cncjob.CNCJobOptPrefGroupUI import CNCJobOptPrefGroupUI
 from flatcamGUI.preferences.cncjob.CNCJobGenPrefGroupUI import CNCJobGenPrefGroupUI
 
 
-class CNCJobPreferencesUI(QtWidgets.QWidget):
+class CNCJobPreferencesUI(PreferencesSectionUI):
 
-    def __init__(self, decimals, parent=None):
-        QtWidgets.QWidget.__init__(self, parent=parent)
-        self.layout = QtWidgets.QHBoxLayout()
-        self.setLayout(self.layout)
+    def __init__(self, decimals, **kwargs):
         self.decimals = decimals
-
         self.cncjob_gen_group = CNCJobGenPrefGroupUI(decimals=self.decimals)
-        self.cncjob_gen_group.setMinimumWidth(260)
         self.cncjob_opt_group = CNCJobOptPrefGroupUI(decimals=self.decimals)
-        self.cncjob_opt_group.setMinimumWidth(260)
         self.cncjob_adv_opt_group = CNCJobAdvOptPrefGroupUI(decimals=self.decimals)
-        self.cncjob_adv_opt_group.setMinimumWidth(260)
-
-        self.layout.addWidget(self.cncjob_gen_group)
-        self.layout.addWidget(self.cncjob_opt_group)
-        self.layout.addWidget(self.cncjob_adv_opt_group)
+        super().__init__(**kwargs)
 
-        self.layout.addStretch()
+    def build_groups(self) -> [OptionsGroupUI]:
+        return [
+            self.cncjob_gen_group,
+            self.cncjob_opt_group,
+            self.cncjob_adv_opt_group
+        ]

+ 13 - 37
flatcamGUI/preferences/excellon/ExcellonPreferencesUI.py

@@ -1,53 +1,29 @@
-from PyQt5 import QtWidgets
-from PyQt5.QtCore import QSettings
-
+from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
+from flatcamGUI.preferences.PreferencesSectionUI import PreferencesSectionUI
 from flatcamGUI.preferences.excellon.ExcellonEditorPrefGroupUI import ExcellonEditorPrefGroupUI
 from flatcamGUI.preferences.excellon.ExcellonExpPrefGroupUI import ExcellonExpPrefGroupUI
 from flatcamGUI.preferences.excellon.ExcellonAdvOptPrefGroupUI import ExcellonAdvOptPrefGroupUI
 from flatcamGUI.preferences.excellon.ExcellonOptPrefGroupUI import ExcellonOptPrefGroupUI
 from flatcamGUI.preferences.excellon.ExcellonGenPrefGroupUI import ExcellonGenPrefGroupUI
 
-import gettext
-import FlatCAMTranslation as fcTranslate
-import builtins
-
-fcTranslate.apply_language('strings')
-if '_' not in builtins.__dict__:
-    _ = gettext.gettext
-
-settings = QSettings("Open Source", "FlatCAM")
-if settings.contains("machinist"):
-    machinist_setting = settings.value('machinist', type=int)
-else:
-    machinist_setting = 0
 
+class ExcellonPreferencesUI(PreferencesSectionUI):
 
-class ExcellonPreferencesUI(QtWidgets.QWidget):
-
-    def __init__(self, decimals, parent=None):
-        QtWidgets.QWidget.__init__(self, parent=parent)
-        self.layout = QtWidgets.QHBoxLayout()
-        self.setLayout(self.layout)
+    def __init__(self, decimals, **kwargs):
         self.decimals = decimals
-
         self.excellon_gen_group = ExcellonGenPrefGroupUI(decimals=self.decimals)
-        self.excellon_gen_group.setMinimumWidth(220)
         self.excellon_opt_group = ExcellonOptPrefGroupUI(decimals=self.decimals)
-        self.excellon_opt_group.setMinimumWidth(290)
         self.excellon_exp_group = ExcellonExpPrefGroupUI(decimals=self.decimals)
-        self.excellon_exp_group.setMinimumWidth(250)
         self.excellon_adv_opt_group = ExcellonAdvOptPrefGroupUI(decimals=self.decimals)
-        self.excellon_adv_opt_group.setMinimumWidth(250)
         self.excellon_editor_group = ExcellonEditorPrefGroupUI(decimals=self.decimals)
-        self.excellon_editor_group.setMinimumWidth(260)
-
-        self.vlay = QtWidgets.QVBoxLayout()
-        self.vlay.addWidget(self.excellon_opt_group)
-        self.vlay.addWidget(self.excellon_exp_group)
+        super().__init__(**kwargs)
 
-        self.layout.addWidget(self.excellon_gen_group)
-        self.layout.addLayout(self.vlay)
-        self.layout.addWidget(self.excellon_adv_opt_group)
-        self.layout.addWidget(self.excellon_editor_group)
+    def build_groups(self) -> [OptionsGroupUI]:
+        return [
+            self.excellon_gen_group,
+            self.excellon_opt_group,
+            self.excellon_exp_group,
+            self.excellon_adv_opt_group,
+            self.excellon_editor_group
+        ]
 
-        self.layout.addStretch()

+ 13 - 34
flatcamGUI/preferences/geometry/GeometryPreferencesUI.py

@@ -1,46 +1,25 @@
-from PyQt5 import QtWidgets
-from PyQt5.QtCore import QSettings
-
+from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
+from flatcamGUI.preferences.PreferencesSectionUI import PreferencesSectionUI
 from flatcamGUI.preferences.geometry.GeometryEditorPrefGroupUI import GeometryEditorPrefGroupUI
 from flatcamGUI.preferences.geometry.GeometryAdvOptPrefGroupUI import GeometryAdvOptPrefGroupUI
 from flatcamGUI.preferences.geometry.GeometryOptPrefGroupUI import GeometryOptPrefGroupUI
 from flatcamGUI.preferences.geometry.GeometryGenPrefGroupUI import GeometryGenPrefGroupUI
 
-import gettext
-import FlatCAMTranslation as fcTranslate
-import builtins
-
-fcTranslate.apply_language('strings')
-if '_' not in builtins.__dict__:
-    _ = gettext.gettext
-
-settings = QSettings("Open Source", "FlatCAM")
-if settings.contains("machinist"):
-    machinist_setting = settings.value('machinist', type=int)
-else:
-    machinist_setting = 0
-
 
-class GeometryPreferencesUI(QtWidgets.QWidget):
+class GeometryPreferencesUI(PreferencesSectionUI):
 
-    def __init__(self, decimals, parent=None):
-        QtWidgets.QWidget.__init__(self, parent=parent)
-        self.layout = QtWidgets.QHBoxLayout()
-        self.setLayout(self.layout)
+    def __init__(self, decimals, **kwargs):
         self.decimals = decimals
-
         self.geometry_gen_group = GeometryGenPrefGroupUI(decimals=self.decimals)
-        self.geometry_gen_group.setMinimumWidth(220)
         self.geometry_opt_group = GeometryOptPrefGroupUI(decimals=self.decimals)
-        self.geometry_opt_group.setMinimumWidth(300)
         self.geometry_adv_opt_group = GeometryAdvOptPrefGroupUI(decimals=self.decimals)
-        self.geometry_adv_opt_group.setMinimumWidth(270)
         self.geometry_editor_group = GeometryEditorPrefGroupUI(decimals=self.decimals)
-        self.geometry_editor_group.setMinimumWidth(250)
-
-        self.layout.addWidget(self.geometry_gen_group)
-        self.layout.addWidget(self.geometry_opt_group)
-        self.layout.addWidget(self.geometry_adv_opt_group)
-        self.layout.addWidget(self.geometry_editor_group)
-
-        self.layout.addStretch()
+        super().__init__(**kwargs)
+
+    def build_groups(self) -> [OptionsGroupUI]:
+        return [
+            self.geometry_gen_group,
+            self.geometry_opt_group,
+            self.geometry_adv_opt_group,
+            self.geometry_editor_group
+        ]

+ 14 - 39
flatcamGUI/preferences/gerber/GerberPreferencesUI.py

@@ -1,53 +1,28 @@
-from PyQt5 import QtWidgets
-from PyQt5.QtCore import QSettings
-
+from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
+from flatcamGUI.preferences.PreferencesSectionUI import PreferencesSectionUI
 from flatcamGUI.preferences.gerber.GerberEditorPrefGroupUI import GerberEditorPrefGroupUI
 from flatcamGUI.preferences.gerber.GerberExpPrefGroupUI import GerberExpPrefGroupUI
 from flatcamGUI.preferences.gerber.GerberAdvOptPrefGroupUI import GerberAdvOptPrefGroupUI
 from flatcamGUI.preferences.gerber.GerberOptPrefGroupUI import GerberOptPrefGroupUI
 from flatcamGUI.preferences.gerber.GerberGenPrefGroupUI import GerberGenPrefGroupUI
 
-import gettext
-import FlatCAMTranslation as fcTranslate
-import builtins
-
-fcTranslate.apply_language('strings')
-if '_' not in builtins.__dict__:
-    _ = gettext.gettext
-
-settings = QSettings("Open Source", "FlatCAM")
-if settings.contains("machinist"):
-    machinist_setting = settings.value('machinist', type=int)
-else:
-    machinist_setting = 0
-
 
-class GerberPreferencesUI(QtWidgets.QWidget):
+class GerberPreferencesUI(PreferencesSectionUI):
 
-    def __init__(self, decimals, parent=None):
-        QtWidgets.QWidget.__init__(self, parent=parent)
-        self.layout = QtWidgets.QHBoxLayout()
-        self.setLayout(self.layout)
+    def __init__(self, decimals, **kwargs):
         self.decimals = decimals
-
         self.gerber_gen_group = GerberGenPrefGroupUI(decimals=self.decimals)
-        self.gerber_gen_group.setMinimumWidth(250)
         self.gerber_opt_group = GerberOptPrefGroupUI(decimals=self.decimals)
-        self.gerber_opt_group.setMinimumWidth(250)
         self.gerber_exp_group = GerberExpPrefGroupUI(decimals=self.decimals)
-        self.gerber_exp_group.setMinimumWidth(230)
         self.gerber_adv_opt_group = GerberAdvOptPrefGroupUI(decimals=self.decimals)
-        self.gerber_adv_opt_group.setMinimumWidth(200)
         self.gerber_editor_group = GerberEditorPrefGroupUI(decimals=self.decimals)
-        self.gerber_editor_group.setMinimumWidth(200)
-
-        self.vlay = QtWidgets.QVBoxLayout()
-        self.vlay.addWidget(self.gerber_opt_group)
-        self.vlay.addWidget(self.gerber_exp_group)
-
-        self.layout.addWidget(self.gerber_gen_group)
-        self.layout.addLayout(self.vlay)
-        self.layout.addWidget(self.gerber_adv_opt_group)
-        self.layout.addWidget(self.gerber_editor_group)
-
-        self.layout.addStretch()
+        super().__init__(**kwargs)
+
+    def build_groups(self) -> [OptionsGroupUI]:
+        return [
+            self.gerber_gen_group,
+            self.gerber_opt_group,  # FIXME vertical layout with opt and ext
+            self.gerber_exp_group,
+            self.gerber_adv_opt_group,
+            self.gerber_editor_group
+        ]

+ 22 - 62
flatcamGUI/preferences/tools/Tools2PreferencesUI.py

@@ -1,6 +1,5 @@
-from PyQt5 import QtWidgets
-from PyQt5.QtCore import QSettings
-
+from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
+from flatcamGUI.preferences.PreferencesSectionUI import PreferencesSectionUI
 from flatcamGUI.preferences.tools.Tools2InvertPrefGroupUI import Tools2InvertPrefGroupUI
 from flatcamGUI.preferences.tools.Tools2PunchGerberPrefGroupUI import Tools2PunchGerberPrefGroupUI
 from flatcamGUI.preferences.tools.Tools2EDrillsPrefGroupUI import Tools2EDrillsPrefGroupUI
@@ -11,79 +10,40 @@ from flatcamGUI.preferences.tools.Tools2QRCodePrefGroupUI import Tools2QRCodePre
 from flatcamGUI.preferences.tools.Tools2OptimalPrefGroupUI import Tools2OptimalPrefGroupUI
 from flatcamGUI.preferences.tools.Tools2RulesCheckPrefGroupUI import Tools2RulesCheckPrefGroupUI
 
-import gettext
-import FlatCAMTranslation as fcTranslate
-import builtins
-
-fcTranslate.apply_language('strings')
-if '_' not in builtins.__dict__:
-    _ = gettext.gettext
-
-settings = QSettings("Open Source", "FlatCAM")
-if settings.contains("machinist"):
-    machinist_setting = settings.value('machinist', type=int)
-else:
-    machinist_setting = 0
-
 
-class Tools2PreferencesUI(QtWidgets.QWidget):
+class Tools2PreferencesUI(PreferencesSectionUI):
 
-    def __init__(self, decimals, parent=None):
-        QtWidgets.QWidget.__init__(self, parent=parent)
-        self.layout = QtWidgets.QHBoxLayout()
-        self.setLayout(self.layout)
+    def __init__(self, decimals, **kwargs):
         self.decimals = decimals
-
         self.tools2_checkrules_group = Tools2RulesCheckPrefGroupUI(decimals=self.decimals)
-        self.tools2_checkrules_group.setMinimumWidth(220)
-
         self.tools2_optimal_group = Tools2OptimalPrefGroupUI(decimals=self.decimals)
-        self.tools2_optimal_group.setMinimumWidth(220)
-
         self.tools2_qrcode_group = Tools2QRCodePrefGroupUI(decimals=self.decimals)
-        self.tools2_qrcode_group.setMinimumWidth(220)
-
         self.tools2_cfill_group = Tools2CThievingPrefGroupUI(decimals=self.decimals)
-        self.tools2_cfill_group.setMinimumWidth(220)
-
         self.tools2_fiducials_group = Tools2FiducialsPrefGroupUI(decimals=self.decimals)
-        self.tools2_fiducials_group.setMinimumWidth(220)
-
         self.tools2_cal_group = Tools2CalPrefGroupUI(decimals=self.decimals)
-        self.tools2_cal_group.setMinimumWidth(220)
-
         self.tools2_edrills_group = Tools2EDrillsPrefGroupUI(decimals=self.decimals)
-        self.tools2_edrills_group.setMinimumWidth(220)
-
         self.tools2_punch_group = Tools2PunchGerberPrefGroupUI(decimals=self.decimals)
-        self.tools2_punch_group.setMinimumWidth(220)
-
         self.tools2_invert_group = Tools2InvertPrefGroupUI(decimals=self.decimals)
-        self.tools2_invert_group.setMinimumWidth(220)
-
-        self.vlay = QtWidgets.QVBoxLayout()
-        self.vlay.addWidget(self.tools2_checkrules_group)
-        self.vlay.addWidget(self.tools2_optimal_group)
-
-        self.vlay1 = QtWidgets.QVBoxLayout()
-        self.vlay1.addWidget(self.tools2_qrcode_group)
-        self.vlay1.addWidget(self.tools2_fiducials_group)
+        super().__init__(**kwargs)
 
-        self.vlay2 = QtWidgets.QVBoxLayout()
-        self.vlay2.addWidget(self.tools2_cfill_group)
+    def build_groups(self) -> [OptionsGroupUI]:
+        return [
+            # fixme column 1
+            self.tools2_checkrules_group,
+            self.tools2_optimal_group,
 
-        self.vlay3 = QtWidgets.QVBoxLayout()
-        self.vlay3.addWidget(self.tools2_cal_group)
-        self.vlay3.addWidget(self.tools2_edrills_group)
+            # fixme column 2
+            self.tools2_qrcode_group,
+            self.tools2_fiducials_group,
 
-        self.vlay4 = QtWidgets.QVBoxLayout()
-        self.vlay4.addWidget(self.tools2_punch_group)
-        self.vlay4.addWidget(self.tools2_invert_group)
+            # fixme column 3
+            self.tools2_cfill_group,
 
-        self.layout.addLayout(self.vlay)
-        self.layout.addLayout(self.vlay1)
-        self.layout.addLayout(self.vlay2)
-        self.layout.addLayout(self.vlay3)
-        self.layout.addLayout(self.vlay4)
+            # fixme column 4
+            self.tools2_cal_group,
+            self.tools2_edrills_group,
 
-        self.layout.addStretch()
+            # fixme column 5
+            self.tools2_punch_group,
+            self.tools2_invert_group,
+        ]

+ 23 - 64
flatcamGUI/preferences/tools/ToolsPreferencesUI.py

@@ -1,6 +1,5 @@
-from PyQt5 import QtWidgets
-from PyQt5.QtCore import QSettings
-
+from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
+from flatcamGUI.preferences.PreferencesSectionUI import PreferencesSectionUI
 from flatcamGUI.preferences.tools.ToolsSubPrefGroupUI import ToolsSubPrefGroupUI
 from flatcamGUI.preferences.tools.ToolsSolderpastePrefGroupUI import ToolsSolderpastePrefGroupUI
 from flatcamGUI.preferences.tools.ToolsTransformPrefGroupUI import ToolsTransformPrefGroupUI
@@ -12,83 +11,43 @@ from flatcamGUI.preferences.tools.Tools2sidedPrefGroupUI import Tools2sidedPrefG
 from flatcamGUI.preferences.tools.ToolsCutoutPrefGroupUI import ToolsCutoutPrefGroupUI
 from flatcamGUI.preferences.tools.ToolsNCCPrefGroupUI import ToolsNCCPrefGroupUI
 
-import gettext
-import FlatCAMTranslation as fcTranslate
-import builtins
-
-fcTranslate.apply_language('strings')
-if '_' not in builtins.__dict__:
-    _ = gettext.gettext
-
-settings = QSettings("Open Source", "FlatCAM")
-if settings.contains("machinist"):
-    machinist_setting = settings.value('machinist', type=int)
-else:
-    machinist_setting = 0
-
 
-class ToolsPreferencesUI(QtWidgets.QWidget):
+class ToolsPreferencesUI(PreferencesSectionUI):
 
-    def __init__(self, decimals, parent=None):
-        QtWidgets.QWidget.__init__(self, parent=parent)
-        self.layout = QtWidgets.QHBoxLayout()
-        self.setLayout(self.layout)
+    def __init__(self, decimals, **kwargs):
         self.decimals = decimals
-
         self.tools_ncc_group = ToolsNCCPrefGroupUI(decimals=self.decimals)
-        self.tools_ncc_group.setMinimumWidth(220)
-
         self.tools_paint_group = ToolsPaintPrefGroupUI(decimals=self.decimals)
-        self.tools_paint_group.setMinimumWidth(220)
-
         self.tools_cutout_group = ToolsCutoutPrefGroupUI(decimals=self.decimals)
-        self.tools_cutout_group.setMinimumWidth(220)
-
         self.tools_2sided_group = Tools2sidedPrefGroupUI(decimals=self.decimals)
-        self.tools_2sided_group.setMinimumWidth(220)
-
         self.tools_film_group = ToolsFilmPrefGroupUI(decimals=self.decimals)
-        self.tools_film_group.setMinimumWidth(220)
-
         self.tools_panelize_group = ToolsPanelizePrefGroupUI(decimals=self.decimals)
-        self.tools_panelize_group.setMinimumWidth(220)
-
         self.tools_calculators_group = ToolsCalculatorsPrefGroupUI(decimals=self.decimals)
-        self.tools_calculators_group.setMinimumWidth(220)
-
         self.tools_transform_group = ToolsTransformPrefGroupUI(decimals=self.decimals)
-        self.tools_transform_group.setMinimumWidth(200)
-
         self.tools_solderpaste_group = ToolsSolderpastePrefGroupUI(decimals=self.decimals)
-        self.tools_solderpaste_group.setMinimumWidth(200)
-
         self.tools_sub_group = ToolsSubPrefGroupUI(decimals=self.decimals)
-        self.tools_sub_group.setMinimumWidth(200)
-
-        self.vlay = QtWidgets.QVBoxLayout()
-        self.vlay.addWidget(self.tools_ncc_group)
-        self.vlay.addWidget(self.tools_cutout_group)
+        super().__init__(**kwargs)
 
-        self.vlay1 = QtWidgets.QVBoxLayout()
-        self.vlay1.addWidget(self.tools_paint_group)
-        self.vlay1.addWidget(self.tools_panelize_group)
+    def build_groups(self) -> [OptionsGroupUI]:
+        return [
+            # fixme column 1
+            self.tools_ncc_group,
+            self.tools_cutout_group,
 
-        self.vlay2 = QtWidgets.QVBoxLayout()
-        self.vlay2.addWidget(self.tools_transform_group)
-        self.vlay2.addWidget(self.tools_2sided_group)
-        self.vlay2.addWidget(self.tools_sub_group)
+            # fixme column 2
+            self.tools_paint_group,
+            self.tools_panelize_group,
 
-        self.vlay3 = QtWidgets.QVBoxLayout()
-        self.vlay3.addWidget(self.tools_film_group)
-        self.vlay3.addWidget(self.tools_calculators_group)
+            # fixme column 3
+            self.tools_transform_group,
+            self.tools_2sided_group,
+            self.tools_sub_group,
 
-        self.vlay4 = QtWidgets.QVBoxLayout()
-        self.vlay4.addWidget(self.tools_solderpaste_group)
+            # fixme column 4
+            self.tools_film_group,
+            self.tools_calculators_group,
 
-        self.layout.addLayout(self.vlay)
-        self.layout.addLayout(self.vlay1)
-        self.layout.addLayout(self.vlay2)
-        self.layout.addLayout(self.vlay3)
-        self.layout.addLayout(self.vlay4)
+            # fixme column 5
+            self.tools_solderpaste_group,
+        ]
 
-        self.layout.addStretch()

+ 13 - 25
flatcamGUI/preferences/utilities/UtilPreferencesUI.py

@@ -1,37 +1,25 @@
-from PyQt5 import QtWidgets
-
+from flatcamGUI.preferences.OptionsGroupUI import OptionsGroupUI
+from flatcamGUI.preferences.PreferencesSectionUI import PreferencesSectionUI
 from flatcamGUI.preferences.utilities.AutoCompletePrefGroupUI import AutoCompletePrefGroupUI
 from flatcamGUI.preferences.utilities.FAGrbPrefGroupUI import FAGrbPrefGroupUI
 from flatcamGUI.preferences.utilities.FAGcoPrefGroupUI import FAGcoPrefGroupUI
 from flatcamGUI.preferences.utilities.FAExcPrefGroupUI import FAExcPrefGroupUI
 
 
-class UtilPreferencesUI(QtWidgets.QWidget):
+class UtilPreferencesUI(PreferencesSectionUI):
 
-    def __init__(self, decimals, parent=None):
-        QtWidgets.QWidget.__init__(self, parent=parent)
-        self.layout = QtWidgets.QHBoxLayout()
-        self.setLayout(self.layout)
+    def __init__(self, decimals, **kwargs):
         self.decimals = decimals
-
-        self.vlay = QtWidgets.QVBoxLayout()
         self.fa_excellon_group = FAExcPrefGroupUI(decimals=self.decimals)
-        self.fa_excellon_group.setMinimumWidth(260)
-
         self.fa_gcode_group = FAGcoPrefGroupUI(decimals=self.decimals)
-        self.fa_gcode_group.setMinimumWidth(260)
-
-        self.vlay.addWidget(self.fa_excellon_group)
-        self.vlay.addWidget(self.fa_gcode_group)
-
         self.fa_gerber_group = FAGrbPrefGroupUI(decimals=self.decimals)
-        self.fa_gerber_group.setMinimumWidth(260)
-
         self.kw_group = AutoCompletePrefGroupUI(decimals=self.decimals)
-        self.kw_group.setMinimumWidth(260)
-
-        self.layout.addLayout(self.vlay)
-        self.layout.addWidget(self.fa_gerber_group)
-        self.layout.addWidget(self.kw_group)
-
-        self.layout.addStretch()
+        super().__init__(**kwargs)
+
+    def build_groups(self) -> [OptionsGroupUI]:
+        return [
+            self.fa_excellon_group, # fixme column with fa_excellon and fa_gcode
+            self.fa_gcode_group,
+            self.fa_gerber_group,
+            self.kw_group,
+        ]