Skip to content

Commit a8d1428

Browse files
authored
Merge pull request #2080 from hansu/tooledit
Tooledit: Correct data type and validate input for orientation + warn if out of range
2 parents 41357df + cad3a1b commit a8d1428

2 files changed

Lines changed: 65 additions & 18 deletions

File tree

lib/python/gladevcp/tooledit_gtk.glade

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<interface>
3-
<requires lib="gtk+" version="2.18"/>
3+
<requires lib="gtk+" version="3.0"/>
44
<!-- interface-naming-policy project-wide -->
55
<object class="GtkListStore" id="liststore1">
66
<columns>
@@ -35,7 +35,7 @@
3535
<!-- column-name back -->
3636
<column type="gchararray"/>
3737
<!-- column-name orient -->
38-
<column type="gchararray"/>
38+
<column type="gint"/>
3939
<!-- column-name comments -->
4040
<column type="gchararray"/>
4141
</columns>
@@ -49,17 +49,19 @@
4949
<object class="GtkWindow" id="window1">
5050
<property name="can_focus">False</property>
5151
<child>
52-
<object class="GtkVBox" id="tooledit_box">
52+
<object class="GtkBox" id="tooledit_box">
5353
<property name="visible">True</property>
5454
<property name="can_focus">False</property>
55+
<property name="orientation">vertical</property>
5556
<child>
5657
<object class="GtkNotebook" id="tool_offset_notebook">
5758
<property name="visible">True</property>
5859
<property name="can_focus">True</property>
5960
<child>
60-
<object class="GtkVBox" id="vbox1">
61+
<object class="GtkBox" id="vbox1">
6162
<property name="visible">True</property>
6263
<property name="can_focus">False</property>
64+
<property name="orientation">vertical</property>
6365
<child>
6466
<object class="GtkScrolledWindow" id="all_window">
6567
<property name="visible">True</property>
@@ -286,7 +288,7 @@
286288
</packing>
287289
</child>
288290
<child>
289-
<object class="GtkHButtonBox" id="buttonbox">
291+
<object class="GtkButtonBox" id="buttonbox">
290292
<property name="visible">True</property>
291293
<property name="can_focus">False</property>
292294
<property name="layout_style">center</property>

lib/python/gladevcp/tooledit_widget.py

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ def match_tool(model, path, iter, pathlist):
226226
except:
227227
print(_("tooledit_widget error: cannot select tool number"),toolnumber)
228228

229-
def add(self,widget,data=[1,0,0,'0','0','0','0','0','0','0','0','0','0','0','0','0',"comment"]):
229+
def add(self,widget,data=[1,0,0,'0','0','0','0','0','0','0','0','0','0','0','0',0,"comment"]):
230230
self.model.append(data)
231231
self.num_of_col +=1
232232

@@ -235,6 +235,17 @@ def set_filename(self,filename):
235235
self.toolfile = filename
236236
self.reload(None)
237237

