소스 검색

refresh list

Laserlicht 11 달 전
부모
커밋
164aac4db2
5개의 변경된 파일23개의 추가작업 그리고 6개의 파일을 삭제
  1. 1 1
      client/NetPacksLobbyClient.cpp
  2. 10 2
      client/lobby/SelectionTab.cpp
  3. 3 0
      lib/networkPacks/PacksForLobby.h
  4. 2 1
      lib/serializer/ESerializationVersion.h
  5. 7 2
      server/NetPacksLobbyServer.cpp

+ 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);
 }