Commit f5d5b074 authored by Kai Willadsen's avatar Kai Willadsen

ui.statusbar: Initial implementation of Filediff-specific status bar

parent 176e7c83
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.8 -->
<object class="GtkListStore" id="liststore">
<columns>
<!-- column-name name -->
<column type="gchararray"/>
<!-- column-name lang -->
<column type="GtkSourceLanguage"/>
</columns>
</object>
<object class="GtkTreeModelFilter" id="treemodelfilter">
<property name="child_model">liststore</property>
</object>
<template class="HighlightModeSelector" parent="GtkGrid">
<property name="width_request">300</property>
<property name="height_request">400</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="has_focus">False</property>
<property name="is_focus">False</property>
<property name="row_spacing">3</property>
<property name="border_width">6</property>
<child>
<object class="GtkSearchEntry" id="entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">True</property>
<property name="is_focus">False</property>
<property name="activates_default">True</property>
<property name="placeholder_text" translatable="yes">Search highlight mode...</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="scrolledwindow1">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">False</property>
<property name="is_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkTreeView" id="treeview">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="has_focus">False</property>
<property name="is_focus">False</property>
<property name="model">treemodelfilter</property>
<property name="headers_visible">False</property>
<property name="headers_clickable">False</property>
<property name="enable_search">False</property>
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview_selection"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="treeviewcolumn">
<child>
<object class="GtkCellRendererText" id="cellrenderertext"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
</object>
</child>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
</template>
</interface>
......@@ -13,10 +13,14 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from gi.repository import GLib
from gi.repository import GObject
from gi.repository import Gtk
from gi.repository import GtkSource
from gi.repository import Pango
from meld.conf import _, ui_file
Gtk.rc_parse_string(
"""
......@@ -49,8 +53,115 @@ class MeldStatusBar(Gtk.Statusbar):
self.pack_start(alignment, True, True, 0)
alignment.show()
self.box_box = Gtk.HBox(homogeneous=False, spacing=6)
self.pack_start(self.box_box, True, True, 0)
self.box_box.pack_end(self.construct_highlighting_selector(), False, True, 0)
self.box_box.show_all()
def construct_highlighting_selector(self):
pop = Gtk.Popover()
pop.set_position(Gtk.PositionType.TOP)
pop.add(HighlightModeSelector())
button = Gtk.MenuButton()
button.set_label("Foo")
button.set_popover(pop)
button.show()
return button
def set_info_box(self, widgets):
for child in self.info_box.get_children():
self.info_box.remove(child)
for widget in widgets:
self.info_box.pack_end(widget, False, True, 0)
class TemplateHackMixin(object):
def get_template_child(self, widget_type, name):
# Taken from an in-progress patch on bgo#701843
def get_template_child(widget, widget_type, name):
# Explicitly use gtk_buildable_get_name() because it is masked by
# gtk_widget_get_name() in GI.
if isinstance(widget, widget_type) and \
isinstance(widget, Gtk.Buildable) and \
Gtk.Buildable.get_name(widget) == name:
return widget
if isinstance(widget, Gtk.Container):
for child in widget.get_children():
result = get_template_child(child, widget_type, name)
if result is not None:
return result
return get_template_child(self, widget_type, name)
# HighlightModeSelector was copied and translated to Python from gedit
# Copyright (C) 2013 - Ignacio Casal Quinteiro
# Python translation and adaptations
# Copyright (C) 2015 Kai Willadsen <kai.willadsen@gmail.com>
class HighlightModeSelector(TemplateHackMixin, Gtk.Grid):
__gtype_name__ = "HighlightModeSelector"
__gsignals__ = {
'language-selected': (
GObject.SignalFlags.RUN_FIRST | GObject.SignalFlags.ACTION,
None, (GtkSource.Language,)),
}
NAME_COLUMN, LANG_COLUMN = 0, 1
def __init__(self):
Gtk.Grid.__init__(self)
self.init_template()
self.entry = self.get_template_child(Gtk.SearchEntry, 'entry')
self.treeview = self.get_template_child(Gtk.TreeView, 'treeview')
self.treeview_selection = self.treeview.get_selection()
# FIXME: Should be able to access as a template child, but can't.
self.listfilter = self.treeview.get_model()
self.liststore = self.listfilter.get_model()
self.liststore.append((_("Plain Text"), None))
manager = GtkSource.LanguageManager()
for lang_id in manager.get_language_ids():
lang = manager.get_language(lang_id)
self.liststore.append((lang.get_name(), lang))
self.filter_string = ''
self.entry.connect('changed', self.on_entry_changed)
self.listfilter.set_visible_func(self.lang_name_filter)
self.entry.connect('activate', self.on_activate)
self.treeview.connect('row-activated', self.on_activate)
def lang_name_filter(self, model, it, *args):
if not self.filter_string:
return True
lang_name = model.get_value(it, self.NAME_COLUMN).lower()
return self.filter_string.lower() in lang_name
def on_entry_changed(self, entry):
self.filter_string = entry.get_text()
self.listfilter.refilter()
first = self.listfilter.get_iter_first()
if first:
self.treeview_selection.select_iter(first)
def on_activate(self, *args):
model, it = self.treeview_selection.get_selected()
if not it:
return
lang = model.get_value(it, self.LANG_COLUMN)
self.emit('language-selected', lang)
template = open(ui_file('gedit-highlight-mode-selector.ui')).read()
template_bytes = GLib.Bytes.new(template)
HighlightModeSelector.set_template(template_bytes)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment