sugar-toolkit-gtk3/src/sugar3/graphics/style.py

242 lines
7.1 KiB
Python
Raw Normal View History

# Copyright (C) 2007, Red Hat, Inc.
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library 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
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
2015-12-28 01:48:14 +01:00
'''
The style module defines constants for spacing and sizing, as well as
classes for Colors and Fonts. Text rendering is handled by Pango and
colors are inputted by their HTML code (e.g. #FFFFFFFF)
2015-12-28 01:48:14 +01:00
All the constants are expressed in pixels. They are defined for the XO
screen and are usually adapted to different resolution by applying a
zoom factor.
2015-12-28 01:48:14 +01:00
'''
import os
import logging
from gi.repository import Gdk
from gi.repository import Pango
2013-12-26 16:53:36 +01:00
from gi.repository import Gio
2009-08-25 21:12:40 +02:00
2009-08-01 13:27:56 +02:00
FOCUS_LINE_WIDTH = 2
_TAB_CURVATURE = 1
ELLIPSIZE_MODE_DEFAULT = Pango.EllipsizeMode.END
2009-08-25 21:12:40 +02:00
def _compute_zoom_factor():
2015-12-28 01:48:14 +01:00
'''
Calculates zoom factor based on size of screen.
2015-12-28 01:48:14 +01:00
Returns double representing fraction of maximum possible screen size
'''
try:
scaling = int(os.environ.get('SUGAR_SCALING', '100'))
return scaling / 100.0
except ValueError:
logging.error('Invalid SUGAR_SCALING.')
return 1.0
2009-08-25 21:12:40 +02:00
class Font(object):
2015-12-28 01:48:14 +01:00
'''
A font defines the style of how the text should be rendered.
2015-12-28 01:48:14 +01:00
Args:
desc (str): a description of the Font object
'''
def __init__(self, desc):
self._desc = desc
def __str__(self):
2015-12-28 01:48:14 +01:00
'''
Returns description of font
'''
return self._desc
def get_pango_desc(self):
2015-12-28 01:48:14 +01:00
'''
Returns Pango description of font
'''
return Pango.FontDescription(self._desc)
2009-08-25 21:12:40 +02:00
class Color(object):
2015-12-28 01:48:14 +01:00
'''
A Color object defines a specific color.
2015-12-28 01:48:14 +01:00
Args:
color (str): String in the form #FFFFFF representing the color
2015-12-28 01:48:14 +01:00
alpha (double): transparency of color
'''
2007-07-11 12:35:13 +02:00
def __init__(self, color, alpha=1.0):
self._r, self._g, self._b = self._html_to_rgb(color)
self._a = alpha
def get_rgba(self):
2015-12-28 01:48:14 +01:00
'''
Returns 4-tuple of red, green, blue, and alpha levels in range 0-1
'''
return (self._r, self._g, self._b, self._a)
def get_int(self):
2015-12-28 01:48:14 +01:00
'''
Returns color encoded as an int, in the form rgba
'''
return int(self._a * 255) + (int(self._b * 255) << 8) + \
2013-05-18 04:27:04 +02:00
(int(self._g * 255) << 16) + (int(self._r * 255) << 24)
def get_gdk_color(self):
2015-12-28 01:48:14 +01:00
'''
Returns GDK standard color
'''
return Gdk.Color(int(self._r * 65535), int(self._g * 65535),
2013-05-18 04:27:04 +02:00
int(self._b * 65535))
def get_html(self):
2015-12-28 01:48:14 +01:00
'''
Returns string in the standard html Color format (#FFFFFF)
'''
return '#%02x%02x%02x' % (
int(self._r * 255), int(self._g * 255), int(self._b * 255))
def _html_to_rgb(self, html_color):
2015-12-28 01:48:14 +01:00
'''
Converts and returns (r, g, b) tuple in float format from
standard HTML format (#FFFFFF). Colors will be in range 0-1
2015-12-28 01:48:14 +01:00
Args:
html_color (string): html string in the format #FFFFFF
'''
html_color = html_color.strip()
if html_color[0] == '#':
html_color = html_color[1:]
if len(html_color) != 6:
raise ValueError('input #%s is not in #RRGGBB format' % html_color)
r, g, b = html_color[:2], html_color[2:4], html_color[4:]
r, g, b = [int(n, 16) for n in (r, g, b)]
r, g, b = (r / 255.0, g / 255.0, b / 255.0)
return (r, g, b)
def get_svg(self):
2015-12-28 01:48:14 +01:00
'''
Returns HTML formatted color, unless the color is completely
transparent, in which case returns "none"
2015-12-28 01:48:14 +01:00
'''
if self._a == 0.0:
return 'none'
else:
return self.get_html()
2009-08-25 21:12:40 +02:00
def zoom(units):
2015-12-28 01:48:14 +01:00
'''
Returns size of units pixels at current zoom level
2015-12-28 01:48:14 +01:00
Args:
units (int): size of item at full size
'''
return int(ZOOM_FACTOR * units)
2009-08-25 21:12:40 +02:00
ZOOM_FACTOR = _compute_zoom_factor() #: scale factor, as float (eg. 0.72, 1.0)
DEFAULT_SPACING = zoom(15) #: Spacing is placed in-between elements
DEFAULT_PADDING = zoom(6) #: Padding is placed around an element
#: allow elements to tile neatly within boundaries of a grid
#: http://wiki.sugarlabs.org/go/Human_Interface_Guidelines#The_Grid_System
2007-07-31 15:21:09 +02:00
GRID_CELL_SIZE = zoom(75)
LINE_WIDTH = zoom(2) #: Thickness of a separator line
#: icon that fits within a grid cell
STANDARD_ICON_SIZE = zoom(55)
#: small icon, used in palette menu items
SMALL_ICON_SIZE = zoom(33)
#: larger than standard
MEDIUM_ICON_SIZE = zoom(55 * 1.5)
#: larger than medium, used in journal empty view
LARGE_ICON_SIZE = zoom(55 * 2.0)
#: larger than large, used in activity pulsing launcher icon
XLARGE_ICON_SIZE = zoom(55 * 2.75)
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
if 'org.sugarlabs.font' in Gio.Settings.list_schemas():
settings = Gio.Settings('org.sugarlabs.font')
#: User's preferred font size
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
FONT_SIZE = settings.get_double('default-size')
#: User's preferred font face
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
FONT_FACE = settings.get_string('default-face')
else:
#: User's preferred font size
Allow to run activities without Sugar shell. - Handle lack of GSettings gracefully. - Still requires sugar-datastore. - Supports avoiding X11 docks/panels. - Provides icons for Activity windows. Try it outside Sugar. Go to an Activity directory and run 'sugar-activity'. Tested it with Terminal, Finance, Write, Browse, Memorize under XFCE4. Tested in Gnome under OLPC-OS. Also works from Sugar Terminal Activity. Does not affect regular Sugar operation. This is patch v.2 - Addresses most concerns: - Removed commented code, sorry. - Changed code to use profile.get_nickname and get_color where possible. Couldn't the launcher just pass this info? Maybe the launcher could set the activity root as well? - It is intended to be usable from the command line also. Should put sugar version in the environment - It is intended to work even without Sugar Shell installed. Why don't we always set the icon? - On XO it might use some memory. I was concerned to degrade performance. Also, imports should be at the top of the file? - Also a concern about performance on XO. This way it is only loaded in this use case. Maybe it is insignificant -moved as requested. It would be nice if the changes to the POT for sugar-toolkit-gtk3 could be incorporated in this pull request, please. - There were no changes to POT files as part of this patch. Maybe it is worth translating low level command line tools, not sure. Suggest packaged activities might also provide .desktop files. - Intriguing but not sure within scope of this patch. You mean generate a .desktop file automatically as an option? Sounds nice! Suggest sugar-activity might also accept path to unpacked bundle. - Implemented!
2016-04-17 07:57:07 +02:00
FONT_SIZE = 10
#: User's preferred font face
FONT_FACE = 'Sans Serif'
#: Normal font
FONT_NORMAL = Font('%s %f' % (FONT_FACE, FONT_SIZE))
#: Bold font
FONT_BOLD = Font('%s bold %f' % (FONT_FACE, FONT_SIZE))
#: Height in pixels of normal font
FONT_NORMAL_H = zoom(24)
#: Height in pixels of bold font
FONT_BOLD_H = zoom(24)
# old style toolbox design
TOOLBOX_SEPARATOR_HEIGHT = zoom(9)
TOOLBOX_HORIZONTAL_PADDING = zoom(75)
2009-08-01 13:27:56 +02:00
TOOLBOX_TAB_VBORDER = int((zoom(36) - FONT_NORMAL_H - FOCUS_LINE_WIDTH) / 2)
TOOLBOX_TAB_HBORDER = zoom(15) - FOCUS_LINE_WIDTH - _TAB_CURVATURE
TOOLBOX_TAB_LABEL_WIDTH = zoom(150 - 15 * 2)
COLOR_BLACK = Color('#000000') #: Black
COLOR_WHITE = Color('#FFFFFF') #: White
#: Fully transparent color
COLOR_TRANSPARENT = Color('#FFFFFF', alpha=0.0)
#: Default background color of a window
COLOR_PANEL_GREY = Color('#C0C0C0')
#: Background color of selected entry
2007-07-18 14:55:26 +02:00
COLOR_SELECTION_GREY = Color('#A6A6A6')
#: Color of toolbars
COLOR_TOOLBAR_GREY = Color('#282828')
#: Color of buttons
2007-08-16 16:46:21 +02:00
COLOR_BUTTON_GREY = Color('#808080')
#: Fill colour of an inactive button
2007-07-31 14:05:14 +02:00
COLOR_INACTIVE_FILL = Color('#9D9FA1')
#: Stroke colour of an inactive button
2007-07-31 14:05:14 +02:00
COLOR_INACTIVE_STROKE = Color('#757575')
#: Background color of entry
2007-08-24 11:44:44 +02:00
COLOR_TEXT_FIELD_GREY = Color('#E5E5E5')
#: Color of highlighted text
COLOR_HIGHLIGHT = Color('#E7E7E7')
#: Cursor invoked palettes will be placed this far from the cursor
PALETTE_CURSOR_DISTANCE = zoom(10)
#: Size of arrow displayed under toolbar buttons to represent their status
2009-07-30 13:29:52 +02:00
TOOLBAR_ARROW_SIZE = zoom(24)
2014-01-08 14:35:16 +01:00
#: Max width of text in a palette menu, in chars
2014-01-08 14:51:10 +01:00
MENU_WIDTH_CHARS = 60