summaryrefslogtreecommitdiff
path: root/rapid/utilities.py
blob: 07be833eefc2625848c8035e0920d125da56939c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/python
# -*- coding: latin1 -*-

### Copyright (C) 2007 - 2011 Damon Lynch <damonlynch@gmail.com>

### 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import os
import gio
import gtk
from PIL import Image
import distutils.version

def get_full_path(path):
    """ make path relative to home directory if not an absolute path """
    if os.path.isabs(path):
        return path
    else:
        return os.path.join(os.path.expanduser('~'), path)
        
def is_directory(path):
    
    # for some very strange reason, doing it the GIO way fails with
    # unknown type, even for directories!
    return os.path.isdir(path)
    
    if False:
        d = gio.File(path)
        if d.query_exists():
            file_info = d.query_filesystem_info(attributes="standard::type")
            file_type = file_info.get_file_type()
            if file_type == gio.FILE_TYPE_DIRECTORY:
                return True
            
        return False

def format_size_for_user(bytes, zero_string="", with_decimals=True, kb_only=False):
    """Format an int containing the number of bytes into a string suitable for
    printing out to the user.  zero_string is the string to use if bytes == 0.
    source: https://develop.participatoryculture.org/trac/democracy/browser/trunk/tv/portable/util.py?rev=3993
    
    """
    if bytes > (1 << 30) and not kb_only:
        value = (bytes / (1024.0 * 1024.0 * 1024.0))
        if with_decimals:
            format = "%1.1fGB"
        else:
            format = "%dGB"
    elif bytes > (1 << 20) and not kb_only:
        value = (bytes / (1024.0 * 1024.0))
        if with_decimals:
            format = "%1.1fMB"
        else:
            format = "%dMB"
    elif bytes > (1 << 10):
        value = (bytes / 1024.0)
        if with_decimals:
            format = "%1.1fKB"
        else:
            format = "%dKB"
    elif bytes > 1:
        value = bytes
        if with_decimals:
            format = "%1.1fB"
        else:
            format = "%dB"
    else:
        return zero_string
    return format % value

def register_iconsets(icon_info):
    """
    Register icons in the icon set if they're not already used
    
    From http://faq.pygtk.org/index.py?req=show&file=faq08.012.htp
    """
    
    icon_factory = gtk.IconFactory()
    stock_ids = gtk.stock_list_ids()
    for stock_id, file in icon_info:
        # only load image files when our stock_id is not present
        if stock_id not in stock_ids:
            pixbuf = gtk.gdk.pixbuf_new_from_file(file)
            iconset = gtk.IconSet(pixbuf)
            icon_factory.add(stock_id, iconset)
    icon_factory.add_default()

def escape(s):
    """
    Replace special characters by SGML entities.
    """
    entities = ("&&amp;", "<&lt;", ">&gt;")
    for e in entities:
        s = s.replace(e[0], e[1:])
    return s

def image_to_pixbuf(image):
    # convert PIL image to pixbuf
    # this one handles transparency, unlike the default example in the pygtk FAQ
    # this is also from the pygtk FAQ
    IS_RGBA = image.mode=='RGBA'
    return gtk.gdk.pixbuf_new_from_data(
            image.tostring(), # data
            gtk.gdk.COLORSPACE_RGB, # color mode
            IS_RGBA, # has alpha
            8, # bits
            image.size[0], # width
            image.size[1], # height
            (IS_RGBA and 4 or 3) * image.size[0] # rowstride
            ) 

def pixbuf_to_image(pb):
    assert(pb.get_colorspace() == gtk.gdk.COLORSPACE_RGB)
    dimensions = pb.get_width(), pb.get_height()
    stride = pb.get_rowstride()
    pixels = pb.get_pixels()

    mode = pb.get_has_alpha() and "RGBA" or "RGB"
    image = Image.frombuffer(mode, dimensions, pixels,
                            "raw", mode, stride, 1)
                            
    if mode == "RGB":
        # convert to having an alpha value, so that the image can
        # act as a mask in the drop shadow paste 
        image = image.convert("RGBA")

    return image
    
def pythonify_version(v):
    """ makes version number a version number in distutils sense"""
    return distutils.version.StrictVersion(v.replace( '~',''))
    
def human_readable_version(v):
    """ returns a version in human readable form"""
    v = v.replace('~a', ' alpha ')
    v = v.replace('~b', ' beta ')
    return v