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
=== modified file 'data/ui/gui.glade'
--- data/ui/gui.glade 2010-06-14 01:14:18 +0000
+++ data/ui/gui.glade 2010-06-26 14:17:28 +0000
@@ -1052,76 +1052,11 @@
1052 <action-widget response="0">shares_to_others_close</action-widget>1052 <action-widget response="0">shares_to_others_close</action-widget>
1053 </action-widgets>1053 </action-widgets>
1054 </object>1054 </object>
1055 <object class="GtkDialog" id="raw_metadata_dialog">
1056 <property name="width_request">600</property>
1057 <property name="height_request">300</property>
1058 <property name="border_width">5</property>
1059 <property name="title" translatable="yes">Raw metadata</property>
1060 <property name="window_position">center</property>
1061 <property name="type_hint">normal</property>
1062 <property name="has_separator">False</property>
1063 <signal name="close" handler="on_raw_metadata_close_clicked"/>
1064 <child internal-child="vbox">
1065 <object class="GtkVBox" id="dialog-vbox9">
1066 <property name="visible">True</property>
1067 <property name="spacing">2</property>
1068 <child>
1069 <object class="GtkTextView" id="raw_metadata_view">
1070 <property name="visible">True</property>
1071 <property name="can_focus">True</property>
1072 <property name="editable">False</property>
1073 <property name="wrap_mode">word</property>
1074 </object>
1075 <packing>
1076 <property name="position">1</property>
1077 </packing>
1078 </child>
1079 <child>
1080 <object class="GtkImage" id="raw_metadata_image">
1081 <property name="visible">True</property>
1082 <property name="stock">gtk-missing-image</property>
1083 </object>
1084 <packing>
1085 <property name="position">2</property>
1086 </packing>
1087 </child>
1088 <child internal-child="action_area">
1089 <object class="GtkHButtonBox" id="dialog-action_area9">
1090 <property name="visible">True</property>
1091 <property name="layout_style">end</property>
1092 <child>
1093 <object class="GtkButton" id="raw_metadata_close">
1094 <property name="label">gtk-close</property>
1095 <property name="visible">True</property>
1096 <property name="can_focus">True</property>
1097 <property name="receives_default">True</property>
1098 <property name="use_stock">True</property>
1099 <signal name="clicked" handler="on_raw_metadata_close_clicked"/>
1100 <signal name="activate" handler="on_raw_metadata_close_clicked"/>
1101 </object>
1102 <packing>
1103 <property name="expand">False</property>
1104 <property name="fill">False</property>
1105 <property name="position">0</property>
1106 </packing>
1107 </child>
1108 </object>
1109 <packing>
1110 <property name="expand">False</property>
1111 <property name="pack_type">end</property>
1112 <property name="position">0</property>
1113 </packing>
1114 </child>
1115 </object>
1116 </child>
1117 <action-widgets>
1118 <action-widget response="0">raw_metadata_close</action-widget>
1119 </action-widgets>
1120 </object>
1121 <object class="GtkFileChooserDialog" id="file_chooser">1055 <object class="GtkFileChooserDialog" id="file_chooser">
1122 <property name="border_width">5</property>1056 <property name="border_width">5</property>
1123 <property name="type_hint">normal</property>1057 <property name="type_hint">normal</property>
1124 <property name="has_separator">False</property>1058 <property name="has_separator">False</property>
1059 <property name="create_folders">False</property>
1125 <signal name="file_activated" handler="on_file_chooser_open_clicked"/>1060 <signal name="file_activated" handler="on_file_chooser_open_clicked"/>
1126 <child internal-child="vbox">1061 <child internal-child="vbox">
1127 <object class="GtkVBox" id="dialog-vbox7">1062 <object class="GtkVBox" id="dialog-vbox7">
11281063
=== modified file 'magicicada/__init__.py'
--- magicicada/__init__.py 2010-06-21 17:10:41 +0000
+++ magicicada/__init__.py 2010-06-26 14:17:28 +0000
@@ -19,13 +19,15 @@
19"""Magicicada."""19"""Magicicada."""
2020
21import logging21import logging
22import gtk22import os
23import sys23import sys
2424
25import gettext25import gettext
26from gettext import gettext as _26from gettext import gettext as _
27gettext.textdomain('magicicada')27gettext.textdomain('magicicada')
2828
29import gtk
30
29# optional Launchpad integration31# optional Launchpad integration
30# this shouldn't crash if not found as it is simply used for bug reporting32# this shouldn't crash if not found as it is simply used for bug reporting
31try:33try:
@@ -43,10 +45,14 @@
4345
44CONTENT_QUEUE = 'content'46CONTENT_QUEUE = 'content'
45META_QUEUE = 'meta'47META_QUEUE = 'meta'
48UBUNTU_ONE_ROOT = os.path.expanduser('~/Ubuntu One')
4649
47# set up the logging for all the project50# set up the logging for all the project
48logger_helper.set_up()51logger_helper.set_up()
49logger = logging.getLogger('magicicada.ui')52logger = logging.getLogger('magicicada.ui')
53console = logging.StreamHandler()
54console.setLevel(logging.DEBUG)
55#logger.addHandler(console)
5056
5157
52class MagicicadaUI(object):58class MagicicadaUI(object):
@@ -87,8 +93,7 @@
87 'shares_to_me_store', 'shares_to_me_close',93 'shares_to_me_store', 'shares_to_me_close',
88 'shares_to_others', 'shares_to_others_dialog', # shares_to_others94 'shares_to_others', 'shares_to_others_dialog', # shares_to_others
89 'shares_to_others_store', 'shares_to_others_close',95 'shares_to_others_store', 'shares_to_others_close',
90 'raw_metadata', 'raw_metadata_dialog', # raw metadata96 'raw_metadata', # raw metadata
91 'raw_metadata_close', 'raw_metadata_view', 'raw_metadata_image',
92 'is_started', 'is_connected', 'is_online', # status bar images97 'is_started', 'is_connected', 'is_online', # status bar images
93 'status_label', 'status_icon', # status label and systray icon98 'status_label', 'status_icon', # status label and systray icon
94 'metaq_view', 'contentq_view', # queues tree views99 'metaq_view', 'contentq_view', # queues tree views
@@ -102,6 +107,7 @@
102 setattr(self, widget, obj)107 setattr(self, widget, obj)
103 assert obj is not None, '%s must not be None' % widget108 assert obj is not None, '%s must not be None' % widget
104109
110 self.raw_metadata_dialog = self._new_metadata_dialog()
105 self.volumes = (self.folders, self.shares_to_me, self.shares_to_others)111 self.volumes = (self.folders, self.shares_to_me, self.shares_to_others)
106 self.windows = (self.main_window, self.about_dialog,112 self.windows = (self.main_window, self.about_dialog,
107 self.folders_dialog)113 self.folders_dialog)
@@ -130,9 +136,39 @@
130 self.widget_is_visible = lambda w: w.get_property('visible')136 self.widget_is_visible = lambda w: w.get_property('visible')
131 self.widget_enabled = lambda w: self.widget_is_visible(w) and \137 self.widget_enabled = lambda w: self.widget_is_visible(w) and \
132 w.is_sensitive()138 w.is_sensitive()
139 self.file_chooser.set_current_folder(UBUNTU_ONE_ROOT)
133 self.last_metadata_path = None140 self.last_metadata_path = None
134 self.update()141 self.update()
135142
143 def _new_metadata_dialog(self):
144 """Return a new metadata dialog."""
145 dialog = gtk.Dialog(title='Raw metadata', parent=self.main_window,
146 flags=gtk.DIALOG_NO_SEPARATOR,
147 buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
148 dialog.set_size_request(600, 300)
149 dialog.set_position(gtk.WIN_POS_CENTER)
150 setattr(self, 'raw_metadata_dialog', dialog)
151
152 close_button = dialog.action_area.get_children()[-1]
153 close_button.connect('clicked', self.on_raw_metadata_close_clicked)
154 close_button.connect('activate', self.on_raw_metadata_close_clicked)
155 setattr(self, 'raw_metadata_close', close_button)
156
157 image = gtk.Image()
158 image.set_from_animation(self.loading_animation)
159 setattr(self, 'raw_metadata_image', image)
160
161 dialog.get_child().add(image)
162
163 text_view = gtk.TextView()
164 text_view.set_editable(False)
165 text_view.set_wrap_mode(gtk.WRAP_WORD)
166 dialog.get_child().add(text_view)
167 setattr(self, 'raw_metadata_view', text_view)
168
169 dialog.hide() # XXX to be fixed later
170 return dialog
171
136 # GTK callbacks172 # GTK callbacks
137173
138 def on_main_window_destroy(self, widget, data=None):174 def on_main_window_destroy(self, widget, data=None):
@@ -374,11 +410,14 @@
374 @log(logger)410 @log(logger)
375 def on_metadata_ready(self, path, metadata):411 def on_metadata_ready(self, path, metadata):
376 """Lower layer has the requested metadata for 'path'."""412 """Lower layer has the requested metadata for 'path'."""
413 logger.debug('on_metadata_ready: path: %r, last_metadata_path: %r',
414 path, self.last_metadata_path)
377 if path != self.last_metadata_path:415 if path != self.last_metadata_path:
378 return416 return
379 self.raw_metadata_image.hide()417 self.raw_metadata_image.hide()
380 self.raw_metadata_view.show()418 self.raw_metadata_view.show()
381 self.raw_metadata_view.get_buffer().set_text(str(metadata))419 text = '\n'.join('%s: %s' % i for i in metadata.iteritems())
420 self.raw_metadata_view.get_buffer().set_text(text)
382421
383 # custom422 # custom
384423
385424
=== modified file 'magicicada/tests/test_magicicada.py'
--- magicicada/tests/test_magicicada.py 2010-06-21 17:10:41 +0000
+++ magicicada/tests/test_magicicada.py 2010-06-26 14:17:28 +0000
@@ -29,7 +29,8 @@
2929
30from twisted.trial.unittest import TestCase30from twisted.trial.unittest import TestCase
3131
32from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, syncdaemon32from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE, \
33 UBUNTU_ONE_ROOT, syncdaemon
33from magicicada.dbusiface import QueueData, FolderData, ShareData34from magicicada.dbusiface import QueueData, FolderData, ShareData
34from magicicada.helpers import NO_OP, humanize_bytes, get_data_file35from magicicada.helpers import NO_OP, humanize_bytes, get_data_file
35from magicicada.tests.helpers import MementoHandler36from magicicada.tests.helpers import MementoHandler
@@ -193,6 +194,30 @@
193 self.assertTrue(sensitive if enabled else not sensitive,194 self.assertTrue(sensitive if enabled else not sensitive,
194 msg % (widget_name, '' if enabled else 'not '))195 msg % (widget_name, '' if enabled else 'not '))
195196
197 def assert_dialog_properties(self, dialog_name, title, size=(600, 300),
198 modal=True):
199 """The dialog 'dialog_name' has correct properties."""
200 dialog = getattr(self.ui, dialog_name)
201 actual = dialog.size_request()
202 msg = 'size must be %s (got %s instead).'
203 self.assertEquals(size, actual, msg % (size, actual))
204
205 msg = '%s must %sbe modal.'
206 self.assertEqual(modal, dialog.get_modal(),
207 msg % (dialog_name, '' if modal else 'not '))
208
209 position = dialog.get_property('window-position')
210 self.assertEqual(gtk.WIN_POS_CENTER, position,
211 '%s must be centered.' % dialog_name)
212
213 actual = dialog.get_title()
214 msg = '%s title must be %s (got %s instead)'
215 self.assertEqual(title, actual, msg % (dialog_name, title, actual))
216
217 msg = '%s must have main_window as parent.'
218 #self.assertTrue(dialog.parent is self.ui.main_window,
219 # msg % dialog_name)
220
196221
197class MagicicadaUIBasicTestCase(MagicicadaUITestCase):222class MagicicadaUIBasicTestCase(MagicicadaUITestCase):
198 """UI test cases for basic state."""223 """UI test cases for basic state."""
@@ -926,21 +951,9 @@
926 @skip_abstract_class951 @skip_abstract_class
927 def test_volume_dialog_properties(self):952 def test_volume_dialog_properties(self):
928 """The volume dialog has correct properties."""953 """The volume dialog has correct properties."""
929 size = self.volume_dialog.size_request()954 title = self.name.replace('_', ' ').capitalize()
930 self.assertEquals((600, 300), size)955 self.assert_dialog_properties(dialog_name=self.volume_dialog_name,
931956 title=title)
932 self.assertTrue(self.volume_dialog.get_modal(),
933 '%s must be modal.' % self.volume_dialog_name)
934
935 position = self.volume_dialog.get_property('window-position')
936 self.assertEqual(gtk.WIN_POS_CENTER, position,
937 '%s must be centered.' % self.volume_dialog_name)
938
939 actual = self.volume_dialog.get_title()
940 expected = self.name.replace('_', ' ').capitalize()
941 msg = '%s title must be %s (got %s instead)'
942 self.assertEqual(expected, actual,
943 msg % (self.volume_dialog_name, expected, actual))
944957
945958
946class MagicicadaUIFoldersTestCase(_MagicicadaUIVolumeTestCase):959class MagicicadaUIFoldersTestCase(_MagicicadaUIVolumeTestCase):
@@ -1116,21 +1129,9 @@
11161129
1117 def test_raw_metadata_dialog_properties(self):1130 def test_raw_metadata_dialog_properties(self):
1118 """The raw_metadata dialog has correct properties."""1131 """The raw_metadata dialog has correct properties."""
1119 dialog = 'raw_metadata_dialog'1132 title = self.name.replace('_', ' ').capitalize()
1120 size = self.ui.raw_metadata_dialog.size_request()1133 self.assert_dialog_properties(dialog_name='raw_metadata_dialog',
1121 self.assertEquals((600, 300), size)1134 title=title, modal=False)
1122
1123 self.assertFalse(self.ui.raw_metadata_dialog.get_modal(),
1124 '%s must not be modal.' % dialog)
1125
1126 position = self.ui.raw_metadata_dialog.get_property('window-position')
1127 self.assertEqual(gtk.WIN_POS_CENTER, position,
1128 '%s must be centered.' % dialog)
1129
1130 actual = self.ui.raw_metadata_dialog.get_title()
1131 expected = self.name.replace('_', ' ').capitalize()
1132 msg = '%s title must be %s (got %s instead)'
1133 self.assertEqual(expected, actual, msg % (dialog, expected, actual))
11341135
1135 actual = self.ui.raw_metadata_view.get_wrap_mode()1136 actual = self.ui.raw_metadata_view.get_wrap_mode()
1136 msg = 'wrap mode for view must be gtk.WRAP_WORD (got %s instead).'1137 msg = 'wrap mode for view must be gtk.WRAP_WORD (got %s instead).'
@@ -1147,6 +1148,14 @@
1147 self.assertFalse(self.ui.widget_is_visible(self.ui.file_chooser),1148 self.assertFalse(self.ui.widget_is_visible(self.ui.file_chooser),
1148 'file_chooser must be hidden by default.')1149 'file_chooser must be hidden by default.')
11491150
1151 def test_file_chooser_current_folder_is_ubuntu_one_root(self):
1152 """File chooser default folder is ~/Ubuntu One."""
1153 process_gtk_pendings() # WOW! Needed to get proper value below
1154 actual = self.ui.file_chooser.get_current_folder()
1155 msg = 'file_chooser default folder must be %s (got %s instead).'
1156 self.assertEqual(actual, UBUNTU_ONE_ROOT,
1157 msg % (UBUNTU_ONE_ROOT, actual))
1158
1150 def test_filename_is_used_only_if_open_clicked(self):1159 def test_filename_is_used_only_if_open_clicked(self):
1151 """Filename is used only if user clicked open."""1160 """Filename is used only if user clicked open."""
1152 self.patch(self.ui.sd, 'get_metadata', self.set_called)1161 self.patch(self.ui.sd, 'get_metadata', self.set_called)
@@ -1178,10 +1187,12 @@
1178 buff = self.ui.raw_metadata_view.get_buffer()1187 buff = self.ui.raw_metadata_view.get_buffer()
1179 self.assertTrue(buff is not None,1188 self.assertTrue(buff is not None,
1180 'buffer for raw_metadata_view must not be None.')1189 'buffer for raw_metadata_view must not be None.')
1190
1191 expected = '\n'.join('%s: %s' % i for i in self.metadata.iteritems())
1181 actual = buff.get_text(*buff.get_bounds())1192 actual = buff.get_text(*buff.get_bounds())
1182 msg = 'buffer content must be %s (got %s instead).'1193 msg = 'buffer content must be %s (got %s instead).'
1183 self.assertEqual(actual, str(self.metadata),1194 self.assertEqual(actual, expected,
1184 msg % (self.metadata, actual))1195 msg % (expected, actual))
11851196
1186 def test_on_metadata_ready_doesnt_update_if_last_path_doesnt_match(self):1197 def test_on_metadata_ready_doesnt_update_if_last_path_doesnt_match(self):
1187 """Callback on_metadata_ready updates the raw_metadata_view."""1198 """Callback on_metadata_ready updates the raw_metadata_view."""
@@ -1224,10 +1235,6 @@
1224 logger = logging.getLogger('magicicada.ui')1235 logger = logging.getLogger('magicicada.ui')
1225 logger.addHandler(self.memento)1236 logger.addHandler(self.memento)
12261237
1227 #console = logging.StreamHandler()
1228 #console.setLevel(logging.DEBUG)
1229 #logger.addHandler(console)
1230
1231 def assert_function_logs(self, func, *args, **kwargs):1238 def assert_function_logs(self, func, *args, **kwargs):
1232 """Check 'funcion' logs its inputs as DEBUG."""1239 """Check 'funcion' logs its inputs as DEBUG."""
1233 name = func.__name__1240 name = func.__name__

Subscribers

People subscribed via source and target branches

to all changes: