Преглед на файлове

- in Preferences General, Gerber, Geometry, Excellon, CNCJob sections made all the input fields of type SpinBox (where possible)
- updated the Distance Tool utility geometry color to adapt to the dark theme canvas

Marius Stanciu преди 6 години
родител
ревизия
24723509f8
променени са 9 файла, в които са добавени 335 реда и са изтрити 124 реда
  1. 1 4
      FlatCAM.py
  2. 12 12
      FlatCAMApp.py
  3. 6 0
      README.md
  4. 3 3
      flatcamEditors/FlatCAMGeoEditor.py
  5. 3 3
      flatcamEditors/FlatCAMGrbEditor.py
  6. 10 0
      flatcamGUI/GUIElements.py
  7. 288 100
      flatcamGUI/PreferencesUI.py
  8. 1 1
      flatcamParsers/ParseGerber.py
  9. 11 1
      flatcamTools/ToolDistance.py

+ 1 - 4
FlatCAM.py

@@ -9,14 +9,11 @@ from flatcamGUI import VisPyPatches
 from multiprocessing import freeze_support
 from multiprocessing import freeze_support
 # import copyreg
 # import copyreg
 # import types
 # import types
-import qdarkstyle
 
 
 if sys.platform == "win32":
 if sys.platform == "win32":
     # cx_freeze 'module win32' workaround
     # cx_freeze 'module win32' workaround
     pass
     pass
 
 
-os.environ['QT_API'] = 'pyqt5'
-
 
 
 def debug_trace():
 def debug_trace():
     """
     """
@@ -51,7 +48,7 @@ if __name__ == '__main__':
         os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "0"
         os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "0"
 
 
     app = QtWidgets.QApplication(sys.argv)
     app = QtWidgets.QApplication(sys.argv)
-    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
+
     # apply style
     # apply style
     settings = QSettings("Open Source", "FlatCAM")
     settings = QSettings("Open Source", "FlatCAM")
     if settings.contains("style"):
     if settings.contains("style"):

+ 12 - 12
FlatCAMApp.py

@@ -5967,22 +5967,22 @@ class App(QtCore.QObject):
         if state:
         if state:
             # first try to disconnect
             # first try to disconnect
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry.textChanged.\
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry.editingFinished.\
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry.textChanged.\
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry.editingFinished.\
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry.textChanged.\
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry.editingFinished.\
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry.textChanged.\
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry.editingFinished.\
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass
@@ -5999,13 +5999,13 @@ class App(QtCore.QObject):
                 pass
                 pass
 
 
             # the connect them
             # the connect them
-            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry.textChanged.connect(
+            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry.editingFinished.connect(
                 self.on_excellon_format_changed)
                 self.on_excellon_format_changed)
-            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry.textChanged.connect(
+            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry.editingFinished.connect(
                 self.on_excellon_format_changed)
                 self.on_excellon_format_changed)
-            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry.textChanged.connect(
+            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry.editingFinished.connect(
                 self.on_excellon_format_changed)
                 self.on_excellon_format_changed)
-            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry.textChanged.connect(
+            self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry.editingFinished.connect(
                 self.on_excellon_format_changed)
                 self.on_excellon_format_changed)
             self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio.activated_custom.connect(
             self.ui.excellon_defaults_form.excellon_gen_group.excellon_zeros_radio.activated_custom.connect(
                 self.on_excellon_zeros_changed)
                 self.on_excellon_zeros_changed)
@@ -6014,22 +6014,22 @@ class App(QtCore.QObject):
         else:
         else:
             # disconnect the signals
             # disconnect the signals
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry.textChanged. \
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_in_entry.editingFinished. \
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry.textChanged. \
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_in_entry.editingFinished. \
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry.textChanged. \
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_upper_mm_entry.editingFinished. \
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass
             try:
             try:
-                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry.textChanged. \
+                self.ui.excellon_defaults_form.excellon_gen_group.excellon_format_lower_mm_entry.editingFinished. \
                     disconnect(self.on_excellon_format_changed)
                     disconnect(self.on_excellon_format_changed)
             except TypeError:
             except TypeError:
                 pass
                 pass

+ 6 - 0
README.md

@@ -9,6 +9,12 @@ CAD program, and create G-Code for Isolation routing.
 
 
 =================================================
 =================================================
 
 
+8.10.2019
+
+- modified the FCSpinner and FCDoubleSpinner GUI elements such that the wheel event will not change the values inside unless there is a focus in the lineedit of the SpinBox
+- in Preferences General, Gerber, Geometry, Excellon, CNCJob sections made all the input fields of type SpinBox (where possible)
+- updated the Distance Tool utility geometry color to adapt to the dark theme canvas
+
 7.10.2019
 7.10.2019
 
 
 - fixed an conflict in a signal usage that was triggered by Tool SolderPaste when a new project was created
 - fixed an conflict in a signal usage that was triggered by Tool SolderPaste when a new project was created

+ 3 - 3
flatcamEditors/FlatCAMGeoEditor.py

@@ -4256,7 +4256,7 @@ class FlatCAMGeoEditor(QtCore.QObject):
         # # ## Grid snap
         # # ## Grid snap
         if self.options["grid_snap"]:
         if self.options["grid_snap"]:
             if self.options["global_gridx"] != 0:
             if self.options["global_gridx"] != 0:
-                snap_x_ = round(x / self.options["global_gridx"]) * self.options['global_gridx']
+                snap_x_ = round(x / float(self.options["global_gridx"])) * float(self.options['global_gridx'])
             else:
             else:
                 snap_x_ = x
                 snap_x_ = x
 
 
@@ -4264,12 +4264,12 @@ class FlatCAMGeoEditor(QtCore.QObject):
             # and it will use the snap distance from GridX entry
             # and it will use the snap distance from GridX entry
             if self.app.ui.grid_gap_link_cb.isChecked():
             if self.app.ui.grid_gap_link_cb.isChecked():
                 if self.options["global_gridx"] != 0:
                 if self.options["global_gridx"] != 0:
-                    snap_y_ = round(y / self.options["global_gridx"]) * self.options['global_gridx']
+                    snap_y_ = round(y / float(self.options["global_gridx"])) * float(self.options['global_gridx'])
                 else:
                 else:
                     snap_y_ = y
                     snap_y_ = y
             else:
             else:
                 if self.options["global_gridy"] != 0:
                 if self.options["global_gridy"] != 0:
-                    snap_y_ = round(y / self.options["global_gridy"]) * self.options['global_gridy']
+                    snap_y_ = round(y / float(self.options["global_gridy"])) * float(self.options['global_gridy'])
                 else:
                 else:
                     snap_y_ = y
                     snap_y_ = y
             nearest_grid_distance = distance((x, y), (snap_x_, snap_y_))
             nearest_grid_distance = distance((x, y), (snap_x_, snap_y_))

+ 3 - 3
flatcamEditors/FlatCAMGrbEditor.py

@@ -3042,14 +3042,14 @@ class FlatCAMGrbEditor(QtCore.QObject):
         self.aptype_cb.set_value(self.app.defaults["gerber_editor_newtype"])
         self.aptype_cb.set_value(self.app.defaults["gerber_editor_newtype"])
         self.apdim_entry.set_value(self.app.defaults["gerber_editor_newdim"])
         self.apdim_entry.set_value(self.app.defaults["gerber_editor_newdim"])
 
 
-        self.pad_array_size_entry.set_value(self.app.defaults["gerber_editor_array_size"])
+        self.pad_array_size_entry.set_value(int(self.app.defaults["gerber_editor_array_size"]))
         # linear array
         # linear array
         self.pad_axis_radio.set_value(self.app.defaults["gerber_editor_lin_axis"])
         self.pad_axis_radio.set_value(self.app.defaults["gerber_editor_lin_axis"])
-        self.pad_pitch_entry.set_value(self.app.defaults["gerber_editor_lin_pitch"])
+        self.pad_pitch_entry.set_value(float(self.app.defaults["gerber_editor_lin_pitch"]))
         self.linear_angle_spinner.set_value(self.app.defaults["gerber_editor_lin_angle"])
         self.linear_angle_spinner.set_value(self.app.defaults["gerber_editor_lin_angle"])
         # circular array
         # circular array
         self.pad_direction_radio.set_value(self.app.defaults["gerber_editor_circ_dir"])
         self.pad_direction_radio.set_value(self.app.defaults["gerber_editor_circ_dir"])
-        self.pad_angle_entry.set_value(self.app.defaults["gerber_editor_circ_angle"])
+        self.pad_angle_entry.set_value(float(self.app.defaults["gerber_editor_circ_angle"]))
 
 
     def build_ui(self, first_run=None):
     def build_ui(self, first_run=None):
 
 

+ 10 - 0
flatcamGUI/GUIElements.py

@@ -524,6 +524,11 @@ class FCSpinner(QtWidgets.QSpinBox):
             return True
             return True
         return False
         return False
 
 
+    def wheelEvent(self, *args, **kwargs):
+        # should work only there is a focus in the lineedit of the SpinBox
+        if self.readyToEdit is False:
+            super().wheelEvent(*args, **kwargs)
+
     def on_edit_finished(self):
     def on_edit_finished(self):
         self.clearFocus()
         self.clearFocus()
 
 
@@ -579,6 +584,11 @@ class FCDoubleSpinner(QtWidgets.QDoubleSpinBox):
     def on_edit_finished(self):
     def on_edit_finished(self):
         self.clearFocus()
         self.clearFocus()
 
 
