pyvguicom 1.0.1__tar.gz → 1.1.1__tar.gz

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.

Potentially problematic release.


This version of pyvguicom might be problematic. Click here for more details.

Files changed (36) hide show
  1. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/PKG-INFO +1 -1
  2. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/browsewin.py +10 -11
  3. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgentry.py +75 -9
  4. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pggui.py +191 -92
  5. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgsel.py +9 -7
  6. pyvguicom-1.1.1/pyvguicom/pgtests.py +128 -0
  7. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgutils.py +42 -394
  8. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgwkit.py +36 -27
  9. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testbutt.py +1 -1
  10. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testcust.py +1 -1
  11. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testentry.py +19 -7
  12. pyvguicom-1.1.1/pyvguicom/testgui.py +125 -0
  13. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testlettsel.py +1 -1
  14. pyvguicom-1.1.1/pyvguicom/testmsgs.py +142 -0
  15. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testnums.py +1 -1
  16. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testsimple.py +4 -3
  17. pyvguicom-1.1.1/pyvguicom/testtests.py +79 -0
  18. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testtextv.py +2 -2
  19. pyvguicom-1.1.1/pyvguicom/testutils.py +139 -0
  20. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom.egg-info/PKG-INFO +1 -1
  21. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom.egg-info/SOURCES.txt +5 -0
  22. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/setup.py +15 -1
  23. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/README.md +0 -0
  24. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/__init__.py +0 -0
  25. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/custwidg.py +0 -0
  26. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/htmledit.py +0 -0
  27. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgbox.py +0 -0
  28. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgbutt.py +0 -0
  29. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgsimp.py +0 -0
  30. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/pgtextview.py +0 -0
  31. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/plug.py +0 -0
  32. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testicons.py +0 -0
  33. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom/testroot.py +0 -0
  34. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom.egg-info/dependency_links.txt +0 -0
  35. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/pyvguicom.egg-info/top_level.txt +0 -0
  36. {pyvguicom-1.0.1 → pyvguicom-1.1.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyvguicom
3
- Version: 1.0.1
3
+ Version: 1.1.1
4
4
  Summary: High power secure server GUI utility helpers.
5
5
  Home-page: https://github.com/pglen/pyguicom.git
6
6
  Author: Peter Glen
@@ -5,7 +5,8 @@
5
5
  import os, sys, getopt, signal, random, time, warnings
6
6
 
7
7
  realinc = os.path.realpath(os.path.dirname(__file__) + os.sep + "../pycommon")
8
- sys.path.append(realinc)
8
+ if realinc not in sys.path:
9
+ sys.path.append(realinc)
9
10
 
10
11
  from pgutils import *
11
12
  from pggui import *
@@ -13,7 +14,6 @@ from pgsimp import *
13
14
 
14
15
  import gi
15
16
  gi.require_version("Gtk", "3.0")
16
- #gi.require_version('WebKit2', '4.0')
17
17
 
18
18
  from gi.repository import Gtk
19
19
  from gi.repository import Gdk
@@ -21,15 +21,12 @@ from gi.repository import GLib
21
21
  from gi.repository import GObject
22
22
  from gi.repository import Pango
23
23
 
24
- ret = ""
24
+ from pedlib import pedconfig
25
25
 
26
- try:
27
- import pgwkit
28
- except:
29
- print("Cannot load WebKit2", sys.exc_info())
30
- sys.exit(1)
26
+ import pgwkit
27
+ #print("pgwkit:", pgwkit)
31
28
 
32
- class brow_win(Gtk.VBox):
29
+ class browserWin(Gtk.VBox):
33
30
 
34
31
  ''' Collection of URL bar, toolbar, status bar '''
35
32
 
@@ -55,9 +52,11 @@ class brow_win(Gtk.VBox):
55
52
  try:
56
53
  self.webview = pgwkit.pgwebw(self)
57
54
  except:
58
- print("Please install webkit2")
55
+ print("Please install WebKit2", sys.exc_info())
56
+ #if pedconfig.conf.verbose:
57
+ put_exception("start webview")
59
58
  #sys.exit(1)
60
- raise
59
+ #raise
61
60
 
62
61
  #self.old_html = ""
63
62
  self.scroll_win.add(self.webview)
@@ -20,6 +20,45 @@ def wrap(cont):
20
20
  fr.add(sc)
21
21
  return fr, cont
22
22
 
23
+ class Entryx(Gtk.Entry):
24
+
25
+ def __init__(self, noemit = False):
26
+ super(Entryx).__init__()
27
+ Gtk.Entry.__init__(self)
28
+ self.noemit = noemit # do not emit move next on enter
29
+ self.connect("key-press-event", self.key_press_event)
30
+
31
+ def set_noemit(self, flag):
32
+ self.noemit = flag
33
+
34
+ def set_gray(self, flag):
35
+ if flag:
36
+ self.set_editable(False);
37
+ style = self.get_style_context()
38
+ color = style.get_background_color(Gtk.StateFlags.NORMAL)
39
+ color2 = Gdk.RGBA(color.red-.1, color.green-.1, color.blue-.1)
40
+ self.override_background_color(Gtk.StateFlags.NORMAL, color2)
41
+ else:
42
+ self.set_editable(True);
43
+ style = self.get_style_context()
44
+ color = style.get_background_color(Gtk.StateFlags.NORMAL)
45
+ self.override_background_color(Gtk.StateFlags.NORMAL, color)
46
+
47
+ def key_press_event(self, arg1, event):
48
+ #print("keypress", event.keyval)
49
+ if event.keyval == Gdk.KEY_Tab or event.keyval == Gdk.KEY_ISO_Left_Tab:
50
+ #print("tab keypress ", event.keyval, event.state)
51
+ if event.state & Gdk.ModifierType.SHIFT_MASK:
52
+ self.emit("move-focus", Gtk.DirectionType.TAB_BACKWARD)
53
+ else:
54
+ self.emit("move-focus", Gtk.DirectionType.TAB_FORWARD)
55
+ return True
56
+
57
+ if event.keyval == Gdk.KEY_Return:
58
+ if not self.noemit:
59
+ self.emit("move-focus", Gtk.DirectionType.TAB_FORWARD)
60
+ return True
61
+
23
62
  # Expects two tuples of stuff
24
63
  # labtext, labname, tip, defval = None:
25
64
 
@@ -34,7 +73,7 @@ def entryquad(arr, vbox, entry1, entry2):
34
73
  hbox2.pack_start(lab1, False, 0, 0)
35
74
  lab1a = Gtk.Label(label=" ")
36
75
  hbox2.pack_start(lab1a, False, 0, 0)
37
- headx = Gtk.Entry(); headx.set_width_chars(33)
76
+ headx = Entryx(); headx.set_width_chars(33)
38
77
  lab1.set_mnemonic_widget(headx)
39
78
 
40
79
  if entry1[3] != None:
@@ -51,7 +90,7 @@ def entryquad(arr, vbox, entry1, entry2):
51
90
  hbox2.pack_start(lab2, False, 0, 0)
52
91
  lab1b = Gtk.Label(label=" ")
53
92
  hbox2.pack_start(lab1b, False, 0, 0)
54
- headx2 = Gtk.Entry(); headx2.set_width_chars(33)
93
+ headx2 = Entryx(); headx2.set_width_chars(33)
55
94
  lab2.set_mnemonic_widget(headx2)
56
95
  if entry2[3] != None:
57
96
  headx2.set_text(entry2[3][entry2[1]])
@@ -127,7 +166,7 @@ def gridquad(gridx, left, top, entry1, entry2, butt = None):
127
166
  lab1.set_tooltip_text(entry1[2])
128
167
  gridx.attach(lab1, left, top, 1, 1)
129
168
 
130
- headx = Gtk.Entry();
169
+ headx = Entryx();
131
170
  lab1.set_mnemonic_widget(headx)
132
171
  headx.set_width_chars(20)
133
172
  if entry1[3] != None:
@@ -139,7 +178,7 @@ def gridquad(gridx, left, top, entry1, entry2, butt = None):
139
178
  lab2.set_tooltip_text(entry2[2])
140
179
  gridx.attach(lab2, left+2, top, 1, 1)
141
180
 
142
- headx2 = Gtk.Entry();
181
+ headx2 = Entryx();
143
182
  lab2.set_mnemonic_widget(headx2)
144
183
 
145
184
  headx2.set_width_chars(20)
@@ -151,12 +190,13 @@ def gridquad(gridx, left, top, entry1, entry2, butt = None):
151
190
  return headx, headx2
152
191
 
153
192
  def griddouble(gridx, left, top, entry1, buttx = None):
154
- lab1 = Gtk.Label(entry1[0] + " ")
193
+ lab1 = Gtk.Label.new_with_mnemonic(entry1[0] + " ")
155
194
  lab1.set_alignment(1, 0)
156
195
  lab1.set_tooltip_text(entry1[2])
157
196
  gridx.attach(lab1, left, top, 1, 1)
158
197
 
159
- headx = Gtk.Entry();
198
+ headx = Entryx();
199
+ lab1.set_mnemonic_widget(headx)
160
200
  headx.set_width_chars(40)
161
201
  if entry1[3] != None:
162
202
  headx.set_text(entry1[3])
@@ -165,9 +205,10 @@ def griddouble(gridx, left, top, entry1, buttx = None):
165
205
  gridx.attach(buttx, left+3, top, 1, 1)
166
206
  return headx
167
207
 
168
-
169
208
  class TextViewx(Gtk.TextView):
170
209
 
210
+ ''' Override textview for simple deployment '''
211
+
171
212
  def __init__(self):
172
213
  super(TextViewx).__init__()
173
214
  GObject.GObject.__init__(self)
@@ -178,12 +219,36 @@ class TextViewx(Gtk.TextView):
178
219
 
179
220
  def key_press_event(self, arg1, event):
180
221
 
222
+ ''' Override tabs '''
223
+
181
224
  if event.keyval == Gdk.KEY_Tab or event.keyval == Gdk.KEY_ISO_Left_Tab:
182
225
  #print("tab keypress ", event.keyval, event.state)
183
226
  if event.state & Gdk.ModifierType.SHIFT_MASK:
184
227
  self.emit("move-focus", Gtk.DirectionType.TAB_BACKWARD)
185
228
  else:
186
229
  self.emit("move-focus", Gtk.DirectionType.TAB_FORWARD)
230
+ return True
231
+
232
+ # If reached last line, TAB it
233
+ if event.keyval == Gdk.KEY_Down:
234
+ pos = self.buffer.get_property("cursor-position")
235
+ #print("Down", pos)
236
+ #print(self.buffer.list_properties())
237
+ sss = self.buffer.get_start_iter()
238
+ eee = self.buffer.get_end_iter()
239
+ textx = self.buffer.get_text(sss, eee, True)
240
+ if pos == len(textx):
241
+ self.emit("move-focus", Gtk.DirectionType.TAB_FORWARD)
242
+ return True
243
+
244
+ # If reached first line, TAB it
245
+ if event.keyval == Gdk.KEY_Up:
246
+ # Are we at the beginning:
247
+ pos = self.buffer.get_property("cursor-position")
248
+ #print("Up", pos)
249
+ if pos == 0:
250
+ self.emit("move-focus", Gtk.DirectionType.TAB_BACKWARD)
251
+ return True
187
252
 
188
253
  if event.keyval == Gdk.KEY_Return:
189
254
  if event.state & Gdk.ModifierType.SHIFT_MASK:
@@ -206,12 +271,14 @@ class TextViewx(Gtk.TextView):
206
271
  self.buffer.set_modified(True)
207
272
 
208
273
  def gridsingle(gridx, left, top, entry1):
209
- lab1 = Gtk.Label(entry1[0] + " ")
274
+ lab1 = Gtk.Label.new_with_mnemonic(entry1[0] + " ")
210
275
  lab1.set_alignment(1, 0)
211
276
  lab1.set_tooltip_text(entry1[2])
212
277
  gridx.attach(lab1, left, top, 1, 1)
213
278
 
214
279
  headx, cont = wrap(TextViewx())
280
+ lab1.set_mnemonic_widget(cont)
281
+
215
282
  if entry1[3] != None:
216
283
  headx.set_text(entry1[3])
217
284
  gridx.attach(headx, left+1, top, 3, 1)
@@ -234,7 +301,6 @@ def scrolledtext(arr, name, body = None):
234
301
  sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
235
302
  return sw
236
303
 
237
-
238
304
  def imgbutt(imgfile, txt, func, win):
239
305
  hbb = Gtk.HBox(); vbb = Gtk.VBox(); ic = Gtk.Image();
240
306
  ic.set_from_file(imgfile)
@@ -24,6 +24,8 @@ import pgsimp
24
24
 
25
25
  IDXERR = "Index is larger than the available number of controls."
26
26
 
27
+ VERSION = "1.1.1"
28
+
27
29
  gui_testmode = 0
28
30
 
29
31
  def randcol():
@@ -46,6 +48,8 @@ for st in (gtk.STATE_NORMAL, gtk.STATE_INSENSITIVE,
46
48
  a[st] = gtk.gdk.Color(0, 34251, 0)
47
49
  '''
48
50
 
51
+ def version():
52
+ return VERSION
49
53
 
50
54
  # ------------------------------------------------------------------------
51
55
  # Bemd some of the parameters for us
@@ -118,6 +122,8 @@ class CairoHelper():
118
122
 
119
123
  class TextTable(Gtk.Table):
120
124
 
125
+ ''' YTable of text entries '''
126
+
121
127
  def __init__(self, confarr, main = None, textwidth = 24):
122
128
  GObject.GObject.__init__(self)
123
129
  self.texts = []
@@ -192,7 +198,6 @@ class TextRow(Gtk.HBox):
192
198
  '''
193
199
  pass
194
200
 
195
-
196
201
  def callb(self, arg1):
197
202
  #print ("callb arg1", arg1)
198
203
  pass
@@ -285,6 +290,7 @@ class Led(Gtk.DrawingArea):
285
290
  self.set_size_request(size + border, size + border)
286
291
  self.connect("draw", self.draw)
287
292
  self.color = color
293
+ self.orgcolor = color
288
294
 
289
295
  def set_color(self, col):
290
296
  self.color = col
@@ -421,19 +427,23 @@ class WideButt(Gtk.Button):
421
427
  if callme:
422
428
  self.connect("clicked", callme)
423
429
 
424
- class FrameTextView(Gtk.TextView):
430
+ class FrameTextView(Gtk.Frame):
425
431
 
426
432
  def __init__(self, callme = None):
427
433
 
428
434
  GObject.GObject.__init__(self)
435
+ #super().__init__(self)
436
+
437
+ self.tview = Gtk.TextView()
438
+ #self.tview.set_buffer(Gtk.TextBuffer())
439
+
429
440
  self.scroll = Gtk.ScrolledWindow()
430
441
  self.scroll.set_size_request(100, 100)
431
- self.scroll.add_with_viewport(self)
432
- self.frame = Gtk.Frame()
433
- self.frame.add(self.scroll)
442
+ self.scroll.add_with_viewport(self.tview)
443
+ #self.frame = Gtk.Frame()
444
+ self.add(self.scroll)
434
445
 
435
- self.set_buffer(Gtk.TextBuffer())
436
- self.set_size_request(150, 150)
446
+ #self.set_size_request(150, 150)
437
447
  ls = self.get_style_context()
438
448
  fd = ls.get_font(Gtk.StateFlags.NORMAL)
439
449
  #newfd = fd.to_string() + " " + str(fd.get_size() / Pango.SCALE + 4)
@@ -441,16 +451,16 @@ class FrameTextView(Gtk.TextView):
441
451
  self.modify_font(Pango.FontDescription("Sans 13"))
442
452
 
443
453
  def append(self, strx):
444
- buff = self.get_buffer()
454
+ buff = self.tview.get_buffer()
445
455
  old = buff.get_text(buff.get_start_iter(), buff.get_end_iter(), False)
446
- buff.set_text(old + "\n" + strx)
456
+ buff.set_text(old + strx)
447
457
  pgutils.usleep(20)
448
458
  #mainwin.statb2.scroll_to_iter(buff.get_end_iter(), 1.0, True, 0.1, 0.1)
449
459
  sb = self.scroll.get_vscrollbar()
450
460
  sb.set_value(2000000)
451
461
 
452
462
  class Label(Gtk.Label):
453
- def __init__(self, textm = "", widget = None, tooltip=None, font = None):
463
+ def __init__(self, textm = "", widget = None, tooltip=None, font=None):
454
464
  GObject.GObject.__init__(self)
455
465
  self.set_text_with_mnemonic(textm)
456
466
  if widget:
@@ -462,7 +472,7 @@ class Label(Gtk.Label):
462
472
 
463
473
  class Logo(Gtk.VBox):
464
474
 
465
- def __init__(self, labelx, tooltip = None, callme = None):
475
+ def __init__(self, labelx, tooltip=None, callme=None, font="Times 45"):
466
476
 
467
477
  GObject.GObject.__init__(self)
468
478
 
@@ -477,7 +487,7 @@ class Logo(Gtk.VBox):
477
487
  if callme:
478
488
  self.logolab.connect("button-press-event", callme)
479
489
 
480
- self.logolab.modify_font(Pango.FontDescription('Times 45'))
490
+ self.logolab.modify_font(Pango.FontDescription(font))
481
491
 
482
492
  #self.pack_start(Spacer(), 0, 0, False)
483
493
  self.pack_start(self.logolab, 0, 0, False)
@@ -497,7 +507,7 @@ class Logo(Gtk.VBox):
497
507
 
498
508
  class ListBox(Gtk.TreeView):
499
509
 
500
- def __init__(self, limit = -1, colname = ''):
510
+ def __init__(self, callb = None, limit = -1, colname = ''):
501
511
 
502
512
  self.limit = limit
503
513
  self.treestore = Gtk.TreeStore(str)
@@ -516,7 +526,7 @@ class ListBox(Gtk.TreeView):
516
526
  self.append_column(tvcolumn)
517
527
  self.set_activate_on_single_click (True)
518
528
 
519
- self.callb = None
529
+ self.callb = callb
520
530
  self.connect("row-activated", self.tree_sel)
521
531
 
522
532
  def tree_sel(self, xtree, xiter, xpath):
@@ -660,32 +670,11 @@ def set_testmode(flag):
660
670
  global gui_testmode
661
671
  gui_testmode = flag
662
672
 
663
- # ------------------------------------------------------------------------
664
- # An N pixel horizontal spacer. Defaults to X pix get_center
665
- #
666
- #def hspacer(hbox, xstr = " ", expand = False):
667
- # lab = Gtk.Label(label=xstr)
668
- # hbox.pack_start(lab, expand, 0, 0)
669
- #
670
- #def vspacer(vbox, xstr = " ", expand = False):
671
- # lab = Gtk.Label(label=xstr)
672
- # vbox.pack_start(lab, expand , 0, 0)
673
- #def vspacer(sp = 8):
674
- # lab = Gtk.VBox()
675
- # lab.set_size_request(sp, sp)
676
- #
677
- # if gui_testmode:
678
- # lab.override_background_color(
679
- # Gtk.StateFlags.NORMAL, Gdk.RGBA(1, .5, .5) )
680
- # return lab
681
-
682
673
  # ------------------------------------------------------------------------
683
674
  # An N pixel spacer. Defaults to 1 char height / width
684
675
 
685
676
  class Spacer(Gtk.Label):
686
677
 
687
- global box_testmode
688
-
689
678
  def __init__(self, sp = 1, title=None, left=False, bottom=False, test=False):
690
679
 
691
680
  GObject.GObject.__init__(self)
@@ -705,7 +694,7 @@ class Spacer(Gtk.Label):
705
694
  if bottom:
706
695
  self.set_yalign(1)
707
696
 
708
- if test or box_testmode:
697
+ if test or gui_testmode:
709
698
  self.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("#888888"))
710
699
 
711
700
  #self.set_property("angle", 15)
@@ -746,41 +735,6 @@ class ySpacer(Gtk.VBox):
746
735
  sp = 6
747
736
  self.set_size_request(sp, sp)
748
737
 
749
- # ------------------------------------------------------------------------
750
- # An N pixel spacer. Defaults to 1 char height / width
751
-
752
- class Spacer(Gtk.Label):
753
-
754
- global gui_testmode
755
-
756
- def __init__(self, sp = 1, title=None, left=False, bottom=False, test=False):
757
-
758
- GObject.GObject.__init__(self)
759
-
760
- #sp *= 1000
761
- #self.set_markup("<span size=\"" + str(sp) + "\"> </span>")
762
- #self.set_text(" " * sp)
763
-
764
- if title:
765
- self.set_text(title)
766
- else:
767
- self.set_text(" " * sp)
768
- if left:
769
- self.set_xalign(0)
770
- if bottom:
771
- self.set_yalign(1)
772
- if test or gui_testmode:
773
- self.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("#888888"))
774
-
775
- #self.set_property("angle", 15)
776
- #attr = self.get_property("attributes")
777
- #attr2 = Pango.AttrList()
778
- #print ("attr", dir(attr))
779
- #attr.
780
- #self.set_property("attributes", attr)
781
- #self.set_property("label", "wtf")
782
- #self.set_property("background-set", True)
783
-
784
738
  # ------------------------------------------------------------------------
