diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index a5ac5885..54617155 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -751,6 +751,8 @@ CameraView& getCameraView(){ return m_cameraview; } +guint32 m_rightClickTime; + private: void Cam_Draw(); }; @@ -825,9 +827,40 @@ void Camera_setAngles( CamWnd& camwnd, const Vector3& angles ){ // ============================================================================= // CamWnd class +void context_menu(){ + if( g_pParentWnd->ActiveXY() ){ + g_pParentWnd->ActiveXY()->OnContextMenu(); + g_bCamEntityMenu = true; + } +} + +/* GDK_2BUTTON_PRESS doesn't always work in this case, so... */ +bool context_menu_try( GdkEventButton* event, CamWnd* camwnd ){ + if( ( event->time - camwnd->m_rightClickTime ) < 200 ){ + camwnd->m_rightClickTime = event->time; + return true; + } + else{ + camwnd->m_rightClickTime = event->time; + return false; + } +} + gboolean enable_freelook_button_press( GtkWidget* widget, GdkEventButton* event, CamWnd* camwnd ){ if ( event->type == GDK_BUTTON_PRESS && event->button == 3 && modifiers_for_state( event->state ) == c_modifierNone ) { - camwnd->EnableFreeMove(); + if( context_menu_try( event, camwnd ) ){ + //need this hack, otherwise button wont be released = global accels broken, until correct button pressed again... + GdkEvent* event_ = gtk_get_current_event(); + if( event_ ){ + event_->type = GDK_BUTTON_RELEASE; + gtk_main_do_event( event_ ); + gdk_event_free( event_ ); + context_menu(); + } + } + else{ + camwnd->EnableFreeMove(); + } return TRUE; } return FALSE; @@ -836,6 +869,16 @@ gboolean enable_freelook_button_press( GtkWidget* widget, GdkEventButton* event, gboolean disable_freelook_button_press( GtkWidget* widget, GdkEventButton* event, CamWnd* camwnd ){ if ( event->type == GDK_BUTTON_PRESS && event->button == 3 && modifiers_for_state( event->state ) == c_modifierNone ) { camwnd->DisableFreeMove(); + if( context_menu_try( event, camwnd ) ){ + //need this hack, otherwise button wont be released = global accels broken, until correct button pressed again... + GdkEvent* event_ = gtk_get_current_event(); + if( event_ ){ + event_->type = GDK_BUTTON_RELEASE; + gtk_main_do_event( event_ ); + gdk_event_free( event_ ); + context_menu(); + } + } return TRUE; } return FALSE; @@ -1247,7 +1290,8 @@ CamWnd::CamWnd() : m_selection_button_release_handler( 0 ), m_selection_motion_handler( 0 ), m_freelook_button_press_handler( 0 ), - m_drawing( false ){ + m_drawing( false ), + m_rightClickTime( 0 ){ m_bFreeMove = false; GlobalWindowObservers_add( m_window_observer ); diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index dd0e45a3..2bfce1d5 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -76,6 +76,8 @@ void LoadTextureRGBA( qtexture_t* q, unsigned char* pPixels, int nWidth, int nHe // d1223m extern bool g_brush_always_caulk; +bool g_bCamEntityMenu = false; + //!\todo Rewrite. class ClipPoint { @@ -1190,7 +1192,25 @@ void entitycreate_activated( GtkWidget* item ){ const char* entity_name = gtk_label_get_text( GTK_LABEL( GTK_BIN( item )->child ) ); if ( !( world_node && string_equal( entity_name, "worldspawn" ) ) ) { - g_pParentWnd->ActiveXY()->OnEntityCreate( entity_name ); + if( g_bCamEntityMenu ){ + StringOutputStream command; + command << "entityCreate -class " << entity_name; + UndoableCommand undo( command.c_str() ); + + Vector3 angles( Camera_getAngles( *g_pParentWnd->GetCamWnd() ) ); + Vector3 radangles( degrees_to_radians( angles[0] ), degrees_to_radians( angles[1] ), degrees_to_radians( angles[2] ) ); + Vector3 viewvector; + viewvector[0] = cos( radangles[1] ) * cos( radangles[0] ); + viewvector[1] = sin( radangles[1] ) * cos( radangles[0] ); + viewvector[2] = sin( radangles[0] ); + + Vector3 point = viewvector * 64.f + Camera_getOrigin( *g_pParentWnd->GetCamWnd() ); + vector3_snap( point, GetSnapGridSize() ); + Entity_createFromSelection( entity_name, point ); + } + else{ + g_pParentWnd->ActiveXY()->OnEntityCreate( entity_name ); + } } else { GlobalRadiant().m_pfnMessageBox( GTK_WIDGET( MainFrame_getWindow() ), "There's already a worldspawn in your map!" @@ -1285,6 +1305,7 @@ void XYWnd::OnContextMenu(){ GlobalEntityClassManager().forEach( inserter ); } + g_bCamEntityMenu = false; gtk_menu_popup( m_mnuDrop, 0, 0, 0, 0, 1, GDK_CURRENT_TIME ); } diff --git a/radiant/xywindow.h b/radiant/xywindow.h index 5c25847d..5492b45b 100644 --- a/radiant/xywindow.h +++ b/radiant/xywindow.h @@ -34,6 +34,8 @@ #include "qerplugin.h" +extern bool g_bCamEntityMenu; + class Shader; class SelectionSystemWindowObserver; namespace scene @@ -205,13 +207,13 @@ VIEWTYPE m_viewType; void OriginalButtonUp( guint32 nFlags, int point, int pointy ); void OriginalButtonDown( guint32 nFlags, int point, int pointy ); -void OnContextMenu(); void PaintSizeInfo( int nDim1, int nDim2, Vector3& vMinBounds, Vector3& vMaxBounds ); int m_entityCreate_x, m_entityCreate_y; bool m_entityCreate; public: +void OnContextMenu(); void ButtonState_onMouseDown( unsigned int buttons ){ //m_buttonstate |= buttons; m_buttonstate = buttons;