diff --git a/mac/Build.txt b/mac/Build.txt index 36d10dda0..db7901e1c 100644 --- a/mac/Build.txt +++ b/mac/Build.txt @@ -37,6 +37,8 @@ http://forum.audacityteam.org/viewtopic.php?p=303835#p303835 . cd wxWidgets-3.0.2 patch -p0 -i /mac/wxMac_additions/wxMac-3.0.2-fixes.patch . patch -p0 -i /mac/wxMac_additions/eventloops.patch . + patch -p0 -i /mac/wxMac_additions/pinch-spread.patch . + patch -p0 -i /mac/wxMac_additions/focusrings.patch . 10) And finally build/install wxWidgets: diff --git a/mac/wxMac_additions/focusrings.patch b/mac/wxMac_additions/focusrings.patch new file mode 100644 index 000000000..648b56133 --- /dev/null +++ b/mac/wxMac_additions/focusrings.patch @@ -0,0 +1,123 @@ +From 148b0ed936b023b9b87d7703ecb86c4279f1182a Mon Sep 17 00:00:00 2001 +From: Paul Licameli +Date: Wed, 6 Jul 2016 14:18:17 -0400 +Subject: [PATCH 2/2] Focus rings are back for buttons, choice, listbox, + dateTimePicker controls + +--- + include/wx/button.h | 2 ++ + include/wx/choice.h | 2 ++ + include/wx/datetimectrl.h | 2 ++ + include/wx/listbox.h | 2 ++ + include/wx/window.h | 2 ++ + src/osx/cocoa/window.mm | 22 +++++++++++++++++++++- + 6 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/include/wx/button.h b/include/wx/button.h +index 71dbee4..6aa75d3 100644 +--- include/wx/button.h ++++ include/wx/button.h +@@ -42,6 +42,8 @@ public: + // returns the default button size for this platform + static wxSize GetDefaultSize(); + ++ virtual bool NeedsFocusRing() const { return true; } ++ + protected: + wxDECLARE_NO_COPY_CLASS(wxButtonBase); + }; +diff --git a/include/wx/choice.h b/include/wx/choice.h +index 3a848f9..421a9a7 100644 +--- include/wx/choice.h ++++ include/wx/choice.h +@@ -57,6 +57,8 @@ public: + // override wxItemContainer::IsSorted + virtual bool IsSorted() const { return HasFlag(wxCB_SORT); } + ++ virtual bool NeedsFocusRing() const { return true; } ++ + protected: + // The generic implementation doesn't determine the height correctly and + // doesn't account for the width of the arrow but does take into account +diff --git a/include/wx/datetimectrl.h b/include/wx/datetimectrl.h +index 30f23df..d51c6c1 100644 +--- include/wx/datetimectrl.h ++++ include/wx/datetimectrl.h +@@ -32,6 +32,8 @@ public: + // Set/get the date or time (in the latter case, time part is ignored). + virtual void SetValue(const wxDateTime& dt) = 0; + virtual wxDateTime GetValue() const = 0; ++ ++ virtual bool NeedsFocusRing() const { return true; } + }; + + #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__) +diff --git a/include/wx/listbox.h b/include/wx/listbox.h +index afb0220..b9d47f0 100644 +--- include/wx/listbox.h ++++ include/wx/listbox.h +@@ -94,6 +94,8 @@ public: + int HitTest(const wxPoint& point) const { return DoListHitTest(point); } + int HitTest(int x, int y) const { return DoListHitTest(wxPoint(x, y)); } + ++ virtual bool NeedsFocusRing() const { return true; } ++ + + protected: + virtual void DoSetFirstItem(int n) = 0; +diff --git a/include/wx/window.h b/include/wx/window.h +index 7dffad4..bbe727d 100644 +--- include/wx/window.h ++++ include/wx/window.h +@@ -260,6 +260,8 @@ public: + // moving/resizing + // --------------- + ++ virtual bool NeedsFocusRing() const { return false; } ++ + // set the window size and/or position + void SetSize( int x, int y, int width, int height, + int sizeFlags = wxSIZE_AUTO ) +diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm +index d9fa4ae..881d0e9 100644 +--- src/osx/cocoa/window.mm ++++ src/osx/cocoa/window.mm +@@ -17,6 +17,7 @@ + #include "wx/textctrl.h" + #include "wx/combobox.h" + #include "wx/radiobut.h" ++ #include "wx/button.h" + #endif + + #ifdef __WXMAC__ +@@ -1660,7 +1661,26 @@ void wxWidgetCocoaImpl::drawRect(void* rect, WXWidget slf, void *WXUNUSED(_cmd)) + // call super + SEL _cmd = @selector(drawRect:); + wxOSX_DrawRectHandlerPtr superimpl = (wxOSX_DrawRectHandlerPtr) [[slf superclass] instanceMethodForSelector:_cmd]; +- superimpl(slf, _cmd, *(NSRect*)rect); ++ ++ wxWindow *peer = GetWXPeer(); ++ bool hasFocus = peer->HasFocus(); ++ if (hasFocus && ++ peer->NeedsFocusRing()) { ++ superimpl(slf, _cmd, *(NSRect*)rect); ++ ++ // Paint it again, without text, causing focus halo to be ++ // superimposed about all else ++ HIThemeBeginFocus( context, kHIThemeFocusRingOnly, NULL ); ++ CGContextSetTextDrawingMode( context, kCGTextInvisible ); ++ superimpl(slf, _cmd, *(NSRect*)rect); ++ HIThemeEndFocus( context ); ++ ++ CGContextRestoreGState( context ); ++ CGContextSaveGState( context ); ++ } ++ else ++ superimpl(slf, _cmd, *(NSRect*)rect); ++ + CGContextRestoreGState( context ); + CGContextSaveGState( context ); + } +-- +2.3.2 (Apple Git-55) + diff --git a/mac/wxMac_additions/pinch-spread.patch b/mac/wxMac_additions/pinch-spread.patch new file mode 100644 index 000000000..f8ad200b9 --- /dev/null +++ b/mac/wxMac_additions/pinch-spread.patch @@ -0,0 +1,206 @@ +From 74a186065ad04a1ed3d43baeccec9083910ec623 Mon Sep 17 00:00:00 2001 +From: Paul Licameli +Date: Sun, 3 Jul 2016 10:16:12 -0400 +Subject: [PATCH 1/2] Add wxEVT_MAGNIFY mouse event. + +Currently this is implemented for wxOSX only. + +Closes #14322. + +git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78274 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 +--- + docs/changes.txt | 1 + + include/wx/event.h | 9 ++++++++- + interface/wx/event.h | 29 +++++++++++++++++++++++++++++ + src/common/event.cpp | 4 ++++ + src/osx/cocoa/window.mm | 10 ++++++++++ + 5 files changed, 52 insertions(+), 1 deletion(-) + +diff --git a/docs/changes.txt b/docs/changes.txt +index 72e7d42..6436bfb 100644 +--- docs/changes.txt ++++ docs/changes.txt +@@ -585,6 +585,7 @@ All: + + All (GUI): + ++- Add wxEVT_MAGNIFY mouse event (Joost Nieuwenhuijse). + - Add wxGenericListCtrl::EndEditLabel() (Tim Kosse). + - Implement bounding box computation in wxGCDC (Toni Ruža). + - Fix saving GIF animations with 2.5s+ delays between frames (elvissteinjr). +diff --git a/include/wx/event.h b/include/wx/event.h +index 61ec19c..26af365 100644 +--- include/wx/event.h ++++ include/wx/event.h +@@ -716,6 +716,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX1_DCLICK, wxMouseEvent); + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_DOWN, wxMouseEvent); + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_UP, wxMouseEvent); + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_AUX2_DCLICK, wxMouseEvent); ++wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_MAGNIFY, wxMouseEvent); + + // Character input event type + wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_CORE, wxEVT_CHAR, wxKeyEvent); +@@ -1751,6 +1752,8 @@ public: + bool Aux1DClick() const { return (m_eventType == wxEVT_AUX1_DCLICK); } + bool Aux2DClick() const { return (m_eventType == wxEVT_AUX2_DCLICK); } + ++ bool Magnify() const { return (m_eventType == wxEVT_MAGNIFY); } ++ + // True if a button is down and the mouse is moving + bool Dragging() const + { +@@ -1805,6 +1808,7 @@ public: + // Is the system set to do page scrolling? + bool IsPageScroll() const { return ((unsigned int)m_linesPerAction == UINT_MAX); } + ++ float GetMagnification() const { return m_magnification; } + virtual wxEvent *Clone() const { return new wxMouseEvent(*this); } + virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_USER_INPUT; } + +@@ -1823,6 +1827,7 @@ public: + int m_wheelDelta; + int m_linesPerAction; + int m_columnsPerAction; ++ float m_magnification; + + protected: + void Assign(const wxMouseEvent& evt); +@@ -4218,6 +4223,7 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& + #define EVT_MOUSE_AUX2_DOWN(func) wx__DECLARE_EVT0(wxEVT_AUX2_DOWN, wxMouseEventHandler(func)) + #define EVT_MOUSE_AUX2_UP(func) wx__DECLARE_EVT0(wxEVT_AUX2_UP, wxMouseEventHandler(func)) + #define EVT_MOUSE_AUX2_DCLICK(func) wx__DECLARE_EVT0(wxEVT_AUX2_DCLICK, wxMouseEventHandler(func)) ++#define EVT_MAGNIFY(func) wx__DECLARE_EVT0(wxEVT_MAGNIFY, wxMouseEventHandler(func)) + + // All mouse events + #define EVT_MOUSE_EVENTS(func) \ +@@ -4239,7 +4245,8 @@ typedef void (wxEvtHandler::*wxClipboardTextEventFunction)(wxClipboardTextEvent& + EVT_MOTION(func) \ + EVT_LEAVE_WINDOW(func) \ + EVT_ENTER_WINDOW(func) \ +- EVT_MOUSEWHEEL(func) ++ EVT_MOUSEWHEEL(func) \ ++ EVT_MAGNIFY(func) + + // Scrolling from wxWindow (sent to wxScrolledWindow) + #define EVT_SCROLLWIN_TOP(func) wx__DECLARE_EVT0(wxEVT_SCROLLWIN_TOP, wxScrollWinEventHandler(func)) +diff --git a/interface/wx/event.h b/interface/wx/event.h +index 52bb609..7fe007a 100644 +--- interface/wx/event.h ++++ interface/wx/event.h +@@ -2626,6 +2626,8 @@ enum wxMouseWheelAxis + Process a @c wxEVT_MOUSEWHEEL event. + @event{EVT_MOUSE_EVENTS(func)} + Process all mouse events. ++ @event{EVT_MAGNIFY(func)} ++ Process a @c wxEVT_MAGNIFY event (new since wxWidgets 3.1.0). + @endEventTable + + @library{wxcore} +@@ -2659,6 +2661,7 @@ public: + @li @c wxEVT_AUX2_DCLICK + @li @c wxEVT_MOTION + @li @c wxEVT_MOUSEWHEEL ++ @li @c wxEVT_MAGNIFY + */ + wxMouseEvent(wxEventType mouseEventType = wxEVT_NULL); + +@@ -2785,6 +2788,21 @@ public: + wxPoint GetLogicalPosition(const wxDC& dc) const; + + /** ++ For magnify (pinch to zoom) events: returns the change in magnification. ++ ++ A value of 0 means no change, a positive value means we should enlarge ++ (or zoom in), a negative value means we should shrink (or zoom out). ++ ++ This method is only valid to call for @c wxEVT_MAGNIFY events which are ++ currently only generated under OS X. ++ ++ @see Magnify() ++ ++ @since 3.1.0 ++ */ ++ float GetMagnification() const; ++ ++ /** + Get wheel delta, normally 120. + + This is the threshold for action to be taken, and one such action +@@ -2851,6 +2869,17 @@ public: + bool LeftUp() const; + + /** ++ Returns @true if the event is a magnify (i.e.\ pinch to zoom) event. ++ ++ Such events are currently generated only under OS X. ++ ++ @see GetMagnification() ++ ++ @since 3.1.0 ++ */ ++ bool Magnify() const; ++ ++ /** + Returns @true if the Meta key was down at the time of the event. + */ + bool MetaDown() const; +diff --git a/src/common/event.cpp b/src/common/event.cpp +index d92a4ac..1015c84 100644 +--- src/common/event.cpp ++++ src/common/event.cpp +@@ -208,6 +208,7 @@ wxDEFINE_EVENT( wxEVT_AUX1_DCLICK, wxMouseEvent ); + wxDEFINE_EVENT( wxEVT_AUX2_DOWN, wxMouseEvent ); + wxDEFINE_EVENT( wxEVT_AUX2_UP, wxMouseEvent ); + wxDEFINE_EVENT( wxEVT_AUX2_DCLICK, wxMouseEvent ); ++wxDEFINE_EVENT( wxEVT_MAGNIFY, wxMouseEvent ); + + // Character input event type + wxDEFINE_EVENT( wxEVT_CHAR, wxKeyEvent ); +@@ -576,6 +577,7 @@ wxMouseEvent::wxMouseEvent(wxEventType commandType) + m_wheelDelta = 0; + m_linesPerAction = 0; + m_columnsPerAction = 0; ++ m_magnification = 0.0f; + } + + void wxMouseEvent::Assign(const wxMouseEvent& event) +@@ -600,6 +602,8 @@ void wxMouseEvent::Assign(const wxMouseEvent& event) + m_linesPerAction = event.m_linesPerAction; + m_columnsPerAction = event.m_columnsPerAction; + m_wheelAxis = event.m_wheelAxis; ++ ++ m_magnification = event.m_magnification; + } + + // return true if was a button dclick event +diff --git a/src/osx/cocoa/window.mm b/src/osx/cocoa/window.mm +index ede8ebf..d9fa4ae 100644 +--- src/osx/cocoa/window.mm ++++ src/osx/cocoa/window.mm +@@ -741,6 +741,12 @@ void wxWidgetCocoaImpl::SetupMouseEvent( wxMouseEvent &wxevent , NSEvent * nsEve + case NSMouseMoved : + wxevent.SetEventType( wxEVT_MOTION ) ; + break; ++ ++ case NSEventTypeMagnify: ++ wxevent.SetEventType( wxEVT_MAGNIFY ); ++ wxevent.m_magnification = [nsEvent magnification]; ++ break; ++ + default : + break ; + } +@@ -1772,6 +1778,10 @@ void wxOSXCocoaClassAddWXMethods(Class c) + wxOSX_CLASS_ADD_METHOD(c, @selector(scrollWheel:), (IMP) wxOSX_mouseEvent, "v@:@" ) + wxOSX_CLASS_ADD_METHOD(c, @selector(mouseEntered:), (IMP) wxOSX_mouseEvent, "v@:@" ) + wxOSX_CLASS_ADD_METHOD(c, @selector(mouseExited:), (IMP) wxOSX_mouseEvent, "v@:@" ) ++ ++#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 ++ wxOSX_CLASS_ADD_METHOD(c, @selector(magnifyWithEvent:), (IMP)wxOSX_mouseEvent, "v@:@") ++#endif + + wxOSX_CLASS_ADD_METHOD(c, @selector(cursorUpdate:), (IMP) wxOSX_cursorUpdate, "v@:@" ) + +-- +2.3.2 (Apple Git-55) + diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index 47066f0b6..60baf0b96 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -269,7 +269,6 @@ void LabelTrack::WarpLabels(const TimeWarper &warper) { void LabelTrack::ResetFlags() { - mDragXPos = -1; mInitialCursorPos = 1; mCurrentCursorPos = 1; mRightDragging = false; @@ -522,8 +521,6 @@ LabelStruct::LabelStruct(const SelectedRegion ®ion, : selectedRegion(region) , title(aTitle) { - changeInitialMouseXPos = true; - highlighted = false; updated = false; width = 0; x = 0; @@ -541,8 +538,6 @@ LabelStruct::LabelStruct(const SelectedRegion ®ion, // Overwrite the times selectedRegion.setTimes(t0, t1); - changeInitialMouseXPos = true; - highlighted = false; updated = false; width = 0; x = 0; @@ -694,9 +689,6 @@ void LabelStruct::DrawTextBox(wxDC & dc, const wxRect & r) const void LabelStruct::DrawHighlight ( wxDC & dc, int xPos1, int xPos2, int charHeight) const { - highlighted = true; - changeInitialMouseXPos = false; - wxPen curPen = dc.GetPen(); curPen.SetColour(wxString(wxT("BLUE"))); wxBrush curBrush = dc.GetBrush(); @@ -826,7 +818,7 @@ void LabelTrack::Draw(wxDC & dc, const wxRect & r, }} // Draw highlights - if ((mDragXPos != -1) && (mSelIndex >= 0 )) + if ((mInitialCursorPos != mCurrentCursorPos) && (mSelIndex >= 0 )) { int xpos1, xpos2; CalcHighlightXs(&xpos1, &xpos2); @@ -866,11 +858,11 @@ void LabelTrack::Draw(wxDC & dc, const wxRect & r, } } -/// Set the cursor position according to x position of mouse /// uses GetTextExtent to find the character position /// corresponding to the x pixel position. -void LabelTrack::SetCurrentCursorPosition(int xPos) +int LabelTrack::FindCurrentCursorPosition(int xPos) { + int result = -1; wxMemoryDC dc; if(msFont.Ok()) dc.SetFont(msFont); @@ -898,7 +890,7 @@ void LabelTrack::SetCurrentCursorPosition(int xPos) if (xPos <= bound) { // Found - mCurrentCursorPos = charIndex - 1; + result = charIndex - 1; finished = true; } else @@ -908,10 +900,16 @@ void LabelTrack::SetCurrentCursorPosition(int xPos) } } if (!finished) - { // Cursor should be in the last position - mCurrentCursorPos = length; - } + result = length; + + return result; +} + +/// Set the cursor position according to x position of mouse +void LabelTrack::SetCurrentCursorPosition(int xPos) +{ + mCurrentCursorPos = FindCurrentCursorPosition(xPos); } void LabelTrack::calculateFontHeight(wxDC & dc) const @@ -936,8 +934,6 @@ bool LabelTrack::IsTextSelected() { if (mSelIndex == -1) return false; - if (!mLabels[mSelIndex].highlighted) - return false; if (mCurrentCursorPos == mInitialCursorPos) return false; return true; @@ -993,14 +989,15 @@ bool LabelTrack::CopySelectedText() return false; const auto &labelStruct = mLabels[mSelIndex]; - if (!labelStruct.highlighted) - return false; int init = mInitialCursorPos; int cur = mCurrentCursorPos; if (init > cur) std::swap(init, cur); + if (init == cur) + return false; + // data for copying wxString data = labelStruct.title.Mid(init, cur-init); @@ -1043,12 +1040,9 @@ bool LabelTrack::PasteSelectedText(double sel0, double sel1) auto &labelStruct = mLabels[mSelIndex]; auto &title = labelStruct.title; - int cur = mCurrentCursorPos, init = cur; - if (labelStruct.highlighted) { - init = mInitialCursorPos; - if (init > cur) - std::swap(init, cur); - } + int cur = mCurrentCursorPos, init = mInitialCursorPos; + if (init > cur) + std::swap(init, cur); left = title.Left(init); if (cur < (int)title.Length()) right = title.Mid(cur); @@ -1493,20 +1487,9 @@ void LabelTrack::HandleTextDragRelease(const wxMouseEvent & evt) if(evt.Dragging()) { - // if dragging happens in text box - // end dragging x position in pixels - // set flag to update current cursor position - mDragXPos = evt.m_x; - - // for preventing dragging glygh from changing current cursor position - // set end dragging position to current cursor position - SetCurrentCursorPosition(mDragXPos); - - // if it's an invalid dragging, disable displaying - if (mRightDragging) { - mDragXPos = -1; - mRightDragging = false; - } + if (!mRightDragging) + // Update drag end + SetCurrentCursorPosition(evt.m_x); return; } @@ -1573,20 +1556,41 @@ void LabelTrack::HandleClick(const wxMouseEvent & evt, return; } - // disable displaying if left button is down - if (evt.LeftDown()) - mDragXPos = -1; - mSelIndex = OverATextBox(evt.m_x, evt.m_y); if (mSelIndex != -1) { auto &labelStruct = mLabels[mSelIndex]; *newSel = labelStruct.selectedRegion; - SetCurrentCursorPosition(evt.m_x); - // for preventing from resetting by shift+mouse left button - if (labelStruct.changeInitialMouseXPos) - mInitialCursorPos = mCurrentCursorPos; - mDrawCursor = true; + if (evt.LeftDown()) { + // Find the NEW drag end + auto position = FindCurrentCursorPosition(evt.m_x); + + // Anchor shift-drag at the farther end of the previous highlight + // that is farther from the click, on Mac, for consistency with + // its text editors, but on the others, re-use the previous + // anchor. + if (evt.ShiftDown()) { +#ifdef __WXMAC__ + // Set the drag anchor at the end of the previous selection + // that is farther from the NEW drag end + if (abs(position - mCurrentCursorPos) > + abs(position - mInitialCursorPos)) + mInitialCursorPos = mCurrentCursorPos; +#else + // mInitialCursorPos remains as before +#endif + } + else + mInitialCursorPos = position; + + mCurrentCursorPos = position; + + mDrawCursor = true; + mRightDragging = false; + } + else + // Actually this might be right or middle down + mRightDragging = true; // reset the highlight indicator wxRect highlightedRect; @@ -1600,28 +1604,8 @@ void LabelTrack::HandleClick(const wxMouseEvent & evt, xpos1, labelStruct.y - mFontHeight / 2, (int)(xpos2 - xpos1 + 0.5), mFontHeight }; - - // reset when left button is down - if (evt.LeftDown()) - labelStruct.highlighted = false; - // reset when right button is down outside text box - if (evt.RightDown()) - { - if (!highlightedRect.Contains(evt.m_x, evt.m_y)) - { - mCurrentCursorPos = mInitialCursorPos = 0; - labelStruct.highlighted = false; - } - } - // set changeInitialMouseXPos flag - labelStruct.changeInitialMouseXPos = true; } - // disable displaying if right button is down outside text box - if (evt.RightDown() - && !highlightedRect.Contains(evt.m_x, evt.m_y)) - mDragXPos = -1; - // Middle click on GTK: paste from primary selection #if defined(__WXGTK__) && (HAVE_GTK) if (evt.MiddleDown()) { @@ -1634,16 +1618,6 @@ void LabelTrack::HandleClick(const wxMouseEvent & evt, *newSel = SelectedRegion(t, t); } #endif - - // handle shift+mouse left button - if (evt.ShiftDown()) { - // if the mouse is clicked in text box, set flags - mDragXPos = evt.m_x; - - // for preventing dragging glygh from changing current cursor position - // set end dragging position to current cursor position - SetCurrentCursorPosition(evt.m_x); - } } #if defined(__WXGTK__) && (HAVE_GTK) @@ -1732,9 +1706,8 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (len > 0) { // IF there are some highlighted letters, THEN DELETE them - if (labelStruct.highlighted) { + if (mInitialCursorPos != mCurrentCursorPos) RemoveSelectedText(); - } else { // DELETE one letter @@ -1763,9 +1736,8 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (len > 0) { // if there are some highlighted letters, DELETE them - if (labelStruct.highlighted) { + if (mInitialCursorPos != mCurrentCursorPos) RemoveSelectedText(); - } else { // DELETE one letter @@ -1789,11 +1761,9 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) // Move cursor to beginning of label mCurrentCursorPos = 0; if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; + ; + else mInitialCursorPos = mCurrentCursorPos; - } break; case WXK_END: @@ -1801,11 +1771,9 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) // Move cursor to end of label mCurrentCursorPos = (int)title.length(); if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; + ; + else mInitialCursorPos = mCurrentCursorPos; - } break; case WXK_LEFT: @@ -1814,11 +1782,10 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (mCurrentCursorPos > 0) { mCurrentCursorPos--; if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; - mInitialCursorPos = mCurrentCursorPos; - } + ; + else + mInitialCursorPos = mCurrentCursorPos = + std::min(mInitialCursorPos, mCurrentCursorPos); } break; @@ -1828,11 +1795,10 @@ bool LabelTrack::OnKeyDown(SelectedRegion &newSel, wxKeyEvent & event) if (mCurrentCursorPos < (int)title.length()) { mCurrentCursorPos++; if (mods == wxMOD_SHIFT) - mDragXPos = 0; - else { - mDragXPos = -1; - mInitialCursorPos = mCurrentCursorPos; - } + ; + else + mInitialCursorPos = mCurrentCursorPos = + std::max(mInitialCursorPos, mCurrentCursorPos); } break; @@ -1984,9 +1950,8 @@ bool LabelTrack::OnChar(SelectedRegion &WXUNUSED(newSel), wxKeyEvent & event) auto &title = labelStruct.title; // Test if cursor is in the end of string or not - if (labelStruct.highlighted) { + if (mInitialCursorPos != mCurrentCursorPos) RemoveSelectedText(); - } if (mCurrentCursorPos < (int)title.length()) { // Get substring on the righthand side of cursor @@ -2048,9 +2013,6 @@ void LabelTrack::ShowContextMenu() parent->PopupMenu(&menu, x, ls->y + (mIconHeight / 2) - 1); } - - // it's an invalid dragging event - SetWrongDragging(true); } void LabelTrack::OnContextMenu(wxCommandEvent & evt) @@ -2126,8 +2088,6 @@ void LabelTrack::RemoveSelectedText() title = left + right; mInitialCursorPos = mCurrentCursorPos = left.Length(); - labelStruct.highlighted = false; - mDragXPos = -1; } void LabelTrack::Unselect() diff --git a/src/LabelTrack.h b/src/LabelTrack.h index b1ef18a92..ee747074d 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -96,8 +96,6 @@ public: mutable int xText; /// Pixel position of left hand side of text box mutable int y; /// Pixel position of label. - mutable bool highlighted; /// if the text is highlighted - mutable bool changeInitialMouseXPos; /// flag to change initial mouse X pos bool updated; /// flag to tell if the label times were updated }; @@ -180,9 +178,6 @@ class AUDACITY_DLL_API LabelTrack final : public Track bool PasteSelectedText(double sel0, double sel1); static bool IsTextClipSupported(); - // methods to set flags - void SetWrongDragging(bool rightFlag) { mRightDragging = rightFlag; } - void HandleClick(const wxMouseEvent & evt, const wxRect & r, const ZoomInfo &zoomInfo, SelectedRegion *newSel); bool HandleGlyphDragRelease(const wxMouseEvent & evt, wxRect & r, const ZoomInfo &zoomInfo, @@ -263,8 +258,6 @@ class AUDACITY_DLL_API LabelTrack final : public Track static int mFontHeight; int mCurrentCursorPos; /// current cursor position int mInitialCursorPos; /// initial cursor position - int mDragXPos; /// end X pos of dragging - /// in text box bool mRightDragging; /// flag to tell if it's a valid dragging bool mDrawCursor; /// flag to tell if drawing the @@ -279,6 +272,7 @@ class AUDACITY_DLL_API LabelTrack final : public Track void ComputeTextPosition(const wxRect & r, int index) const; public: + int FindCurrentCursorPosition(int xPos); void SetCurrentCursorPosition(int xPos); private: diff --git a/src/Menus.cpp b/src/Menus.cpp index d7680c033..8832fbb0e 100644 --- a/src/Menus.cpp +++ b/src/Menus.cpp @@ -325,7 +325,7 @@ void AudacityProject::CreateMenusAndCommands() AudioIONotBusyFlag | UnsavedChangesFlag); c->AddItem(wxT("SaveAs"), _("Save Project &As..."), FN(OnSaveAs)); #ifdef USE_LIBVORBIS - c->AddItem(wxT("SaveCompressed"), _("Save Compressed Copy of Project..."), FN(OnSaveCompressed)); + c->AddItem(wxT("SaveCompressed"), _("Sa&ve Compressed Copy of Project..."), FN(OnSaveCompressed)); #endif c->AddItem(wxT("CheckDeps"), _("Chec&k Dependencies..."), FN(OnCheckDependencies)); @@ -371,7 +371,7 @@ void AudacityProject::CreateMenusAndCommands() AudioIONotBusyFlag | WaveTracksExistFlag, AudioIONotBusyFlag | WaveTracksExistFlag); #if defined(USE_MIDI) - c->AddItem(wxT("ExportMIDI"), _("Export MIDI..."), FN(OnExportMIDI), + c->AddItem(wxT("ExportMIDI"), _("Export MI&DI..."), FN(OnExportMIDI), AudioIONotBusyFlag | NoteTracksSelectedFlag, AudioIONotBusyFlag | NoteTracksSelectedFlag); #endif @@ -733,7 +733,7 @@ void AudacityProject::CreateMenusAndCommands() c->AddSeparator(); /* i18n-hint: (verb)*/ - c->AddItem(wxT("ResetToolbars"), _("&Reset Toolbars"), FN(OnResetToolBars), 0, AlwaysEnabledFlag, AlwaysEnabledFlag); + c->AddItem(wxT("ResetToolbars"), _("Reset Toolb&ars"), FN(OnResetToolBars), 0, AlwaysEnabledFlag, AlwaysEnabledFlag); c->EndSubMenu(); @@ -776,7 +776,7 @@ void AudacityProject::CreateMenusAndCommands() c->AddSeparator(); - c->AddCheck(wxT("PinnedHead"), _("Pinned Recording/Playback Head"), + c->AddCheck(wxT("PinnedHead"), _("Pinned Recording/Playback &Head"), FN(OnTogglePinnedHead), 0, // Switching of scrolling on and off is permitted even during transport AlwaysEnabledFlag, AlwaysEnabledFlag); diff --git a/src/effects/ChangePitch.cpp b/src/effects/ChangePitch.cpp index 669b4273a..31bd496be 100644 --- a/src/effects/ChangePitch.cpp +++ b/src/effects/ChangePitch.cpp @@ -138,6 +138,7 @@ bool EffectChangePitch::SetAutomationParameters(EffectAutomationParameters & par ReadAndVerifyDouble(Percentage); m_dPercentChange = Percentage; + Calc_SemitonesChange_fromPercentChange(); return true; } diff --git a/src/effects/Contrast.h b/src/effects/Contrast.h index 88263533b..c3d28db3c 100644 --- a/src/effects/Contrast.h +++ b/src/effects/Contrast.h @@ -9,7 +9,7 @@ #ifndef __AUDACITY_CONTRAST_DIALOG__ #define __AUDACITY_CONTRAST_DIALOG__ -#include "widgets/wxPanelWrapper.h" +#include "../widgets/wxPanelWrapper.h" class wxButton; class wxSizer; diff --git a/src/widgets/Ruler.cpp b/src/widgets/Ruler.cpp index 4fe3899b5..b54d94bc4 100644 --- a/src/widgets/Ruler.cpp +++ b/src/widgets/Ruler.cpp @@ -2782,7 +2782,7 @@ void AdornedRulerPanel::OnToggleScrubBar(/*wxCommandEvent&*/) wxSize size { GetSize().GetWidth(), GetRulerHeight(mShowScrubbing) }; SetSize(size); SetMinSize(size); - PostSizeEventToParent(); + GetParent()->PostSizeEventToParent(); } void AdornedRulerPanel::OnContextMenu(wxContextMenuEvent & WXUNUSED(event)) @@ -2811,8 +2811,8 @@ void AdornedRulerPanel::UpdateButtonStates() const auto label = state // Label descibes the present state, not what the click does // (which is, to toggle the state) - ? _("Pinned play/record Head") - : _("Unpinned play/record Head"); + ? _("Pinned Record/Play head") + : _("Unpinned Record/Play head"); common(*pinButton, wxT("PinnedHead"), label); } } diff --git a/src/widgets/wxPanelWrapper.h b/src/widgets/wxPanelWrapper.h index f694d5655..5c2b1d215 100644 --- a/src/widgets/wxPanelWrapper.h +++ b/src/widgets/wxPanelWrapper.h @@ -9,7 +9,7 @@ #ifndef __AUDACITY_WXPANEL_WRAPPER__ #define __AUDACITY_WXPANEL_WRAPPER__ -#include +#include "../MemoryX.h" #include #include