1#!/usr/local/bin/python3.8 2 3from gi.repository import Gtk 4 5# truncate a string to single line 121 char max with ellipsis 6def shorten_value(value): 7 changed = False 8 trunc_pos = value.find("\n") 9 if trunc_pos >= 0: 10 changed = True 11 value = value[:trunc_pos] 12 13 if len(value) > 120: 14 changed = True 15 value = value[:120] 16 17 if changed: 18 value += "..." 19 20 return value 21 22class ResultTextDialog(Gtk.Dialog): 23 def __init__(self, title, text): 24 Gtk.Dialog.__init__(self, title, None, 0, 25 (Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)) 26 27 self.set_default_size(350, 70) 28 29 label = Gtk.Label(text) 30 label.set_selectable(True) 31 32 box = self.get_content_area() 33 box.add(label) 34 self.show_all() 35 36 self.connect("response", self.on_response) 37 self.connect("close", self.on_close) 38 39 def on_close(self, data=None): 40 self.destroy() 41 42 def on_response(self, response_id, data=None): 43 self.destroy() 44 45class BaseListView(Gtk.ScrolledWindow): 46 def __init__(self, store): 47 Gtk.ScrolledWindow.__init__(self) 48 self.set_shadow_type(Gtk.ShadowType.ETCHED_IN) 49 self.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) 50 51 self.store = store 52 self.tree_view = Gtk.TreeView(self.store) 53 54 self.add(self.tree_view) 55 self.renderer_text = Gtk.CellRendererText() 56 57 def create_text_column(self, index, text): 58 column = Gtk.TreeViewColumn(text, self.renderer_text, text=index) 59 column.set_sort_column_id(index) 60 column.set_resizable(True) 61 self.tree_view.append_column(column) 62 return column 63 64class WindowAndActionBars(Gtk.Table): 65 def __init__(self, window): 66 Gtk.Table.__init__(self, 2, 2, False) 67 68 self.bottom = Gtk.HBox() 69 self.left = Gtk.VBox() 70 71 self.attach(window, 1, 2, 0, 1) 72 self.attach(self.left, 0, 1, 0, 1, 0, Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL) 73 self.attach(self.bottom, 0, 2, 1, 2, Gtk.AttachOptions.EXPAND|Gtk.AttachOptions.FILL, 0) 74 75 def add_to_left_bar(self, widget, padding=0): 76 self.left.set_border_width(2) 77 self.left.pack_start(widget, False, False, padding) 78 79 def add_to_bottom_bar(self, widget, padding=0): 80 self.bottom.set_border_width(2) 81 self.bottom.pack_start(widget, False, False, padding) 82 83class ImageButton(Gtk.Button): 84 def __init__(self, icon_name, size=Gtk.IconSize.MENU): 85 Gtk.Button.__init__(self) 86 87 image = Gtk.Image.new_from_icon_name(icon_name, size) 88 self.add(image) 89 90class ImageToggleButton(Gtk.ToggleButton): 91 def __init__(self, icon_name, size=Gtk.IconSize.MENU): 92 Gtk.ToggleButton.__init__(self) 93 94 image = Gtk.Image.new_from_icon_name(icon_name, size) 95 self.add(image) 96