129 lines
4.1 KiB
Python
129 lines
4.1 KiB
Python
#--------------------------------------------------------------------
|
|
#
|
|
# PyGUI - ScrollableView - Win32
|
|
#
|
|
#--------------------------------------------------------------------
|
|
|
|
import win32con as wc, win32ui as ui
|
|
from GUI.Components import win_none
|
|
from GUI.Canvases import Canvas
|
|
from GUI.GScrollableViews import ScrollableView as GScrollableView, \
|
|
default_extent, default_line_scroll_amount
|
|
from GUI.Geometry import add_pt, sub_pt, offset_rect, offset_rect_neg
|
|
|
|
win_style = ui.AFX_WS_DEFAULT_VIEW
|
|
|
|
#print "ScrollableViews: Creating dummy doc"
|
|
# PyWin32 insists on being given a CDocument when creating a CScrollView,
|
|
# and doesn't provide any way of creating a real one without using a resource.
|
|
|
|
if 1:
|
|
# The following uses a resource included in win32ui.pyd.
|
|
import pywin.mfc.object
|
|
win_dummy_doc_template = pywin.mfc.object.CmdTarget(
|
|
ui.CreateDocTemplate(ui.IDR_PYTHONTYPE))
|
|
ui.GetApp().AddDocTemplate(win_dummy_doc_template)
|
|
def win_get_dummy_doc():
|
|
return win_dummy_doc_template.DoCreateDoc()
|
|
else:
|
|
# The following hack creates something that looks enough
|
|
# like a CDocument to keep it happy. But it doesn't work with
|
|
# pywin32 builds later than 212.
|
|
win_dummy_doc = ui.CreateRichEditView().GetDocument()
|
|
def win_get_dummy_doc():
|
|
return win_dummy_doc
|
|
|
|
class ScrollableView(GScrollableView):
|
|
|
|
_line_scroll_amount = default_line_scroll_amount
|
|
|
|
def __init__(self, **kwds):
|
|
kwds.setdefault('extent', default_extent)
|
|
doc = win_get_dummy_doc()
|
|
win = ui.CreateView(doc)
|
|
#win.CreateWindow(win_none, 0, win_style, (0, 0, 100, 100))
|
|
win.CreateWindow(win_none, ui.AFX_IDW_PANE_FIRST, win_style, (0, 0, 100, 100))
|
|
GScrollableView.__init__(self, _win = win)
|
|
self.set(**kwds)
|
|
|
|
def get_hscrolling(self):
|
|
return self._win.GetStyle() & wc.WS_HSCROLL != 0
|
|
|
|
def get_vscrolling(self):
|
|
return self._win.GetStyle() & wc.WS_VSCROLL != 0
|
|
|
|
def set_hscrolling(self, x):
|
|
self._win_set_flag(x, wc.WS_HSCROLL)
|
|
|
|
def set_vscrolling(self, x):
|
|
self._win_set_flag(x, wc.WS_VSCROLL)
|
|
|
|
def get_line_scroll_amount(self):
|
|
return self._line_scroll_amount
|
|
|
|
def get_extent(self):
|
|
return self._win.GetTotalSize()
|
|
|
|
def set_extent(self, extent):
|
|
self._win_update_scroll_sizes(extent)
|
|
|
|
def get_scroll_offset(self):
|
|
return self._win.GetScrollPosition()
|
|
|
|
def set_scroll_offset(self, p):
|
|
px, py = p
|
|
ex, ey = self.extent
|
|
vx, vy = self.content_size
|
|
xmax = max(0, ex - vx)
|
|
ymax = max(0, ey - vy)
|
|
x = max(0, min(px, xmax))
|
|
y = max(0, min(py, ymax))
|
|
self._win.ScrollToPosition((x, y))
|
|
|
|
def set_bounds(self, bounds):
|
|
GScrollableView.set_bounds(self, bounds)
|
|
extent = self._win.GetTotalSize()
|
|
self._win_update_scroll_sizes(extent)
|
|
|
|
def _invalidate_rect(self, r):
|
|
win = self._win
|
|
s = win.GetScrollPosition()
|
|
self._win.InvalidateRect(offset_rect_neg(r, s))
|
|
|
|
def local_to_global(self, p):
|
|
win = self._win
|
|
q = sub_pt(p, win.GetScrollPosition())
|
|
return win.ClientToScreen(q)
|
|
|
|
def global_to_local(self, g):
|
|
win = self._win
|
|
q = win.ScreenToClient(g)
|
|
return add_pt(q, win.GetScrollPosition())
|
|
|
|
# def global_to_local(self, g):
|
|
# win = self._win
|
|
# l = win.ScreenToClient(g)
|
|
# s = win.GetScrollPosition()
|
|
# q = add_pt(l, s)
|
|
# print "ScrollableView.global_to_local: g =", g, "l =", l, "s =", s, "q =", q ###
|
|
# return q
|
|
|
|
def _win_update_scroll_sizes(self, extent):
|
|
ph = self.h_page_scroll_amount()
|
|
pv = self.v_page_scroll_amount()
|
|
ls = self.line_scroll_amount
|
|
self._win.SetScrollSizes(wc.MM_TEXT, extent, (ph, pv), ls)
|
|
|
|
def OnDraw(self, dc):
|
|
#print "ScrollableView.OnDraw" ###
|
|
update_rect = dc.GetClipBox()
|
|
canvas = Canvas._from_win_dc(dc)
|
|
self.draw(canvas, update_rect)
|
|
|
|
def _win_prepare_dc(self, dc, pinfo = None):
|
|
self._win.OnPrepareDC(dc, None)
|
|
|
|
|
|
|
|
|