etti 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/AUTHORS +1 -0
- data/COPYING +340 -0
- data/README.md +57 -0
- data/bin/etti +10 -0
- data/lib/data/locale/de/LC_MESSAGES/etti.mo +0 -0
- data/lib/data/page-data.json +28 -0
- data/lib/data/pixmaps/logo.png +0 -0
- data/lib/data/pixmaps/logo.svg +102 -0
- data/lib/data/pixmaps/win-logo.png +0 -0
- data/lib/data/pixmaps/win-logo.svg +223 -0
- data/lib/etti/colors.rb +15 -0
- data/lib/etti/dnd-data.rb +12 -0
- data/lib/etti/elements/base.rb +14 -0
- data/lib/etti/elements/data.rb +109 -0
- data/lib/etti/elements/text.rb +74 -0
- data/lib/etti/file/data-reader.rb +67 -0
- data/lib/etti/monkeys/array.rb +8 -0
- data/lib/etti/monkeys/cairo-context.rb +94 -0
- data/lib/etti/monkeys/gtk-event-box.rb +7 -0
- data/lib/etti/page-datas.rb +110 -0
- data/lib/etti/page.rb +40 -0
- data/lib/etti/print-view.rb +21 -0
- data/lib/etti/ui/data-page.rb +236 -0
- data/lib/etti/ui/label-elements.rb +74 -0
- data/lib/etti/ui/label-layout-page.rb +193 -0
- data/lib/etti/ui/label-layout.rb +315 -0
- data/lib/etti/ui/label-selection-page.rb +91 -0
- data/lib/etti/ui/message-dialog.rb +103 -0
- data/lib/etti/ui/page-layout.rb +405 -0
- data/lib/etti/ui/property-editor-data.rb +92 -0
- data/lib/etti/ui/window.rb +117 -0
- data/lib/etti/version.rb +3 -0
- data/lib/etti.rb +45 -0
- metadata +184 -0
@@ -0,0 +1,405 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
|
3
|
+
|
4
|
+
module Etti
|
5
|
+
class PageLayout < Gtk::Box
|
6
|
+
include GetText
|
7
|
+
GetText.bindtextdomain 'etti', :path => Etti::LOCALE_PATH
|
8
|
+
|
9
|
+
LABELS_H = 3
|
10
|
+
LABELS_V = 3
|
11
|
+
LABEL_PADDING = 24.0
|
12
|
+
def initialize pageDatas
|
13
|
+
super(:vertical)
|
14
|
+
@pageDatas = pageDatas
|
15
|
+
@entryChanged = false
|
16
|
+
self.border_width = 0
|
17
|
+
@pageSizes = ['a4']
|
18
|
+
@entries = {}
|
19
|
+
@boxes = []
|
20
|
+
@lcNumeric = I18nToolbox::LcNumeric.new
|
21
|
+
|
22
|
+
@dimensionData = {:borderTop =>
|
23
|
+
{:pos => [2, 3, 0, 1],
|
24
|
+
:label => _('top border'),
|
25
|
+
:tooltip => _('The distance from the label to the top leaf margin'),
|
26
|
+
:range => 0.0..50.0},
|
27
|
+
:borderLeft =>
|
28
|
+
{:pos => [0, 1, 2, 3],
|
29
|
+
:label => _('left border'),
|
30
|
+
:tooltip => _('The distance from the label to the left leaf margin'),
|
31
|
+
:range => 0.0..50.0},
|
32
|
+
:height =>
|
33
|
+
{:pos => [2, 3, 1, 2],
|
34
|
+
:label => _('label height'),
|
35
|
+
:tooltip => _('The height of a single label'),
|
36
|
+
:range => 3.0..500.0},
|
37
|
+
:width =>
|
38
|
+
{:pos => [1, 2, 2, 3],
|
39
|
+
:label => _('label width'),
|
40
|
+
:tooltip => _('The width of a single label'),
|
41
|
+
:range => 3.0..500.0},
|
42
|
+
:paddingH =>
|
43
|
+
{:pos => [2,3, 3, 4],
|
44
|
+
:label => _('horizontal distance'),
|
45
|
+
:tooltip => _('The horizontal distance between the labels'),
|
46
|
+
:range => 0.0..20.0},
|
47
|
+
:paddingV =>
|
48
|
+
{:pos => [3, 4, 2, 3],
|
49
|
+
:label => _('vertical distance'),
|
50
|
+
:tooltip => _('The vertical distance between the labels'),
|
51
|
+
:range => 0.0..20.0}
|
52
|
+
}
|
53
|
+
|
54
|
+
@descriptionData = {:manufacture =>
|
55
|
+
{:label => _('manufacturer'),
|
56
|
+
:tooltip => _('Manufacturer of the label')},
|
57
|
+
:orderNr =>
|
58
|
+
{:label => _('order number'),
|
59
|
+
:tooltip => _('The manufacturers order number')},
|
60
|
+
:description =>
|
61
|
+
{:label => _('description'),
|
62
|
+
:tooltip => _('An aditional description for the label')},
|
63
|
+
:pageSize =>
|
64
|
+
{:label => _('page size'),
|
65
|
+
:tooltip => _('The size of the sheet, i.e. "a4"')}
|
66
|
+
}
|
67
|
+
|
68
|
+
|
69
|
+
@sizeGroup = Gtk::SizeGroup.new :both
|
70
|
+
widget = make_entry :name, _('Name'), _("The name of the label\nIt has to be unique")
|
71
|
+
|
72
|
+
@saveButton = Gtk::Button.new :stock_id => Gtk::Stock::SAVE
|
73
|
+
@saveButton.tooltip_text = _('Save the changes of the label sheet')
|
74
|
+
@saveButton.signal_connect(:clicked) {on_save}
|
75
|
+
widget.pack_end @saveButton, :expand => false, :fill => false, :padding => 32
|
76
|
+
self.pack_start widget, :expand => false, :fill => false, :padding => 12
|
77
|
+
|
78
|
+
|
79
|
+
# create the dimension entries
|
80
|
+
@table = Gtk::Table.new 4, 4, true
|
81
|
+
hbox = Gtk::Box.new :horizontal
|
82
|
+
hbox.pack_start @table, :expand => false, :fill => false
|
83
|
+
self.pack_start hbox, :expand => false, :fill => false
|
84
|
+
|
85
|
+
@dimensionData.each_pair do |key, val|
|
86
|
+
box = Gtk::Box.new :vertical
|
87
|
+
@boxes << box
|
88
|
+
|
89
|
+
@table.attach box, *val[:pos], 0, 0, LABEL_PADDING, LABEL_PADDING
|
90
|
+
|
91
|
+
box.pack_start Gtk::Label.new(val[:label]), :expand => false, :fill => false
|
92
|
+
|
93
|
+
entry = Rgw::RestrictedEntry.new
|
94
|
+
entry.restriction = :float
|
95
|
+
entry.range = val[:range]
|
96
|
+
@entries[key] = entry
|
97
|
+
entry.name = key
|
98
|
+
box.pack_start entry, :expand => false, :fill => false
|
99
|
+
|
100
|
+
entry.set_max_length 7
|
101
|
+
entry.width_chars = 8
|
102
|
+
|
103
|
+
entry.tooltip_text = val[:tooltip]
|
104
|
+
entry.editable = true
|
105
|
+
|
106
|
+
entry.signal_connect(:changed) {|entry| on_entry_changed entry}
|
107
|
+
end
|
108
|
+
|
109
|
+
|
110
|
+
# create the page size combo box
|
111
|
+
val = @descriptionData[:pageSize]
|
112
|
+
cbox = Gtk::Box.new :horizontal
|
113
|
+
self.pack_start cbox, :expand => false, :fill => false
|
114
|
+
label = Gtk::Label.new.set_markup(_("<b>%s</b>: " % val[:label]))
|
115
|
+
label.xalign = 0.0
|
116
|
+
cbox.pack_start label, :expand => false, :fill => false, :padding => 6
|
117
|
+
@sizeGroup.add_widget label
|
118
|
+
@pageSizeCombo = Gtk::ComboBoxText.new
|
119
|
+
cbox.pack_start @pageSizeCombo, :expand => false, :fill => false, :padding => 4
|
120
|
+
@pageSizes.each do |pz|
|
121
|
+
@pageSizeCombo.append_text pz
|
122
|
+
end
|
123
|
+
@pageSizeCombo.signal_connect(:changed) do
|
124
|
+
@pageData[:pageSize] = @pageSizes[@pageSizeCombo.active]
|
125
|
+
end
|
126
|
+
|
127
|
+
# create the page description entries
|
128
|
+
[:manufacture, :orderNr, :description].each do |key|
|
129
|
+
val = @descriptionData[key]
|
130
|
+
widget = make_entry key, val[:label], val[:tooltip]
|
131
|
+
self.pack_start widget, :expand => false, :fill => false, :padding => 4
|
132
|
+
end
|
133
|
+
signal_connect(:map) {on_map}
|
134
|
+
signal_connect(:draw) do |widget|
|
135
|
+
draw_bg
|
136
|
+
false
|
137
|
+
end
|
138
|
+
signal_connect_after(:draw) {on_draw}
|
139
|
+
end
|
140
|
+
attr_reader :entryChanged
|
141
|
+
|
142
|
+
|
143
|
+
def update_page_data pageData
|
144
|
+
@pageData = pageData
|
145
|
+
[:name, :manufacture, :orderNr, :description, :pageSize,
|
146
|
+
:cols, :rows, :size, :borders, :padding].each do |key|
|
147
|
+
case key
|
148
|
+
when :name, :manufacture, :orderNr, :description
|
149
|
+
@entries[key].text = @pageData[key] #.instance_variable_get '@' + key.to_s
|
150
|
+
when :borders
|
151
|
+
left, top = *@pageData[key]
|
152
|
+
@entries[:borderTop].text = @lcNumeric.to_s top
|
153
|
+
@entries[:borderLeft].text = @lcNumeric.to_s left
|
154
|
+
when :padding
|
155
|
+
h, v = *@pageData[key]
|
156
|
+
@entries[:paddingH].text = @lcNumeric.to_s h
|
157
|
+
@entries[:paddingV].text = @lcNumeric.to_s v
|
158
|
+
when :size
|
159
|
+
w, h = *@pageData[key]
|
160
|
+
@entries[:width].text = @lcNumeric.to_s w
|
161
|
+
@entries[:height].text = @lcNumeric.to_s h
|
162
|
+
when :pageSize
|
163
|
+
@pageSizeCombo.active = @pageSizes.index @pageData[:pageSize]
|
164
|
+
end
|
165
|
+
end
|
166
|
+
@saveButton.sensitive = false
|
167
|
+
@entryChanged = false
|
168
|
+
end
|
169
|
+
|
170
|
+
|
171
|
+
def save
|
172
|
+
on_save
|
173
|
+
end
|
174
|
+
|
175
|
+
private
|
176
|
+
def make_entry id, label, tooltip, head=nil
|
177
|
+
hbox = Gtk::Box.new :horizontal
|
178
|
+
|
179
|
+
label = Gtk::Label.new.set_markup("<b>#{label}</b>: ")
|
180
|
+
hbox.pack_start label, :expand => false, :fill => false, :padding => 6
|
181
|
+
@sizeGroup.add_widget label
|
182
|
+
label.xalign = 0.0
|
183
|
+
|
184
|
+
entry = Rgw::RestrictedEntry.new
|
185
|
+
entry.range = id == :name ? 1..250 : 0..250
|
186
|
+
entry.name = id
|
187
|
+
@entries[id] = entry
|
188
|
+
hbox.pack_start entry, :expand => false, :fill => false
|
189
|
+
entry.tooltip_text = tooltip
|
190
|
+
entry.signal_connect(:changed) {|entry| on_entry_changed entry}
|
191
|
+
hbox
|
192
|
+
end
|
193
|
+
|
194
|
+
|
195
|
+
def on_entry_changed entry
|
196
|
+
return if @pageData.nil?
|
197
|
+
key = entry.name.to_sym
|
198
|
+
text = @entries[key].text
|
199
|
+
return if text.nil?
|
200
|
+
@entryChanged = true
|
201
|
+
@saveButton.sensitive = true
|
202
|
+
val = @lcNumeric.to_f text
|
203
|
+
|
204
|
+
case key
|
205
|
+
when :name, :manufacture, :orderNr, :description
|
206
|
+
@pageData[key] = text
|
207
|
+
when :paddingH
|
208
|
+
@pageData[:padding][0] = val
|
209
|
+
when :paddingV
|
210
|
+
@pageData[:padding][1] = val
|
211
|
+
when :borderLeft
|
212
|
+
@pageData[:borders][0] = val
|
213
|
+
when :borderTop
|
214
|
+
@pageData[:borders][1] = val
|
215
|
+
when :width
|
216
|
+
@pageData[:size][0] = val
|
217
|
+
when :height
|
218
|
+
@pageData[:size][1] = val
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
|
223
|
+
def on_save
|
224
|
+
@entries.each do |entry|
|
225
|
+
if entry[1].text.nil?
|
226
|
+
message = _('Some of the entries are invalid.')
|
227
|
+
dialog = Etti::MessageDialog.new self.toplevel, :buttons => [:close],
|
228
|
+
:type => :info, :message => message,
|
229
|
+
:title => _('Invalid Entries')
|
230
|
+
dialog.run
|
231
|
+
return
|
232
|
+
end
|
233
|
+
end
|
234
|
+
@pageDatas.save_page_data(@pageData) do |type, answers, message|
|
235
|
+
if answers == :yes_no
|
236
|
+
dialog = Etti::MessageDialog.new self.toplevel, :buttons => [:yes, :no],
|
237
|
+
:type => :info, :message => message
|
238
|
+
dialog.run
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
|
244
|
+
def draw_bg
|
245
|
+
box_allocation = @table.allocation
|
246
|
+
bx = box_allocation.x
|
247
|
+
by = box_allocation.y
|
248
|
+
bw = box_allocation.width
|
249
|
+
bh = box_allocation.height
|
250
|
+
|
251
|
+
@cc = @table.window.create_cairo_context
|
252
|
+
|
253
|
+
@cc.set_source_rgb *$colors.bg
|
254
|
+
@cc.paint
|
255
|
+
@cc.set_source_rgb 1.0, 1.0, 1.0
|
256
|
+
@cc.rectangle bx + 8, by + 8, bw - 12, bh - 12
|
257
|
+
@cc.fill.stroke
|
258
|
+
end
|
259
|
+
|
260
|
+
|
261
|
+
def on_map
|
262
|
+
@boxW = 0
|
263
|
+
@boxH = 0
|
264
|
+
@boxes.each do |box|
|
265
|
+
allo = box.allocation
|
266
|
+
@boxW = allo.width if allo.width > @boxW
|
267
|
+
@boxH = allo.height if allo.height > @boxH
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
|
272
|
+
def on_draw
|
273
|
+
box_allocation = @boxes.first.allocation
|
274
|
+
|
275
|
+
bw = box_allocation.width
|
276
|
+
bh = box_allocation.height
|
277
|
+
|
278
|
+
|
279
|
+
bw = @boxW
|
280
|
+
bh = @boxH
|
281
|
+
|
282
|
+
@cc = @table.window.create_cairo_context
|
283
|
+
# we don't have an own window
|
284
|
+
@cc.translate(@table.allocation.x, @table.allocation.y)
|
285
|
+
@cc.antialias = :none
|
286
|
+
|
287
|
+
# border
|
288
|
+
@cc.set_source_rgb 0.5, 0.5, 0.5
|
289
|
+
@cc.line_width = 2.0
|
290
|
+
|
291
|
+
@cc.move_to (bw + LABEL_PADDING * 2.0) * (LABELS_H + 1), 8
|
292
|
+
@cc.line_to 8, 8
|
293
|
+
@cc.line_to 8, (bh + LABEL_PADDING * 2.0) * (LABELS_V + 1)
|
294
|
+
@cc.stroke
|
295
|
+
|
296
|
+
|
297
|
+
@cc.set_source_rgb 0.4, 0.4, 0.9
|
298
|
+
@cc.line_width = 1.0
|
299
|
+
|
300
|
+
1.upto(LABELS_V) do |y|
|
301
|
+
1.upto(LABELS_H) do |x|
|
302
|
+
|
303
|
+
@cc.rectangle (bw + LABEL_PADDING * 2.0) * x,
|
304
|
+
(bh + LABEL_PADDING * 2.0) * y,
|
305
|
+
bw + LABEL_PADDING * 1.5,
|
306
|
+
bh + LABEL_PADDING * 1.5
|
307
|
+
@cc.stroke
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
# border arrows
|
312
|
+
draw_arrow :h, 8, (bh + LABEL_PADDING * 2.0) * 2.0 + 24, bw + LABEL_PADDING * 2.0 - 8
|
313
|
+
draw_arrow :v, (bw + LABEL_PADDING * 2.0) * 2.0 + 24, 8, bh + LABEL_PADDING * 2.0 - 8
|
314
|
+
# cell arrows
|
315
|
+
draw_arrow :h, (bw + LABEL_PADDING * 2.0), (bh + LABEL_PADDING * 2.0) * 2.0 + 24.0,
|
316
|
+
bw + LABEL_PADDING * 1.5
|
317
|
+
draw_arrow :v, (bw + LABEL_PADDING * 2.0) * 2.0 + 24, bh + LABEL_PADDING * 2.0, bh + LABEL_PADDING * 1.5
|
318
|
+
|
319
|
+
# padding arrows
|
320
|
+
draw_arrow :h, (bw + LABEL_PADDING * 2.0) * 2.0 - LABEL_PADDING * 0.5,
|
321
|
+
(bh + LABEL_PADDING * 2.0) * 3.0 + 24, LABEL_PADDING * 0.5, true
|
322
|
+
draw_arrow :v, (bw + LABEL_PADDING * 2.0) * 3.0 + 24,
|
323
|
+
(bh + LABEL_PADDING * 2.0) * 2.0 - LABEL_PADDING * 0.5, LABEL_PADDING * 0.5, true
|
324
|
+
end
|
325
|
+
|
326
|
+
|
327
|
+
ARROW_SIZE = 8.0
|
328
|
+
def draw_arrow dir, x, y, lg, out=false
|
329
|
+
@cc.set_source_rgb 0.2, 0.2, 0.2
|
330
|
+
@cc.line_width = 1.0
|
331
|
+
unless out
|
332
|
+
if dir == :h
|
333
|
+
@cc.antialias = :none
|
334
|
+
@cc.move_to x, y
|
335
|
+
@cc.line_to x + lg, y
|
336
|
+
@cc.stroke
|
337
|
+
|
338
|
+
@cc.antialias = :subpixel
|
339
|
+
@cc.move_to x, y
|
340
|
+
@cc.line_to x + ARROW_SIZE, y - (ARROW_SIZE / 4.0)
|
341
|
+
@cc.line_to x + ARROW_SIZE, y + (ARROW_SIZE / 4.0)
|
342
|
+
@cc.fill.stroke
|
343
|
+
|
344
|
+
@cc.move_to x + lg, y
|
345
|
+
@cc.line_to x + lg - ARROW_SIZE, y - (ARROW_SIZE / 4.0)
|
346
|
+
@cc.line_to x + lg - ARROW_SIZE, y + (ARROW_SIZE / 4.0)
|
347
|
+
@cc.fill.stroke
|
348
|
+
|
349
|
+
else
|
350
|
+
@cc.antialias = :none
|
351
|
+
@cc.move_to x, y
|
352
|
+
@cc.line_to x, y + lg
|
353
|
+
@cc.stroke
|
354
|
+
|
355
|
+
@cc.antialias = :subpixel
|
356
|
+
@cc.move_to x, y
|
357
|
+
@cc.line_to x - (ARROW_SIZE / 4.0), y + ARROW_SIZE
|
358
|
+
@cc.line_to x + (ARROW_SIZE / 4.0), y + ARROW_SIZE
|
359
|
+
@cc.fill.stroke
|
360
|
+
|
361
|
+
@cc.move_to x, y + lg
|
362
|
+
@cc.line_to x - (ARROW_SIZE / 4.0), y + lg - ARROW_SIZE
|
363
|
+
@cc.line_to x + (ARROW_SIZE / 4.0), y + lg - ARROW_SIZE
|
364
|
+
@cc.fill.stroke
|
365
|
+
end
|
366
|
+
else
|
367
|
+
if dir == :h
|
368
|
+
@cc.antialias = :none
|
369
|
+
@cc.move_to x - ARROW_SIZE * 2.0, y
|
370
|
+
@cc.line_to x + lg + ARROW_SIZE * 8.0, y
|
371
|
+
@cc.stroke
|
372
|
+
|
373
|
+
@cc.antialias = :subpixel
|
374
|
+
@cc.move_to x, y
|
375
|
+
@cc.line_to x - ARROW_SIZE, y - (ARROW_SIZE / 4.0)
|
376
|
+
@cc.line_to x - ARROW_SIZE, y + (ARROW_SIZE / 4.0)
|
377
|
+
@cc.fill.stroke
|
378
|
+
|
379
|
+
@cc.move_to x + lg, y
|
380
|
+
@cc.line_to x + lg + ARROW_SIZE, y - (ARROW_SIZE / 4.0)
|
381
|
+
@cc.line_to x + lg + ARROW_SIZE, y + (ARROW_SIZE / 4.0)
|
382
|
+
@cc.fill.stroke
|
383
|
+
|
384
|
+
else
|
385
|
+
@cc.antialias = :none
|
386
|
+
@cc.move_to x, y - ARROW_SIZE * 2.0
|
387
|
+
@cc.line_to x, y + lg + ARROW_SIZE * 8.0
|
388
|
+
@cc.stroke
|
389
|
+
|
390
|
+
@cc.antialias = :subpixel
|
391
|
+
@cc.move_to x, y
|
392
|
+
@cc.line_to x - (ARROW_SIZE / 4.0), y - ARROW_SIZE
|
393
|
+
@cc.line_to x + (ARROW_SIZE / 4.0), y - ARROW_SIZE
|
394
|
+
@cc.fill.stroke
|
395
|
+
|
396
|
+
@cc.move_to x, y + lg
|
397
|
+
@cc.line_to x - (ARROW_SIZE / 4.0), y + lg + ARROW_SIZE
|
398
|
+
@cc.line_to x + (ARROW_SIZE / 4.0), y + lg + ARROW_SIZE
|
399
|
+
@cc.fill.stroke
|
400
|
+
end
|
401
|
+
end
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
405
|
+
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# all dimensions are in milimeters!
|
4
|
+
|
5
|
+
|
6
|
+
module Etti
|
7
|
+
module PropertyEditorData
|
8
|
+
include GetText
|
9
|
+
GetText.bindtextdomain 'etti', :path => Etti::LOCALE_PATH
|
10
|
+
|
11
|
+
DEFAULT_TEXTS_TEXT = ''
|
12
|
+
DEFAULT_TEXTS_POS_X = 0.0
|
13
|
+
DEFAULT_TEXTS_POS_Y = 0.0
|
14
|
+
DEFAULT_TEXTS_SIZE = 4.0
|
15
|
+
DEFAULT_TEXTS_ROTATION = 0.0
|
16
|
+
DEFAUTL_TEXTS_COLOR = [0.0, 0.0, 0.0, 1.0]
|
17
|
+
|
18
|
+
TEXTS_PROPS = [
|
19
|
+
{label: _('text'), type: :entry, useDefault: false,
|
20
|
+
id0: 'text', default0: DEFAULT_TEXTS_TEXT},
|
21
|
+
|
22
|
+
{label: _('position'), type: :sSpin, useDefault: false,
|
23
|
+
id0: 'pos_x', id1: 'pos_y', range: -1000.0..1000.0, step: 0.05,
|
24
|
+
default0: DEFAULT_TEXTS_POS_X, default1: DEFAULT_TEXTS_POS_Y, synced: false},
|
25
|
+
|
26
|
+
{label: _('size'), type: :spin, useDefault: false,
|
27
|
+
id0: 'size', range: 0.1..100.0, step: 0.05,
|
28
|
+
default0: DEFAULT_TEXTS_SIZE},
|
29
|
+
|
30
|
+
{label: _('rotation'), type: :spin, useDefault: true,
|
31
|
+
id0: 'rotation', range: 0.0..360.0, step: 1.0,
|
32
|
+
default0: DEFAULT_TEXTS_ROTATION}
|
33
|
+
]
|
34
|
+
|
35
|
+
|
36
|
+
DEFAULT_DATA_SHOW_AS = 0
|
37
|
+
DEFAULT_QR_WIDTH = 10
|
38
|
+
DEFAULT_QR_HEIGHT = 10
|
39
|
+
DEFAULT_QR_VERSION = 1
|
40
|
+
DEFAULT_QR_ERROR_CORRECTION = 1
|
41
|
+
DEFAULT_QR_ENCODING = 3
|
42
|
+
|
43
|
+
DATA_PROPS = [
|
44
|
+
{label: _('position'), type: :sSpin, useDefault: false,
|
45
|
+
id0: 'pos_x', id1: 'pos_y', range: -1000.0..1000.0, step: 0.05,
|
46
|
+
default0: DEFAULT_TEXTS_POS_X, default1: DEFAULT_TEXTS_POS_Y, synced: false},
|
47
|
+
|
48
|
+
{label: _('rotation'), type: :spin, useDefault: true,
|
49
|
+
id0: 'rotation', range: 0.0..360.0, step: 1.0,
|
50
|
+
default0: DEFAULT_TEXTS_ROTATION},
|
51
|
+
|
52
|
+
{label: _('color'), type: :color, useDefault: true,
|
53
|
+
id0: 'color', default0: DEFAUTL_TEXTS_COLOR},
|
54
|
+
|
55
|
+
{label: _('show as'), type: :radioRevealer,
|
56
|
+
id0: 'showAs', default0: DEFAULT_DATA_SHOW_AS,
|
57
|
+
revealSections: [
|
58
|
+
|
59
|
+
{section: 'text',
|
60
|
+
data: [
|
61
|
+
{label: _('size'), type: :spin, useDefault: false,
|
62
|
+
id0: 'size', range: 0.1..100.0, step: 0.05,
|
63
|
+
default0: DEFAULT_TEXTS_SIZE}
|
64
|
+
]},
|
65
|
+
|
66
|
+
{section: 'QR-Code',
|
67
|
+
data: [
|
68
|
+
{label: _('display size'), type: :sSpin, useDefault: false,
|
69
|
+
id0: 'qrWidth', id1: 'qrHeight', range: 1.0..1000.0, step: 0.1,
|
70
|
+
default0: DEFAULT_QR_WIDTH, default1: DEFAULT_QR_HEIGHT, synced: true},
|
71
|
+
|
72
|
+
{label: _('version'), type: :spin, useDefault: false,
|
73
|
+
id0: 'qrVersion', range: 1..40, step: 1, default0: DEFAULT_QR_VERSION},
|
74
|
+
|
75
|
+
{label: _('correction'), type: :combo, useDefault: true,
|
76
|
+
id0: 'qrErrorCorrection', default0: DEFAULT_QR_ERROR_CORRECTION,
|
77
|
+
entries: ['low', 'medium', 'quarter', 'high']},
|
78
|
+
|
79
|
+
{label: _('encoding'), type: :combo, useDefault: true,
|
80
|
+
id0: 'qrEncoding', default0: DEFAULT_QR_ENCODING,
|
81
|
+
entries: ['automatic', 'numeric', 'alphanumeric', 'ascii', 'kanji']}
|
82
|
+
]
|
83
|
+
}
|
84
|
+
]
|
85
|
+
}
|
86
|
+
]
|
87
|
+
|
88
|
+
|
89
|
+
# this is a dummy entry if no element is selected
|
90
|
+
NONE_PROPS = []
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
#encoding: UTF-8
|
2
|
+
|
3
|
+
module Etti
|
4
|
+
class Window < Gtk::Window
|
5
|
+
include GetText
|
6
|
+
GetText.bindtextdomain 'etti', :path => Etti::LOCALE_PATH
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super()
|
10
|
+
signal_connect(:delete_event) {on_quit false}
|
11
|
+
signal_connect(:destroy) {on_quit true}
|
12
|
+
signal_connect_after(:draw) {paint_logo}
|
13
|
+
self.border_width = 3
|
14
|
+
self.title = 'Etti'
|
15
|
+
set_default_size 1200, 900
|
16
|
+
self.icon = Etti::PIXMAP_PATH + 'win-logo.png'
|
17
|
+
|
18
|
+
@logoPixbuf = Gdk::Pixbuf.new Etti::PIXMAP_PATH + 'logo.png'
|
19
|
+
|
20
|
+
@accelGroup = Gtk::AccelGroup.new
|
21
|
+
add_accel_group @accelGroup
|
22
|
+
|
23
|
+
create_data_page
|
24
|
+
create_label_selection_page
|
25
|
+
create_label_layout_page
|
26
|
+
create_about_page
|
27
|
+
|
28
|
+
@labelSelectionPage.signal_connect(:page_changed) do |widget, pageData|
|
29
|
+
@labelLayoutPage.update_page_data pageData
|
30
|
+
end
|
31
|
+
@labelLayoutPage.update_page_data @labelSelectionPage.pageData
|
32
|
+
|
33
|
+
@notebook = Gtk::Notebook.new
|
34
|
+
add @notebook
|
35
|
+
notebook_append_page @dataPage, _("<b> Data \n Input </b>")
|
36
|
+
notebook_append_page @labelSelectionPage, _("<b> Label \n Selection </b>")
|
37
|
+
notebook_append_page @labelLayoutPage, _("<b> Label \n Formatting </b>")
|
38
|
+
notebook_append_page @aboutPage, _("<b> About Etti </b>")
|
39
|
+
|
40
|
+
end
|
41
|
+
attr_reader :dataPage, :labelLayoutPage, :labelSelectionPage
|
42
|
+
|
43
|
+
|
44
|
+
def notebook_append_page page, label
|
45
|
+
ali = Gtk::Alignment.new 0, 0, 1, 1
|
46
|
+
ali.set_padding 8, 8, 8, 8
|
47
|
+
ali.add page
|
48
|
+
@notebook.append_page ali, Gtk::Label.new.set_markup(label)
|
49
|
+
|
50
|
+
pg = @notebook.n_pages
|
51
|
+
return if pg > 9
|
52
|
+
@accelGroup.connect(Gdk::Keyval.from_name(pg.to_s), :mod1_mask, :visible) {@notebook.page = pg - 1}
|
53
|
+
@accelGroup.connect(Gdk::Keyval.from_name('KP_' + pg.to_s), :mod1_mask, :visible) {@notebook.page = pg - 1}
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def create_data_page
|
58
|
+
@dataPage = Etti::DataPage.new
|
59
|
+
@dataPage.signal_connect(:data_changed) {|widget, head, data| @labelLayoutPage.set_element_data head, data}
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
def create_label_selection_page
|
64
|
+
@labelSelectionPage = Etti::LabelSelectionPage.new
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
def create_label_layout_page
|
69
|
+
@labelLayoutPage = Etti::LabelLayoutPage.new
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def create_about_page
|
74
|
+
@aboutPage = Gtk::Box.new :vertical
|
75
|
+
img = Gtk::Image.new :pixbuf => @logoPixbuf
|
76
|
+
@aboutPage.pack_start img, :expand => false, :fill => false, :padding => 36
|
77
|
+
|
78
|
+
label = Gtk::Label.new
|
79
|
+
@aboutPage.pack_start label, :expand => false, :fill => false, :padding => 6
|
80
|
+
label.selectable = true
|
81
|
+
label.can_focus = false
|
82
|
+
label.markup = _("Copyright © 2014 Detlef Reichl detlef!reichl()gmx!org\n\n\n" +
|
83
|
+
|
84
|
+
"QR Code is a registered trademark of DENSO WAVE INCORPORATED.\n\n") +
|
85
|
+
|
86
|
+
"This program is free software; you can redistribute it and/or modify\n" +
|
87
|
+
"it under the terms of the GNU General Public License as published by\n" +
|
88
|
+
"the Free Software Foundation; either version 2 of the License, or\n" +
|
89
|
+
"(at your option) any later version.\n\n" +
|
90
|
+
|
91
|
+
"This program is distributed in the hope that it will be useful,\n" +
|
92
|
+
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +
|
93
|
+
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +
|
94
|
+
"GNU General Public License for more details.\n\n" +
|
95
|
+
|
96
|
+
"You should have received a copy of the GNU General Public License along\n" +
|
97
|
+
"with this program; if not, write to the Free Software Foundation, Inc.,\n" +
|
98
|
+
"51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA."
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
def on_quit destroy
|
103
|
+
# @project.save_project
|
104
|
+
Gtk.main_quit
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
def paint_logo
|
109
|
+
return if self.window.nil?
|
110
|
+
cc = window.create_cairo_context
|
111
|
+
cc.set_source_pixbuf @logoPixbuf, allocation.width - 70, 12
|
112
|
+
cc.paint
|
113
|
+
false
|
114
|
+
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/lib/etti/version.rb
ADDED
data/lib/etti.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Etti
|
2
|
+
DATA_PATH = File.expand_path(File.dirname(__FILE__) + '/../lib/data') + '/'
|
3
|
+
PIXMAP_PATH = DATA_PATH + 'pixmaps/'
|
4
|
+
LOCALE_PATH = DATA_PATH + 'locale/'
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
require 'fileutils'
|
9
|
+
require 'cairo'
|
10
|
+
require 'gettext'
|
11
|
+
require 'gtk3'
|
12
|
+
require 'json'
|
13
|
+
require 'qrencoder'
|
14
|
+
require 'filemagic'
|
15
|
+
|
16
|
+
require 'rgw/big-list'
|
17
|
+
require 'rgw/property-editor'
|
18
|
+
require 'rgw/radio-revealer'
|
19
|
+
require 'rgw/restricted-entry'
|
20
|
+
|
21
|
+
#require 'etti/config'
|
22
|
+
require 'etti/colors'
|
23
|
+
require 'etti/dnd-data'
|
24
|
+
require 'etti/page-datas'
|
25
|
+
require 'etti/print-view'
|
26
|
+
|
27
|
+
require 'etti/monkeys/array'
|
28
|
+
require 'etti/monkeys/cairo-context'
|
29
|
+
require 'etti/monkeys/gtk-event-box'
|
30
|
+
|
31
|
+
require 'etti/elements/base'
|
32
|
+
require 'etti/elements/text'
|
33
|
+
require 'etti/elements/data'
|
34
|
+
|
35
|
+
require 'etti/file/data-reader'
|
36
|
+
|
37
|
+
require 'etti/ui/data-page'
|
38
|
+
require 'etti/ui/label-elements'
|
39
|
+
require 'etti/ui/label-layout'
|
40
|
+
require 'etti/ui/label-layout-page'
|
41
|
+
require 'etti/ui/label-selection-page'
|
42
|
+
require 'etti/ui/message-dialog'
|
43
|
+
require 'etti/ui/page-layout'
|
44
|
+
require 'etti/ui/property-editor-data'
|
45
|
+
require 'etti/ui/window'
|