+    def wheelEvent(self, *args, **kwargs):
+        # should work only there is a focus in the lineedit of the SpinBox
+        if self.readyToEdit is False:
+            super().wheelEvent(*args, **kwargs)
+
     # def mousePressEvent(self, e, parent=None):
     # def mousePressEvent(self, e, parent=None):
     #     super(FCDoubleSpinner, self).mousePressEvent(e)  # required to deselect on 2e click
     #     super(FCDoubleSpinner, self).mousePressEvent(e)  # required to deselect on 2e click
     #     if self.readyToEdit:
     #     if self.readyToEdit:

+ 288 - 100
flatcamGUI/PreferencesUI.py

@@ -264,19 +264,25 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI):
         self.gridx_label.setToolTip(
         self.gridx_label.setToolTip(
            _("This is the Grid snap value on X axis.")
            _("This is the Grid snap value on X axis.")
         )
         )
-        self.gridx_entry = FCEntry3()
+        self.gridx_entry = FCDoubleSpinner()
+        self.gridx_entry.set_precision(4)
+        self.gridx_entry.setSingleStep(0.1)
 
 
         # Grid Y Entry
         # Grid Y Entry
         self.gridy_label = QtWidgets.QLabel('%s:' % _('Grid Y value'))
         self.gridy_label = QtWidgets.QLabel('%s:' % _('Grid Y value'))
         self.gridy_label.setToolTip(
         self.gridy_label.setToolTip(
             _("This is the Grid snap value on Y axis.")
             _("This is the Grid snap value on Y axis.")
         )
         )
-        self.gridy_entry = FCEntry3()
+        self.gridy_entry = FCDoubleSpinner()
+        self.gridy_entry.set_precision(4)
+        self.gridy_entry.setSingleStep(0.1)
 
 
         # Snap Max Entry
         # Snap Max Entry
         self.snap_max_label = QtWidgets.QLabel('%s:' % _('Snap Max'))
         self.snap_max_label = QtWidgets.QLabel('%s:' % _('Snap Max'))
         self.snap_max_label.setToolTip(_("Max. magnet distance"))
         self.snap_max_label.setToolTip(_("Max. magnet distance"))
-        self.snap_max_dist_entry = FCEntry()
+        self.snap_max_dist_entry = FCDoubleSpinner()
+        self.snap_max_dist_entry.set_precision(4)
+        self.snap_max_dist_entry.setSingleStep(0.1)
 
 
         # Workspace
         # Workspace
         self.workspace_lbl = QtWidgets.QLabel('%s:' % _('Workspace'))
         self.workspace_lbl = QtWidgets.QLabel('%s:' % _('Workspace'))
@@ -326,8 +332,7 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI):
 
 
         self.pf_color_alpha_spinner = FCSpinner()
         self.pf_color_alpha_spinner = FCSpinner()
         self.pf_color_alpha_spinner.setMinimumWidth(70)
         self.pf_color_alpha_spinner.setMinimumWidth(70)
-        self.pf_color_alpha_spinner.setMinimum(0)
-        self.pf_color_alpha_spinner.setMaximum(255)
+        self.pf_color_alpha_spinner.set_range(0, 255)
 
 
         self.form_box_child_2 = QtWidgets.QHBoxLayout()
         self.form_box_child_2 = QtWidgets.QHBoxLayout()
         self.form_box_child_2.addWidget(self.pf_color_alpha_slider)
         self.form_box_child_2.addWidget(self.pf_color_alpha_slider)
@@ -376,8 +381,7 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI):
 
 
         self.sf_color_alpha_spinner = FCSpinner()
         self.sf_color_alpha_spinner = FCSpinner()
         self.sf_color_alpha_spinner.setMinimumWidth(70)
         self.sf_color_alpha_spinner.setMinimumWidth(70)
-        self.sf_color_alpha_spinner.setMinimum(0)
-        self.sf_color_alpha_spinner.setMaximum(255)
+        self.sf_color_alpha_spinner.set_range(0, 255)
 
 
         self.form_box_child_5 = QtWidgets.QHBoxLayout()
         self.form_box_child_5 = QtWidgets.QHBoxLayout()
         self.form_box_child_5.addWidget(self.sf_color_alpha_slider)
         self.form_box_child_5.addWidget(self.sf_color_alpha_slider)
@@ -426,8 +430,7 @@ class GeneralGUIPrefGroupUI(OptionsGroupUI):
 
 
         self.alt_sf_color_alpha_spinner = FCSpinner()
         self.alt_sf_color_alpha_spinner = FCSpinner()
         self.alt_sf_color_alpha_spinner.setMinimumWidth(70)
         self.alt_sf_color_alpha_spinner.setMinimumWidth(70)
-        self.alt_sf_color_alpha_spinner.setMinimum(0)
-        self.alt_sf_color_alpha_spinner.setMaximum(255)
+        self.alt_sf_color_alpha_spinner.set_range(0, 255)
 
 
         self.form_box_child_8 = QtWidgets.QHBoxLayout()
         self.form_box_child_8 = QtWidgets.QHBoxLayout()
         self.form_box_child_8.addWidget(self.alt_sf_color_alpha_slider)
         self.form_box_child_8.addWidget(self.alt_sf_color_alpha_slider)
@@ -571,7 +574,7 @@ class GeneralGUISetGroupUI(OptionsGroupUI):
               "The application will restart after change.")
               "The application will restart after change.")
         )
         )
         self.theme_radio = RadioSet([
         self.theme_radio = RadioSet([
-            {"label": _("White"), "value": "white"},
+            {"label": _("Light"), "value": "white"},
             {"label": _("Dark"), "value": "black"}
             {"label": _("Dark"), "value": "black"}
         ], orientation='horizontal', stretch=False)
         ], orientation='horizontal', stretch=False)
 
 
@@ -1032,7 +1035,7 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
             "performance. Higher value will provide more\n"
             "performance. Higher value will provide more\n"
             "performance at the expense of level of detail."
             "performance at the expense of level of detail."
         ))
         ))
-        self.tol_entry = FCEntry()
+        self.tol_entry = FCDoubleSpinner()
         self.tol_entry.setToolTip(_(
         self.tol_entry.setToolTip(_(
             "This value can counter the effect of the Circle Steps\n"
             "This value can counter the effect of the Circle Steps\n"
             "parameter. Default value is 0.01.\n"
             "parameter. Default value is 0.01.\n"
@@ -1041,6 +1044,9 @@ class GeneralAppPrefGroupUI(OptionsGroupUI):
             "performance. Higher value will provide more\n"
             "performance. Higher value will provide more\n"
             "performance at the expense of level of detail."
             "performance at the expense of level of detail."
         ))
         ))
+        self.tol_entry.setSingleStep(0.001)
+        self.tol_entry.set_precision(6)
+
         # Just to add empty rows
         # Just to add empty rows
         self.spacelabel = QtWidgets.QLabel('')
         self.spacelabel = QtWidgets.QLabel('')
 
 
@@ -1160,7 +1166,9 @@ class GerberGenPrefGroupUI(OptionsGroupUI):
             _("The number of circle steps for Gerber \n"
             _("The number of circle steps for Gerber \n"
               "circular aperture linear approximation.")
               "circular aperture linear approximation.")
         )
         )
-        self.circle_steps_entry = IntEntry()
+        self.circle_steps_entry = FCSpinner()
+        self.circle_steps_entry.set_range(0, 9999)
+
         grid0.addWidget(self.circle_steps_label, 1, 0)
         grid0.addWidget(self.circle_steps_label, 1, 0)
         grid0.addWidget(self.circle_steps_entry, 1, 1, 1, 2)
         grid0.addWidget(self.circle_steps_entry, 1, 1, 1, 2)
 
 
@@ -1241,7 +1249,11 @@ class GerberOptPrefGroupUI(OptionsGroupUI):
             _("Diameter of the cutting tool.")
             _("Diameter of the cutting tool.")
         )
         )
         grid0.addWidget(tdlabel, 0, 0)
         grid0.addWidget(tdlabel, 0, 0)
-        self.iso_tool_dia_entry = LengthEntry()
+        self.iso_tool_dia_entry = FCDoubleSpinner()
+        self.iso_tool_dia_entry.set_precision(4)
+        self.iso_tool_dia_entry.setSingleStep(0.1)
+        self.iso_tool_dia_entry.set_range(-9999, 9999)
+
         grid0.addWidget(self.iso_tool_dia_entry, 0, 1)
         grid0.addWidget(self.iso_tool_dia_entry, 0, 1)
 
 
         # Nr of passes
         # Nr of passes
@@ -1312,7 +1324,10 @@ class GerberOptPrefGroupUI(OptionsGroupUI):
               "distance.")
               "distance.")
         )
         )
         grid1.addWidget(bmlabel, 0, 0)
         grid1.addWidget(bmlabel, 0, 0)
-        self.noncopper_margin_entry = LengthEntry()
+        self.noncopper_margin_entry = FCDoubleSpinner()
+        self.noncopper_margin_entry.set_precision(4)
+        self.noncopper_margin_entry.setSingleStep(0.1)
+        self.noncopper_margin_entry.set_range(-9999, 9999)
         grid1.addWidget(self.noncopper_margin_entry, 0, 1)
         grid1.addWidget(self.noncopper_margin_entry, 0, 1)
 
 
         # Rounded corners
         # Rounded corners
@@ -1334,8 +1349,12 @@ class GerberOptPrefGroupUI(OptionsGroupUI):
             _("Distance of the edges of the box\n"
             _("Distance of the edges of the box\n"
               "to the nearest polygon.")
               "to the nearest polygon.")
         )
         )
