Commit Graph

40766 Commits

Author SHA1 Message Date
Dimitri Schoolwerth
ebf1141db2 Improve text extent rounding in wxGCDCImpl::DoGetTextExtent()
Change wxGCDCImpl::DoGetTextExtent() from rounding to the nearest
integer to rounding up: if e.g. height is 15.3 then 16 pixels should be
used for height, and not 15. Rounding was previously improved from
casting (which appears to be the initial code) in 0417955ddb (adding
correct filling area to arc, correct rounding and clipping, 2007-10-21).

Issues with nearest rounding became more visible after off-by-one fixes
for wxDC::DrawLabel() with wxALIGN_RIGHT and wxALIGN_BOTTOM positioning.
When using e.g. wxALIGN_RIGHT with a width of 72.4 the text could now be
drawn beyond the extent on the right because the text is not offset by
one to the left any longer.
2021-08-08 20:21:31 +02:00
Dimitri Schoolwerth
9dd88e0159 Undo removal of text alignment for wxDataViewCtrl's RenderText()
Revert e2e7d3d391 (Fix wxELLIPSIZE_END with wxALIGN_RIGHT in wxMSW
wxDataViewCtrl, 2016-03-18). This fix is no longer needed after
the previous commit reverted b642747fd2.

Reverting also allows for text to be drawn vertically aligned again
instead of always using top-left alignment. While the difference in
appearance by not having alignment can be minor with default row
heights, it becomes more noticeable with taller rows:
a wxDataViewCheckIconText column with a tall icon will have its text
stuck to the top of a row while other columns have their text vertically
centered. This already occurs by default when not explicitly specifying
an alignment (wxDVR_DEFAULT_ALIGNMENT) which results in
wxALIGN_CENTRE_VERTICAL being used for row alignment when rendering.
2021-08-08 20:21:31 +02:00
Dimitri Schoolwerth
7a8b210dff Undo mimicking faulty wxDC::DrawLabel() wxALIGN_RIGHT positioning
Revert b642747fd2 (Fix right aligned text position in wxDVC on MSW with
system theme, 2015-09-30) which in wxRendererXP::DrawItemText() mimicks
the off-by-one with right alignment of wxDC::DrawLabel() that got fixed
by the previous commit.

There's not a similar change copying wxDC::DrawLabel()'s former
off-by-one behaviour with wxALIGN_BOTTOM that would need reverting.

Both alignments now result in the same text positioning with both
drawing functions.
2021-08-08 20:21:31 +02:00
Dimitri Schoolwerth
d83d126959 Fix off-by-ones with bottom and right aligned positioning
wxDC::DrawLabel() positions the text one to the left with wxALIGN_RIGHT
alignment and one up with wxALIGN_BOTTOM alignment. The same occurs in
wxControlRenderer::DrawBitmap() for bitmaps. Both off-by-ones exist
since inception in respectively 4d3c4c2f94 and bc60c3d699.

This fix vertically aligns wxALIGN_BOTTOM drawing of wxDC::DrawLabel()
with themed text drawing through wxRendererXP::DrawItemText().
2021-08-08 20:21:31 +02:00
Dimitri Schoolwerth
b8af267bf9 Fix centered vertical and bottom aligned themed text drawing
When using non-TOP vertical alignment with wxRendererXP::DrawItemText()
either DT_VCENTER or DT_BOTTOM gets passed to DrawThemeTextEx() but
without the DT_SINGLELINE flag which is required for those alignment
flags to take effect, resulting in text always being top aligned.

Fix by passing DT_SINGLELINE when using either alignment, but only for
single lines as multi-lines are rendered as a single line with invisible
newline character. Draw multi-line text using top alignment and deal
with vertical alignment ourselves, using GetThemeTextExtent() to get
an accurate extent of the text.
2021-08-08 20:21:31 +02:00
Dimitri Schoolwerth
1eb7150309 Correct slightly misleading comment
Comment in wxRendererXP::DrawItemText() could be interpreted as
DrawThemeTextEx() being available for some XP editions but it is Vista+
only, so correct it.
2021-08-08 20:21:31 +02:00
Dimitri Schoolwerth
771ebfa9a9 Add wxDataViewCtrl debug option to display render bounds
For debugging convenience define DEBUG_RENDER_EXTENTS to draw a red
rectangle around a custom rendered cell's full rectangle, and a green
rect for the extent of the item appearing inside it. Custom renderers
ordinarily should not draw outside of the green rect. A notable
exception is drawn text, particularly multi-line ones.
2021-08-08 20:21:30 +02:00
Vadim Zeitlin
b9261597bf Merge branch 'msw-combo-keys'
Fix behaviour of comboboxes in presence of accelerators in wxMSW.

