etti 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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