Merge lp:~nataliabidart/magicicada-gui/multiple-prettier-metadata into lp:magicicada-gui

Proposed by Natalia Bidart
Status: Merged
Approved by: Facundo Batista
Approved revision: 54
Merged at revision: 52
Proposed branch: lp:~nataliabidart/magicicada-gui/multiple-prettier-metadata
Merge into: lp:magicicada-gui
Diff against target: 327 lines (+88/-107)
3 files modified
data/ui/gui.glade (+1/-66)
magicicada/__init__.py (+43/-4)
magicicada/tests/test_magicicada.py (+44/-37)
To merge this branch: bzr merge lp:~nataliabidart/magicicada-gui/multiple-prettier-metadata
Reviewer Review Type Date Requested Status
Facundo Batista Approve
Review via email: mp+28561@code.launchpad.net

Description of the change

Prettier metadata. Also, file chooser defaults to ~/Ubuntu One/.
Code internally changed so multiple metadata windows are supported, but that support will come on another branch.

To post a comment you must log in.
Revision history for this message
Facundo Batista (facundo) wrote :

I like it!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/ui/gui.glade'
2--- data/ui/gui.glade 2010-06-14 01:14:18 +0000
3+++ data/ui/gui.glade 2010-06-26 14:17:28 +0000
4@@ -1052,76 +1052,11 @@
5 <action-widget response="0">shares_to_others_close</action-widget>
6 </action-widgets>
7 </object>
8- <object class="GtkDialog" id="raw_metadata_dialog">
9- <property name="width_request">600</property>
10- <property name="height_request">300</property>
11- <property name="border_width">5</property>
12- <property name="title" translatable="yes">Raw metadata</property>
13- <property name="window_position">center</property>
14- <property name="type_hint">normal</property>
15- <property name="has_separator">False</property>
16- <signal name="close" handler="on_raw_metadata_close_clicked"/>
17- <child internal-child="vbox">
18- <object class="GtkVBox" id="dialog-vbox9">
19- <property name="visible">True</property>
20- <property name="spacing">2</property>
21- <child>
22- <object class="GtkTextView" id="raw_metadata_view">
23- <property name="visible">True</property>
24- <property name="can_focus">True</property>
25- <property name="editable">False</property>
26- <property name="wrap_mode">word</property>
27- </object>
28- <packing>
29- <property name="position">1</property>
30- </packing>
31- </child>
32- <child>
33- <object class="GtkImage" id="raw_metadata_image">
34- <property name="visible">True</property>
35- <property name="stock">gtk-missing-image</property>
36- </object>
37- <packing>
38- <property name="position">2</property>
39- </packing>
40- </child>
41- <child internal-child="action_area">
42- <object class="GtkHButtonBox" id="dialog-action_area9">
43- <property name="visible">True</property>
44- <property name="layout_style">end</property>
45- <child>
46- <object class="GtkButton" id="raw_metadata_close">
47- <property name="label">gtk-close</property>
48- <property name="visible">True</property>
49- <property name="can_focus">True</property>
50- <property name="receives_default">True</property>
51- <property name="use_stock">True</property>
52- <signal name="clicked" handler="on_raw_metadata_close_clicked"/>
53- <signal name="activate" handler="on_raw_metadata_close_clicked"/>
54- </object>
55- <packing>
56- <property name="expand">False</property>
57- <property name="fill">False</property>
58- <property name="position">0</property>
59- </packing>
60- </child>
61- </object>
62- <packing>
63- <property name="expand">False</property>
64- <property name="pack_type">end</property>
65- <property name="position">0</property>
66- </packing>
67- </child>
68- </object>
69- </child>
70- <action-widgets>
71- <action-widget response="0">raw_metadata_close</action-widget>
72- </action-widgets>
73- </object>
74 <object class="GtkFileChooserDialog" id="file_chooser">
75 <property name="border_width">5</property>
76 <property name="type_hint">normal</property>
77 <property name="has_separator">False</property>
78+ <property name="create_folders">False</property>
79 <signal name="file_activated" handler="on_file_chooser_open_clicked"/>
80 <child internal-child="vbox">
81 <object class="GtkVBox" id="dialog-vbox7">
82
83=== modified file 'magicicada/__init__.py'
84--- magicicada/__init__.py 2010-06-21 17:10:41 +0000
85+++ magicicada/__init__.py 2010-06-26 14:17:28 +0000
86@@ -19,13 +19,15 @@
87 """Magicicada."""
88
89 import logging
90-import gtk
91+import os
92 import sys
93
94 import gettext
95 from gettext import gettext as _
96 gettext.textdomain('magicicada')
97
98+import gtk
99+
100 # optional Launchpad integration
101 # this shouldn't crash if not found as it is simply used for bug reporting
102 try:
103@@ -43,10 +45,14 @@
104
105 CONTENT_QUEUE = 'content'
106 META_QUEUE = 'meta'
107+UBUNTU_ONE_ROOT = os.path.expanduser('~/Ubuntu One')
108
109 # set up the logging for all the project
110 logger_helper.set_up()
111 logger = logging.getLogger('magicicada.ui')
112+console = logging.StreamHandler()
113+console.setLevel(logging.DEBUG)
114+#logger.addHandler(console)
115
116
117 class MagicicadaUI(object):
118@@ -87,8 +93,7 @@
119 'shares_to_me_store', 'shares_to_me_close',
120 'shares_to_others', 'shares_to_others_dialog', # shares_to_others
121 'shares_to_others_store', 'shares_to_others_close',
122- 'raw_metadata', 'raw_metadata_dialog', # raw metadata
123- 'raw_metadata_close', 'raw_metadata_view', 'raw_metadata_image',
124+ 'raw_metadata', # raw metadata
125 'is_started', 'is_connected', 'is_online', # status bar images
126 'status_label', 'status_icon', # status label and systray icon
127 'metaq_view', 'contentq_view', # queues tree views
128@@ -102,6 +107,7 @@
129 setattr(self, widget, obj)
130 assert obj is not None, '%s must not be None' % widget
131
132+ self.raw_metadata_dialog = self._new_metadata_dialog()
133 self.volumes = (self.folders, self.shares_to_me, self.shares_to_others)
134 self.windows = (self.main_window, self.about_dialog,
135 self.folders_dialog)
136@@ -130,9 +136,39 @@
137 self.widget_is_visible = lambda w: w.get_property('visible')
138 self.widget_enabled = lambda w: self.widget_is_visible(w) and \
139 w.is_sensitive()
140+ self.file_chooser.set_current_folder(UBUNTU_ONE_ROOT)
141 self.last_metadata_path = None
142 self.update()
143
144+ def _new_metadata_dialog(self):
145+ """Return a new metadata dialog."""
146+ dialog = gtk.Dialog(title='Raw metadata', parent=self.main_window,
147+ flags=gtk.DIALOG_NO_SEPARATOR,
148+ buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
149+ dialog.set_size_request(600, 300)
150+ dialog.set_position(gtk.WIN_POS_CENTER)
151+ setattr(self, 'raw_metadata_dialog', dialog)
152+
153+ close_button = dialog.action_area.get_children()[-1]
154+ close_button.connect('clicked', self.on_raw_metadata_close_clicked)
155+ close_button.connect('activate', self.on_raw_metadata_close_clicked)
156+ setattr(self, 'raw_metadata_close', close_button)
157+
158+ image = gtk.Image()
159+ image.set_from_animation(self.loading_animation)
160+ setattr(self, 'raw_metadata_image', image)
161+
162+ dialog.get_child().add(image)
163+
164+ text_view = gtk.TextView()
165+ text_view.set_editable(False)
166+ text_view.set_wrap_mode(gtk.WRAP_WORD)
167+ dialog.get_child().add(text_view)
168+ setattr(self, 'raw_metadata_view', text_view)
169+
170+ dialog.hide() # XXX to be fixed later
171+ return dialog
172+
173 # GTK callbacks
174
175 def on_main_window_destroy(self, widget, data=None):
176@@ -374,11 +410,14 @@
177 @log(logger)
178 def on_metadata_ready(self, path, metadata):
179 """Lower layer has the requested metadata for 'path'."""
180+ logger.debug('on_metadata_ready: path: %r, last_metadata_path: %r',
181+ path, self.last_metadata_path)
182 if path != self.last_metadata_path:
183 return
184 self.raw_metadata_image.hide()
185 self.raw_metadata_view.show()
186- self.raw_metadata_view.get_buffer().set_text(str(metadata))
187+ text = '\n'.join('%s: %s' % i for i in metadata.iteritems())
188+ self.raw_metadata_view.get_buffer().set_text(text)
189
190 # custom
191
192
193=== modified file 'magicicada/tests/test_magicicada.py'
194--- magicicada/tests/test_magicicada.py 2010-06-21 17:10:41 +0000
195+++ magicicada/tests/test_magicicada.py 2010-06-26 14:17:28 +0000
196@@ -29,7 +29,8 @@
197
198 from twisted.trial.unittest import TestCase
199
200-from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon
201+from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, \
202+ UBUNTU_ONE_ROOT, syncdaemon
203 from magicicada.dbusiface import QueueData, FolderData, ShareData
204 from magicicada.helpers import NO_OP, humanize_bytes, get_data_file
205 from magicicada.tests.helpers import MementoHandler
206@@ -193,6 +194,30 @@
207 self.assertTrue(sensitive if enabled else not sensitive,
208 msg % (widget_name, '' if enabled else 'not '))
209
210+ def assert_dialog_properties(self, dialog_name, title, size=(600, 300),
211+ modal=True):
212+ """The dialog 'dialog_name' has correct properties."""
213+ dialog = getattr(self.ui, dialog_name)
214+ actual = dialog.size_request()
215+ msg = 'size must be %s (got %s instead).'
216+ self.assertEquals(size, actual, msg % (size, actual))
217+
218+ msg = '%s must %sbe modal.'
219+ self.assertEqual(modal, dialog.get_modal(),
220+ msg % (dialog_name, '' if modal else 'not '))
221+
222+ position = dialog.get_property('window-position')
223+ self.assertEqual(gtk.WIN_POS_CENTER, position,
224+ '%s must be centered.' % dialog_name)
225+
226+ actual = dialog.get_title()
227+ msg = '%s title must be %s (got %s instead)'
228+ self.assertEqual(title, actual, msg % (dialog_name, title, actual))
229+
230+ msg = '%s must have main_window as parent.'
231+ #self.assertTrue(dialog.parent is self.ui.main_window,
232+ # msg % dialog_name)
233+
234
235 class MagicicadaUIBasicTestCase(MagicicadaUITestCase):
236 """UI test cases for basic state."""
237@@ -926,21 +951,9 @@
238 @skip_abstract_class
239 def test_volume_dialog_properties(self):
240 """The volume dialog has correct properties."""
241- size = self.volume_dialog.size_request()
242- self.assertEquals((600, 300), size)
243-
244- self.assertTrue(self.volume_dialog.get_modal(),
245- '%s must be modal.' % self.volume_dialog_name)
246-
247- position = self.volume_dialog.get_property('window-position')
248- self.assertEqual(gtk.WIN_POS_CENTER, position,
249- '%s must be centered.' % self.volume_dialog_name)
250-
251- actual = self.volume_dialog.get_title()
252- expected = self.name.replace('_', ' ').capitalize()
253- msg = '%s title must be %s (got %s instead)'
254- self.assertEqual(expected, actual,
255- msg % (self.volume_dialog_name, expected, actual))
256+ title = self.name.replace('_', ' ').capitalize()
257+ self.assert_dialog_properties(dialog_name=self.volume_dialog_name,
258+ title=title)
259
260
261 class MagicicadaUIFoldersTestCase(_MagicicadaUIVolumeTestCase):
262@@ -1116,21 +1129,9 @@
263
264 def test_raw_metadata_dialog_properties(self):
265 """The raw_metadata dialog has correct properties."""
266- dialog = 'raw_metadata_dialog'
267- size = self.ui.raw_metadata_dialog.size_request()
268- self.assertEquals((600, 300), size)
269-
270- self.assertFalse(self.ui.raw_metadata_dialog.get_modal(),
271- '%s must not be modal.' % dialog)
272-
273- position = self.ui.raw_metadata_dialog.get_property('window-position')
274- self.assertEqual(gtk.WIN_POS_CENTER, position,
275- '%s must be centered.' % dialog)
276-
277- actual = self.ui.raw_metadata_dialog.get_title()
278- expected = self.name.replace('_', ' ').capitalize()
279- msg = '%s title must be %s (got %s instead)'
280- self.assertEqual(expected, actual, msg % (dialog, expected, actual))
281+ title = self.name.replace('_', ' ').capitalize()
282+ self.assert_dialog_properties(dialog_name='raw_metadata_dialog',
283+ title=title, modal=False)
284
285 actual = self.ui.raw_metadata_view.get_wrap_mode()
286 msg = 'wrap mode for view must be gtk.WRAP_WORD (got %s instead).'
287@@ -1147,6 +1148,14 @@
288 self.assertFalse(self.ui.widget_is_visible(self.ui.file_chooser),
289 'file_chooser must be hidden by default.')
290
291+ def test_file_chooser_current_folder_is_ubuntu_one_root(self):
292+ """File chooser default folder is ~/Ubuntu One."""
293+ process_gtk_pendings() # WOW! Needed to get proper value below
294+ actual = self.ui.file_chooser.get_current_folder()
295+ msg = 'file_chooser default folder must be %s (got %s instead).'
296+ self.assertEqual(actual, UBUNTU_ONE_ROOT,
297+ msg % (UBUNTU_ONE_ROOT, actual))
298+
299 def test_filename_is_used_only_if_open_clicked(self):
300 """Filename is used only if user clicked open."""
301 self.patch(self.ui.sd, 'get_metadata', self.set_called)
302@@ -1178,10 +1187,12 @@
303 buff = self.ui.raw_metadata_view.get_buffer()
304 self.assertTrue(buff is not None,
305 'buffer for raw_metadata_view must not be None.')
306+
307+ expected = '\n'.join('%s: %s' % i for i in self.metadata.iteritems())
308 actual = buff.get_text(*buff.get_bounds())
309 msg = 'buffer content must be %s (got %s instead).'
310- self.assertEqual(actual, str(self.metadata),
311- msg % (self.metadata, actual))
312+ self.assertEqual(actual, expected,
313+ msg % (expected, actual))
314
315 def test_on_metadata_ready_doesnt_update_if_last_path_doesnt_match(self):
316 """Callback on_metadata_ready updates the raw_metadata_view."""
317@@ -1224,10 +1235,6 @@
318 logger = logging.getLogger('magicicada.ui')
319 logger.addHandler(self.memento)
320
321- #console = logging.StreamHandler()
322- #console.setLevel(logging.DEBUG)
323- #logger.addHandler(console)
324-
325 def assert_function_logs(self, func, *args, **kwargs):
326 """Check 'funcion' logs its inputs as DEBUG."""
327 name = func.__name__

Subscribers

People subscribed via source and target branches

to all changes: