Skip to content
This repository was archived by the owner on Aug 28, 2020. It is now read-only.

Commit 4c514b4

Browse files
committed
Merge pull request #105 from ihabunek/feature/settings
I've been working on the settings. Thanks @ihabunek !
2 parents 4ec3600 + 84e59c0 commit 4c514b4

File tree

3 files changed

+156
-144
lines changed

3 files changed

+156
-144
lines changed

pugdebug/gui/settings.py

Lines changed: 125 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -10,147 +10,153 @@
1010
__author__ = "robertbasic"
1111

1212
from PyQt5.QtWidgets import (QDialog, QLineEdit, QFormLayout,
13-
QSpinBox, QCheckBox)
13+
QSpinBox, QCheckBox, QPushButton,
14+
QVBoxLayout, QHBoxLayout, QGroupBox)
1415

15-
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,
19+
get_default_setting)
1620

1721

1822
class PugdebugSettingsWindow(QDialog):
1923

20-
layout = QFormLayout()
24+
settings_changed_signal = pyqtSignal(set)
2125

2226
def __init__(self, parent):
2327
super(PugdebugSettingsWindow, self).__init__(parent)
2428

25-
self.project_root = QLineEdit()
26-
27-
self.project_root.editingFinished.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.editingFinished.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.editingFinished.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.editingFinished.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.editingFinished.connect(self.handle_max_depth_changed)
76-
77-
max_depth = get_setting('debugger/max_depth')
78-
self.max_depth.setText(max_depth)
79-
80-
self.max_children = QLineEdit()
81-
82-
self.max_children.editingFinished.connect(
83-
self.handle_max_children_changed
84-
)
85-
86-
max_children = get_setting('debugger/max_children')
87-
self.max_children.setText(max_children)
88-
89-
self.max_data = QLineEdit()
90-
91-
self.max_data.editingFinished.connect(self.handle_max_data_changed)
92-
93-
max_data = get_setting('debugger/max_data')
94-
self.max_data.setText(max_data)
95-
96-
layout = QFormLayout()
97-
self.setLayout(layout)
98-
99-
layout.addRow("Root:", self.project_root)
100-
layout.addRow("Maps from:", self.path_mapping)
101-
layout.addRow("Host", self.host)
102-
layout.addRow("Port", self.port_number)
103-
layout.addRow("IDE Key", self.idekey)
104-
layout.addRow("", self.break_at_first_line)
105-
layout.addRow("Max depth", self.max_depth)
106-
layout.addRow("Max children", self.max_children)
107-
layout.addRow("Max data", self.max_data)
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+
}
41+
42+
# Widget settings
43+
self.widgets['debugger/port_number'].setRange(1, 65535)
44+
45+
# Save values on accepted (clicked Save button)
46+
self.accepted.connect(self.save_settings)
47+
48+
self.setup_layout()
49+
50+
def setup_layout(self):
51+
# Buttons
52+
reset_button = QPushButton("&Reset")
53+
reset_button.clicked.connect(self.reset_defaults)
54+
55+
save_button = QPushButton("&Save")
56+
save_button.clicked.connect(self.accept)
57+
58+
cancel_button = QPushButton("&Cancel")
59+
cancel_button.clicked.connect(self.reject)
60+
61+
# Layout
62+
path_layout = QFormLayout()
63+
path_layout.addRow("Root:", self.widgets['path/project_root'])
64+
path_layout.addRow("Maps from:", self.widgets['path/path_mapping'])
65+
66+
debugger_layout = QFormLayout()
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'])
74+
75+
path_group = QGroupBox("Path")
76+
path_group.setLayout(path_layout)
77+
78+
debugger_group = QGroupBox("Debugger")
79+
debugger_group.setLayout(debugger_layout)
80+
81+
button_layout = QHBoxLayout()
82+
button_layout.addWidget(save_button)
83+
button_layout.addWidget(cancel_button)
84+
button_layout.addWidget(reset_button)
85+
86+
box_layout = QVBoxLayout()
87+
box_layout.addWidget(path_group)
88+
box_layout.addWidget(debugger_group)
89+
box_layout.addLayout(button_layout)
90+
91+
self.setLayout(box_layout)
92+
93+
def showEvent(self, event):
94+
"""Load setting from store when showing the dialog."""
95+
super(PugdebugSettingsWindow, self).showEvent(event)
96+
self.load_settings()
10897

10998
def get_project_root(self):
110-
return self.project_root.text()
99+
widget = self.widgets['path/project_root']
100+
return self.get_widget_value(widget)
111101

112102
def get_path_mapping(self):
113-
path_map = self.path_mapping.text()
103+
widget = self.widgets['path/path_mapping']
104+
path_map = self.get_widget_value(widget)
114105

115106
if len(path_map) > 0:
116107
return path_map
117108

118109
return False
119110

120-
def handle_project_root_changed(self):
121-
value = self.project_root.text()
122-
set_setting('path/project_root', value)
123-
124-
def handle_path_mapping_changed(self):
125-
value = self.path_mapping.text()
126-
set_setting('path/path_mapping', value)
127-
128-
def handle_host_changed(self):
129-
value = self.host.text()
130-
set_setting('debugger/host', 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)
131117