+        self.bbmargin_entry = FCDoubleSpinner()
+        self.bbmargin_entry.set_precision(4)
+        self.bbmargin_entry.setSingleStep(0.1)
+        self.bbmargin_entry.set_range(-9999, 9999)
+
         grid2.addWidget(bbmargin, 0, 0)
         grid2.addWidget(bbmargin, 0, 0)
-        self.bbmargin_entry = LengthEntry()
         grid2.addWidget(self.bbmargin_entry, 0, 1)
         grid2.addWidget(self.bbmargin_entry, 0, 1)
 
 
         self.bbrounded_cb = FCCheckBox(label='%s' % _("Rounded Geo"))
         self.bbrounded_cb = FCCheckBox(label='%s' % _("Rounded Geo"))
@@ -1521,9 +1540,11 @@ class GerberExpPrefGroupUI(OptionsGroupUI):
 
 
         hlay1 = QtWidgets.QHBoxLayout()
         hlay1 = QtWidgets.QHBoxLayout()
 
 
-        self.format_whole_entry = IntEntry()
-        self.format_whole_entry.setMaxLength(1)
-        self.format_whole_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.format_whole_entry = FCSpinner()
+        self.format_whole_entry.set_range(0, 9)
+        self.format_whole_entry.setSingleStep(1)
+        self.format_whole_entry.setWrapping(True)
+
         self.format_whole_entry.setMinimumWidth(30)
         self.format_whole_entry.setMinimumWidth(30)
         self.format_whole_entry.setToolTip(
         self.format_whole_entry.setToolTip(
             _("This numbers signify the number of digits in\n"
             _("This numbers signify the number of digits in\n"
@@ -1535,9 +1556,11 @@ class GerberExpPrefGroupUI(OptionsGroupUI):
         gerber_separator_label.setFixedWidth(5)
         gerber_separator_label.setFixedWidth(5)
         hlay1.addWidget(gerber_separator_label, QtCore.Qt.AlignLeft)
         hlay1.addWidget(gerber_separator_label, QtCore.Qt.AlignLeft)
 
 
-        self.format_dec_entry = IntEntry()
-        self.format_dec_entry.setMaxLength(1)
-        self.format_dec_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.format_dec_entry = FCSpinner()
+        self.format_dec_entry.set_range(0, 9)
+        self.format_dec_entry.setSingleStep(1)
+        self.format_dec_entry.setWrapping(True)
+
         self.format_dec_entry.setMinimumWidth(30)
         self.format_dec_entry.setMinimumWidth(30)
         self.format_dec_entry.setToolTip(
         self.format_dec_entry.setToolTip(
             _("This numbers signify the number of digits in\n"
             _("This numbers signify the number of digits in\n"
@@ -1600,7 +1623,8 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
               "Increases the performance when moving a\n"
               "Increases the performance when moving a\n"
               "large number of geometric elements.")
               "large number of geometric elements.")
         )
         )
-        self.sel_limit_entry = IntEntry()
+        self.sel_limit_entry = FCSpinner()
+        self.sel_limit_entry.set_range(0, 9999)
 
 
         grid0.addWidget(self.sel_limit_label, 0, 0)
         grid0.addWidget(self.sel_limit_label, 0, 0)
         grid0.addWidget(self.sel_limit_entry, 0, 1)
         grid0.addWidget(self.sel_limit_entry, 0, 1)
@@ -1611,8 +1635,9 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
             _("Code for the new aperture")
             _("Code for the new aperture")
         )
         )
 
 
-        self.addcode_entry = FCEntry()
-        self.addcode_entry.setValidator(QtGui.QIntValidator(0, 99))
+        self.addcode_entry = FCSpinner()
+        self.addcode_entry.set_range(10, 99)
+        self.addcode_entry.setWrapping(True)
 
 
         grid0.addWidget(self.addcode_entry_lbl, 1, 0)
         grid0.addWidget(self.addcode_entry_lbl, 1, 0)
         grid0.addWidget(self.addcode_entry, 1, 1)
         grid0.addWidget(self.addcode_entry, 1, 1)
@@ -1623,8 +1648,9 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
             _("Size for the new aperture")
             _("Size for the new aperture")
         )
         )
 
 
-        self.addsize_entry = FCEntry()
-        self.addsize_entry.setValidator(QtGui.QDoubleValidator(0.0001, 99.9999, 4))
+        self.addsize_entry = FCDoubleSpinner()
+        self.addsize_entry.set_range(0, 100)
+        self.addsize_entry.set_precision(4)
 
 
         grid0.addWidget(self.addsize_entry_lbl, 2, 0)
         grid0.addWidget(self.addsize_entry_lbl, 2, 0)
         grid0.addWidget(self.addsize_entry, 2, 1)
         grid0.addWidget(self.addsize_entry, 2, 1)
@@ -1648,7 +1674,9 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
             _("Specify how many pads to be in the array.")
             _("Specify how many pads to be in the array.")
         )
         )
 
 
-        self.grb_array_size_entry = LengthEntry()
+        self.grb_array_size_entry = FCSpinner()
+        self.grb_array_size_entry.set_range(0, 9999)
+
 
 
         grid0.addWidget(self.grb_array_size_label, 4, 0)
         grid0.addWidget(self.grb_array_size_label, 4, 0)
         grid0.addWidget(self.grb_array_size_entry, 4, 1)
         grid0.addWidget(self.grb_array_size_entry, 4, 1)
@@ -1686,7 +1714,8 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
             _("Pitch = Distance between elements of the array.")
             _("Pitch = Distance between elements of the array.")
         )
         )
         # self.drill_pitch_label.setMinimumWidth(100)
         # self.drill_pitch_label.setMinimumWidth(100)
-        self.grb_pitch_entry = LengthEntry()
+        self.grb_pitch_entry = FCDoubleSpinner()
+        self.grb_pitch_entry.set_precision(4)
 
 
         grid0.addWidget(self.grb_pitch_label, 8, 0)
         grid0.addWidget(self.grb_pitch_label, 8, 0)
         grid0.addWidget(self.grb_pitch_entry, 8, 1)
         grid0.addWidget(self.grb_pitch_entry, 8, 1)
@@ -1696,7 +1725,9 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
         self.grb_angle_label.setToolTip(
         self.grb_angle_label.setToolTip(
             _("Angle at which each element in circular array is placed.")
             _("Angle at which each element in circular array is placed.")
         )
         )
-        self.grb_angle_entry = LengthEntry()
+        self.grb_angle_entry = FCDoubleSpinner()
+        self.grb_angle_entry.set_precision(4)
+        self.grb_angle_entry.setSingleStep(5)
 
 
         grid0.addWidget(self.grb_angle_label, 9, 0)
         grid0.addWidget(self.grb_angle_label, 9, 0)
         grid0.addWidget(self.grb_angle_entry, 9, 1)
         grid0.addWidget(self.grb_angle_entry, 9, 1)
@@ -1722,7 +1753,9 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
         self.grb_circular_angle_label.setToolTip(
         self.grb_circular_angle_label.setToolTip(
             _("Angle at which each element in circular array is placed.")
             _("Angle at which each element in circular array is placed.")
         )
         )
-        self.grb_circular_angle_entry = LengthEntry()
+        self.grb_circular_angle_entry = FCDoubleSpinner()
+        self.grb_circular_angle_entry.set_precision(4)
+        self.grb_circular_angle_entry.setSingleStep(5)
 
 
         grid0.addWidget(self.grb_circular_angle_label, 12, 0)
         grid0.addWidget(self.grb_circular_angle_label, 12, 0)
         grid0.addWidget(self.grb_circular_angle_entry, 12, 1)
         grid0.addWidget(self.grb_circular_angle_entry, 12, 1)
@@ -1735,7 +1768,8 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
         self.grb_buff_label.setToolTip(
         self.grb_buff_label.setToolTip(
             _("Distance at which to buffer the Gerber element.")
             _("Distance at which to buffer the Gerber element.")
         )
         )
-        self.grb_buff_entry = LengthEntry()
+        self.grb_buff_entry = FCDoubleSpinner()
+        self.grb_buff_entry.set_precision(4)
 
 
         grid0.addWidget(self.grb_buff_label, 14, 0)
         grid0.addWidget(self.grb_buff_label, 14, 0)
         grid0.addWidget(self.grb_buff_entry, 14, 1)
         grid0.addWidget(self.grb_buff_entry, 14, 1)
@@ -1748,7 +1782,8 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
         self.grb_scale_label.setToolTip(
         self.grb_scale_label.setToolTip(
             _("Factor to scale the Gerber element.")
             _("Factor to scale the Gerber element.")
         )
         )
-        self.grb_scale_entry = LengthEntry()
+        self.grb_scale_entry = FCDoubleSpinner()
+        self.grb_scale_entry.set_precision(4)
 
 
         grid0.addWidget(self.grb_scale_label, 16, 0)
         grid0.addWidget(self.grb_scale_label, 16, 0)
         grid0.addWidget(self.grb_scale_entry, 16, 1)
         grid0.addWidget(self.grb_scale_entry, 16, 1)
@@ -1761,7 +1796,8 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
         self.grb_ma_low_label.setToolTip(
         self.grb_ma_low_label.setToolTip(
             _("Threshold value under which the apertures are not marked.")
             _("Threshold value under which the apertures are not marked.")
         )
         )