238+
def warning_dialog(self, line_number):
239+
message = _("Error in tool table line {0} in column ").format(line_number) + _("Orientation") + \
240+
_(".\nValid range is 0 - 9.")
241+
dialog = Gtk.MessageDialog(self.wTree.get_object("window1"),
242+
Gtk.DialogFlags.DESTROY_WITH_PARENT,
243+
Gtk.MessageType.ERROR, Gtk.ButtonsType.OK,
244+
message)
245+
dialog.show()
246+
dialog.run()
247+
dialog.destroy()
248+
238249
# Reload the tool file into display
239250
def reload(self,widget):
240251
self.hash_code = self.md5sum(self.toolfile)
@@ -247,18 +258,23 @@ def reload(self,widget):
247258
return
248259
logfile = open(self.toolfile, "r").readlines()
249260
self.toolinfo = []
261+
line_number = 0
250262
for rawline in logfile:
251263
# strip the comments from line and add directly to array
252264
# if index = -1 the delimiter ; is missing - clear comments
253265
index = rawline.find(";")
266+
# skip lines beginning with a semicolon
267+
if index == 0:
268+
continue
254269
comment =''
255270
if not index == -1:
256271
comment = (rawline[index+1:])
257272
comment = comment.rstrip("\n")
258273
line = rawline.rstrip(comment)
259274
else:
260275
line = rawline
261-
array = [0,0,0,'0','0','0','0','0','0','0','0','0','0','0','0','0',comment]
276+
line_number += 1
277+
array = [0,0,0,'0','0','0','0','0','0','0','0','0','0','0','0',0,comment]
262278
toolinfo_flag = False
263279
# search beginning of each word for keyword letters
264280
# offset 0 is the checkbutton so ignore it
@@ -278,11 +294,21 @@ def reload(self,widget):
278294
array[offset]= int(word.lstrip(i))
279295
except:
280296
print(_("Tooledit widget int error"))
297+
elif offset == 15:
298+
try:
299+
# Accept also float for 'orientation' for backward compatibility
300+
value = int(float(word.lstrip(i)))
301+
array[offset] = value
302+
if value not in range(10):
303+
self.warning_dialog(line_number)
304+
break
305+
except:
306+
print(_("Tooledit widget float error"))
281307
else:
282308
try:
283309
array[offset]= locale.format("%10.4f", float(word.lstrip(i)))
284310
except:
285-
print(_("Tooledit_widget float error"))
311+
print(_("Tooledit widget float error"))
286312
break
287313
if toolinfo_flag:
288314
self.toolinfo = array
@@ -292,16 +318,26 @@ def reload(self,widget):
292318
# Note we have to save the float info with a decimal even if the locale uses a comma
293319
def save(self,widget):
294320
if self.toolfile == None:return
321+
liststore = self.model
322+
# pre check before saving the file
323+
# if not done before, the file will be saved only until the erroneous line and the rest will be lost
324+
line_number = 0
325+
for row in liststore:
326+
values = [ value for value in row ]
327+
line_number += 1
328+
if values[15] > 9:
329+
self.warning_dialog(line_number)
330+
return
331+
295332
file = open(self.toolfile, "w")
296333
#print self.toolfile
297-
liststore = self.model
298334
for row in liststore:
299335
values = [ value for value in row ]
300336
#print values
301337
line = ""
302338
for num,i in enumerate(values):
303339
if num == 0: continue
304-
elif num in (1,2): # tool# pocket#
340+
elif num in (1,2,15): # tool#, pocket#, orientation
305341
line = line + "%s%d "%(KEYWORDS[num], i)
306342
elif num == 16: # comments
307343
test = i.strip()
@@ -421,17 +457,26 @@ def col_editted(self, widget, path, new_text, col, filter):
421457
elif filter == 'tool':
422458
(store_path,) = self.tool_filter.convert_path_to_child_path(path)
423459
path = store_path
424-
460+
425461
if col in(1,2):
426462
try:
427463
self.model[path][col] = int(new_text)
428464
except:
429465
pass
430-
elif col in range(3,16):
466+
# validate input for float columns
467+
elif col in range(3,15):
431468
try:
432469
self.model[path][col] = locale.format("%10.4f",locale.atof(new_text))
433470
except:
434471
pass
472+
# validate input for orientation: check if int and valid range
473+
elif col == 15:
474+
try:
475+
value = int(new_text)
476+
if value in range(10):
477+
self.model[path][col] = value
478+
except:
479+
pass
435480
elif col == 16:
436481
try:
437482
self.model[path][col] = (new_text)
@@ -561,15 +606,15 @@ def on_tree_navigate_key_press(self, treeview, event, filter):
561606
i += 1
562607
if colnum + i < len(columns):
563608
if columns[colnum + i].props.visible:
564-
renderer = columns[colnum + i].get_cell_renderers()
609+
renderer = columns[colnum + i].get_cells()
565610
if renderer[0].props.editable:
566611
next_column = columns[colnum + i]
567612
cont = False
568613

569614
else:
570615
i = 1
571616
while cont2:
572-
renderer = columns[i].get_cell_renderers()
617+
renderer = columns[i].get_cells()
573618
if renderer[0].props.editable:
574619
next_column = columns[i]
575620
cont2 = False
@@ -578,7 +623,7 @@ def on_tree_navigate_key_press(self, treeview, event, filter):
578623
cont = False
579624

580625
if keyname == 'Right':
581-
renderer = columns[colnum].get_cell_renderers()
626+
renderer = columns[colnum].get_cells()
582627
if type(focuschild) is Gtk.Entry:
583628
self.col_editted(renderer[0], path, treeview.get_focus_child().props.text, colnum, filter)
584629
GLib.timeout_add(50,
@@ -594,23 +639,23 @@ def on_tree_navigate_key_press(self, treeview, event, filter):
594639
i -= 1
595640
if colnum + i > 0:
596641
if columns[colnum + i].props.visible:
597-
renderer = columns[colnum + i].get_cell_renderers()
642+
renderer = columns[colnum + i].get_cells()
598643
if renderer[0].props.editable:
599644
next_column = columns[colnum + i]
600645
cont = False
601646

602647
else:
603648
i = -1
604649
while cont2:
605-
renderer = columns[i].get_cell_renderers()
650+
renderer = columns[i].get_cells()
606651
if renderer[0].props.editable:
607652
next_column = columns[i]
608653
cont2 = False
609654
else:
610655
i -= 1
611656
cont = False
612657

613-
renderer = columns[colnum].get_cell_renderers()
658+
renderer = columns[colnum].get_cells()
614659
if type(focuschild) is Gtk.Entry:
615660
self.col_editted(renderer[0], path, treeview.get_focus_child().props.text, colnum, filter)
616661
GLib.timeout_add(50,

0 commit comments

Comments
 (0)