Added wxAUI_MGR_LIVE_RESIZE flag for live sash sizing, the default on wxOSX

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57884 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2009-01-07 14:45:27 +00:00
parent 939fdcf6b7
commit 68030cae69
4 changed files with 251 additions and 193 deletions

View File

@@ -47,6 +47,7 @@ enum wxAuiManagerOption
wxAUI_MGR_RECTANGLE_HINT = 1 << 5,
wxAUI_MGR_HINT_FADE = 1 << 6,
wxAUI_MGR_NO_VENETIAN_BLINDS_FADE = 1 << 7,
wxAUI_MGR_LIVE_RESIZE = 1 << 8,
wxAUI_MGR_DEFAULT = wxAUI_MGR_ALLOW_FLOATING |
wxAUI_MGR_TRANSPARENT_HINT |
@@ -560,6 +561,8 @@ protected:
wxArrayInt& positions,
wxArrayInt& sizes);
/// Ends a resize action, or for live update, resizes the sash
bool DoEndResizeAction(wxMouseEvent& event);
public:
@@ -615,6 +618,7 @@ protected:
wxAuiDockUIPart* m_hover_button;// button uipart being hovered over
wxRect m_last_hint; // last hint rectangle
wxPoint m_last_mouse_move; // last mouse move position (see OnMotion)
int m_currentDragItem;
bool m_skipping;
bool m_has_maximized;

View File

@@ -35,6 +35,7 @@ enum wxAuiManagerOption
wxAUI_MGR_RECTANGLE_HINT = 1 << 5,
wxAUI_MGR_HINT_FADE = 1 << 6,
wxAUI_MGR_NO_VENETIAN_BLINDS_FADE = 1 << 7,
wxAUI_MGR_LIVE_RESIZE = 1 << 8,
wxAUI_MGR_DEFAULT = wxAUI_MGR_ALLOW_FLOATING |
wxAUI_MGR_TRANSPARENT_HINT |

View File

@@ -84,6 +84,7 @@ class MyFrame : public wxFrame
ID_NoGradient,
ID_VerticalGradient,
ID_HorizontalGradient,
ID_LiveUpdate,
ID_Settings,
ID_CustomizeToolbar,
ID_DropDownToolbarItem,
@@ -591,6 +592,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_HintFade, MyFrame::OnManagerFlag)
EVT_MENU(ID_NoVenetianFade, MyFrame::OnManagerFlag)
EVT_MENU(ID_TransparentDrag, MyFrame::OnManagerFlag)
EVT_MENU(ID_LiveUpdate, MyFrame::OnManagerFlag)
EVT_MENU(ID_AllowActivePane, MyFrame::OnManagerFlag)
EVT_MENU(ID_NotebookTabFixedWidth, MyFrame::OnNotebookFlag)
EVT_MENU(ID_NotebookNoCloseButton, MyFrame::OnNotebookFlag)
@@ -637,6 +639,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_UPDATE_UI(ID_HintFade, MyFrame::OnUpdateUI)
EVT_UPDATE_UI(ID_NoVenetianFade, MyFrame::OnUpdateUI)
EVT_UPDATE_UI(ID_TransparentDrag, MyFrame::OnUpdateUI)
EVT_UPDATE_UI(ID_LiveUpdate, MyFrame::OnUpdateUI)
EVT_UPDATE_UI(ID_NoGradient, MyFrame::OnUpdateUI)
EVT_UPDATE_UI(ID_VerticalGradient, MyFrame::OnUpdateUI)
EVT_UPDATE_UI(ID_HorizontalGradient, MyFrame::OnUpdateUI)
@@ -699,6 +702,7 @@ MyFrame::MyFrame(wxWindow* parent,
options_menu->AppendCheckItem(ID_NoVenetianFade, _("Disable Venetian Blinds Hint Fade-in"));
options_menu->AppendCheckItem(ID_TransparentDrag, _("Transparent Drag"));
options_menu->AppendCheckItem(ID_AllowActivePane, _("Allow Active Pane"));
options_menu->AppendCheckItem(ID_LiveUpdate, _("Live Resize Update"));
options_menu->AppendSeparator();
options_menu->AppendRadioItem(ID_NoGradient, _("No Caption Gradient"));
options_menu->AppendRadioItem(ID_VerticalGradient, _("Vertical Caption Gradient"));
@@ -1078,6 +1082,7 @@ void MyFrame::OnManagerFlag(wxCommandEvent& event)
case ID_TransparentHint: flag = wxAUI_MGR_TRANSPARENT_HINT; break;
case ID_VenetianBlindsHint: flag = wxAUI_MGR_VENETIAN_BLINDS_HINT; break;
case ID_RectangleHint: flag = wxAUI_MGR_RECTANGLE_HINT; break;
case ID_LiveUpdate: flag = wxAUI_MGR_LIVE_RESIZE; break;
}
if (flag)
@@ -1191,6 +1196,9 @@ void MyFrame::OnUpdateUI(wxUpdateUIEvent& event)
case ID_TransparentHint:
event.Check((flags & wxAUI_MGR_TRANSPARENT_HINT) != 0);
break;
case ID_LiveUpdate:
event.Check((flags & wxAUI_MGR_LIVE_RESIZE) != 0);
break;
case ID_VenetianBlindsHint:
event.Check((flags & wxAUI_MGR_VENETIAN_BLINDS_HINT) != 0);
break;

