ViewModel Editor MVP - barsandcat/HMS-Sunflower GitHub Wiki

But I do need interface for UI - interface that will be like "Select brush", "Select part", "Rotate brush", "Can I place it?" That actually sounds like model view model - https://miltoncandelero.github.io/unreal-viewmodel

And here is original documentation: https://dev.epicgames.com/documentation/en-us/unreal-engine/umg-viewmodel-for-unreal-engine

There is quite a lot of flexibility in how to abuse viewmodels. I do not want viewmodel to be extra layer for widget, no I want viewmodel to be an interface for UI in general not for specific widget. Thant means that viewmodels represent objects and systems in game. That means that widgets can not create viewmodels, viewmodels need to be created by corresponding object/system, and widget needs to find it. For the editor, which should be only one, we can use global viewmodel.

Part view model has read only field id, and on click you can route it to be assigned to the shipyards viewmodel selected part id.

Yes id does work, but underneath viewmodel is still a set of fields fundamentaly, and what direction data moves is not clear at all. They all have setters and getters, just in some setters you notify system you are interested in.

I.e. currently I have to write extra field and extra function, instead of just making one function on subsystem exposed to the blueprint...

Another option is to subscribe to that field notify? So you do not need to pass subsystem to view model, and that field is used as field. I like it more. Yes, you can subscribe. And then event is kind of very generic - some field in some model changed. Despite you are using delegates of specific model, and subscribe to specific field...

Omg: UMVVMViewListViewBaseExtension

So this two go together:

  • UMVVMViewListViewBaseExtension used by UMVVMViewBlueprintListViewBaseExtension
  • UMVVMViewBlueprintListViewBaseExtension used by FMVVMListViewBaseExtensionCustomizationExtender

So back to list view...

Well, I have an issue, that I have no Idea what to do about: You need to compile part browser vidget for this part view model injection to work. If you just load and run - it does not find any view models for list elements! Maybe manual is not what you need. Path is property path relative to the widget. We should be able to get to the view model from list entry widget.

Last option - manual, and initialization script - works. I do not know why build in support for list view fails on reload...

Here is the use case I want for game pad - you can jump cursor between modules, and you can move cursor one cell at time.

  • Create own "cursor", that is not tied to the mouse at all. Move it by mouse or gamepad
  • Attach cursor to the mouse, and move mouse with gamepad.

The more I think the more I like idea of separating mouse and game pad. I.e. having hardware mouse is nice for responsiveness. Having cursor that is aware of editor - is a must have.

So we need:

  • SetCursorPos(ScreenX, ScreenY)
  • MoveCursor(Dir vector)
  • ApplyBrush
  • Select

Well, if you have brush - then you can not select any thing, and you do not need selection cursor. If brush has positon just like cursor, than I need to move them both!

Cursor is always on board, and can not be off board. Brush is a system state, It can be present, or not. If we have brush, we have one set of if not - other. So we can have apply brush action and select action separately both bound to mouse. If we can have different actions, that means that interface above is viable.

So our flow is to switch ICM by the state of view model? Would be nice to bind to view model of brush and process some events there to change ICM? Can we do that? Well we can grab viewmodel from global... But that does not make much sense.

Omg new issue with input: now with "Show mouse cursor" option on player controller. If its false, UI is not working! If its true, the mouse move events are useless! So we can make an on tick in my player controller, and check if common ui input is in "gamepad" or "keyboard and mouse" mode, and if it is mouse - then use localPlayer->ViewportClient->GetMousePosition(mouseScreenPosition) to update our cursor position.

Next step - ship itself, we need grid with cells, and render them. To render we need actors. So we need grid with partIds and with actors. Or simply new actor that can store part id. If we want dimension less field array will not do actually, but map will. Is there vector of two int in the unreal? FIntVector2 So here is the problem - array offers quick neighbor access, map will be way worse. But array will not do anyway.

To place a part into the cell, we need... a actor bp. Hardcode it?

