Skip to content

Commit b9acba7

Browse files
committed
ui.statusbar: Add a compact menu button, cribbed from GEdit
1 parent bb5b029 commit b9acba7

1 file changed

Lines changed: 68 additions & 1 deletion

File tree

meld/ui/statusbar.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,73 @@ class "MeldStatusBar" style "meld-statusbar-style"
3131
""")
3232

3333

34+
class MeldStatusMenuButton(Gtk.MenuButton):
35+
"""Compact menu button with arrow indicator for use in a status bar
36+
37+
Implementation based on gedit-status-menu-button.c
38+
Copyright (C) 2008 - Jesse van den Kieboom
39+
"""
40+
41+
__gtype_name__ = "MeldStatusMenuButton"
42+
43+
style = b"""
44+
* {
45+
padding: 1px 8px 2px 4px;
46+
border: 0;
47+
outline-width: 0;
48+
}
49+
"""
50+
51+
css_provider = Gtk.CssProvider()
52+
css_provider.load_from_data(style)
53+
54+
def get_label(self):
55+
return self._label.get_text()
56+
57+
def set_label(self, markup):
58+
if markup == self._label.get_text():
59+
return
60+
self._label.set_markup(markup)
61+
62+
label = GObject.property(
63+
type=str,
64+
nick="The GtkSourceLanguage displayed in the status bar",
65+
default=None,
66+
getter=get_label,
67+
setter=set_label,
68+
)
69+
70+
def __init__(self):
71+
Gtk.MenuButton.__init__(self)
72+
73+
style_context = self.get_style_context()
74+
style_context.add_provider(
75+
self.css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
76+
style_context.add_class('flat')
77+
78+
# Ideally this would be a template child, but there's still no
79+
# Python support for this.
80+
label = Gtk.Label()
81+
label.props.single_line_mode = True
82+
label.props.halign = Gtk.Align.START
83+
label.props.valign = Gtk.Align.BASELINE
84+
85+
arrow = Gtk.Image.new_from_icon_name(
86+
'pan-down-symbolic', Gtk.IconSize.SMALL_TOOLBAR)
87+
arrow.props.valign = Gtk.Align.BASELINE
88+
89+
box = Gtk.Box()
90+
box.set_spacing(3)
91+
box.add(label)
92+
box.add(arrow)
93+
box.show_all()
94+
95+
self.remove(self.get_child())
96+
self.add(box)
97+
98+
self._label = label
99+
100+
34101
class MeldStatusBar(Gtk.Statusbar):
35102
__gtype_name__ = "MeldStatusBar"
36103

@@ -85,7 +152,7 @@ def get_language_label(binding, language, *args):
85152
return _("Plain Text")
86153
return language.get_name()
87154

88-
button = Gtk.MenuButton()
155+
button = MeldStatusMenuButton()
89156
self.bind_property(
90157
'source-language', button, 'label', GObject.BindingFlags.DEFAULT,
91158
get_language_label)

0 commit comments

Comments
 (0)