123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- //--------------------------------------------------------------------------
- class ContextMenu extends ScriptedWidgetEventHandler
- {
- private Widget m_context_menu_root_widget;
- private Widget m_context_menu_panel_widget;
- private ref array<ref CallQueueContext> m_commands;
- private int m_max_item_width;
- private int m_count;
- const int ITEMS_COUNT = 27;
-
- //--------------------------------------------------------------------------
- void ContextMenu()
- {
- m_commands = new array<ref CallQueueContext>;
- m_count = 0;
- }
- //--------------------------------------------------------------------------
- void ~ContextMenu()
- {
- Clear();
-
- delete m_context_menu_root_widget;
- }
- //--------------------------------------------------------------------------
- void Init(Widget layoutRoot)
- {
- if (!m_context_menu_root_widget)
- {
- m_context_menu_root_widget = GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_inventory_context_menu.layout", layoutRoot);
- m_context_menu_panel_widget = m_context_menu_root_widget.FindAnyWidget("PanelWidget");
- m_context_menu_root_widget.Show(false);
- m_context_menu_root_widget.SetHandler(this);
- }
- }
-
- //--------------------------------------------------------------------------
- void Show(int x, int y)
- {
- if ( m_count == 0) return;
- int screen_w, screen_h;
- float w, h;
- float sx, sy;
- int offset_x;// = -20;
- int offset_y;// = -10;
-
- GetScreenSize(screen_w, screen_h);
-
- // align buttons
- float button_height_percent = 0.02; // button height is 4% of screen height
- float button_height = screen_h * button_height_percent;
-
- for ( int i = 0; i < m_count; i++)
- {
- ButtonWidget menu_button = ButtonWidget.Cast( m_context_menu_root_widget.FindAnyWidget( String( "Button" + (i+1).ToString() ) ) );
- if(menu_button)
- {
- menu_button.SetSize(0.90, button_height);
- menu_button.Show(true);
- }
- }
-
-
- AutoHeightSpacer spacer;
- m_context_menu_panel_widget.GetScript(spacer);
- if ( spacer )
- {
- spacer.Update();
- }
-
- m_context_menu_root_widget.GetSize(w, h);
- m_context_menu_panel_widget.GetSize(sx, sy);
- m_context_menu_root_widget.SetSize(w, sy);
-
- // set position
- m_context_menu_root_widget.GetScreenSize(w,h);
- screen_w -= 10;
- screen_h -= 10;
-
- int right_edge = x + w - offset_x;
- if (right_edge > screen_w)
- {
- x = screen_w - w - offset_x;
- }
- else
- {
- x = x + offset_x;
- }
-
- int bottom_edge = y + h - offset_y;
- if (bottom_edge > screen_h)
- {
- y = y - h - offset_y;
- }
- else
- {
- y = y + offset_y;
- }
-
- m_context_menu_root_widget.SetPos(x, y);
- m_context_menu_root_widget.Show(true);
- }
-
- //--------------------------------------------------------------------------
- void ShowBackdrop(bool show)
- {
- if (show == true)
- {
- m_context_menu_root_widget.FindAnyWidget("BackdropImageWidget").Show(true);
- }
- else
- {
- m_context_menu_root_widget.FindAnyWidget("BackdropImageWidget").Show(false);
- }
- }
-
- //--------------------------------------------------------------------------
- void Hide()
- {
- m_context_menu_root_widget.Show(false);
-
- Clear();
- }
-
- //--------------------------------------------------------------------------
- bool IsVisible()
- {
- return m_context_menu_root_widget.IsVisible();
- }
-
- //--------------------------------------------------------------------------
- override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
- {
- super.OnMouseLeave(w, enterW, x, y);
-
- if ( enterW && m_context_menu_panel_widget && enterW != m_context_menu_panel_widget && enterW.GetParent() != m_context_menu_panel_widget )
- {
- Hide();
- return true;
- }
- return false;
- }
-
- //--------------------------------------------------------------------------
- override bool OnMouseButtonDown(Widget w, int x, int y, int button)
- {
- super.OnMouseButtonDown(w, x, y, button);
-
- if (button == MouseState.LEFT && w.GetUserID() > -1 && w.GetUserID() < m_commands.Count())
- {
- CallQueueContext ctx = m_commands.Get(w.GetUserID());
- int actionId = Param3<ItemBase, int, int>.Cast(ctx.m_params).param2;
- if (actionId == EActions.DELETE)
- Hide();
-
- UIScriptedMenu menu = GetGame().GetUIManager().GetMenu();
- if (menu)
- GetGame().GetCallQueue(CALL_CATEGORY_GUI).Call(menu.Refresh);
-
- ctx.Call();
- return true;
- }
- return false;
- }
-
- //--------------------------------------------------------------------------
- void Add(string label, Class obj, string fn_name, Param params)
- {
- AddEx(label, FadeColors.LIGHT_GREY, obj, fn_name, params);
- }
-
- void AddEx(string label, int labelColor, Class obj, string funcName, Param params)
- {
- int count = Count();
- ButtonWidget menuButton = ButtonWidget.Cast(m_context_menu_root_widget.FindAnyWidget(string.Format("Button%1", count + 1)));
- if (menuButton)
- {
- label.ToUpper();
- menuButton.SetText(label);
- menuButton.SetTextColor(labelColor);
- menuButton.Show(true);
- if (!funcName)
- menuButton.SetFlags(menuButton.GetFlags() | WidgetFlags.IGNOREPOINTER);
- int itemWidth = label.Length();
- if (m_max_item_width < itemWidth)
- m_max_item_width = itemWidth;
- }
-
- m_count++;
- m_commands.Insert(new CallQueueContext(obj, funcName, params));
- }
-
- //--------------------------------------------------------------------------
- void Remove(int index)
- {
- if (index < m_commands.Count())
- {
- m_commands.RemoveOrdered(index);
- ButtonWidget menu_button = ButtonWidget.Cast( m_context_menu_root_widget.FindAnyWidget( String( "Button" + ( index + 1 ).ToString() ) ) );
- menu_button.Show( false );
- menu_button.SetText( "" );
- m_count--;
- }
- }
-
- //--------------------------------------------------------------------------
- int Count()
- {
- return m_commands.Count();
- }
-
- //--------------------------------------------------------------------------
- void Clear()
- {
- int i;
-
- m_commands.Clear();
-
- Widget child = m_context_menu_panel_widget.GetChildren();
- while(child)
- {
- ButtonWidget button = ButtonWidget.Cast(child);
- if(button)
- {
- button.Show(false);
- }
- child = child.GetSibling();
-
-
- }
- m_count = 0;
- m_max_item_width = 0;
- }
- };
|