aboutsummaryrefslogtreecommitdiff
path: root/src/toolkit/common.py
blob: 251a2c182a325eea78f49b3dc3480ccab8b0df33 (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
'''
    Common functions
'''
from PyQt5 import QtWidgets
import string
import os
import sys
import subprocess
from collections import OrderedDict


def badName(name):
    '''Returns whether a name contains non-alphanumeric chars'''
    return any([letter in string.punctuation for letter in name])


def alphabetizeDict(dictionary):
    '''Alphabetizes a dict into OrderedDict '''
    return OrderedDict(sorted(dictionary.items(), key=lambda t: t[0]))


def presetToString(dictionary):
    '''Returns string repr of a preset'''
    return repr(alphabetizeDict(dictionary))


def presetFromString(string):
    '''Turns a string repr of OrderedDict into a regular dict'''
    return dict(eval(string))


def appendUppercase(lst):
    for form, i in zip(lst, range(len(lst))):
        lst.append(form.upper())
    return lst


def hideCmdWin(func):
    ''' Stops CMD window from appearing on Windows.
        Adapted from here: http://code.activestate.com/recipes/409002/
    '''
    def decorator(commandList, **kwargs):
        if sys.platform == 'win32':
            startupinfo = subprocess.STARTUPINFO()
            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            kwargs['startupinfo'] = startupinfo
        return func(commandList, **kwargs)
    return decorator


@hideCmdWin
def checkOutput(commandList, **kwargs):
    return subprocess.check_output(commandList, **kwargs)


@hideCmdWin
def openPipe(commandList, **kwargs):
    return subprocess.Popen(commandList, **kwargs)


def disableWhenEncoding(func):
    def decorator(self, *args, **kwargs):
        if self.encoding:
            return
        else:
            return func(self, *args, **kwargs)
    return decorator


def disableWhenOpeningProject(func):
    def decorator(self, *args, **kwargs):
        if self.core.openingProject:
            return
        else:
            return func(self, *args, **kwargs)
    return decorator


def pickColor():
    '''
        Use color picker to get color input from the user,
        and return this as an RGB string and QPushButton stylesheet.
        In a subclass apply stylesheet to any color selection widgets
    '''
    dialog = QtWidgets.QColorDialog()
    dialog.setOption(QtWidgets.QColorDialog.ShowAlphaChannel, True)
    color = dialog.getColor()
    if color.isValid():
        RGBstring = '%s,%s,%s' % (
            str(color.red()), str(color.green()), str(color.blue()))
        btnStyle = "QPushButton{background-color: %s; outline: none;}" \
            % color.name()
        return RGBstring, btnStyle
    else:
        return None, None


def rgbFromString(string):
    '''Turns an RGB string like "255, 255, 255" into a tuple'''
    try:
        tup = tuple([int(i) for i in string.split(',')])
        if len(tup) != 3:
            raise ValueError
        for i in tup:
            if i > 255 or i < 0:
                raise ValueError
        return tup
    except:
        return (255, 255, 255)


def formatTraceback(tb=None):
    import traceback
    if tb is None:
        import sys
        tb = sys.exc_info()[2]
    return 'Traceback:\n%s' % "\n".join(traceback.format_tb(tb))