109 lines
3.4 KiB
Python
109 lines
3.4 KiB
Python
# 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
|