etti 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01d2ab51124b22c47e91b53f203896608f6864ba
4
- data.tar.gz: 751753191c55665d7765dd7e16b84a701ce172d0
3
+ metadata.gz: 89d498ee2a421b67fe7a12feb07ddd52235b6c84
4
+ data.tar.gz: 3c9bfb33e739f40f16d06b4d8361a9cab4f9fb98
5
5
  SHA512:
6
- metadata.gz: daf955706b9dac4c9ddd464c4732a848853b807bd56ed6016e835748c392827ca61b51f3cfc4e979d51aa378cbbd1e57fbb290f38bfc7984ccda574f0e11cace
7
- data.tar.gz: 6ad7f544fd18741f19094ff9410bba699002f475697ebbcf7945abb321035dc90ec905ffed8f8bd19c3db60e663a48db1cf8cf308cf34e44c5da372f7a7ccc52
6
+ metadata.gz: 85f9d0437799b067274fbde95db136cde8f585184163ea812e996484696f7750cea97e26fa23d214cf5fcf6836db856253719424f49c8d759d6cd584d4c5f043
7
+ data.tar.gz: 9794973cc6429b7265120b67a7b2e750e94fab7a62d19411cd1b6e7f2046eddc827ebda7acf204e06b6b2affcd8c277c9245d997ab25c2c3a48645c17bad8528
@@ -3,10 +3,14 @@
3
3
  module Etti
4
4
  module Element
5
5
  class Data < Etti::Element::Text
6
+ include GetText
7
+ GetText.bindtextdomain 'etti', :path => Etti::LOCALE_PATH
8
+
6
9
  SHOW_AS_TEXT = 0
7
10
  SHOW_AS_QR = 1
8
11
  QR_ERROR_LEVELS = [:low, :medium, :quarter, :high]
9
12
  QR_ENCODING = [:numeric, :alphanumeric, :ascii, :kanji]
13
+ QR_KEYS = ['dataGroup', 'qrWidth', 'qrHeight', 'qrVersion', 'qrErrorCorrection', 'qrEncoding']
10
14
  def initialize dataGroup, text, x=nil, y=nil, size=nil
11
15
  super text, x, y, size
12
16
  @dataGroup = dataGroup
@@ -26,7 +30,11 @@ module Etti
26
30
  elsif name == 'qrVersion' then @qrVersion = val.to_i; return;
27
31
  elsif name == 'qrErrorCorrection' then @qrErrorCorrection = QR_ERROR_LEVELS[val.to_i]; return;
28
32
  elsif name == 'qrEncoding' then @qrEncoding = QR_ENCODING[val.to_i]; return;
29
- elsif name == 'showAs' then @showAs = val; return; end
33
+ elsif name == 'dataGroup' then @dataGroup = val; return;
34
+ elsif name == 'showAs'
35
+ @showAs = (val == SHOW_AS_TEXT or val == 'text') ? SHOW_AS_TEXT : SHOW_AS_QR
36
+ return;
37
+ end
30
38
  super name, val
31
39
  end
32
40
 
@@ -37,22 +45,56 @@ module Etti
37
45
  elsif name == 'qrVersion' then return @qrVersion;
38
46
  elsif name == 'qrErrorCorrection' then return QR_ERROR_LEVELS.index @qrErrorCorrection;
39
47
  elsif name == 'qrEncoding' then return QR_ENCODING.index @qrEncoding;
40
- elsif name == 'showAs' then return @showAs; end
48
+ elsif name == 'showAs' then return @showAs;
49
+ elsif name == 'dataGroup' then return @dataGroup; end
41
50
  super name
42
51
  end
43
52
 
44
53
 
45
54
  def to_h
46
- hs = {}
55
+ hs = super()
56
+ hs['elementType'] = 'data'
47
57
  if @showAs == SHOW_AS_TEXT
48
58
  hs['showAs'] = 'text'
49
59
  else
50
60
  hs['showAs'] = 'qr'
