X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fxywindow.cpp;h=3470f861b0834c25f984a62caf646eb0461cea7c;hb=2ce2d42b275b2a710227b375e495a817799fe2a6;hp=17141af554c832a5b012b91795061ee99bd3aa14;hpb=cbbeee54a1cc625adb39513a0200635b97266d9c;p=xonotic%2Fnetradiant.git diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index 17141af5..3470f861 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -349,6 +349,8 @@ struct xywindow_globals_private_t bool m_bChaseMouse; bool m_bSizePaint; + bool g_bCrossHairs; + xywindow_globals_private_t() : d_showgrid( true ), @@ -364,7 +366,9 @@ struct xywindow_globals_private_t m_bCamXYUpdate( true ), m_bChaseMouse( true ), - m_bSizePaint( true ){ + m_bSizePaint( true ), + + g_bCrossHairs( false ){ } }; @@ -497,17 +501,17 @@ void XYWnd::SetScale( float f ){ XYWnd_Update( *this ); } -void XYWnd_ZoomIn( XYWnd* xy ){ +void XYWnd::ZoomIn(){ float max_scale = 64; - float scale = xy->Scale() * 5.0f / 4.0f; + float scale = Scale() * 5.0f / 4.0f; if ( scale > max_scale ) { - if ( xy->Scale() != max_scale ) { - xy->SetScale( max_scale ); + if ( Scale() != max_scale ) { + SetScale( max_scale ); } } else { - xy->SetScale( scale ); + SetScale( scale ); } } @@ -515,17 +519,31 @@ void XYWnd_ZoomIn( XYWnd* xy ){ // NOTE: the zoom out factor is 4/5, we could think about customizing it // we don't go below a zoom factor corresponding to 10% of the max world size // (this has to be computed against the window size) -void XYWnd_ZoomOut( XYWnd* xy ){ - float min_scale = MIN( xy->Width(),xy->Height() ) / ( 1.1f * ( g_MaxWorldCoord - g_MinWorldCoord ) ); - float scale = xy->Scale() * 4.0f / 5.0f; +void XYWnd::ZoomOut(){ + float min_scale = MIN( Width(), Height() ) / ( 1.1f * ( g_MaxWorldCoord - g_MinWorldCoord ) ); + float scale = Scale() * 4.0f / 5.0f; if ( scale < min_scale ) { - if ( xy->Scale() != min_scale ) { - xy->SetScale( min_scale ); + if ( Scale() != min_scale ) { + SetScale( min_scale ); } } else { - xy->SetScale( scale ); + SetScale( scale ); + } +} + +void XYWnd::ZoomInWithMouse( int pointx, int pointy ){ + float old_scale = Scale(); + ZoomIn(); + if ( g_xywindow_globals.m_bImprovedWheelZoom ) { + float scale_diff = 1.0 / old_scale - 1.0 / Scale(); + int nDim1 = ( m_viewType == YZ ) ? 1 : 0; + int nDim2 = ( m_viewType == XY ) ? 1 : 2; + Vector3 origin = GetOrigin(); + origin[nDim1] += scale_diff * (pointx - 0.5 * Width()); + origin[nDim2] -= scale_diff * (pointy - 0.5 * Height()); + SetOrigin( origin ); } } @@ -551,8 +569,6 @@ VIEWTYPE GlobalXYWnd_getCurrentViewType(){ // ============================================================================= // variables -bool g_bCrossHairs = false; - ui::Menu XYWnd::m_mnuDrop(ui::null); // this is disabled, and broken @@ -723,7 +739,16 @@ Shader* XYWnd::m_state_selected = 0; void xy_update_xor_rectangle( XYWnd& self, rect_t area ){ if ( self.GetWidget().visible() ) { - self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.Width(), self.Height() ) ); + rectangle_t rect = rectangle_from_area( area.min, area.max, self.Width(), self.Height() ); + int nDim1 = ( self.GetViewType() == YZ ) ? 1 : 0; + int nDim2 = ( self.GetViewType() == XY ) ? 1 : 2; + rect.x /= self.Scale(); + rect.y /= self.Scale(); + rect.w /= self.Scale(); + rect.h /= self.Scale(); + rect.x += self.GetOrigin()[nDim1]; + rect.y += self.GetOrigin()[nDim2]; + self.m_XORRectangle.set( rect ); } } @@ -765,10 +790,10 @@ void xywnd_motion( gdouble x, gdouble y, guint state, void* data ){ gboolean xywnd_wheel_scroll( ui::Widget widget, GdkEventScroll* event, XYWnd* xywnd ){ if ( event->direction == GDK_SCROLL_UP ) { - XYWnd_ZoomIn( xywnd ); + xywnd->ZoomInWithMouse( (int)event->x, (int)event->y ); } else if ( event->direction == GDK_SCROLL_DOWN ) { - XYWnd_ZoomOut( xywnd ); + xywnd->ZoomOut(); } return FALSE; } @@ -1209,16 +1234,15 @@ int g_dragZoom = 0; void XYWnd_zoomDelta( int x, int y, unsigned int state, void* data ){ if ( y != 0 ) { g_dragZoom += y; - while ( abs( g_dragZoom ) > 8 ) { if ( g_dragZoom > 0 ) { - XYWnd_ZoomOut( reinterpret_cast( data ) ); + reinterpret_cast( data )->ZoomOut(); g_dragZoom -= 8; } else { - XYWnd_ZoomIn( reinterpret_cast( data ) ); + reinterpret_cast( data )->ZoomIn(); g_dragZoom += 8; } } @@ -1365,7 +1389,7 @@ void XYWnd::XY_MouseMoved( int x, int y, unsigned int buttons ){ << " z:: " << FloatFormat( m_mousePosition[2], 6, 1 ); g_pParentWnd->SetStatusText( g_pParentWnd->m_position_status, status.c_str() ); - if ( g_bCrossHairs ) { + if ( g_xywindow_globals_private.g_bCrossHairs ) { XYWnd_Update( *this ); } @@ -2311,7 +2335,7 @@ void XYWnd::XY_Draw(){ PaintSizeInfo( nDim1, nDim2, min, max ); } - if ( g_bCrossHairs ) { + if ( g_xywindow_globals_private.g_bCrossHairs ) { glColor4f( 0.2f, 0.9f, 0.2f, 0.8f ); glBegin( GL_LINES ); if ( m_viewType == XY ) { @@ -2528,20 +2552,20 @@ void XY_Zoom100(){ } void XY_ZoomIn(){ - XYWnd_ZoomIn( g_pParentWnd->ActiveXY() ); + g_pParentWnd->ActiveXY()->ZoomIn(); } // NOTE: the zoom out factor is 4/5, we could think about customizing it // we don't go below a zoom factor corresponding to 10% of the max world size // (this has to be computed against the window size) void XY_ZoomOut(){ - XYWnd_ZoomOut( g_pParentWnd->ActiveXY() ); + g_pParentWnd->ActiveXY()->ZoomOut(); } void ToggleShowCrosshair(){ - g_bCrossHairs ^= 1; + g_xywindow_globals_private.g_bCrossHairs ^= 1; XY_UpdateAllWindows(); } @@ -2775,8 +2799,10 @@ void XYWindow_Construct(){ GlobalPreferenceSystem().registerPreference( "ClipCaulk", make_property_string( g_clip_useCaulk ) ); GlobalPreferenceSystem().registerPreference( "NewRightClick", make_property_string( g_xywindow_globals.m_bRightClick ) ); + GlobalPreferenceSystem().registerPreference( "ImprovedWheelZoom", make_property_string( g_xywindow_globals.m_bImprovedWheelZoom ) ); GlobalPreferenceSystem().registerPreference( "ChaseMouse", make_property_string( g_xywindow_globals_private.m_bChaseMouse ) ); GlobalPreferenceSystem().registerPreference( "SizePainting", make_property_string( g_xywindow_globals_private.m_bSizePaint ) ); + GlobalPreferenceSystem().registerPreference( "ShowCrosshair", make_property_string( g_xywindow_globals_private.g_bCrossHairs ) ); GlobalPreferenceSystem().registerPreference( "NoStipple", make_property_string( g_xywindow_globals.m_bNoStipple ) ); GlobalPreferenceSystem().registerPreference( "SI_ShowCoords", make_property_string( g_xywindow_globals_private.show_coordinates ) ); GlobalPreferenceSystem().registerPreference( "SI_ShowOutlines", make_property_string( g_xywindow_globals_private.show_outline ) );