You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
6.5 KiB
Python

# Copyright (C) 2016 Abhijit Patel
#
# 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
'''
Provide a PopWindow class for pop-up windows.
Making PopWindow containing Gtk.Toolbar which also contains Gtk.Label
and Toolbutton at the end of the Gtk.Toolbar.
It is possible to change props like size and add more widgets PopWindow
and also to Gtk.Toolbar.
Example:
.. literalinclude: ..sugar/src/jarabe/view/viewsource.py
.. literalinclude: ..sugar/src/jarabe/view/viewhelp.py
'''
from gettext import gettext as _
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GdkX11
from gi.repository import GObject
from sugar3.graphics import style
from sugar3.graphics.toolbutton import ToolButton
from jarabe.model import shell
class PopWindow(Gtk.Window):
"""
UI interface for activity Pop-up Windows.
PopWindows are the windows that open on the top of the current window.
These pop-up windows don't cover the whole screen.
They contain canvas content, alerts messages, a tray and a
toolbar.
FULLSCREEN and HALF_WIDTH for setting size of the window.
Kwargs:
size (int,int): size to be set of the window
window_xid (xlib.Window): xid of the parent window
"""
FULLSCREEN = (Gdk.Screen.width() - style.GRID_CELL_SIZE * 3,
Gdk.Screen.height() - style.GRID_CELL_SIZE * 2)
HALF_WIDTH = ((Gdk.Screen.height() - style.GRID_CELL_SIZE * 3)/2,
(Gdk.Screen.height() - style.GRID_CELL_SIZE * 2))
def __init__(self, window_xid=None, **kwargs):
Gtk.Window.__init__(self, **kwargs)
self._parent_window_xid = window_xid
self.set_decorated(False)
self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
self.set_border_width(style.LINE_WIDTH)
self.set_has_resize_grip(False)
self.props.size = self.FULLSCREEN
self.connect('realize', self.__realize_cb)
self.connect('key-press-event', self.__key_press_event_cb)
self.connect('hide', self.__hide_cb)
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()
# Note:
# Not displaying the pop-up from here instead allowing
# the child class to display the window after modifications
# like chaninging window size, decorating, changing position.
def set_size(self, size):
width, height = size
self.set_size_request(width, height)
size = GObject.Property(type=None, setter=set_size)
def get_title_box(self):
'''
Getter method for title-box
Returns:
self._title_box (): Title or Tool Box
'''
return self._title_box
title_box = GObject.Property(type=str, getter=get_title_box)
def get_vbox(self):
'''
Getter method for canvas
Returns:
self._vbox (Gtk.Box): canvas
'''
return self._vbox
vbox = GObject.Property(type=str, getter=get_vbox)
def __close_button_clicked_cb(self, button):
self.destroy()
def __key_press_event_cb(self, window, event):
keyname = Gdk.keyval_name(event.keyval)
if keyname == 'Escape':
self.destroy()
def __realize_cb(self, widget):
self.set_type_hint(Gdk.WindowTypeHint.DIALOG)
window = self.get_window()
window.set_accept_focus(True)
if self._parent_window_xid is not None:
display = Gdk.Display.get_default()
parent = GdkX11.X11Window.foreign_new_for_display(
display, self._parent_window_xid)
window.set_transient_for(parent)
shell.get_model().push_modal()
def __hide_cb(self, widget):
shell.get_model().pop_modal()
def add_view(self, widget, expand=True, fill=True, padding=0):
'''
Adds child to the vbox.
Args:
widget (Gtk.Widget): widget to be added
expand (bool): True if child is to be given extra space allocated
to vbox.
fill (bool): True if space given to child by the expand option is
actually allocated to child, rather than just padding it.
padding (int): extra space in pixels to put between child and its
neighbors, over and above the global amount specified
by spacing in vbox.
Returns:
None
'''
self._vbox.pack_start(widget, expand, fill, padding)
class TitleBox(Gtk.Toolbar):
'''
Title box at the top of the pop-up window.
Title and close button are added to the box and as needed more widgets
can be added using self.add_widget method.
This box is optional as the inherited class can remove this block by
setting the self._set_title_box to False.
'''
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):
'''
setter function for 'title' property.
Args:
title (str): title for the pop-up window
'''
self._label.set_markup('<b>%s</b>' % title)
self._label.show()
title = GObject.Property(type=str, setter=set_title)