| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : Combat *
- * *
- * $Archive:: /Commando/Code/wwui/shortcutbarctrl.cpp $*
- * *
- * Author:: Patrick Smith *
- * *
- * $Modtime:: 11/13/01 9:58a $*
- * *
- * $Revision:: 8 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- // Disable warning about exception handling not being enabled. It's used as part of STL - in a part of STL we don't use.
- #pragma warning(disable : 4530)
- #include "shortcutbarctrl.h"
- #include "assetmgr.h"
- #include "refcount.h"
- #include "mousemgr.h"
- #include "ww3d.h"
- #include "dialogmgr.h"
- #include "dialogbase.h"
- #include "stylemgr.h"
- #include "vector4.h"
- ////////////////////////////////////////////////////////////////
- // Local constants
- ////////////////////////////////////////////////////////////////
- static const float BORDER_X = 10.0F;
- static const float BORDER_Y = BORDER_X * 0.75F;
- static const float TEXT_BORDER_Y = 6.0F;
- static const float FULL_WIDTH = 200.0F;
- static const RectClass BAR_TOP_UVS (1, 3, 13, 44);
- static const RectClass BAR_BOTTOM_UVS (14, 4, 26, 44);
- static const RectClass BAR_TILE_UVS (27, 10, 39, 37);
- ////////////////////////////////////////////////////////////////
- //
- // ShortcutBarCtrlClass
- //
- ////////////////////////////////////////////////////////////////
- ShortcutBarCtrlClass::ShortcutBarCtrlClass (void) :
- FullRect (0, 0, 0, 0),
- IsHiddenState (true),
- CurrSel (-1),
- BarOpacity (1.0F),
- PulseDirection (-1.0F)
- {
- //
- // Set the font for the text renderers
- //
- StyleMgrClass::Assign_Font (&TextRenderer, StyleMgrClass::FONT_CONTROLS);
- StyleMgrClass::Assign_Font (&GlowRenderer, StyleMgrClass::FONT_HEADER);
- StyleMgrClass::Assign_Font (&HilightRenderer, StyleMgrClass::FONT_HEADER);
- StyleMgrClass::Configure_Renderer (&ControlRenderer);
- StyleMgrClass::Configure_Renderer (&TexturedControlRenderer);
- //
- // Configure the textured renderer
- //
- TextureClass *texture = WW3DAssetManager::Get_Instance ()->Get_Texture ("if_bar.tga", TextureClass::MIP_LEVELS_1);
- TexturedControlRenderer.Set_Texture (texture);
- REF_PTR_RELEASE (texture);
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // ~ShortcutBarCtrlClass
- //
- ////////////////////////////////////////////////////////////////
- ShortcutBarCtrlClass::~ShortcutBarCtrlClass (void)
- {
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Create_Text_Renderers
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Create_Text_Renderers (void)
- {
- //
- // Start fresh
- //
- TextRenderer.Reset ();
- GlowRenderer.Reset ();
- HilightRenderer.Reset ();
- //
- // Don't do anything if the control is "hidden"
- //
- if (IsHiddenState) {
- return ;
- }
- //
- // Draw each button
- //
- for (int index = 0; index < ShortcutList.Count (); index ++) {
- //
- // Get the rectangle for this button
- //
- RectClass text_rect;
- Get_Entry_Rect (index, text_rect);
- //
- // Get a pointer to the text for this entry
- //
- const WCHAR *text = ShortcutList[index].text;
- //
- // Is this the hilighted button?
- //
- if (index == CurrSel) {
- //
- // Render the text for this button
- //
- StyleMgrClass::Render_Text (text, &HilightRenderer, StyleMgrClass::Get_Tab_Text_Color (),
- StyleMgrClass::Get_Text_Shadow_Color (), text_rect, true, true,
- StyleMgrClass::CENTER_JUSTIFY);
- //
- // Render its "glow"
- //
- GlowRenderer.Build_Sentence (text);
- StyleMgrClass::Render_Glow (text, &GlowRenderer, text_rect, 7, 7,
- StyleMgrClass::Get_Tab_Glow_Color (), StyleMgrClass::CENTER_JUSTIFY);
- } else {
- //
- // Render the text for this button
- //
- StyleMgrClass::Render_Text (text, &TextRenderer, text_rect, true, true,
- StyleMgrClass::CENTER_JUSTIFY);
- }
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Create_Control_Renderers
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Create_Control_Renderers (void)
- {
- //
- // Configure this renderer
- //
- ControlRenderer.Reset ();
- TexturedControlRenderer.Reset ();
- ControlRenderer.Enable_Texturing (false);
- if (IsHiddenState) {
- Create_Hidden_State_Renderers ();
- } else {
- Create_Displayed_State_Renderers ();
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Create_Hidden_State_Renderers
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Create_Hidden_State_Renderers (void)
- {
- //
- // Determine which color to draw the outline in
- //
- //int color = StyleMgrClass::Get_Line_Color ();
- //int bkcolor = StyleMgrClass::Get_Bk_Color ();
- //
- // Draw the outline
- //
- //ControlRenderer.Add_Rect (Rect, 1.0F, color, bkcolor);
- Render_Strip (Rect, false);
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Render_Strip
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Render_Strip (const RectClass &screen_rect, bool flip_uvs)
- {
- RectClass bar_top_uvs = BAR_TOP_UVS;
- RectClass bar_tile_uvs = BAR_TILE_UVS;
- RectClass bar_bottom_uvs = BAR_BOTTOM_UVS;
- bar_top_uvs.Inverse_Scale (Vector2 (64, 64));
- bar_tile_uvs.Inverse_Scale (Vector2 (64, 64));
- bar_bottom_uvs.Inverse_Scale (Vector2 (64, 64));
- //
- // Flip the UVs if necessary
- //
- if (flip_uvs) {
- float temp = bar_top_uvs.Right;
- bar_top_uvs.Right = bar_top_uvs.Left;
- bar_top_uvs.Left = temp;
- temp = bar_tile_uvs.Right;
- bar_tile_uvs.Right = bar_tile_uvs.Left;
- bar_tile_uvs.Left = temp;
- temp = bar_bottom_uvs.Right;
- bar_bottom_uvs.Right = bar_bottom_uvs.Left;
- bar_bottom_uvs.Left = temp;
- }
- //
- // Render the top of the bar
- //
- RectClass rect = screen_rect;
- rect.Bottom = int(rect.Top + BAR_TOP_UVS.Height ());
- TexturedControlRenderer.Add_Quad (rect, bar_top_uvs);
- //
- // Render the center (tileable) section
- //
- float height = (screen_rect.Bottom - BAR_BOTTOM_UVS.Height ()) - rect.Bottom;
- while (height > 0) {
- float tile_height = BAR_TILE_UVS.Height ();
- tile_height = min (tile_height, height);
- //
- // Render this section of the bar
- //
- rect.Top = rect.Bottom;
- rect.Bottom = int (rect.Top + tile_height);
- TexturedControlRenderer.Add_Quad (rect, bar_tile_uvs);
- //
- // Decrement the total height left
- //
- height -= tile_height;
- }
- //
- // Render the bottom of the bar
- //
- rect.Top = rect.Bottom;
- rect.Bottom = screen_rect.Bottom;
- TexturedControlRenderer.Add_Quad (rect, bar_bottom_uvs);
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Create_Displayed_State_Renderers
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Create_Displayed_State_Renderers (void)
- {
- //
- // Determine which color to draw the outline in
- //
- int color = StyleMgrClass::Get_Line_Color ();
- int bkcolor = StyleMgrClass::Get_Bk_Color ();
- //
- // Darken the background...
- //
- ControlRenderer.Add_Quad (FullRect, RGBA_TO_INT32 (0, 0, 0, 170));
- //
- // Draw the outline
- //
- ControlRenderer.Add_Rect (FullRect, 1.0F, color, bkcolor);
- //
- // Render the left strip
- //
- RectClass rect = Rect;
- rect.Left -= 1.0F;
- rect.Right -= 1.0F;
- rect.Top -= (6.0F * StyleMgrClass::Get_Y_Scale ());
- rect.Bottom += (6.0F * StyleMgrClass::Get_Y_Scale ());
- Render_Strip (rect, true);
- //
- // Render the right strip
- //
- rect.Right = FullRect.Right;
- rect.Left = FullRect.Right - Rect.Width ();
- Render_Strip (rect, false);
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Set_Cursor
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_Set_Cursor (const Vector2 &mouse_pos)
- {
- //
- // Change the mouse cursor
- //
- MouseMgrClass::Set_Cursor (MouseMgrClass::CURSOR_ACTION);
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Update_Client_Rect
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Update_Client_Rect (void)
- {
- //
- // Set the client area
- //
- ClientRect = Rect;
- //
- // Determine what scale to use
- //
- float scale_x = Render2DClass::Get_Screen_Resolution().Width () / 800.0F;
- //
- // Calculate the display rectangle
- //
- FullRect = Rect;
- FullRect.Right = FullRect.Left + int(FULL_WIDTH * scale_x);
- Set_Dirty ();
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Render
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Render (void)
- {
- //
- // Recreate the renderers (if necessary)
- //
- if (IsDirty) {
- Create_Control_Renderers ();
- Create_Text_Renderers ();
- }
- //
- // Render the background and text for the current state
- //
- ControlRenderer.Render ();
- TexturedControlRenderer.Render ();
- GlowRenderer.Render ();
- TextRenderer.Render ();
- HilightRenderer.Render ();
- DialogControlClass::Render ();
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_LButton_Down
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_LButton_Down (const Vector2 &mouse_pos)
- {
- int new_sel = Entry_From_Pos (mouse_pos);
- if (new_sel != -1) {
- Set_Curr_Sel (new_sel);
- Send_Command ();
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_LButton_Up
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_LButton_Up (const Vector2 &mouse_pos)
- {
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Mouse_Move
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_Mouse_Move (const Vector2 &mouse_pos)
- {
- //
- // Check to see if the user moved the mouse off of the control
- //
- if (IsHiddenState == false && FullRect.Contains (mouse_pos) == false) {
- Set_Hidden_State (true);
- } else if (IsHiddenState && FullRect.Contains (mouse_pos)) {
- Set_Hidden_State (false);
- } else if (IsHiddenState == false) {
- //
- // Ensure we have the input focus captured
- //
- if (DialogMgrClass::Get_Focus () != this) {
- Set_Focus ();
- Set_Capture ();
- }
-
- //
- // Change the selection
- //
- int new_sel = Entry_From_Pos (mouse_pos);
- Set_Curr_Sel (new_sel);
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Set_Focus
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_Set_Focus (void)
- {
- DialogControlClass::On_Set_Focus ();
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Kill_Focus
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_Kill_Focus (DialogControlClass *focus)
- {
- Set_Hidden_State (true);
- DialogControlClass::On_Kill_Focus (focus);
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Key_Down
- //
- ////////////////////////////////////////////////////////////////
- bool
- ShortcutBarCtrlClass::On_Key_Down (uint32 key_id, uint32 key_data)
- {
- bool handled = true;
- switch (key_id)
- {
- case VK_SPACE:
- case VK_RETURN:
- Send_Command ();
- break;
- case VK_UP:
- case VK_LEFT:
- Set_Curr_Sel (CurrSel - 1, true);
- break;
- case VK_DOWN:
- case VK_RIGHT:
- Set_Curr_Sel (CurrSel + 1, true);
- break;
- default:
- handled = false;
- break;
- }
- return handled;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Create
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_Create (void)
- {
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Set_Hidden_State
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Set_Hidden_State (bool onoff)
- {
- //
- // Set the dirty flag if we've changed states
- //
- if (IsHiddenState != onoff) {
- IsHiddenState = onoff;
- Set_Dirty ();
- //
- // Capture the mouse so we can tell when the user
- // moves the mouse off of the control
- //
- if (IsHiddenState == false) {
-
- //
- // Snap the mouse to the first entry
- //
- //RectClass text_rect;
- //Get_Entry_Rect (0, text_rect);
- //Vector3 center (FullRect.Center ().X, DialogMgrClass::Get_Mouse_Pos ().Y, 0);
- //DialogMgrClass::Set_Mouse_Pos (center);
- //
- // Capture the input focus
- //
- Set_Focus ();
- Set_Capture ();
- } else {
- Release_Capture ();
- }
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Add_Button
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Add_Button (int ctrl_id, const WCHAR *text)
- {
- ShortcutList.Add (ShortcutInfoStruct (ctrl_id, text));
- Set_Dirty ();
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Remove_Button
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Remove_Button (int ctrl_id)
- {
- for (int index = 0; index < ShortcutList.Count (); index ++) {
-
- //
- // Remove the entry from the list...
- //
- if (ShortcutList[index].ctrl_id == ctrl_id) {
- ShortcutList.Delete (index);
- Set_Dirty ();
- break;
- }
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Get_Entry_Rect
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Get_Entry_Rect (int index, RectClass &rect)
- {
- float start_y_pos = Rect.Top + BORDER_Y * StyleMgrClass::Get_Y_Scale ();
- float entry_height = TextRenderer.Get_Text_Extents (L"W").Y;
- entry_height += TEXT_BORDER_Y * StyleMgrClass::Get_Y_Scale () * 2.0F;
- //
- // Simply calculate the rectangle for this entry and return it
- // to the caller
- //
- rect.Left = FullRect.Left + int(BORDER_X * StyleMgrClass::Get_X_Scale ());
- rect.Right = FullRect.Right - int(BORDER_X * StyleMgrClass::Get_X_Scale ());
- rect.Top = int(start_y_pos + (index * entry_height));
- rect.Bottom = int(rect.Top + entry_height);
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Entry_From_Pos
- //
- ////////////////////////////////////////////////////////////////
- int
- ShortcutBarCtrlClass::Entry_From_Pos (const Vector2 &mouse_pos)
- {
- int retval = -1;
- for (int index = 0; index < ShortcutList.Count (); index ++) {
-
- //
- // Get the rectangle for this button
- //
- RectClass text_rect;
- Get_Entry_Rect (index, text_rect);
-
- //
- // Is this the entry we're looking for?
- //
- if (text_rect.Contains (mouse_pos)) {
- retval = index;
- break;
- }
- }
- return retval;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Set_Curr_Sel
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Set_Curr_Sel (int index, bool snap_mouse)
- {
- //
- // Ensure the new index is in range
- //
- if (index < 0) {
- index = ShortcutList.Count () - 1;
- } else if (index >= ShortcutList.Count ()) {
- index = 0;
- }
- //
- // Did the selection change?
- //
- if (index != CurrSel) {
- CurrSel = index;
- Set_Dirty ();
- if (snap_mouse) {
- //
- // Snap the mouse to the entry
- //
- RectClass text_rect;
- Get_Entry_Rect (CurrSel, text_rect);
- Vector3 center (text_rect.Center ().X, text_rect.Center ().Y, 0);
- DialogMgrClass::Set_Mouse_Pos (center);
- }
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Mouse_Wheel
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_Mouse_Wheel (int direction)
- {
- if (IsHiddenState == false) {
-
- if (direction > 0) {
- Set_Curr_Sel (CurrSel + 1, true);
- } else {
- Set_Curr_Sel (CurrSel - 1, true);
- }
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Get_Window_Rect
- //
- ////////////////////////////////////////////////////////////////
- const RectClass &
- ShortcutBarCtrlClass::Get_Window_Rect (void) const
- {
- const RectClass *retval = &Rect;
-
- //
- // If the bar is completely displayed, then return
- // the full rectangle instead of the screen rectangle.
- //
- if (IsHiddenState == false) {
- retval = &FullRect;
- }
- return (*retval);
- }
- ////////////////////////////////////////////////////////////////
- //
- // Send_Command
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Send_Command (void)
- {
- if (CurrSel >= 0 && CurrSel < ShortcutList.Count ()) {
- Parent->On_Command (ShortcutList[CurrSel].ctrl_id, BN_CLICKED, 0);
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // Update_Pulse
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::Update_Pulse (void)
- {
- if (IsHiddenState == false) {
- return ;
- }
- const float PULSE_RATE = 0.5F;
- const float MIN_OPACITY = 0.65F;
- const float MAX_OPACITY = 1.00F;
- //
- // Pulse the bar
- //
- float delta = PULSE_RATE * (DialogMgrClass::Get_Frame_Time () / 1000.0F);
- BarOpacity += PulseDirection * delta;
- //
- // Clamp the opacity
- //
- if (BarOpacity <= MIN_OPACITY) {
- BarOpacity = MIN_OPACITY;
- PulseDirection = 1.0F;
- } else if (BarOpacity >= MAX_OPACITY) {
- BarOpacity = MAX_OPACITY;
- PulseDirection = -1.0F;
- }
- int bar_color = VRGBA_TO_INT32 (Vector4 (1.0F, 1.0F, 1.0F, BarOpacity));
- //
- // Update the color vector array
- //
- DynamicVectorClass<unsigned long> &color_array = TexturedControlRenderer.Get_Color_Array ();
- for (int index = 0; index < color_array.Count (); index ++) {
- color_array[index] = bar_color;
- }
- return ;
- }
- ////////////////////////////////////////////////////////////////
- //
- // On_Frame_Update
- //
- ////////////////////////////////////////////////////////////////
- void
- ShortcutBarCtrlClass::On_Frame_Update (void)
- {
- Update_Pulse ();
- DialogControlClass::On_Frame_Update ();
- return ;
- }
|