51
- ['qrWidth', 'qrHeight', 'qrVersion', 'qrErrorCorrection', 'qrEncoding'].each do |name|
52
- hs[name] = get_by_name name
61
+ QR_KEYS.each {|name| hs[name] = get_by_name name}
62
+ end
63
+ hs
64
+ end
65
+
66
+
67
+ def validate_from_h hs
68
+ sections = Etti::PropertyEditorData::DATA_PROPS.select{|a| a.key? :revealSections}.first[:revealSections]
69
+
70
+ if hs['showAs'] == 'text'
71
+ return super(hs)
72
+ elsif hs['showAs'] == 'qr'
73
+ data = sections.select{|a| a[:section] == 'QR-Code'}.first[:data]
74
+ # sort out all keys which are no in qrKeys and give them to the parent class
75
+ keys = hs.keys - QR_KEYS
76
+ diff = hs.select {|k, v| keys.include? k}
77
+ ret = super diff
78
+ return ret if ret
79
+
80
+ # check the value of the remaining keys
81
+ QR_KEYS.each do |name|
82
+ next if hs[name].nil?
83
+ if name == 'dataGroup'
84
+ return _('ElementData invalid type or size for dataGroup') unless hs[name].is_a? String and hs[name].length() > 0
85
+ next
86
+ end
87
+ entry = data.select {|dat| dat[:id0] == name or dat[:id1] == name}
88
+ if entry[0][:range]
89
+ return _("ElementData %s is out of range") % name unless entry[0][:range].cover? hs[name]
90
+ elsif entry[0][:entries]
91
+ return _("ElementData %s is out of range") % name if hs[name] < 0 or hs[name] >= entry[0][:entries].length
92
+ end
53
93
  end
94
+ else
95
+ return _('ElementData invalid data type')
54
96
  end
55
- hs.merge super()
97
+ nil
56
98
  end
57
99
 
58
100
 
@@ -3,6 +3,11 @@
3
3
  module Etti
4
4
  module Element
5
5
  class Text < Etti::Element::Base
6
+ include GetText
7
+ GetText.bindtextdomain 'etti', :path => Etti::LOCALE_PATH
8
+
9
+ TEXT_KEYS = ['text', 'pos_x', 'pos_y', 'size', 'rotation', 'color']
10
+ GROUP_KEYS = ['elementType', 'dataGroup', 'showAs']
6
11
  def initialize text, x=nil, y=nil, size=nil
7
12
  super x, y
8
13
  @text = text || ''
@@ -27,16 +32,46 @@ module Etti
27
32
  elsif name == 'size' then return @size;
28
33
  elsif name == 'rotation' then return @rotation;
29
34
  elsif name == 'color' then return @color; end
35
+ nil
30
36
  end
31
37
 
32
38
 
33
39
  def to_h
40
+ # hs = super() # use this if we take data from Element::Base
34
41
  hs = {}
35
- ['text', 'pos_x', 'pos_y', 'size', 'rotation', 'color'].each do |name|
36
- hs[name] = get_by_name name
37
- end
42
+ hs['elementType'] = 'text'
43
+ TEXT_KEYS.each {|name| hs[name] = get_by_name name}
38
44
  hs
39
- # hs.merge super
45
+ end
46
+
47
+
48
+ def validate_from_h hs
49
+ data = Etti::PropertyEditorData::TEXTS_PROPS
50
+ # stop if hs has a key that is not in TEXT_KEYS
51
+ return _('ElementText invalid property keys') if (hs.keys - GROUP_KEYS - TEXT_KEYS).length() > 0
52
+ # check the value of the keys
53
+ TEXT_KEYS.each do |name|
54
+ next if hs[name].nil?
55
+ entry = data.select {|dat| dat[:id0] == name or dat[:id1] == name}
56
+ if entry[0][:range]
57
+ return _("ElementText %s is out of range") % name unless entry[0][:range].cover? hs[name]
58
+ elsif name == 'text'
59
+ # we limit the text length to 10_000 chars; for a label thats more than enough
60
+ return _("ElementText %s length is out of range") % name if hs[name].length() < 1 or hs[name].length > 10_000
61
+ elsif name == 'color'
62
+ col = hs[name]
63
+ return _('ElementText color is invalid') if !col.is_a? Array or col.length() != 4
64
+ col.each do |val|
65
+ return _('ElementText invalid value in color') if val < 0.0 or val > 1.0
66
+ end
67
+ end
68
+ end
69
+ nil
70
+ end
71
+
72
+
73
+ def from_h hs
74
+ hs.each_pair {|k, v| set_by_name k, v}
40
75
  end
