diff --git a/src/sugar3/graphics/Makefile.am b/src/sugar3/graphics/Makefile.am index 0621750e..e5fdf09a 100644 --- a/src/sugar3/graphics/Makefile.am +++ b/src/sugar3/graphics/Makefile.am @@ -16,6 +16,7 @@ sugar_PYTHON = \ palettemenu.py \ palettewindow.py \ panel.py \ + popwindow.py \ radiopalette.py \ radiotoolbutton.py \ scrollingdetector.py \ diff --git a/src/sugar3/graphics/popwindow.py b/src/sugar3/graphics/popwindow.py new file mode 100644 index 00000000..5a4a4d9e --- /dev/null +++ b/src/sugar3/graphics/popwindow.py @@ -0,0 +1,202 @@ +# 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('%s' % title) + self._label.show() + + title = GObject.Property(type=str, setter=set_title)