Skip to content

Commit 613566f

Browse files
committed
Refactor scripting code.
Rewrite Lua bindings and initialization scripts. Rewrite layout and converter definition and usage code.
1 parent 84f1a20 commit 613566f

File tree

152 files changed

+4004
-3993
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

152 files changed

+4004
-3993
lines changed

SConscript

+34-41
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
11
#!/usr/bin/env python
2-
3-
import os
4-
import string
5-
import sys
6-
2+
import os, string, sys
73
from tools.gpick import *
84

9-
env = GpickEnvironment(ENV=os.environ, BUILDERS = {'WriteNsisVersion' : Builder(action = WriteNsisVersion, suffix = ".nsi")})
5+
env = GpickEnvironment(ENV = os.environ, BUILDERS = {'WriteNsisVersion': Builder(action = WriteNsisVersion, suffix = ".nsi")})
106

117
vars = Variables(os.path.join(env.GetLaunchDir(), 'user-config.py'))
128
vars.Add('DESTDIR', 'Directory to install under', '/usr/local')
@@ -50,7 +46,7 @@ env.GetVersionInfo()
5046

5147
try:
5248
umask = os.umask(022)
53-
except OSError: # ignore on systems that don't support umask
49+
except OSError: # ignore on systems that don't support umask
5450
pass
5551

5652
if os.environ.has_key('CC'):
@@ -69,29 +65,27 @@ if not env.GetOption('clean'):
6965

7066
programs = {}
7167
if env['ENABLE_NLS']:
72-
programs['GETTEXT'] = {'checks':{'msgfmt':'GETTEXT'}}
73-
programs['XGETTEXT'] = {'checks':{'xgettext':'XGETTEXT'}, 'required':False}
74-
programs['MSGMERGE'] = {'checks':{'msgmerge':'MSGMERGE'}, 'required':False}
75-
programs['MSGCAT'] = {'checks':{'msgcat':'MSGCAT'}, 'required':False}
76-
programs['RAGEL'] = {'checks':{'ragel':'RAGEL'}}
68+
programs['GETTEXT'] = {'checks':{'msgfmt': 'GETTEXT'}}
69+
programs['XGETTEXT'] = {'checks':{'xgettext': 'XGETTEXT'}, 'required': False}
70+
programs['MSGMERGE'] = {'checks':{'msgmerge': 'MSGMERGE'}, 'required': False}
71+
programs['MSGCAT'] = {'checks':{'msgcat': 'MSGCAT'}, 'required': False}
72+
programs['RAGEL'] = {'checks':{'ragel': 'RAGEL'}}
7773
if env['EXPERIMENTAL_CSS_PARSER'] and not env['PREBUILD_GRAMMAR']:
78-
programs['LEMON'] = {'checks':{'lemon':'LEMON'}}
79-
programs['FLEX'] = {'checks':{'flex':'FLEX'}}
74+
programs['LEMON'] = {'checks':{'lemon': 'LEMON'}}
75+
programs['FLEX'] = {'checks':{'flex': 'FLEX'}}
8076
env.ConfirmPrograms(conf, programs)
8177

8278
libs = {}
8379

8480
if not env['TOOLCHAIN'] == 'msvc':
8581
if not env['USE_GTK3']:
86-
libs['GTK_PC'] = {'checks':{'gtk+-2.0':'>= 2.24.0'}}
87-
libs['GIO_PC'] = {'checks':{'gio-unix-2.0':'>= 2.26.0', 'gio-2.0':'>= 2.26.0'}}
82+
libs['GTK_PC'] = {'checks':{'gtk+-2.0': '>= 2.24.0'}}
83+
libs['GIO_PC'] = {'checks':{'gio-unix-2.0': '>= 2.26.0', 'gio-2.0': '>= 2.26.0'}}
8884
else:
89-
libs['GTK_PC'] = {'checks':{'gtk+-3.0':'>= 3.0.0'}}
90-
libs['LUA_PC'] = {'checks':{'lua5.3':'>= 5.3', 'lua':'>= 5.2', 'lua5.2':'>= 5.2'}}
91-
85+
libs['GTK_PC'] = {'checks':{'gtk+-3.0': '>= 3.0.0'}}
86+
libs['LUA_PC'] = {'checks':{'lua5.3': '>= 5.3', 'lua': '>= 5.2', 'lua5.2': '>= 5.2'}}
9287
env.ConfirmLibs(conf, libs)
9388
env.ConfirmBoost(conf, '1.58')
94-
9589
env = conf.Finish()
9690

