"""A GUI module for displaying a window for adding language tags to files.
"""
import wx
from kvalikirstu2 import gui_utils
from kvalikirstu2.header_panel import EditableListCtrl as list_ctrl
from kvalikirstu2.localization import _
# Draft for layout, doesn't make changes to data
[docs]class LangSelectWindow(wx.Dialog):
"""A window for adding language tags to files.
"""
def __init__(self, parent, model):
super().__init__(parent, style=wx.DEFAULT_DIALOG_STYLE | wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX)
self.padding = parent.padding
self.model = model
self.panel = wx.Panel(self)
self.sizer = wx.BoxSizer(wx.VERTICAL)
self.langs = self.model.get_language_codes()
self.daf_contents = {data.filepath: data.content for data in self.model.get_daf_data()}
self.paths = {}
self._init_frame()
gui_utils.add_border_and_fit(self.panel, self.sizer, self)
self.SetTitle(_("File languages"))
self.Center()
self.SetSize(650, 450) # Set this
self.Bind(wx.EVT_LIST_ITEM_SELECTED, lambda evt: self._update_preview(evt.GetIndex()))
def _init_frame(self):
self.file_list = list_ctrl(self.panel, editable_cols=[0],
style=wx.LC_REPORT | wx.BORDER_SUNKEN)
self._init_file_list()
self.preview = wx.TextCtrl(
self.panel, style=wx.TE_MULTILINE | wx.TE_READONLY,
value=_("Select a file to show its contents. Select a file or multiple files and set the "
"language of the file(s) from the dropdown below"))
self.lang_select = AutocomplComboBox(self.panel, choices=self.langs)
self.lang_select.Bind(wx.EVT_COMBOBOX, self._on_select_from_combo)
self.lang_select.Bind(wx.EVT_TEXT_ENTER, lambda evt: self._on_enter_in_combo())
ok_btn = wx.Button(self.panel, label=_("Rename files"))
cancel_btn = wx.Button(self.panel, label=_("Cancel"))
left_sizer = wx.BoxSizer(wx.VERTICAL)
left_sizer.Add(self.file_list, 1, wx.EXPAND | wx.ALL, self.padding)
left_sizer.Add(self.lang_select, 0, wx.EXPAND | wx.ALL, self.padding)
right_sizer = wx.BoxSizer(wx.VERTICAL)
right_sizer.Add(self.preview, 1, wx.EXPAND | wx.ALL, self.padding)
right_sizer.AddSpacer(self.lang_select.Size[1]+(self.padding*2))
horz_sizer = wx.BoxSizer(wx.HORIZONTAL)
horz_sizer.Add(left_sizer, 1, wx.EXPAND)
horz_sizer.Add(right_sizer, 1, wx.EXPAND)
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
btn_sizer.Add(ok_btn, 0, wx.ALL, self.padding)
btn_sizer.Add(cancel_btn, 0, wx.ALL, self.padding)
self.sizer.Add(horz_sizer, 1, wx.EXPAND | wx.ALL, self.padding)
self.sizer.Add(btn_sizer, 0, wx.ALIGN_RIGHT, self.padding)
# Test binds
ok_btn.Bind(wx.EVT_BUTTON, self._update_files)
cancel_btn.Bind(wx.EVT_BUTTON, lambda evt: self.EndModal(wx.ID_CANCEL))
def _init_file_list(self):
data_path = self.model.get_data_path()
self.file_list.InsertColumn(0, _("File"), width=200)
self.file_list.InsertColumn(1, _("Language"))
for index, daf in enumerate(self.model.get_daf_data()):
path = daf.filepath
filename = path.replace(data_path, "")
self.paths[index] = path
self.file_list.Append([filename])
self.file_list.SetItem(index, 1, daf.langcode)
index += 1
def _update_preview(self, row):
path = self.paths[row]
preview_text = self.daf_contents[path] if self.daf_contents[path] else _("Preview not available")
self.preview.SetLabelText(preview_text)
def _on_enter_in_combo(self):
lang = self.lang_select.GetValue()
if lang in self.lang_select.choices:
self.change_lang(lang)
def _on_select_from_combo(self, evt):
lang = evt.GetString()
self.change_lang(lang)
[docs] def change_lang(self, lang, _evt=None):
"""Changes the value in the language col for all selected rows.
"""
if self.file_list.GetSelectedItemCount() < 1:
return
row = self.file_list.GetFirstSelected()
self.file_list.SetItem(row, 1, lang)
for _ct in range(1, self.file_list.GetSelectedItemCount()):
row = self.file_list.GetNextSelected(row)
self.file_list.SetItem(row, 1, lang)
def _update_files(self, _evt):
"""Returns a dictionary of file paths and the language code for each.
"""
self.Close()
items = self.file_list.GetItemCount()
lang_dictionary = {}
for row_index in range(items):
path = self.paths[row_index]
lang = self.file_list.GetItemText(row_index, 1)
if lang in self.langs:
lang_dictionary[path] = lang
self.model.add_language_codes(lang_dictionary)
self.EndModal(wx.ID_SAVE)
[docs]class AutocomplComboBox(wx.ComboBox):
"""A dropdown selection control with an autocomplete feature."""
def __init__(self, parent, choices):
super().__init__(parent, wx.ID_ANY, style=wx.CB_DROPDOWN | wx.TE_PROCESS_ENTER, choices=choices)
self.choices = choices
self.Bind(wx.EVT_TEXT, self.on_text)
self.Bind(wx.EVT_KEY_DOWN, self.on_press)
self.ignore_evt_text = False
self.backspace_pressed = False
self.found = False
[docs] def on_press(self, evt):
"""Keeps track of if backspace key has been pressed.
"""
if evt.GetKeyCode() == 8:
self.backspace_pressed = True
evt.Skip()
[docs] def on_text(self, evt):
"""On user text input, suggests a matching value from the choices list.
"""
text = evt.GetString()
if self.ignore_evt_text:
self.ignore_evt_text = False
return
if self.backspace_pressed:
self.backspace_pressed = False
if self.found:
text = text[:-1]
self.found = False
for choice in self.choices:
if text and choice.startswith(text):
self.ignore_evt_text = True
self.SetValue(choice)
self.SetInsertionPoint(len(text))
self.SetTextSelection(len(text), len(choice))
self.found = True
break