41
76
 
42
77
 
@@ -36,7 +36,7 @@ module Etti
36
36
  end
37
37
  end
38
38
  end
39
- attr_reader :pageDatas
39
+ attr_reader :pageDatas, :pageDimensions
40
40
 
41
41
 
42
42
  def get_page_names
@@ -60,6 +60,26 @@ module Etti
60
60
  end
61
61
 
62
62
 
63
+ def set_page_data type, data
64
+ newPage = !@pageDatas.key?(type)
65
+ if newPage
66
+ pageHash = {}
67
+ else
68
+ pageHash = @pageDatas[type]
69
+ end
70
+ FIELDS.each do |key|
71
+ d = data[key]
72
+ if d.is_a? Array or d.is_a? String
73
+ pageHash[key.to_sym] = d.clone
74
+ else
75
+ pageHash[key.to_sym] = data[key]
76
+ end
77
+ end
78
+ pageHash[:name] = type
79
+ signal_emit(:new_page, [type, pageHash]) if newPage
80
+ end
81
+
82
+
63
83
  def get_page_dimensions size
64
84
  @pageDimensions[size]
65
85
  end
@@ -104,6 +124,10 @@ module Etti
104
124
  signal_emit :new_page, [page[:name], pageHash]
105
125
  end
106
126
 
127
+ unless savePage
128
+ pageHash['name'] = page[:name]
129
+ end
130
+
107
131
  return pageHash unless savePage
108
132
  fd = File.new @dataFiles.last, File::CREAT|File::TRUNC|File::RDWR, 0644
109
133
  fileData = $etti_developement_version ? JSON.pretty_generate(json) : JSON.fast_generate(json)
@@ -43,16 +43,47 @@ module Etti
43
43
  settings['string'] = @dataEntries[1].text
44
44
  settings['postfix'] = @dataEntries[2].text
45
45
  elsif section == 1
46
-
47
-
46
+ settings['section'] = 'file'
47
+ settings['fileName'] = @fileButton.filename
48
+ settings['separator'] = @previewList.separator
49
+ settings['hasHead'] = @hasHeadCheckButton.active? ? 1 : 0
48
50
  end
49
51
  settings
50
52
  end
51
53
 
52
54
 
53
- def set_user_settings
54
-
55
-
55
+ def validate_user_settings settings
56
+ if settings['section'] == 'enumeration'
57
+ return _('DataPage prefix is not a String.') unless settings['prefix'].is_a? String
58
+ return _('DataPage data string is not a String.') unless settings['string'].is_a? String
59
+ return _('DataPage postfix is not a String.') unless settings['postfix'].is_a? String
60
+ elsif settings['selection'] == 'file'
61
+ fn = settings['file']
62
+ return _('DataPage filename is not a String.') unless fn.is_a? String
63
+ return _("DataPage file doesn'exist, or is not readable.") unless File.exist? fn and File.readable? fn
64
+ sep = settings['separator']
65
+ return _('DataPage separator is not a String') unless sep.is_a? String and @separatorStrings.include? sep
66
+ hs = settings['hasHead']
67
+ return _('DataPage has head setting is invalid (not 0 or 1)') unless hs.is_a? Integer and (hs == 0 or hs == 1)
68
+ else
69
+ return _('DataPage section is invalid')
70
+ end
71
+ nil
72
+ end
73
+
74
+
75
+ def set_user_settings settings
76
+ if settings['section'] == 'enumeration'
77
+ @radioRevealer.active = 0
78
+ @dataEntries[0].text = settings['prefix']
79
+ @dataEntries[1].text = settings['string']
80
+ @dataEntries[2].text = settings['postfix']
81
+ else
82
+ @radioRevealer.active = 0
83
+ @fileButton.filename = settings['fileName']
84
+ @fileSeparatorCombo.active = @separatorStrings.index settings['separator']
85
+ @hasHeadCheckButton.active = settings['hasHead'] == 1
86
+ end
56
87
  end