785
739
  # Added convenience methods
786
740
 
@@ -824,13 +778,21 @@ class xHBox(Gtk.HBox):
824
778
 
825
779
  class RadioGroup(Gtk.Frame):
826
780
 
827
- def __init__(self, rad_arr, call_me):
781
+ def __init__(self, rad_arr, call_me = None, horiz = False):
828
782
 
829
783
  GObject.GObject.__init__(self)
830
784
  self.buttons = []
831
785
  self.callme = call_me
832
- vbox6 = Gtk.VBox(); vbox6.set_spacing(4);
833
- vbox6.set_border_width(6)
786
+ if horiz:
787
+ vbox6 = Gtk.HBox();
788
+ vbox6.set_spacing(6);
789
+ vbox6.set_border_width(4)
790
+ else:
791
+ vbox6 = Gtk.VBox();
792
+ vbox6.set_spacing(4);
793
+ vbox6.set_border_width(6)
794
+
795
+
834
796
 
835
797
  if gui_testmode:
836
798
  self.modify_bg(Gtk.StateType.NORMAL, Gdk.color_parse("#778888"))
@@ -1054,11 +1016,12 @@ class ScrollListBox(Gtk.Frame):
1054
1016
 
1055
1017
  class ComboBox(Gtk.ComboBox):
