1313 QSpinBox , QCheckBox , QPushButton ,
1414 QVBoxLayout , QHBoxLayout , QGroupBox )
1515
16- from pugdebug .models .settings import (get_setting , set_setting ,
16+ from PyQt5 .QtCore import pyqtSignal
17+
18+ from pugdebug .models .settings import (get_setting , has_setting , set_setting ,
1719 get_default_setting )
1820
1921
2022class PugdebugSettingsWindow (QDialog ):
2123
24+ settings_changed_signal = pyqtSignal (set )
25+
2226 def __init__ (self , parent ):
2327 super (PugdebugSettingsWindow , self ).__init__ (parent )
2428
25- self .project_root = QLineEdit ()
26-
27- self .project_root .textChanged .connect (
28- self .handle_project_root_changed
29- )
30-
31- project_root = get_setting ('path/project_root' )
32- self .project_root .setText (project_root )
33-
34- self .path_mapping = QLineEdit ()
35-
36- self .path_mapping .textChanged .connect (
37- self .handle_path_mapping_changed
38- )
39- path_mapping = get_setting ('path/path_mapping' )
40- self .path_mapping .setText (path_mapping )
41-
42- self .host = QLineEdit ()
43-
44- self .host .textChanged .connect (self .handle_host_changed )
45-
46- host = get_setting ('debugger/host' )
47- self .host .setText (host )
48-
49- self .port_number = QSpinBox ()
50- self .port_number .setRange (1 , 65535 )
51-
52- self .port_number .valueChanged .connect (self .handle_port_number_changed )
53-
54- port_number = int (get_setting ('debugger/port_number' ))
55- self .port_number .setValue (port_number )
56-
57- self .idekey = QLineEdit ()
58-
59- self .idekey .textChanged .connect (self .handle_idekey_changed )
60-
61- idekey = get_setting ('debugger/idekey' )
62- self .idekey .setText (idekey )
63-
64- self .break_at_first_line = QCheckBox ("Break at first line" )
65-
66- self .break_at_first_line .stateChanged .connect (
67- self .handle_break_at_first_line_changed
68- )
69-
70- break_at_first_line = int (get_setting ('debugger/break_at_first_line' ))
71- self .break_at_first_line .setCheckState (break_at_first_line )
72-
73- self .max_depth = QLineEdit ()
74-
75- self .max_depth .textChanged .connect (self .handle_max_depth_changed )
29+ # Construct the widgets
30+ self .widgets = {
31+ 'path/project_root' : QLineEdit (),
32+ 'path/path_mapping' : QLineEdit (),
33+ 'debugger/host' : QLineEdit (),
34+ 'debugger/port_number' : QSpinBox (),
35+ 'debugger/idekey' : QLineEdit (),
36+ 'debugger/break_at_first_line' : QCheckBox ("Break at first line" ),
37+ 'debugger/max_depth' : QLineEdit (),
38+ 'debugger/max_children' : QLineEdit (),
39+ 'debugger/max_data' : QLineEdit (),
40+ }
7641
77- max_depth = get_setting ( 'debugger/max_depth' )
78- self .max_depth . setText ( max_depth )
42+ # Widget settings
43+ self .widgets [ 'debugger/port_number' ]. setRange ( 1 , 65535 )
7944
80- self .max_children = QLineEdit ()
45+ # Save values on accepted (clicked Save button)
46+ self .accepted .connect (self .save_settings )
8147
82- self .max_children .textChanged .connect (
83- self .handle_max_children_changed
84- )
48+ self .setup_layout ()
8549
86- max_children = get_setting ( 'debugger/max_children' )
87- self . max_children . setText ( max_children )
88-
89- self . max_data = QLineEdit ( )
50+ def setup_layout ( self ):
51+ # Buttons
52+ reset_button = QPushButton ( "Reset" )
53+ reset_button . clicked . connect ( self . reset_defaults )
9054
91- self .max_data .textChanged .connect (self .handle_max_data_changed )
55+ save_button = QPushButton ("Save" )
56+ save_button .clicked .connect (self .accept )
9257
93- max_data = get_setting ('debugger/max_data' )
94- self .max_data .setText (max_data )
95-
96- # Buttons
97- self .reset_button = QPushButton ("Reset to defaults" )
98- self .reset_button .clicked .connect (self .reset_defaults )
58+ cancel_button = QPushButton ("Cancel" )
59+ cancel_button .clicked .connect (self .reject )
9960
61+ # Layout
10062 path_layout = QFormLayout ()
101- path_layout .addRow ("Root:" , self .project_root )
102- path_layout .addRow ("Maps from:" , self .path_mapping )
63+ path_layout .addRow ("Root:" , self .widgets [ 'path/ project_root' ] )
64+ path_layout .addRow ("Maps from:" , self .widgets [ 'path/ path_mapping' ] )
10365
10466 debugger_layout = QFormLayout ()
105- debugger_layout .addRow ("Host" , self .host )
106- debugger_layout .addRow ("Port" , self .port_number )
107- debugger_layout .addRow ("IDE Key" , self .idekey )
108- debugger_layout .addRow ("" , self .break_at_first_line )
109- debugger_layout .addRow ("Max depth" , self .max_depth )
110- debugger_layout .addRow ("Max children" , self .max_children )
111- debugger_layout .addRow ("Max data" , self .max_data )
67+ debugger_layout .addRow ("Host" , self .widgets [ 'debugger/ host' ] )
68+ debugger_layout .addRow ("Port" , self .widgets [ 'debugger/ port_number' ] )
69+ debugger_layout .addRow ("IDE Key" , self .widgets [ 'debugger/ idekey' ] )
70+ debugger_layout .addRow ("" , self .widgets [ 'debugger/ break_at_first_line' ] )
71+ debugger_layout .addRow ("Max depth" , self .widgets [ 'debugger/ max_depth' ] )
72+ debugger_layout .addRow ("Max children" , self .widgets [ 'debugger/ max_children' ] )
73+ debugger_layout .addRow ("Max data" , self .widgets [ 'debugger/ max_data' ] )
11274
11375 path_group = QGroupBox ("Path" )
11476 path_group .setLayout (path_layout )
@@ -117,7 +79,9 @@ def __init__(self, parent):
11779 debugger_group .setLayout (debugger_layout )
11880
11981 button_layout = QHBoxLayout ()
120- button_layout .addWidget (self .reset_button )
82+ button_layout .addWidget (save_button )
83+ button_layout .addWidget (cancel_button )
84+ button_layout .addWidget (reset_button )
12185
12286 box_layout = QVBoxLayout ()
12387 box_layout .addWidget (path_group )
@@ -126,71 +90,50 @@ def __init__(self, parent):
12690
12791 self .setLayout (box_layout )
12892
93+ def showEvent (self , event ):
94+ """Load setting from store when showing the dialog."""
95+ super (PugdebugSettingsWindow , self ).showEvent (event )
96+ self .load_settings ()
97+
12998 def get_project_root (self ):
130- return self .project_root .text ()
99+ widget = self .widgets ['path/project_root' ]
100+ return self .get_widget_value (widget )
131101
132102 def get_path_mapping (self ):
133- path_map = self .path_mapping .text ()
103+ widget = self .widgets ['path/path_mapping' ]
104+ path_map = self .get_widget_value (widget )
134105
135106 if len (path_map ) > 0 :
136107 return path_map
137108
138109 return False
139110
140- def handle_project_root_changed (self ):
141- value = self .project_root .text ()
142- set_setting ('path/project_root' , value )
143-
144- def handle_path_mapping_changed (self ):
145- value = self .path_mapping .text ()
146- set_setting ('path/path_mapping' , value )
147-
148- def handle_host_changed (self ):
149- value = self .host .text ()
150- set_setting ('debugger/host' , value )
151-
152- def handle_port_number_changed (self , value ):
153- """Handle when port number gets changed
154-
155- Set the new value in the application's setting.
156- """
157- set_setting ('debugger/port_number' , value )
111+ def load_settings (self ):
112+ """Loads all settings from QSettings into the form"""
113+ for name , widget in self .widgets .items ():
114+ value = get_setting (name ) if has_setting (name ) \
115+ else get_default_setting (name )
116+ self .set_widget_value (widget , value )
158117
159- def handle_idekey_changed (self ):
160- value = self . idekey . text ()
161- set_setting ( 'debugger/idekey' , value )
118+ def save_settings (self ):
119+ """Saves all settings from the form to QSettings"""
120+ changed_settings = set ( )
162121
163- def handle_break_at_first_line_changed ( self , value ):
164- set_setting ( 'debugger/break_at_first_line' , value )
122+ for name , widget in self . widgets . items ( ):
123+ value = self . get_widget_value ( widget )
165124
166- def handle_max_depth_changed ( self ) :
167- value = self . max_depth . text ( )
168- set_setting ( 'debugger/max_depth' , value )
125+ if not has_setting ( name ) or get_setting ( name ) != value :
126+ set_setting ( name , value )
127+ changed_settings . add ( name )
169128
170- def handle_max_children_changed (self ):
171- value = self .max_children .text ()
172- set_setting ('debugger/max_children' , value )
173-
174- def handle_max_data_changed (self ):
175- value = self .max_data .text ()
176- set_setting ('debugger/max_data' , value )
129+ if len (changed_settings ) > 0 :
130+ self .settings_changed_signal .emit (changed_settings )
177131
178132 def reset_defaults (self ):
179133 """Resets all settings to their deafult values"""
180- self .reset_default (self .host , 'debugger/host' )
181- self .reset_default (self .port_number , 'debugger/port_number' )
182- self .reset_default (self .idekey , 'debugger/idekey' )
183- self .reset_default (self .break_at_first_line , 'debugger/break_at_first_line' )
184- self .reset_default (self .max_depth , 'debugger/max_depth' )
185- self .reset_default (self .max_children , 'debugger/max_children' )
186- self .reset_default (self .max_data , 'debugger/max_data' )
187- self .reset_default (self .project_root , 'path/project_root' )
188- self .reset_default (self .path_mapping , 'path/path_mapping' )
189-
190- def reset_default (self , widget , setting ):
191- """Resets a single setting to its default value"""
192- value = get_default_setting (setting )
193- self .set_widget_value (widget , value )
134+ for name , widget in self .widgets .items ():
135+ value = get_default_setting (name )
136+ self .set_widget_value (widget , value )
194137
195138 def set_widget_value (self , widget , value ):
196139 """A generic method which can set the value of any of the used widgets.
@@ -204,3 +147,16 @@ def set_widget_value(self, widget, value):
204147 else :
205148 name = type (widget ).__name__
206149 raise Exception ("Don't know how to set a value for %s" % name )
150+
151+ def get_widget_value (self , widget ):
152+ """A generic method which can set the value of any of the used widgets.
153+ """
154+ if isinstance (widget , QLineEdit ):
155+ return widget .text ()
156+ elif isinstance (widget , QSpinBox ):
157+ return widget .value ()
158+ elif isinstance (widget , QCheckBox ):
159+ return widget .checkState ()
160+ else :
161+ name = type (widget ).__name__
162+ raise Exception ("Don't know how to get a value for %s" % name )
0 commit comments