bool m_bChaseMouse;
bool m_bSizePaint;
+ bool g_bCrossHairs;
+
xywindow_globals_private_t() :
d_showgrid( true ),
m_bCamXYUpdate( true ),
m_bChaseMouse( true ),
- m_bSizePaint( true ){
+ m_bSizePaint( true ),
+
+ g_bCrossHairs( false ){
}
};
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 );
}
}
// 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 );
}
}
// =============================================================================
// variables
-bool g_bCrossHairs = false;
-
ui::Menu XYWnd::m_mnuDrop(ui::null);
// this is disabled, and broken
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 );
}
}
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;
}
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<XYWnd*>( data ) );
+ reinterpret_cast<XYWnd*>( data )->ZoomOut();
g_dragZoom -= 8;
}
else
{
- XYWnd_ZoomIn( reinterpret_cast<XYWnd*>( data ) );
+ reinterpret_cast<XYWnd*>( data )->ZoomIn();
g_dragZoom += 8;
}
}
<< " 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 );
}
void WXY_BackgroundSelect( void ){
bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0;
if ( !brushesSelected ) {
- ui::root.window().alert( "You have to select some brushes to get the bounding box for.\n",
+ ui::alert( ui::root, "You have to select some brushes to get the bounding box for.\n",
"No selection", ui::alert_type::OK, ui::alert_icon::Error );
return;
}
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 ) {
}
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();
}
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 ) );