1056
1018
 
1057
- def __init__(self, init_cont = [], callme = None):
1019
+ def __init__(self, init_cont, callme = None):
1020
+
1021
+ self.callme = callme
1058
1022
 
1059
1023
  self.store = Gtk.ListStore(str)
1060
1024
  Gtk.ComboBox.__init__(self)
1061
-
1062
1025
  self.set_model(self.store)
1063
1026
  cell = Gtk.CellRendererText()
1064
1027
 
@@ -1067,9 +1030,6 @@ class ComboBox(Gtk.ComboBox):
1067
1030
  #cell.set_property("background-set", True)
1068
1031
  cell.set_padding(10, 0)
1069
1032
 
1070
- if callme:
1071
- self.connect("changed", callme)
1072
-
1073
1033
  #cell.set_property("foreground", "#ffff00")
1074
1034
  #cell.set_property("foreground-set", True)
1075
1035
  #print("background-set", cell.get_property("background-set"))
@@ -1100,6 +1060,9 @@ class ComboBox(Gtk.ComboBox):
1100
1060
  except:
1101
1061
  pass
1102
1062
 
1063
+ if self.callme:
1064
+ self.callme(name)
1065
+
1103
1066
  #print("Combo new selection / entry: '%s'" % name)
1104
1067
 
