Files
DrunkSoulsStatTool/dsst/dsst_gtk3/util.py
2018-03-05 22:57:14 +01:00

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'))