-        self.grb_ma_low_entry = LengthEntry()
+        self.grb_ma_low_entry = FCDoubleSpinner()
+        self.grb_ma_low_entry.set_precision(4)
 
 
         grid0.addWidget(self.grb_ma_low_label, 18, 0)
         grid0.addWidget(self.grb_ma_low_label, 18, 0)
         grid0.addWidget(self.grb_ma_low_entry, 18, 1)
         grid0.addWidget(self.grb_ma_low_entry, 18, 1)
@@ -1771,7 +1807,8 @@ class GerberEditorPrefGroupUI(OptionsGroupUI):
         self.grb_ma_high_label.setToolTip(
         self.grb_ma_high_label.setToolTip(
             _("Threshold value over which the apertures are not marked.")
             _("Threshold value over which the apertures are not marked.")
         )
         )
-        self.grb_ma_high_entry = LengthEntry()
+        self.grb_ma_high_entry = FCDoubleSpinner()
+        self.grb_ma_high_entry.set_precision(4)
 
 
         grid0.addWidget(self.grb_ma_high_label, 19, 0)
         grid0.addWidget(self.grb_ma_high_label, 19, 0)
         grid0.addWidget(self.grb_ma_high_entry, 19, 1)
         grid0.addWidget(self.grb_ma_high_entry, 19, 1)
@@ -1840,9 +1877,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
             _("Default values for INCH are 2:4"))
             _("Default values for INCH are 2:4"))
         hlay1.addWidget(self.excellon_format_in_label, QtCore.Qt.AlignLeft)
         hlay1.addWidget(self.excellon_format_in_label, QtCore.Qt.AlignLeft)
 
 
-        self.excellon_format_upper_in_entry = IntEntry()
-        self.excellon_format_upper_in_entry.setMaxLength(1)
-        self.excellon_format_upper_in_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.excellon_format_upper_in_entry = FCSpinner()
+        self.excellon_format_upper_in_entry.set_range(0, 9)
         self.excellon_format_upper_in_entry.setMinimumWidth(30)
         self.excellon_format_upper_in_entry.setMinimumWidth(30)
         self.excellon_format_upper_in_entry.setToolTip(
         self.excellon_format_upper_in_entry.setToolTip(
            _("This numbers signify the number of digits in\n"
            _("This numbers signify the number of digits in\n"
@@ -1854,9 +1890,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
         excellon_separator_in_label.setFixedWidth(5)
         excellon_separator_in_label.setFixedWidth(5)
         hlay1.addWidget(excellon_separator_in_label, QtCore.Qt.AlignLeft)
         hlay1.addWidget(excellon_separator_in_label, QtCore.Qt.AlignLeft)
 
 
-        self.excellon_format_lower_in_entry = IntEntry()
-        self.excellon_format_lower_in_entry.setMaxLength(1)
-        self.excellon_format_lower_in_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.excellon_format_lower_in_entry = FCSpinner()
+        self.excellon_format_lower_in_entry.set_range(0, 9)
         self.excellon_format_lower_in_entry.setMinimumWidth(30)
         self.excellon_format_lower_in_entry.setMinimumWidth(30)
         self.excellon_format_lower_in_entry.setToolTip(
         self.excellon_format_lower_in_entry.setToolTip(
             _("This numbers signify the number of digits in\n"
             _("This numbers signify the number of digits in\n"
@@ -1873,9 +1908,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
             _("Default values for METRIC are 3:3"))
             _("Default values for METRIC are 3:3"))
         hlay2.addWidget(self.excellon_format_mm_label, QtCore.Qt.AlignLeft)
         hlay2.addWidget(self.excellon_format_mm_label, QtCore.Qt.AlignLeft)
 
 
-        self.excellon_format_upper_mm_entry = IntEntry()
-        self.excellon_format_upper_mm_entry.setMaxLength(1)
-        self.excellon_format_upper_mm_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.excellon_format_upper_mm_entry = FCSpinner()
+        self.excellon_format_upper_mm_entry.set_range(0, 9)
         self.excellon_format_upper_mm_entry.setMinimumWidth(30)
         self.excellon_format_upper_mm_entry.setMinimumWidth(30)
         self.excellon_format_upper_mm_entry.setToolTip(
         self.excellon_format_upper_mm_entry.setToolTip(
             _("This numbers signify the number of digits in\n"
             _("This numbers signify the number of digits in\n"
@@ -1887,9 +1921,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
         excellon_separator_mm_label.setFixedWidth(5)
         excellon_separator_mm_label.setFixedWidth(5)
         hlay2.addWidget(excellon_separator_mm_label, QtCore.Qt.AlignLeft)
         hlay2.addWidget(excellon_separator_mm_label, QtCore.Qt.AlignLeft)
 
 
-        self.excellon_format_lower_mm_entry = IntEntry()
-        self.excellon_format_lower_mm_entry.setMaxLength(1)
-        self.excellon_format_lower_mm_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.excellon_format_lower_mm_entry = FCSpinner()
+        self.excellon_format_lower_mm_entry.set_range(0, 9)
         self.excellon_format_lower_mm_entry.setMinimumWidth(30)
         self.excellon_format_lower_mm_entry.setMinimumWidth(30)
         self.excellon_format_lower_mm_entry.setToolTip(
         self.excellon_format_lower_mm_entry.setToolTip(
             _("This numbers signify the number of digits in\n"
             _("This numbers signify the number of digits in\n"
@@ -1998,8 +2031,8 @@ class ExcellonGenPrefGroupUI(OptionsGroupUI):
         )
         )
         grid2.addWidget(self.optimization_time_label, 6, 0)
         grid2.addWidget(self.optimization_time_label, 6, 0)
 
 
-        self.optimization_time_entry = IntEntry()
-        self.optimization_time_entry.setValidator(QtGui.QIntValidator(0, 999))
+        self.optimization_time_entry = FCSpinner()
+        self.optimization_time_entry.set_range(0, 999)
         grid2.addWidget(self.optimization_time_entry, 6, 1)
         grid2.addWidget(self.optimization_time_entry, 6, 1)
 
 
         current_platform = platform.architecture()[0]
         current_platform = platform.architecture()[0]
@@ -2053,7 +2086,9 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
               "below the copper surface.")
               "below the copper surface.")
         )
         )
         grid2.addWidget(cutzlabel, 0, 0)
         grid2.addWidget(cutzlabel, 0, 0)
-        self.cutz_entry = LengthEntry()
+        self.cutz_entry = FCDoubleSpinner()
+        self.cutz_entry.set_range(-9999, -0.000001)
+        self.cutz_entry.set_precision(4)
         grid2.addWidget(self.cutz_entry, 0, 1)
         grid2.addWidget(self.cutz_entry, 0, 1)
 
 
         # Travel Z
         # Travel Z
@@ -2063,7 +2098,10 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
               "across the XY plane.")
               "across the XY plane.")
         )
         )
         grid2.addWidget(travelzlabel, 1, 0)
         grid2.addWidget(travelzlabel, 1, 0)
-        self.travelz_entry = LengthEntry()
+        self.travelz_entry = FCDoubleSpinner()
+        self.travelz_entry.set_precision(4)
+        self.travelz_entry.set_range(0, 999)
+
         grid2.addWidget(self.travelz_entry, 1, 1)
         grid2.addWidget(self.travelz_entry, 1, 1)
 
 
         # Tool change:
         # Tool change:
@@ -2082,7 +2120,10 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
               "tool change.")
               "tool change.")
         )
         )
         grid2.addWidget(toolchangezlabel, 3, 0)
         grid2.addWidget(toolchangezlabel, 3, 0)
-        self.toolchangez_entry = LengthEntry()
+        self.toolchangez_entry = FCDoubleSpinner()
+        self.toolchangez_entry.set_precision(4)
+        self.toolchangez_entry.set_range(0, 999)
+
         grid2.addWidget(self.toolchangez_entry, 3, 1)
         grid2.addWidget(self.toolchangez_entry, 3, 1)
 
 
         # End Move Z
         # End Move Z
@@ -2091,8 +2132,11 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
             _("Height of the tool after\n"
             _("Height of the tool after\n"
               "the last move at the end of the job.")
               "the last move at the end of the job.")
         )
         )
+        self.eendz_entry = FCDoubleSpinner()
+        self.eendz_entry.set_precision(4)
+        self.eendz_entry.set_range(0, 999)
+
         grid2.addWidget(endzlabel, 4, 0)
         grid2.addWidget(endzlabel, 4, 0)
-        self.eendz_entry = LengthEntry()
         grid2.addWidget(self.eendz_entry, 4, 1)
         grid2.addWidget(self.eendz_entry, 4, 1)
 
 
         # Feedrate Z
         # Feedrate Z
@@ -2103,8 +2147,11 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
               "So called 'Plunge' feedrate.\n"
               "So called 'Plunge' feedrate.\n"
               "This is for linear move G01.")
               "This is for linear move G01.")
         )
         )
+        self.feedrate_entry = FCDoubleSpinner()
+        self.feedrate_entry.set_precision(4)
+        self.feedrate_entry.set_range(0, 999)
+
         grid2.addWidget(frlabel, 5, 0)
         grid2.addWidget(frlabel, 5, 0)
-        self.feedrate_entry = LengthEntry()
         grid2.addWidget(self.feedrate_entry, 5, 1)
         grid2.addWidget(self.feedrate_entry, 5, 1)
 
 
         # Spindle speed
         # Spindle speed
@@ -2128,7 +2175,9 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
             _("Number of time units for spindle to dwell.")
             _("Number of time units for spindle to dwell.")
         )
         )
         self.dwell_cb = FCCheckBox()
         self.dwell_cb = FCCheckBox()
