summaryrefslogtreecommitdiff
path: root/rapid/common.py
blob: a55d835b4a01684974fa4ea3ba49c7c65117330e (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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
#!/usr/bin/python
# -*- coding: latin1 -*-

### Copyright (C) 2007-09 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 sys
import gc
import distutils.version
import gtk.gdk as gdk
import gtk
try:
    import gio
except:
    pass

import config

import locale
import gettext

class Configi18n:
    """ Setup translation
    
    Adapated from code example of Mark Mruss http://www.learningpython.com.
    Unlike his example, this code uses a local locale directory only if the environment
    variable LOCALEDIR has been set to some or other value.
    """
    
    # Do not put this code block in __init__, because it needs to be run only once

    # if the evironment value 'LOCAELDIR' is set, then use this as the source of translation data
    # otherwise, rely on the system-wide data
    locale_path = os.environ.get('LOCALEDIR', None)
    
    # Init the list of languages to support
    langs = []
    #Check the default locale
    lc, encoding = locale.getdefaultlocale()
    if (lc):
        #If we have a default, it's the first in the list
        langs = [lc]
        # Now let's get all of the supported languages on the system
        language = os.environ.get('LANGUAGE', None)
        if (language):
            # langage comes back something like en_CA:en_US:en_GB:en
            langs += language.split(":")
            
    # add on to the back of the list the translations that we know that we have, our defaults
    langs += ["en_US"]

    # Now langs is a list of all of the languages that we are going
    # to try to use.  First we check the default, then what the system
    # told us, and finally the 'known' list

    gettext.bindtextdomain(config.APP_NAME, locale_path)
    gettext.textdomain(config.APP_NAME)
    # Get the language to use
    lang = gettext.translation(config.APP_NAME, locale_path, languages=langs, fallback = True)
    # Install the language, map _() (which we marked our
    # strings to translate with) to self.lang.gettext() which will
    # translate them.
    _ = lang.gettext


def pythonifyVersion(v):
    """ makes version number a version number in distutils sense"""
    return distutils.version.StrictVersion(v.replace( '~',''))

def getFullProgramName():
    """ return the full name of the process running """
    return os.path.basename(sys.argv[0])

def getProgramName():
    """ return the name of the process running, removing the .py extension if it exists """
    programName = getFullProgramName()
    if programName.find('.py') > 0:
        programName = programName[:programName.find('.py')]
    return programName

def splitDirectories(directories):
    """ split directories specified in string into a list """
    if directories.find(',') > 0:
        d  = directories.split(',')
    else:
        d = directories.split()
    directories = []
    for i in d:
        directories.append(i.strip())
    return directories



def getFullPath(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 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 formatSizeForUser(bytes, zeroString="", withDecimals=True, kbOnly=False):
    """Format an int containing the number of bytes into a string suitable for
    printing out to the user.  zeroString 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 kbOnly:
        value = (bytes / (1024.0 * 1024.0 * 1024.0))
        if withDecimals:
            format = "%1.1fGB"
        else:
            format = "%dGB"
    elif bytes > (1 << 20) and not kbOnly:
        value = (bytes / (1024.0 * 1024.0))
        if withDecimals:
            format = "%1.1fMB"
        else:
            format = "%dMB"
    elif bytes > (1 << 10):
        value = (bytes / 1024.0)
        if withDecimals:
            format = "%1.1fKB"
        else:
            format = "%dKB"
    elif bytes > 1:
        value = bytes
        if withDecimals:
            format = "%1.1fB"
        else:
            format = "%dB"
    else:
        return zeroString
    return format % value
    
def scale2pixbuf(width_max, height_max, pixbuf, return_size=False):
    """
    Scale to width_max and height_max.
    Keep aspect ratio.
    Code adapted from gthumpy, by guettli
    """
    
    width_orig = float(pixbuf.get_width())
    height_orig = float(pixbuf.get_height())
    if (width_orig / width_max) > (height_orig / height_max):
        height = int((height_orig / width_orig) * width_max)
        width = width_max
    else:
        width = int((width_orig / height_orig) * height_max)
        height=height_max

    pixbuf = pixbuf.scale_simple(width, height, gdk.INTERP_BILINEAR)
    gc.collect() # Tell Python to clean up the memory
    if return_size:
        return pixbuf, width_orig, height_orig
    return pixbuf

def get_icon_pixbuf(using_gio, icon, size, fallback='gtk-harddisk'):
    """ returns icon for the volume, or None if not available"""
    
    icontheme = gtk.icon_theme_get_default()        

    if using_gio:
        f = None
        if isinstance(icon, gio.ThemedIcon):
            try:
                # on some user's systems, themes do not have icons associated with them
                iconinfo = icontheme.choose_icon(icon.get_names(), size, gtk.ICON_LOOKUP_USE_BUILTIN)
                f = iconinfo.get_filename()
                v = gtk.gdk.pixbuf_new_from_file_at_size(f, size, size)
            except:
                f = None                
        if not f:
            v = icontheme.load_icon(fallback, size, gtk.ICON_LOOKUP_USE_BUILTIN)
    else:
        v = icontheme.load_icon(icon, size, gtk.ICON_LOOKUP_USE_BUILTIN)
    return v

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
    """
    
    iconfactory = 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)
            iconfactory.add(stock_id, iconset)
    iconfactory.add_default()

  

    
if __name__ == '__main__':
    i = Configi18n()
    _ = i._
    print _("hello world")