def __init__(self, file_name, document_path, title, bundle=False): RadioToolButton.__init__(self) self._document_path = document_path self._title = title self._jobject = None self.props.tooltip = _('Instance Source') client = GConf.Client.get_default() self._color = client.get_string('/desktop/sugar/user/color') icon = Icon(file=file_name, icon_size=Gtk.IconSize.LARGE_TOOLBAR, xo_color=XoColor(self._color)) self.set_icon_widget(icon) icon.show() if bundle: menu_item = MenuItem(_('Duplicate')) icon = Icon(icon_name='edit-duplicate', icon_size=Gtk.IconSize.MENU, xo_color=XoColor(self._color)) menu_item.connect('activate', self.__copy_to_home_cb) else: menu_item = MenuItem(_('Keep')) icon = Icon(icon_name='document-save', icon_size=Gtk.IconSize.MENU, xo_color=XoColor(self._color)) menu_item.connect('activate', self.__keep_in_journal_cb) menu_item.set_image(icon) self.props.palette.menu.append(menu_item) menu_item.show()
def __init__(self, file_name, document_path, title, bundle=False): RadioToolButton.__init__(self) self._document_path = document_path self._title = title self._jobject = None self.props.tooltip = _('Instance Source') settings = Gio.Settings('org.sugarlabs.user') self._color = settings.get_string('color') icon = Icon(file=file_name, pixel_size=style.STANDARD_ICON_SIZE, xo_color=XoColor(self._color)) self.set_icon_widget(icon) icon.show() if bundle: menu_item = MenuItem(_('Duplicate')) icon = Icon(icon_name='edit-duplicate', pixel_size=style.SMALL_ICON_SIZE, xo_color=XoColor(self._color)) menu_item.connect('activate', self.__copy_to_home_cb) else: menu_item = MenuItem(_('Keep')) icon = Icon(icon_name='document-save', pixel_size=style.SMALL_ICON_SIZE, xo_color=XoColor(self._color)) menu_item.connect('activate', self.__keep_in_journal_cb) menu_item.set_image(icon) self.props.palette.menu.append(menu_item) menu_item.show()
def __init__(self, title, url, owner_document): Palette.__init__(self) self._title = title self._url = url self._owner_document = owner_document self.props.primary_text = title self.props.secondary_text = url menu_item = MenuItem(_('Keep image')) icon = Icon(icon_name='document-save', xo_color=profile.get_color(), icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) menu_item.connect('activate', self.__download_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Copy image')) icon = Icon(icon_name='edit-copy', xo_color=profile.get_color(), icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) menu_item.connect('activate', self.__copy_activate_cb) self.menu.append(menu_item) menu_item.show()
def __init__(self, file_name, document_path, title, bundle=False): RadioToolButton.__init__(self) self._document_path = document_path self._title = title self._jobject = None self.props.tooltip = _("Instance Source") settings = Gio.Settings("org.sugarlabs.user") self._color = settings.get_string("color") icon = Icon(file=file_name, icon_size=Gtk.IconSize.LARGE_TOOLBAR, xo_color=XoColor(self._color)) self.set_icon_widget(icon) icon.show() if bundle: menu_item = MenuItem(_("Duplicate")) icon = Icon(icon_name="edit-duplicate", icon_size=Gtk.IconSize.MENU, xo_color=XoColor(self._color)) menu_item.connect("activate", self.__copy_to_home_cb) else: menu_item = MenuItem(_("Keep")) icon = Icon(icon_name="document-save", icon_size=Gtk.IconSize.MENU, xo_color=XoColor(self._color)) menu_item.connect("activate", self.__keep_in_journal_cb) menu_item.set_image(icon) self.props.palette.menu.append(menu_item) menu_item.show()
def __init__(self, metadata): Gtk.Menu.__init__(self) self._metadata = metadata for activity_info in misc.get_activities(metadata): menu_item = MenuItem(activity_info.get_name()) menu_item.set_image(Icon(file=activity_info.get_icon(), icon_size=Gtk.IconSize.MENU)) menu_item.connect("activate", self.__item_activate_cb, activity_info.get_bundle_id()) self.append(menu_item) menu_item.show() if not self.get_children(): if metadata.get("activity_id", ""): resume_label = _("No activity to resume entry") else: resume_label = _("No activity to start entry") menu_item = MenuItem(resume_label) menu_item.set_sensitive(False) self.append(menu_item) menu_item.show()
def __init__(self, browser, title, url, owner_document): Palette.__init__(self) self._browser = browser self._title = title self._url = url self._owner_document = owner_document if title is not None: self.props.primary_text = title self.props.secondary_text = url else: self.props.primary_text = url menu_item = MenuItem(_('Follow link'), 'browse-follow-link') menu_item.connect('activate', self.__follow_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Follow link in new tab'), 'browse-follow-link-new-tab') menu_item.connect('activate', self.__follow_activate_cb, True) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Keep link')) icon = Icon(icon_name='document-save', xo_color=profile.get_color(), icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) menu_item.connect('activate', self.__download_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Copy link')) icon = Icon(icon_name='edit-copy', xo_color=profile.get_color(), icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) menu_item.connect('activate', self.__copy_activate_cb) self.menu.append(menu_item) menu_item.show()
def _refresh_resume_palette(self): if self._metadata.get('activity_id', ''): # TRANS: Action label for resuming an activity. self._resume.set_tooltip(_('Resume')) else: # TRANS: Action label for starting an entry. self._resume.set_tooltip(_('Start')) palette = self._resume.get_palette() for menu_item in palette.menu.get_children(): palette.menu.remove(menu_item) menu_item.destroy() for activity_info in misc.get_activities(self._metadata): menu_item = MenuItem(activity_info.get_name()) menu_item.set_image(Icon(file=activity_info.get_icon(), icon_size=Gtk.IconSize.MENU)) menu_item.connect('activate', self._resume_menu_item_activate_cb, activity_info.get_bundle_id()) palette.menu.append(menu_item) menu_item.show()
def _refresh_resume_palette(self): if self._metadata.get('activity_id', ''): # TRANS: Action label for resuming an activity. self._resume.set_tooltip(_('Resume')) else: # TRANS: Action label for starting an entry. self._resume.set_tooltip(_('Start')) palette = self._resume.get_palette() for menu_item in palette.menu.get_children(): palette.menu.remove(menu_item) menu_item.destroy() for activity_info in misc.get_activities(self._metadata): menu_item = MenuItem(activity_info.get_name()) menu_item.set_image( Icon(file=activity_info.get_icon(), icon_size=Gtk.IconSize.MENU)) menu_item.connect('activate', self._resume_menu_item_activate_cb, activity_info.get_bundle_id()) palette.menu.append(menu_item) menu_item.show()
def __init__(self, metadata): Gtk.Menu.__init__(self) self._metadata = metadata for activity_info in misc.get_activities(metadata): menu_item = MenuItem(activity_info.get_name()) menu_item.set_image(Icon(file=activity_info.get_icon(), pixel_size=style.SMALL_ICON_SIZE)) menu_item.connect('activate', self.__item_activate_cb, activity_info.get_bundle_id()) self.append(menu_item) menu_item.show() if not self.get_children(): if metadata.get('activity_id', ''): resume_label = _('No activity to resume entry') else: resume_label = _('No activity to start entry') menu_item = MenuItem(resume_label) menu_item.set_sensitive(False) self.append(menu_item) menu_item.show()
class ActivityListPalette(ActivityPalette): __gtype_name__ = 'SugarActivityListPalette' __gsignals__ = { 'erase-activated': (GObject.SignalFlags.RUN_FIRST, None, ([str])), } def __init__(self, activity_info): ActivityPalette.__init__(self, activity_info) self._bundle_id = activity_info.get_bundle_id() self._version = activity_info.get_activity_version() registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite(self._bundle_id, self._version) self._favorite_item = MenuItem('') self._favorite_icon = Icon(icon_name='emblem-favorite', icon_size=Gtk.IconSize.MENU) self._favorite_item.set_image(self._favorite_icon) self._favorite_item.connect('activate', self.__change_favorite_activate_cb) self.menu.append(self._favorite_item) self._favorite_item.show() if activity_info.is_user_activity(): self._add_erase_option(registry, activity_info) registry = bundleregistry.get_registry() self._activity_changed_sid = registry.connect( 'bundle_changed', self.__activity_changed_cb) self._update_favorite_item() self.menu.connect('destroy', self.__destroy_cb) def _add_erase_option(self, registry, activity_info): menu_item = MenuItem(_('Erase'), 'list-remove') menu_item.connect('activate', self.__erase_activate_cb) self.menu.append(menu_item) menu_item.show() if not os.access(activity_info.get_path(), os.W_OK) or \ registry.is_activity_protected(self._bundle_id): menu_item.props.sensitive = False def __destroy_cb(self, palette): registry = bundleregistry.get_registry() registry.disconnect(self._activity_changed_sid) def _update_favorite_item(self): label = self._favorite_item.get_child() if self._favorite: label.set_text(_('Remove favorite')) xo_color = XoColor('%s,%s' % (style.COLOR_WHITE.get_svg(), style.COLOR_TRANSPARENT.get_svg())) else: label.set_text(_('Make favorite')) client = GConf.Client.get_default() xo_color = XoColor(client.get_string('/desktop/sugar/user/color')) self._favorite_icon.props.xo_color = xo_color def __change_favorite_activate_cb(self, menu_item): registry = bundleregistry.get_registry() registry.set_bundle_favorite(self._bundle_id, self._version, not self._favorite) def __activity_changed_cb(self, activity_registry, activity_info): if activity_info.get_bundle_id() == self._bundle_id and \ activity_info.get_activity_version() == self._version: registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite( self._bundle_id, self._version) self._update_favorite_item() def __erase_activate_cb(self, menu_item): self.emit('erase-activated', self._bundle_id)
def __init__(self, journalactivity, metadata, detail=False): self._journalactivity = journalactivity self._metadata = metadata activity_icon = Icon(icon_size=Gtk.IconSize.LARGE_TOOLBAR) activity_icon.props.file = misc.get_icon_name(metadata) color = misc.get_icon_color(metadata) activity_icon.props.xo_color = color if "title" in metadata: title = GObject.markup_escape_text(metadata["title"]) else: title = GLib.markup_escape_text(_("Untitled")) Palette.__init__(self, primary_text=title, icon=activity_icon) if misc.get_activities(metadata) or misc.is_bundle(metadata): if metadata.get("activity_id", ""): resume_label = _("Resume") resume_with_label = _("Resume with") else: resume_label = _("Start") resume_with_label = _("Start with") menu_item = MenuItem(resume_label, "activity-start") menu_item.connect("activate", self.__start_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(resume_with_label, "activity-start") self.menu.append(menu_item) menu_item.show() start_with_menu = StartWithMenu(self._metadata) menu_item.set_submenu(start_with_menu) else: menu_item = MenuItem(_("No activity to start entry")) menu_item.set_sensitive(False) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_("Copy to")) icon = Icon(icon_name="edit-copy", xo_color=color, icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) self.menu.append(menu_item) menu_item.show() copy_menu = CopyMenu(self._journalactivity, self.__get_uid_list_cb) copy_menu.connect("volume-error", self.__volume_error_cb) menu_item.set_submenu(copy_menu) if self._metadata["mountpoint"] == "/": menu_item = MenuItem(_("Duplicate")) icon = Icon(icon_name="edit-duplicate", xo_color=color, icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) menu_item.connect("activate", self.__duplicate_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_("Send to"), "document-send") self.menu.append(menu_item) menu_item.show() friends_menu = FriendsMenu() friends_menu.connect("friend-selected", self.__friend_selected_cb) menu_item.set_submenu(friends_menu) if detail is True: menu_item = MenuItem(_("View Details"), "go-right") menu_item.connect("activate", self.__detail_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_("Erase"), "list-remove") menu_item.connect("activate", self.__erase_activate_cb) self.menu.append(menu_item) menu_item.show()
class ClipboardMenu(Palette): def __init__(self, cb_object): Palette.__init__(self, text_maxlen=100) self._cb_object = cb_object self.set_group_id('frame') cb_service = clipboard.get_instance() cb_service.connect('object-state-changed', self._object_state_changed_cb) self._remove_item = MenuItem(pgettext('Clipboard', 'Remove'), 'list-remove') self._remove_item.connect('activate', self._remove_item_activate_cb) self.menu.append(self._remove_item) self._remove_item.show() self._open_item = MenuItem(_('Open'), 'zoom-activity') self._open_item.connect('activate', self._open_item_activate_cb) self.menu.append(self._open_item) self._open_item.show() self._journal_item = MenuItem(_('Keep')) client = GConf.Client.get_default() color = XoColor(client.get_string('/desktop/sugar/user/color')) icon = Icon(icon_name='document-save', icon_size=Gtk.IconSize.MENU, xo_color=color) self._journal_item.set_image(icon) self._journal_item.connect('activate', self._journal_item_activate_cb) self.menu.append(self._journal_item) self._journal_item.show() self._update() def _update_open_submenu(self): activities = self._get_activities() logging.debug('_update_open_submenu: %r', activities) child = self._open_item.get_child() if activities is None or len(activities) <= 1: child.set_text(_('Open')) if self._open_item.get_submenu() is not None: self._open_item.set_submenu(None) return child.set_text(_('Open with')) submenu = self._open_item.get_submenu() if submenu is None: submenu = Gtk.Menu() self._open_item.set_submenu(submenu) submenu.show() else: for item in submenu.get_children(): submenu.remove(item) for service_name in activities: registry = bundleregistry.get_registry() activity_info = registry.get_bundle(service_name) if not activity_info: logging.warning('Activity %s is unknown.', service_name) item = Gtk.MenuItem(activity_info.get_name()) item.connect('activate', self._open_submenu_item_activate_cb, service_name) submenu.append(item) item.show() def _update_items_visibility(self): activities = self._get_activities() installable = self._cb_object.is_bundle() percent = self._cb_object.get_percent() if percent == 100 and (activities or installable): self._remove_item.props.sensitive = True self._open_item.props.sensitive = True self._journal_item.props.sensitive = True elif percent == 100 and (not activities and not installable): self._remove_item.props.sensitive = True self._open_item.props.sensitive = False self._journal_item.props.sensitive = True else: self._remove_item.props.sensitive = True self._open_item.props.sensitive = False self._journal_item.props.sensitive = False def _get_activities(self): mime_type = self._cb_object.get_mime_type() if not mime_type: return '' registry = bundleregistry.get_registry() activities = registry.get_activities_for_type(mime_type) if activities: return [info.get_bundle_id() for info in activities] else: return '' def _object_state_changed_cb(self, cb_service, cb_object): if cb_object != self._cb_object: return self._update() def _update(self): name = self._cb_object.get_name() self.props.primary_text = GLib.markup_escape_text(name) preview = self._cb_object.get_preview() if preview: self.props.secondary_text = GLib.markup_escape_text(preview) self._update_items_visibility() self._update_open_submenu() def _open_item_activate_cb(self, menu_item): logging.debug('_open_item_activate_cb') percent = self._cb_object.get_percent() if percent < 100 or menu_item.get_submenu() is not None: return jobject = self._copy_to_journal() misc.resume(jobject.metadata, self._get_activities()[0]) jobject.destroy() def _open_submenu_item_activate_cb(self, menu_item, service_name): logging.debug('_open_submenu_item_activate_cb') percent = self._cb_object.get_percent() if percent < 100: return jobject = self._copy_to_journal() misc.resume(jobject.metadata, service_name) jobject.destroy() def _remove_item_activate_cb(self, menu_item): cb_service = clipboard.get_instance() cb_service.delete_object(self._cb_object.get_id()) def _journal_item_activate_cb(self, menu_item): logging.debug('_journal_item_activate_cb') jobject = self._copy_to_journal() jobject.destroy() def _write_to_temp_file(self, data): tmp_dir = os.path.join(env.get_profile_path(), 'data') f, file_path = tempfile.mkstemp(dir=tmp_dir) try: os.write(f, data) finally: os.close(f) return file_path def _copy_to_journal(self): formats = self._cb_object.get_formats().keys() most_significant_mime_type = mime.choose_most_significant(formats) format_ = self._cb_object.get_formats()[most_significant_mime_type] transfer_ownership = False if most_significant_mime_type == 'text/uri-list': uris = mime.split_uri_list(format_.get_data()) if len(uris) == 1 and uris[0].startswith('file://'): parsed_url = urlparse.urlparse(uris[0]) file_path = parsed_url.path # pylint: disable=E1101 transfer_ownership = False mime_type = mime.get_for_file(file_path) else: file_path = self._write_to_temp_file(format_.get_data()) transfer_ownership = True mime_type = 'text/uri-list' else: if format_.is_on_disk(): parsed_url = urlparse.urlparse(format_.get_data()) file_path = parsed_url.path # pylint: disable=E1101 transfer_ownership = False mime_type = mime.get_for_file(file_path) else: file_path = self._write_to_temp_file(format_.get_data()) transfer_ownership = True sniffed_mime_type = mime.get_for_file(file_path) if sniffed_mime_type == 'application/octet-stream': mime_type = most_significant_mime_type else: mime_type = sniffed_mime_type jobject = datastore.create() jobject.metadata['title'] = self._cb_object.get_name() jobject.metadata['keep'] = '0' jobject.metadata['buddies'] = '' jobject.metadata['preview'] = '' client = GConf.Client.get_default() color = client.get_string('/desktop/sugar/user/color') jobject.metadata['icon-color'] = color jobject.metadata['mime_type'] = mime_type jobject.file_path = file_path datastore.write(jobject, transfer_ownership=transfer_ownership) return jobject
def __init__(self, journalactivity, metadata, detail=False): self._journalactivity = journalactivity self._metadata = metadata activity_icon = Icon(icon_size=Gtk.IconSize.LARGE_TOOLBAR) activity_icon.props.file = misc.get_icon_name(metadata) color = misc.get_icon_color(metadata) activity_icon.props.xo_color = color if 'title' in metadata: title = GObject.markup_escape_text(metadata['title']) else: title = GLib.markup_escape_text(_('Untitled')) Palette.__init__(self, primary_text=title, icon=activity_icon) if misc.get_activities(metadata) or misc.is_bundle(metadata): if metadata.get('activity_id', ''): resume_label = _('Resume') resume_with_label = _('Resume with') else: resume_label = _('Start') resume_with_label = _('Start with') menu_item = MenuItem(resume_label, 'activity-start') menu_item.connect('activate', self.__start_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(resume_with_label, 'activity-start') self.menu.append(menu_item) menu_item.show() start_with_menu = StartWithMenu(self._metadata) menu_item.set_submenu(start_with_menu) else: menu_item = MenuItem(_('No activity to start entry')) menu_item.set_sensitive(False) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Copy to')) icon = Icon(icon_name='edit-copy', xo_color=color, icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) self.menu.append(menu_item) menu_item.show() copy_menu = CopyMenu(self._journalactivity, self.__get_uid_list_cb) copy_menu.connect('volume-error', self.__volume_error_cb) menu_item.set_submenu(copy_menu) if self._metadata['mountpoint'] == '/': menu_item = MenuItem(_('Duplicate')) icon = Icon(icon_name='edit-duplicate', xo_color=color, icon_size=Gtk.IconSize.MENU) menu_item.set_image(icon) menu_item.connect('activate', self.__duplicate_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Send to'), 'document-send') self.menu.append(menu_item) menu_item.show() friends_menu = FriendsMenu() friends_menu.connect('friend-selected', self.__friend_selected_cb) menu_item.set_submenu(friends_menu) if detail is True: menu_item = MenuItem(_('View Details'), 'go-right') menu_item.connect('activate', self.__detail_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Erase'), 'list-remove') menu_item.connect('activate', self.__erase_activate_cb) self.menu.append(menu_item) menu_item.show()
class ActivityListPalette(ActivityPalette): __gtype_name__ = 'SugarActivityListPalette' __gsignals__ = { 'erase-activated': (GObject.SignalFlags.RUN_FIRST, None, ([str])), } def __init__(self, activity_info): ActivityPalette.__init__(self, activity_info) self._bundle_id = activity_info.get_bundle_id() self._version = activity_info.get_activity_version() registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite(self._bundle_id, self._version) self._favorite_item = MenuItem('') self._favorite_icon = Icon(icon_name='emblem-favorite', icon_size=Gtk.IconSize.MENU) self._favorite_item.set_image(self._favorite_icon) self._favorite_item.connect('activate', self.__change_favorite_activate_cb) self.menu.append(self._favorite_item) self._favorite_item.show() if activity_info.is_user_activity(): self._add_erase_option(registry, activity_info) registry = bundleregistry.get_registry() self._activity_changed_sid = registry.connect('bundle_changed', self.__activity_changed_cb) self._update_favorite_item() self.menu.connect('destroy', self.__destroy_cb) def _add_erase_option(self, registry, activity_info): menu_item = MenuItem(_('Erase'), 'list-remove') menu_item.connect('activate', self.__erase_activate_cb) self.menu.append(menu_item) menu_item.show() if not os.access(activity_info.get_path(), os.W_OK) or \ registry.is_activity_protected(self._bundle_id): menu_item.props.sensitive = False def __destroy_cb(self, palette): registry = bundleregistry.get_registry() registry.disconnect(self._activity_changed_sid) def _update_favorite_item(self): label = self._favorite_item.get_child() if self._favorite: label.set_text(_('Remove favorite')) xo_color = XoColor('%s,%s' % (style.COLOR_WHITE.get_svg(), style.COLOR_TRANSPARENT.get_svg())) else: label.set_text(_('Make favorite')) client = GConf.Client.get_default() xo_color = XoColor(client.get_string('/desktop/sugar/user/color')) self._favorite_icon.props.xo_color = xo_color def __change_favorite_activate_cb(self, menu_item): registry = bundleregistry.get_registry() registry.set_bundle_favorite(self._bundle_id, self._version, not self._favorite) def __activity_changed_cb(self, activity_registry, activity_info): if activity_info.get_bundle_id() == self._bundle_id and \ activity_info.get_activity_version() == self._version: registry = bundleregistry.get_registry() self._favorite = registry.is_bundle_favorite(self._bundle_id, self._version) self._update_favorite_item() def __erase_activate_cb(self, menu_item): self.emit('erase-activated', self._bundle_id)
def __init__(self, journalactivity, metadata, detail=False): self._journalactivity = journalactivity self._metadata = metadata activity_icon = Icon(pixel_size=style.STANDARD_ICON_SIZE) activity_icon.props.file = misc.get_icon_name(metadata) color = misc.get_icon_color(metadata) activity_icon.props.xo_color = color if 'title' in metadata: title = metadata['title'] else: title = _('Untitled') Palette.__init__(self, primary_text=title, icon=activity_icon) description = metadata.get('description', '') if description: self.set_secondary_text(description) if misc.can_resume(metadata): if metadata.get('activity_id', ''): resume_label = _('Resume') resume_with_label = _('Resume with') else: resume_label = _('Start') resume_with_label = _('Start with') menu_item = MenuItem(resume_label, 'activity-start') menu_item.connect('activate', self.__start_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(resume_with_label, 'activity-start') self.menu.append(menu_item) menu_item.show() start_with_menu = StartWithMenu(self._metadata) menu_item.set_submenu(start_with_menu) elif metadata.get('activity', None) == PROJECT_BUNDLE_ID: open_label = _('Open') menu_item = MenuItem(open_label, 'project-box') menu_item.connect('activate', self.__open_project_activate_cb) self.menu.append(menu_item) menu_item.show() else: menu_item = MenuItem(_('No activity to start entry')) menu_item.set_sensitive(False) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Copy to')) icon = Icon(icon_name='edit-copy', xo_color=color, pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) self.menu.append(menu_item) menu_item.show() copy_menu = CopyMenu(self._journalactivity, self.__get_uid_list_cb) copy_menu.connect('volume-error', self.__volume_error_cb) menu_item.set_submenu(copy_menu) if not metadata.get('activity', None) == PROJECT_BUNDLE_ID: menu_item = MenuItem(_('Send to project...'), 'project-box') menu_item.connect('activate', self.__copy_to_project_activated_cb) self.menu.append(menu_item) menu_item.show() if self._metadata['mountpoint'] == '/': menu_item = MenuItem(_('Duplicate')) icon = Icon(icon_name='edit-duplicate', xo_color=color, pixel_size=style.SMALL_ICON_SIZE) menu_item.set_image(icon) menu_item.connect('activate', self.__duplicate_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Send to'), 'document-send') self.menu.append(menu_item) menu_item.show() friends_menu = FriendsMenu() friends_menu.connect('friend-selected', self.__friend_selected_cb) menu_item.set_submenu(friends_menu) if detail is True: menu_item = MenuItem(_('View Details'), 'go-right') menu_item.connect('activate', self.__detail_activate_cb) self.menu.append(menu_item) menu_item.show() menu_item = MenuItem(_('Erase'), 'list-remove') menu_item.connect('activate', self.__erase_activate_cb) self.menu.append(menu_item) menu_item.show()
class ClipboardMenu(Palette): def __init__(self, cb_object): Palette.__init__(self, text_maxlen=100) self._cb_object = cb_object self.set_group_id('frame') cb_service = clipboard.get_instance() cb_service.connect('object-state-changed', self._object_state_changed_cb) self._remove_item = MenuItem(pgettext('Clipboard', 'Remove'), 'list-remove') self._remove_item.connect('activate', self._remove_item_activate_cb) self.menu.append(self._remove_item) self._remove_item.show() self._open_item = MenuItem(_('Open'), 'zoom-activity') self._open_item.connect('activate', self._open_item_activate_cb) self.menu.append(self._open_item) self._open_item.show() self._journal_item = MenuItem(_('Keep')) color = profile.get_color() icon = Icon(icon_name='document-save', pixel_size=style.SMALL_ICON_SIZE, xo_color=color) self._journal_item.set_image(icon) self._journal_item.connect('activate', self._journal_item_activate_cb) self.menu.append(self._journal_item) self._journal_item.show() self._update() def _update_open_submenu(self): activities = self._get_activities() logging.debug('_update_open_submenu: %r', activities) child = self._open_item.get_child() if activities is None or len(activities) <= 1: child.set_text(_('Open')) if self._open_item.get_submenu() is not None: self._open_item.set_submenu(None) return child.set_text(_('Open with')) submenu = self._open_item.get_submenu() if submenu is None: submenu = Gtk.Menu() self._open_item.set_submenu(submenu) submenu.show() else: for item in submenu.get_children(): submenu.remove(item) for service_name in activities: registry = bundleregistry.get_registry() activity_info = registry.get_bundle(service_name) if not activity_info: logging.warning('Activity %s is unknown.', service_name) item = Gtk.MenuItem(activity_info.get_name()) item.connect('activate', self._open_submenu_item_activate_cb, service_name) submenu.append(item) item.show() def _update_items_visibility(self): activities = self._get_activities() installable = self._cb_object.is_bundle() percent = self._cb_object.get_percent() if percent == 100 and (activities or installable): self._remove_item.props.sensitive = True self._open_item.props.sensitive = True self._journal_item.props.sensitive = True elif percent == 100 and (not activities and not installable): self._remove_item.props.sensitive = True self._open_item.props.sensitive = False self._journal_item.props.sensitive = True else: self._remove_item.props.sensitive = True self._open_item.props.sensitive = False self._journal_item.props.sensitive = False def _get_activities(self): mime_type = self._cb_object.get_mime_type() if not mime_type: return '' registry = bundleregistry.get_registry() activities = registry.get_activities_for_type(mime_type) if activities: return [info.get_bundle_id() for info in activities] return '' def _object_state_changed_cb(self, cb_service, cb_object): if cb_object != self._cb_object: return self._update() def _update(self): self.props.primary_text = self._cb_object.get_name() preview = self._cb_object.get_preview() if preview: self.props.secondary_text = preview self._update_items_visibility() self._update_open_submenu() def _open_item_activate_cb(self, menu_item): logging.debug('_open_item_activate_cb') percent = self._cb_object.get_percent() if percent < 100 or menu_item.get_submenu() is not None: return jobject = self._copy_to_journal() misc.resume(jobject.metadata, self._get_activities()[0]) jobject.destroy() def _open_submenu_item_activate_cb(self, menu_item, service_name): logging.debug('_open_submenu_item_activate_cb') percent = self._cb_object.get_percent() if percent < 100: return jobject = self._copy_to_journal() misc.resume(jobject.metadata, service_name) jobject.destroy() def _remove_item_activate_cb(self, menu_item): cb_service = clipboard.get_instance() cb_service.delete_object(self._cb_object.get_id()) def _journal_item_activate_cb(self, menu_item): logging.debug('_journal_item_activate_cb') jobject = self._copy_to_journal() jobject.destroy() def _write_to_temp_file(self, data): tmp_dir = os.path.join(env.get_profile_path(), 'data') f, file_path = tempfile.mkstemp(dir=tmp_dir) try: os.write(f, data) finally: os.close(f) return file_path def _copy_to_journal(self): formats = list(self._cb_object.get_formats().keys()) most_significant_mime_type = mime.choose_most_significant(formats) format_ = self._cb_object.get_formats()[most_significant_mime_type] transfer_ownership = False if most_significant_mime_type == 'text/uri-list': uri = format_.get_data() if uri.startswith('file://'): parsed_url = urllib.parse.urlparse(uri) file_path = parsed_url.path # pylint: disable=E1101 transfer_ownership = False mime_type = mime.get_for_file(file_path) else: file_path = self._write_to_temp_file(format_.get_data()) transfer_ownership = True mime_type = 'text/uri-list' else: if format_.is_on_disk(): parsed_url = urllib.parse.urlparse(format_.get_data()) file_path = parsed_url.path # pylint: disable=E1101 transfer_ownership = False mime_type = mime.get_for_file(file_path) else: file_path = self._write_to_temp_file(format_.get_data()) transfer_ownership = True sniffed_mime_type = mime.get_for_file(file_path) if sniffed_mime_type == 'application/octet-stream': mime_type = most_significant_mime_type else: mime_type = sniffed_mime_type jobject = datastore.create() jobject.metadata['title'] = self._cb_object.get_name() jobject.metadata['keep'] = '0' jobject.metadata['buddies'] = '' jobject.metadata['preview'] = '' settings = Gio.Settings.new('org.sugarlabs.user') color = settings.get_string('color') jobject.metadata['icon-color'] = color jobject.metadata['mime_type'] = mime_type jobject.file_path = file_path datastore.write(jobject, transfer_ownership=transfer_ownership) return jobject