wxPython stuff:

1. Added Clipboard and Drag-and-Drop classes
  2. Added wxFontEnumerator
  3. Many changes to wxMenu, wxMenubar
  4. Various other changes and additions
  5. Updates to the demo
  6. Documentation updates


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4387 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
1999-11-06 08:30:23 +00:00
parent 024fb9b98a
commit b1462dfa34
63 changed files with 8689 additions and 1862 deletions

View File

@@ -0,0 +1,237 @@
from wxPython.wx import *
import cPickle
#----------------------------------------------------------------------
class DoodlePad(wxWindow):
def __init__(self, parent, log):
wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER)
self.log = log
self.SetBackgroundColour(wxWHITE)
self.lines = []
self.x = self.y = 0
self.SetCursor(wxStockCursor(wxCURSOR_PENCIL))
EVT_LEFT_DOWN(self, self.OnLeftDown)
EVT_LEFT_UP(self, self.OnLeftUp)
EVT_RIGHT_UP(self, self.OnRightUp)
EVT_MOTION(self, self.OnMotion)
def OnPaint(self, event):
dc = wxPaintDC(self)
self.DrawSavedLines(dc)
def DrawSavedLines(self, dc):
dc.BeginDrawing()
dc.SetPen(wxPen(wxBLUE, 3))
for line in self.lines:
for coords in line:
apply(dc.DrawLine, coords)
dc.EndDrawing()
def OnLeftDown(self, event):
if event.ControlDown():
self.StartDragOpperation()
else:
self.curLine = []
self.x, self.y = event.GetPositionTuple()
self.CaptureMouse()
def OnLeftUp(self, event):
self.lines.append(self.curLine)
self.curLine = []
self.ReleaseMouse()
def OnRightUp(self, event):
self.lines = []
self.Refresh()
def OnMotion(self, event):
if event.Dragging() and not event.ControlDown():
dc = wxClientDC(self)
dc.BeginDrawing()
dc.SetPen(wxPen(wxBLUE, 3))
coords = (self.x, self.y) + event.GetPositionTuple()
self.curLine.append(coords)
apply(dc.DrawLine, coords)
self.x, self.y = event.GetPositionTuple()
dc.EndDrawing()
def StartDragOpperation(self):
# pickle the lines list
linesdata = cPickle.dumps(self.lines, 1)
# create our own data format and use it in a
# custom data object
ldata = wxCustomDataObject(wxCustomDataFormat("DoodleLines"))
ldata.SetData(linesdata)
# Also create a Bitmap version of the drawing
size = self.GetSize()
bmp = wxEmptyBitmap(size.width, size.height)
dc = wxMemoryDC()
dc.SelectObject(bmp)
dc.SetBackground(wxWHITE_BRUSH)
dc.Clear()
self.DrawSavedLines(dc)
dc.SelectObject(wxNullBitmap)
# Now make a data object for the bitmap and also a composite
# data object holding both of the others.
bdata = wxBitmapDataObject(bmp)
data = wxDataObjectComposite()
data.Add(ldata)
data.Add(bdata)
# And finally, create the drop source and begin the drag
# and drop opperation
dropSource = wxDropSource(self)
dropSource.SetData(data)
self.log.WriteText("Begining DragDrop\n")
result = dropSource.DoDragDrop()
self.log.WriteText("DragDrop completed: %d\n" % result)
#----------------------------------------------------------------------
class DoodleDropTarget(wxPyDropTarget):
def __init__(self, window, log):
wxPyDropTarget.__init__(self)
self.log = log
self.dv = window
self.data = wxCustomDataObject(wxCustomDataFormat("DoodleLines"))
self.SetDataObject(self.data)
def OnEnter(self, x, y, d):
self.log.WriteText("OnEnter: %d, %d, %d\n" % (x, y, d))
return wxDragCopy
def OnLeave(self):
self.log.WriteText("OnLeave\n")
def OnDrop(self, x, y):
self.log.WriteText("OnDrop: %d %d\n" % (x, y))
return true
def OnData(self, x, y, d):
self.log.WriteText("OnData: %d, %d, %d\n" % (x, y, d))
if self.GetData():
linesdata = self.data.GetData()
lines = cPickle.loads(linesdata)
self.dv.SetLines(lines)
return d
#def OnDragOver(self, x, y, d):
# self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d))
# return wxDragCopy
class DoodleViewer(wxWindow):
def __init__(self, parent, log):
wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER)
self.log = log
self.SetBackgroundColour(wxWHITE)
self.lines = []
self.x = self.y = 0
dt = DoodleDropTarget(self, log)
self.SetDropTarget(dt)
def SetLines(self, lines):
self.lines = lines
self.Refresh()
def OnPaint(self, event):
dc = wxPaintDC(self)
self.DrawSavedLines(dc)
def DrawSavedLines(self, dc):
dc.BeginDrawing()
dc.SetPen(wxPen(wxRED, 3))
for line in self.lines:
for coords in line:
apply(dc.DrawLine, coords)
dc.EndDrawing()
#----------------------------------------------------------------------
class CustomDnDPanel(wxPanel):
def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1)
self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false))
sizer = wxBoxSizer(wxHORIZONTAL)
sizer.Add(wxStaticText(self, -1,
"Draw a little picture in this window\n"
"then Ctrl-Drag it to the lower \n"
"window or to another application\n"
"that accepts BMP's as a drop target."),
1, wxEXPAND|wxALL, 10)
insizer = wxBoxSizer(wxVERTICAL)
insizer.Add(DoodlePad(self, log), 1, wxEXPAND|wxALL, 5)
insizer.Add(DoodleViewer(self, log), 1, wxEXPAND|wxALL, 5)
sizer.Add(insizer, 1, wxEXPAND)
self.SetAutoLayout(true)
self.SetSizer(sizer)
#----------------------------------------------------------------------
#----------------------------------------------------------------------
class TestPanel(wxPanel):
def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1)
self.SetAutoLayout(true)
sizer = wxBoxSizer(wxVERTICAL)
text = wxStaticText(self, -1, "", style=wxALIGN_CENTRE)
text.SetFont(wxFont(24, wxSWISS, wxNORMAL, wxBOLD, false))
text.SetLabel("Custom Drag-And-Drop")
text.SetForegroundColour(wxBLUE)
sizer.Add(text, 0, wxEXPAND|wxALL, 5)
sizer.Add(wxStaticLine(self, -1), 0, wxEXPAND)
sizer.Add(CustomDnDPanel(self, log), 1, wxEXPAND)
self.SetSizer(sizer)
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """\
This demo shows Drand and Drop using a custom data type and a custom data object. A type called "DoodleLines" is created and a Python Pickle of a list is actually transfered in the drag and drop opperation.
A second data object is also created containing a bitmap of the image and is made available to any drop target that accepts bitmaps, such as MS Word.
The two data objects are combined in a wxDataObjectComposite and the rest is handled by the framework.
"""

