aboutsummaryrefslogtreecommitdiff
path: root/src/toolkit/common.py
blob: 5d424e0f112f8b1aca31a3a1fd0f14cda0b57c5f (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
'''
    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 pipeWrapper(func):
    '''A decorator to insert proper kwargs into Popen objects.'''
    def pipeWrapper(commandList, **kwargs):
        if sys.platform == 'win32':
            # Stop CMD window from appearing on Windows
            startupinfo = subprocess.STARTUPINFO()
            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
            kwargs['startupinfo'] = startupinfo

        if 'bufsize' not in kwargs:
            kwargs['bufsize'] = 10**8
        if 'stdin' not in kwargs:
            kwargs['stdin'] = subprocess.DEVNULL
        return func(commandList, **kwargs)
    return pipeWrapper


@pipeWrapper
def checkOutput(commandList, **kwargs):
    return subprocess.check_output(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))