diff --git a/src/jarabe/desktop/activitychooser.py b/src/jarabe/desktop/activitychooser.py index b585cdea43..cfb30da0f1 100644 --- a/src/jarabe/desktop/activitychooser.py +++ b/src/jarabe/desktop/activitychooser.py @@ -16,23 +16,50 @@ import logging -from gi.repository import GObject from gi.repository import GLib +from gettext import gettext as _ from gi.repository import Gtk from gi.repository import Gdk +from gi.repository import GObject -from sugar3.graphics import style -from sugar3.graphics.popwindow import PopWindow from sugar3.activity import activityfactory from sugar3.graphics import iconentry +from sugar3.graphics import style +from sugar3.graphics.toolbutton import ToolButton +from jarabe.model import shell from jarabe.desktop.activitieslist import ActivitiesList from jarabe.util.normalize import normalize_string + +class TitleBox(Gtk.Toolbar): + def __init__(self): + Gtk.Toolbar.__init__(self) + + self.close_button = ToolButton(icon_name='dialog-cancel') + self.close_button.set_tooltip(_('Close')) + self.insert(self.close_button, -1) + self.close_button.show() + + self._label = Gtk.Label() + self._label.set_alignment(0, 0.5) + + tool_item = Gtk.ToolItem() + tool_item.set_expand(True) + tool_item.add(self._label) + self._label.show() + self.insert(tool_item, 0) + tool_item.show() + + def set_title(self, title): + self._label.set_markup('%s' % title) + self._label.show() + + _AUTOSEARCH_TIMEOUT = 1000 -class ActivityChooser(PopWindow): +class ActivityChooser(Gtk.Window): __gtype_name__ = 'ActivityChooser' @@ -43,16 +70,37 @@ class ActivityChooser(PopWindow): } def __init__(self): - logging.debug('In the Object Chooser class init hehehe') - PopWindow.__init__(self) - width, height = self.HALF_WIDTH - - self.set_size((width*3/2, height*2/3)) + Gtk.Window.__init__(self) + + self.set_decorated(False) + self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) + self.set_border_width(style.LINE_WIDTH) + self.set_resizable(False) + self.set_modal(True) + self.set_can_focus(True) + + self._vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) + self.add(self._vbox) + self._vbox.show() + + self._title_box = TitleBox() + self._title_box.close_button.connect( + 'clicked', + self.__close_button_clicked_cb) + self._title_box.set_size_request(-1, style.GRID_CELL_SIZE) + + self._vbox.pack_start(self._title_box, False, True, 0) + self._title_box.show() + + self.set_size_request((Gdk.Screen.height() - style.GRID_CELL_SIZE * 3)*3/4, + (Gdk.Screen.height() - style.GRID_CELL_SIZE * 2)*2/3) self.connect('key-press-event', self.__key_press_event_cb) + self.connect('realize', self.__realize_cb) + self._list_view = ActivitiesList() self.search_bar = SearchBar() - self.get_vbox().pack_start(self.search_bar, False, False, 0) + self._vbox.pack_start(self.search_bar, False, False, 0) self.search_bar.connect('query-changed', self.__toolbar_query_changed_cb) self.search_bar.search_entry.connect('key-press-event', @@ -64,7 +112,7 @@ def __init__(self): self._scrolled_window.add(self._list_view) - self.get_vbox().pack_start(self._scrolled_window, True, True, 0) + self._vbox.pack_start(self._scrolled_window, True, True, 0) self._list_view.show() self._list_view.connect('clear-clicked', @@ -101,6 +149,17 @@ def __init__(self): self.show() + def __close_button_clicked_cb(self, button): + self.destroy() + + def __realize_cb(self, widget): + shell.get_model().push_modal() + self.set_type_hint(Gdk.WindowTypeHint.DIALOG) + window = self.get_window() + window.set_accept_focus(True) + shell.get_model().push_modal() + + def __toolbar_query_changed_cb(self, toolbar, query): self._query = normalize_string(query.decode('utf-8')) self._list_view.set_filter(self._query) @@ -125,6 +184,10 @@ def __toolbar_query_changed_cb(self, toolbar, query): toolbar.search_entry.select_region(pos, -1) def __key_press_event_cb(self, widget, event): + keyname = Gdk.keyval_name(event.keyval) + if keyname == 'Escape': + self.destroy() + if not self.search_bar.search_entry.has_focus(): self.search_bar.search_entry.grab_focus() @@ -146,7 +209,7 @@ def __activitylist_clear_clicked_cb(self, list_view, toolbar): toolbar.clear_query() def set_title(self, text): - self.get_title_box().set_title(text) + self._title_box.set_title(text) def _got_row_tree_view(self, row): bundle_id = row[self.tree_view._model.column_bundle_id] diff --git a/src/jarabe/journal/journalactivity.py b/src/jarabe/journal/journalactivity.py index de8c645a1a..d2d4c7dc8e 100644 --- a/src/jarabe/journal/journalactivity.py +++ b/src/jarabe/journal/journalactivity.py @@ -50,7 +50,7 @@ from jarabe.journal.journalwindow import JournalWindow from jarabe.journal.bundlelauncher import launch_bundle, get_bundle -from jarabe.model import session +from jarabe.model import session, shell from sugar3.graphics import style @@ -360,7 +360,18 @@ def __add_project_activate_cb(self, bar, title): activity_id=None, project_metadata=None) def __add_new_activate_cb(self, bar, title): + shell_model = shell.get_model() + activity = shell_model.get_active_activity() + if activity.has_shell_window(): + return + + if shell.get_model().has_modal(): + return + chooser = ActivityChooser() + activity.push_shell_window(chooser) + chooser.connect('hide', activity.pop_shell_window) + text = _("Choose an activity to start '%s' with") % title chooser.set_title(text) chooser.connect('activity-selected',