-        self.dwelltime_entry = FCEntry()
+        self.dwelltime_entry = FCDoubleSpinner()
+        self.dwelltime_entry.set_precision(4)
+        self.dwelltime_entry.set_range(0, 99999.9999)
 
 
         grid2.addWidget(dwelllabel, 7, 0)
         grid2.addWidget(dwelllabel, 7, 0)
         grid2.addWidget(self.dwell_cb, 7, 1)
         grid2.addWidget(self.dwell_cb, 7, 1)
@@ -2177,16 +2226,23 @@ class ExcellonOptPrefGroupUI(OptionsGroupUI):
         tdlabel.setToolTip(
         tdlabel.setToolTip(
             _("Diameter of the cutting tool.")
             _("Diameter of the cutting tool.")
         )
         )
+        self.tooldia_entry = FCDoubleSpinner()
+        self.tooldia_entry.set_precision(4)
+        self.tooldia_entry.set_range(0, 999.9999)
+
         grid2.addWidget(tdlabel, 12, 0)
         grid2.addWidget(tdlabel, 12, 0)
-        self.tooldia_entry = LengthEntry()
         grid2.addWidget(self.tooldia_entry, 12, 1)
         grid2.addWidget(self.tooldia_entry, 12, 1)
+
         stdlabel = QtWidgets.QLabel('%s:' % _('Slot Tool dia'))
         stdlabel = QtWidgets.QLabel('%s:' % _('Slot Tool dia'))
         stdlabel.setToolTip(
         stdlabel.setToolTip(
             _("Diameter of the cutting tool\n"
             _("Diameter of the cutting tool\n"
               "when milling slots.")
               "when milling slots.")
         )
         )
+        self.slot_tooldia_entry = FCDoubleSpinner()
+        self.slot_tooldia_entry.set_precision(4)
+        self.slot_tooldia_entry.set_range(0, 999.9999)
+
         grid2.addWidget(stdlabel, 13, 0)
         grid2.addWidget(stdlabel, 13, 0)
-        self.slot_tooldia_entry = LengthEntry()
         grid2.addWidget(self.slot_tooldia_entry, 13, 1)
         grid2.addWidget(self.slot_tooldia_entry, 13, 1)
 
 
         grid4 = QtWidgets.QGridLayout()
         grid4 = QtWidgets.QGridLayout()
@@ -2229,8 +2285,11 @@ class ExcellonAdvOptPrefGroupUI(OptionsGroupUI):
             _("Some drill bits (the larger ones) need to drill deeper\n"
             _("Some drill bits (the larger ones) need to drill deeper\n"
               "to create the desired exit hole diameter due of the tip shape.\n"
               "to create the desired exit hole diameter due of the tip shape.\n"
               "The value here can compensate the Cut Z parameter."))
               "The value here can compensate the Cut Z parameter."))
+        self.offset_entry = FCDoubleSpinner()
+        self.offset_entry.set_precision(4)
+        self.offset_entry.set_range(-999.9999, 999.9999)
+
         grid1.addWidget(offsetlabel, 0, 0)
         grid1.addWidget(offsetlabel, 0, 0)
-        self.offset_entry = LengthEntry()
         grid1.addWidget(self.offset_entry, 0, 1)
         grid1.addWidget(self.offset_entry, 0, 1)
 
 
         toolchange_xy_label = QtWidgets.QLabel('%s:' % _('Toolchange X,Y'))
         toolchange_xy_label = QtWidgets.QLabel('%s:' % _('Toolchange X,Y'))
@@ -2259,8 +2318,11 @@ class ExcellonAdvOptPrefGroupUI(OptionsGroupUI):
               "It is useful only for Marlin,\n"
               "It is useful only for Marlin,\n"
               "ignore for any other cases.")
               "ignore for any other cases.")
         )
         )
+        self.feedrate_rapid_entry = FCDoubleSpinner()
+        self.feedrate_rapid_entry.set_precision(4)
+        self.feedrate_rapid_entry.set_range(0, 9999999.9999)
+
         grid1.addWidget(fr_rapid_label, 3, 0)
         grid1.addWidget(fr_rapid_label, 3, 0)
-        self.feedrate_rapid_entry = LengthEntry()
         grid1.addWidget(self.feedrate_rapid_entry, 3, 1)
         grid1.addWidget(self.feedrate_rapid_entry, 3, 1)
 
 
         # Probe depth
         # Probe depth
@@ -2269,8 +2331,11 @@ class ExcellonAdvOptPrefGroupUI(OptionsGroupUI):
             _("The maximum depth that the probe is allowed\n"
             _("The maximum depth that the probe is allowed\n"
               "to probe. Negative value, in current units.")
               "to probe. Negative value, in current units.")
         )
         )
+        self.pdepth_entry = FCDoubleSpinner()
+        self.pdepth_entry.set_precision(4)
+        self.pdepth_entry.set_range(-99999, -0.000001)
+
         grid1.addWidget(self.pdepth_label, 4, 0)
         grid1.addWidget(self.pdepth_label, 4, 0)
-        self.pdepth_entry = FCEntry()
         grid1.addWidget(self.pdepth_entry, 4, 1)
         grid1.addWidget(self.pdepth_entry, 4, 1)
 
 
         # Probe feedrate
         # Probe feedrate
@@ -2278,8 +2343,11 @@ class ExcellonAdvOptPrefGroupUI(OptionsGroupUI):
         self.feedrate_probe_label.setToolTip(
         self.feedrate_probe_label.setToolTip(
            _("The feedrate used while the probe is probing.")
            _("The feedrate used while the probe is probing.")
         )
         )
+        self.feedrate_probe_entry = FCDoubleSpinner()
+        self.feedrate_probe_entry.set_precision(4)
+        self.feedrate_probe_entry.set_range(0, 9999999.9999)
+
         grid1.addWidget(self.feedrate_probe_label, 5, 0)
         grid1.addWidget(self.feedrate_probe_label, 5, 0)
-        self.feedrate_probe_entry = FCEntry()
         grid1.addWidget(self.feedrate_probe_entry, 5, 1)
         grid1.addWidget(self.feedrate_probe_entry, 5, 1)
 
 
         # Spindle direction
         # Spindle direction
@@ -2366,9 +2434,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI):
 
 
         hlay1 = QtWidgets.QHBoxLayout()
         hlay1 = QtWidgets.QHBoxLayout()
 
 
-        self.format_whole_entry = IntEntry()
-        self.format_whole_entry.setMaxLength(1)
-        self.format_whole_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.format_whole_entry = FCSpinner()
+        self.format_whole_entry.set_range(0, 9)
         self.format_whole_entry.setMinimumWidth(30)
         self.format_whole_entry.setMinimumWidth(30)
         self.format_whole_entry.setToolTip(
         self.format_whole_entry.setToolTip(
             _("This numbers signify the number of digits in\n"
             _("This numbers signify the number of digits in\n"
@@ -2380,9 +2447,8 @@ class ExcellonExpPrefGroupUI(OptionsGroupUI):
         excellon_separator_label.setFixedWidth(5)
         excellon_separator_label.setFixedWidth(5)
         hlay1.addWidget(excellon_separator_label, QtCore.Qt.AlignLeft)
         hlay1.addWidget(excellon_separator_label, QtCore.Qt.AlignLeft)
 
 
-        self.format_dec_entry = IntEntry()
-        self.format_dec_entry.setMaxLength(1)
-        self.format_dec_entry.setAlignment(QtCore.Qt.AlignRight)
+        self.format_dec_entry = FCSpinner()
+        self.format_dec_entry.set_range(0, 9)
         self.format_dec_entry.setMinimumWidth(30)
         self.format_dec_entry.setMinimumWidth(30)
         self.format_dec_entry.setToolTip(
         self.format_dec_entry.setToolTip(
             _("This numbers signify the number of digits in\n"
             _("This numbers signify the number of digits in\n"
@@ -2499,7 +2565,8 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
               "Increases the performance when moving a\n"
               "Increases the performance when moving a\n"
               "large number of geometric elements.")
               "large number of geometric elements.")
         )
         )
-        self.sel_limit_entry = IntEntry()
+        self.sel_limit_entry = FCSpinner()
+        self.sel_limit_entry.set_range(0, 99999)
 
 
         grid0.addWidget(self.sel_limit_label, 0, 0)
         grid0.addWidget(self.sel_limit_label, 0, 0)
         grid0.addWidget(self.sel_limit_entry, 0, 1)
         grid0.addWidget(self.sel_limit_entry, 0, 1)
@@ -2510,8 +2577,9 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
             _("Diameter for the new tool")
             _("Diameter for the new tool")
         )
         )
 
 
-        self.addtool_entry = FCEntry()
-        self.addtool_entry.setValidator(QtGui.QDoubleValidator(0.0001, 99.9999, 4))
+        self.addtool_entry = FCDoubleSpinner()
+        self.addtool_entry.set_range(0.000001, 99.9999)
+        self.addtool_entry.set_precision(4)
 
 
         grid0.addWidget(self.addtool_entry_lbl, 1, 0)
         grid0.addWidget(self.addtool_entry_lbl, 1, 0)
         grid0.addWidget(self.addtool_entry, 1, 1)
         grid0.addWidget(self.addtool_entry, 1, 1)
@@ -2523,7 +2591,8 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         )
         )
         # self.drill_array_size_label.setMinimumWidth(100)
         # self.drill_array_size_label.setMinimumWidth(100)
 
 