132-
def handle_port_number_changed(self, value):
133-
"""Handle when port number gets changed
118+
def save_settings(self):
119+
"""Saves all settings from the form to QSettings"""
120+
changed_settings = set()
134121

135-
Set the new value in the application's setting.
136-
"""
137-
set_setting('debugger/port_number', value)
138-
139-
def handle_idekey_changed(self):
140-
value = self.idekey.text()
141-
set_setting('debugger/idekey', value)
122+
for name, widget in self.widgets.items():
123+
value = self.get_widget_value(widget)
142124

143-
def handle_break_at_first_line_changed(self, value):
144-
set_setting('debugger/break_at_first_line', value)
125+
if not has_setting(name) or get_setting(name) != value:
126+
set_setting(name, value)
127+
changed_settings.add(name)
145128

146-
def handle_max_depth_changed(self):
147-
value = self.max_depth.text()
148-
set_setting('debugger/max_depth', value)
129+
if len(changed_settings) > 0:
130+
self.settings_changed_signal.emit(changed_settings)
149131

150-
def handle_max_children_changed(self):
151-
value = self.max_children.text()
152-
set_setting('debugger/max_children', value)
132+
def reset_defaults(self):
133+
"""Resets all settings to their deafult values"""
134+
for name, widget in self.widgets.items():
135+
value = get_default_setting(name)
136+
self.set_widget_value(widget, value)
153137

154-
def handle_max_data_changed(self):
155-
value = self.max_data.text()
156-
set_setting('debugger/max_data', value)
138+
def set_widget_value(self, widget, value):
139+
"""A generic method which can set the value of any of the used widgets.
140+
"""
141+
if isinstance(widget, QLineEdit):
142+
widget.setText(value)
143+
elif isinstance(widget, QSpinBox):
144+
widget.setValue(int(value))
145+
elif isinstance(widget, QCheckBox):
146+
widget.setCheckState(value)
147+
else:
148+
name = type(widget).__name__
149+
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)

pugdebug/models/settings.py

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,16 @@
1717
class PugdebugSettings():
1818

1919
defaults = {
20-
'debugger': {
21-
'host': '127.0.0.1',
22-
'port_number': 9000,
23-
'idekey': 'pugdebug',
24-
'break_at_first_line': Qt.Checked,
25-
'max_depth': '3',
26-
'max_children': '128',
27-
'max_data': '512'
28-
},
29-
'path': {
30-
'project_root': os.path.expanduser('~'),
31-
'path_mapping': ''
32-
}
20+
'debugger/host': '127.0.0.1',
21+
'debugger/port_number': 9000,
22+
'debugger/idekey': 'pugdebug',
23+
'debugger/break_at_first_line': Qt.Checked,
24+
'debugger/max_depth': '3',
25+
'debugger/max_children': '128',
26+
'debugger/max_data': '512',
27+
28+
'path/project_root': os.path.expanduser('~'),
29+
'path/path_mapping': ''
3330
}
3431

3532
def __init__(self):
@@ -49,20 +46,17 @@ def __init__(self):
4946
self.setup_default_settings()
5047

5148
def setup_default_settings(self):
52-
"""Set up initial debugger settings"""
53-
54-
for group, settings in self.defaults.items():
55-
self.application_settings.beginGroup(group)
56-
57-
for key, value in settings.items():
58-
if not self.application_settings.contains(key):
59-
self.application_settings.setValue(key, value)
60-
61-
self.application_settings.endGroup()
49+
"""Set the default values for settings which don't have a value."""
50+
for key, value in self.defaults.items():
51+
if not self.has(key):
52+
self.set(key, value)
6253

6354
def get(self, key):
6455
return self.application_settings.value(key)
6556

57+
def get_default(self, key):
58+
return self.defaults[key] if key in self.defaults else None
59+
6660
def has(self, key):
6761
return self.application_settings.contains(key)
6862

@@ -77,6 +71,10 @@ def get_setting(key):
7771
return settings.get(key)
7872

7973

74+
def get_default_setting(key):
75+
return settings.get_default(key)
76+
77+
8078
def has_setting(key):
8179
return settings.has(key)
8280

pugdebug/pugdebug.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ def connect_settings_signals(self):
101101
102102
Connects the signal that gets fired when project root gets changed.
103103
"""
104-
self.settings.project_root.editingFinished.connect(
105-
self.handle_project_root_changed
104+
self.settings.settings_changed_signal.connect(
105+
self.handle_settings_changed
106106
)
107107

108108
def connect_document_viewer_signals(self):
@@ -334,6 +334,14 @@ def focus_current_line(self):
334334
document_widget = self.document_viewer.get_current_document()
335335
document_widget.move_to_line(current_line)
336336

337+
def handle_settings_changed(self, changed_settings):
338+
"""Handle when settings have changed.
339+
340+
Given argument is a set of settings's names which have been changed.
341+
"""
342+
if 'path/project_root' in changed_settings:
343+
self.handle_project_root_changed()
344+
337345
def handle_project_root_changed(self):
338346
"""Handle when the project root is changed
339347

0 commit comments

Comments
 (0)