diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp')
| -rw-r--r-- | Minecraft.Client/Common/XUI/XUI_Ctrl_SlotList.cpp | 231 |
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; +} + |
