Преглед изворни кода

Miscellaneous fixes to toggle buttons

Ivan Savenko пре 11 година
родитељ
комит
0882201b17
3 измењених фајлова са 21 додато и 24 уклоњено
  1. 20 22
      client/widgets/Buttons.cpp
  2. 0 1
      client/widgets/Buttons.h
  3. 1 1
      lib/mapObjects/JsonRandom.cpp

+ 20 - 22
client/widgets/Buttons.cpp

@@ -319,7 +319,9 @@ std::pair<std::string, std::string> CButton::tooltip(const std::string & hover,
 }
 
 CToggleBase::CToggleBase(CFunctionList<void (bool)> callback):
-    callback(callback)
+    callback(callback),
+    selected(false),
+    allowDeselection(true)
 {
 }
 
@@ -334,14 +336,11 @@ void CToggleBase::doSelect(bool on)
 
 void CToggleBase::setSelected(bool on)
 {
+	bool changed = (on != selected);
 	selected = on;
 	doSelect(on);
-}
-
-void CToggleBase::activate()
-{
-	if (canActivate())
-		setSelected(!selected);
+	if (changed)
+		callback(on);
 }
 
 bool CToggleBase::canActivate()
@@ -361,6 +360,7 @@ CToggleButton::CToggleButton(Point position, const std::string &defName, const s
   CButton(position, defName, help, 0, key, playerColoredButton),
   CToggleBase(callback)
 {
+	allowDeselection = true;
 }
 
 void CToggleButton::doSelect(bool on)
@@ -392,10 +392,10 @@ void CToggleButton::clickLeft(tribool down, bool previousState)
 
 	if(previousState)//mouse up
 	{
-		if(down == false && getState() == PRESSED)
+		if(down == false && getState() == PRESSED && canActivate())
 			setSelected(!selected);
 		else
-			setSelected(selected);
+			doSelect(selected); // restore
 	}
 }
 
@@ -413,10 +413,10 @@ void CToggleGroup::addToggle(int identifier, CToggleBase* bt)
 		addChild(intObj);
 	}
 
-	bt->addCallback(boost::bind(&CToggleGroup::selectionChanged, this, identifier));
+	bt->addCallback([=] (bool on) { if (on) selectionChanged(identifier);});
 	bt->allowDeselection = false;
 
-	assert(!buttons.count(identifier));
+	assert(buttons[identifier] == nullptr);
 	buttons[identifier] = bt;
 }
 
@@ -426,25 +426,23 @@ CToggleGroup::CToggleGroup(const CFunctionList<void(int)> &OnChange, bool musicL
 
 void CToggleGroup::setSelected(int id)
 {
-	assert(!buttons.empty());
-
-	auto bt = buttons[id];
-	if (bt)
-	{
-		bt->setSelected(true);
-		selectionChanged(id);
-	}
+	selectionChanged(id);
 }
 
 void CToggleGroup::selectionChanged(int to)
 {
-	if (buttons.count(selectedID))
-		buttons[selectedID]->setSelected(false);
+	if (to == selectedID)
+		return;
+
+	int oldSelection = selectedID;
+	selectedID = to;
+
+	if (buttons.count(oldSelection))
+		buttons[oldSelection]->setSelected(false);
 
 	if (buttons.count(to))
 		buttons[to]->setSelected(true);
 
-	selectedID = to;
 	onChange(to);
 	if (parent)
 		parent->redraw();

+ 0 - 1
client/widgets/Buttons.h

@@ -136,7 +136,6 @@ public:
 	CToggleBase(CFunctionList<void(bool)> callback);
 	virtual ~CToggleBase();
 
-	void activate();
 	void setSelected(bool on);
 
 	void addCallback(std::function<void(bool)> callback);

+ 1 - 1
lib/mapObjects/JsonRandom.cpp

@@ -197,7 +197,7 @@ namespace JsonRandom
 			}
 			const CCreature * crea = VLC->creh->creatures[VLC->modh->identifiers.getIdentifier("creature", node["type"]).get()];
 			info.allowedCreatures.push_back(crea);
-			if (!node["upgradeChance"].Float() > 0)
+			if (node["upgradeChance"].Float() > 0)
 			{
 				for (auto creaID : crea->upgrades)
 					info.allowedCreatures.push_back(VLC->creh->creatures[creaID]);