See https://github.com/wxWidgets/wxWidgets/pull/2443
2021-08-06 20:29:20 +01:00
Vadim Zeitlin
1e37f6e5ff Provide information in wxListEvent for generic virtual wxListCtrl
This wasn't done since the changes of c1c4c5516c (fixed unwanted owner
data accesses in virtual list ctrl, 2001-08-07), but there doesn't seem
to be any reason to avoid accessing the item in SendNotify() (any more?)
and if we ever did generate events for all the items in a virtual list
control, this would be already a problem, even if we didn't access the
line info from here.

So just revert the check for !IsVirtual() and always fill the item in
the generated event to make the behaviour of the generic version
consistent with the MSW one and slightly more useful.

See https://github.com/wxWidgets/wxWidgets/pull/2456

Closes #19235.
2021-08-06 21:28:24 +02:00
Vadim Zeitlin
c7ed88af7c Move comment in wxOSX wxToolBar code to a more logical place
No real changes, just move the comment in front of the line it
documents.
2021-08-06 21:22:08 +02:00
Vadim Zeitlin
ce48d01e8a Fix missing item labels in wxToolBar overflow menu under macOS
Always set the label, even when not using wxTB_TEXT style, as otherwise
the items shown in the native "overflow" menu use empty strings as
labels and so can't be distinguished at all.

This undoes part of the changes of 1f7cd4807f (Don't show labels for
toolbars showing icons only in wxOSX, 2016-02-23), but they don't seem
necessary any longer, i.e. calling SetToolShortHelp() doesn't show the
toolbar label when using non-native toolbars, so #16669 remains fixed.

Closes #19226.
2021-08-06 21:17:51 +02:00
Vadim Zeitlin
d8fe06891e Avoid bool argument in wxListMainWindow::RecalculatePositions()
Use 2 separate functions instead to make the code more clear, as passing
false for indicate the refresh shouldn't be done was quite confusing.

Also get rid of a separate RefreshAll() which was called only from
RecalculatePositions().

No real changes.
2021-08-06 21:09:29 +02:00
Vadim Zeitlin
36e9576d42 Fix not refreshing wxListCtrl properly under macOS
Refresh() called from inside wxEVT_PAINT handler doesn't seem to have
any effect, so use CallAfter() to call it slightly later instead.

Closes #19139.
2021-08-06 21:05:49 +02:00
David Connet
233c487dfd Fix direction of mouse wheel zoom in print preview
Make zooming work the same as in all the other programs rather than
zooming in/out in the reverse direction.

Closes #19215.
2021-08-06 19:34:19 +02:00
Vadim Zeitlin
09cbec0373 Allow calling wxListCtrl::SetImageList() before Create() in wxMSW
This already worked with the generic version, but silently failed with
wxMSW, so make it work with wxMSW too as it doesn't cost much and makes
wxListCtrl behave in the same way under all platforms.

Also document that SetImageList() can be used before the window is
created.
2021-08-04 21:09:04 +01:00
Vadim Zeitlin
232a3ab577 Allocate more space for the wxRegEx error message buffer
We need to account for the trailing NUL explicitly here, so add 1 to the
length returned by the first call to wx_regerror() to avoid chopping off
the last character of the error message.
2021-08-04 01:29:44 +02:00
Vadim Zeitlin
a4d06b6c88 Explicitly include wx/scopedptr.h when using wxScopedPtr
Don't rely on it being implicitly included from other headers.
2021-08-01 00:43:31 +01:00
Dimitri Schoolwerth
a4cdbdb779 Fix disappearing wxDVC cell items if cell background is set
With both GTK 2 and 3 if a wxDVC cell has a background colour attribute
set then wxDataViewCustomRenderer::RenderText() sets the cell's
background property. With wxDataViewCheckIconText this results in items
drawn prior to the text to be painted over.

