# SPDX-License-Identifier: WTFPL """ Generic view object SPDX-License-Identifier: WTFPL """ import os import locale import gi gi.require_version("Gtk", "3.0") from gi.repository import GLib, Gtk, Gdk from yms import gtkutils class View: def __init__(self, context, title, ui_file): self.context = context self.db = context.db self.vessel = context.vessel self.user = context.user self.title = title builder = Gtk.Builder() builder.set_translation_domain(context.textdomain) builder.add_from_file(os.path.join(context.ui_path, ui_file)) builder.connect_signals(self) self.topwidget = builder.get_object("topobject") gtkutils.init_named_controls(self, builder) def format_int(self, ival, separator=True, suffix=None, default=''): if ival is None: return default formatted = locale.format_string("%d", ival, separator) if suffix: formatted += f"\u00A0{suffix}" return formatted def format_float(self, fval, digits=2, grouping=True, suffix=None, default=''): if fval is None: return default formatted = locale.format_string(f"%.{digits}f", fval, grouping) if suffix: formatted += f"\u00A0{suffix}" return formatted def format_date(self, dval, default=''): if dval is None: return default return dval.strftime(self.context.datefmt) def on_textview_keypress(self, widget, event): # Generic limit length function if event.state & Gdk.ModifierType.CONTROL_MASK: allowed_ctrl_keys = ( Gdk.KEY_a, Gdk.KEY_c, Gdk.KEY_x, ) if event.keyval in allowed_ctrl_keys: return False allowed_keys = ( Gdk.KEY_BackSpace, Gdk.KEY_Delete, Gdk.KEY_Left, Gdk.KEY_Right, Gdk.KEY_Up, Gdk.KEY_Down, Gdk.KEY_Home, Gdk.KEY_End, Gdk.KEY_Page_Up, Gdk.KEY_Page_Down, ) print("keypress") if event.keyval in allowed_keys: return False buf = widget.get_buffer() start = buf.get_start_iter() end = buf.get_end_iter() text = buf.get_text(start, end, True) if len(text) >= 150: return True return False def on_textview_paste(self, widget): # Generic limit length function print("paste") buf = widget.get_buffer() start = buf.get_start_iter() end = buf.get_end_iter() text = buf.get_text(start, end, True) if buf.get_has_selection(): sel_start, sel_end = buf.get_selection_bounds() selected_text = buf.get_text(sel_start, sel_end, True) current_length = len(text) - len(selected_text) else: current_length = len(text) remaining = 150 - current_length if remaining <= 0: return True clipboard = widget.get_clipboard(Gdk.SELECTION_CLIPBOARD) cliptext = clipboard.wait_for_text() if cliptext: cliptext = cliptext[:remaining] if buf.get_has_selection(): sel_start, sel_end = buf.get_selection_bounds() buf.delete(sel_start, sel_end) buf.insert_at_cursor(text) return True