1105
1068
  def delall(self):
@@ -1380,27 +1343,163 @@ class RCLButt(Gtk.Button):
1380
1343
  # self.callme(arg1)
1381
1344
 
1382
1345
 
1383
- def message(msg):
1384
- dialog = Gtk.MessageDialog(None, Gtk.DialogFlags.DESTROY_WITH_PARENT,
1385
- Gtk.MessageType.INFO, Gtk.ButtonsType.CLOSE, text=msg)
1346
+ # ------------------------------------------------------------------------
1347
+ # Show a regular message:
1348
+
1349
+ def message(strx, parent = None, title = None, icon = Gtk.MessageType.INFO):
1386
1350
 
1387
- # 'Action: "%s" of type "%s"' % (action.get_name(), type(action)))
1351
+ #dialog = Gtk.MessageDialog(parent, Gtk.DialogFlags.DESTROY_WITH_PARENT,
1352
+ # icon, Gtk.ButtonsType.CLOSE, strx)
1353
+
1354
+ dialog = Gtk.MessageDialog(title=title, buttons=Gtk.ButtonsType.CLOSE,
1355
+ text=strx, destroy_with_parent=True, modal=True,)
1356
+
1357
+ if parent:
1358
+ dialog.set_transient_for(parent)
1359
+
1360
+ if title:
1361
+ dialog.set_title(title)
1362
+ else:
1363
+ dialog.set_title("Message")
1388
1364
 
