1. implemented system menu handling in wxUniv (win32 theme only)
2. fixes to interactive moving/resizing in wxUniv git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14572 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
8014db4142
commit
71cb2ca1e3
@ -923,7 +923,7 @@ enum wxBorder
|
|||||||
wxMINIMIZE_BOX | wxMAXIMIZE_BOX | \
|
wxMINIMIZE_BOX | wxMAXIMIZE_BOX | \
|
||||||
wxCAPTION | wxCLIP_CHILDREN)
|
wxCAPTION | wxCLIP_CHILDREN)
|
||||||
|
|
||||||
#if defined(__WXMSW__) || defined(__WXPM__)
|
#if defined(__WXMSW__) || defined(__WXPM__) || defined(__WXMGL__)
|
||||||
# define wxDEFAULT_DIALOG_STYLE (wxSYSTEM_MENU | wxCAPTION)
|
# define wxDEFAULT_DIALOG_STYLE (wxSYSTEM_MENU | wxCAPTION)
|
||||||
#else
|
#else
|
||||||
// Under Unix, the dialogs don't have a system menu. Specifying wxSYSTEM_MENU
|
// Under Unix, the dialogs don't have a system menu. Specifying wxSYSTEM_MENU
|
||||||
@ -1232,8 +1232,18 @@ enum wxBorder
|
|||||||
#define wxID_RETRY 5116
|
#define wxID_RETRY 5116
|
||||||
#define wxID_IGNORE 5117
|
#define wxID_IGNORE 5117
|
||||||
|
|
||||||
// IDs used by generic file dialog (11 consecutive starting from this value)
|
// System menu IDs (used by wxUniv):
|
||||||
|
#define wxID_SYSTEM_MENU 5200
|
||||||
|
#define wxID_CLOSE_FRAME 5201
|
||||||
|
#define wxID_MOVE_FRAME 5202
|
||||||
|
#define wxID_RESIZE_FRAME 5203
|
||||||
|
#define wxID_MAXIMIZE_FRAME 5204
|
||||||
|
#define wxID_ICONIZE_FRAME 5205
|
||||||
|
#define wxID_RESTORE_FRAME 5206
|
||||||
|
|
||||||
|
// IDs used by generic file dialog (13 consecutive starting from this value)
|
||||||
#define wxID_FILEDLGG 5900
|
#define wxID_FILEDLGG 5900
|
||||||
|
|
||||||
#define wxID_HIGHEST 5999
|
#define wxID_HIGHEST 5999
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@ -155,6 +155,7 @@ protected:
|
|||||||
|
|
||||||
void RefreshTitleBar();
|
void RefreshTitleBar();
|
||||||
void OnNcPaint(wxPaintEvent& event);
|
void OnNcPaint(wxPaintEvent& event);
|
||||||
|
void OnSystemMenu(wxCommandEvent& event);
|
||||||
|
|
||||||
// TRUE if wxTLW should render decorations (aka titlebar) itself
|
// TRUE if wxTLW should render decorations (aka titlebar) itself
|
||||||
static int ms_drawDecorations;
|
static int ms_drawDecorations;
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative)
|
BEGIN_EVENT_TABLE(wxTopLevelWindow, wxTopLevelWindowNative)
|
||||||
WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow)
|
WX_EVENT_TABLE_INPUT_CONSUMER(wxTopLevelWindow)
|
||||||
EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint)
|
EVT_NC_PAINT(wxTopLevelWindow::OnNcPaint)
|
||||||
|
EVT_MENU_RANGE(wxID_CLOSE_FRAME, wxID_RESTORE_FRAME, wxTopLevelWindow::OnSystemMenu)
|
||||||
END_EVENT_TABLE()
|
END_EVENT_TABLE()
|
||||||
|
|
||||||
WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow)
|
WX_FORWARD_TO_INPUT_CONSUMER(wxTopLevelWindow)
|
||||||
@ -340,6 +341,7 @@ struct wxInteractiveMoveData
|
|||||||
wxRect m_rectOrig;
|
wxRect m_rectOrig;
|
||||||
wxPoint m_pos;
|
wxPoint m_pos;
|
||||||
wxSize m_minSize, m_maxSize;
|
wxSize m_minSize, m_maxSize;
|
||||||
|
bool m_sizingCursor;
|
||||||
};
|
};
|
||||||
|
|
||||||
class wxInteractiveMoveHandler : public wxEvtHandler
|
class wxInteractiveMoveHandler : public wxEvtHandler
|
||||||
@ -439,19 +441,12 @@ void wxInteractiveMoveHandler::OnMouseDown(wxMouseEvent& event)
|
|||||||
{
|
{
|
||||||
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
|
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
|
||||||
{
|
{
|
||||||
m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
|
m_data.m_evtLoop->Exit();
|
||||||
m_data.m_pos = wxGetMousePosition();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
|
void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
|
||||||
{
|
{
|
||||||
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
|
|
||||||
{
|
|
||||||
m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
|
|
||||||
m_data.m_pos = wxGetMousePosition();
|
|
||||||
}
|
|
||||||
|
|
||||||
wxPoint diff(-1,-1);
|
wxPoint diff(-1,-1);
|
||||||
|
|
||||||
switch ( event.GetKeyCode() )
|
switch ( event.GetKeyCode() )
|
||||||
@ -471,28 +466,83 @@ void wxInteractiveMoveHandler::OnKeyDown(wxKeyEvent& event)
|
|||||||
|
|
||||||
if ( diff.x != -1 )
|
if ( diff.x != -1 )
|
||||||
{
|
{
|
||||||
|
if ( m_data.m_flags & wxINTERACTIVE_WAIT_FOR_INPUT )
|
||||||
|
{
|
||||||
|
m_data.m_flags &= ~wxINTERACTIVE_WAIT_FOR_INPUT;
|
||||||
|
if ( m_data.m_sizingCursor )
|
||||||
|
{
|
||||||
|
wxEndBusyCursor();
|
||||||
|
m_data.m_sizingCursor = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
|
||||||
|
{
|
||||||
|
m_data.m_pos = m_data.m_window->GetPosition() +
|
||||||
|
wxPoint(m_data.m_window->GetSize().x/2, 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
wxPoint warp;
|
||||||
|
|
||||||
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
|
if ( m_data.m_flags & wxINTERACTIVE_MOVE )
|
||||||
{
|
{
|
||||||
m_data.m_rect.Offset(diff);
|
m_data.m_rect.Offset(diff);
|
||||||
m_data.m_window->Move(m_data.m_rect.GetPosition());
|
m_data.m_window->Move(m_data.m_rect.GetPosition());
|
||||||
|
warp = wxPoint(m_data.m_window->GetSize().x/2, 8);
|
||||||
}
|
}
|
||||||
else /* wxINTERACTIVE_RESIZE */
|
else /* wxINTERACTIVE_RESIZE */
|
||||||
{
|
{
|
||||||
if ( !(m_data.m_flags & wxINTERACTIVE_RESIZE_DIR) )
|
if ( !(m_data.m_flags &
|
||||||
|
(wxINTERACTIVE_RESIZE_N | wxINTERACTIVE_RESIZE_S)) )
|
||||||
{
|
{
|
||||||
if ( diff.y < 0 )
|
if ( diff.y < 0 )
|
||||||
|
{
|
||||||
m_data.m_flags |= wxINTERACTIVE_RESIZE_N;
|
m_data.m_flags |= wxINTERACTIVE_RESIZE_N;
|
||||||
|
m_data.m_pos.y = m_data.m_window->GetPosition().y;
|
||||||
|
}
|
||||||
else if ( diff.y > 0 )
|
else if ( diff.y > 0 )
|
||||||
|
{
|
||||||
m_data.m_flags |= wxINTERACTIVE_RESIZE_S;
|
m_data.m_flags |= wxINTERACTIVE_RESIZE_S;
|
||||||
if ( diff.x < 0 )
|
m_data.m_pos.y = m_data.m_window->GetPosition().y +
|
||||||
m_data.m_flags |= wxINTERACTIVE_RESIZE_W;
|
m_data.m_window->GetSize().y;
|
||||||
else if ( diff.x > 0 )
|
}
|
||||||
m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
|
|
||||||
}
|
}
|
||||||
|
if ( !(m_data.m_flags &
|
||||||
|
(wxINTERACTIVE_RESIZE_W | wxINTERACTIVE_RESIZE_E)) )
|
||||||
|
{
|
||||||
|
if ( diff.x < 0 )
|
||||||
|
{
|
||||||
|
m_data.m_flags |= wxINTERACTIVE_RESIZE_W;
|
||||||
|
m_data.m_pos.x = m_data.m_window->GetPosition().x;
|
||||||
|
}
|
||||||
|
else if ( diff.x > 0 )
|
||||||
|
{
|
||||||
|
m_data.m_flags |= wxINTERACTIVE_RESIZE_E;
|
||||||
|
m_data.m_pos.x = m_data.m_window->GetPosition().x +
|
||||||
|
m_data.m_window->GetSize().x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wxApplyResize(m_data, diff);
|
wxApplyResize(m_data, diff);
|
||||||
m_data.m_window->SetSize(m_data.m_rect);
|
m_data.m_window->SetSize(m_data.m_rect);
|
||||||
|
|
||||||
|
if ( m_data.m_flags & wxINTERACTIVE_RESIZE_W )
|
||||||
|
warp.x = 0;
|
||||||
|
else if ( m_data.m_flags & wxINTERACTIVE_RESIZE_E )
|
||||||
|
warp.x = m_data.m_window->GetSize().x-1;
|
||||||
|
else
|
||||||
|
warp.x = wxGetMousePosition().x - m_data.m_window->GetPosition().x;
|
||||||
|
|
||||||
|
if ( m_data.m_flags & wxINTERACTIVE_RESIZE_N )
|
||||||
|
warp.y = 0;
|
||||||
|
else if ( m_data.m_flags & wxINTERACTIVE_RESIZE_S )
|
||||||
|
warp.y = m_data.m_window->GetSize().y-1;
|
||||||
|
else
|
||||||
|
warp.y = wxGetMousePosition().y - m_data.m_window->GetPosition().y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
warp -= m_data.m_window->GetClientAreaOrigin();
|
||||||
|
m_data.m_window->WarpPointer(warp.x, warp.y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -514,9 +564,19 @@ void wxTopLevelWindow::InteractiveMove(int flags)
|
|||||||
|
|
||||||
wxInteractiveMoveData data;
|
wxInteractiveMoveData data;
|
||||||
wxEventLoop loop;
|
wxEventLoop loop;
|
||||||
wxWindow *focus = FindFocus();
|
|
||||||
|
|
||||||
// FIXME - display resize cursor if waiting for initial input
|
SetFocus();
|
||||||
|
|
||||||
|
#ifndef __WXGTK__
|
||||||
|
if ( flags & wxINTERACTIVE_WAIT_FOR_INPUT )
|
||||||
|
{
|
||||||
|
wxCursor sizingCursor(wxCURSOR_SIZING);
|
||||||
|
wxBeginBusyCursor(&sizingCursor);
|
||||||
|
data.m_sizingCursor = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
data.m_sizingCursor = FALSE;
|
||||||
|
|
||||||
data.m_window = this;
|
data.m_window = this;
|
||||||
data.m_evtLoop = &loop;
|
data.m_evtLoop = &loop;
|
||||||
@ -526,17 +586,18 @@ void wxTopLevelWindow::InteractiveMove(int flags)
|
|||||||
data.m_minSize = wxSize(GetMinWidth(), GetMinHeight());
|
data.m_minSize = wxSize(GetMinWidth(), GetMinHeight());
|
||||||
data.m_maxSize = wxSize(GetMaxWidth(), GetMaxHeight());
|
data.m_maxSize = wxSize(GetMaxWidth(), GetMaxHeight());
|
||||||
|
|
||||||
this->PushEventHandler(new wxInteractiveMoveHandler(data));
|
wxEvtHandler *handler = new wxInteractiveMoveHandler(data);
|
||||||
if ( focus )
|
this->PushEventHandler(handler);
|
||||||
focus->PushEventHandler(new wxInteractiveMoveHandler(data));
|
|
||||||
|
|
||||||
CaptureMouse();
|
CaptureMouse();
|
||||||
loop.Run();
|
loop.Run();
|
||||||
ReleaseMouse();
|
ReleaseMouse();
|
||||||
|
|
||||||
this->PopEventHandler(TRUE/*delete*/);
|
this->RemoveEventHandler(handler);
|
||||||
if ( focus )
|
delete handler;
|
||||||
focus->PopEventHandler(TRUE/*delete*/);
|
|
||||||
|
if ( data.m_sizingCursor )
|
||||||
|
wxEndBusyCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -639,6 +700,43 @@ bool wxTopLevelWindow::PerformAction(const wxControlAction& action,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxTopLevelWindow::OnSystemMenu(wxCommandEvent& event)
|
||||||
|
{
|
||||||
|
bool ret = TRUE;
|
||||||
|
|
||||||
|
switch (event.GetId())
|
||||||
|
{
|
||||||
|
case wxID_CLOSE_FRAME:
|
||||||
|
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
|
||||||
|
wxTOPLEVEL_BUTTON_CLOSE);
|
||||||
|
break;
|
||||||
|
case wxID_MOVE_FRAME:
|
||||||
|
InteractiveMove(wxINTERACTIVE_MOVE | wxINTERACTIVE_WAIT_FOR_INPUT);
|
||||||
|
break;
|
||||||
|
case wxID_RESIZE_FRAME:
|
||||||
|
InteractiveMove(wxINTERACTIVE_RESIZE | wxINTERACTIVE_WAIT_FOR_INPUT);
|
||||||
|
break;
|
||||||
|
case wxID_MAXIMIZE_FRAME:
|
||||||
|
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
|
||||||
|
wxTOPLEVEL_BUTTON_MAXIMIZE);
|
||||||
|
break;
|
||||||
|
case wxID_ICONIZE_FRAME:
|
||||||
|
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
|
||||||
|
wxTOPLEVEL_BUTTON_ICONIZE);
|
||||||
|
break;
|
||||||
|
case wxID_RESTORE_FRAME:
|
||||||
|
ret = PerformAction(wxACTION_TOPLEVEL_BUTTON_CLICK,
|
||||||
|
wxTOPLEVEL_BUTTON_RESTORE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !ret )
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
|
// wxStdFrameInputHandler: handles focus, resizing and titlebar buttons clicks
|
||||||
|
Loading…
Reference in New Issue
Block a user