57
88
 
58
89
 
@@ -19,13 +19,8 @@ module Etti
19
19
 
20
20
  @layoutPreview = Etti::LabelLayout.new @propertyViews
21
21
  paned.pack1 @layoutPreview, :resize => true, :shrink => true
22
- # @layoutPreview.signal_connect(:element_count_changed) do |widget, count|
23
- # @saveButton.sensitive = (count > 0 and @saveButtonActivated)
24
- # @saveAsButton.sensitive = count > 0
25
- # end
26
22
 
27
23
  ebox = Gtk::Box.new :horizontal
28
-
29
24
  paned.pack2 ebox, :resize => false, :shrink => false
30
25
 
31
26
  label = Gtk::Label.new _(' Drag the elements over ')
@@ -37,6 +32,7 @@ module Etti
37
32
  end
38
33
  attr_reader :layoutPreview
39
34
 
35
+
40
36
  def get_user_settings
41
37
  settings = {}
42
38
  settings['scale'] = @layoutPreview.scale
@@ -45,19 +41,52 @@ module Etti
45
41
  elementData = []
46
42
  @layoutPreview.elements.each {|element| elementData << element.to_h}
47
43
  settings['elements'] = elementData
48
- end
49
-
50
- def set_user_settings
51
-
44
+ settings
52
45
  end
53
46
 
54
47
 
55
- =begin
56
- def activate_save state
57
- @saveButtonActivate = state
58
- @saveButton.sensitive = (state and @layoutPreview.elements.length() > 0)
48
+ def validate_user_settings settings
49
+ return _('LabelLayout scale is not a Numeric') unless settings['scale'].is_a? Numeric
50
+ return _('LabelLayout scale is out of range') if settings['scale'] < Etti::LabelLayout::SCALE_MIN or
51
+ settings['scale'] > Etti::LabelLayout::SCALE_MAX
52
+ return _('LabelLayout centerX is not a Numeric') unless settings['centerX'].is_a? Numeric
53
+ return _('LabelLayout centerY is not a Numeric') unless settings['centerY'].is_a? Numeric
54
+ return _('LabelLayout elements is not an Array') unless settings['elements'].is_a? Array
55
+ settings['elements'].each do |element|
56
+ el = nil
57
+ if element['elementType'] == 'text'
58
+ el = Etti::Element::Text.new 'vali'
59
+ elsif element['elementType'] == 'data'
60
+ el = Etti::Element::Data.new :dg, 'vali'
61
+ else
62
+ return _("LabelLayout element type %s is unknown") % element['elementType'].to_s
63
+ end
64
+ ret = el.validate_from_h element
65
+ return ret if ret
66
+ end
67
+ nil
59
68
  end
60
- =end
69
+
70
+
71
+ def set_user_settings settings
72
+ @layoutPreview.scale = settings['scale']
73
+ @layoutPreview.centerX = settings['centerX']
74
+ @layoutPreview.centerY = settings['centerY']
75
+
76
+ @layoutPreview.elements.clear
77
+
78
+ settings['elements'].each do |element|
79
+ el = nil
80
+ if element['elementType'] == 'text'
81
+ el = Etti::Element::Text.new element['text']
82
+ elsif element['elementType'] == 'data'
83
+ el = Etti::Element::Data.new element['dataGroup'], element['text']
84
+ end
85
+ el.from_h element
86
+ @layoutPreview.elements << el
87
+ end
88
+ end
89
+
61
90
 
