1 """
2 Simple editor class extracted from macroed class in Printrun pronterface module.
3
4 Credits:
5 Original Author: Kliment (https://github.com/kliment/Printrun)
6
7 """
8
9 try:
10 import wx
11 except:
12 print _("WX is not installed. This program requires WX to run.")
13 raise
14
16 """Really simple editor"""
17 - def __init__(self, filename, text, callback, readonly=False):
18 self.originalText = text
19 self.filename = filename
20 self.readonly = readonly
21
22 if self.readonly:
23 self.title = '%s (readonly)'%filename
24 else :
25 self.title = filename
26
27 wx.Dialog.__init__(self, None, title=self.title, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
28 self.callback = callback
29 self.panel = wx.Panel(self, -1)
30 topsizer = wx.BoxSizer(wx.VERTICAL)
31
32 self.editorTxtCtrl = wx.TextCtrl(self.panel, style=wx.TE_MULTILINE + wx.HSCROLL, size=(400, 300))
33 self.editorTxtCtrl.SetValue(text)
34 self.editorTxtCtrl.SetEditable(not self.readonly)
35 self.editorTxtCtrl.Bind(wx.EVT_TEXT, self.onTextChange)
36
37 topsizer.Add(self.editorTxtCtrl, 1, wx.ALL + wx.EXPAND)
38
39 commandsizer = wx.BoxSizer(wx.HORIZONTAL)
40 self.okBtn = wx.Button(self.panel, -1, "Save")
41 self.okBtn.Bind(wx.EVT_BUTTON, self.save)
42 self.okBtn.Disable()
43 self.Bind(wx.EVT_CLOSE, self.close)
44 self.Bind(wx.EVT_CHAR_HOOK, self.onKeyPress)
45 commandsizer.Add(self.okBtn)
46 self.cancelBtn = wx.Button(self.panel, -1, "Cancel")
47 self.cancelBtn.Bind(wx.EVT_BUTTON, self.close)
48 commandsizer.Add(self.cancelBtn)
49 topsizer.Add(commandsizer, 0, wx.EXPAND)
50
51 self.panel.SetSizer(topsizer)
52 topsizer.Layout()
53 topsizer.Fit(self)
54 self.Show()
55 self.editorTxtCtrl.SetFocus()
56 self.editorTxtCtrl.SetSelection(0,0)
57
58 - def save(self, event):
59 self.Destroy()
60 self.callback(self.editorTxtCtrl.GetValue())
61
64
66 x = event.GetKeyCode()
67 if x == wx.WXK_ESCAPE:
68 if self.editorTxtCtrl.GetValue() != self.originalText:
69 msgDlg = wx.MessageDialog(self, 'Save changes?', 'Confirm', wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION)
70 result = msgDlg.ShowModal()
71 msgDlg.Destroy()
72 if result == wx.ID_YES:
73 self.save(event)
74 elif result == wx.ID_NO:
75 self.close(event)
76 event.Skip()
77
78 - def onTextChange(self, event):
79 if self.editorTxtCtrl.GetValue() != self.originalText:
80 self.SetTitle("%s*"%self.title)
81 self.okBtn.Enable()
82 else:
83 self.SetTitle(self.title)
84 self.okBtn.Disable()
85