UClass* Result = StaticLoadClass(UObject::StaticClass(), nullptr, TEXT("/Game/ThirdPerson/Blueprints/BP_Tree.BP_Tree_C"), nullptr, LOAD_None, nullptr);

For view model mvp not much is needed - ship part picker is the main problem I have. Another stuff is save/load menu. So to save file I will need to launch dialog - so I need to connect button to the dialog subsystem. That is not really view model is it? So I do need some way to inform code that created ui that event - button press happened. How dialog system does it? Well, It is done in a way I would did myself - dialog widget has callback - on result, and that is up to the caller of dialog to populate that callback. In the end idea is the same - ui does not know about any thing.

  • So lets add save/load and test to our MVP, but none of them will work and stats window.
  • And selection, movement, deletion.
    • Selection and deletion - this is new state that is needed to be added to the ship yard. MVP will be just one part. But, we need to render it
    • Picking up module
  • Filters working as well.

Ship yard render:

  • Part
    • Selected part - highlight
    • Placed part - normal
    • Brush part - ghost
  • Cursor So we need some effect to be applied to the part? Well we can use Fresnel effect - and apparently meshes have overlay material property - I can assign it there. But it will double the rendering. What is better is to use parameters - MID material instance dynamic Here is good example - https://dev.epicgames.com/community/learning/tutorials/WBJG/unreal-engine-wpo-animated-car-dashboard Not my highlight as I want it, but similar Ok, I can create parametrized material, I can create from it MID, but I need to assign it. I.e. each geometry that uses that MID needs and initialization?

Hmm, there is this tutorial: https://www.youtube.com/watch?v=4Z3Fy-yu7Qk And instead of tweaking material on the objects, they assign postprocess material to postprocess volue.

Ok, this one is intersting, it uses decal to apply higlight material to object! https://www.youtube.com/watch?v=R7oLZL97XYo This is not MID, but still, looks like something that would work for me?

This one uses overlay materials https://www.youtube.com/watch?v=4-a8QZIf1Dc Definitely simplest one yet! Another one with overlays - that is what I am going to use. https://www.youtube.com/watch?v=jWPJFuWyKtI&t=8s

New overlay material. How do we assign it? We need to have selection pointer - in shipyard, basically can be on the transition.

Here is good example of setting highlight via overlay material: https://forums.unrealengine.com/t/did-5-2-1-change-setoverlaymaterial-getting-error-since-update/1212990/9 Still, not code no how that material is initialized thoug.

Hold issue - well, there is hold support in the enchanced input, but like differentiate a key is held or cliked - is not trivial?? Actually it is trivial - but behaviour is indeed complex...

No we need brush preview! What if just dumb way - another actor in the shipyard? Well, I am not sure, maybe we should use preview instead of cursor... If this is the case - then we can not jump cursor to the existing ship part, can we? I.e. we need different behaviour? Well, yes, one is cursor other one is brush. They do behave differently, like you can not rotate cursor

Another issue - set cursor should actually handle the case when there is no cursor position! Is there std::optional in unreal? Yes TOptional! And, as always it is not as good as std::optional ) https://forums.unrealengine.com/t/toptional-get-may-return-dangling-reference/1729153

I really want hold feedback on the cursor!

Preview is brush, not a cursor, i.e. separate object, that is just like cursor is snapped to the grid. Here is the question - to make transparent material that works as overly - I do not know how. But there is an option - just assign a new material... This is brush actor - I do not care what original material it was, do I?

Set material does include advanced functionality - it can remember its base material! No actually mesh has array of materials, and set material index is exactly that!

  • Part differentiation
    • We need some kind of mapping part id to the actor class?
  • Part selector categories and filters
    • How do we pass back info about selected category from widget to the ship yard subsystem?
      • We can use same trick as with part list, but only for single selection. But we need more - we need multi selection.
        • Can each element handle its selection on its own?
    • Filters
    • Numbers on the filters and categories - how many items in current subset match filter
  • Cleanup UShipPartBrowserActivatableWidget - viewmodels should replace it entirely
  • Sort direction
  • Part selector auto hide/show animations
  • Save/load menu and integration with dialog system
  • Info panel
  • Crashes on the null ptr/ dead ptr to the VM
  • Box selection - group brush