9791
Decider('MD5-timestamp')
@@ -140,20 +134,19 @@ env.Append(
140134
CPPPATH = ['#extern'],
141135
)
142136

143-
extern_libs = SConscript(['extern/SConscript'], exports='env')
144-
executable, tests, parser_files = SConscript(['source/SConscript'], exports='env')
137+
extern_libs = SConscript(['extern/SConscript'], exports = 'env')
138+
executable, tests, parser_files = SConscript(['source/SConscript'], exports = 'env')
145139

146-
env.Alias(target="build", source=[
140+
env.Alias(target = "build", source=[
147141
executable,
148142
])
149143

150-
env.Alias(target="test", source=[
144+
env.Alias(target = "test", source=[
151145
tests,
152146
])
153147

154148
if 'debian' in COMMAND_LINE_TARGETS:
155-
SConscript("deb/SConscript", exports='env')
156-
149+
SConscript("deb/SConscript", exports = 'env')
157150

158151
if env['ENABLE_NLS']:
159152
translations = env.Glob('share/locale/*/LC_MESSAGES/gpick.po')
@@ -167,21 +160,21 @@ if env['ENABLE_NLS']:
167160
template_c = env.Xgettext("template_c.pot", env.Glob('source/*.cpp') + env.Glob('source/tools/*.cpp') + env.Glob('source/transformation/*.cpp'), XGETTEXT_FLAGS = ['--keyword=N_', '--from-code=UTF-8', '--package-version="$GPICK_BUILD_VERSION"'])
168161
template_lua = env.Xgettext("template_lua.pot", env.Glob('share/gpick/*.lua'), XGETTEXT_FLAGS = ['--language=C++', '--keyword=N_', '--from-code=UTF-8', '--package-version="$GPICK_BUILD_VERSION"'])
169162
template = env.Msgcat("template.pot", [template_c, template_lua], MSGCAT_FLAGS = ['--use-first'])
170-
env.Alias(target = "template", source=[
163+
env.Alias(target = "template", source = [
171164
template
172165
])
173166

174-
env.Alias(target = "install", source=[
175-
env.InstallProgram(dir=env['DESTDIR'] +'/bin', source=[executable]),
176-
env.InstallData(dir=env['DESTDIR'] +'/share/appdata', source=['share/appdata/gpick.appdata.xml']),
177-
env.InstallData(dir=env['DESTDIR'] +'/share/applications', source=['share/applications/gpick.desktop']),
178-
env.InstallData(dir=env['DESTDIR'] +'/share/mime/packages', source=['share/mime/packages/gpick.xml']),
179-
env.InstallData(dir=env['DESTDIR'] +'/share/doc/gpick', source=['share/doc/gpick/copyright']),
180-
env.InstallData(dir=env['DESTDIR'] +'/share/gpick', source=[env.Glob('share/gpick/*.png'), env.Glob('share/gpick/*.lua'), env.Glob('share/gpick/*.txt')]),
181-
env.InstallData(dir=env['DESTDIR'] +'/share/man/man1', source=['share/man/man1/gpick.1']),
182-
env.InstallData(dir=env['DESTDIR'] +'/share/icons/hicolor/48x48/apps/', source=[env.Glob('share/icons/hicolor/48x48/apps/*.png')]),
183-
env.InstallData(dir=env['DESTDIR'] +'/share/icons/hicolor/scalable/apps/', source=[env.Glob('share/icons/hicolor/scalable/apps/*.svg')]),
184-
env.InstallDataAutoDir(dir=env['DESTDIR'] + '/share/locale/', relative_dir='share/locale/', source=[env.Glob('share/locale/*/LC_MESSAGES/gpick.mo')]),
167+
env.Alias(target = "install", source = [
168+
env.InstallProgram(dir = env['DESTDIR'] +'/bin', source = [executable]),
169+
env.InstallData(dir = env['DESTDIR'] +'/share/appdata', source = ['share/appdata/gpick.appdata.xml']),
170+
env.InstallData(dir = env['DESTDIR'] +'/share/applications', source = ['share/applications/gpick.desktop']),
171+
env.InstallData(dir = env['DESTDIR'] +'/share/mime/packages', source = ['share/mime/packages/gpick.xml']),
172+
env.InstallData(dir = env['DESTDIR'] +'/share/doc/gpick', source = ['share/doc/gpick/copyright']),
173+
env.InstallData(dir = env['DESTDIR'] +'/share/gpick', source = [env.Glob('share/gpick/*.png'), env.Glob('share/gpick/*.lua'), env.Glob('share/gpick/*.txt')]),
174+
env.InstallData(dir = env['DESTDIR'] +'/share/man/man1', source = ['share/man/man1/gpick.1']),
175+
env.InstallData(dir = env['DESTDIR'] +'/share/icons/hicolor/48x48/apps/', source = [env.Glob('share/icons/hicolor/48x48/apps/*.png')]),
176+
env.InstallData(dir = env['DESTDIR'] +'/share/icons/hicolor/scalable/apps/', source = [env.Glob('share/icons/hicolor/scalable/apps/*.svg')]),
177+
env.InstallDataAutoDir(dir = env['DESTDIR'] + '/share/locale/', relative_dir = 'share/locale/', source = [env.Glob('share/locale/*/LC_MESSAGES/gpick.mo')]),
185178
])
186179

187180
env.Alias(target = "nsis", source = [
@@ -192,7 +185,7 @@ env.Alias(target = "version", source = [
192185
env.Template(target = "#version.txt", source = "version.template"),
193186
])
194187

195-
tarFiles = env.GetSourceFiles( "("+RegexEscape(os.sep)+r"\.)|("+RegexEscape(os.sep)+r"\.svn$)|(^"+RegexEscape(os.sep)+r"build$)", r"(^\.)|(\.pyc$)|(\.orig$)|(~$)|(\.log$)|(\.diff)|(\.mo$)|(\.patch)|(^gpick-.*\.tar\.gz$)|(^user-config\.py$)")
188+
tarFiles = env.GetSourceFiles("(" + RegexEscape(os.sep) + r"\.)|(" + RegexEscape(os.sep) + r"\.svn$)|(^" + RegexEscape(os.sep) + r"build$)", r"(^\.)|(\.pyc$)|(\.orig$)|(~$)|(\.log$)|(\.diff)|(\.mo$)|(\.patch)|(^gpick-.*\.tar\.gz$)|(^user-config\.py$)")
196189

197190
for item in parser_files:
198191
tarFiles.append(str(item))
@@ -201,8 +194,8 @@ if 'TAR' in env:
201194
env.Alias(target = "tar", source = [
202195
'version',
203196
env.Append(TARFLAGS = ['-z']),
204-
env.Prepend(TARFLAGS = ['--transform', '"s,(^(build/)?),gpick_'+str(env['GPICK_BUILD_VERSION'])+'/,x"']),
205-
env.Tar('gpick_'+str(env['GPICK_BUILD_VERSION'])+'.tar.gz', tarFiles)
197+
env.Prepend(TARFLAGS = ['--transform', '"s,(^(build/)?),gpick_' + str(env['GPICK_BUILD_VERSION']) + '/,x"']),
198+
env.Tar('gpick_' + str(env['GPICK_BUILD_VERSION']) + '.tar.gz', tarFiles)
206199
])
207200

208201
env.Default(executable)

SConstruct

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
#!/usr/bin/env python
2-
3-
SConscript(['SConscript'], variant_dir='build', duplicate=0)
2+
SConscript(['SConscript'], variant_dir = 'build', duplicate = 0)

share/gpick/converters.lua

+168
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
local gpick = require('gpick')
2+
local color = require('gpick/color')
3+
local helpers = require('helpers')
4+
local _ = gpick._
5+
local round = helpers.round
6+
local options = require('options')
7+
local serializeWebHex = function(colorObject)
8+
if not colorObject then return nil end
9+
local c = colorObject:getColor()
10+
if options.upperCase then
11+
return '#' .. string.format('%02X%02X%02X', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255))
12+
else
13+
return '#' .. string.format('%02x%02x%02x', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255))
14+
end
15+
end
16+
local deserializeWebHex = function(text, colorObject)
17+
local c = color:new()
18+
local findStart, findEnd, red, green, blue = string.find(text, '#([%x][%x])([%x][%x])([%x][%x])[^%x]?')
19+
if findStart ~= nil then
20+
red = tonumber(red, 16)
21+
green = tonumber(green, 16)
22+
blue = tonumber(blue, 16)
23+
c:red(red / 255)
24+
c:green(green / 255)
25+
c:blue(blue / 255)
26+
colorObject:setColor(c)
27+
return 1 - (math.atan(findStart - 1) / math.pi) - (math.atan(string.len(text) - findEnd) / math.pi)
28+
else
29+
return -1
30+
end
31+
end
32+
local serializeWebHexNoHash = function(colorObject)
33+
if not colorObject then return nil end
34+
local c = colorObject:getColor()
35+
if options.upperCase then
36+
return string.format('%02X%02X%02X', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255))
37+
else
38+
return string.format('%02x%02x%02x', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255))
39+
end
40+
end
41+
local deserializeWebHexNoHash = function(text, colorObject)
42+
local c = color:new()
43+
local findStart, findEnd, red, green, blue = string.find(text, '([%x][%x])([%x][%x])([%x][%x])[^%x]?')
44+
if findStart ~= nil then
45+
red = tonumber(red, 16)
46+
green = tonumber(green, 16)
47+
blue = tonumber(blue, 16)
48+
c:red(red / 255)
49+
c:green(green / 255)
50+
c:blue(blue / 255)
51+
colorObject:setColor(c)
52+
return 1 - (math.atan(findStart - 1) / math.pi) - (math.atan(string.len(text) - findEnd) / math.pi)
53+
else
54+
return -1
55+
end
56+
end
57+
local serializeWebHex3Digit = function(colorObject)
58+
if not colorObject then return nil end
59+
local c = colorObject:getColor()
60+
if options.upperCase then
61+
return '#' .. string.format('%01X%01X%01X', round(c:red() * 15), round(c:green() * 15), round(c:blue() * 15))
62+
else
63+
return '#' .. string.format('%01x%01x%01x', round(c:red() * 15), round(c:green() * 15), round(c:blue() * 15))
64+
end
65+
end
66+
local deserializeWebHex3Digit = function(text, colorObject)
67+
local c = color:new()
68+
local findStart, findEnd, red, green, blue = string.find(text, '#([%x])([%x])([%x])[^%x]?')
69+
if findStart ~= nil then
70+
red = tonumber(red, 16)
71+
green = tonumber(green, 16)
72+
blue = tonumber(blue, 16)
73+
c:red(red / 15)
74+
c:green(green / 15)
75+
c:blue(blue / 15)
76+
colorObject:setColor(c)
77+
return 1 - (math.atan(findStart - 1) / math.pi) - (math.atan(string.len(text) - findEnd) / math.pi)
78+
else
79+
return -1
80+
end
81+
end
82+
local serializeCssHsl = function(colorObject)
83+
local c = colorObject:getColor()
84+
c = c:rgbToHsl()
85+
return 'hsl(' .. string.format('%d, %d%%, %d%%', round(c:hue() * 360), round(c:saturation() * 100), round(c:lightness() * 100)) .. ')'
86+
end
87+
local serializeCssRgb = function(colorObject)
88+
local c = colorObject:getColor()
89+
return 'rgb(' .. string.format('%d, %d, %d', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255)) .. ')'
90+
end
91+
local serializeColorCssBlock = function(colorObject, position)
92+
if not colorObject then return nil end
93+
local c = colorObject:getColor()
94+
local hsl = c:rgbToHsl()
95+
local result = '';
96+
if position.first then
97+
result = '/**\n * Generated by Gpick ' .. gpick.version .. '\n'
98+
end
99+
local name = colorObject:getName()
100+
if not name then
101+
name = ''
102+
end
103+
result = result .. ' * ' .. name .. ': '
104+
if options.upperCase then
105+
result = result .. '#' .. string.format('%02X%02X%02X', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255))
106+
else
107+
result = result .. '#' .. string.format('%02x%02x%02x', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255))
108+
end
109+
result = result .. ', rgb(' .. string.format('%d, %d, %d', round(c:red() * 255), round(c:green() * 255), round(c:blue() * 255)) .. '), hsl(' .. string.format('%d, %d%%, %d%%', round(c:hue() * 360), round(c:saturation() * 100), round(c:lightness() * 100)) .. ')'
110+
if position.last then
111+
result = result .. '\n */'
112+
end
113+
return result
114+
end
115+
local deserializeCssRgb = function(text, colorObject)
116+
local c = color:new()
117+
local findStart, findEnd, red, green, blue = string.find(text, 'rgb%(([%d]*)[%s]*,[%s]*([%d]*)[%s]*,[%s]*([%d]*)%)')
118+
if findStart ~= nil then
119+
c:rgb(math.min(1, red / 255), math.min(1, green / 255), math.min(1, blue / 255))
120+
colorObject:setColor(c)
121+
return 1 - (math.atan(findStart - 1) / math.pi) - (math.atan(string.len(text) - findEnd) / math.pi)
122+
else
123+
return -1
124+
end
125+
end
126+
local serializeCssColorHex = function(colorObject)
127+
return 'color: ' .. serializeWebHex(colorObject)
128+
end
129+
local serializeCssBackgroundColorHex = function(colorObject)
130+
return 'background-color: ' .. serializeWebHex(colorObject)
131+
end
132+
local serializeCssBorderColorHex = function(colorObject)
133+
return 'border-color: ' .. serializeWebHex(colorObject)
134+
end
135+
local serializeCssBorderTopColorHex = function(colorObject)
136+
return 'border-top-color: ' .. serializeWebHex(colorObject)
137+
end
138+
local serializeCssBorderRightColorHex = function(colorObject)
139+
return 'border-right-color: ' .. serializeWebHex(colorObject)
140+
end
141+
local serializeCssBorderBottomColorHex = function(colorObject)
142+
return 'border-bottom-color: ' .. serializeWebHex(colorObject)
143+
end
144+
local serializeCssBorderLeftHex = function(colorObject)
145+
return 'border-left-color: ' .. serializeWebHex(colorObject)
146+
end
147+
local serializeColorCsv = function(colorObject)
148+
local c = colorObject:getColor()
149+
os.setlocale("C", "numeric")
150+
local r = string.format('%f\t%f\t%f', c:red(), c:green(), c:blue())
151+
os.setlocale("", "numeric")
152+
return r
153+
end
154+
gpick:addConverter('color_web_hex', _("Web: hex code"), serializeWebHex, deserializeWebHex)
155+
gpick:addConverter('color_web_hex_3_digit', _("Web: hex code (3 digits)"), serializeWebHex3Digit, deserializeWebHex3Digit)
156+
gpick:addConverter('color_web_hex_no_hash', _("Web: hex code (no hash symbol)"), serializeWebHexNoHash, deserializeWebHexNoHash)
157+
gpick:addConverter('color_css_hsl', _("CSS: hue saturation lightness"), serializeCssHsl)
158+
gpick:addConverter('color_css_rgb', _("CSS: red green blue"), serializeCssRgb, deserializeCssRgb)
159+
gpick:addConverter('css_color_hex', 'CSS(color)', serializeCssColorHex)
160+
gpick:addConverter('css_background_color_hex', 'CSS(background-color)', serializeCssBackgroundColorHex)
161+
gpick:addConverter('css_border_color_hex', 'CSS(border-color)', serializeCssBorderColorHex)
162+
gpick:addConverter('css_border_top_color_hex', 'CSS(border-top-color)', serializeCssBorderTopColorHex)
163+
gpick:addConverter('css_border_right_color_hex', 'CSS(border-right-color)', serializeCssBorderRightColorHex)
164+
gpick:addConverter('css_border_bottom_color_hex', 'CSS(border-bottom-color)', serializeCssBorderBottomColorHex)
165+
gpick:addConverter('css_border_left_hex', 'CSS(border-left-color)', serializeCssBorderLeftHex)
166+
gpick:addConverter('color_csv', 'CSV', serializeColorCsv)
167+
gpick:addConverter('color_css_block', 'CSS block', serializeColorCssBlock)
168+
return {}

share/gpick/helpers.lua

+15-13
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
2-
function suggest(filename)
3-
local function p_require() require(filename); end;
4-
local function supress_error(err) print(err); end;
5-
return xpcall(p_require, supress_error);
6-
end;
7-
8-
function round(number)
9-
if number-math.floor(number)>=0.5 then
10-
return math.ceil(number);
1+
local function suggest(filename)
2+
local function p_require() require(filename) end
3+
local function supress_error(err) print(err) end
4+
return xpcall(p_require, supress_error)
5+
end
6+
local function round(number)
7+
if number - math.floor(number) >= 0.5 then
8+
return math.ceil(number)
119
else
12-
return math.floor(number);
13-
end;
14-
end;
10+
return math.floor(number)
11+
end
12+
end
13+
return {
14+
suggest = suggest,
15+
round = round,
16+
}

0 commit comments

Comments
 (0)