Merge lp:~ralsina/ubuntuone-control-panel/alerted into lp:ubuntuone-control-panel

Proposed by Roberto Alsina on 2012-03-06
Status: Merged
Approved by: Natalia Bidart on 2012-03-09
Approved revision: 288
Merged at revision: 278
Proposed branch: lp:~ralsina/ubuntuone-control-panel/alerted
Merge into: lp:ubuntuone-control-panel
Diff against target: 234 lines (+117/-13)
5 files modified
docs/ubuntuone-control-panel-qt.1 (+1/-4)
ubuntuone/controlpanel/gui/qt/gui.py (+32/-1)
ubuntuone/controlpanel/gui/qt/main/__init__.py (+3/-7)
ubuntuone/controlpanel/gui/qt/main/tests/test_main.py (+24/-1)
ubuntuone/controlpanel/gui/qt/tests/test_gui.py (+57/-0)
To merge this branch: bzr merge lp:~ralsina/ubuntuone-control-panel/alerted
Reviewer Review Type Date Requested Status
Natalia Bidart 2012-03-06 Approve on 2012-03-09
Eric Casteleijn (community) Approve on 2012-03-07
Review via email: mp+96253@code.launchpad.net

Commit Message

- Fixed --alert and --switch-to tabname and updated --help and manpage accordingly
  (LP: #940465).

Description of the Change

* Implemented --alert option: Starts with the "urgent" flag set on launcher.
* Remove the "urgent" flag when u1cp gets focus.
* Implemented --switch-to tabname
* Fixed --help
* Updated manpage

To post a comment you must log in.
284. By Roberto Alsina on 2012-03-07

merged trunk

Eric Casteleijn (thisfred) wrote :

Looks great!

review: Approve
Natalia Bidart (nataliabidart) wrote :

Question, why would you patch self.patch(self.ui, "focusInEvent", lambda ev: False) in the set_urgent test?

Also, can we change this code:

        self.ui.switch_to("devices")
        self.assertEqual(
            self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
            2)

to use something like:

        self.ui.switch_to("devices")
        self.assertEqual(
            self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
            self.ui.ui.control_panel.ui.tab_widget.indexOf(self.ui.ui.control_panel.ui.devices))

which in turn allows us to do something like:

        for tab_name in self.ui.tabs:
            tab = getattr(self.ui.ui.control_panel.ui, tab_name)
            self.ui.switch_to(tab_name)
            self.assertEqual(
                self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
                self.ui.ui.control_panel.ui.tab_widget.indexOf(tab))

What do you think?

review: Needs Information
Roberto Alsina (ralsina) wrote :

> Question, why would you patch self.patch(self.ui, "focusInEvent", lambda ev:
> False) in the set_urgent test?

Doesn't seem necessary anymore. In a previous version of this, when you create the window, that widget got focus and focusInEvent removed the urgent flag. Will remove.

> Also, can we change this code:
>
> self.ui.switch_to("devices")
> self.assertEqual(
> self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
> 2)
>
> to use something like:
>
> self.ui.switch_to("devices")
> self.assertEqual(
> self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
> self.ui.ui.control_panel.ui.tab_widget.indexOf(self.ui.ui.control_
> panel.ui.devices))
>
> which in turn allows us to do something like:
>
> for tab_name in self.ui.tabs:
> tab = getattr(self.ui.ui.control_panel.ui, tab_name)
> self.ui.switch_to(tab_name)
> self.assertEqual(
> self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
> self.ui.ui.control_panel.ui.tab_widget.indexOf(tab))
>
> What do you think?

It's a bit verbose, and it has a problem in that we don't want to test the tab switching in order, but something similar is doable.

285. By Roberto Alsina on 2012-03-07

use widget indexes instead of magic numbers

Natalia Bidart (nataliabidart) wrote :

Can you please remove this debug line?

        print "CALLED:", args, kwargs

Also, after the IRC talk about the --alert not working, can you please remove that altogether? Thanks!

review: Needs Fixing
dobey (dobey) wrote :

We should drop --alert, but keep the unsetting of urgency on focusInEvent.

286. By Roberto Alsina on 2012-03-08

kill --alert since it's not all that useful.

287. By Roberto Alsina on 2012-03-08

remove debug print

Roberto Alsina (ralsina) wrote :

> We should drop --alert, but keep the unsetting of urgency on focusInEvent.

Done!

288. By Roberto Alsina on 2012-03-09

fix docstring

Natalia Bidart (nataliabidart) wrote :

Looks good

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'docs/ubuntuone-control-panel-qt.1'
2--- docs/ubuntuone-control-panel-qt.1 2012-03-07 14:24:40 +0000
3+++ docs/ubuntuone-control-panel-qt.1 2012-03-09 01:08:17 +0000
4@@ -12,10 +12,7 @@
5 .TP
6 \fB\-\-switch\-to\fR PANEL_NAME
7 Start Ubuntu One in the PANEL_NAME tab. Possible
8-values are: dashboard, volumes, devices, applications
9-.TP
10-\fB\-a\fR, \fB\-\-alert\fR
11-Start Ubuntu One alerting the user to its presence.
12+values are: folders, devices, settings, account
13 .TP
14 \fB\-\-minimized\fR
15 Start Ubuntu One only in the notification area, with
16
17=== modified file 'ubuntuone/controlpanel/gui/qt/gui.py'
18--- ubuntuone/controlpanel/gui/qt/gui.py 2012-02-29 21:33:02 +0000
19+++ ubuntuone/controlpanel/gui/qt/gui.py 2012-03-09 01:08:17 +0000
20@@ -21,6 +21,16 @@
21 from ubuntuone.controlpanel.gui.qt.systray import TrayIcon
22 from ubuntuone.controlpanel.gui.qt.ui import mainwindow_ui
23
24+# pylint: disable=E0611
25+try:
26+ from gi.repository import Unity
27+ USE_LIBUNITY = True
28+except ImportError:
29+ USE_LIBUNITY = False
30+# pylint: enable=E0611
31+
32+U1_DOTDESKTOP = "ubuntuone-installer.desktop"
33+
34
35 class MainWindow(QtGui.QMainWindow):
36 """The Main Window of the Control Panel."""
37@@ -36,12 +46,23 @@
38 triggered=self.close)
39 self.quit_action.setShortcuts(["Ctrl+q", "Ctrl+w"])
40 self.addAction(self.quit_action)
41+ if USE_LIBUNITY:
42+ self.entry = Unity.LauncherEntry.get_for_desktop_id(U1_DOTDESKTOP)
43+ else:
44+ self.entry = None
45
46 def _setup(self):
47 """Do some extra setupping for the UI."""
48 self.ui.control_panel.finished.connect(self.close)
49
50- # Invalid name "closeEvent"
51+ def switch_to(self, tabname="folders"):
52+ """Switch control panel to the required tab."""
53+ tabnames = ["folders", "devices", "settings", "account"]
54+ if tabname in tabnames:
55+ self.ui.control_panel.ui.tab_widget.setCurrentIndex(
56+ tabnames.index(tabname))
57+
58+ # Invalid names "closeEvent" "focusInEvent"
59 # pylint: disable=C0103
60
61 def closeEvent(self, event):
62@@ -50,6 +71,16 @@
63 self.close_callback()
64 event.accept()
65
66+ def set_urgent(self, value):
67+ """Set the urgent attribute in the launcher to value."""
68+ if self.entry:
69+ self.entry.set_property('urgent', value)
70+
71+ def focusInEvent(self, event):
72+ """The main window got focus, remove urgent bit."""
73+ self.set_urgent(False)
74+ return super(MainWindow, self).focusInEvent(event)
75+
76 # pylint: enable=C0103
77
78
79
80=== modified file 'ubuntuone/controlpanel/gui/qt/main/__init__.py'
81--- ubuntuone/controlpanel/gui/qt/main/__init__.py 2012-02-28 14:39:43 +0000
82+++ ubuntuone/controlpanel/gui/qt/main/__init__.py 2012-03-09 01:08:17 +0000
83@@ -45,11 +45,7 @@
84 metavar="PANEL_NAME", default="",
85 help="Start Ubuntu One in the "
86 "PANEL_NAME tab. Possible values are: "
87- "dashboard, volumes, devices, applications")
88- result.add_argument("-a", "--alert", dest="alert", action="store_true",
89- default=False,
90- help="Start Ubuntu One "
91- "alerting the user to its presence.")
92+ "folders, devices, settings, account")
93 result.add_argument("--minimized", dest="minimized", action="store_true",
94 default=False,
95 help="Start Ubuntu One "
96@@ -72,8 +68,7 @@
97 parser = parser_options()
98 # Use only the arguments that are not recognized by Qt
99 args = parser.parse_args(args=[unicode(x) for x in app.arguments()[1:]])
100- _ = args.switch_to
101- _ = args.alert
102+ switch_to = args.switch_to
103 minimized = args.minimized
104 with_icon = args.with_icon
105 source.main(app)
106@@ -84,6 +79,7 @@
107 # Unused variable 'window', 'icon', pylint: disable=W0612
108 icon, window = start(lambda: source.main_quit(app),
109 minimized=minimized, with_icon=with_icon)
110+ window.switch_to(switch_to)
111 # pylint: enable=W0612
112 if icon:
113 app.new_instance.connect(icon.restore_window)
114
115=== modified file 'ubuntuone/controlpanel/gui/qt/main/tests/test_main.py'
116--- ubuntuone/controlpanel/gui/qt/main/tests/test_main.py 2012-02-24 18:16:50 +0000
117+++ ubuntuone/controlpanel/gui/qt/main/tests/test_main.py 2012-03-09 01:08:17 +0000
118@@ -52,16 +52,34 @@
119 pass
120
121
122+class FakeMainWindow(object):
123+
124+ """A fake MainWindow."""
125+
126+ tabname = None
127+ urgent = None
128+
129+ def switch_to(self, tabname):
130+ """Fake switch_to."""
131+ self.tabname = tabname
132+
133+ def set_urgent(self, value):
134+ """Fake set_urgent."""
135+ self.urgent = value
136+
137+
138 class FakeStart(object):
139
140 """Fake start function."""
141
142 def __init__(self):
143 self.args = None
144+ self.window = None
145
146 def __call__(self, *args, **kwargs):
147 self.args = (args, kwargs)
148- return None, None
149+ self.window = FakeMainWindow()
150+ return None, self.window
151
152
153 class MainTestCase(TestCase):
154@@ -103,3 +121,8 @@
155 """Ensure the stylesheet is loaded."""
156 main.main([])
157 self.assertTrue(self.app.style)
158+
159+ def test_switch_to_option(self):
160+ """Ensure the --switch-to option is parsed and passed correctly."""
161+ main.main(["foobar", "--switch-to", "folders"])
162+ self.assertEqual(self.start.window.tabname, "folders")
163
164=== modified file 'ubuntuone/controlpanel/gui/qt/tests/test_gui.py'
165--- ubuntuone/controlpanel/gui/qt/tests/test_gui.py 2012-03-02 16:56:10 +0000
166+++ ubuntuone/controlpanel/gui/qt/tests/test_gui.py 2012-03-09 01:08:17 +0000
167@@ -22,6 +22,17 @@
168 from ubuntuone.controlpanel.gui.qt.tests import BaseTestCase
169
170
171+class FakeEntry(object):
172+
173+ """A fake unity launcher entry."""
174+
175+ called = None
176+
177+ def set_property(self, *args, **kwargs):
178+ """Fake set_property."""
179+ self.called = (args, kwargs)
180+
181+
182 class MainWindowTestCase(BaseTestCase):
183 """Test the qt main window."""
184
185@@ -58,3 +69,49 @@
186 self.assertFalse(self.ui.isVisible())
187 self.assertEqual(self._called,
188 ((), {}), 'close_callback called.')
189+
190+ def test_switch_to(self):
191+ """Check that switch_to changes the current tab"""
192+ self.assertEqual(
193+ self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
194+ self.ui.ui.control_panel.ui.tab_widget.indexOf(
195+ self.ui.ui.control_panel.ui.folders_tab))
196+ self.ui.switch_to("foobar")
197+ self.assertEqual(
198+ self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
199+ self.ui.ui.control_panel.ui.tab_widget.indexOf(
200+ self.ui.ui.control_panel.ui.folders_tab))
201+ self.ui.switch_to("devices")
202+ self.assertEqual(
203+ self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
204+ self.ui.ui.control_panel.ui.tab_widget.indexOf(
205+ self.ui.ui.control_panel.ui.devices_tab))
206+ self.ui.switch_to("settings")
207+ self.assertEqual(
208+ self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
209+ self.ui.ui.control_panel.ui.tab_widget.indexOf(
210+ self.ui.ui.control_panel.ui.preferences_tab))
211+ self.ui.switch_to("account")
212+ self.assertEqual(
213+ self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
214+ self.ui.ui.control_panel.ui.tab_widget.indexOf(
215+ self.ui.ui.control_panel.ui.account_tab))
216+ self.ui.switch_to("folders")
217+ self.assertEqual(
218+ self.ui.ui.control_panel.ui.tab_widget.currentIndex(),
219+ self.ui.ui.control_panel.ui.tab_widget.indexOf(
220+ self.ui.ui.control_panel.ui.folders_tab))
221+
222+ def test_focus_in(self):
223+ """Test that focusing removes urgent bit from launcher entry."""
224+ entry = FakeEntry()
225+ self.patch(self.ui, "entry", entry)
226+ self.ui.focusInEvent(None)
227+ self.assertEqual(entry.called, (('urgent', False), {}))
228+
229+ def test_set_urgent(self):
230+ """Test that set_urgent calls with the right arguments."""
231+ entry = FakeEntry()
232+ self.patch(self.ui, "entry", entry)
233+ self.ui.set_urgent("foo")
234+ self.assertEqual(entry.called, (('urgent', "foo"), {}))

Subscribers

People subscribed via source and target branches