1389
1365
  # Close dialog on user response
1390
- dialog.connect ("response", lambda d, r: d.destroy())
1366
+ dialog.connect("response", lambda d, r: d.destroy())
1367
+ dialog.show_all()
1391
1368
  return dialog.run()
1392
1369
 
1393
- def yesno(msg):
1394
- dialog = Gtk.MessageDialog(None, Gtk.DialogFlags.DESTROY_WITH_PARENT,
1395
- Gtk.MessageType.INFO, Gtk.ButtonsType.YES_NO, text=msg)
1370
+ def yes_no(message, title = "Question", parent=None, default="Yes"):
1371
+
1372
+ dialog = Gtk.MessageDialog(title=title)
1373
+
1374
+ img = Gtk.Image.new_from_stock(Gtk.STOCK_DIALOG_QUESTION, Gtk.IconSize.DIALOG)
1375
+ dialog.set_image(img)
1376
+ dialog.set_markup(message)
1377
+
1378
+ if default == "Yes":
1379
+ dialog.set_default_response(Gtk.ResponseType.YES)
1380
+ dialog.add_button("_Yes", Gtk.ResponseType.YES)
1381
+ dialog.add_button("_No", Gtk.ResponseType.NO)
1382
+ else:
1383
+ dialog.set_default_response(Gtk.ResponseType.NO)
1384
+ dialog.add_button("_No", Gtk.ResponseType.NO)
1385
+ dialog.add_button("_Yes", Gtk.ResponseType.YES)
1386
+
1387
+ if parent:
1388
+ dialog.set_transient_for(parent)
1389
+
1390
+ def _yn_key(win, event, cancel):
1391
+ #print("_y_n key", event.keyval)
1392
+ if event.keyval == Gdk.KEY_y or \
1393
+ event.keyval == Gdk.KEY_Y:
1394
+ win.response(Gtk.ResponseType.YES)
1395
+ if event.keyval == Gdk.KEY_n or \
1396
+ event.keyval == Gdk.KEY_N:
1397
+ win.response(Gtk.ResponseType.NO)
1398
+ #if cancel:
1399
+ # if event.keyval == Gdk.KEY_c or \
1400
+ # event.keyval == Gdk.KEY_C:
1401
+ # win.response(Gtk.ResponseType.CANCEL)
1402
+
1403
+ dialog.connect("key-press-event", _yn_key, 0)
1404
+ # Fri 03.May.2024 destroyed return value
1405
+ #dialog.connect("response", lambda d, r: d.destroy())
1406
+ dialog.show_all()
1407
+ response = dialog.run()
1408
+ dialog.destroy()
1409
+ #print("response", response, resp2str(response))
1396
1410
 