Category selection problem:

  1. I can not catch event when view model selection field changes for some reason
  2. There is a boolean flag on the common button - what to do select before or after click, and it does not seems to be an issue
  3. For some reason, by default button is not selectable or hit testable, but never the less, if it is used as entry in the common list - it is clickable and changes style between selected/nonselected

Some how issue gets resolved. No sure what was the issue. I did add getter/setter to the vm declarations, and had to make getters const. That may some how prevented events from triggering?

Filters:

  • Dynamic/Static/Ignore
  • Loadbearing/Noloadbearing/Ignore
  • Low profile/Medium profile/High profile/Ignore

There is Combobox.

  • UComboBoxKey - uses FName
  • UComboBoxString - uses FString Reference for good looking filter? Good reference: display number of affected entries by the filter So my objective is a combox with names: "All mounts" "Static mounts 1/2" "Turret mounts 1/8"

Frist number is break down of current visible parts, second is break down of all available parts. Well, problem is for the "All/ignore" we probalby should not put any numbers at all? Because second one will be same = total number of parts visible and total number of parts in general. This numbers can be liked down to the viewmodel for calculations, so should be separated from the name of the category itself.

How do we represent filter state in the filter view model? Actual bidirectional field for once? Well we need entire list in the view model for sure, and corresponding counts as well. Should we go for a viewmodel for each option in the combobox? If it is not to problematic, than that would be nice, for stat numbers at least, especially if we create widgets for options, we can pass view model to them.

So we need view model with items and selected item, bidirectional one.

Well, its a fiasco. There is no options list to bind to, and there is no selected option to bind to as well! Should I write my own version of combobox that supports binding? Can I handle updates of view model in the blueprint? Well, probably correct approach is to create new view model, that outputs staff that is needed for me? This is wrong option - it exists to construct new data for user, not widget.

Creating a list function to bind to was not a problem. But, getting selected option back to view model is. There is selected field in the combobox, but I can not bind to it - either because it is EditeAnywhere insteatd of BluprintReadAndWrite, or because it is private. There is an event on selection change, but I can not bind to it eiter - there is error "the function in node * cannot be overridden". Looks like not all events can be bound to in the viewmodel. Does it returns too much? Can a converter be created to fix that? Can we create a wrapper in the Blueprint? Can we create a wrapper for the option list in the blueprint?

Copy of the field with ReadWriteAcces works, but copy of event - does not. Why?

private:
	DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSelectionChangedEvent, FName, SelectedItem, ESelectInfo::Type, SelectionType);
public:
	UPROPERTY(BlueprintAssignable, Category = Events)
	FOnSelectionChangedEvent OnSelectionChanged;

private:
	DECLARE_DYNAMIC_MULTICAST_DELEGATE(FMySelectionChangedEvent);
public:
	UPROPERTY(BlueprintAssignable, Category = Events, meta = (AllowPrivateAccess = true))
	FMySelectionChangedEvent OnMySelectionChanged;

Common button event on selection changed does work:


DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FCommonSelectedStateChangedBase, class UCommonButtonBase*, Button, bool, Selected);


protected:
	UPROPERTY(BlueprintAssignable, Category = "Events", meta = (AllowPrivateAccess = true, DisplayName = "On Selected Changed"))
	FCommonSelectedStateChangedBase OnSelectedChangedBase;

Declared outside??? Yea that is the reason. So how do we proceed now? Well, It would be nice if we could just rebroadcast the signal in one line? Well, first of all, even with event, we still need some how to pass on value, and we can not read from selected! Then its field Again. Wonder if you can change access level in the descendand? Not really. So I do have my own field version, and it should work.

