Added row item display button components.
This commit is contained in:
		
							parent
							
								
									ac0f5c42aa
								
							
						
					
					
						commit
						3251053364
					
				| @ -46,6 +46,7 @@ All rights reserved. | |||||||
| #include "EquipSlotButton.h" | #include "EquipSlotButton.h" | ||||||
| #include "Item.h" | #include "Item.h" | ||||||
| #include "ScrollableWindowComponent.h" | #include "ScrollableWindowComponent.h" | ||||||
|  | #include "RowItemDisplay.h" | ||||||
| 
 | 
 | ||||||
| INCLUDE_game | INCLUDE_game | ||||||
| INCLUDE_GFX | INCLUDE_GFX | ||||||
| @ -133,26 +134,37 @@ void Menu::InitializeCharacterMenuWindow(){ | |||||||
| 				ScrollableWindowComponent*equipList=Component<ScrollableWindowComponent>(data.component->parentMenu,"Equip List"); | 				ScrollableWindowComponent*equipList=Component<ScrollableWindowComponent>(data.component->parentMenu,"Equip List"); | ||||||
| 				equipList->RemoveAllComponents(); | 				equipList->RemoveAllComponents(); | ||||||
| 				for(int counter=0;Item&it:availableEquipment){ | 				for(int counter=0;Item&it:availableEquipment){ | ||||||
| 					float xOffset=(counter%3)*26; |  | ||||||
| 					Item&itemInvRef=Inventory::GetItem(it.Name()); | 					Item&itemInvRef=Inventory::GetItem(it.Name()); | ||||||
| 					auto equip=equipList->ADD("Equip Item "+std::to_string(counter),MenuItemItemButton)({{2+xOffset,2},{24,24}},itemInvRef,MenuType::ENUM_END, | 					auto equip=equipList->ADD("Equip Item "+std::to_string(counter),RowItemDisplay)({{2,2+counter*28.f},{120-12,28}},itemInvRef, | ||||||
| 						[](MenuFuncData data){ | 						[](MenuFuncData data){ | ||||||
| 							MenuItemItemButton*comp=(MenuItemItemButton*)data.component; | 							RowItemDisplay*comp=dynamic_cast<RowItemDisplay*>(data.component); | ||||||
| 							Inventory::EquipItem(comp->GetItem(),EquipSlot(comp->I(Attribute::EQUIP_TYPE))); | 							if(comp!=nullptr){ | ||||||
| 							for(MenuComponent*button:((ScrollableWindowComponent*)data.parentComponent)->GetComponents()){ | 								Inventory::EquipItem(comp->GetItem(),EquipSlot(comp->I(Attribute::EQUIP_TYPE))); | ||||||
| 								MenuItemItemButton*comp=(MenuItemItemButton*)button; | 								for(MenuComponent*button:((ScrollableWindowComponent*)data.parentComponent)->GetComponents()){ | ||||||
| 								comp->SetSelected(false); | 									RowItemDisplay*comp=dynamic_cast<RowItemDisplay*>(button); | ||||||
|  | 									if(comp!=nullptr){ | ||||||
|  | 										comp->SetSelected(false); | ||||||
|  | 									}else{ | ||||||
|  | 										ERR("WARNING! Attempting to cast a button that isn't a RowItemDisplay!"); | ||||||
|  | 									} | ||||||
|  | 								} | ||||||
|  | 								comp->SetSelected(true); | ||||||
|  | 								for(int counter=0;ItemAttribute attribute:displayAttrs){ | ||||||
|  | 									StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label"); | ||||||
|  | 									statDisplayLabel->SetStatChangeAmt(0); | ||||||
|  | 								} | ||||||
|  | 								MenuItemItemButton*equipButton=Component<MenuItemItemButton>(CHARACTER_MENU,"Equip Slot "+slotNames[data.parentComponent->I(A::INDEXED_THEME)]); | ||||||
|  | 								equipButton->SetItem(comp->GetItem()); | ||||||
|  | 							}else{ | ||||||
|  | 								ERR("WARNING! Attempting to cast a button that isn't a RowItemDisplay!"); | ||||||
| 							} | 							} | ||||||
| 							comp->SetSelected(true); |  | ||||||
| 							for(int counter=0;ItemAttribute attribute:displayAttrs){ |  | ||||||
| 								StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label"); |  | ||||||
| 								statDisplayLabel->SetStatChangeAmt(0); |  | ||||||
| 							} |  | ||||||
| 							MenuItemItemButton*equipButton=Component<MenuItemItemButton>(CHARACTER_MENU,"Equip Slot "+slotNames[data.parentComponent->I(A::INDEXED_THEME)]); |  | ||||||
| 							equipButton->SetItem(comp->GetItem()); |  | ||||||
| 							return true; | 							return true; | ||||||
| 						},[&](MenuFuncData data){ | 						},"Item Name","Item Description")END; | ||||||
| 								MenuItemItemButton*button=(MenuItemItemButton*)data.component; | 					 | ||||||
|  | 					equip->SetHoverFunc( | ||||||
|  | 						[&](MenuFuncData data){ | ||||||
|  | 							RowItemDisplay*button=dynamic_cast<RowItemDisplay*>(data.component); | ||||||
|  | 							if(button!=nullptr){ | ||||||
| 								Item&buttonItem=button->GetItem(); | 								Item&buttonItem=button->GetItem(); | ||||||
| 								std::vector<int>statsBeforeEquip; | 								std::vector<int>statsBeforeEquip; | ||||||
| 								EquipSlot slot=EquipSlot(button->I(Attribute::EQUIP_TYPE)); | 								EquipSlot slot=EquipSlot(button->I(Attribute::EQUIP_TYPE)); | ||||||
| @ -171,16 +183,24 @@ void Menu::InitializeCharacterMenuWindow(){ | |||||||
| 								if(*equippedItem!=Item::BLANK){ | 								if(*equippedItem!=Item::BLANK){ | ||||||
| 									Inventory::EquipItem(*equippedItem,slot); | 									Inventory::EquipItem(*equippedItem,slot); | ||||||
| 								} | 								} | ||||||
|  | 							}else{ | ||||||
|  | 								ERR("WARNING! Attempting to cast a button that isn't a RowItemDisplay!"); | ||||||
|  | 							} | ||||||
| 							return true; | 							return true; | ||||||
| 						},[](MenuFuncData data){ | 						}); | ||||||
|  | 					equip->SetMouseOutFunc( | ||||||
|  | 						[](MenuFuncData data){ | ||||||
| 							for(int counter=0;ItemAttribute attribute:displayAttrs){ | 							for(int counter=0;ItemAttribute attribute:displayAttrs){ | ||||||
| 								StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label"); | 								StatLabel*statDisplayLabel=Component<StatLabel>(CHARACTER_MENU,"Attribute "+ItemAttributable::GetDisplayInfo(attribute).name+" Label"); | ||||||
| 								statDisplayLabel->SetStatChangeAmt(0); | 								statDisplayLabel->SetStatChangeAmt(0); | ||||||
| 								counter++; | 								counter++; | ||||||
| 							} | 							} | ||||||
| 							return true; | 							return true; | ||||||
| 						},"Item Name","Item Description")END; | 						}); | ||||||
| 					 | 
 | ||||||
|  | 					equip->SetShowQuantity(false); | ||||||
|  | 					equip->SetSelectionType(SelectionType::NONE); | ||||||
|  | 
 | ||||||
| 					equip->I(Attribute::EQUIP_TYPE)=int(slot); | 					equip->I(Attribute::EQUIP_TYPE)=int(slot); | ||||||
| 					if(Inventory::GetEquip(slot)==&itemInvRef){ | 					if(Inventory::GetEquip(slot)==&itemInvRef){ | ||||||
| 						equip->SetSelected(true); | 						equip->SetSelected(true); | ||||||
|  | |||||||
| @ -231,7 +231,12 @@ private: | |||||||
| 
 | 
 | ||||||
| template<typename T> | template<typename T> | ||||||
| T*Component(MenuType menu,std::string componentName){ | T*Component(MenuType menu,std::string componentName){ | ||||||
|     return (T*)Menu::menus[menu]->components[componentName]; |     T*tmp=dynamic_cast<T*>(Menu::menus[menu]->components[componentName]); | ||||||
|  |     if(tmp!=nullptr){ | ||||||
|  |         return tmp; | ||||||
|  |     }else{ | ||||||
|  | 		ERR("WARNING! Attempting to cast a button that isn't a "<<typeid(T).name()<<"!"); | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| struct MenuFuncData{ | struct MenuFuncData{ | ||||||
|  | |||||||
| @ -121,6 +121,7 @@ void MenuComponent::DrawDecal(ViewPort&window,bool focused){ | |||||||
| 			case CROSSHAIR:drawutil::DrawCrosshairDecalViewPort(window,{rect.pos+V(A::DRAW_OFFSET),rect.size},0);break; | 			case CROSSHAIR:drawutil::DrawCrosshairDecalViewPort(window,{rect.pos+V(A::DRAW_OFFSET),rect.size},0);break; | ||||||
| 			case INNER_BOX:window.DrawRectDecal(rect.pos+V(A::DRAW_OFFSET)+vi2d{1,1},rect.size-vi2d{2,2});break; | 			case INNER_BOX:window.DrawRectDecal(rect.pos+V(A::DRAW_OFFSET)+vi2d{1,1},rect.size-vi2d{2,2});break; | ||||||
| 			case HIGHLIGHT:break;//Not used.
 | 			case HIGHLIGHT:break;//Not used.
 | ||||||
|  | 			case SelectionType::NONE:break;//Displays nothing.
 | ||||||
| 			default:ERR("Undefined selection type selected: "<<int(selectionType)); | 			default:ERR("Undefined selection type selected: "<<int(selectionType)); | ||||||
| 		} | 		} | ||||||
|     } |     } | ||||||
| @ -205,7 +206,6 @@ void MenuComponent::OnMouseOut(){}; | |||||||
| void MenuComponent::OnHover(){}; | void MenuComponent::OnHover(){}; | ||||||
| 
 | 
 | ||||||
| void MenuComponent::_OnMouseOut(){ | void MenuComponent::_OnMouseOut(){ | ||||||
| 	if(name=="Equip Item 2"){std::cout<<std::boolalpha<<hoverState<<","<<hovered<<","<<runHoverFunctions<<std::endl;} |  | ||||||
|     if(!hovered){ |     if(!hovered){ | ||||||
| 		if(runHoverFunctions){ | 		if(runHoverFunctions){ | ||||||
| 			if(hoverState){ | 			if(hoverState){ | ||||||
|  | |||||||
| @ -57,9 +57,12 @@ enum class SelectionType{ | |||||||
|     CROSSHAIR, |     CROSSHAIR, | ||||||
|     HIGHLIGHT, |     HIGHLIGHT, | ||||||
|     INNER_BOX, |     INNER_BOX, | ||||||
|  |     NONE, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| using enum SelectionType; | using SelectionType::CROSSHAIR; | ||||||
|  | using SelectionType::HIGHLIGHT; | ||||||
|  | using SelectionType::INNER_BOX; | ||||||
| 
 | 
 | ||||||
| class MenuComponent:public IAttributable{ | class MenuComponent:public IAttributable{ | ||||||
|     friend class Menu; |     friend class Menu; | ||||||
| @ -82,7 +85,6 @@ private: | |||||||
|     void _DrawDecal(ViewPort&window,bool focused); |     void _DrawDecal(ViewPort&window,bool focused); | ||||||
|     void _OnMouseOut(); |     void _OnMouseOut(); | ||||||
|     void _OnHover(); |     void _OnHover(); | ||||||
|     bool selected=false; |  | ||||||
|     SelectionType selectionType=CROSSHAIR; |     SelectionType selectionType=CROSSHAIR; | ||||||
| protected: | protected: | ||||||
|     int depth=0; |     int depth=0; | ||||||
| @ -99,6 +101,7 @@ protected: | |||||||
|     bool hovered=false; |     bool hovered=false; | ||||||
|     bool selectable=true; |     bool selectable=true; | ||||||
|     bool selectableViaKeyboard=true; |     bool selectableViaKeyboard=true; | ||||||
|  |     bool selected=false; | ||||||
|     bool disabled=false; //If set to true, this component will not be rendered or updated.
 |     bool disabled=false; //If set to true, this component will not be rendered or updated.
 | ||||||
|     bool renderInMain=true; //If set to false, this component is the responsibility of some other windowing system and won't be rendered or updated via the main window loop.
 |     bool renderInMain=true; //If set to false, this component is the responsibility of some other windowing system and won't be rendered or updated via the main window loop.
 | ||||||
|     bool valid=true; //If set to false, this would cause the component to be removed.
 |     bool valid=true; //If set to false, this would cause the component to be removed.
 | ||||||
|  | |||||||
| @ -107,11 +107,11 @@ protected: | |||||||
|             labelNameText=""; |             labelNameText=""; | ||||||
|             labelDescriptionText=""; |             labelDescriptionText=""; | ||||||
|         } |         } | ||||||
|         if(itemNameLabelName!=""&&labelNameText.length()>0){ |         if(itemNameLabelName!=""){ | ||||||
|             Component<MenuLabel>(parentMenu,itemNameLabelName)->label=labelNameText; |             Component<MenuLabel>(parentMenu,itemNameLabelName)->label=labelNameText; | ||||||
|             Component<MenuLabel>(parentMenu,itemNameLabelName)->Enable(true); |             Component<MenuLabel>(parentMenu,itemNameLabelName)->Enable(true); | ||||||
|         } |         } | ||||||
|         if(itemDescriptionLabelName!=""&&labelDescriptionText.length()>0){ |         if(itemDescriptionLabelName!=""){ | ||||||
|             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->label=labelDescriptionText; |             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->label=labelDescriptionText; | ||||||
|             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true); |             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -47,22 +47,31 @@ class RowItemDisplay:public MenuComponent{ | |||||||
|     std::string itemNameLabelName; |     std::string itemNameLabelName; | ||||||
|     std::string itemDescriptionLabelName; |     std::string itemDescriptionLabelName; | ||||||
|     CompactText compact=NON_COMPACT; |     CompactText compact=NON_COMPACT; | ||||||
|  |     bool showQuantity=true; | ||||||
| public: | public: | ||||||
|     inline RowItemDisplay(geom2d::rect<float>rect,Item&itemRef,MenuFunc onClick,std::string itemNameLabelName,std::string itemDescriptionLabelName,ButtonAttr attributes=ButtonAttr::NONE) |     inline RowItemDisplay(geom2d::rect<float>rect,Item&itemRef,MenuFunc onClick,std::string itemNameLabelName,std::string itemDescriptionLabelName,ButtonAttr attributes=ButtonAttr::NONE) | ||||||
|     :MenuComponent(rect,"",onClick,attributes),itemNameLabelName(itemNameLabelName),itemDescriptionLabelName(itemDescriptionLabelName),itemRef(itemRef){ |     :MenuComponent(rect,"",onClick,attributes),itemNameLabelName(itemNameLabelName),itemDescriptionLabelName(itemDescriptionLabelName),itemRef(itemRef){} | ||||||
| 
 |  | ||||||
|     } |  | ||||||
|     virtual inline void DrawDecal(ViewPort&window,bool focused)final{ |     virtual inline void DrawDecal(ViewPort&window,bool focused)final{ | ||||||
|         float scaleFactor=rect.size.y/24; |         MenuComponent::DrawDecal(window,focused); | ||||||
|  |         float scaleFactor=(rect.size.y-4)/24; | ||||||
|         vf2d iconSize=vf2d{scaleFactor,scaleFactor}*24.f; |         vf2d iconSize=vf2d{scaleFactor,scaleFactor}*24.f; | ||||||
|         window.DrawDecal(rect.pos+vf2d{2,2},itemRef.Decal(),{scaleFactor,scaleFactor}); |         window.DrawDecal(rect.pos+vf2d{2,2},itemRef.Decal(),{scaleFactor,scaleFactor}); | ||||||
|         window.DrawRectDecal(rect.pos+vf2d{2,2},iconSize); |         window.DrawRectDecal(rect.pos+vf2d{2,2},iconSize); | ||||||
| 
 | 
 | ||||||
|         window.DrawShadowStringPropDecal(rect.pos+vf2d{4,4}+iconSize,itemRef.Name()); |         std::string itemName=itemRef.Name(); | ||||||
|  |         vf2d scaledSize={std::min(1.f,(rect.size.x-6-iconSize.x)/game->GetTextSizeProp(itemName).x),1}; | ||||||
| 
 | 
 | ||||||
|         std::string quantityText=std::format("x{}",itemRef.Amt()); |         window.DrawShadowStringPropDecal(rect.pos+vf2d{4,4}+vf2d{iconSize.x,iconSize.y/2-4},itemName,WHITE,BLACK,scaledSize); | ||||||
|         vf2d qtyTextSize=game->GetTextSizeProp(quantityText); |          | ||||||
|         window.DrawShadowStringPropDecal(rect.pos+rect.size-vf2d{2,2}+vf2d{-qtyTextSize.x,qtyTextSize.y},quantityText); |         if(showQuantity){ | ||||||
|  |             std::string quantityText=std::format("x{}",itemRef.Amt()); | ||||||
|  |             vf2d qtyTextSize=game->GetTextSizeProp(quantityText); | ||||||
|  |             window.DrawShadowStringPropDecal(rect.pos+rect.size-vf2d{2,2}+vf2d{-qtyTextSize.x,0},quantityText); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(selected){ | ||||||
|  |             window.DrawShadowStringDecal(rect.pos+vf2d{2,2}+iconSize-vf2d{8,8},"E",GREEN,VERY_DARK_GREEN); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     inline void SetCompactDescriptions(bool compact){ |     inline void SetCompactDescriptions(bool compact){ | ||||||
|         if(compact)this->compact=COMPACT; |         if(compact)this->compact=COMPACT; | ||||||
| @ -76,7 +85,14 @@ public: | |||||||
|             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(false); |             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(false); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     virtual inline void OnHover()override{ |     virtual inline void SetShowQuantity(bool showQuantity){ | ||||||
|  |         this->showQuantity=showQuantity; | ||||||
|  |     } | ||||||
|  |     virtual inline Item&GetItem(){ | ||||||
|  |         return itemRef; | ||||||
|  |     } | ||||||
|  |     void UpdateLabel(){ | ||||||
|  |         if(itemRef.IsBlank())return; | ||||||
|         std::string labelNameText; |         std::string labelNameText; | ||||||
|         std::string labelDescriptionText; |         std::string labelDescriptionText; | ||||||
|         if(valid){ |         if(valid){ | ||||||
| @ -95,4 +111,7 @@ public: | |||||||
|             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true); |             Component<MenuLabel>(parentMenu,itemDescriptionLabelName)->Enable(true); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     virtual inline void OnHover()override{ | ||||||
|  |         UpdateLabel(); | ||||||
|  |     } | ||||||
| }; | }; | ||||||
| @ -39,7 +39,7 @@ All rights reserved. | |||||||
| #define VERSION_MAJOR 0 | #define VERSION_MAJOR 0 | ||||||
| #define VERSION_MINOR 2 | #define VERSION_MINOR 2 | ||||||
| #define VERSION_PATCH 1 | #define VERSION_PATCH 1 | ||||||
| #define VERSION_BUILD 3990 | #define VERSION_BUILD 4009 | ||||||
| 
 | 
 | ||||||
| #define stringify(a) stringify_(a) | #define stringify(a) stringify_(a) | ||||||
| #define stringify_(a) #a | #define stringify_(a) #a | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user