1397
- # 'Action: "%s" of type "%s"' % (action.get_name(), type(action)))
1411
+ # Convert all other responses to default
1412
+ if response == Gtk.ResponseType.REJECT or \
1413
+ response == Gtk.ResponseType.CLOSE or \
1414
+ response == Gtk.ResponseType.DELETE_EVENT:
1415
+ response = Gtk.ResponseType.NO
1416
+
1417
+ # Cancel means no
1418
+ #if default == "Yes":
1419
+ # response = Gtk.ResponseType.YES
1420
+ #else:
1421
+ # response = Gtk.ResponseType.NO
1422
+
1423
+ return response
1424
+
1425
+ # ------------------------------------------------------------------------
1426
+
1427
+ def yes_no_cancel(message, title="Question", default="Yes"):
1428
+
1429
+ dialog = Gtk.MessageDialog(title=title)
1430
+
1431
+ if default == "Yes":
1432
+ dialog.set_default_response(Gtk.ResponseType.YES)
1433
+ dialog.add_button("_Yes", Gtk.ResponseType.YES)
1434
+ dialog.add_button("_No", Gtk.ResponseType.NO)
1435
+ dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL)
1436
+ elif default == "No":
1437
+ dialog.set_default_response(Gtk.ResponseType.NO)
1438
+ dialog.add_button("_No", Gtk.ResponseType.NO)
1439
+ dialog.add_button("_Yes", Gtk.ResponseType.YES)
1440
+ dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL)
1441
+ else:
1442
+ dialog.set_default_response(Gtk.ResponseType.CANCEL)
1443
+ dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL)
1444
+ dialog.add_button("_Yes", Gtk.ResponseType.YES)
1445
+ dialog.add_button("_No", Gtk.ResponseType.NO)
1446
+
1447
+ img = Gtk.Image.new_from_stock(Gtk.STOCK_DIALOG_QUESTION, Gtk.IconSize.DIALOG)
1448
+ dialog.set_image(img)
1449
+ dialog.set_markup(message)
1450
+
1451
+ def _yn_keyc(win, event):
1452
+ #print("key:", event)
1453
+ if event.keyval == Gdk.KEY_y or \
1454
+ event.keyval == Gdk.KEY_Y:
1455
+ win.response(Gtk.ResponseType.YES)
1456
+ if event.keyval == Gdk.KEY_n or \
1457
+ event.keyval == Gdk.KEY_N:
1458
+ win.response(Gtk.ResponseType.NO)
1459
+ if event.keyval == Gdk.KEY_c or \
1460
+ event.keyval == Gdk.KEY_C:
1461
+ win.response(Gtk.ResponseType.CANCEL)
1462
+
1463
+ dialog.connect("key-press-event", _yn_keyc)
1464
+ dialog.show_all()
1465
+ response = dialog.run()
1466
+
1467
+ # Convert all other responses to cancel
1468
+ if response == Gtk.ResponseType.CANCEL or \
1469
+ response == Gtk.ResponseType.REJECT or \
1470
+ response == Gtk.ResponseType.CLOSE or \
1471
+ response == Gtk.ResponseType.DELETE_EVENT:
1472
+ response = Gtk.ResponseType.CANCEL
1398
1473
 
