Merge lp:~ralsina/ubuntuone-control-panel/minus-one-is-the-loneliest-number into lp:ubuntuone-control-panel

Proposed by Roberto Alsina
Status: Merged
Approved by: Brian Curtin
Approved revision: 326
Merged at revision: 325
Proposed branch: lp:~ralsina/ubuntuone-control-panel/minus-one-is-the-loneliest-number
Merge into: lp:ubuntuone-control-panel
Diff against target: 380 lines (+88/-144)
5 files modified
data/qt/preferences.ui (+43/-17)
data/qt/ubuntuone.qss (+7/-0)
ubuntuone/controlpanel/gui/__init__.py (+0/-2)
ubuntuone/controlpanel/gui/qt/preferences.py (+14/-50)
ubuntuone/controlpanel/gui/qt/tests/test_preferences.py (+24/-75)
To merge this branch: bzr merge lp:~ralsina/ubuntuone-control-panel/minus-one-is-the-loneliest-number
Reviewer Review Type Date Requested Status
Brian Curtin (community) Approve
Diego Sarmentero (community) Approve
Review via email: mp+105869@code.launchpad.net

Commit message

 - Improved the UX for the bandwidth settings (Fixes lp:847227).

Description of the change

* Removed the warning 'Please note that your files will not sync if you set your bandwidth to 0' which was not even true
* Enable/disable the spinboxes when you check/uncheck the matching checkbox
* Made the minimum bandwidth value 1, removing the bogus -1 and 0 (it still saves -1 to mean disabled)

 - Improved the UX for the bandwidth settings (Fixes lp:847227).

To post a comment you must log in.
Revision history for this message
Diego Sarmentero (diegosarmentero) wrote :

+1