62
91
  def update_page_data pageData
63
92
  @pageData = pageData
@@ -103,129 +132,5 @@ module Etti
103
132
  end
104
133
  end
105
134
  end
106
-
107
- =begin
108
- def create_toolbar
109
- toolbar = Gtk::Box.new :horizontal
110
- toolbarData = [{:stock => Gtk::Stock::OPEN,
111
- :method => proc{on_open},
112
- :tooltip => _('open a new document')},
113
- {:stock => Gtk::Stock::SAVE,
114
- :method => proc{on_save true},
115
- :tooltip => _('save the document')},
116
- {:stock => Gtk::Stock::SAVE_AS,
117
- :method => proc{on_save false},
118
- :tooltip => _('save the document under a new name')},
119
- {:stock => Gtk::Stock::PRINT,
120
- :method => proc{on_print},
121
- :tooltip => _('print the labels')},
122
- :separator,
123
- {:stock => Gtk::Stock::ZOOM_IN,
124
- :method => proc{@layoutPreview.zoom_in},
125
- :tooltip => _('zoom in')},
126
- {:stock => Gtk::Stock::ZOOM_OUT,
127
- :method => proc{@layoutPreview.zoom_out},
128
- :tooltip => _('zoom out')},
129
- {:stock => Gtk::Stock::ZOOM_FIT,
130
- :method => proc{@layoutPreview.zoom_fit},
131
- :tooltip => _('zoom that all is displayed')}]
132
- toolbarData.each_with_index do |buttonData, idx|
133
- if buttonData.is_a? Hash
134
- button = Gtk::Button.new
135
- if idx == 1
136
- @saveButton = button
137
- button.sensitive = false
138
- elsif idx == 2
139
- @saveAsButton = button
140
- button.sensitive = false
141
- end
142
- button.tooltip_text = buttonData[:tooltip]
143
- button.signal_connect(:clicked) {buttonData[:method].call}
144
- img = Gtk::Image.new :stock => buttonData[:stock], :size => :large_toolbar
145
- button << img
146
- toolbar.pack_start button, :expand => false, :fill => false, :padding => 0
147
- elsif buttonData.is_a? Symbol
148
- sep = Gtk::Separator.new :vertical
149
- toolbar.pack_start sep, :expand => false, :fill => false, :padding => 8
150
- end
151
- end
152
- toolbar
153
- end
154
-
155
-
156
- def on_open
157
- p 'open file'
158
- end
159
-
160
-
161
- def on_save same
162
- signal_emit :save_document, same
163
- end
164
-
165
-
166
- def on_print
167
- # set the borders from the selected label sheet
168
- pageSetup = Gtk::PageSetup.new
169
- pageSetup.set_left_margin @pageData[:borders][0], :mm
170
- pageSetup.set_top_margin @pageData[:borders][1], :mm
171
- pageSetup.set_right_margin @pageData[:borders][0], :mm
172
- pageSetup.set_bottom_margin @pageData[:borders][1], :mm
173
-
174
-
175
- printOperation = Gtk::PrintOperation.new
176
- printOperation.show_progress = true
177
- printOperation.default_page_setup = pageSetup
178
- printOperation.n_pages = (@layoutPreview.elementDataData.length().to_f /
179
- (@pageData[:cols] * @pageData[:rows]).to_f).ceil
180
-
181
- printOperation.signal_connect('draw-page') do |widget, printContext, pageNumber|
182
- cc = printContext.cairo_context
183
- @layoutPreview.print_labels cc, pageNumber
184
- end
185
-
186
- ret = printOperation.run :print_dialog, self.toplevel
187
-
188
- #=begin
189
- # only for debugging purpose
190
- printOperation.signal_connect('end-print') {print "-=== printing ended\n"}
191
-
192
- printOperation.signal_connect('status-changed') do
193
- case printOperation.status
194
- when Gtk::PrintOperation::Status::INITIAL
195
- p 'initial'
196
- when Gtk::PrintOperation::Status::PREPARING
197
- p 'preparing'
198
- when Gtk::PrintOperation::Status::GENERATING_DATA
199
- p 'GENERATING_DATA'
200
- when Gtk::PrintOperation::Status::SENDING_DATA
201
- p 'SENDING_DATA'
202
- when Gtk::PrintOperation::Status::PENDING
203
- p 'PENDING'
204
- when Gtk::PrintOperation::Status::PRINTING
205
- p 'PRINTING'
206
- when Gtk::PrintOperation::Status::FINISHED
207
- p 'FINISHED'
208
- when Gtk::PrintOperation::Status::FINISHED_ABORTED
209
- p 'FINISHED_ABORTED'
210
- else
211
- 'p unknown'
212
- end
213
- end
214
-
215
- case ret
216
- when Gtk::PrintOperation::Result::ERROR
217
- print "error\n"
218
- when Gtk::PrintOperation::Result::CANCEL
219
- print "cancelled\n"
220
- when Gtk::PrintOperation::Result::APPLY
221
- print "applied\n"
222
- when Gtk::PrintOperation::Result::IN_PROGRESS
223
- print "in progress\n"
224
- else
225
- print "unknown result: ",printr.inspect,"\n"
226
- end
227
- #=end
228
- end
229
- =end
230
135
  end
