bool CUIWindow::AlignHintWndPos( Frect const& vis_rect, float border, float dx16pos ) //this = hint wnd { float const cursor_height = 43.0f; Fvector2 cursor_pos = GetUICursor()->GetCursorPosition(); if ( UI()->is_16_9_mode() ) { cursor_pos.x -= dx16pos; } if ( !vis_rect.in(cursor_pos) ) { return false; } Frect rect; rect.set( -border, -border, GetWidth() - 2.0f*border, GetHeight() - 2.0f*border ); rect.add( cursor_pos.x, cursor_pos.y ); rect.sub( 0.0f, rect.height() - border ); if ( !is_in( vis_rect, rect ) ) { rect.sub( rect.width() - border, 0.0f ); } if ( !is_in( vis_rect, rect ) ) { rect.add( 0.0f , rect.height() - border ); } if ( !is_in( vis_rect, rect ) ) { rect.add( rect.width() - border, cursor_height ); } float yn = rect.top - vis_rect.height() + rect.height( ) - border + cursor_height; if ( !is_in( vis_rect, rect ) ) { rect.sub( 0.0f , yn ); } if ( !is_in( vis_rect, rect ) ) { rect.sub( rect.width() - border, 0.0f ); } SetWndPos( rect.lt ); return true; }
void CUIButton::Update() { CUIStatic::Update(); if(CursorOverWindow() && m_hint_text.size() && !g_btnHint->Owner() && Device.dwTimeGlobal>m_dwFocusReceiveTime+500) { g_btnHint->SetHintText (this,*m_hint_text); Fvector2 c_pos = GetUICursor()->GetCursorPosition(); Frect vis_rect; vis_rect.set (0,0,UI_BASE_WIDTH, UI_BASE_HEIGHT); //select appropriate position Frect r; r.set (0.0f, 0.0f, g_btnHint->GetWidth(), g_btnHint->GetHeight()); r.add (c_pos.x, c_pos.y); r.sub (0.0f,r.height()); if (false==is_in2(vis_rect,r)) r.sub (r.width(),0.0f); if (false==is_in2(vis_rect,r)) r.add (0.0f,r.height()); if (false==is_in2(vis_rect,r)) r.add (r.width(), 45.0f); g_btnHint->SetWndPos(r.lt); } }
bool CUITradeWnd::OnItemFocusedUpdate(CUICellItem* itm) { if ( itm ) { #ifdef INV_FLOAT_ITEM_INFO Fvector2 c_pos = GetUICursor()->GetCursorPosition(); Frect vis_rect; vis_rect.set (0,0,UI_BASE_WIDTH, UI_BASE_HEIGHT); Frect r; r.set (0.0f, 0.0f, m_uidata->UIItemInfo.GetWidth(), m_uidata->UIItemInfo.GetHeight()); r.add (c_pos.x, c_pos.y); r.sub (0.0f,r.height()); if (false==((vis_rect.x1<r.x1)&&(vis_rect.x2>r.x2)&&(vis_rect.y1<r.y1)&&(vis_rect.y2>r.y2))) r.sub (r.width(),0.0f); if (false==((vis_rect.x1<r.x1)&&(vis_rect.x2>r.x2)&&(vis_rect.y1<r.y1)&&(vis_rect.y2>r.y2))) r.add (0.0f,r.height()); if (false==((vis_rect.x1<r.x1)&&(vis_rect.x2>r.x2)&&(vis_rect.y1<r.y1)&&(vis_rect.y2>r.y2))) r.add (r.width(), 45.0f); m_uidata->UIItemInfo.SetWndPos(r.lt); SetCurrentItem (itm); #endif } return true; }
float CUIGlobalMap::CalcOpenRect(const Fvector2& center_point, Frect& map_desired_rect, float tgt_zoom) { Fvector2 new_center_pt; // calculate desired rect in new zoom map_desired_rect.set (0.0f,0.0f, BoundRect().width()*tgt_zoom,BoundRect().height()*tgt_zoom); // calculate center point in new zoom (center_point is in identity global map space) new_center_pt.set (center_point.x*tgt_zoom,center_point.y*tgt_zoom); // get vis width & height Frect vis_abs_rect = m_mapWnd->ActiveMapRect(); float vis_w = vis_abs_rect.width(); float vis_h = vis_abs_rect.height(); // calculate center delta from vis rect Fvector2 delta_pos; delta_pos.set (new_center_pt.x-vis_w*0.5f,new_center_pt.y-vis_h*0.5f); // correct desired rect map_desired_rect.sub (delta_pos.x,delta_pos.y); // clamp pos by vis rect const Frect& r = map_desired_rect; Fvector2 np = r.lt; if (r.x2<vis_w) np.x += vis_w-r.x2; if (r.y2<vis_h) np.y += vis_h-r.y2; if (r.x1>0.0f) np.x = 0.0f; if (r.y1>0.0f) np.y = 0.0f; np.sub (r.lt); map_desired_rect.add (np.x,np.y); // calculate max way dist float dist = 0.f; Frect s_rect,t_rect; s_rect.div (GetWndRect(),GetCurrentZoom(),GetCurrentZoom()); t_rect.div (map_desired_rect,tgt_zoom,tgt_zoom); Fvector2 cpS,cpT; s_rect.getcenter (cpS); t_rect.getcenter (cpT); dist = cpS.distance_to(cpT); return dist; }
//position and heading for drawing pointer to src pos bool CUICustomMap::GetPointerTo(const Fvector2& src, float item_radius, Fvector2& pos, float& heading) { Frect clip_rect_abs = GetClipperRect(); //absolute rect coords Frect map_rect_abs; GetAbsoluteRect(map_rect_abs); Frect rect; BOOL res = rect.intersection(clip_rect_abs, map_rect_abs); if(!res) return false; rect = clip_rect_abs; rect.sub(map_rect_abs.lt.x,map_rect_abs.lt.y); Fbox2 f_clip_rect_local; f_clip_rect_local.set(rect.x1, rect.y1, rect.x2, rect.y2 ); Fvector2 f_center; f_clip_rect_local.getcenter(f_center); Fvector2 f_dir, f_src; f_src.set(src.x, src.y ); f_dir.sub(f_center, f_src ); f_dir.normalize_safe(); Fvector2 f_intersect_point; res = f_clip_rect_local.Pick2(f_src,f_dir,f_intersect_point); VERIFY(res); heading = -f_dir.getH(); f_intersect_point.mad(f_intersect_point,f_dir,item_radius ); pos.set( iFloor(f_intersect_point.x), iFloor(f_intersect_point.y) ); return true; }