1399
- # Close dialog on user response
1400
- #dialog.connect ("response", lambda d, r: d.destroy())
1401
- ret = dialog.run()
1402
1474
  dialog.destroy()
1403
- return ret
1475
+
1476
+ #print("yes_no_cancel() result:", response);
1477
+ return response
1478
+
1479
+ def resp2str(resp):
1480
+
1481
+ ''' Translate response to string '''
1482
+
1483
+ strx = "None"
1484
+ if resp == Gtk.ResponseType.YES:
1485
+ strx = "Yes"
1486
+ if resp == Gtk.ResponseType.NO:
1487
+ strx = "No"
1488
+ if resp == Gtk.ResponseType.OK:
1489
+ strx = "OK"
1490
+ if resp == Gtk.ResponseType.CANCEL:
1491
+ strx = "Cancel"
1492
+ if resp == Gtk.ResponseType.NONE:
1493
+ strx = "None"
1494
+ if resp == Gtk.ResponseType.ACCEPT:
1495
+ strx = "Accept"
1496
+ if resp == Gtk.ResponseType.REJECT:
1497
+ strx = "Reject"
1498
+ if resp == Gtk.ResponseType.CLOSE:
1499
+ strx = "CLlose"
1500
+ if resp == Gtk.ResponseType.DELETE_EVENT:
1501
+ strx = "Delete Event"
1502
+ return strx
1404
1503
 
1405
1504
  # ------------------------------------------------------------------------
1406
1505
  # Highlite test items