231
136
  end
@@ -57,7 +57,8 @@ module Etti
57
57
  @width = nil
58
58
  @height = nil
59
59
  end
60
- attr_reader :backBuffer, :scale, :centerX, :centerY, :elements, :elementDataData
60
+ attr_reader :backBuffer, :elementDataData
61
+ attr_accessor :scale, :centerX, :centerY, :elements
61
62
 
62
63
 
63
64
  def on_drag_drop context, x, y
@@ -194,7 +195,7 @@ module Etti
194
195
  h = @pageData[:size][1] * 2.8346457
195
196
 
196
197
  sl = (@pageData[:cols] * @pageData[:rows]) * page
197
- el = elementDataData.length
198
+ el = @elementDataData.length
198
199
  labels = el - sl
199
200
 
200
201
  idc = []
@@ -277,13 +278,15 @@ module Etti
277
278
  minY = 2**31
278
279
  maxY = - 2**31
279
280
 
280
- @elements.each do |element|
281
- ext = element.get_extent self
282
- # TODO use min max methodes
283
- minX = ext.x if ext.x < minX
284
- minY = ext.y if ext.y < minY
285
- maxX = ext.x + ext.width if ext.x + ext.width > maxX
286
- maxY = ext.y + ext.height if ext.y + ext.height > maxY
281
+ if @backBuffer
282
+ @elements.each do |element|
283
+ ext = element.get_extent self
284
+ # TODO use min max methodes
285
+ minX = ext.x if ext.x < minX
286
+ minY = ext.y if ext.y < minY
287
+ maxX = ext.x + ext.width if ext.x + ext.width > maxX
288
+ maxY = ext.y + ext.height if ext.y + ext.height > maxY
289
+ end
287
290
  end
288
291
 
289
292
  # get the label in
@@ -29,6 +29,58 @@ module Etti
29
29
 
30
30
  attr_reader :labelList, :pageData, :pageDatas
31
31
 