review: Approve
Revision history for this message
Brian Curtin (brian.curtin) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'data/qt/preferences.ui'
--- data/qt/preferences.ui 2012-05-15 13:53:50 +0000
+++ data/qt/preferences.ui 2012-05-15 18:48:18 +0000
@@ -38,18 +38,21 @@
38 </item>38 </item>
39 <item row="0" column="1">39 <item row="0" column="1">
40 <widget class="QSpinBox" name="upload_speed_spinbox">40 <widget class="QSpinBox" name="upload_speed_spinbox">
41 <property name="enabled">
42 <bool>false</bool>
43 </property>
41 <property name="alignment">44 <property name="alignment">
42 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>45 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
43 </property>46 </property>
44 <property name="minimum">47 <property name="minimum">
45 <number>-1</number>48 <number>1</number>
46 </property>49 </property>
47 <property name="maximum">50 <property name="maximum">
48 <number>999999999</number>51 <number>999999999</number>
49 </property>52 </property>
50 </widget>53 </widget>
51 </item>54 </item>
52 <item row="0" column="3">55 <item row="0" column="2">
53 <spacer name="horizontalSpacer_2">56 <spacer name="horizontalSpacer_2">
54 <property name="orientation">57 <property name="orientation">
55 <enum>Qt::Horizontal</enum>58 <enum>Qt::Horizontal</enum>
@@ -71,11 +74,14 @@
71 </item>74 </item>
72 <item row="1" column="1">75 <item row="1" column="1">
73 <widget class="QSpinBox" name="download_speed_spinbox">76 <widget class="QSpinBox" name="download_speed_spinbox">
77 <property name="enabled">
78 <bool>false</bool>
79 </property>
74 <property name="alignment">80 <property name="alignment">
75 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>81 <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
76 </property>82 </property>
77 <property name="minimum">83 <property name="minimum">
78 <number>-1</number>84 <number>1</number>
79 </property>85 </property>
80 <property name="maximum">86 <property name="maximum">
81 <number>999999999</number>87 <number>999999999</number>
@@ -98,19 +104,6 @@
98 </property>104 </property>
99 </spacer>105 </spacer>
100 </item>106 </item>
101 <item row="3" column="0" colspan="3">
102 <widget class="QLabel" name="label_2">
103 <property name="text">
104 <string notr="true">Please note that your files will not sync if you set bandwidth to 0</string>
105 </property>
106 <property name="scaledContents">
107 <bool>false</bool>
108 </property>
109 <property name="wordWrap">
110 <bool>false</bool>
111 </property>
112 </widget>
113 </item>
114 </layout>107 </layout>
115 </widget>108 </widget>
116 </item>109 </item>
@@ -223,5 +216,38 @@
223 </layout>216 </layout>
224 </widget>217 </widget>
225 <resources/>218 <resources/>
226 <connections/>219 <connections>
220 <connection>
221 <sender>limit_uploads_checkbox</sender>
222 <signal>toggled(bool)</signal>
223 <receiver>upload_speed_spinbox</receiver>
224 <slot>setEnabled(bool)</slot>
225 <hints>
226 <hint type="sourcelabel">
227 <x>94</x>
228 <y>24</y>
229 </hint>
230 <hint type="destinationlabel">
231 <x>256</x>
232 <y>28</y>
233 </hint>
234 </hints>
235 </connection>
236 <connection>
237 <sender>limit_downloads_checkbox</sender>
238 <signal>toggled(bool)</signal>
239 <receiver>download_speed_spinbox</receiver>
240 <slot>setEnabled(bool)</slot>
241 <hints>
242 <hint type="sourcelabel">
243 <x>212</x>
244 <y>70</y>
245 </hint>
246 <hint type="destinationlabel">
247 <x>242</x>
248 <y>66</y>
249 </hint>
250 </hints>
251 </connection>
252 </connections>
227</ui>253</ui>
228254
=== modified file 'data/qt/ubuntuone.qss'
--- data/qt/ubuntuone.qss 2012-05-15 02:05:41 +0000
+++ data/qt/ubuntuone.qss 2012-05-15 18:48:18 +0000
@@ -338,6 +338,13 @@
338 background-color: white;338 background-color: white;
339}339}
340340
341QSpinBox:disabled {
342 padding: 3px;
343 background-color: transparent;
344 color: darkgrey;
345}
346
347
341QTreeWidget::item:selected {348QTreeWidget::item:selected {
342 background: #fcece7;349 background: #fcece7;
343 color: black;350 color: black;
344351
=== modified file 'ubuntuone/controlpanel/gui/__init__.py'
--- ubuntuone/controlpanel/gui/__init__.py 2012-05-15 13:53:50 +0000
+++ ubuntuone/controlpanel/gui/__init__.py 2012-05-15 18:48:18 +0000
@@ -224,8 +224,6 @@
224SETTINGS_ALLOW_NOTIFICATIONS = _('Allow all notifications to this device')224SETTINGS_ALLOW_NOTIFICATIONS = _('Allow all notifications to this device')
225SETTINGS_AUTO_CONNECT = _('Connect automatically when computer starts')225SETTINGS_AUTO_CONNECT = _('Connect automatically when computer starts')
226SETTINGS_BANDWIDTH = _('Bandwidth Settings')226SETTINGS_BANDWIDTH = _('Bandwidth Settings')
227SETTINGS_BANDWIDTH_ZERO_WARNING = _('Please note that your files will not '
228 'sync if you set bandwidth to 0')
229SETTINGS_BUTTON_APPLY = _('Apply these settings')227SETTINGS_BUTTON_APPLY = _('Apply these settings')
230SETTINGS_BUTTON_DEFAULT = _('Default settings')228SETTINGS_BUTTON_DEFAULT = _('Default settings')
231SETTINGS_CHANGE_ERROR = _('The settings could not be changed,\n'229SETTINGS_CHANGE_ERROR = _('The settings could not be changed,\n'
232230
=== modified file 'ubuntuone/controlpanel/gui/qt/preferences.py'
--- ubuntuone/controlpanel/gui/qt/preferences.py 2012-05-15 13:53:50 +0000
+++ ubuntuone/controlpanel/gui/qt/preferences.py 2012-05-15 18:48:18 +0000
@@ -29,7 +29,6 @@
29 SETTINGS_ALLOW_NOTIFICATIONS,29 SETTINGS_ALLOW_NOTIFICATIONS,
30 SETTINGS_AUTO_CONNECT,30 SETTINGS_AUTO_CONNECT,
31 SETTINGS_BANDWIDTH,31 SETTINGS_BANDWIDTH,
32 SETTINGS_BANDWIDTH_ZERO_WARNING,
33 SETTINGS_BUTTON_APPLY,32 SETTINGS_BUTTON_APPLY,
34 SETTINGS_BUTTON_DEFAULT,33 SETTINGS_BUTTON_DEFAULT,
35 SETTINGS_FILE_SYNC,34 SETTINGS_FILE_SYNC,
@@ -55,22 +54,6 @@
55 return CHECKED if checked else UNCHECKED54 return CHECKED if checked else UNCHECKED
5655
5756
58def tweak_speed(speed):
59 """Return the proper speed in kilobytes.
60
61 If speed < 0, return -1.
62 If speed == 0, return 1 (almost nothing, the backed won't accept 0.
63 If speed > 0, return the kilobytes presentation of that.
64
65 """
66 result = -1
67 if speed > 0:
68 result = speed * KILOBYTES
69 elif speed == 0:
70 result = 1
71 return result
72
73
74class PreferencesPanel(UbuntuOneBin):57class PreferencesPanel(UbuntuOneBin):
75 """The Preferences Tab Panel widget"""58 """The Preferences Tab Panel widget"""
7659
@@ -87,7 +70,6 @@
87 SETTINGS_KILOBITS_PER_SECOND)70 SETTINGS_KILOBITS_PER_SECOND)
88 self.ui.download_speed_spinbox.setSuffix(" " +71 self.ui.download_speed_spinbox.setSuffix(" " +
89 SETTINGS_KILOBITS_PER_SECOND)72 SETTINGS_KILOBITS_PER_SECOND)
90 self.ui.label_2.setText(SETTINGS_BANDWIDTH_ZERO_WARNING)
91 self.ui.restore_defaults_button.setText(SETTINGS_BUTTON_DEFAULT)73 self.ui.restore_defaults_button.setText(SETTINGS_BUTTON_DEFAULT)
9274
93 # pylint: disable=E020275 # pylint: disable=E0202
@@ -119,40 +101,18 @@
119 # signal handlers101 # signal handlers
120 self.ui.download_speed_spinbox.setValue(download_speed)102 self.ui.download_speed_spinbox.setValue(download_speed)
121 self.ui.upload_speed_spinbox.setValue(upload_speed)103 self.ui.upload_speed_spinbox.setValue(upload_speed)
104 if upload_speed > 0:
105 self.ui.limit_uploads_checkbox.setCheckState(CHECKED)
106 else:
107 self.ui.limit_uploads_checkbox.setCheckState(UNCHECKED)
108 if download_speed > 0:
109 self.ui.limit_downloads_checkbox.setCheckState(CHECKED)
110 else:
111 self.ui.limit_downloads_checkbox.setCheckState(UNCHECKED)
122 self.is_processing = False112 self.is_processing = False
123113
124 def process_speed_settings(self, new_value, checkbox):
125 """A new speed limit was set."""
126 if new_value < 0:
127 checkbox.setCheckState(UNCHECKED)
128 else:
129 checkbox.setCheckState(CHECKED)
130
131 # Invalid name "on_{down, up}load_speed_spinbox_valueChanged"
132 # pylint: disable=C0103114 # pylint: disable=C0103
133115
134 @QtCore.pyqtSlot(int)
135 def on_download_speed_spinbox_valueChanged(self, new_value):
136 """A new download speed was set."""
137 self.process_speed_settings(new_value,
138 self.ui.limit_downloads_checkbox)
139
140 @QtCore.pyqtSlot(int)
141 def on_upload_speed_spinbox_valueChanged(self, new_value):
142 """A new upload speed was set."""
143 self.process_speed_settings(new_value,
144 self.ui.limit_uploads_checkbox)
145
146 def on_limit_downloads_checkbox_stateChanged(self, new_state):
147 """Limit download speed checkbox changed."""
148 if new_state == UNCHECKED:
149 self.ui.download_speed_spinbox.setValue(-1)
150
151 def on_limit_uploads_checkbox_stateChanged(self, new_state):
152 """Limit upload speed checkbox changed."""
153 if new_state == UNCHECKED:
154 self.ui.upload_speed_spinbox.setValue(-1)
155
156 @QtCore.pyqtSlot()116 @QtCore.pyqtSlot()
157 @defer.inlineCallbacks117 @defer.inlineCallbacks
158 def on_apply_changes_button_clicked(self):118 def on_apply_changes_button_clicked(self):
@@ -161,8 +121,12 @@
161 notifications = self.ui.show_all_notifications_checkbox.checkState()121 notifications = self.ui.show_all_notifications_checkbox.checkState()
162 share_autosubscribe = self.ui.share_autosubscribe_checkbox.checkState()122 share_autosubscribe = self.ui.share_autosubscribe_checkbox.checkState()
163 udf_autosubscribe = self.ui.udf_autosubscribe_checkbox.checkState()123 udf_autosubscribe = self.ui.udf_autosubscribe_checkbox.checkState()
164 download_speed = tweak_speed(self.ui.download_speed_spinbox.value())124 download_speed = self.ui.download_speed_spinbox.value() * KILOBYTES
165 upload_speed = tweak_speed(self.ui.upload_speed_spinbox.value())125 if self.ui.limit_uploads_checkbox.checkState() == UNCHECKED:
126 upload_speed = -1
127 upload_speed = self.ui.upload_speed_spinbox.value() * KILOBYTES
128 if self.ui.limit_downloads_checkbox.checkState() == UNCHECKED:
129 download_speed = -1
166130
167 settings = {131 settings = {
168 backend.AUTOCONNECT_KEY: autoconnect == CHECKED,132 backend.AUTOCONNECT_KEY: autoconnect == CHECKED,
169133
=== modified file 'ubuntuone/controlpanel/gui/qt/tests/test_preferences.py'
--- ubuntuone/controlpanel/gui/qt/tests/test_preferences.py 2012-05-15 13:53:50 +0000
+++ ubuntuone/controlpanel/gui/qt/tests/test_preferences.py 2012-05-15 18:48:18 +0000
@@ -55,8 +55,8 @@
55 gui.backend.SHOW_ALL_NOTIFICATIONS_KEY: notifs == gui.CHECKED,55 gui.backend.SHOW_ALL_NOTIFICATIONS_KEY: notifs == gui.CHECKED,
56 gui.backend.SHARE_AUTOSUBSCRIBE_KEY: share_auto == gui.CHECKED,56 gui.backend.SHARE_AUTOSUBSCRIBE_KEY: share_auto == gui.CHECKED,
57 gui.backend.UDF_AUTOSUBSCRIBE_KEY: udf_auto == gui.CHECKED,57 gui.backend.UDF_AUTOSUBSCRIBE_KEY: udf_auto == gui.CHECKED,
58 gui.backend.DOWNLOAD_KEY: gui.tweak_speed(download_speed),58 gui.backend.DOWNLOAD_KEY: download_speed * gui.KILOBYTES,
59 gui.backend.UPLOAD_KEY: gui.tweak_speed(upload_speed),59 gui.backend.UPLOAD_KEY: upload_speed * gui.KILOBYTES,
60 }60 }
61 return result61 return result
6262
@@ -120,18 +120,20 @@
120 speed = settings[gui.backend.DOWNLOAD_KEY]120 speed = settings[gui.backend.DOWNLOAD_KEY]
121 if speed > 0:121 if speed > 0:
122 speed = settings[gui.backend.DOWNLOAD_KEY] // gui.KILOBYTES122 speed = settings[gui.backend.DOWNLOAD_KEY] // gui.KILOBYTES
123 download_speed = self.ui.ui.download_speed_spinbox.value()123 download_speed = self.ui.ui.download_speed_spinbox.value()
124 self.assertEqual(speed, download_speed)124 self.assertEqual(speed, download_speed)
125 limit_downloads = self.ui.ui.limit_downloads_checkbox.checkState()125 limit_downloads = self.ui.ui.limit_downloads_checkbox.checkState()
126 self.assertEqual(speed > 0, limit_downloads == gui.CHECKED)126 self.assertEqual(self.ui.ui.download_speed_spinbox.isEnabled(),
127 limit_downloads == gui.CHECKED)
127128
128 speed = settings[gui.backend.UPLOAD_KEY]129 speed = settings[gui.backend.UPLOAD_KEY]
129 if speed > 0:130 if speed > 0:
130 speed = settings[gui.backend.UPLOAD_KEY] // gui.KILOBYTES131 speed = settings[gui.backend.UPLOAD_KEY] // gui.KILOBYTES
131 upload_speed = self.ui.ui.upload_speed_spinbox.value()132 upload_speed = self.ui.ui.upload_speed_spinbox.value()
132 self.assertEqual(speed, upload_speed)133 self.assertEqual(speed, upload_speed)
133 limit_uploads = self.ui.ui.limit_uploads_checkbox.checkState()134 limit_uploads = self.ui.ui.limit_uploads_checkbox.checkState()
134 self.assertEqual(speed > 0, limit_uploads == gui.CHECKED)135 self.assertEqual(self.ui.ui.upload_speed_spinbox.isEnabled(),
136 limit_uploads == gui.CHECKED)
135137
136 def test_update_ui_from_backed_info(self):138 def test_update_ui_from_backed_info(self):
137 """The ui is correctly updated when the backend info is received."""139 """The ui is correctly updated when the backend info is received."""
@@ -153,63 +155,22 @@
153 self.ui.process_info(settings)155 self.ui.process_info(settings)
154 self._test_update_ui_from_settings_info(settings)156 self._test_update_ui_from_settings_info(settings)
155157
156 def _test_speed_checkbox_value_changed_to_positive(self, speed_spinbox,158 def _test_speed_checkbox_toggled(self, speed_spinbox, limit_checkbox):
157 limit_checkbox):159 """The checkbox is checked if and only if the spinbox is enabled."""
158 """When the speed is set to a positive value, enable the checkbox."""
159 limit_checkbox.setCheckState(gui.UNCHECKED)
160 speed_spinbox.setValue(33)
161
162 self.assertEqual(gui.CHECKED, limit_checkbox.checkState())
163
164 def _test_speed_checkbox_value_changed_to_negative(self, speed_spinbox,
165 limit_checkbox):
166 """When the speed is set to a negative value, disable the checkbox."""
167 limit_checkbox.setCheckState(gui.UNCHECKED)
168 speed_spinbox.setValue(-1)
169
170 self.assertEqual(gui.UNCHECKED, limit_checkbox.checkState())
171
172 def _test_speed_checkbox_unchecked(self, speed_spinbox, limit_checkbox):
173 """When the speed checkbox is unchecked, reset speed to -1."""
174 limit_checkbox.setCheckState(gui.CHECKED)160 limit_checkbox.setCheckState(gui.CHECKED)
175 speed_spinbox.setValue(33)161 self.assertTrue(speed_spinbox.isEnabled())
176 limit_checkbox.setCheckState(gui.UNCHECKED)162 limit_checkbox.setCheckState(gui.UNCHECKED)
177163 self.assertFalse(speed_spinbox.isEnabled())
178 self.assertEqual(-1, speed_spinbox.value())164
179165 def test_download_speed_checkbox_connections(self):
180 def test_download_speed_checkbox_value_changed_to_positive(self):166 """Check connections for download_speed_checkbox."""
181 """When the download speed is set, enable the checkbox."""167 self._test_speed_checkbox_toggled(
182 self._test_speed_checkbox_value_changed_to_positive(168 self.ui.ui.download_speed_spinbox,
183 self.ui.ui.download_speed_spinbox,169 self.ui.ui.limit_downloads_checkbox)
184 self.ui.ui.limit_downloads_checkbox)170
185171 def test_upload_speed_checkbox_connections(self):
186 def test_download_speed_checkbox_value_changed_to_negative(self):172 """Check connections for upload_speed_checkbox."""
187 """When the download speed is set, enable the checkbox."""173 self._test_speed_checkbox_toggled(
188 self._test_speed_checkbox_value_changed_to_negative(
189 self.ui.ui.download_speed_spinbox,
190 self.ui.ui.limit_downloads_checkbox)
191
192 def test_download_speed_checkbox_unchecked(self):
193 """Reset the speed to -1 when the checkbox is disabled."""
194 self._test_speed_checkbox_unchecked(
195 self.ui.ui.download_speed_spinbox,
196 self.ui.ui.limit_downloads_checkbox)
197
198 def test_upload_speed_checkbox_value_changed_to_positive(self):
199 """When the upload speed is set, enable the checkbox."""
200 self._test_speed_checkbox_value_changed_to_positive(
201 self.ui.ui.upload_speed_spinbox,
202 self.ui.ui.limit_uploads_checkbox)
203
204 def test_upload_speed_checkbox_value_changed_to_negative(self):
205 """When the upload speed is set, enable the checkbox."""
206 self._test_speed_checkbox_value_changed_to_negative(
207 self.ui.ui.upload_speed_spinbox,
208 self.ui.ui.limit_uploads_checkbox)
209
210 def test_upload_speed_checkbox_unchecked(self):
211 """Reset the speed to -1 when the checkbox is disabled."""
212 self._test_speed_checkbox_unchecked(
213 self.ui.ui.upload_speed_spinbox,174 self.ui.ui.upload_speed_spinbox,
214 self.ui.ui.limit_uploads_checkbox)175 self.ui.ui.limit_uploads_checkbox)
215176
@@ -288,18 +249,6 @@
288249
289 yield self.ui.ui.restore_defaults_button.click()250 yield self.ui.ui.restore_defaults_button.click()
290251
291 def test_tweak_speed_negative(self):
292 """Tweak speed properly: if param is negative, return -1."""
293 self.assertEqual(-1, gui.tweak_speed(-5))
294
295 def test_tweak_speed_zero(self):
296 """Tweak speed properly: if param is zero, return 1."""
297 self.assertEqual(1, gui.tweak_speed(0))
298
299 def test_tweak_speed_positive(self):
300 """Tweak speed properly: if param is positive, return kilobytes."""
301 self.assertEqual(123456 * gui.KILOBYTES, gui.tweak_speed(123456))
302
303 def test_resize_event(self):252 def test_resize_event(self):
304 """Check that the QCheckBox widgets receive the proper texts."""253 """Check that the QCheckBox widgets receive the proper texts."""
305 wrap_calls = {}254 wrap_calls = {}

Subscribers

People subscribed via source and target branches