105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
"""
|
|
This modules contains general utilities for the GTK application to use.
|
|
"""
|
|
import json
|
|
import os
|
|
from contextlib import contextmanager
|
|
from gi.repository import Gtk
|
|
from typing import Callable, Type
|
|
from zipfile import ZipFile
|
|
|
|
CONFIG_PATH = os.path.join(os.path.expanduser('~'), '.config', 'dsst', 'config.json')
|
|
DEFAULT_CONFIG = {
|
|
'auto_connect': False,
|
|
'servers': [{
|
|
'host': 'localhost',
|
|
'port': 12345,
|
|
'buffer_size': 1024,
|
|
'auth_token': 'a'}
|
|
]
|
|
}
|
|
|
|
|
|
@contextmanager
|
|
def block_handler(widget: 'Gtk.Widget', handler_func: Callable):
|
|
"""Run an operation while a signal handler for a widget is blocked
|
|
:param widget: A Gtk widget
|
|
:param handler_func: Signal handler of the widget to block
|
|
"""
|
|
widget.handler_block_by_func(handler_func)
|
|
yield
|
|
widget.handler_unblock_by_func(handler_func)
|
|
|
|
|
|
@contextmanager
|
|
def handle_exception(exception: 'Type[Exception]'):
|
|
"""Run operation in try/except block and display exception in a dialog
|
|
:param exception:
|
|
"""
|
|
try:
|
|
yield
|
|
except exception as e:
|
|
print(e)
|
|
|
|
|
|
def get_combo_value(combo, index: int):
|
|
""" Retrieve the selected value of a combo box at the selected index in the model
|
|
:param combo: Any Gtk Widget that supports 'get_active_iter()'
|
|
:param index: Index of the value in the widgets model to be retrieved
|
|
:return: The value of the model at the selected index (Default -1)
|
|
"""
|
|
tree_iter = combo.get_active_iter()
|
|
if tree_iter:
|
|
return combo.get_model().get_value(tree_iter, index)
|
|
else:
|
|
return -1
|
|
|
|
|
|
def get_index_of_combo_model(widget, column: int, value: int):
|
|
"""Get the index of a value within a Gtk widgets model based on column an value
|
|
:param widget: Any Gtk widget that can be bound to a ListStore or TreeStore
|
|
:param column: Column in the model where to look for the value
|
|
:param value: Value to look for in the model
|
|
:return: List of the indexes where the value occurs
|
|
"""
|
|
model = widget.get_model()
|
|
return [model.index(entry) for entry in model if entry[column] == value]
|
|
|
|
|
|
def load_ui_resource_from_file(resource_path: list) -> str:
|
|
project_base_dir = os.path.dirname(os.path.dirname(__file__))
|
|
full_path = os.path.join(project_base_dir, *resource_path)
|
|
with open(full_path, 'r') as file:
|
|
return file.read()
|
|
|
|
|
|
def load_ui_resource_from_archive(resource_path: list) -> str:
|
|
zip_path = os.path.dirname(os.path.dirname(__file__))
|
|
with ZipFile(zip_path, 'r') as archive:
|
|
return archive.read(str(os.path.join(*resource_path))).decode('utf-8')
|
|
|
|
|
|
def load_ui_resource_string(resource_path: list) -> str:
|
|
""" Load content of Glade UI files from resources path
|
|
:param resource_path: List of directory names from 'dsst' base directory
|
|
:return: String content of the Glade file
|
|
"""
|
|
if os.path.isdir(os.path.dirname(__file__)):
|
|
return load_ui_resource_from_file(resource_path)
|
|
else:
|
|
|
|
return load_ui_resource_from_archive(resource_path)
|
|
|
|
|
|
def load_config(config_path: str) -> dict:
|
|
with open(config_path) as config_file:
|
|
return json.load(config_file)
|
|
|
|
|
|
def save_config(config: dict, config_path: str):
|
|
path = os.path.dirname(config_path)
|
|
if not os.path.isdir(path):
|
|
os.mkdir(path)
|
|
with open(config_path, 'wb') as file:
|
|
file.write(json.dumps(config, sort_keys=True, indent=4, separators=(',', ': ')).encode('utf-8'))
|