32
+
33
+ def get_user_settings
34
+ @pageDatas.save_page_data(@pageData, false){}
35
+ end
36
+
37
+
38
+ def validate_user_settings settings
39
+ settings.keys.each do |key|
40
+ unless Etti::PageDatas::FIELDS.include? key.to_sym
41
+ next if key == 'source' or key == 'name'
42
+ return _("PageData has invalid property key %s") % key.to_s
43
+
44
+ end
45
+ end
46
+ [:manufacture, :orderNr, :description, :name].each do |label|
47
+ val = settings[label.to_s]
48
+ next if val.nil?
49
+ return _("PageData %s is invalid") % label unless val.is_a? String
50
+ return _('PageData name is invalid') if label == :name and val.length() < 1
51
+ end
52
+ [:cols, :rows].each do |label|
53
+ val = settings[label.to_s]
54
+ next if val.nil?
55
+ return _("PageData %s is invalid") % label unless val.is_a? Numeric and val > 0.0
56
+ end
57
+ [:size, :borders, :padding].each do |label|
58
+ val = settings[label.to_s]
59
+ next if val.nil?
60
+ return _("PageData %s is invalid") % label unless val.is_a? Array and val.length() == 2
61
+ return _("PageData %s is invalid") % label unless val[0].is_a? Numeric and val[1].is_a? Numeric and val[0] >= 0 and val[1] >= 0
62
+ end
63
+ return _('PageData pageSize is invalid') unless @pageDatas.pageDimensions.include? settings['pageSize']
64
+ nil
65
+ end
66
+
67
+
68
+ def set_user_settings settings
69
+ name = settings['name']
70
+ @pageDatas.set_page_data name, settings
71
+ pt = nil
72
+ @labelListStore.each do |model, path, iter|
73
+ if iter[0] == name
74
+ @labelList.selection.select_path path
75
+ # We have to call the update manualy, because sometimes the :cursor_changed signal
76
+ # not emited.
77
+ on_label_list_cursor_changed
78
+ return
79
+ end
80
+ end
81
+ end
82
+
83
+
32
84
  def create_label_list
33
85
  @labelListStore = Gtk::ListStore.new String
34
86
  @labelList = Gtk::TreeView.new @labelListStore
@@ -51,7 +103,7 @@ module Etti
51
103
 
52
104
 
53
105
  def on_label_list_cursor_changed
54
- name = @labelListStore.get_iter(@labelList.cursor[0]).get_value 0
106
+ name = @labelListStore.get_value @labelList.selection.selected, 0
55
107
  if @previewArea.entryChanged and @pageData[:name] != name
56
108
  message = _("The page was changed. Should it be saved?")
57
109
  dialog = Etti::MessageDialog.new self.toplevel, :buttons => [:yes, :no, :cancel],
@@ -26,7 +26,7 @@ module Etti
26
26
  if flags[:buttons]
27
27
  @buttonBox = Gtk::Box.new :horizontal
28
28
  @buttonBox.homogeneous = true
29
- @vbox.pack_start @buttonBox, :expand => false, :fill => false
29
+ @vbox.pack_end @buttonBox, :expand => false, :fill => false
30
30
 
31
31
  flags[:buttons].each do |btn|
32
32
  stock = case btn
@@ -77,6 +77,13 @@ module Etti
77
77
  @hbox.pack_start label, :expand => true, :fill => true, :padding => 12
78
78
  end
79
79
 
80
+
81
+ if flags[:additional]
82
+ label = Gtk::Label.new flags[:additional]
83
+ @vbox.pack_start label, :expand => true, :fill => true, :padding => 12
84
+ end
85
+
86
+
80
87
  if flags[:remind]
81
88
 
82
89
  end
@@ -29,7 +29,10 @@ module Etti
29
29
 
30
30
  {label: _('rotation'), type: :spin, useDefault: true,
31
31
  id0: 'rotation', range: 0.0..360.0, step: 1.0,
32
- default0: DEFAULT_TEXTS_ROTATION}
32
+ default0: DEFAULT_TEXTS_ROTATION},
33
+
34
+ {label: _('color'), type: :color, useDefault: true,
35
+ id0: 'color', default0: DEFAUTL_TEXTS_COLOR},
33
36
  ]
34
37
 
35
38
 
@@ -171,14 +171,78 @@ module Etti
171
171
 
172
172
 
173
173
  def on_open