Reproducible using the dataview sample which on the MyListModel page
uses a background cell colour for the first column of odd-indexed rows.

Fix by drawing the text first, followed by the checkbox and possible
icon as before. There appear to be no other custom renderers in wx which
draw multiple items and may have needed fixing as well.

This commit is best viewed with git --color-moved option.

Closes https://github.com/wxWidgets/wxWidgets/pull/2449
2021-07-30 00:50:55 +02:00
Vadim Zeitlin
62c776c17c Merge branch 'regex-pcre'
Implement wxRegEx using PCRE2.

See https://github.com/wxWidgets/wxWidgets/pull/2438
2021-07-27 17:47:31 +02:00
Artur Wieczorek
ea04c72754 Revert "Store clipping box coordinates in device units in wxWindowDCImpl, wxGTKDCImpl"
This reverts commit 95f1b262a4 ("Store clipping box coordinates in
device units in wxWindowDCImpl, wxGTKDCImpl", 2021-07-26) because
device coordinates can be used to determine final clipping box
coordinates more accurately only if current logical coordinates
are not stored directly in the corresponding variables of the base
class wxDCImpl.
2021-07-27 17:25:30 +02:00
Artur Wieczorek
eb055dba71 Store clipping box in device units only if it's set with wxDCImpl::DoSetClippingRegion
If derived class sets clipping region in a legitimate way by call to
DoSetClippingRegion() instead of directly storing logical coordinates
of the box in the internal variables we can store coordinates in
device units to determine final logical coordinates more reliably even
in case when coordinate transformations were applied to DC
in the meantime.
2021-07-27 17:14:50 +02:00
Artur Wieczorek
95f1b262a4 Store clipping box coordinates in device units in wxWindowDCImpl, wxGTKDCImpl
Because retrieving clipping box coordinates in DoGetClippingRect() is
delegated to wxDCImpl::DoGetClippingRect() we need to store coordinates
in device units because such units are used internally in wxDCImpl
(2bcc9382a7 ("Store clipping box coordinates in device units for generic
wxDC", 2021-07-26).
Stored device units are converted to the current logical units
in wxDCImpl::DoGetClippingRect().
2021-07-26 23:43:17 +02:00
Artur Wieczorek
2bcc9382a7 Store clipping box coordinates in device units for generic wxDC
Clipping box coordinates should be stored internally in device units
to be independent on changes of logical coordinates made between calls
to wxDCImpl::DoSetClippingRegion().
These stored coordinates should be converted on demand to the current
logical units on call to wxDCImpl::DoGetClippingRect().
2021-07-26 21:04:21 +02:00
Artur Wieczorek
30a4090ac9 Fix determining DC area for wxDC with applied affine transformation
We need to take into account all aplied transformations (including affine
transformation set with SetTransformMatrix()) while calculating entire
DC area in logical coordinaates.
For derived wxDC's that support affine transformations
DeviceToLogical[Rel]() functions are overriden with
platform-specific implementations taking into account all applied
transformations (see documentation of wxDC::DeviceToLogical(),
wxDC::DeviceToLogicalRel()) and they may be not equivalent to
DeviceToLogical[Rel]{X|Y}().
2021-07-26 20:39:40 +02:00
Artur Wieczorek
74833ac435 Fix SetDeviceClippingRegion for wxSVGFileDC
Device-based coordinates should be converted to logical coordinates
before they are passed to SetClippingRegion().
2021-07-26 20:33:40 +02:00
Artur Wieczorek
b1206a6d50 Fix inserting new SVG <g> element
New <g> container element should be created every time
the actual transformation is changed and that's why
the flag should be set in ComputeScaleAndOrigin().
2021-07-26 20:30:57 +02:00
Artur Wieczorek
4193077888 Normalize clipping box in wxSVGFileDC::DoSetClippingRegion
Clipping box parameters should be in the canonical form
with (x,y) pointing to the top-left corner of the box and with
width/height >= 0 because SVG doesn't accept negative values
of width/height and because this form in expected in wxDCImpl.
2021-07-26 20:08:49 +02:00
Vadim Zeitlin
cf91a8d9a2 Merge branch 'border-size-functions'
Replace DoGetBorderSize() with GetWindowBorderSize() to avoid having 2
different functions doing (almost) the same thing.

See https://github.com/wxWidgets/wxWidgets/pull/2445
2021-07-26 13:59:41 +02:00
PB
3a0bb1b18c Fix setting focus to wxWebViewEdge
It was impossible to give focus to the actual web view in wxWebViewEdge
by keyboard navigation or programmatically with wxWebViewEdge::SetFocus().

Fix it by calling CoreWebView2Controller::MoveFocus() in the wxWebViewEdge's
wxEVT_SET_FOCUS handler.

Closes https://github.com/wxWidgets/wxWidgets/pull/2444
2021-07-26 13:57:10 +02:00
Vadim Zeitlin
27d0e7804c Replace DoGetBorderSize() with GetWindowBorderSize()
We accidentally ended up with two functions doing the same thing, since
DoGetBorderSize() was added in 743b426605 (Added DoGetClientBestSize()
and use it for a couple of controls in wxMSW., 2009-06-22), as we
already had GetWindowBorderSize() added even earlier in 333d70525c
(added wxWindow::GetWindowBorderSize(), 2006-11-25), so remove the
redundant non-public function and use GetWindowBorderSize() everywhere.

This does change the behaviour of GetWindowBorderSize() in wxMSW, wxGTK
and wxUniv, as it now does what DoGetBorderSize() used to do, but this
should be an improvement, as DoGetBorderSize() implementation was more
precise.
2021-07-24 21:18:45 +02:00
Vadim Zeitlin
3415325f4f Add wxRegEx::GetLibraryVersionInfo()
This allows to check the version of PCRE used.
2021-07-24 19:17:59 +02:00
Vadim Zeitlin
3d8438619d Use PCRE as built-in regex library
Replace the use of Henry Spencer's regex library with PCRE at the build
level and enable wxUSE_PCRE in wxRegEx code to switch to PCRE-based
implementation there.

Note that this has to be done unconditionally because there is no simple
way to select between the previously used regex library and PCRE at the
makefiles level.

We could still keep the possibility to use the system regex library
under Unix, but this doesn't seem to be worth doing, as we don't support
Unicode REs properly when using it (and never did), so drop support for
this too.
2021-07-24 19:17:59 +02:00
Vadim Zeitlin
7b3659ea19 Check for WXREGEX_USING_BUILTIN rather than WX_NO_REGEX_ADVANCED
No real changes, just get rid of checks for WX_NO_REGEX_ADVANCED which
is rather confusing as it's not defined neither when using the system
library (which doesn't support advanced RE syntax at all), nor when
using PCRE (which always supports it).
2021-07-24 19:17:58 +02:00
Vadim Zeitlin
fa59d5700a Implement wxRegEx using PCRE
Adjust the tests and document the incompatibilities with the previously
used regex syntax.

In this commit the use of PCRE is conditional on wxUSE_PCRE which is
never defined as 1 yet, so the new code is still disabled.
2021-07-24 19:17:58 +02:00
Vadim Zeitlin
912f4b76ac Fix wxGTK build after WXSetInitialFittingClientSize() change
This should have been part of 136574b1e0 (Make wxSizer::SetSizeHints()
work again, 2021-07-24).

See #19170.
2021-07-24 19:15:55 +02:00
Vadim Zeitlin
136574b1e0 Make wxSizer::SetSizeHints() work again
This function was broken when it was called for a window which was not
the window the sizer was associated with since the recent (pre-3.1.5)
changes trying to work around the problem with the initial windows size
when using GTK 3, see 9c0a8be1dc (Merge branch 'gtk-initial-size',
2021-04-13).

Fix it by passing the sizer to use for calculating the size explicitly
to WXSetInitialFittingClientSize() when we have it, and only falling
back on the window's own sizer if we don't.

Closes #19170.
2021-07-24 17:21:39 +01:00
Vadim Zeitlin
b30a93465a Don't allow accelerators intercept F4 in the MSW comboboxes
This key is used to open the dropdown and should still work even if
there is an accelerator using it too.
2021-07-24 12:43:17 +01:00
Vadim Zeitlin
47a5f42b78 Don't intercept key with modifiers in wxChoice
Check that we're dealing with plain keys, don't override accelerators
using {Alt,Ctrl,Shift}-Return, for example.
2021-07-24 12:43:17 +01:00
Vadim Zeitlin
61ff7de997 Slightly simplify wxChoice::MSWShouldPreProcessMessage()
No real changes, just make this version more consistent with the one in
wxTextCtrl and avoid unnecessary casts.
2021-07-24 12:43:17 +01:00
Vadim Zeitlin
8004002e5e Fix handling keys also used as accelerators in wxMSW wxComboBox
wxComboBox::MSWShouldPreProcessMessage() didn't take into account many
keys that must be handled in wxComboBox even if they're used as
accelerators, including plain (i.e. without Ctrl modifier) Delete, Home
and End that are used by the embedded text control, if there is one.

Fix this by reusing wxTextCtrl::MSWShouldPreProcessMessage() which
already handled these keys correctly, by moving it to wxTextEntry, which
can be used from both classes.

Also add a check for wxCB_READONLY to prevent overriding the
accelerators using the keys that the combobox doesn't need when there is
no text control in it.

Closes #19227.
2021-07-24 12:41:49 +01:00
Artur Wieczorek
bf2771d6d7 Check if stack of graphics states is empty while attempting to reset the clip
For macOS < 10.13 there is not available any method to really reset
the clipping region so ResetClip() is implemented using hack that
works for sure only if no graphics state was stored before on the stack
with PushState(). If ResetClip() is called when some graphics states
are already stored with PushState() we can only warn that resetting the clip
may be not effective.

See #19231.
2021-07-23 18:38:55 +02:00
Artur Wieczorek
7349f138e7 Keep track of graphics state stack depth
To avoid restoring graphics state from the empty stack. This
could also help in diagnosing potential problems with unbalanced
PushState()/PopState() calls.
2021-07-23 18:10:59 +02:00
Artur Wieczorek
7ce588afab Don't use wxDC to get clipping box in wxGCDC
We shouldn't call wxDCImpl::DoGetClippingRect() from
wxGCDCImpl::DoGetClippingRect() because it wouldn't return the correct
result if there is an affine transformation applied to this DC,
as wxDCImpl is not aware of such transformations.
2021-07-20 23:10:26 +02:00
Artur Wieczorek
9e5c3a1152 Fix destroying clipping region for wxGCDC with applied affine transformation
We need to take into account all aplied transformations (including affine
transformations set with SetTransformMatrix()) while resetting clipping
box to its initial size.
2021-07-20 22:57:27 +02:00
Artur Wieczorek
ce5e6cfc10 Fix setting clipping region for wxDC with rotated coordinate system (wxMSW)
We cannot assume that axis-aligned clipping box in local coordinates will
remain axis-aligned box in device coordinates so we need to take into
account all 4 corners of the clipping rectangle to create a polygonal
clipping region in device space.

Closes #19228.
2021-07-20 22:30:56 +02:00
Vadim Zeitlin
8b0decdf9d Merge branch 'univ_listbox_fixtest' of https://github.com/Kvaz1r/wxWidgets
Fix wxListBox in wxUniv to pass HitTest and ClickNotOnItem unit tests.

See https://github.com/wxWidgets/wxWidgets/pull/2432
2021-07-17 20:41:50 +02:00
Kvaz1r
1e680157a9 Send event on toggle deselecting 2021-07-17 20:48:31 +03:00
Vadim Zeitlin
3489a07ad6 Avoid harmless MSVS 2019 variable shadowing warning
Rename a local variable to avoid clashing with the same name in an outer
scope, fixing a warning introduced in f41564a3e2 (Add
wxRegEx::ConvertFromBasic() helper, 2021-06-18).
2021-07-17 18:17:26 +02:00
Vadim Zeitlin
71d1ced5b8 Fix recently broken wxRegEx build in UTF-8 mode
Restore the use of c_str() replaced with wx_str() in 4dd77dabe8 (Check
for WXREGEX_CONVERT_TO_MB when calling regcomp() too, 2021-07-16), as
it's still necessary when wxUSE_UNICODE_UTF8==1.
2021-07-17 17:59:05 +02:00
Vadim Zeitlin
304d5e6c59 Merge branch 'regex-prepare-pcre'
Cleanup and simplify wxRegEx code.

See https://github.com/wxWidgets/wxWidgets/pull/2437
2021-07-17 17:13:38 +02:00