-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathOutputWindow.py
119 lines (100 loc) · 4.56 KB
/
OutputWindow.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import wx
from wx import glcanvas
import cam
import cad
import Mouse
class OutputWindow(glcanvas.GLCanvas):
def __init__(self, parent):
glcanvas.GLCanvas.__init__(self, parent,-1, attribList=[glcanvas.WX_GL_RGBA, glcanvas.WX_GL_DOUBLEBUFFER, glcanvas.WX_GL_DEPTH_SIZE, 24], style = wx.VSCROLL)
self.viewport = cam.NewNcCodeViewport()
self.context = glcanvas.GLContext(self)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_SCROLLWIN_THUMBTRACK, self.OnScroll)
self.Bind(wx.EVT_SCROLLWIN_THUMBRELEASE, self.OnScrollRelease)
self.Bind(wx.EVT_SCROLLWIN_LINEUP, self.OnScrollLineUp)
self.Bind(wx.EVT_SCROLLWIN_LINEDOWN, self.OnScrollLineDown)
self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Resize()
def OnSize(self, event):
self.Resize()
event.Skip()
def GetLastLineToScrollTo(self):
line = self.viewport.GetNumberOfLines() - self.viewport.GetLinesPerPage()
if line < 0:
line = 0
return line
def OnMouseWheel(self, event):
x = event.GetWheelRotation()
if event.controlDown:
# zoom in or out
scale = 1.1 if x > 0 else 0.909090909090909
new_pixels_per_line = self.viewport.GetPixelsPerLine() * scale
if new_pixels_per_line < 10.0:
new_pixels_per_line = 10.0
elif new_pixels_per_line > 150.0:
new_pixels_per_line = 150.0
old_lines_per_page = self.viewport.GetLinesPerPage()
# set the new scale
self.viewport.SetPixelsPerLine( new_pixels_per_line )
# move to keep the middle in the middle
new_lines_per_page = self.viewport.GetLinesPerPage()
lines_shift = (new_lines_per_page - old_lines_per_page) * (float(event.GetY()) / self.viewport.GetHeight())
new_current_line = self.viewport.GetCurrentLine() - lines_shift
if new_current_line > self.GetLastLineToScrollTo():
new_current_line = self.GetLastLineToScrollTo()
elif new_current_line < 0:
new_current_line = 0
self.viewport.SetCurrentLine(new_current_line)
else:
line_number = self.viewport.GetCurrentLine()
translation = 20 / self.viewport.GetPixelsPerLine()
if x > 0:
line_number -= translation
if line_number < 0: line_number = 0
else:
line_number += translation
last_line = self.GetLastLineToScrollTo()
if line_number > last_line:
line_number = last_line
self.viewport.SetCurrentLine(line_number)
self.SetScrollBarToCurrentLine()
self.Refresh()
def OnLeftDown(self, event):
# select the block clicked on
line_number = self.viewport.GetCurrentLine() + event.y / self.viewport.GetPixelsPerLine()
block = self.viewport.GetBlockAtLine(int(line_number))
cad.ClearSelection()
cad.Select(block)
self.viewport.SelectLine(line_number, False)
wx.GetApp().frame.graphics_canvas.Refresh()
self.Refresh()
def OnEraseBackground(self, event):
pass # Do nothing, to avoid flashing on MSW
def Resize(self):
s = self.GetClientSize()
self.viewport.SetSize(s.GetWidth(), s.GetHeight())
self.Refresh()
def OnPaint(self, event):
dc = wx.PaintDC(self)
self.SetCurrent(self.context)
self.viewport.Render()
self.SwapBuffers()
def SetScrollBarToCurrentLine(self):
self.SetScrollbar(wx.VERTICAL, int(self.viewport.GetCurrentLine() * 100), int(self.viewport.GetLinesPerPage() * 100), int(self.viewport.GetNumberOfLines() * 100))
def SetNcCodeObject(self, nccode):
self.viewport.SetNcCode(nccode)
self.SetScrollBarToCurrentLine()
def OnScroll(self, event):
fraction = float(event.GetPosition()) * 0.01 / self.viewport.GetNumberOfLines()
cur_line = float(self.viewport.GetNumberOfLines()) * fraction
self.viewport.SetCurrentLine(cur_line )
self.Refresh()
def OnScrollLineUp(self, event):
pass
def OnScrollLineDown(self, event):
pass
def OnScrollRelease(self, event):
self.SetScrollBarToCurrentLine()