174
-
174
+ fileChooser = Gtk::FileChooserDialog.new :title => _('Open File'),
175
+ :parent => self.toplevel,
176
+ :action => :open,
177
+ :buttons => [[:cancel, :cancel],
178
+ [:ok, :ok]]
179
+
180
+ fileChooser.filter = @documentFileFilter
181
+ ret = fileChooser.run
182
+ path = fileChooser.filename.clone
183
+ fileChooser.destroy
184
+
185
+ return if ret == Gtk::ResponseType::CANCEL
186
+ return if path.nil?
187
+
188
+ @document = path
189
+ activate_save true
190
+
191
+ data = File.new(path).read
192
+
193
+ begin
194
+ json = JSON.parse data
195
+ rescue JSON::ParserError => additional
196
+ message = _("The document contains errors\nMessage from the file reader:")
197
+
198
+ dialog = Etti::MessageDialog.new self.toplevel, :buttons => [:close],
199
+ :type => :info, :message => message,
200
+ :title => _('Invalid Entries'),
201
+ :additional => additional.to_s
202
+ dialog.run
203
+ return
204
+ end
205
+
206
+
207
+ unless json['Etti'] == 'document file'
208
+ message = _("The document file\n\"%s\"\nis not a valid etti document") % path
209
+ dialog = Etti::MessageDialog.new self.toplevel, :buttons => [:close],
210
+ :type => :info, :message => message,
211
+ :title => _('Invalid Entries')
212
+ dialog.run
213
+ return
214
+ end
215
+
216
+ # restore all settings
217
+ sdat = [[@dataPage, json['UserData']],
218
+ [@labelLayoutPage, json['LabelLayout']],
219
+ [@labelSelectionPage, json['PageData']]]
220
+ return if validate_settings sdat
221
+ sdat.each {|section| section[0].send :set_user_settings, section[1]}
222
+ end
223
+
224
+
225
+ def validate_settings data
226
+ data.each do |section|
227
+ ret = section[0].send :validate_user_settings, section[1]
228
+ if ret
229
+ message = _('The file could not be loaded.')
230
+ dialog = Etti::MessageDialog.new self.toplevel, :buttons => [:close],
231
+ :type => :error, :message => message,
232
+ :title => _('File load error'),
233
+ :additional => ret
234
+ dialog.run
235
+ return true
236
+ end
237
+ end
238
+ false
175
239
  end
176
240
 
177
241
 
178
242
  def on_save same
179
243
  path = @document
180
244
  unless same
181
- fileChooser = Gtk::FileChooserDialog.new :title => _('Select File'),
245
+ fileChooser = Gtk::FileChooserDialog.new :title => _('Save File'),
182
246
  :parent => self.toplevel,
183
247
  :action => :save,
184
248
  :buttons => [[:cancel, :cancel],
@@ -208,11 +272,11 @@ module Etti
208
272
 
209
273
  json = {'Etti' => 'document file', 'Version' => [1, 0]}
210
274
  json['UserData'] = @dataPage.get_user_settings
211
- json['PageData'] = @labelSelectionPage.pageDatas.save_page_data(@labelSelectionPage.pageData, false){}
275
+ json['PageData'] = @labelSelectionPage.get_user_settings
212
276
  json['LabelLayout'] = @labelLayoutPage.get_user_settings
213
277
 
214
278
  fd = File.new path, File::CREAT|File::TRUNC|File::RDWR, 0644
215
- fd.write JSON.pretty_generate(json)
279
+ fd.write JSON.pretty_generate(json, :indent => ' ')
216
280
  fd.flush
217
281
  end
218
282
 
data/lib/etti/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Etti
2
- VERSION = [0, 5, 0]
2
+ VERSION = [0, 6, 0]
3
3
  end
data/lib/etti.rb CHANGED
@@ -19,7 +19,6 @@ require 'rgw/property-editor'
19
19
  require 'rgw/radio-revealer'
20
20
  require 'rgw/restricted-entry'
21
21
 
22
- #require 'etti/config'
23
22
  require 'etti/colors'
24
23
  require 'etti/dnd-data'
25
24
  require 'etti/page-datas'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: etti
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Detlef Reichl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-04 00:00:00.000000000 Z
11
+ date: 2014-06-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n-toolbox