from lib.snabbdom import h, patch from message import * import random from view.utils import * from model import Translation, Sense, Example from browser import document from export import export_to_xml class View: def __init__(self, container): self.vdom = h('div', {}, "Loading...") self.entry_vdom = None self.model = None patch(container, self.vdom) # this does not work on parent div, so attaching to document here document.addEventListener("keydown", msg(KeyboardPress)) def view(self, model, data_change): self.model = model if data_change or self.entry_vdom is None: self.model.pre_view() self.entry_vdom = self.model.entry.view(self.model) new_vdom = self._view() patch(self.vdom, new_vdom) self.vdom = new_vdom def _view(self): return h("div", {"on": { "click": msg(Reset) }}, [ self.entry_vdom, # h("button.blk", {"on": { "click": lambda _: check_export(self.model) } }, "CHK"), View.view_menu(self.model.menu_location, self.model.menu_target, self.model.entry), View.view_modal(self.model.modal_shown, self.model.modal)]) @staticmethod def view_toggle_buttons(model): txt_examples = "Hide examples" if model.examples_shown else "Show examples" txt_clusters = "Hide clusters" if model.clusters_shown else "Show clusters" return [h("span.button.toggle", {"on": {"click": msg(ToggleExamples)}}, txt_examples), h("span.button.toggle", {"on": {"click": msg(ToggleClusters)}}, txt_clusters)] @staticmethod def view_translations(translations, parent, model): result = [] for cluster in translations: result.append(h("div.translation-div-cluster", {}, [t.view(model) for t in cluster])) result.append(h("button.add-button", {"on": {"click": msg(ShowAddTranslation, parent)}}, "+")) return result @staticmethod def view_menu(location, menu_target, entry): style = { "left": "{}px".format(location[0]), "top": "{}px".format(location[1]) } if menu_target is None: style["opacity"] = "0" style["visibility"] = "hidden" elif type(menu_target) is Translation: translation = menu_target return h("span.popup-menu", { "style": style }, [ h("button.shyButton", { "on": {"click": msg(ShowEditTranslation, translation)}}, "✎"), h("button.shyButton", { "on": {"click": msg(MoveRight, translation)}}, "→"), h("button.shyButton", { "on": {"click": msg(MoveLeft, translation)}}, "←"), h("button.shyButton", { "on": {"click": msg(BinTranslation, translation)}}, "🗑")]) elif type(menu_target) is Sense: sense = menu_target return h("span.popup-menu", { "style": style }, [ h("button.shyButton", { "on": {"click": msg(SenseMoveUp, sense)}}, "↑"), h("button.shyButton", { "on": {"click": msg(SenseMoveDown, sense)}}, "↓"), h("button.shyButton", { "on": {"click": msg(SenseBin, sense)}}, "🗑")]) elif type(menu_target) is Example: example = menu_target sense = example_sense(example, entry) return h("span.popup-menu", { "style": style }, [ h("button.shyButton", { "on": {"click": msg(ShowExampleEdit, example, sense)}}, "✎"), h("button.shyButton", { "on": {"click": msg(ExampleMoveUp, example)}}, "↑"), h("button.shyButton", { "on": {"click": msg(ExampleMoveDown, example)}}, "↓"), h("button.shyButton", { "on": {"click": msg(ExampleBin, example)}}, "🗑")]) else: console.log("Should not be heree!!") @staticmethod def view_modal(modal_shown, modal): return h("div.modal", {}, [ h("input", { "props": {"type": "checkbox", "checked": modal_shown} }, ""), h("label.overlay", {}, ""), h("article", {"on": { "click": msg(NoAction) }}, modal())])