-        self.drill_array_size_entry = LengthEntry()
+        self.drill_array_size_entry = FCSpinner()
+        self.drill_array_size_entry.set_range(0, 9999)
 
 
         grid0.addWidget(self.drill_array_size_label, 2, 0)
         grid0.addWidget(self.drill_array_size_label, 2, 0)
         grid0.addWidget(self.drill_array_size_entry, 2, 1)
         grid0.addWidget(self.drill_array_size_entry, 2, 1)
@@ -2553,7 +2622,9 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
             _("Pitch = Distance between elements of the array.")
             _("Pitch = Distance between elements of the array.")
         )
         )
         # self.drill_pitch_label.setMinimumWidth(100)
         # self.drill_pitch_label.setMinimumWidth(100)
-        self.drill_pitch_entry = LengthEntry()
+        self.drill_pitch_entry = FCDoubleSpinner()
+        self.drill_pitch_entry.set_range(0, 99999.9999)
+        self.drill_pitch_entry.set_precision(4)
 
 
         grid0.addWidget(self.drill_pitch_label, 5, 0)
         grid0.addWidget(self.drill_pitch_label, 5, 0)
         grid0.addWidget(self.drill_pitch_entry, 5, 1)
         grid0.addWidget(self.drill_pitch_entry, 5, 1)
@@ -2563,7 +2634,11 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         self.drill_angle_label.setToolTip(
         self.drill_angle_label.setToolTip(
             _("Angle at which each element in circular array is placed.")
             _("Angle at which each element in circular array is placed.")
         )
         )
-        self.drill_angle_entry = LengthEntry()
+        self.drill_angle_entry = FCDoubleSpinner()
+        self.drill_pitch_entry.set_range(-360, 360)
+        self.drill_pitch_entry.set_precision(4)
+        self.drill_angle_entry.setWrapping(True)
+        self.drill_angle_entry.setSingleStep(5)
 
 
         grid0.addWidget(self.drill_angle_label, 6, 0)
         grid0.addWidget(self.drill_angle_label, 6, 0)
         grid0.addWidget(self.drill_angle_entry, 6, 1)
         grid0.addWidget(self.drill_angle_entry, 6, 1)
@@ -2589,7 +2664,11 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         self.drill_circular_angle_label.setToolTip(
         self.drill_circular_angle_label.setToolTip(
             _("Angle at which each element in circular array is placed.")
             _("Angle at which each element in circular array is placed.")
         )
         )
-        self.drill_circular_angle_entry = LengthEntry()
+        self.drill_circular_angle_entry = FCDoubleSpinner()
+        self.drill_circular_angle_entry.set_range(-360, 360)
+        self.drill_circular_angle_entry.set_precision(4)
+        self.drill_circular_angle_entry.setWrapping(True)
+        self.drill_circular_angle_entry.setSingleStep(5)
 
 
         grid0.addWidget(self.drill_circular_angle_label, 9, 0)
         grid0.addWidget(self.drill_circular_angle_label, 9, 0)
         grid0.addWidget(self.drill_circular_angle_entry, 9, 1)
         grid0.addWidget(self.drill_circular_angle_entry, 9, 1)
@@ -2606,7 +2685,12 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         )
         )
         self.slot_length_label.setMinimumWidth(100)
         self.slot_length_label.setMinimumWidth(100)
 
 
-        self.slot_length_entry = LengthEntry()
+        self.slot_length_entry = FCDoubleSpinner()
+        self.slot_length_entry.set_range(0, 99999)
+        self.slot_length_entry.set_precision(4)
+        self.slot_length_entry.setWrapping(True)
+        self.slot_length_entry.setSingleStep(1)
+
         grid0.addWidget(self.slot_length_label, 11, 0)
         grid0.addWidget(self.slot_length_label, 11, 0)
         grid0.addWidget(self.slot_length_entry, 11, 1)
         grid0.addWidget(self.slot_length_entry, 11, 1)
 
 
@@ -2637,10 +2721,11 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         self.slot_angle_label.setMinimumWidth(100)
         self.slot_angle_label.setMinimumWidth(100)
 
 
         self.slot_angle_spinner = FCDoubleSpinner()
         self.slot_angle_spinner = FCDoubleSpinner()
-        self.slot_angle_spinner.set_precision(2)
+        self.slot_angle_spinner.set_precision(4)
         self.slot_angle_spinner.setWrapping(True)
         self.slot_angle_spinner.setWrapping(True)
         self.slot_angle_spinner.setRange(-359.99, 360.00)
         self.slot_angle_spinner.setRange(-359.99, 360.00)
-        self.slot_angle_spinner.setSingleStep(1.0)
+        self.slot_angle_spinner.setSingleStep(5)
+
         grid0.addWidget(self.slot_angle_label, 13, 0)
         grid0.addWidget(self.slot_angle_label, 13, 0)
         grid0.addWidget(self.slot_angle_spinner, 13, 1)
         grid0.addWidget(self.slot_angle_spinner, 13, 1)
 
 
@@ -2657,7 +2742,8 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         )
         )
         # self.slot_array_size_label.setMinimumWidth(100)
         # self.slot_array_size_label.setMinimumWidth(100)
 
 
-        self.slot_array_size_entry = LengthEntry()
+        self.slot_array_size_entry = FCSpinner()
+        self.slot_array_size_entry.set_range(0, 999999)
 
 
         grid0.addWidget(self.slot_array_size_label, 15, 0)
         grid0.addWidget(self.slot_array_size_label, 15, 0)
         grid0.addWidget(self.slot_array_size_entry, 15, 1)
         grid0.addWidget(self.slot_array_size_entry, 15, 1)
@@ -2684,7 +2770,11 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
             _("Pitch = Distance between elements of the array.")
             _("Pitch = Distance between elements of the array.")
         )
         )
         # self.drill_pitch_label.setMinimumWidth(100)
         # self.drill_pitch_label.setMinimumWidth(100)
-        self.slot_array_pitch_entry = LengthEntry()
+        self.slot_array_pitch_entry = FCDoubleSpinner()
+        self.slot_array_pitch_entry.set_precision(4)
+        self.slot_array_pitch_entry.setWrapping(True)
+        self.slot_array_pitch_entry.setRange(0, 999999)
+        self.slot_array_pitch_entry.setSingleStep(1)
 
 
         grid0.addWidget(self.slot_array_pitch_label, 17, 0)
         grid0.addWidget(self.slot_array_pitch_label, 17, 0)
         grid0.addWidget(self.slot_array_pitch_entry, 17, 1)
         grid0.addWidget(self.slot_array_pitch_entry, 17, 1)
@@ -2694,7 +2784,11 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         self.slot_array_angle_label.setToolTip(
         self.slot_array_angle_label.setToolTip(
             _("Angle at which each element in circular array is placed.")
             _("Angle at which each element in circular array is placed.")
         )
         )
-        self.slot_array_angle_entry = LengthEntry()
+        self.slot_array_angle_entry = FCDoubleSpinner()
+        self.slot_array_angle_entry.set_precision(4)
+        self.slot_array_angle_entry.setWrapping(True)
+        self.slot_array_angle_entry.setRange(-360, 360)
+        self.slot_array_angle_entry.setSingleStep(5)
 
 
         grid0.addWidget(self.slot_array_angle_label, 18, 0)
         grid0.addWidget(self.slot_array_angle_label, 18, 0)
         grid0.addWidget(self.slot_array_angle_entry, 18, 1)
         grid0.addWidget(self.slot_array_angle_entry, 18, 1)
@@ -2720,7 +2814,12 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
         self.slot_array_circular_angle_label.setToolTip(
         self.slot_array_circular_angle_label.setToolTip(
             _("Angle at which each element in circular array is placed.")
             _("Angle at which each element in circular array is placed.")
         )
         )
-        self.slot_array_circular_angle_entry = LengthEntry()
+        self.slot_array_circular_angle_entry = FCDoubleSpinner()
+        self.slot_array_circular_angle_entry.set_precision(4)
+        self.slot_array_circular_angle_entry.setWrapping(True)
+        self.slot_array_circular_angle_entry.setRange(-360, 360)
+        self.slot_array_circular_angle_entry.setSingleStep(5)
+
 
 
         grid0.addWidget(self.slot_array_circular_angle_label, 21, 0)
         grid0.addWidget(self.slot_array_circular_angle_label, 21, 0)
         grid0.addWidget(self.slot_array_circular_angle_entry, 21, 1)
         grid0.addWidget(self.slot_array_circular_angle_entry, 21, 1)
@@ -2748,6 +2847,8 @@ class GeometryGenPrefGroupUI(OptionsGroupUI):
 
 
         grid0 = QtWidgets.QGridLayout()
         grid0 = QtWidgets.QGridLayout()
         self.layout.addLayout(grid0)
         self.layout.addLayout(grid0)
+        grid0.setColumnStretch(0, 0)
+        grid0.setColumnStretch(1, 1)
 
 
         # Number of circle steps for circular aperture linear approximation
         # Number of circle steps for circular aperture linear approximation
         self.circle_steps_label = QtWidgets.QLabel('%s:' % _("Circle Steps"))
         self.circle_steps_label = QtWidgets.QLabel('%s:' % _("Circle Steps"))
@@ -2755,8 +2856,10 @@ class GeometryGenPrefGroupUI(OptionsGroupUI):
             _("The number of circle steps for <b>Geometry</b> \n"
             _("The number of circle steps for <b>Geometry</b> \n"
               "circle and arc shapes linear approximation.")
               "circle and arc shapes linear approximation.")
         )
         )
+        self.circle_steps_entry = FCSpinner()
+        self.circle_steps_entry.set_range(0, 999)
+
         grid0.addWidget(self.circle_steps_label, 1, 0)
         grid0.addWidget(self.circle_steps_label, 1, 0)