View File

@@ -593,6 +593,7 @@ wxAuiManager::wxAuiManager(wxWindow* managed_wnd, unsigned int flags)
m_dock_constraint_x = 0.3;
m_dock_constraint_y = 0.3;
m_reserved = NULL;
m_currentDragItem = -1;
if (managed_wnd)
{
@@ -735,6 +736,17 @@ unsigned int wxAuiManager::GetFlags() const
return m_flags;
}
// Convenience function
bool wxAuiManager_HasLiveResize(wxAuiManager& manager)
{
// With Core Graphics on Mac, it's not possible to show sash feedback,
// so we'll always use live update instead.
#if defined(__WXMAC__)
return true;
#else
return (manager.GetFlags() & wxAUI_MGR_LIVE_RESIZE) == wxAUI_MGR_LIVE_RESIZE;
#endif
}
// don't use these anymore as they are deprecated
// use Set/GetManagedFrame() instead
@@ -3930,6 +3942,8 @@ void wxAuiManager::UpdateButtonOnScreen(wxAuiDockUIPart* button_ui_part,
void wxAuiManager::OnLeftDown(wxMouseEvent& event)
{
m_currentDragItem = -1;
wxAuiDockUIPart* part = HitTest(event.GetX(), event.GetY());
if (part)
{
@@ -4025,17 +4039,9 @@ void wxAuiManager::OnLeftDown(wxMouseEvent& event)
#endif
}
void wxAuiManager::OnLeftUp(wxMouseEvent& event)
/// Ends a resize action, or for live update, resizes the sash
bool wxAuiManager::DoEndResizeAction(wxMouseEvent& event)
{
if (m_action == actionResize)
{
m_frame->ReleaseMouse();
// get rid of the hint rectangle
wxScreenDC dc;
DrawResizeHint(dc, m_action_hintrect);
// resize the dock or the pane
if (m_action_part && m_action_part->type==wxAuiDockUIPart::typeDockSizer)
{
@@ -4157,7 +4163,7 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event)
if (dock_pixels == 0 || total_proportion == 0 || borrow_pane == -1)
{
m_action = actionNone;
return;
return false;
}
// calculate the new proportion of the pane
@@ -4215,6 +4221,29 @@ void wxAuiManager::OnLeftUp(wxMouseEvent& event)
Update();
Repaint(NULL);
}
return true;
}
void wxAuiManager::OnLeftUp(wxMouseEvent& event)
{
if (m_action == actionResize)
{
m_frame->ReleaseMouse();
if (!wxAuiManager_HasLiveResize(*this))
{
// get rid of the hint rectangle
wxScreenDC dc;
DrawResizeHint(dc, m_action_hintrect);
}
if (m_currentDragItem != -1 && wxAuiManager_HasLiveResize(*this))
m_action_part = & (m_uiparts.Item(m_currentDragItem));
DoEndResizeAction(event);
m_currentDragItem = -1;
}
else if (m_action == actionClickButton)
{
@@ -4297,6 +4326,13 @@ void wxAuiManager::OnMotion(wxMouseEvent& event)
if (m_action == actionResize)
{
// It's necessary to reset m_action_part since it destroyed
// by the Update within DoEndResizeAction.
if (m_currentDragItem != -1)
m_action_part = & (m_uiparts.Item(m_currentDragItem));
else
m_currentDragItem = m_uiparts.Index(* m_action_part);
if (m_action_part)
{
wxPoint pos = m_action_part->rect.GetPosition();
@@ -4305,16 +4341,25 @@ void wxAuiManager::OnMotion(wxMouseEvent& event)
else
pos.x = wxMax(0, event.m_x - m_action_offset.x);
if (wxAuiManager_HasLiveResize(*this))
{
m_frame->ReleaseMouse();
DoEndResizeAction(event);
m_frame->CaptureMouse();
}
else
{
wxRect rect(m_frame->ClientToScreen(pos),
m_action_part->rect.GetSize());
wxScreenDC dc;
if (!m_action_hintrect.IsEmpty())
DrawResizeHint(dc, m_action_hintrect);
DrawResizeHint(dc, rect);
m_action_hintrect = rect;
}
}
}
else if (m_action == actionClickCaption)
{
int drag_x_threshold = wxSystemSettings::GetMetric(wxSYS_DRAG_X);