# Copyright (C) 2006-2007 Red Hat, Inc.
# Copyright (C) 2009 Tomeu Vizoso, Simon Schampijer
# Copyright (C) 2009-2012 One Laptop per Child
# Copyright (C) 2010 Collabora Ltd.
# Copyright (C) 2012 Daniel Francis
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
from gettext import gettext as _
import logging
from gi.repository import Gtk
from gi.repository import GObject
from sugar3.graphics import style
from sugar3.graphics import iconentry
from sugar3.graphics.radiotoolbutton import RadioToolButton
from jarabe.desktop import favoritesview
_AUTOSEARCH_TIMEOUT = 1000
_FAVORITES_VIEW = 0
_SCHOOL_VIEW = 1
_LIST_VIEW = 2
class ViewToolbar(Gtk.Toolbar):
__gtype_name__ = 'SugarViewToolbar'
__gsignals__ = {
'query-changed': (GObject.SignalFlags.RUN_FIRST, None,
([str])),
'view-changed': (GObject.SignalFlags.RUN_FIRST, None,
([object])),
}
def __init__(self):
Gtk.Toolbar.__init__(self)
self._query = None
self._autosearch_timer = None
self._add_separator()
tool_item = Gtk.ToolItem()
self.insert(tool_item, -1)
tool_item.show()
self.search_entry = iconentry.IconEntry()
self.search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
'system-search')
self.set_placeholder_text_for_view(_('Home'))
self.search_entry.add_clear_button()
self.search_entry.set_width_chars(25)
self.search_entry.connect('activate', self._entry_activated_cb)
self.search_entry.connect('changed', self._entry_changed_cb)
tool_item.add(self.search_entry)
self.search_entry.show()
self._add_separator(expand=True)
self._favorites_button = FavoritesButton()
self._favorites_button.connect('toggled',
self.__view_button_toggled_cb,
_FAVORITES_VIEW)
self.insert(self._favorites_button, -1)
self._school_button = SchoolButton()
self._school_button.props.group = self._favorites_button
self._school_button.connect('toggled',
self.__view_button_toggled_cb,
_SCHOOL_VIEW)
self.insert(self._school_button, -1)
self._list_button = RadioToolButton(icon_name='view-list')
self._list_button.props.group = self._favorites_button
self._list_button.props.tooltip = _('List view')
self._list_button.props.accelerator = _('2')
self._list_button.connect('toggled', self.__view_button_toggled_cb,
_LIST_VIEW)
self.insert(self._list_button, -1)
self._add_separator()
def show_view_buttons(self):
self._favorites_button.show()
self._school_button.show()
self._list_button.show()
def hide_view_buttons(self):
self._favorites_button.hide()
self._school_button.hide()
self._list_button.hide()
def clear_query(self):
self.search_entry.props.text = ''
def set_placeholder_text_for_view(self, view_name):
text = _('Search in %s') % view_name
self.search_entry.set_placeholder_text(text)
def _add_separator(self, expand=False):
separator = Gtk.SeparatorToolItem()
separator.props.draw = False
if expand:
separator.set_expand(True)
else:
separator.set_size_request(style.GRID_CELL_SIZE,
style.GRID_CELL_SIZE)
self.insert(separator, -1)
separator.show()
def _entry_activated_cb(self, entry):
if self._autosearch_timer:
GObject.source_remove(self._autosearch_timer)
new_query = entry.props.text
if self._query != new_query:
self._query = new_query
self.emit('query-changed', self._query)
def _entry_changed_cb(self, entry):
if not entry.props.text:
entry.activate()
return
if self._autosearch_timer:
GObject.source_remove(self._autosearch_timer)
self._autosearch_timer = GObject.timeout_add(_AUTOSEARCH_TIMEOUT,
self._autosearch_timer_cb)
def _autosearch_timer_cb(self):
logging.debug('_autosearch_timer_cb')
self._autosearch_timer = None
self.search_entry.activate()
return False
def __view_button_toggled_cb(self, button, view):
if button.props.active:
self.emit('view-changed', view)
class FavoritesButton(RadioToolButton):
__gtype_name__ = 'SugarFavoritesButton'
def __init__(self):
RadioToolButton.__init__(self)
self.props.tooltip = _('Favorites view')
self.props.accelerator = _('1')
self.props.group = None
self.props.icon_name = 'gtk-home'
favorites_settings = favoritesview.get_settings()
self._layout = favorites_settings.layout
self._update_icon()
# someday, this will be a Gtk.Table()
layouts_grid = Gtk.HBox()
layout_item = None
for layoutid, layoutclass in sorted(favoritesview.LAYOUT_MAP.items()):
layout_item = RadioToolButton(icon_name=layoutclass.icon_name,
group=layout_item, active=False)
if layoutid == self._layout:
layout_item.set_active(True)
layouts_grid.pack_start(layout_item, True, False, 0)
layout_item.connect('toggled', self.__layout_activate_cb,
layoutid)
layouts_grid.show_all()
self.props.palette.set_content(layouts_grid)
def __layout_activate_cb(self, menu_item, layout):
if not menu_item.get_active():
return
if self._layout == layout and self.props.active:
return
if self._layout != layout:
self._layout = layout
self._update_icon()
favorites_settings = favoritesview.get_settings()
favorites_settings.layout = layout
if not self.props.active:
self.props.active = True
else:
self.emit('toggled')
def _update_icon(self):
pass
# self.props.icon_name = favoritesview.LAYOUT_MAP[self._layout].icon_name
class SchoolButton(RadioToolButton):
__gtype_name__ = 'SugarSchoolButton'
def __init__(self):
RadioToolButton.__init__(self)
self.props.icon_name = 'school-server'
self.props.tooltip = _('School favorites')
self.props.accelerator = _('I')
self.props.group = None
favorites_settings = favoritesview.get_settings()
self._layout = favorites_settings.layout
self._update_icon()
# someday, this will be a Gtk.Table()
layouts_grid = Gtk.HBox()
layout_item = None
for layoutid, layoutclass in sorted(favoritesview.LAYOUT_MAP.items()):
layout_item = RadioToolButton(icon_name=layoutclass.icon_name,
group=layout_item, active=False)
if layoutid == self._layout:
layout_item.set_active(True)
layouts_grid.pack_start(layout_item, True, False, 0)
layout_item.connect('toggled', self.__layout_activate_cb,
layoutid)
layouts_grid.show_all()
self.props.palette.set_content(layouts_grid)
def __layout_activate_cb(self, menu_item, layout):
if not menu_item.get_active():
return
if self._layout == layout and self.props.active:
return
if self._layout != layout:
self._layout = layout
self._update_icon()
favorites_settings = favoritesview.get_settings()
favorites_settings.layout = layout
if not self.props.active:
self.props.active = True
else:
self.emit('toggled')
def _update_icon(self):
pass
#self.props.icon_name = favoritesview.LAYOUT_MAP[self._layout].icon_name