Source code for kvalikirstu2.tmp_edit_window

"""A module for editing files with a text editor."""
import wx.stc
from kvalikirstu2 import argument_parser
from kvalikirstu2 import paragraph_analyzer
from kvalikirstu2 import gui_utils
from kvalikirstu2.localization import _


[docs]class ParagraphErrorWindow(wx.Dialog): """ Window for displaying paragraph errors. """ def __init__(self, model, message, parsing_exception: paragraph_analyzer.ParagraphParsingException): super().__init__(None, title=_("Paragraph parsing error - %s") % parsing_exception.temp_path, style=wx.DEFAULT_DIALOG_STYLE | wx.STAY_ON_TOP) self.parsing_exception = parsing_exception self.model = model self.message = message self.args = argument_parser.get_args() self.edit_window = None self._init_window() def _init_window(self): outer_sizer = wx.BoxSizer(wx.VERTICAL) main_sizer = wx.BoxSizer(wx.HORIZONTAL) static_icon = wx.StaticBitmap(self, bitmap=wx.ArtProvider.GetBitmap(wx.ART_ERROR), size=(32, 32)) main_sizer.Add(static_icon, flag=wx.ALL, border=10) controls_sizer = wx.BoxSizer(wx.VERTICAL) error_text = wx.StaticText(self, label=self.message) error_text.Wrap(600) error_text_sizer = wx.BoxSizer(wx.HORIZONTAL) error_text_sizer.Add(error_text, flag=wx.TOP, border=15) controls_sizer.Add(error_text_sizer, flag=wx.RIGHT, border=10) outer_button_panel = wx.Panel(self) outer_button_panel_sizer = wx.BoxSizer(wx.HORIZONTAL) outer_button_panel.SetSizer(outer_button_panel_sizer) self.open_button = wx.Button(outer_button_panel, label=_("Edit file...")) outer_button_panel_sizer.Add(self.open_button, flag=wx.ALL, border=15) self.abort_button = wx.Button(outer_button_panel, label=_("Abort")) outer_button_panel_sizer.Add(self.abort_button, flag=wx.RIGHT | wx.TOP | wx.BOTTOM, border=15) main_sizer.Add(controls_sizer) outer_sizer.Add(main_sizer) outer_sizer.Add(outer_button_panel, flag=wx.ALIGN_RIGHT) self.SetSizerAndFit(outer_sizer) self.CenterOnScreen() self._bind_buttons() def _open_pressed(self, _): """Pressed save button.""" self.edit_window = TmpEditWindow(self.model, self.parsing_exception, None, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MAXIMIZE_BOX) result = self.edit_window.ShowModal() self.edit_window.Destroy() self.EndModal(result) def _abort_pressed(self, _): """Pressed cancel button.""" self.EndModal(wx.ID_OK) def _exit(self, _): self.EndModal(wx.ID_CANCEL) def _bind_buttons(self): """Bind the window buttons.""" self.Bind(wx.EVT_BUTTON, self._open_pressed, self.open_button) self.Bind(wx.EVT_BUTTON, self._abort_pressed, self.abort_button) self.Bind(wx.EVT_CLOSE, self._exit)
[docs]class TmpEditWindow(wx.Dialog, gui_utils.HotkeyMixin): # Dialog instead of Frame to send EndModal ID to caller """The header editing window.""" def __init__(self, model, parsing_exception, *args, **kwargs): """Initializes the window.""" super().__init__(*args, **kwargs) gui_utils.HotkeyMixin.__init__(self) self.model = model self.temp_file_path = parsing_exception.temp_path self.row_min = parsing_exception.row_min self.row_max = parsing_exception.row_max self.args = argument_parser.get_args() self.init_window() def _highlight_rows(self): self.styled_ctrl.MarkerDefine(0, wx.stc.STC_MARK_ARROW, "red") for index in range(self.row_min, self.row_max): self.styled_ctrl.MarkerAdd(index, 0) def _scroll_window(self): target = self.row_min - 1 if target > 0: self.styled_ctrl.ScrollToLine(target)
[docs] def init_window(self): """Initializes the window.""" self.panel = wx.Panel(self) self.sizer = wx.GridBagSizer(hgap=5, vgap=5) self.styled_ctrl = wx.stc.StyledTextCtrl(self.panel, size=(900, 500)) self.styled_ctrl.SetReadOnly(False) self.sizer.Add(self.styled_ctrl, pos=(0, 0), flag=wx.EXPAND | wx.ALL, span=(1, 3), border=self.args.padding) button_sizer = wx.BoxSizer(wx.HORIZONTAL) self.save_button = wx.Button(self.panel, label=_("Save")) button_sizer.Add(self.save_button) button_sizer.AddSpacer(self.args.padding) self.cancel_button = wx.Button(self.panel, label=_("Cancel")) button_sizer.Add(self.cancel_button) self.sizer.Add(button_sizer, pos=(1, 2), flag=wx.ALIGN_RIGHT | wx.ALL, border=self.args.padding) self.sizer.AddGrowableCol(0) self.sizer.AddGrowableRow(0) self.SetTitle(_("Temporary file - %s") % self.temp_file_path) self._bind_buttons() self._load_tempfile_content() gui_utils.add_border_and_fit(self.panel, self.sizer, self) self.Center() self._scroll_window()
def _load_tempfile_content(self): text = self.model.get_tempfile_content(self.temp_file_path) self.styled_ctrl.SetText(text) self._highlight_rows() def _save_pressed(self): """Pressed save button.""" text = self.styled_ctrl.GetText() self.model.save_tempfile_content(self.temp_file_path, text) wx.MessageBox(_("File saved successfully."), _("Info")) self.EndModal(wx.ID_SAVE) def _cancel_pressed(self, _tmp): """Pressed cancel button.""" self.EndModal(wx.ID_CANCEL) def _bind_buttons(self): """Bind the window buttons.""" self.Bind(wx.EVT_BUTTON, lambda evt: self._save_pressed(), self.save_button) self.Bind(wx.EVT_BUTTON, self._cancel_pressed, self.cancel_button) self._add_hotkey(83, wx.MOD_CONTROL, self._save_pressed)
[docs]def open_temp_error(model, message, exception): """Open a temp file error window.""" window = ParagraphErrorWindow(model, message, exception) return_val = window.ShowModal() window.Destroy() return return_val