3838from dlclivegui .config import CameraSettings , MultiCameraSettings
3939
4040from .misc .eliding_label import ElidingPathLabel
41+ from .misc .layouts import _make_two_field_row
4142
4243LOGGER = logging .getLogger (__name__ )
4344LOGGER .setLevel (logging .DEBUG ) # TODO @C-Achard remove for release
@@ -314,71 +315,6 @@ def _merge_backend_settings_back(self, opened_settings: CameraSettings) -> None:
314315 # -------------------------------
315316 # UI setup
316317 # -------------------------------
317- def _make_two_field_row (
318- self ,
319- left_label : str ,
320- left_widget : QWidget ,
321- right_label : str ,
322- right_widget : QWidget ,
323- left_stretch : int = 1 ,
324- right_stretch : int = 1 ,
325- * ,
326- label_min_width : int = 30 ,
327- ) -> QWidget :
328- """Create a compact two-field row widget: (label+value) (label+value), with clear label/value styling."""
329- row = QWidget ()
330- layout = QHBoxLayout (row )
331- layout .setContentsMargins (0 , 0 , 0 , 0 )
332- layout .setSpacing (8 )
333-
334- def style_key (lbl : QLabel ):
335- # Muted label styling
336- lbl .setAlignment (Qt .AlignLeft | Qt .AlignVCenter )
337- # lbl.setMinimumWidth(label_min_width)
338- # lbl.setStyleSheet(
339- # """
340- # QLabel {
341- # color: rgba(255,255,255,0.65); /* works OK on dark themes */
342- # color: palette(mid); /* fallback on light themes */
343- # font-weight: 500;
344- # }
345- # """
346- # )
347-
348- def style_value (w : QWidget ):
349- # Make values stand out (works for QLabel and custom value widgets like ElidingPathLabel)
350- # Using QSS that gives a subtle "field" look.
351- w .setStyleSheet (
352- """
353- QLabel, ElidingPathLabel {
354- font-weight: 700;
355- color: palette(text);
356- background-color: rgba(127,127,127,0.12);
357- border: 1px solid rgba(127,127,127,0.18);
358- border-radius: 6px;
359- padding: 2px 6px;
360- }
361- """
362- )
363- if isinstance (w , QLabel ):
364- w .setAlignment (Qt .AlignRight | Qt .AlignVCenter )
365-
366- l1 = QLabel (left_label )
367- style_key (l1 )
368- style_value (left_widget )
369-
370- l2 = QLabel (right_label )
371- style_key (l2 )
372- style_value (right_widget )
373-
374- layout .addWidget (l1 , 1 )
375- layout .addWidget (left_widget , left_stretch )
376- layout .addSpacing (8 )
377- layout .addWidget (l2 , 1 )
378- layout .addWidget (right_widget , right_stretch )
379-
380- return row
381-
382318 def _set_detected_labels (self , cam : CameraSettings ) -> None :
383319 """Update the read-only detected labels based on cam.properties[backend]."""
384320 backend = (cam .backend or "" ).lower ()
@@ -529,7 +465,9 @@ def _setup_ui(self) -> None:
529465
530466 self .cam_backend_label = QLabel ("opencv" )
531467 # self.settings_form.addRow("Backend:", self.cam_backend_label)
532- id_backend_row = self ._make_two_field_row ("Index:" , self .cam_index_label , "Backend:" , self .cam_backend_label )
468+ id_backend_row = _make_two_field_row (
469+ "Index:" , self .cam_index_label , "Backend:" , self .cam_backend_label , key_width = 120
470+ )
533471 self .settings_form .addRow (id_backend_row )
534472
535473 # --- Detected read-only labels (do NOT change requested values) ---
@@ -538,8 +476,13 @@ def _setup_ui(self) -> None:
538476
539477 self .detected_fps_label = QLabel ("—" )
540478 self .detected_fps_label .setTextInteractionFlags (Qt .TextSelectableByMouse )
541- detected_row = self ._make_two_field_row (
542- "Detected resolution:" , self .detected_resolution_label , "Detected FPS:" , self .detected_fps_label
479+ detected_row = _make_two_field_row (
480+ "Detected resolution:" ,
481+ self .detected_resolution_label ,
482+ "Detected FPS:" ,
483+ self .detected_fps_label ,
484+ key_width = 120 ,
485+ gap = 10 ,
543486 )
544487 self .settings_form .addRow (detected_row )
545488
@@ -554,7 +497,7 @@ def _setup_ui(self) -> None:
554497 self .cam_height .setValue (0 )
555498 self .cam_height .setSpecialValueText ("Auto" )
556499
557- res_row = self . _make_two_field_row ("W" , self .cam_width , "H" , self .cam_height )
500+ res_row = _make_two_field_row ("W" , self .cam_width , "H" , self .cam_height , key_width = 30 )
558501 self .settings_form .addRow ("Resolution:" , res_row )
559502
560503 # --- FPS + Rotation grouped (CREATE cam_rotation ONCE) ---
@@ -571,7 +514,7 @@ def _setup_ui(self) -> None:
571514 self .cam_rotation .addItem ("180°" , 180 )
572515 self .cam_rotation .addItem ("270°" , 270 )
573516
574- fps_rot_row = self . _make_two_field_row ("FPS" , self .cam_fps , "Rot" , self .cam_rotation )
517+ fps_rot_row = _make_two_field_row ("FPS" , self .cam_fps , "Rot" , self .cam_rotation , key_width = 30 )
575518 self .settings_form .addRow ("Capture:" , fps_rot_row )
576519
577520 # --- Exposure + Gain grouped ---
@@ -587,7 +530,7 @@ def _setup_ui(self) -> None:
587530 self .cam_gain .setSpecialValueText ("Auto" )
588531 self .cam_gain .setDecimals (2 )
589532
590- exp_gain_row = self . _make_two_field_row ("Exp" , self .cam_exposure , "Gain" , self .cam_gain )
533+ exp_gain_row = _make_two_field_row ("Exp" , self .cam_exposure , "Gain" , self .cam_gain , key_width = 30 )
591534 self .settings_form .addRow ("Analog:" , exp_gain_row )
592535
593536 # --- Crop row (keep as you already have it) ---
0 commit comments