-        self.circle_steps_entry = IntEntry()
         grid0.addWidget(self.circle_steps_entry, 1, 1)
         grid0.addWidget(self.circle_steps_entry, 1, 1)
 
 
         # Tools
         # Tools
@@ -2768,8 +2871,13 @@ class GeometryGenPrefGroupUI(OptionsGroupUI):
         tdlabel.setToolTip(
         tdlabel.setToolTip(
             _("Diameters of the cutting tools, separated by ','")
             _("Diameters of the cutting tools, separated by ','")
         )
         )
+        self.cnctooldia_entry = FCDoubleSpinner()
+        self.cnctooldia_entry.set_range(0.000001, 999.9999)
+        self.cnctooldia_entry.set_precision(4)
+        self.cnctooldia_entry.setSingleStep(0.1)
+        self.cnctooldia_entry.setWrapping(True)
+
         grid0.addWidget(tdlabel, 3, 0)
         grid0.addWidget(tdlabel, 3, 0)
-        self.cnctooldia_entry = FCEntry()
         grid0.addWidget(self.cnctooldia_entry, 3, 1)
         grid0.addWidget(self.cnctooldia_entry, 3, 1)
 
 
         self.layout.addStretch()
         self.layout.addStretch()
@@ -2802,8 +2910,13 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
             _("Cutting depth (negative)\n"
             _("Cutting depth (negative)\n"
               "below the copper surface.")
               "below the copper surface.")
         )
         )
+        self.cutz_entry = FCDoubleSpinner()
+        self.cutz_entry.set_range(-999.999, -0.000001)
+        self.cutz_entry.set_precision(4)
+        self.cutz_entry.setSingleStep(0.1)
+        self.cutz_entry.setWrapping(True)
+
         grid1.addWidget(cutzlabel, 0, 0)
         grid1.addWidget(cutzlabel, 0, 0)
-        self.cutz_entry = LengthEntry()
         grid1.addWidget(self.cutz_entry, 0, 1)
         grid1.addWidget(self.cutz_entry, 0, 1)
 
 
         # Multidepth CheckBox
         # Multidepth CheckBox
@@ -2828,8 +2941,13 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
               "which has negative value.")
               "which has negative value.")
         )
         )
 
 
+        self.depthperpass_entry = FCDoubleSpinner()
+        self.depthperpass_entry.set_range(0, 99999)
+        self.depthperpass_entry.set_precision(4)
+        self.depthperpass_entry.setSingleStep(0.1)
+        self.depthperpass_entry.setWrapping(True)
+
         grid1.addWidget(dplabel, 2, 0)
         grid1.addWidget(dplabel, 2, 0)
-        self.depthperpass_entry = LengthEntry()
         grid1.addWidget(self.depthperpass_entry, 2, 1)
         grid1.addWidget(self.depthperpass_entry, 2, 1)
 
 
         self.ois_multidepth = OptionalInputSection(self.multidepth_cb, [self.depthperpass_entry])
         self.ois_multidepth = OptionalInputSection(self.multidepth_cb, [self.depthperpass_entry])
@@ -2840,8 +2958,13 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
             _("Height of the tool when\n"
             _("Height of the tool when\n"
               "moving without cutting.")
               "moving without cutting.")
         )
         )
+        self.travelz_entry = FCDoubleSpinner()
+        self.travelz_entry.set_range(0, 99999)
+        self.travelz_entry.set_precision(4)
+        self.travelz_entry.setSingleStep(0.1)
+        self.travelz_entry.setWrapping(True)
+
         grid1.addWidget(travelzlabel, 3, 0)
         grid1.addWidget(travelzlabel, 3, 0)
-        self.travelz_entry = LengthEntry()
         grid1.addWidget(self.travelz_entry, 3, 1)
         grid1.addWidget(self.travelz_entry, 3, 1)
 
 
         # Tool change:
         # Tool change:
@@ -2864,8 +2987,13 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
                 "tool change."
                 "tool change."
             )
             )
         )
         )
+        self.toolchangez_entry = FCDoubleSpinner()
+        self.toolchangez_entry.set_range(0, 99999)
+        self.toolchangez_entry.set_precision(4)
+        self.toolchangez_entry.setSingleStep(0.1)
+        self.toolchangez_entry.setWrapping(True)
+
         grid1.addWidget(toolchangezlabel, 5, 0)
         grid1.addWidget(toolchangezlabel, 5, 0)
-        self.toolchangez_entry = LengthEntry()
         grid1.addWidget(self.toolchangez_entry, 5, 1)
         grid1.addWidget(self.toolchangez_entry, 5, 1)
 
 
         # End move Z
         # End move Z
@@ -2874,8 +3002,13 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
             _("Height of the tool after\n"
             _("Height of the tool after\n"
               "the last move at the end of the job.")
               "the last move at the end of the job.")
         )
         )
+        self.gendz_entry = FCDoubleSpinner()
+        self.gendz_entry.set_range(0, 99999)
+        self.gendz_entry.set_precision(4)
+        self.gendz_entry.setSingleStep(0.1)
+        self.gendz_entry.setWrapping(True)
+
         grid1.addWidget(endzlabel, 6, 0)
         grid1.addWidget(endzlabel, 6, 0)
-        self.gendz_entry = LengthEntry()
         grid1.addWidget(self.gendz_entry, 6, 1)
         grid1.addWidget(self.gendz_entry, 6, 1)
 
 
         # Feedrate X-Y
         # Feedrate X-Y
@@ -2884,8 +3017,13 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
             _("Cutting speed in the XY\n"
             _("Cutting speed in the XY\n"
               "plane in units per minute")
               "plane in units per minute")
         )
         )
+        self.cncfeedrate_entry = FCDoubleSpinner()
+        self.cncfeedrate_entry.set_range(0, 99999)
+        self.cncfeedrate_entry.set_precision(4)
+        self.cncfeedrate_entry.setSingleStep(0.1)
+        self.cncfeedrate_entry.setWrapping(True)
+
         grid1.addWidget(frlabel, 7, 0)
         grid1.addWidget(frlabel, 7, 0)
-        self.cncfeedrate_entry = LengthEntry()
         grid1.addWidget(self.cncfeedrate_entry, 7, 1)
         grid1.addWidget(self.cncfeedrate_entry, 7, 1)
 
 
         # Feedrate Z (Plunge)
         # Feedrate Z (Plunge)
@@ -2895,8 +3033,13 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
               "plane in units per minute.\n"
               "plane in units per minute.\n"
               "It is called also Plunge.")
               "It is called also Plunge.")
         )
         )
+        self.cncplunge_entry = FCDoubleSpinner()
+        self.cncplunge_entry.set_range(0, 99999)
+        self.cncplunge_entry.set_precision(4)
+        self.cncplunge_entry.setSingleStep(0.1)
+        self.cncplunge_entry.setWrapping(True)
+
         grid1.addWidget(frz_label, 8, 0)
         grid1.addWidget(frz_label, 8, 0)
-        self.cncplunge_entry = LengthEntry()
         grid1.addWidget(self.cncplunge_entry, 8, 1)
         grid1.addWidget(self.cncplunge_entry, 8, 1)
 
 
         # Spindle Speed
         # Spindle Speed
@@ -2922,7 +3065,12 @@ class GeometryOptPrefGroupUI(OptionsGroupUI):
         dwelltime.setToolTip(
         dwelltime.setToolTip(
             _("Number of time units for spindle to dwell.")
             _("Number of time units for spindle to dwell.")
         )
         )
-        self.dwelltime_entry = FCEntry()
+        self.dwelltime_entry = FCDoubleSpinner()
+        self.dwelltime_entry.set_range(0, 99999)
+        self.dwelltime_entry.set_precision(4)
+        self.dwelltime_entry.setSingleStep(0.1)
+        self.dwelltime_entry.setWrapping(True)
+
         grid1.addWidget(self.dwell_cb, 10, 0)
         grid1.addWidget(self.dwell_cb, 10, 0)
         grid1.addWidget(dwelltime, 11, 0)
         grid1.addWidget(dwelltime, 11, 0)
         grid1.addWidget(self.dwelltime_entry, 11, 1)
         grid1.addWidget(self.dwelltime_entry, 11, 1)
@@ -2992,8 +3140,13 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI):
               "It is useful only for Marlin,\n"
               "It is useful only for Marlin,\n"
               "ignore for any other cases.")
               "ignore for any other cases.")
         )
         )
+        self.cncfeedrate_rapid_entry = FCDoubleSpinner()
+        self.cncfeedrate_rapid_entry.set_range(0, 99999)
+        self.cncfeedrate_rapid_entry.set_precision(4)
+        self.cncfeedrate_rapid_entry.setSingleStep(0.1)
+        self.cncfeedrate_rapid_entry.setWrapping(True)
+
         grid1.addWidget(fr_rapid_label, 4, 0)
         grid1.addWidget(fr_rapid_label, 4, 0)
-        self.cncfeedrate_rapid_entry = LengthEntry()
         grid1.addWidget(self.cncfeedrate_rapid_entry, 4, 1)
         grid1.addWidget(self.cncfeedrate_rapid_entry, 4, 1)
 
 
         # End move extra cut
         # End move extra cut
@@ -3012,8 +3165,13 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI):
             _("The maximum depth that the probe is allowed\n"
             _("The maximum depth that the probe is allowed\n"
               "to probe. Negative value, in current units.")
               "to probe. Negative value, in current units.")
         )
         )
