2
0
Эх сурвалжийг харах

genWindow can center on the last mouse event instead of the screen. Fixes bug 188.

Frank Zago 16 жил өмнө
parent
commit
5a9752fb8c

+ 1 - 1
client/CAdvmapInterface.cpp

@@ -1900,7 +1900,7 @@ void CAdvMapInt::handleRightClick(std::string text, tribool down, CIntObject * c
 {
 	if (down)
 	{
-		CSimpleWindow * temp = CMessage::genWindow(text,LOCPLINT->playerID);
+		CSimpleWindow * temp = CMessage::genWindow(text,LOCPLINT->playerID,true);
 		CRClickPopupInt *rcpi = new CRClickPopupInt(temp,true);
 		GH.pushInt(rcpi);
 	}

+ 14 - 3
client/CMessage.cpp

@@ -311,7 +311,7 @@ std::vector<std::vector<SDL_Surface*> > * CMessage::drawText(std::vector<std::st
 	} //ends for(int i=0; i<brtext->size();i++)
 	return txtg;
 }
-CSimpleWindow * CMessage::genWindow(std::string text, int player, int Lmar, int Rmar, int Tmar, int Bmar)
+CSimpleWindow * CMessage::genWindow(std::string text, int player, bool centerOnMouse, int Lmar, int Rmar, int Tmar, int Bmar)
 {
 	CSimpleWindow * ret = new CSimpleWindow();
 	int fontHeight;
@@ -321,8 +321,19 @@ CSimpleWindow * CMessage::genWindow(std::string text, int player, int Lmar, int
 	ret->bitmap = drawBox1(txts.first+Lmar+Rmar,txts.second+Tmar+Bmar,player);
 	ret->pos.h = ret->bitmap->h;
 	ret->pos.w = ret->bitmap->w;
-	ret->pos.x = screen->w/2 - (ret->pos.w/2);
-	ret->pos.y = screen->h/2 - (ret->pos.h/2);
+	if (centerOnMouse) {
+		ret->pos.x = GH.current->motion.x - ret->pos.w/2;
+		ret->pos.y = GH.current->motion.y - ret->pos.h/2;
+		// Put the window back on screen if necessary
+		amax(ret->pos.x, 0);
+		amax(ret->pos.y, 0);
+		amin(ret->pos.x, conf.cc.resx - ret->pos.w);
+		amin(ret->pos.y, conf.cc.resy - ret->pos.h);
+	} else {
+		// Center on screen
+		ret->pos.x = screen->w/2 - (ret->pos.w/2);
+		ret->pos.y = screen->h/2 - (ret->pos.h/2);
+	}
 	int curh = ret->bitmap->h/2 - (fontHeight*txtg->size())/2;
 	blitTextOnSur(txtg,fontHeight,curh,ret->bitmap);
 	delete brtext;

+ 1 - 1
client/CMessage.h

@@ -62,7 +62,7 @@ public:
 	static std::vector<std::vector<SDL_Surface*> > * drawText(std::vector<std::string> * brtext, int &fontHeigh, TTF_Font *font = NULL);
 	static SDL_Surface * blitTextOnSur(std::vector<std::vector<SDL_Surface*> > * txtg, int fontHeight, int & curh, SDL_Surface * ret, int xCenterPos=-1); //xPos==-1 works as if ret->w/2
 	static void drawIWindow(CInfoWindow * ret, std::string text, int player, int charperline);
-	static CSimpleWindow * genWindow(std::string text, int player, int Lmar=35, int Rmar=35, int Tmar=35, int Bmar=35);//supports h3 text formatting; player sets color of window, Lmar/Rmar/Tmar/Bmar are Left/Right/Top/Bottom margins
+	static CSimpleWindow * genWindow(std::string text, int player, bool centerOnMouse=false, int Lmar=35, int Rmar=35, int Tmar=35, int Bmar=35);//supports h3 text formatting; player sets color of window, Lmar/Rmar/Tmar/Bmar are Left/Right/Top/Bottom margins
 	static SDL_Surface * genMessage(std::string title, std::string text, EWindowType type=infoOnly,
 								std::vector<CDefHandler*> *addPics=NULL, void * cb=NULL);
 	static SDL_Surface * drawBox1(int w, int h, int playerColor=1);