Skip to content

Commit 3d9e175

Browse files
committed
Use TWeakObjectPtr to better handle server deletion.
1 parent c37df6a commit 3d9e175

File tree

4 files changed

+27
-22
lines changed

4 files changed

+27
-22
lines changed

Source/CesiumEditor/Private/CesiumIonServerManager.cpp

+16-11
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,15 @@ void CesiumIonServerManager::Initialize() {
8686
}
8787

8888
void CesiumIonServerManager::ResumeAll() {
89-
const TArray<TObjectPtr<UCesiumIonServer>>& servers = this->GetServerList();
90-
for (const TObjectPtr<UCesiumIonServer>& pServer : servers) {
91-
std::shared_ptr<CesiumIonSession> pSession = this->GetSession(pServer);
92-
pSession->resume();
93-
pSession->refreshProfileIfNeeded();
89+
const TArray<TWeakObjectPtr<UCesiumIonServer>>& servers =
90+
this->GetServerList();
91+
for (const TWeakObjectPtr<UCesiumIonServer>& pWeakServer : servers) {
92+
UCesiumIonServer* pServer = pWeakServer.Get();
93+
if (pServer) {
94+
std::shared_ptr<CesiumIonSession> pSession = this->GetSession(pServer);
95+
pSession->resume();
96+
pSession->refreshProfileIfNeeded();
97+
}
9498
}
9599
}
96100

@@ -122,7 +126,7 @@ std::shared_ptr<CesiumIonSession> CesiumIonServerManager::GetCurrentSession() {
122126
return this->GetSession(this->GetCurrentServer());
123127
}
124128

125-
const TArray<TObjectPtr<UCesiumIonServer>>&
129+
const TArray<TWeakObjectPtr<UCesiumIonServer>>&
126130
CesiumIonServerManager::GetServerList() {
127131
this->RefreshServerList();
128132
return this->_servers;
@@ -191,12 +195,13 @@ void CesiumIonServerManager::OnAssetRemoved(const FAssetData& asset) {
191195
UCesiumIonServer* pServer = Cast<UCesiumIonServer>(asset.GetAsset());
192196
if (pServer && this->GetCurrentServer() == pServer) {
193197
// Current server is being removed, so select a different one.
194-
TObjectPtr<UCesiumIonServer>* ppNewServer = this->_servers.FindByPredicate(
195-
[pServer](const TObjectPtr<UCesiumIonServer>& pCandidate) {
196-
return pCandidate != pServer;
197-
});
198+
TWeakObjectPtr<UCesiumIonServer>* ppNewServer =
199+
this->_servers.FindByPredicate(
200+
[pServer](const TWeakObjectPtr<UCesiumIonServer>& pCandidate) {
201+
return pCandidate.Get() != pServer;
202+
});
198203
if (ppNewServer != nullptr) {
199-
this->SetCurrentServer(*ppNewServer);
204+
this->SetCurrentServer(ppNewServer->Get());
200205
} else {
201206
this->SetCurrentServer(nullptr);
202207
}

Source/CesiumEditor/Private/CesiumIonServerManager.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class CESIUMEDITOR_API CesiumIonServerManager {
2121
std::shared_ptr<CesiumIonSession> GetSession(UCesiumIonServer* Server);
2222
std::shared_ptr<CesiumIonSession> GetCurrentSession();
2323

24-
const TArray<TObjectPtr<UCesiumIonServer>>& GetServerList();
24+
const TArray<TWeakObjectPtr<UCesiumIonServer>>& GetServerList();
2525
void RefreshServerList();
2626

2727
UCesiumIonServer* GetCurrentServer();
@@ -41,5 +41,5 @@ class CESIUMEDITOR_API CesiumIonServerManager {
4141
};
4242

4343
TArray<ServerSession> _sessions;
44-
TArray<TObjectPtr<UCesiumIonServer>> _servers;
44+
TArray<TWeakObjectPtr<UCesiumIonServer>> _servers;
4545
};

Source/CesiumEditor/Private/CesiumIonServerSelector.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ void CesiumIonServerSelector::Construct(const FArguments& InArgs) {
1111
[SNew(SHorizontalBox) +
1212
SHorizontalBox::Slot().FillWidth(1.0f).VAlign(
1313
EVerticalAlignment::VAlign_Center)
14-
[SNew(SComboBox<TObjectPtr<UCesiumIonServer>>)
14+
[SNew(SComboBox<TWeakObjectPtr<UCesiumIonServer>>)
1515
.OptionsSource(
1616
&FCesiumEditorModule::serverManager().GetServerList())
1717
.OnGenerateWidget(
@@ -39,12 +39,12 @@ void CesiumIonServerSelector::Construct(const FArguments& InArgs) {
3939
namespace {
4040

4141
FText GetNameFromCesiumIonServerAsset(
42-
const TObjectPtr<UCesiumIonServer>& pServer) {
43-
if (!pServer)
42+
const TWeakObjectPtr<UCesiumIonServer>& pServer) {
43+
if (!pServer.IsValid())
4444
return FText::FromString("Error: No Cesium ion server configured.");
4545

4646
std::shared_ptr<CesiumIonSession> pSession =
47-
FCesiumEditorModule::serverManager().GetSession(pServer);
47+
FCesiumEditorModule::serverManager().GetSession(pServer.Get());
4848

4949
// Get the profile here, which will trigger it to load if it hasn't been
5050
// loaded already.
@@ -80,16 +80,16 @@ FText CesiumIonServerSelector::GetServerValueAsText() const {
8080
}
8181

8282
TSharedRef<SWidget> CesiumIonServerSelector::OnGenerateServerEntry(
83-
TObjectPtr<UCesiumIonServer> pServerAsset) {
83+
TWeakObjectPtr<UCesiumIonServer> pServerAsset) {
8484
return SNew(STextBlock).Text_Lambda([pServerAsset]() {
8585
return GetNameFromCesiumIonServerAsset(pServerAsset);
8686
});
8787
}
8888

8989
void CesiumIonServerSelector::OnServerSelectionChanged(
90-
TObjectPtr<UCesiumIonServer> InItem,
90+
TWeakObjectPtr<UCesiumIonServer> InItem,
9191
ESelectInfo::Type InSeletionInfo) {
92-
FCesiumEditorModule::serverManager().SetCurrentServer(InItem);
92+
FCesiumEditorModule::serverManager().SetCurrentServer(InItem.Get());
9393
FCesiumEditorModule::serverManager().GetCurrentSession()->resume();
9494
}
9595

Source/CesiumEditor/Private/CesiumIonServerSelector.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ class CesiumIonServerSelector : public SCompoundWidget {
1515

1616
private:
1717
TSharedRef<SWidget>
18-
OnGenerateServerEntry(TObjectPtr<UCesiumIonServer> pServer);
18+
OnGenerateServerEntry(TWeakObjectPtr<UCesiumIonServer> pServerAsset);
1919

2020
FText GetServerValueAsText() const;
2121

2222
void OnServerSelectionChanged(
23-
TObjectPtr<UCesiumIonServer> InItem,
23+
TWeakObjectPtr<UCesiumIonServer> InItem,
2424
ESelectInfo::Type InSeletionInfo);
2525
void OnBrowseForServer();
2626
};

0 commit comments

Comments
 (0)