|
10 | 10 | __author__ = "robertbasic" |
11 | 11 |
|
12 | 12 | from PyQt5.QtWidgets import (QDialog, QLineEdit, QFormLayout, |
13 | | - QSpinBox, QCheckBox) |
| 13 | + QSpinBox, QCheckBox, QPushButton, |
| 14 | + QVBoxLayout, QHBoxLayout, QGroupBox) |
14 | 15 |
|
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) |
16 | 20 |
|
17 | 21 |
|
18 | 22 | class PugdebugSettingsWindow(QDialog): |
19 | 23 |
|
20 | | - layout = QFormLayout() |
| 24 | + settings_changed_signal = pyqtSignal(set) |
21 | 25 |
|
22 | 26 | def __init__(self, parent): |
23 | 27 | super(PugdebugSettingsWindow, self).__init__(parent) |
24 | 28 |
|
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() |
108 | 97 |
|
109 | 98 | 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) |
111 | 101 |
|
112 | 102 | 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) |
114 | 105 |
|
115 | 106 | if len(path_map) > 0: |
116 | 107 | return path_map |
117 | 108 |
|
118 | 109 | return False |
119 | 110 |
|
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) |
131 | 117 |
|
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() |
134 | 121 |
|
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) |
142 | 124 |
|
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) |
145 | 128 |
|
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) |
149 | 131 |
|
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) |
153 | 137 |
|
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) |
0 commit comments