def _create_layout(source_key, color_scheme, lines, ncolumns): context = source_key.context frame_width = LayoutBuilderKeySequence._calc_frame_width(context) nrows = len(lines) spacing = (1, 1) # calc canvas size rect = source_key.get_canvas_border_rect() layout_canvas_rect = Rect( frame_width, frame_width, rect.w * ncolumns + spacing[0] * (ncolumns - 1), rect.h * nrows + spacing[1] * (nrows - 1)) # subdive into logical rectangles for the keys layout_rect = context.canvas_to_log_rect(layout_canvas_rect) key_rects = layout_rect.subdivide(ncolumns, nrows, *spacing) # create keys, slots for empty labels are skipped keys = [] for i, line in enumerate(lines): for j, item in enumerate(line): slot = i * ncolumns + j if item: # control item? key = item key.set_border_rect(key_rects[slot]) key.group = "alternatives" key.color_scheme = color_scheme keys.append(key) item = LayoutPanel() item.border = 0 item.set_items(keys) layout = LayoutRoot(item) layout.fit_inside_canvas(layout_canvas_rect) return layout, frame_width
def _create_layout(source_key, color_scheme, lines, ncolumns): context = source_key.context frame_width = LayoutBuilderKeySequence._calc_frame_width(context) nrows = len(lines) spacing = (1, 1) # calc canvas size rect = source_key.get_canvas_border_rect() layout_canvas_rect = Rect(frame_width, frame_width, rect.w * ncolumns + spacing[0] * (ncolumns - 1), rect.h * nrows + spacing[1] * (nrows - 1)) # subdive into logical rectangles for the keys layout_rect = context.canvas_to_log_rect(layout_canvas_rect) key_rects = layout_rect.subdivide(ncolumns, nrows, *spacing) # create keys, slots for empty labels are skipped keys = [] for i, line in enumerate(lines): for j, item in enumerate(line): slot = i * ncolumns + j if item: # control item? key = item key.set_border_rect(key_rects[slot]) key.group = "alternatives" key.color_scheme = color_scheme keys.append(key) item = LayoutPanel() item.border = 0 item.set_items(keys) layout = LayoutRoot(item) layout.fit_inside_canvas(layout_canvas_rect) return layout, frame_width
def _load_layout(self, layout_filename, parent_item=None): self._svg_cache = {} layout = None try: f = open_utf8(layout_filename) except FileNotFoundError as ex: _logger.warning("Failed to open '{}': {}".format( layout_filename, unicode_str(ex))) return None # make sure unlink is called with minidom.parse(f).documentElement as dom: # check layout format, no format version means legacy layout format = self.LAYOUT_FORMAT_LEGACY if dom.hasAttribute("format"): format = Version.from_string(dom.attributes["format"].value) self._format = format root = LayoutPanel() # root, representing the 'keyboard' tag root.set_id("__root__") # id for debug prints # Init included root with the parent item's svg filename. # -> Allows to skip specifying svg filenames in includes. if parent_item: root.filename = parent_item.filename if format >= self.LAYOUT_FORMAT_LAYOUT_TREE: self._parse_dom_node(dom, root) layout = root else: _logger.warning( _format( "Loading legacy layout, format '{}'. " "Please consider upgrading to current format '{}'", format, self.LAYOUT_FORMAT)) items = self._parse_legacy_layout(dom) if items: root.set_items(items) layout = root f.close() self._svg_cache = {} # Free the memory return layout
def _load_layout(self, layout_filename, parent_item = None): self._svg_cache = {} layout = None f = open_utf8(layout_filename) # make sure unlink is called with minidom.parse(f).documentElement as dom: # check layout format, no format version means legacy layout format = self.LAYOUT_FORMAT_LEGACY if dom.hasAttribute("format"): format = Version.from_string(dom.attributes["format"].value) self._format = format root = LayoutPanel() # root, representing the 'keyboard' tag root.set_id("__root__") # id for debug prints # Init included root with the parent item's svg filename. # -> Allows to skip specifying svg filenames in includes. if parent_item: root.filename = parent_item.filename if format >= self.LAYOUT_FORMAT_LAYOUT_TREE: self._parse_dom_node(dom, root) layout = root else: _logger.warning(_format("Loading legacy layout, format '{}'. " "Please consider upgrading to current format '{}'", format, self.LAYOUT_FORMAT)) items = self._parse_legacy_layout(dom) if items: root.set_items(items) layout = root f.close() self._svg_cache = {} # Free the memory return layout
def _parse_legacy_layout(self, dom_node): # parse panes panes = [] is_scan = False for i, pane_node in enumerate(dom_node.getElementsByTagName("pane")): item = LayoutPanel() item.layer_id = "layer {}".format(i) item.id = pane_node.attributes["id"].value item.filename = pane_node.attributes["filename"].value # parse keys keys = [] for node in pane_node.getElementsByTagName("key"): key = self._parse_key(node, item) if key: # some keys have changed since Onboard 0.95 if key.id == "middleClick": key.set_id("middleclick") key.action_type = KeyCommon.BUTTON_ACTION if key.id == "secondaryClick": key.set_id("secondaryclick") key.action_type = KeyCommon.BUTTON_ACTION keys.append(key) item.set_items(keys) # check for scan columns if pane_node.getElementsByTagName("column"): is_scan = True panes.append(item) layer_area = LayoutPanel() layer_area.id = "layer_area" layer_area.set_items(panes) # find the most frequent key width histogram = {} for key in layer_area.iter_keys(): w = key.get_border_rect().w histogram[w] = histogram.get(w, 0) + 1 most_frequent_width = max(list(zip(list(histogram.values()), list(histogram.keys()))))[1] \ if histogram else 18 # Legacy onboard had automatic tab-keys for pane switching. # Simulate this by generating layer buttons from scratch. keys = [] group = "__layer_buttons__" widen = 1.4 if not is_scan else 1.0 rect = Rect(0, 0, most_frequent_width * widen, 20) key = RectKey() attributes = {} attributes["id"] = "hide" attributes["group"] = group attributes["image"] = "close.svg" attributes["button"] = "true" attributes["scannable"] = "false" self._init_key(key, attributes) key.set_border_rect(rect.copy()) keys.append(key) key = RectKey() attributes = {} attributes["id"] = "move" attributes["group"] = group attributes["image"] = "move.svg" attributes["button"] = "true" attributes["scannable"] = "false" self._init_key(key, attributes) key.set_border_rect(rect.copy()) keys.append(key) if len(panes) > 1: for i, pane in enumerate(panes): key = RectKey() attributes = {} attributes["id"] = "layer{}".format(i) attributes["group"] = group attributes["label"] = pane.id attributes["button"] = "true" self._init_key(key, attributes) key.set_border_rect(rect.copy()) keys.append(key) layer_switch_column = LayoutBox() layer_switch_column.horizontal = False layer_switch_column.set_items(keys) layout = LayoutBox() layout.border = 1 layout.spacing = 2 layout.set_items([layer_area, layer_switch_column]) return [layout]
def _parse_legacy_layout(self, dom_node): # parse panes panes = [] is_scan = False for i, pane_node in enumerate(dom_node.getElementsByTagName("pane")): item = LayoutPanel() item.layer_id = "layer {}".format(i) item.id = pane_node.attributes["id"].value item.filename = pane_node.attributes["filename"].value # parse keys keys = [] for node in pane_node.getElementsByTagName("key"): key = self._parse_key(node, item) if key: # some keys have changed since Onboard 0.95 if key.id == "middleClick": key.set_id("middleclick") key.type = KeyCommon.BUTTON_TYPE if key.id == "secondaryClick": key.set_id("secondaryclick") key.type = KeyCommon.BUTTON_TYPE keys.append(key) item.set_items(keys) # check for scan columns if pane_node.getElementsByTagName("column"): is_scan = True panes.append(item) layer_area = LayoutPanel() layer_area.id = "layer_area" layer_area.set_items(panes) # find the most frequent key width histogram = {} for key in layer_area.iter_keys(): w = key.get_border_rect().w histogram[w] = histogram.get(w, 0) + 1 most_frequent_width = max(list(zip(list(histogram.values()), list(histogram.keys()))))[1] \ if histogram else 18 # Legacy onboard had automatic tab-keys for pane switching. # Simulate this by generating layer buttons from scratch. keys = [] group = "__layer_buttons__" widen = 1.4 if not is_scan else 1.0 rect = Rect(0, 0, most_frequent_width * widen, 20) key = RectKey() attributes = {} attributes["id"] = "hide" attributes["group"] = group attributes["image"] = "close.svg" attributes["button"] = "true" attributes["scannable"] = "false" self._init_key(key, attributes) key.set_border_rect(rect.copy()) keys.append(key) key = RectKey() attributes = {} attributes["id"] = "move" attributes["group"] = group attributes["image"] = "move.svg" attributes["button"] = "true" attributes["scannable"] = "false" self._init_key(key, attributes) key.set_border_rect(rect.copy()) keys.append(key) if len(panes) > 1: for i, pane in enumerate(panes): key = RectKey() attributes = {} attributes["id"] = "layer{}".format(i) attributes["group"] = group attributes["label"] = pane.id attributes["button"] = "true" self._init_key(key, attributes) key.set_border_rect(rect.copy()) keys.append(key) layer_switch_column = LayoutBox() layer_switch_column.horizontal = False layer_switch_column.set_items(keys) layout = LayoutBox() layout.border = 1 layout.spacing = 2 layout.set_items([layer_area, layer_switch_column]) return [layout]