View File

@@ -0,0 +1,193 @@
from wxPython.wx import *
#----------------------------------------------------------------------
class ClipTextPanel(wxPanel):
def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1)
self.log = log
self.do = wxTextDataObject()
#self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false))
sizer = wxBoxSizer(wxVERTICAL)
sizer.Add(wxStaticText(self, -1,
"Copy/Paste text to/from\n"
"this window and other apps"), 0, wxEXPAND|wxALL, 2)
self.text = wxTextCtrl(self, -1, "", style=wxTE_MULTILINE|wxHSCROLL)
sizer.Add(self.text, 1, wxEXPAND)
hsz = wxBoxSizer(wxHORIZONTAL)
hsz.Add(wxButton(self, 6050, " Copy "), 1, wxEXPAND|wxALL, 2)
hsz.Add(wxButton(self, 6051, " Paste "), 1, wxEXPAND|wxALL, 2)
sizer.Add(hsz, 0, wxEXPAND)
sizer.Add(wxButton(self, 6052, " Copy Bitmap "), 0, wxEXPAND|wxALL, 2)
EVT_BUTTON(self, 6050, self.OnCopy)
EVT_BUTTON(self, 6051, self.OnPaste)
EVT_BUTTON(self, 6052, self.OnCopyBitmap)
self.SetAutoLayout(true)
self.SetSizer(sizer)
def OnCopy(self, evt):
self.do.SetText(self.text.GetValue())
wxTheClipboard.Open()
wxTheClipboard.SetData(self.do)
wxTheClipboard.Close()
def OnPaste(self, evt):
wxTheClipboard.Open()
success = wxTheClipboard.GetData(self.do)
wxTheClipboard.Close()
if success:
self.text.SetValue(self.do.GetText())
else:
wxMessageBox("There is no data in the clipboard in the required format",
"Error")
def OnCopyBitmap(self, evt):
dlg = wxFileDialog(self, "Choose a bitmap to copy", wildcard="*.bmp")
if dlg.ShowModal() == wxID_OK:
bmp = wxBitmap(dlg.GetFilename(), wxBITMAP_TYPE_BMP)
bmpdo = wxBitmapDataObject(bmp)
wxTheClipboard.Open()
wxTheClipboard.SetData(bmpdo)
wxTheClipboard.Close()
wxMessageBox("The bitmap is now in the Clipboard. Switch to a graphics\n"
"editor and try pasting it in...")
dlg.Destroy()
#----------------------------------------------------------------------
class OtherDropTarget(wxPyDropTarget):
def __init__(self, window, log):
wxPyDropTarget.__init__(self)
self.log = log
self.do = wxFileDataObject()
self.SetDataObject(self.do)
def OnEnter(self, x, y, d):
self.log.WriteText("OnEnter: %d, %d, %d\n" % (x, y, d))
return wxDragCopy
#def OnDragOver(self, x, y, d):
# self.log.WriteText("OnDragOver: %d, %d, %d\n" % (x, y, d))
# return wxDragCopy
def OnLeave(self):
self.log.WriteText("OnLeave\n")
def OnDrop(self, x, y):
self.log.WriteText("OnDrop: %d %d\n" % (x, y))
return true
def OnData(self, x, y, d):
self.log.WriteText("OnData: %d, %d, %d\n" % (x, y, d))
self.GetData()
self.log.WriteText("%s\n" % self.do.GetFilenames())
return d
class MyFileDropTarget(wxFileDropTarget):
def __init__(self, window, log):
wxFileDropTarget.__init__(self)
self.window = window
self.log = log
def OnDropFiles(self, x, y, filenames):
self.window.SetInsertionPointEnd()
self.window.WriteText("\n%d file(s) dropped at %d,%d:\n" %
(len(filenames), x, y))
for file in filenames:
self.window.WriteText(file + '\n')
class FileDropPanel(wxPanel):
def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1)
#self.SetFont(wxFont(10, wxSWISS, wxNORMAL, wxBOLD, false))
sizer = wxBoxSizer(wxVERTICAL)
sizer.Add(wxStaticText(self, -1, " \nDrag some files here:"),
0, wxEXPAND|wxALL, 2)
self.text = wxTextCtrl(self, -1, "",
style = wxTE_MULTILINE|wxHSCROLL|wxTE_READONLY)
dt = MyFileDropTarget(self, log)
self.text.SetDropTarget(dt)
sizer.Add(self.text, 1, wxEXPAND)
self.SetAutoLayout(true)
self.SetSizer(sizer)
def WriteText(self, text):
self.text.WriteText(text)
def SetInsertionPointEnd(self):
self.text.SetInsertionPointEnd()
#----------------------------------------------------------------------
#----------------------------------------------------------------------
class TestPanel(wxPanel):
def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1)
self.SetAutoLayout(true)
outsideSizer = wxBoxSizer(wxVERTICAL)
text = wxStaticText(self, -1, "", style=wxALIGN_CENTRE)
text.SetFont(wxFont(24, wxSWISS, wxNORMAL, wxBOLD, false))
text.SetLabel("Clipboard / Drag-And-Drop")
text.SetForegroundColour(wxBLUE)
outsideSizer.Add(text, 0, wxEXPAND|wxALL, 5)
outsideSizer.Add(wxStaticLine(self, -1), 0, wxEXPAND)
inSizer = wxBoxSizer(wxHORIZONTAL)
inSizer.Add(ClipTextPanel(self, log), 1, wxEXPAND)
inSizer.Add(FileDropPanel(self, log), 1, wxEXPAND)
outsideSizer.Add(inSizer, 1, wxEXPAND)
self.SetSizer(outsideSizer)
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """\
This demo shows some examples of data transfer through clipboard or drag and drop. In wxWindows, these two ways to transfer data (either between different applications or inside one and the same) are very similar which allows to implement both of them using almost the same code - or, in other words, if you implement drag and drop support for your application, you get clipboard support for free and vice versa.
At the heart of both clipboard and drag and drop operations lies the wxDataObject class. The objects of this class (or, to be precise, classes derived from it) represent the data which is being carried by the mouse during drag and drop operation or copied to or pasted from the clipboard. wxDataObject is a "smart" piece of data because it knows which formats it supports (see GetFormatCount and GetAllFormats) and knows how to render itself in any of them (see GetDataHere). It can also receive its value from the outside in a format it supports if it implements the SetData method. Please see the documentation of this class for more details.
Both clipboard and drag and drop operations have two sides: the source and target, the data provider and the data receiver. These which may be in the same application and even the same window when, for example, you drag some text from one position to another in a word processor. Let us describe what each of them should do.
"""

View File

@@ -0,0 +1,56 @@
from wxPython.wx import *
#----------------------------------------------------------------------
class MyFontEnumerator(wxFontEnumerator):
def __init__(self, list):
wxFontEnumerator.__init__(self)
self.list = list
def OnFacename(self, face):
self.list.append(face)
return true
class TestPanel(wxPanel):
def __init__(self, parent, log):
wxPanel.__init__(self, parent, -1)
list = []
e = MyFontEnumerator(list)
e.EnumerateFacenames()
list.sort()
wxStaticText(self, -1, "Face names:", wxPoint(15, 50), wxSize(65, 18))
self.lb1 = wxListBox(self, 60, wxPoint(80, 50), wxSize(200, 250),
list, wxLB_SINGLE)
self.lb1.SetSelection(0)
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """\
wxFontEnumerator enumerates either all available fonts on the system or only the ones with given attributes - either only fixed-width (suited for use in programs such as terminal emulators and the like) or the fonts available in the given encoding.
"""

View File

@@ -23,7 +23,7 @@ _useNestedSplitter = true
_treeList = [
('Managed Windows', ['wxFrame', 'wxDialog', 'wxMiniFrame']),
('Miscellaneous Windows', ['wxGrid', 'wxSashWindow',
('Non-Managed Windows', ['wxGrid', 'wxSashWindow',
'wxScrolledWindow', 'wxSplitterWindow',
'wxStatusBar', 'wxToolBar', 'wxNotebook',
'wxHtmlWindow']),
@@ -40,8 +40,9 @@ _treeList = [
('Window Layout', ['wxLayoutConstraints', 'Sizers', 'OldSizers']),
('Miscellaneous', ['wxTimer', 'wxValidator', 'wxGLCanvas', 'DialogUnits',
'wxImage', 'PrintFramework', 'wxOGL']),
('Miscellaneous', [ 'DragAndDrop', 'CustomDragAndDrop', 'FontEnumerator',
'wxTimer', 'wxValidator', 'wxGLCanvas', 'DialogUnits',
'wxImage', 'PrintFramework', 'wxOGL']),
('wxPython Library', ['OldSizers', 'Layoutf', 'wxScrolledMessageDialog',
'wxMultipleChoiceDialog', 'wxPlotCanvas', 'wxFloatBar',

View File

@@ -17,7 +17,8 @@ class TestPanel(wxPanel):
self.text = wxTextCtrl(self, -1, "1", wxPoint(30, 50), wxSize(60, -1))
h = self.text.GetSize().height
self.spin = wxSpinButton(self, 20, wxPoint(92, 50), wxSize(h*2, h))
self.spin = wxSpinButton(self, 20, wxPoint(92, 50), wxSize(h, h),
wxSP_VERTICAL)
self.spin.SetRange(1, 100)
self.spin.SetValue(1)

View File

@@ -13,11 +13,12 @@ class TestTreeCtrlPanel(wxPanel):
tID = NewId()
self.tree = wxTreeCtrl(self, tID, wxDefaultPosition, wxDefaultSize,
wxTR_HAS_BUTTONS | wxTR_EDIT_LABELS) #| wxTR_MULTIPLE)
wxTR_HAS_BUTTONS | wxTR_EDIT_LABELS)# | wxTR_MULTIPLE)
self.root = self.tree.AddRoot("The Root Item")
for x in range(15):
child = self.tree.AppendItem(self.root, "Item %d" % x)
#self.tree.SelectItem(child)
for y in range(5):
last = self.tree.AppendItem(child, "item %d-%s" % (x, chr(ord("a")+y)))
for z in range(5):
@@ -35,14 +36,14 @@ class TestTreeCtrlPanel(wxPanel):
EVT_RIGHT_UP(self.tree, self.OnRightUp)
def OnRightClick(self, event):
(x,y) = event.Position();
item = self.tree.HitTest(wxPoint(x,y))
pt = event.GetPosition();
item = self.tree.HitTest(pt)
self.log.WriteText("OnRightClick: %s\n" % self.tree.GetItemText(item))
self.tree.SelectItem(item)
def OnRightUp(self, event):
(x,y) = event.Position();
item = self.tree.HitTest(wxPoint(x,y))
pt = event.GetPosition();
item = self.tree.HitTest(pt)
self.log.WriteText("OnRightUp: %s (manually starting label edit)\n"
% self.tree.GetItemText(item))
self.tree.EditLabel(item)
@@ -69,8 +70,8 @@ class TestTreeCtrlPanel(wxPanel):
def OnLeftDClick(self, event):
(x,y) = event.Position();
item = self.tree.HitTest(wxPoint(x,y))
pt = event.GetPosition();
item = self.tree.HitTest(pt)
self.log.WriteText("OnLeftDClick: %s\n" % self.tree.GetItemText(item))