If we need to create wrapper around ComboKey, why not create it around actual widget we need - category entry? Would be nice, but I need bind functionality. I had it in the part browser widget.

Lets get it to the working state - so we can see content of the filters. Well, I do assign view model, still nothing in the view.

  • Do we put anything in the viewmodel? Yes we do.
  • We need widget creation code for the options of combobx! Works ) Lets look up how to populate combobox

Well It does have two functions - for content and for item, I wonder why there is two different ones? Probably because it is indeed a different widgets? So you can better customize it? And why the first option is None? - Fixed We probably should set it up during set items!

Still I need widget to actually filter shit. Hmm code in place, I do get event and setup field in the my widget, but it does not seems to get to the view mode. Maybe I need to call something on the field to notify view model? Where did we copy that field? Fixed: BroadcastFieldValueChanged(FFieldNotificationClassDescriptor::SelectedOption); Now we need actually to filter list by the filters! I had some ideas did not I? There is one place UpdatePart list We can just brut force through it - by checking each filter for each part. Or we can have intermediate data that can be quickly/conviniently checked against on each part. We need filter ids - so we can structure them. Or query a part if it has matching trait. This can be quite complicated. Why? Because filter may use different ways of checking traits. Dumb way to put match functions directly into view models, which is no go. Obvious solution have and Filter class that creates filter view model. Lets just put array of booleans on the ship part. No, elevation is already not boolean compatible. So how do we go about it? So each filter will go over each part and as only the properties it cares about. There is no real work around - we need object per filter, that know what view model to create and how to interpete view models input. Then there is a question if this is a ui code, should it not be a part of ui? It is not a ui code. It is a filter functionality for the shop.

Actually it is better to use events to trigger part list update than to subscribe to the vm changes.

There is an issue with view models per option in the combobox: We store names not viewmodels in the combobox it self. We can convert view models, maybe via converter, or maybe in our custom vidget - ok. But how do we get correct view model for the entry in the combobox? It is almost like in am better off writing my own combobx. It there a way to assign some object to the option in the combobox?

Wait, I can write converters in the viewmodel itself - I can have viewmodels property, and function that outpus item names. I can have selected name property and dynamic function that gets selected view model.

Well I do need a function to get view model by the name. I do believe I should be able just drop it in the view model and be happy.

LogScript: Warning: Accessed None trying to read property VMShipPartFilter
    WBP_PartFilterEntry_C /Engine/Transient.UnrealEdEngine_0:BP_MyCommonGameInstatnce_C_0.WBP_UILayout_C_0.WidgetTree_0.WBP_PartBrowser_C_0.WidgetTree_0.WBP_PartFilterEntry_C_0
    Function /Game/UI/PartBrowser/WBP_PartFilterEntry.WBP_PartFilterEntry_C:On_Combobox_GenerateContentWidget:004D
PIE: Error: Blueprint Runtime Error: "Accessed None trying to read property VMShipPartFilter". Node:  Set VMShip Part Filter Entry Graph:  On_Combobox_GenerateContentWidget Function:  On Combobox Generate Content Widget Blueprint:  WBP_PartFilterEntry

Problem happens once on initialization of combobox. Combobox creates a widget for the content - and can not find viewmodel yet. The stupid solution actually may be to pass viewmodel as construction parameter to our filter widget? Well then view model has to be a property on the c++ widget... This may not work Just added validity check to basically hide warning. I do not create any widget if there is no view model - does not seem to be creating any issues

Crashes on the null ptr/ dead ptr to the VM Can I find crash log? Yes! In Saved/Logs folder:

