Added the wx.HVScrolledWindow class.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37632 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
f3a69d1df1
commit
4424b2a116
@ -98,6 +98,8 @@ classes affected by this are:
|
|||||||
Added the wx.DC.GradientFillConcentric and wx.DC.GradientFillLinear
|
Added the wx.DC.GradientFillConcentric and wx.DC.GradientFillLinear
|
||||||
methods.
|
methods.
|
||||||
|
|
||||||
|
Added the wx.HVScrolledWindow class.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -208,8 +208,268 @@ public:
|
|||||||
// is kept for backwards compatibility
|
// is kept for backwards compatibility
|
||||||
size_t GetLastVisibleLine() const;
|
size_t GetLastVisibleLine() const;
|
||||||
|
|
||||||
|
// find the index of the line we need to show at the top of the window such
|
||||||
|
// that the last (fully or partially) visible line is the given one
|
||||||
|
size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false);
|
||||||
|
|
||||||
|
// get the total height of the lines between lineMin (inclusive) and
|
||||||
|
// lineMax (exclusive)
|
||||||
|
wxCoord GetLinesHeight(size_t lineMin, size_t lineMax) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
%newgroup;
|
||||||
|
|
||||||
|
// wxHVScrolledWindow
|
||||||
|
|
||||||
|
// First, the C++ version
|
||||||
|
%{
|
||||||
|
class wxPyHVScrolledWindow : public wxHVScrolledWindow
|
||||||
|
{
|
||||||
|
DECLARE_ABSTRACT_CLASS(wxPyHVScrolledWindow)
|
||||||
|
public:
|
||||||
|
wxPyHVScrolledWindow() : wxHVScrolledWindow() {}
|
||||||
|
wxPyHVScrolledWindow(wxWindow *parent,
|
||||||
|
wxWindowID id = wxID_ANY,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
const wxString& name = wxPyPanelNameStr)
|
||||||
|
: wxHVScrolledWindow(parent, id, pos, size, style, name) {}
|
||||||
|
|
||||||
|
// Overridable virtuals
|
||||||
|
|
||||||
|
// these functions must be overridden in the derived class and they should
|
||||||
|
// return the width or height of the given line in pixels
|
||||||
|
DEC_PYCALLBACK_COORD_SIZET_constpure(OnGetRowHeight);
|
||||||
|
DEC_PYCALLBACK_COORD_SIZET_constpure(OnGetColumnWidth);
|
||||||
|
|
||||||
|
// the following functions don't need to be overridden but it may be useful
|
||||||
|
// to do if calculating the lines widths or heights is a relatively
|
||||||
|
// expensive operation as it gives the user code a possibility to calculate
|
||||||
|
// several of them at once
|
||||||
|
//
|
||||||
|
// OnGetRowsHeightHint() and OnGetColumnsWidthHint() are normally called
|
||||||
|
// just before OnGetRowHeight() and OnGetColumnWidth(), respectively, but
|
||||||
|
// you shouldn't rely on the latter methods being called for all lines in
|
||||||
|
// the interval specified here. It is also possible that OnGetRowHeight()
|
||||||
|
// or OnGetColumnWidth() will be called for the lines outside of this
|
||||||
|
// interval, so this is really just a hint, not a promise.
|
||||||
|
//
|
||||||
|
// finally note that min is inclusive, while max is exclusive, as usual
|
||||||
|
DEC_PYCALLBACK_VOID_SIZETSIZET_const(OnGetRowsHeightHint);
|
||||||
|
DEC_PYCALLBACK_VOID_SIZETSIZET_const(OnGetColumnsWidthHint);
|
||||||
|
|
||||||
|
// when the number of lines changes, we try to estimate the total width or
|
||||||
|
// height of all lines which is a rather expensive operation in terms of
|
||||||
|
// lines access, so if the user code may estimate the average height
|
||||||
|
// better/faster than we do, it should override this function to implement
|
||||||
|
// its own logic
|
||||||
|
//
|
||||||
|
// this function should return the best guess for the total height it may
|
||||||
|
// make
|
||||||
|
DEC_PYCALLBACK_COORD_const(EstimateTotalHeight);
|
||||||
|
DEC_PYCALLBACK_COORD_const(EstimateTotalWidth);
|
||||||
|
|
||||||
|
|
||||||
|
// Also expose some other interesting protected methods
|
||||||
|
|
||||||
|
// find the index of the horizontal line we need to show at the top of the
|
||||||
|
// window such that the last (fully or partially) visible line is the given
|
||||||
|
// one
|
||||||
|
size_t FindFirstFromRight(size_t columnLast, bool fullyVisible = false)
|
||||||
|
{ return wxHVScrolledWindow::FindFirstFromRight(columnLast, fullyVisible); }
|
||||||
|
|
||||||
|
// find the index of the vertical line we need to show at the top of the
|
||||||
|
// window such that the last (fully or partially) visible line is the given
|
||||||
|
// one
|
||||||
|
size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false)
|
||||||
|
{ return wxHVScrolledWindow::FindFirstFromBottom(lineLast, fullyVisible); }
|
||||||
|
|
||||||
|
|
||||||
|
// get the total width or height of the lines between lineMin (inclusive)
|
||||||
|
// and lineMax (exclusive)
|
||||||
|
wxCoord GetRowsHeight(size_t lineMin, size_t lineMax) const
|
||||||
|
{ return wxHVScrolledWindow::GetRowsHeight(lineMin, lineMax); }
|
||||||
|
wxCoord GetColumnsWidth(size_t columnMin, size_t columnMax) const
|
||||||
|
{ return wxHVScrolledWindow::GetColumnsWidth(columnMin, columnMax); }
|
||||||
|
|
||||||
|
PYPRIVATE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
IMPLEMENT_ABSTRACT_CLASS(wxPyHVScrolledWindow, wxHVScrolledWindow);
|
||||||
|
|
||||||
|
IMP_PYCALLBACK_COORD_SIZET_constpure(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetRowHeight);
|
||||||
|
IMP_PYCALLBACK_COORD_SIZET_constpure(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetColumnWidth);
|
||||||
|
IMP_PYCALLBACK_VOID_SIZETSIZET_const(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetRowsHeightHint);
|
||||||
|
IMP_PYCALLBACK_VOID_SIZETSIZET_const(wxPyHVScrolledWindow, wxHVScrolledWindow, OnGetColumnsWidthHint);
|
||||||
|
IMP_PYCALLBACK_COORD_const (wxPyHVScrolledWindow, wxHVScrolledWindow, EstimateTotalHeight);
|
||||||
|
IMP_PYCALLBACK_COORD_const (wxPyHVScrolledWindow, wxHVScrolledWindow, EstimateTotalWidth);
|
||||||
|
%}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Now define this class for SWIG
|
||||||
|
|
||||||
|
/*
|
||||||
|
This class is strongly influenced by wxVScrolledWindow. In fact, much of
|
||||||
|
code is line for line the same except it EXPLICITLY states which axis is
|
||||||
|
being worked on. Like wxVScrolledWindow, this class is here to provide
|
||||||
|
an easy way to implement variable line sizes. The difference is that
|
||||||
|
wxVScrolledWindow only works with vertical scrolling. This class extends
|
||||||
|
the behavior of wxVScrolledWindow to the horizontal axis in addition to the
|
||||||
|
vertical axis.
|
||||||
|
|
||||||
|
The scrolling is also "virtual" in the sense that line widths and heights
|
||||||
|
only need to be known for lines that are currently visible.
|
||||||
|
|
||||||
|
Like wxVScrolledWindow, this is a generalization of the wxScrolledWindow
|
||||||
|
class which can be only used when all horizontal lines have the same width
|
||||||
|
and all of the vertical lines have the same height. Like wxVScrolledWinow
|
||||||
|
it lacks some of wxScrolledWindow features such as scrolling another window
|
||||||
|
or only scrolling a rectangle of the window and not its entire client area.
|
||||||
|
|
||||||
|
If only vertical scrolling is needed, wxVScrolledWindow is recommended
|
||||||
|
because it is simpler to use (and you get to type less).
|
||||||
|
|
||||||
|
There is no wxHScrolledWindow but horizontal only scrolling is implemented
|
||||||
|
easily enough with this class. If someone feels the need for such a class,
|
||||||
|
implementing it is trivial.
|
||||||
|
*/
|
||||||
|
MustHaveApp(wxPyHVScrolledWindow);
|
||||||
|
|
||||||
|
%rename(HVScrolledWindow) wxPyHVScrolledWindow;
|
||||||
|
class wxPyHVScrolledWindow : public wxPanel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
%pythonAppend wxPyHVScrolledWindow "self._setOORInfo(self); self._setCallbackInfo(self, VScrolledWindow)"
|
||||||
|
%pythonAppend wxPyHVScrolledWindow() ""
|
||||||
|
|
||||||
|
// normal ctor, no need to call Create() after this one
|
||||||
|
//
|
||||||
|
// note that wxVSCROLL and wxHSCROLL are always automatically added to our
|
||||||
|
// style, there is no need to specify them explicitly
|
||||||
|
wxPyHVScrolledWindow(wxWindow *parent,
|
||||||
|
wxWindowID id = wxID_ANY,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
const wxString& name = wxPyPanelNameStr);
|
||||||
|
|
||||||
|
%RenameCtor(PreHVScrolledWindow, wxPyHVScrolledWindow());
|
||||||
|
void _setCallbackInfo(PyObject* self, PyObject* _class);
|
||||||
|
|
||||||
|
|
||||||
|
bool Create(wxWindow *parent,
|
||||||
|
wxWindowID id = wxID_ANY,
|
||||||
|
const wxPoint& pos = wxDefaultPosition,
|
||||||
|
const wxSize& size = wxDefaultSize,
|
||||||
|
long style = 0,
|
||||||
|
const wxString& name = wxPyPanelNameStr);
|
||||||
|
|
||||||
|
|
||||||
|
// operations
|
||||||
|
// ----------
|
||||||
|
|
||||||
|
// set the number of lines the window contains for each axis: the derived
|
||||||
|
// class must provide the widths and heights for all lines with indices up
|
||||||
|
// to each of the one given here in its OnGetColumnWidth() and
|
||||||
|
// OnGetRowHeight()
|
||||||
|
void SetRowColumnCounts(size_t rowCount, size_t columnCount);
|
||||||
|
|
||||||
|
// with physical scrolling on, the device origin is changed properly when
|
||||||
|
// a wxPaintDC is prepared, children are actually moved and layed out
|
||||||
|
// properly, and the contents of the window (pixels) are actually moved
|
||||||
|
void EnablePhysicalScrolling(bool scrolling = true);
|
||||||
|
|
||||||
|
// scroll to the specified line: it will become the first visible line in
|
||||||
|
// the window
|
||||||
|
//
|
||||||
|
// return true if we scrolled the window, false if nothing was done
|
||||||
|
bool ScrollToRow(size_t row);
|
||||||
|
bool ScrollToColumn(size_t column);
|
||||||
|
bool ScrollToRowColumn(size_t row, size_t column);
|
||||||
|
|
||||||
|
// scroll by the specified number of lines/pages
|
||||||
|
virtual bool ScrollRows(int rows);
|
||||||
|
virtual bool ScrollColumns(int columns);
|
||||||
|
virtual bool ScrollRowsColumns(int rows, int columns);
|
||||||
|
virtual bool ScrollRowPages(int pages);
|
||||||
|
virtual bool ScrollColumnPages(int pages);
|
||||||
|
virtual bool ScrollPages(int rowPages, int columnPages);
|
||||||
|
|
||||||
|
// redraw the specified line
|
||||||
|
virtual void RefreshRow(size_t line);
|
||||||
|
virtual void RefreshColumn(size_t line);
|
||||||
|
virtual void RefreshRowColumn(size_t row, size_t column);
|
||||||
|
|
||||||
|
// redraw all lines in the specified range (inclusive)
|
||||||
|
virtual void RefreshRows(size_t from, size_t to);
|
||||||
|
virtual void RefreshColumns(size_t from, size_t to);
|
||||||
|
virtual void RefreshRowsColumns(size_t fromRow, size_t toRow,
|
||||||
|
size_t fromColumn, size_t toColumn);
|
||||||
|
|
||||||
|
// return the horizontal and vertical line within a wxPoint at the
|
||||||
|
// specified (in physical coordinates) position or.
|
||||||
|
|
||||||
|
// wxNOT_FOUND in either or both axes if no line is present at the
|
||||||
|
// requested coordinates, i.e. if it is past the last lines
|
||||||
|
%Rename(HitTestXY, wxPoint, HitTest(wxCoord x, wxCoord y) const);
|
||||||
|
wxPoint HitTest(const wxPoint& pt) const;
|
||||||
|
|
||||||
|
// recalculate all our parameters and redisplay all lines
|
||||||
|
virtual void RefreshAll();
|
||||||
|
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
// ---------
|
||||||
|
|
||||||
|
// get the number of lines this window contains (previously set by
|
||||||
|
// SetLineCount())
|
||||||
|
size_t GetRowCount() const;
|
||||||
|
size_t GetColumnCount() const;
|
||||||
|
wxSize GetRowColumnCounts() const;
|
||||||
|
|
||||||
|
// get the first currently visible line/lines
|
||||||
|
size_t GetVisibleRowsBegin() const;
|
||||||
|
size_t GetVisibleColumnsBegin() const;
|
||||||
|
wxPoint GetVisibleBegin() const;
|
||||||
|
|
||||||
|
// get the last currently visible line/lines
|
||||||
|
size_t GetVisibleRowsEnd() const;
|
||||||
|
size_t GetVisibleColumnsEnd() const;
|
||||||
|
wxPoint GetVisibleEnd() const;
|
||||||
|
|
||||||
|
// is this line currently visible?
|
||||||
|
bool IsRowVisible(size_t row) const;
|
||||||
|
bool IsColumnVisible(size_t column) const;
|
||||||
|
bool IsVisible(size_t row, size_t column) const;
|
||||||
|
|
||||||
|
|
||||||
|
// find the index of the horizontal line we need to show at the top of the
|
||||||
|
// window such that the last (fully or partially) visible line is the given
|
||||||
|
// one
|
||||||
|
size_t FindFirstFromRight(size_t columnLast, bool fullyVisible = false);
|
||||||
|
|
||||||
|
// find the index of the vertical line we need to show at the top of the
|
||||||
|
// window such that the last (fully or partially) visible line is the given
|
||||||
|
// one
|
||||||
|
size_t FindFirstFromBottom(size_t lineLast, bool fullyVisible = false);
|
||||||
|
|
||||||
|
|
||||||
|
// get the total width or height of the lines between lineMin (inclusive)
|
||||||
|
// and lineMax (exclusive)
|
||||||
|
wxCoord GetRowsHeight(size_t lineMin, size_t lineMax) const;
|
||||||
|
wxCoord GetColumnsWidth(size_t columnMin, size_t columnMax) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
// wxVListBox
|
// wxVListBox
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user