| # Copyright (C) 2015 Patrick Griffis <tingping@tingping.se> | |
| # Copyright (C) 2014 Christian Hergert <christian@hergert.me> | |
| # | |
| # 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 3 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 warranties of | |
| # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see <http://www.gnu.org/licenses/>. | |
| from gi.repository import GObject, Gtk | |
| class ScrolledWindow(Gtk.ScrolledWindow): | |
| """ | |
| ScrolledWindow that sets a max size for the child to grow into. | |
| Taken from the Gnome Builder project: | |
| https://git.gnome.org/browse/gnome-builder/tree/contrib/egg/egg-scrolled-window.c | |
| """ | |
| __gtype_name__ = "EggScrolledWindow" | |
| max_content_height = GObject.Property(type=int, default=-1, nick="Max Content Height", | |
| blurb="The maximum height request that can be made") | |
| max_content_width = GObject.Property(type=int, default=-1, nick="Max Content Width", | |
| blurb="The maximum width request that can be made") | |
| def __init__(self, *args, **kwargs): | |
| super().__init__(*args, **kwargs) | |
| self.connect_after("notify::max-content-height", lambda obj, param: self.queue_resize()) | |
| self.connect_after("notify::max-content-width", lambda obj, param: self.queue_resize()) | |
| def set_max_content_height(self, value): | |
| self.max_content_height = value | |
| def set_max_content_width(self, value): | |
| self.max_content_width = value | |
| def get_max_content_height(self): | |
| return self.max_content_height | |
| def get_max_content_width(self): | |
| return self.max_content_width | |
| def do_get_preferred_height(self): | |
| min_height, natural_height = Gtk.ScrolledWindow.do_get_preferred_height(self) | |
| child = self.get_child() | |
| if natural_height and self.max_content_height > -1 and child: | |
| style = self.get_style_context() | |
| border = style.get_border(style.get_state()) | |
| additional = border.top + border.bottom | |
| child_min_height, child_nat_height = child.get_preferred_height() | |
| if child_nat_height > natural_height and self.max_content_height > natural_height: | |
| natural_height = min(self.max_content_height, child_nat_height) + additional; | |
| return min_height, natural_height | |
| def do_get_preferred_width(self): | |
| min_width, natural_width = Gtk.ScrolledWindow.do_get_preferred_width(self) | |
| child = self.get_child() | |
| if natural_width and self.max_content_width > -1 and child: | |
| style = self.get_style_context() | |
| border = style.get_border(style.get_state()) | |
| additional = border.left + border.right + 1 | |
| child_min_width, child_nat_width = child.get_preferred_width() | |
| if child_nat_width > natural_width and self.max_content_width > natural_width: | |
| natural_width = min(self.max_content_width, child_nat_width) + additional; | |
| return min_width, natural_width |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment