aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp')
-rw-r--r--Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp
new file mode 100644
index 00000000..7e51c885
--- /dev/null
+++ b/Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp
@@ -0,0 +1,231 @@
+#include "stdafx.h"
+
+#include "..\..\..\Minecraft.World\AbstractContainerMenu.h"
+
+#include "XUI_Ctrl_SlotItemListItem.h"
+#include "XUI_Ctrl_SlotList.h"
+
+
+//--------------------------------------------------------------------------------------
+// Name: CXuiCtrlSlotList::OnInit
+// Desc: Message handler for XM_INIT
+//--------------------------------------------------------------------------------------
+HRESULT CXuiCtrlSlotList::OnInit( XUIMessageInit* pInitData, BOOL& bHandled )
+{
+ slotCount = 0;
+
+ return S_OK;
+}
+
+HRESULT CXuiCtrlSlotList::OnDestroy()
+{
+ return S_OK;
+}
+
+HRESULT CXuiCtrlSlotList::OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled)
+{
+ if( pInputData->dwKeyCode == VK_PAD_DPAD_LEFT ||
+ pInputData->dwKeyCode == VK_PAD_DPAD_RIGHT ||
+ pInputData->dwKeyCode == VK_PAD_DPAD_UP ||
+ pInputData->dwKeyCode == VK_PAD_DPAD_DOWN ||
+ pInputData->dwKeyCode == VK_PAD_LTRIGGER ||
+ pInputData->dwKeyCode == VK_PAD_RTRIGGER)
+ {
+ HXUIOBJ parent;
+ HRESULT hr;
+ hr = XuiElementGetParent( m_hObj, &parent );
+
+ XUIMessage message;
+ XUIMessageInput messageInput;
+
+ XuiMessageInput( &message, &messageInput, XUI_KEYDOWN, pInputData->dwKeyCode, pInputData->wch, pInputData->dwFlags, pInputData->UserIndex );
+
+ if (HRESULT_SUCCEEDED(hr))
+ {
+ hr = XuiBubbleMessage(parent, &message);
+
+ if (message.bHandled)
+ {
+ bHandled = TRUE;
+ }
+ }
+ }
+
+ return S_OK;
+}
+
+void CXuiCtrlSlotList::SetData(int m_iPad, AbstractContainerMenu* menu, int rows, int columns, int startIndex /*= 0*/, int endIndex /*= 0*/)
+{
+ assert( startIndex >= 0 && startIndex < menu->getSize() );
+ assert( endIndex <= menu->getSize() );
+
+ if( startIndex < 0 )
+ {
+ startIndex = 0;
+ }
+ else if( startIndex > menu->getSize() )
+ {
+ startIndex = menu->getSize();
+ }
+
+ if( endIndex == 0 )
+ {
+ endIndex = startIndex + (rows * columns);
+ }
+
+ if( endIndex > menu->getSize() )
+ {
+ endIndex = menu->getSize();
+ }
+
+ if( startIndex > endIndex )
+ {
+ endIndex = startIndex;
+ }
+
+ assert( (rows * columns) == (endIndex - startIndex) );
+
+ this->rows = rows;
+ this->columns = columns;
+
+ this->startIndex = startIndex;
+
+ this->slotCount = rows * columns;
+
+ InsertItems( 0, slotCount );
+
+ for(int i = 0; i < slotCount; i++)
+ {
+ CXuiCtrlSlotItemListItem* slotControl;
+ GetCXuiCtrlSlotItem(i, &slotControl);
+
+ slotControl->SetSlot( slotControl->m_hObj, menu->getSlot( i + startIndex ) );
+
+ slotControl->SetUserIndex( slotControl->m_hObj, m_iPad );
+
+ slotControl = NULL;
+ }
+}
+
+HRESULT CXuiCtrlSlotList::OnGetItemCountAll( XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled )
+{
+ // We don't need to look at the type of request. The message map
+ // has already filtered out a request to retrieve all items.
+ pGetItemCountData->cItems = slotCount;
+ bHandled = TRUE;
+
+ return( S_OK );
+}
+
+HRESULT CXuiCtrlSlotList::OnGetItemCountMaxLines( XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled )
+{
+ // We don't need to look at the type of request. The message map
+ // has already filtered out a request to retrieve max lines.
+ pGetItemCountData->cItems = rows;
+ bHandled = TRUE;
+
+ return( S_OK );
+}
+
+HRESULT CXuiCtrlSlotList::OnGetItemCountMaxPerLine( XUIMessageGetItemCount *pGetItemCountData, BOOL& bHandled )
+{
+ // We don't need to look at the type of request. The message map
+ // has already filtered out a request to retrieve max per line.
+ pGetItemCountData->cItems = columns;
+ bHandled = TRUE;
+
+ return( S_OK );
+}
+
+int CXuiCtrlSlotList::GetCurrentColumn()
+{
+ int currentItemIndex = GetCurSel();
+
+ return currentItemIndex % columns;
+}
+
+int CXuiCtrlSlotList::GetCurrentRow()
+{
+ int currentItemIndex = GetCurSel();
+
+ return (currentItemIndex/columns) % rows;
+}
+
+// Return the index in the menu object
+int CXuiCtrlSlotList::GetCurrentIndex()
+{
+ int currentSelected = GetCurSel();
+ return currentSelected + this->startIndex;
+}
+
+void CXuiCtrlSlotList::SetCurrentSlot(int row, int column)
+{
+ if( row >= rows )
+ {
+ row = rows - 1;
+ }
+ else if ( row < 0 )
+ {
+ row = 0;
+ }
+ if( column >= columns )
+ {
+ column = columns - 1;
+ }
+ else if ( column < 0 )
+ {
+ column = 0;
+ }
+ int newSlot = ( row * columns ) + column;
+ SetCurSel( newSlot );
+}
+
+void CXuiCtrlSlotList::SetEntrySlot(int row, int column, XUI_CONTROL_NAVIGATE direction)
+{
+ // The direction is the direction in which we are leaving the previous control to get to here
+ // So a Navigate up means we want to start at the bottom of ourself
+ switch( direction )
+ {
+ case XUI_CONTROL_NAVIGATE_UP:
+ {
+ row = rows - 1;
+ break;
+ }
+ case XUI_CONTROL_NAVIGATE_DOWN:
+ {
+ row = 0;
+ break;
+ }
+ case XUI_CONTROL_NAVIGATE_LEFT:
+ case XUI_CONTROL_NAVIGATE_TABBACKWARD:
+ {
+ column = columns - 1;
+ break;
+ }
+ case XUI_CONTROL_NAVIGATE_RIGHT:
+ case XUI_CONTROL_NAVIGATE_TABFORWARD:
+ {
+ column = 0;
+ break;
+ }
+ }
+ SetCurrentSlot( row, column );
+}
+
+void CXuiCtrlSlotList::Clicked()
+{
+ CXuiCtrlSlotItemListItem* slot;
+ GetCXuiCtrlSlotItem( GetCurSel() , &slot);
+
+ // To get the press animation
+ slot->Press();
+}
+
+void CXuiCtrlSlotList::GetCXuiCtrlSlotItem(int itemIndex, CXuiCtrlSlotItemListItem** CXuiCtrlSlotItem)
+{
+ HXUIOBJ itemControl = this->GetItemControl(itemIndex);
+ VOID *pObj;
+ XuiObjectFromHandle( itemControl, &pObj );
+ *CXuiCtrlSlotItem = (CXuiCtrlSlotItemListItem *)pObj;
+}
+