mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-25 16:48:44 +02:00
Merge branch 'master' into temp
* master: Enh1444 and Bug1435 fixed by CHANGED MAC BUILD PROCEURE... Restore correct resizing of the time ruler for the scrub bar button Bug1443 again: Mac label shift-click should differ, per David Bailes More access key fixes. Better Pinned tooltip. Bug1443: Various odd behavior of label text editor, fixed... Further fix for Windows build fix Windows build Correctly load parameters for Change Pitch effect
This commit is contained in:
commit
9aff1ff6c6
@ -37,6 +37,8 @@ http://forum.audacityteam.org/viewtopic.php?p=303835#p303835 .
|
||||
cd wxWidgets-3.0.2
|
||||
patch -p0 -i <path to Audacity source>/mac/wxMac_additions/wxMac-3.0.2-fixes.patch .
|
||||
patch -p0 -i <path to Audacity source>/mac/wxMac_additions/eventloops.patch .
|
||||
patch -p0 -i <path to Audacity source>/mac/wxMac_additions/pinch-spread.patch .
|
||||
patch -p0 -i <path to Audacity source>/mac/wxMac_additions/focusrings.patch .
|
||||
|
||||
10) And finally build/install wxWidgets:
|
||||
|
||||
|
123
mac/wxMac_additions/focusrings.patch
Normal file
123
mac/wxMac_additions/focusrings.patch
Normal file
@ -0,0 +1,123 @@
|
||||
From 148b0ed936b023b9b87d7703ecb86c4279f1182a Mon Sep 17 00:00:00 2001
|
||||
From: Paul Licameli <paul.licameli@audacityteam.org>
|
||||
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)
|
||||
|
206
mac/wxMac_additions/pinch-spread.patch
Normal file
206
mac/wxMac_additions/pinch-spread.patch
Normal file
@ -0,0 +1,206 @@
|
||||
From 74a186065ad04a1ed3d43baeccec9083910ec623 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Licameli <paul.licameli@audacityteam.org>
|
||||
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)
|
||||
|
@ -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()
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
|
@ -138,6 +138,7 @@ bool EffectChangePitch::SetAutomationParameters(EffectAutomationParameters & par
|
||||
ReadAndVerifyDouble(Percentage);
|
||||
|
||||
m_dPercentChange = Percentage;
|
||||
Calc_SemitonesChange_fromPercentChange();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
#ifndef __AUDACITY_CONTRAST_DIALOG__
|
||||
#define __AUDACITY_CONTRAST_DIALOG__
|
||||
|
||||
#include "widgets/wxPanelWrapper.h"
|
||||
#include "../widgets/wxPanelWrapper.h"
|
||||
|
||||
class wxButton;
|
||||
class wxSizer;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
#ifndef __AUDACITY_WXPANEL_WRAPPER__
|
||||
#define __AUDACITY_WXPANEL_WRAPPER__
|
||||
|
||||
#include <MemoryX.h>
|
||||
#include "../MemoryX.h"
|
||||
#include <wx/panel.h>
|
||||
#include <wx/dialog.h>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user