Source code for kvalikirstu2.lang_select_window

"""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