Merge branch 'master' of git+ssh://dev.laptop.org/git/sugar

This commit is contained in:
Sayamindu Dasgupta 2007-11-27 21:57:32 +05:30
commit 0225360178
11 changed files with 234 additions and 47 deletions

3
NEWS
View File

@ -1,3 +1,6 @@
* #4941: Add menu entry with dialog to show About this XO (erikos)
* #5089: show frame shortly when adding object to clipboard (erikos)
* #5097: Fix pasting text between activities through the clipboard. (tomeu)
* #4660: Use improved PS API which streamlines ShareActivity process (smcv)
0.70.1

View File

@ -504,12 +504,16 @@ class Activity(Window, gtk.Container):
self.save()
elif pspec.name == 'max-participants':
self._max_participants = value
else:
Window.do_set_property(self, pspec, value)
def do_get_property(self, pspec):
if pspec.name == 'active':
return self._active
elif pspec.name == 'max-participants':
return self._max_participants
else:
return Window.do_get_property(self, pspec)
def get_id(self):
"""Returns the activity id of the current instance of your activity.

View File

@ -474,7 +474,7 @@ class Palette(gtk.Window):
if self._group_id:
group = palettegroup.get_group(self._group_id)
if group and group.is_up():
self._set_state(group.get_state())
self._set_state(self.PRIMARY)
immediate = True
group.popdown()
@ -686,12 +686,19 @@ class WidgetInvoker(Invoker):
widget.connect('leave-notify-event', self._leave_notify_event_cb)
def get_rect(self):
x, y = self._widget.window.get_origin()
allocation = self._widget.get_allocation()
if self._widget.window is not None:
x, y = self._widget.window.get_origin()
else:
logging.warning(
"Trying to position palette with invoker that's not realized.")
x = 0
y = 0
if self._widget.flags() & gtk.NO_WINDOW:
x += allocation.x
y += allocation.y
x += allocation.x
y += allocation.y
width = allocation.width
height = allocation.height

View File

@ -15,12 +15,73 @@
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
import gobject
import gtk
import logging
from sugar.graphics.icon import Icon
class UnfullscreenButton(gtk.Window):
class Window(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
self.set_decorated(False)
self.set_resizable(False)
self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
self.set_border_width(0)
self.props.accept_focus = False
#Setup estimate of width, height
w, h = gtk.icon_size_lookup(gtk.ICON_SIZE_LARGE_TOOLBAR)
self._width = w
self._height = h
self.connect('size-request', self._size_request_cb)
screen = self.get_screen()
screen.connect('size-changed', self._screen_size_changed_cb)
self._button = gtk.Button()
self._button.set_relief(gtk.RELIEF_NONE)
self._icon = Icon(icon_name='view-return',
icon_size=gtk.ICON_SIZE_LARGE_TOOLBAR)
self._icon.show()
self._button.add(self._icon)
self._button.show()
self.add(self._button)
def connect_button_press(self, cb):
self._button.connect('button-press-event', cb)
def _reposition(self):
x = gtk.gdk.screen_width() - self._width
self.move(x, 0)
def _size_request_cb(self, widget, req):
self._width = req.width
self._height = req.height
self._reposition()
def _screen_size_changed_cb(self, screen):
self._reposition()
class Window(gtk.Window):
__gproperties__ = {
'enable-fullscreen-mode': (bool, None, None, True,
gobject.PARAM_READWRITE),
}
def __init__(self, **args):
self._enable_fullscreen_mode = True
gtk.Window.__init__(self, **args)
self.connect('realize', self.__window_realize_cb)
self.connect('window-state-event', self.__window_state_event_cb)
self.connect('key-press-event', self.__key_press_cb)
@ -42,6 +103,24 @@ class Window(gtk.Window):
self.add(self._vbox)
self._vbox.show()
self._is_fullscreen = False
self._unfullscreen_button = UnfullscreenButton()
self._unfullscreen_button.set_transient_for(self)
self._unfullscreen_button.connect_button_press(
self.__unfullscreen_button_pressed)
def do_get_property(self, prop):
if prop.name == 'enable-fullscreen-mode':
return self._enable_fullscreen_mode
else:
return gtk.Window.do_get_property(self, prop)
def do_set_property(self, prop, val):
if prop.name == 'enable-fullscreen-mode':
self._enable_fullscreen_mode = val
else:
gtk.Window.do_set_property(self, prop, val)
def set_canvas(self, canvas):
if self.canvas:
self._event_box.remove(self.canvas)
@ -102,20 +181,40 @@ class Window(gtk.Window):
window.window.set_group(group.window)
def __window_state_event_cb(self, window, event):
if not (event.changed_mask & gtk.gdk.WINDOW_STATE_FULLSCREEN):
return False
if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
if self.toolbox is not None:
self.toolbox.hide()
if self.tray is not None:
self.tray.hide()
elif event.new_window_state == 0:
self._is_fullscreen = True
if self.props.enable_fullscreen_mode:
self._unfullscreen_button.show()
else:
if self.toolbox is not None:
self.toolbox.show()
if self.tray is not None:
self.tray.show()
self._is_fullscreen = False
if self.props.enable_fullscreen_mode:
self._unfullscreen_button.hide()
def __key_press_cb(self, widget, event):
key = gtk.gdk.keyval_name(event.keyval)
if event.state & gtk.gdk.MOD1_MASK:
if gtk.gdk.keyval_name(event.keyval) == 'space':
if key == 'space':
self.tray.props.visible = not self.tray.props.visible
return True
elif key == 'Escape' and self._is_fullscreen and \
self.props.enable_fullscreen_mode:
self.unfullscreen()
return True
return False
def __unfullscreen_button_pressed(self, widget, event):
self.unfullscreen()

View File

@ -198,7 +198,7 @@ class Shell(gobject.GObject):
new_level = model.props.zoom_level
if new_level == ShellModel.ZOOM_HOME:
self._frame.show(Frame.MODE_HOME)
self._frame.show(Frame.MODE_NON_INTERACTIVE)
if self._zoom_level == ShellModel.ZOOM_HOME:
self._frame.hide()

View File

@ -44,6 +44,8 @@ class ClipboardIcon(RadioToolButton):
self._preview = None
self._activity = None
self.owns_clipboard = False
self.props.sensitive = False
self.props.active = False
self._icon = Icon()
self._icon.props.xo_color = profile.get_color()
@ -80,6 +82,10 @@ class ClipboardIcon(RadioToolButton):
def _put_in_clipboard(self):
logging.debug('ClipboardIcon._put_in_clipboard')
if self._percent < 100:
raise ValueError('Object is not complete, cannot be put into the clipboard.')
targets = self._get_targets()
if targets:
clipboard = gtk.Clipboard()
@ -125,14 +131,19 @@ class ClipboardIcon(RadioToolButton):
self.child.drag_source_set_icon_name(self._icon.props.icon_name)
self._name = name
self._percent = percent
self._preview = preview
self._activity = activity
self.palette.set_state(name, percent, preview, activity,
self._is_bundle(obj['FORMATS']))
if self.props.active:
self._put_in_clipboard()
old_percent = self._percent
self._percent = percent
if self._percent == 100:
self.props.sensitive = True
# Clipboard object became complete. Make it the active one.
if old_percent < 100 and self._percent == 100:
self.props.active = True
def _notify_active_cb(self, widget, pspec):
if self.props.active:

View File

@ -62,7 +62,6 @@ class ClipboardBox(hippo.CanvasBox):
hippo.CanvasBox.__init__(self)
self._icons = {}
self._context_map = _ContextMap()
self._selected_icon = None
self._tray = VTray()
self.append(hippo.CanvasWidget(widget=self._tray), hippo.PACK_EXPAND)
@ -109,17 +108,10 @@ class ClipboardBox(hippo.CanvasBox):
icon = ClipboardIcon(object_id, name, group)
self._tray.add_item(icon, 0)
icon.show()
self._set_icon_selected(icon)
self._icons[object_id] = icon
logging.debug('ClipboardBox: ' + object_id + ' was added.')
def _set_icon_selected(self, icon):
logging.debug('_set_icon_selected')
icon.props.active = True
self._selected_icon = icon
def _object_deleted_cb(self, cb_service, object_id):
icon = self._icons[object_id]
self._tray.remove_item(icon)

View File

@ -59,29 +59,35 @@ class ClipboardPanelWindow(FrameWindow):
targets = clipboard.wait_for_targets()
for target in targets:
if target not in ('TIMESTAMP', 'TARGETS', 'MULTIPLE', 'SAVE_TARGETS'):
logging.debug('Asking for target %s.' % target)
selection = clipboard.wait_for_contents(target)
if selection:
self._add_selection(key, selection)
if not selection:
logging.warning('no data for selection target %s.' % target)
continue
self._add_selection(key, selection)
cb_service.set_object_percent(key, percent=100)
def _add_selection(self, key, selection):
if selection.data:
logging.debug('adding type ' + selection.type + '.')
if not selection.data:
logging.warning('no data for selection target %s.' % selection.type)
return
cb_service = clipboardservice.get_instance()
if selection.type == 'text/uri-list':
uris = selection.data.split('\n')
if len(uris) > 1:
raise NotImplementedError('Multiple uris in text/uri-list still not supported.')
logging.debug('adding type ' + selection.type + '.')
cb_service.add_object_format(key,
selection.type,
uris[0],
on_disk=True)
else:
cb_service.add_object_format(key,
selection.type,
selection.data,
on_disk=False)
cb_service = clipboardservice.get_instance()
if selection.type == 'text/uri-list':
uris = selection.data.split('\n')
if len(uris) > 1:
raise NotImplementedError('Multiple uris in text/uri-list still not supported.')
cb_service.add_object_format(key,
selection.type,
uris[0],
on_disk=True)
else:
cb_service.add_object_format(key,
selection.type,
selection.data,
on_disk=False)

View File

@ -85,7 +85,7 @@ class _KeyListener(object):
class Frame(object):
MODE_MOUSE = 0
MODE_KEYBOARD = 1
MODE_HOME = 2
MODE_NON_INTERACTIVE = 2
def __init__(self, shell):
self.mode = None
@ -239,7 +239,7 @@ class Frame(object):
def _clipboard_object_added_cb(self, cb_service, object_id, name):
if not self.visible:
self.show()
self.show(self.MODE_NON_INTERACTIVE)
gobject.timeout_add(2000, lambda: self.hide())
def _enter_notify_cb(self, window, event):

View File

@ -15,9 +15,10 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import os
import logging
import signal
import math
from gettext import gettext as _
import re
import gobject
import gtk
@ -26,9 +27,7 @@ import dbus
from hardware import hardwaremanager
from sugar.graphics import style
from sugar.graphics.xocolor import XoColor
from sugar.graphics.palette import Palette, CanvasInvoker
from sugar.graphics.icon import CanvasIcon
from sugar.graphics.palette import Palette
from sugar.profile import get_profile
from sugar import env
@ -38,6 +37,8 @@ from view.home.MyIcon import MyIcon
from model.shellmodel import ShellModel
from hardware import schoolserver
_logger = logging.getLogger('HomeBox')
class HomeBox(hippo.CanvasBox, hippo.CanvasItem):
__gtype_name__ = 'SugarHomeBox'
@ -171,6 +172,11 @@ class _MyIcon(MyIcon):
palette.menu.append(item)
item.show()
item = gtk.MenuItem(_('About this XO'))
item.connect('activate', self._about_activate_cb)
palette.menu.append(item)
item.show()
self.set_palette(palette)
def _reboot_activate_cb(self, menuitem):
@ -206,6 +212,65 @@ class _MyIcon(MyIcon):
if self._profile.is_registered():
self.get_palette().menu.remove(menuitem)
def _about_activate_cb(self, menuitem):
dialog = gtk.Dialog(_('About this XO'),
self.palette,
gtk.DIALOG_MODAL |
gtk.DIALOG_DESTROY_WITH_PARENT,
(gtk.STOCK_OK, gtk.RESPONSE_OK))
not_available = _('Not available')
build = self._read_file('/boot/olpc_build')
if build is None:
build = not_available
label_build = gtk.Label('Build: %s' % build)
label_build.set_alignment(0, 0.5)
label_build.show()
dialog.vbox.pack_start(label_build)
firmware = self._read_file('/ofw/openprom/model')
if firmware is None:
firmware = not_available
else:
firmware = re.split(" +", firmware)
if len(firmware) == 3:
firmware = firmware[1]
label_firmware = gtk.Label('Firmware: %s' % firmware)
label_firmware.set_alignment(0, 0.5)
label_firmware.show()
dialog.vbox.pack_start(label_firmware)
serial = self._read_file('/ofw/serial-number')
if serial is None:
serial = not_available
label_serial = gtk.Label('Serial Number: %s' % serial)
label_serial.set_alignment(0, 0.5)
label_serial.show()
dialog.vbox.pack_start(label_serial)
dialog.set_default_response(gtk.RESPONSE_OK)
dialog.connect('response', self._response_cb)
dialog.show()
def _read_file(self, path):
if os.access(path, os.R_OK) == 0:
_logger.error('read_file() No such file or directory: %s', path)
return None
fd = open(path, 'r')
value = fd.read()
fd.close()
if value:
value = value.strip('\n')
return value
else:
_logger.error('read_file() No information in file or directory: %s', path)
return None
def _response_cb(self, widget, response_id):
if response_id == gtk.RESPONSE_OK:
widget.destroy()
def _close_emulator(self):
if os.environ.has_key('SUGAR_EMULATOR_PID'):
pid = int(os.environ['SUGAR_EMULATOR_PID'])

View File

@ -101,7 +101,7 @@ class ActivityIcon(CanvasIcon):
palette.set_primary_text(self._activity.get_title())
resume_menu_item = MenuItem(_('Resume'), 'zoom-activity')
resume_menu_item = MenuItem(_('Resume'), 'activity-start')
resume_menu_item.connect('activate', self._resume_activate_cb)
palette.menu.append(resume_menu_item)
resume_menu_item.show()