[2025.04.13-09.23.44:349][374]LogWindows: Error: === Critical error: ===
[2025.04.13-09.23.44:349][374]LogWindows: Error: 
[2025.04.13-09.23.44:349][374]LogWindows: Error: Fatal error!
[2025.04.13-09.23.44:349][374]LogWindows: Error: 
[2025.04.13-09.23.44:349][374]LogWindows: Error: Unhandled Exception: EXCEPTION_ACCESS_VIOLATION 0x0000000f00000001
[2025.04.13-09.23.44:349][374]LogWindows: Error: 
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x0000000f00000001 UnknownFunction []
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b410402 UnrealEditor-ShipEditor.dll!UVMShipPart::GetName() [D:\HMS Sunflower\HMS-Sunflower-ShipEditor\Source\ShipEditor\Private\UI\ViewModels\VMShipPart.cpp:12]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b3f2fc3 UnrealEditor-ShipEditor.dll!UVMShipPart::GetName_WrapperImpl() [D:\HMS Sunflower\HMS-Sunflower-ShipEditor\Intermediate\Build\Win64\UnrealEditor\Inc\ShipEditor\UHT\VMShipPart.gen.cpp:24]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b481997 UnrealEditor-ModelViewViewModel.dll!UE::MVVM::BindingHelper::ExecuteBinding_NoCheck() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Source\ModelViewViewModel\Private\Bindings\MVVMBindingHelper.cpp:659]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b485204 UnrealEditor-ModelViewViewModel.dll!FMVVMCompiledBindingLibrary::ExecuteImpl() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Source\ModelViewViewModel\Private\Bindings\MVVMCompiledBindingLibrary.cpp:312]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b485a63 UnrealEditor-ModelViewViewModel.dll!FMVVMCompiledBindingLibrary::ExecuteImpl() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Source\ModelViewViewModel\Private\Bindings\MVVMCompiledBindingLibrary.cpp:272]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b480a5b UnrealEditor-ModelViewViewModel.dll!UMVVMView::ExecuteBindingImmediately() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Source\ModelViewViewModel\Private\View\MVVMView.cpp:448]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b492637 UnrealEditor-ModelViewViewModel.dll!UMVVMView::InitializeSourceBindings() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Source\ModelViewViewModel\Private\View\MVVMView.cpp:371]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b49f60b UnrealEditor-ModelViewViewModel.dll!UMVVMView::SetSourceInternal() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Source\ModelViewViewModel\Private\View\MVVMView.cpp:860]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b49fb82 UnrealEditor-ModelViewViewModel.dll!UMVVMView::SetViewModel() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Source\ModelViewViewModel\Private\View\MVVMView.cpp:728]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffe9b4ad898 UnrealEditor-ModelViewViewModel.dll!UMVVMView::execSetViewModel() [D:\build\++UE5\Sync\Engine\Plugins\Runtime\ModelViewViewModel\Intermediate\Build\Win64\UnrealEditor\Inc\ModelViewViewModel\UHT\MVVMView.gen.cpp:513]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a4204c2 UnrealEditor-CoreUObject.dll!UFunction::Invoke() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:6847]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a773244 UnrealEditor-CoreUObject.dll!UObject::CallFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1139]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a787f3e UnrealEditor-CoreUObject.dll!UObject::ProcessContextOpcode() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:3086]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a7bdfe0 UnrealEditor-CoreUObject.dll!UObject::execLetBool() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:2977]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a78c368 UnrealEditor-CoreUObject.dll!ProcessLocalScriptFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1206]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a75d65d UnrealEditor-CoreUObject.dll!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1039]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a78bdb4 UnrealEditor-CoreUObject.dll!ProcessLocalFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1276]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a787f3e UnrealEditor-CoreUObject.dll!UObject::ProcessContextOpcode() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:3086]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a78c368 UnrealEditor-CoreUObject.dll!ProcessLocalScriptFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1206]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a75d65d UnrealEditor-CoreUObject.dll!ProcessScriptFunction<void (__cdecl*)(UObject *,FFrame &,void *)>() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1039]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a78bdb4 UnrealEditor-CoreUObject.dll!ProcessLocalFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1276]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a78c368 UnrealEditor-CoreUObject.dll!ProcessLocalScriptFunction() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1206]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a78b2cf UnrealEditor-CoreUObject.dll!UObject::ProcessInternal() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:1304]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a4204c2 UnrealEditor-CoreUObject.dll!UFunction::Invoke() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\Class.cpp:6847]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff8a789a55 UnrealEditor-CoreUObject.dll!UObject::ProcessEvent() [D:\build\++UE5\Sync\Engine\Source\Runtime\CoreUObject\Private\UObject\ScriptCore.cpp:2144]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff85adab63 UnrealEditor-UMG.dll!TMulticastScriptDelegate<FNotThreadSafeDelegateMode>::ProcessMulticastDelegate<UObject>() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\UObject\ScriptDelegates.h:917]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff85c8e057 UnrealEditor-UMG.dll!UListViewBase::HandleAnnounceGeneratedEntries() [D:\build\++UE5\Sync\Engine\Source\Runtime\UMG\Private\Components\ListViewBase.cpp:254]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fff85c6faf4 UnrealEditor-UMG.dll!V::TBaseUObjectMethodDelegateInstance::Execute() [D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Delegates\DelegateInstancesImpl.h:650]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffeda3a19c7 UnrealEditor-Engine.dll!FTimerUnifiedDelegate::Execute() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Public\TimerManager.h:50]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffeda438553 UnrealEditor-Engine.dll!FTimerManager::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\TimerManager.cpp:940]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffed92cf4c0 UnrealEditor-Engine.dll!UWorld::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\LevelTick.cpp:1563]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffebb87cffd UnrealEditor-UnrealEd.dll!UEditorEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\EditorEngine.cpp:2015]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ffebc4ff6b6 UnrealEditor-UnrealEd.dll!UUnrealEdEngine::Tick() [D:\build\++UE5\Sync\Engine\Source\Editor\UnrealEd\Private\UnrealEdEngine.cpp:550]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ff6bd698e0b UnrealEditor.exe!FEngineLoop::Tick() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\LaunchEngineLoop.cpp:5921]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ff6bd6be33c UnrealEditor.exe!GuardedMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Launch.cpp:180]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ff6bd6be42a UnrealEditor.exe!GuardedMainWrapper() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:118]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ff6bd6c18a4 UnrealEditor.exe!LaunchWindowsStartup() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:258]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ff6bd6d70c4 UnrealEditor.exe!WinMain() [D:\build\++UE5\Sync\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp:298]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007ff6bd6da37a UnrealEditor.exe!__scrt_common_main_seh() [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288]
[2025.04.13-09.23.44:349][374]LogWindows: Error: [Callstack] 0x00007fffeba1e8d7 KERNEL32.DLL!UnknownFunction []

It is clear that null ptr set as viewmodel. That is done during list generating and element, but not directly, there is delegate in between. Lets add check in the cobobox widget creation graph.

How do you animate? I have seen that easy tutorial on animating offset on the canvas. Can i do it my self? Well, it easy to do animation, but how do I play it? I can play it from blueprint. Can get an event based on the viewmodel? Well I can subscribe to the variable on the widget for sure, and bind that variable to the view model. But it is kind of lame! Omg, you can bind it to the function. This is actually neat!

Save/load menu and integration with dialog system So we need another widget to be present on the scree. Question is, can I push it the same widget stack? What stack is for? So you can overlay them on each other. But I kind of need them to be there simultaneously? Not really, from controller perspective, only one is active? Well what are the name of the stacks?

  • Game -> Hud and shit
  • GameMenu -> Pause?
  • Menu
  • Modal

Why does lira has separate Menu and Game menu stacks?

The layers are,
Game - Things like the HUD.
GameMenu - "Menus" specifically related to gameplay, like maybe an in game inventory UI.
Menu - Things like the settings screen.
Modal - Confirmation dialogs, error dialogs.

Can I redefine this layers?

⚠️ **GitHub.com Fallback** ⚠️