X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f88d1716592c5f7a0e193641493d93944965a760..ce22ac4592fccaedd8324e7a8f08b510748827e4:/src/aui/framemanager.cpp?ds=sidebyside diff --git a/src/aui/framemanager.cpp b/src/aui/framemanager.cpp index 3314ec6e4c..3dc1ac038b 100644 --- a/src/aui/framemanager.cpp +++ b/src/aui/framemanager.cpp @@ -30,6 +30,7 @@ #include "wx/aui/floatpane.h" #ifndef WX_PRECOMP + #include "wx/panel.h" #include "wx/settings.h" #include "wx/app.h" #include "wx/dcclient.h" @@ -80,11 +81,14 @@ public: m_Amount=0; m_MaxWidth=0; m_MaxHeight=0; + m_lastWidth=0; + m_lastHeight=0; #ifdef __WXGTK__ m_CanSetShape = false; // have to wait for window create event on GTK #else m_CanSetShape = true; #endif + m_Region = wxRegion(0, 0, 0, 0); SetTransparent(0); } @@ -95,28 +99,24 @@ public: int w=100; // some defaults int h=100; GetClientSize(&w, &h); - if ((alpha != m_Amount) || (m_MaxWidthrect.Inside(x,y)) + if (item->rect.Contains(x,y)) result = item; } @@ -611,8 +641,7 @@ void wxFrameManager::SetManagedWindow(wxWindow* frame) // frame activated and highlighted as such... m_hint_wnd = new wxMiniFrame(m_frame, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(1,1), wxFRAME_FLOAT_ON_PARENT - | wxFRAME_TOOL_WINDOW - | wxCAPTION ); + | wxFRAME_TOOL_WINDOW ); // Can't set the bg colour of a Frame in wxMac wxPanel* p = new wxPanel(m_hint_wnd); @@ -876,7 +905,9 @@ bool wxFrameManager::DetachPane(wxWindow* window) // reduce flicker p.window->SetSize(1,1); - p.frame->Show(false); + + if (p.frame->IsShown()) + p.frame->Show(false); // reparent to m_frame and destroy the pane p.window->Reparent(m_frame); @@ -977,10 +1008,10 @@ void wxFrameManager::LoadPaneInfo(wxString pane_part, wxPaneInfo &pane) val_name.Trim(false); value.Trim(true); value.Trim(false); - + if (val_name.empty()) break; - + if (val_name == wxT("name")) pane.name = value; else if (val_name == wxT("caption")) @@ -1945,7 +1976,9 @@ void wxFrameManager::Update() // reduce flicker p.window->SetSize(1,1); - p.frame->Show(false); + + if (p.frame->IsShown()) + p.frame->Show(false); // reparent to m_frame and destroy the pane p.window->Reparent(m_frame); @@ -1987,10 +2020,8 @@ void wxFrameManager::Update() frame->SetPaneWindow(p); p.frame = frame; - if (p.IsShown()) - { + if (p.IsShown() && !frame->IsShown()) frame->Show(); - } } else { @@ -2010,7 +2041,8 @@ void wxFrameManager::Update() } else { - p.window->Show(p.IsShown()); + if (p.window->IsShown() != p.IsShown()) + p.window->Show(p.IsShown()); } // if "active panes" are no longer allowed, clear @@ -2282,11 +2314,7 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, if (pt.x < layer_insert_offset && pt.x > layer_insert_offset-auiLayerInsertPixels) { - int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_LEFT), - GetMaxLayer(docks, wxAUI_DOCK_BOTTOM)), - GetMaxLayer(docks, wxAUI_DOCK_TOP)) + 1; drop.Dock().Left(). - Layer(new_layer). Row(0). Position(pt.y - GetDockPixelOffset(drop) - offset.y); return ProcessDockResult(target, drop); @@ -2294,11 +2322,7 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, else if (pt.y < layer_insert_offset && pt.y > layer_insert_offset-auiLayerInsertPixels) { - int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_TOP), - GetMaxLayer(docks, wxAUI_DOCK_LEFT)), - GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1; drop.Dock().Top(). - Layer(new_layer). Row(0). Position(pt.x - GetDockPixelOffset(drop) - offset.x); return ProcessDockResult(target, drop); @@ -2306,11 +2330,7 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, else if (pt.x >= cli_size.x - layer_insert_offset && pt.x < cli_size.x - layer_insert_offset + auiLayerInsertPixels) { - int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_RIGHT), - GetMaxLayer(docks, wxAUI_DOCK_TOP)), - GetMaxLayer(docks, wxAUI_DOCK_BOTTOM)) + 1; drop.Dock().Right(). - Layer(new_layer). Row(0). Position(pt.y - GetDockPixelOffset(drop) - offset.y); return ProcessDockResult(target, drop); @@ -2318,9 +2338,10 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, else if (pt.y >= cli_size.y - layer_insert_offset && pt.y < cli_size.y - layer_insert_offset + auiLayerInsertPixels) { - int new_layer = wxMax(wxMax(GetMaxLayer(docks, wxAUI_DOCK_BOTTOM), - GetMaxLayer(docks, wxAUI_DOCK_LEFT)), - GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1; + int new_layer = wxMax( wxMax( GetMaxLayer(docks, wxAUI_DOCK_BOTTOM), + GetMaxLayer(docks, wxAUI_DOCK_LEFT)), + GetMaxLayer(docks, wxAUI_DOCK_RIGHT)) + 1; + drop.Dock().Bottom(). Layer(new_layer). Row(0). @@ -2328,7 +2349,6 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, return ProcessDockResult(target, drop); } - wxDockUIPart* part = HitTest(pt.x, pt.y); @@ -2336,8 +2356,7 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, { if (!part || !part->dock) return false; - - + // calculate the offset from where the dock begins // to the point where the user dropped the pane int dock_drop_offset = 0; @@ -2352,16 +2371,39 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, // should float if being dragged over center pane windows if (!part->dock->fixed || part->dock->dock_direction == wxAUI_DOCK_CENTER) { - if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) && + if (m_last_rect.IsEmpty() || m_last_rect.Contains(pt.x, pt.y )) + { + m_skipping = true; + } + else + { + if ((m_flags & wxAUI_MGR_ALLOW_FLOATING) && (drop.IsFloatable() || (part->dock->dock_direction != wxAUI_DOCK_CENTER && part->dock->dock_direction != wxAUI_DOCK_NONE))) - { - drop.Float(); + { + drop.Float(); + } + + m_skipping = false; + + return ProcessDockResult(target, drop); } + + drop.Position(pt.x - GetDockPixelOffset(drop) - offset.x); return ProcessDockResult(target, drop); } + else + { + m_skipping = false; + } + + if (!m_skipping) + { + m_last_rect = part->dock->rect; + m_last_rect.Inflate( 15, 15 ); + } drop.Dock(). Direction(part->dock->dock_direction). @@ -2370,15 +2412,26 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, Position(dock_drop_offset); if (( - ((pt.y < part->dock->rect.y + 2) && part->dock->IsHorizontal()) || - ((pt.x < part->dock->rect.x + 2) && part->dock->IsVertical()) + ((pt.y < part->dock->rect.y + 1) && part->dock->IsHorizontal()) || + ((pt.x < part->dock->rect.x + 1) && part->dock->IsVertical()) ) && part->dock->panes.GetCount() > 1) { - int row = drop.dock_row; - DoInsertDockRow(panes, part->dock->dock_direction, - part->dock->dock_layer, - part->dock->dock_row); - drop.dock_row = row; + if ((part->dock->dock_direction == wxAUI_DOCK_TOP) || + (part->dock->dock_direction == wxAUI_DOCK_LEFT)) + { + int row = drop.dock_row; + DoInsertDockRow(panes, part->dock->dock_direction, + part->dock->dock_layer, + part->dock->dock_row); + drop.dock_row = row; + } + else + { + DoInsertDockRow(panes, part->dock->dock_direction, + part->dock->dock_layer, + part->dock->dock_row+1); + drop.dock_row = part->dock->dock_row+1; + } } if (( @@ -2386,10 +2439,22 @@ bool wxFrameManager::DoDrop(wxDockInfoArray& docks, ((pt.x > part->dock->rect.x + part->dock->rect.width - 2 ) && part->dock->IsVertical()) ) && part->dock->panes.GetCount() > 1) { - DoInsertDockRow(panes, part->dock->dock_direction, - part->dock->dock_layer, - part->dock->dock_row+1); - drop.dock_row = part->dock->dock_row+1; + if ((part->dock->dock_direction == wxAUI_DOCK_TOP) || + (part->dock->dock_direction == wxAUI_DOCK_LEFT)) + { + DoInsertDockRow(panes, part->dock->dock_direction, + part->dock->dock_layer, + part->dock->dock_row+1); + drop.dock_row = part->dock->dock_row+1; + } + else + { + int row = drop.dock_row; + DoInsertDockRow(panes, part->dock->dock_direction, + part->dock->dock_layer, + part->dock->dock_row); + drop.dock_row = row; + } } return ProcessDockResult(target, drop); @@ -2639,6 +2704,8 @@ void wxFrameManager::ShowHint(const wxRect& rect) ) m_hint_fadeamt = 0; + m_hint_wnd->SetSize(rect); + if (! m_hint_wnd->IsShown()) m_hint_wnd->Show(); @@ -2653,7 +2720,6 @@ void wxFrameManager::ShowHint(const wxRect& rect) if (m_hint_wnd->IsKindOf(CLASSINFO(wxPseudoTransparentFrame))) ((wxPseudoTransparentFrame *)m_hint_wnd)->SetTransparent(m_hint_fadeamt); #endif - m_hint_wnd->SetSize(rect); m_hint_wnd->Raise(); @@ -2724,7 +2790,8 @@ void wxFrameManager::HideHint() // hides a transparent window hint, if there is one if (m_hint_wnd) { - m_hint_wnd->Show(false); + if (m_hint_wnd->IsShown()) + m_hint_wnd->Show(false); #if wxCHECK_VERSION(2,7,0) m_hint_wnd->SetTransparent(0); #else @@ -2842,13 +2909,48 @@ void wxFrameManager::OnFloatingPaneMoveStart(wxWindow* wnd) #endif } -void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd) +void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd, wxDirection dir) { // try to find the pane wxPaneInfo& pane = GetPane(wnd); wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found")); wxPoint pt = ::wxGetMousePosition(); + +#if 0 + // Adapt pt to direction + if (dir == wxNORTH) + { + // move to pane's upper border + wxPoint pos( 0,0 ); + pos = wnd->ClientToScreen( pos ); + pt.y = pos.y; + // and some more pixels for the title bar + pt.y -= 5; + } else + if (dir == wxWEST) + { + // move to pane's left border + wxPoint pos( 0,0 ); + pos = wnd->ClientToScreen( pos ); + pt.x = pos.x; + } else + if (dir == wxEAST) + { + // move to pane's right border + wxPoint pos( wnd->GetSize().x, 0 ); + pos = wnd->ClientToScreen( pos ); + pt.x = pos.x; + } else + if (dir == wxSOUTH) + { + // move to pane's bottom border + wxPoint pos( 0, wnd->GetSize().y ); + pos = wnd->ClientToScreen( pos ); + pt.y = pos.y; + } +#endif + wxPoint client_pt = m_frame->ScreenToClient(pt); // calculate the offset from the upper left-hand corner @@ -2908,13 +3010,48 @@ void wxFrameManager::OnFloatingPaneMoving(wxWindow* wnd) m_frame->Update(); } -void wxFrameManager::OnFloatingPaneMoved(wxWindow* wnd) +void wxFrameManager::OnFloatingPaneMoved(wxWindow* wnd, wxDirection dir) { // try to find the pane wxPaneInfo& pane = GetPane(wnd); wxASSERT_MSG(pane.IsOk(), wxT("Pane window not found")); wxPoint pt = ::wxGetMousePosition(); + +#if 0 + // Adapt pt to direction + if (dir == wxNORTH) + { + // move to pane's upper border + wxPoint pos( 0,0 ); + pos = wnd->ClientToScreen( pos ); + pt.y = pos.y; + // and some more pixels for the title bar + pt.y -= 10; + } else + if (dir == wxWEST) + { + // move to pane's left border + wxPoint pos( 0,0 ); + pos = wnd->ClientToScreen( pos ); + pt.x = pos.x; + } else + if (dir == wxEAST) + { + // move to pane's right border + wxPoint pos( wnd->GetSize().x, 0 ); + pos = wnd->ClientToScreen( pos ); + pt.x = pos.x; + } else + if (dir == wxSOUTH) + { + // move to pane's bottom border + wxPoint pos( 0, wnd->GetSize().y ); + pos = wnd->ClientToScreen( pos ); + pt.y = pos.y; + } +#endif + wxPoint client_pt = m_frame->ScreenToClient(pt); // calculate the offset from the upper left-hand corner @@ -2980,7 +3117,8 @@ void wxFrameManager::OnFloatingPaneClosed(wxWindow* wnd, wxCloseEvent& evt) { // reparent the pane window back to us and // prepare the frame window for destruction - pane.window->Show(false); + if (pane.window->IsShown()) + pane.window->Show(false); pane.window->Reparent(m_frame); pane.frame = NULL; pane.Hide(); @@ -3026,22 +3164,22 @@ void wxFrameManager::OnRender(wxFrameManagerEvent& evt) { case wxDockUIPart::typeDockSizer: case wxDockUIPart::typePaneSizer: - m_art->DrawSash(*dc, part.orientation, part.rect); + m_art->DrawSash(*dc, m_frame, part.orientation, part.rect); break; case wxDockUIPart::typeBackground: - m_art->DrawBackground(*dc, part.orientation, part.rect); + m_art->DrawBackground(*dc, m_frame, part.orientation, part.rect); break; case wxDockUIPart::typeCaption: - m_art->DrawCaption(*dc, part.pane->caption, part.rect, *part.pane); + m_art->DrawCaption(*dc, m_frame, part.pane->caption, part.rect, *part.pane); break; case wxDockUIPart::typeGripper: - m_art->DrawGripper(*dc, part.rect, *part.pane); + m_art->DrawGripper(*dc, m_frame, part.rect, *part.pane); break; case wxDockUIPart::typePaneBorder: - m_art->DrawBorder(*dc, part.rect, *part.pane); + m_art->DrawBorder(*dc, m_frame, part.rect, *part.pane); break; case wxDockUIPart::typePaneButton: - m_art->DrawPaneButton(*dc, part.button->button_id, + m_art->DrawPaneButton(*dc, m_frame, part.button->button_id, wxAUI_BUTTON_STATE_NORMAL, part.rect, *part.pane); break; } @@ -3114,13 +3252,14 @@ void wxFrameManager::OnEraseBackground(wxEraseEvent& event) #endif } -void wxFrameManager::OnSize(wxSizeEvent& WXUNUSED(event)) +void wxFrameManager::OnSize(wxSizeEvent& event) { if (m_frame) { DoFrameLayout(); Repaint(); } + event.Skip(); } @@ -3191,7 +3330,7 @@ void wxFrameManager::UpdateButtonOnScreen(wxDockUIPart* button_ui_part, if (pt.x != 0 || pt.y != 0) cdc.SetDeviceOrigin(pt.x, pt.y); - m_art->DrawPaneButton(cdc, + m_art->DrawPaneButton(cdc, m_frame, button_ui_part->button->button_id, state, button_ui_part->rect,