+        self.pdepth_entry = FCDoubleSpinner()
+        self.pdepth_entry.set_range(-99999, -0.000001)
+        self.pdepth_entry.set_precision(4)
+        self.pdepth_entry.setSingleStep(0.1)
+        self.pdepth_entry.setWrapping(True)
+
         grid1.addWidget(self.pdepth_label, 6, 0)
         grid1.addWidget(self.pdepth_label, 6, 0)
-        self.pdepth_entry = FCEntry()
         grid1.addWidget(self.pdepth_entry, 6, 1)
         grid1.addWidget(self.pdepth_entry, 6, 1)
 
 
         # Probe feedrate
         # Probe feedrate
@@ -3021,8 +3179,13 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI):
         self.feedrate_probe_label.setToolTip(
         self.feedrate_probe_label.setToolTip(
             _("The feedrate used while the probe is probing.")
             _("The feedrate used while the probe is probing.")
         )
         )
+        self.feedrate_probe_entry = FCDoubleSpinner()
+        self.feedrate_probe_entry.set_range(0, 99999)
+        self.feedrate_probe_entry.set_precision(4)
+        self.feedrate_probe_entry.setSingleStep(0.1)
+        self.feedrate_probe_entry.setWrapping(True)
+
         grid1.addWidget(self.feedrate_probe_label, 7, 0)
         grid1.addWidget(self.feedrate_probe_label, 7, 0)
-        self.feedrate_probe_entry = FCEntry()
         grid1.addWidget(self.feedrate_probe_entry, 7, 1)
         grid1.addWidget(self.feedrate_probe_entry, 7, 1)
 
 
         # Spindle direction
         # Spindle direction
@@ -3058,8 +3221,13 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI):
               "Useful for auto-leveling.\n"
               "Useful for auto-leveling.\n"
               "A value of 0 means no segmentation on the X axis.")
               "A value of 0 means no segmentation on the X axis.")
         )
         )
+        self.segx_entry = FCDoubleSpinner()
+        self.segx_entry.set_range(0, 99999)
+        self.segx_entry.set_precision(4)
+        self.segx_entry.setSingleStep(0.1)
+        self.segx_entry.setWrapping(True)
+
         grid1.addWidget(segx_label, 10, 0)
         grid1.addWidget(segx_label, 10, 0)
-        self.segx_entry = FCEntry()
         grid1.addWidget(self.segx_entry, 10, 1)
         grid1.addWidget(self.segx_entry, 10, 1)
 
 
         # Size of trace segment on Y axis
         # Size of trace segment on Y axis
@@ -3069,8 +3237,13 @@ class GeometryAdvOptPrefGroupUI(OptionsGroupUI):
               "Useful for auto-leveling.\n"
               "Useful for auto-leveling.\n"
               "A value of 0 means no segmentation on the Y axis.")
               "A value of 0 means no segmentation on the Y axis.")
         )
         )
+        self.segy_entry = FCDoubleSpinner()
+        self.segy_entry.set_range(0, 99999)
+        self.segy_entry.set_precision(4)
+        self.segy_entry.setSingleStep(0.1)
+        self.segy_entry.setWrapping(True)
+
         grid1.addWidget(segy_label, 11, 0)
         grid1.addWidget(segy_label, 11, 0)
-        self.segy_entry = FCEntry()
         grid1.addWidget(self.segy_entry, 11, 1)
         grid1.addWidget(self.segy_entry, 11, 1)
 
 
         self.layout.addStretch()
         self.layout.addStretch()
@@ -3102,7 +3275,8 @@ class GeometryEditorPrefGroupUI(OptionsGroupUI):
               "Increases the performance when moving a\n"
               "Increases the performance when moving a\n"
               "large number of geometric elements.")
               "large number of geometric elements.")
         )
         )
-        self.sel_limit_entry = IntEntry()
+        self.sel_limit_entry = FCSpinner()
+        self.sel_limit_entry.set_range(0, 9999)
 
 
         grid0.addWidget(self.sel_limit_label, 0, 0)
         grid0.addWidget(self.sel_limit_label, 0, 0)
         grid0.addWidget(self.sel_limit_entry, 0, 1)
         grid0.addWidget(self.sel_limit_entry, 0, 1)
@@ -3186,7 +3360,8 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI):
               "circle and arc shapes linear approximation.")
               "circle and arc shapes linear approximation.")
         )
         )
         grid0.addWidget(self.steps_per_circle_label, 3, 0)
         grid0.addWidget(self.steps_per_circle_label, 3, 0)
-        self.steps_per_circle_entry = IntEntry()
+        self.steps_per_circle_entry = FCSpinner()
+        self.steps_per_circle_entry.set_range(0, 99999)
         grid0.addWidget(self.steps_per_circle_entry, 3, 1)
         grid0.addWidget(self.steps_per_circle_entry, 3, 1)
 
 
         # Tool dia for plot
         # Tool dia for plot
@@ -3195,7 +3370,12 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI):
             _("The width of the travel lines to be\n"
             _("The width of the travel lines to be\n"
               "rendered in the plot.")
               "rendered in the plot.")
         )
         )
-        self.tooldia_entry = LengthEntry()
+        self.tooldia_entry = FCDoubleSpinner()
+        self.tooldia_entry.set_range(0, 99999)
+        self.tooldia_entry.set_precision(4)
+        self.tooldia_entry.setSingleStep(0.1)
+        self.tooldia_entry.setWrapping(True)
+
         grid0.addWidget(tdlabel, 4, 0)
         grid0.addWidget(tdlabel, 4, 0)
         grid0.addWidget(self.tooldia_entry, 4, 1)
         grid0.addWidget(self.tooldia_entry, 4, 1)
 
 
@@ -3208,7 +3388,10 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI):
             _("The number of decimals to be used for \n"
             _("The number of decimals to be used for \n"
               "the X, Y, Z coordinates in CNC code (GCODE, etc.)")
               "the X, Y, Z coordinates in CNC code (GCODE, etc.)")
         )
         )
-        self.coords_dec_entry = IntEntry()
+        self.coords_dec_entry = FCSpinner()
+        self.coords_dec_entry.set_range(0, 9)
+        self.coords_dec_entry.setWrapping(True)
+
         grid0.addWidget(cdeclabel, 6, 0)
         grid0.addWidget(cdeclabel, 6, 0)
         grid0.addWidget(self.coords_dec_entry, 6, 1)
         grid0.addWidget(self.coords_dec_entry, 6, 1)
 
 
@@ -3218,7 +3401,10 @@ class CNCJobGenPrefGroupUI(OptionsGroupUI):
             _("The number of decimals to be used for \n"
             _("The number of decimals to be used for \n"
               "the Feedrate parameter in CNC code (GCODE, etc.)")
               "the Feedrate parameter in CNC code (GCODE, etc.)")
         )
         )
-        self.fr_dec_entry = IntEntry()
+        self.fr_dec_entry = FCSpinner()
+        self.fr_dec_entry.set_range(0, 9)
+        self.fr_dec_entry.setWrapping(True)
+
         grid0.addWidget(frdeclabel, 7, 0)
         grid0.addWidget(frdeclabel, 7, 0)
         grid0.addWidget(self.fr_dec_entry, 7, 1)
         grid0.addWidget(self.fr_dec_entry, 7, 1)
 
 
@@ -3407,6 +3593,8 @@ class CNCJobAdvOptPrefGroupUI(OptionsGroupUI):
         )
         )
         grid0.addWidget(self.annotation_fontsize_label, 2, 0)
         grid0.addWidget(self.annotation_fontsize_label, 2, 0)
         self.annotation_fontsize_sp = FCSpinner()
         self.annotation_fontsize_sp = FCSpinner()
+        self.annotation_fontsize_sp.set_range(0, 9999)
+
         grid0.addWidget(self.annotation_fontsize_sp, 2, 1)
         grid0.addWidget(self.annotation_fontsize_sp, 2, 1)
         grid0.addWidget(QtWidgets.QLabel(''), 2, 2)
         grid0.addWidget(QtWidgets.QLabel(''), 2, 2)
 
 

+ 1 - 1
flatcamParsers/ParseGerber.py

@@ -630,7 +630,7 @@ class Gerber(Geometry):
 
 
                         # --- Buffered ---
                         # --- Buffered ---
                         try:
                         try:
-                            log.debug("Bare op-code %d." % current_operation_code)
+                            # log.debug("Bare op-code %d." % current_operation_code)
                             geo_dict = dict()
                             geo_dict = dict()
                             flash = self.create_flash_geometry(
                             flash = self.create_flash_geometry(
                                 Point(current_x, current_y), self.apertures[current_aperture],
                                 Point(current_x, current_y), self.apertures[current_aperture],

+ 11 - 1
flatcamTools/ToolDistance.py

@@ -428,7 +428,17 @@ class Distance(FlatCAMTool):
         # second draw the new shape of the utility geometry
         # second draw the new shape of the utility geometry
         meas_line = LineString([pos, self.points[0]])
         meas_line = LineString([pos, self.points[0]])
 
 
-        color = '#000000FF'
+        settings = QtCore.QSettings("Open Source", "FlatCAM")
+        if settings.contains("theme"):
+            theme = settings.value('theme', type=str)
+        else:
+            theme = 'white'
+
+        if theme == 'white':
+            color = '#000000FF'
+        else:
+            color = '#FFFFFFFF'
+
         self.sel_shapes.add(meas_line, color=color, update=True, layer=0, tolerance=None)
         self.sel_shapes.add(meas_line, color=color, update=True, layer=0, tolerance=None)
 
 
         if self.app.is_legacy is True:
         if self.app.is_legacy is True: