fix: allow adding action widgets to GtkInfoBar

This commit is contained in:
Gleb Smirnov 2022-02-19 12:51:34 +03:00
parent d9ef1d4df9
commit 4103ad3e71
No known key found for this signature in database
GPG key ID: 559DB6D1D625EFAB
9 changed files with 47 additions and 13 deletions

View file

@ -19,7 +19,7 @@
import typing as T import typing as T
from .gtk_dialog import ResponseId from .response_id import ResponseId
from .common import * from .common import *
@ -83,9 +83,9 @@ class Object(AstNode):
@property @property
def action_widgets(self) -> T.List[ResponseId]: def action_widgets(self) -> T.List[ResponseId]:
"""Get list of `GtkDialog`'s action widgets. """Get list of widget's action widgets.
Empty if object is not `GtkDialog`. Empty if object doesn't have action widgets.
""" """
from .gtkbuilder_child import Child from .gtkbuilder_child import Child

View file

@ -21,7 +21,7 @@
from functools import cache from functools import cache
from .gobject_object import Object from .gobject_object import Object
from .gtk_dialog import ResponseId from .response_id import ResponseId
from .common import * from .common import *

View file

@ -1,4 +1,4 @@
# gtk_dialog.py # response_id.py
# #
# Copyright 2022 Gleb Smirnov <glebsmirnov0708@gmail.com> # Copyright 2022 Gleb Smirnov <glebsmirnov0708@gmail.com>
# #
@ -18,11 +18,18 @@
# SPDX-License-Identifier: LGPL-3.0-or-later # SPDX-License-Identifier: LGPL-3.0-or-later
import typing as T
from .common import * from .common import *
class ResponseId(AstNode): class ResponseId(AstNode):
"""Response ID of GtkDialog's action widget.""" """Response ID of action widget."""
ALLOWED_PARENTS: T.List[T.Tuple[str, str]] = [
("Gtk", "Dialog"),
("Gtk", "InfoBar")
]
grammar = [ grammar = [
UseIdent("response"), UseIdent("response"),
@ -44,11 +51,21 @@ class ResponseId(AstNode):
raise CompileError(f"Only action widget can have response ID") raise CompileError(f"Only action widget can have response ID")
@validate() @validate()
def parent_is_dialog(self) -> None: def parent_has_action_widgets(self) -> None:
"""Chech that parent widget is `GtkDialog`.""" """Chech that parent widget has allowed type."""
from .gobject_object import validate_parent_type from .gobject_object import Object
validate_parent_type(self, "Gtk", "Dialog", "action widgets") container_type = self.parent_by_type(Object).gir_class
gir = self.root.gir
for namespace, name in ResponseId.ALLOWED_PARENTS:
parent_type = gir.get_type(name, namespace)
if container_type.assignable_to(parent_type):
break
else:
raise CompileError(
f"{container_type.full_name} doesn't have action widgets"
)
@validate() @validate()
def widget_have_id(self) -> None: def widget_have_id(self) -> None:
@ -121,7 +138,7 @@ class ResponseId(AstNode):
Must be called while <action-widgets> tag is open. Must be called while <action-widgets> tag is open.
For more details see `GtkDialog` docs. For more details see `GtkDialog` and `GtkInfoBar` docs.
""" """
xml.start_tag( xml.start_tag(
"action-widget", "action-widget",

View file

@ -0,0 +1 @@
4,13,11,Gtk.Box doesn't have action widgets

View file

@ -1 +0,0 @@
4,13,11,Gtk.Box is not a Gtk.Dialog, so it doesn't have action widgets

View file

@ -16,3 +16,10 @@ Dialog {
label: _("Ok"); label: _("Ok");
} }
} }
InfoBar {
[action response=ok]
Button ok_info_button {
label: _("Ok");
}
}

View file

@ -23,4 +23,14 @@
<action-widget response="ok" default="True">ok_button</action-widget> <action-widget response="ok" default="True">ok_button</action-widget>
</action-widgets> </action-widgets>
</object> </object>
<object class="GtkInfoBar">
<child type="action">
<object class="GtkButton" id="ok_info_button">
<property name="label" translatable="true">Ok</property>
</object>
</child>
<action-widgets>
<action-widget response="ok">ok_info_button</action-widget>
</action-widgets>
</object>
</interface> </interface>

View file

@ -150,7 +150,7 @@ class TestSamples(unittest.TestCase):
self.assert_sample_error("action_widget_have_no_id") self.assert_sample_error("action_widget_have_no_id")
self.assert_sample_error("action_widget_multiple_default") self.assert_sample_error("action_widget_multiple_default")
self.assert_sample_error("action_widget_not_action") self.assert_sample_error("action_widget_not_action")
self.assert_sample_error("action_widget_not_in_dialog") self.assert_sample_error("action_widget_in_invalid_container")
self.assert_sample_error("action_widget_response_dne") self.assert_sample_error("action_widget_response_dne")
self.assert_sample_error("action_widget_negative_response") self.assert_sample_error("action_widget_negative_response")
self.assert_sample_error("class_assign") self.assert_sample_error("class_assign")