2
0
Laserlicht 11 сар өмнө
parent
commit
164aac4db2

+ 1 - 1
client/NetPacksLobbyClient.cpp

@@ -226,7 +226,7 @@ void ApplyOnLobbyScreenNetPackVisitor::visitLobbyUpdateState(LobbyUpdateState &
 	else
 		lobby->updateAfterStateChange();
 
-	if(pack.hostChanged)
+	if(pack.hostChanged || pack.refreshList)
 		lobby->toggleMode(handler.isHost());
 }
 

+ 10 - 2
client/lobby/SelectionTab.cpp

@@ -262,10 +262,10 @@ SelectionTab::SelectionTab(ESelectionScreen Type)
 
 void SelectionTab::toggleMode()
 {
+	allItems.clear();
+	curItems.clear();
 	if(CSH->isGuest())
 	{
-		allItems.clear();
-		curItems.clear();
 		if(slider)
 			slider->block(true);
 	}
@@ -344,6 +344,14 @@ void SelectionTab::clickReleased(const Point & cursorPosition)
 			}
 
 			std::cout << (curItems[py]->isFolder ? curItems[py]->folderName : curItems[py]->fullFileURI) << "\n";
+
+			if(!curItems[py]->isFolder)
+				CInfoWindow::showYesNoDialog(CGI->generaltexth->translate("vcmi.lobby.deleteFile") + "\n\n" + curItems[py]->fullFileURI, std::vector<std::shared_ptr<CComponent>>(), [this, py](){
+					LobbyDelete ld;
+					ld.type = tabType == ESelectionScreen::newGame ? LobbyDelete::RANDOMMAP : LobbyDelete::SAVEGAME;
+					ld.name = curItems[py]->fileURI;
+					CSH->sendLobbyPack(ld);
+				}, nullptr);
 		}
 	}
 #ifdef VCMI_MOBILE

+ 3 - 0
lib/networkPacks/PacksForLobby.h

@@ -170,12 +170,15 @@ struct DLL_LINKAGE LobbyUpdateState : public CLobbyPackToPropagate
 {
 	LobbyState state;
 	bool hostChanged = false; // Used on client-side only
+	bool refreshList = false;
 
 	void visitTyped(ICPackVisitor & visitor) override;
 
 	template <typename Handler> void serialize(Handler &h)
 	{
 		h & state;
+		if (h.version >= Handler::Version::LOBBY_DELETE)
+			h & refreshList;
 	}
 };
 

+ 2 - 1
lib/serializer/ESerializationVersion.h

@@ -65,6 +65,7 @@ enum class ESerializationVersion : int32_t
 	LOCAL_PLAYER_STATE_DATA, // 866 - player state contains arbitrary client-side data
 	REMOVE_TOWN_PTR, // 867 - removed pointer to CTown from CGTownInstance
 	REMOVE_OBJECT_TYPENAME, // 868 - remove typename from CGObjectInstance
+	LOBBY_DELETE, // 869 - possibility to delete savegames and random maps
 
-	CURRENT = REMOVE_OBJECT_TYPENAME
+	CURRENT = LOBBY_DELETE
 };

+ 7 - 2
server/NetPacksLobbyServer.cpp

@@ -442,10 +442,15 @@ void ClientPermissionsCheckerNetPackVisitor::visitLobbyDelete(LobbyDelete & pack
 
 void ApplyOnServerNetPackVisitor::visitLobbyDelete(LobbyDelete & pack)
 {
-	if(pack.type == LobbyDelete::SAVEGAME)
+	if(pack.type == LobbyDelete::SAVEGAME || pack.type == LobbyDelete::RANDOMMAP)
 	{
-		auto res = ResourcePath(pack.name, EResType::SAVEGAME);
+		auto res = ResourcePath(pack.name, pack.type == LobbyDelete::SAVEGAME ? EResType::SAVEGAME : EResType::MAP);
 		auto file = boost::filesystem::canonical(*CResourceHandler::get()->getResourceName(res));
 		boost::filesystem::remove(file);
 	}
+
+	LobbyUpdateState lus;
+	lus.state = srv;
+	lus.refreshList = true;
+	srv.announcePack(lus);
 }