90 lines
4.0 KiB
Python
90 lines
4.0 KiB
Python
|
# -*- coding:utf-8 -*-
|
||
|
# 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")
|
||
|
min_content_height = GObject.Property(type=int, default=-1, nick="Min Content Height",
|
||
|
blurb="The minimum height 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_min_content_height(self, value):
|
||
|
self.min_content_height = value
|
||
|
|
||
|
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
|
||
|
elif natural_height > child_nat_height:
|
||
|
if child_nat_height < self.min_content_height:
|
||
|
return self.min_content_height, self.min_content_height
|
||
|
min_height, natural_height = child_min_height + additional, 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
|