From 2a18273c80abd6f89cdadf922221060085c20ce9 Mon Sep 17 00:00:00 2001 From: James Westman Date: Fri, 12 Nov 2021 19:01:20 -0600 Subject: [PATCH] Add string lists --- gtkblueprinttool/extensions/__init__.py | 8 +- .../extensions/gtk_string_list.py | 88 +++++++++++++++++++ tests/sample_errors/obj_in_string_list.blp | 9 ++ tests/sample_errors/obj_in_string_list.err | 1 + tests/samples/string_list.blp | 8 ++ tests/samples/string_list.ui | 10 +++ tests/test_samples.py | 2 + 7 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 gtkblueprinttool/extensions/gtk_string_list.py create mode 100644 tests/sample_errors/obj_in_string_list.blp create mode 100644 tests/sample_errors/obj_in_string_list.err create mode 100644 tests/samples/string_list.blp create mode 100644 tests/samples/string_list.ui diff --git a/gtkblueprinttool/extensions/__init__.py b/gtkblueprinttool/extensions/__init__.py index 9b0cf01..f5ea13b 100644 --- a/gtkblueprinttool/extensions/__init__.py +++ b/gtkblueprinttool/extensions/__init__.py @@ -2,13 +2,17 @@ templates. """ from .gtk_a11y import a11y +from .gtk_combo_box_text import items from .gtk_file_filter import mime_types, patterns, suffixes from .gtk_layout import layout from .gtk_menu import menu from .gtk_size_group import widgets +from .gtk_string_list import strings from .gtk_styles import styles -from .gtk_combo_box_text import items OBJECT_HOOKS = [menu] -OBJECT_CONTENT_HOOKS = [a11y, styles, layout, mime_types, patterns, suffixes, widgets, items] +OBJECT_CONTENT_HOOKS = [ + a11y, styles, layout, mime_types, patterns, suffixes, widgets, items, + strings, +] diff --git a/gtkblueprinttool/extensions/gtk_string_list.py b/gtkblueprinttool/extensions/gtk_string_list.py new file mode 100644 index 0000000..db92331 --- /dev/null +++ b/gtkblueprinttool/extensions/gtk_string_list.py @@ -0,0 +1,88 @@ +# gtk_combo_box_text.py +# +# Copyright 2021 James Westman +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 3 of the +# License, or (at your option) any later version. +# +# This file is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this program. If not, see . +# +# SPDX-License-Identifier: LGPL-3.0-or-later + + +from ..ast import BaseTypedAttribute, Value, TranslatedStringValue +from ..ast_utils import AstNode, validate +from ..completions_utils import * +from ..gir import StringType +from ..lsp_utils import Completion, CompletionItemKind +from ..parse_tree import * +from ..parser_utils import * +from ..xml_emitter import XmlEmitter + + +class Items(AstNode): + @validate("items") + def container_is_string_list(self): + self.validate_parent_type("Gtk", "StringList", "StringList items") + + + def emit_xml(self, xml: XmlEmitter): + xml.start_tag("items") + for child in self.children: + child.emit_xml(xml) + xml.end_tag() + + +class Item(AstNode): + @property + def value_type(self): + return StringType() + + def emit_xml(self, xml: XmlEmitter): + value = self.children[Value][0] + translatable = isinstance(value, TranslatedStringValue) + xml.start_tag("item", translatable="true" if translatable else None) + if translatable: + xml.put_text(value.string) + else: + value.emit_xml(xml) + xml.end_tag() + + +item = Group( + Item, + value, +) + +strings = Group( + Items, + Statement( + Keyword("strings", True), + OpenBracket(), + Delimited( + item, + Comma() + ), + CloseBracket(), + ) +) + + +@completer( + applies_in=[ast.ObjectContent], + applies_in_subclass=("Gtk", "StringList"), + matches=new_statement_patterns, +) +def strings_completer(ast_node, match_variables): + yield Completion( + "strings", CompletionItemKind.Snippet, + snippet="strings [$0];" + ) diff --git a/tests/sample_errors/obj_in_string_list.blp b/tests/sample_errors/obj_in_string_list.blp new file mode 100644 index 0000000..005fe68 --- /dev/null +++ b/tests/sample_errors/obj_in_string_list.blp @@ -0,0 +1,9 @@ +using Gtk 4.0; + +StringList { + strings [ + id, + ]; +} + +Widget id {} diff --git a/tests/sample_errors/obj_in_string_list.err b/tests/sample_errors/obj_in_string_list.err new file mode 100644 index 0000000..aacead5 --- /dev/null +++ b/tests/sample_errors/obj_in_string_list.err @@ -0,0 +1 @@ +5,5,2,Cannot assign Gtk.Widget to string diff --git a/tests/samples/string_list.blp b/tests/samples/string_list.blp new file mode 100644 index 0000000..02c133b --- /dev/null +++ b/tests/samples/string_list.blp @@ -0,0 +1,8 @@ +using Gtk 4.0; + +StringList { + strings [ + "Hello, world!", + _("Hello!"), + ]; +} diff --git a/tests/samples/string_list.ui b/tests/samples/string_list.ui new file mode 100644 index 0000000..02078a0 --- /dev/null +++ b/tests/samples/string_list.ui @@ -0,0 +1,10 @@ + + + + + + Hello, world! + Hello! + + + diff --git a/tests/test_samples.py b/tests/test_samples.py index 76adaef..0b06257 100644 --- a/tests/test_samples.py +++ b/tests/test_samples.py @@ -105,6 +105,7 @@ class TestSamples(unittest.TestCase): self.assert_sample("property") self.assert_sample("signal") self.assert_sample("size_group") + self.assert_sample("string_list") self.assert_sample("strings") self.assert_sample("style") self.assert_sample("template") @@ -127,6 +128,7 @@ class TestSamples(unittest.TestCase): self.assert_sample_error("ns_not_imported") self.assert_sample_error("not_a_class") self.assert_sample_error("object_dne") + self.assert_sample_error("obj_in_string_list") self.assert_sample_error("obj_prop_type") self.assert_sample_error("property_dne") self.assert_sample_error("signal_dne")