Skip to content

Commit 55c1880

Browse files
committed
Fix UI issues with psi training and soldiers list.
1 parent d44f647 commit 55c1880

5 files changed

Lines changed: 115 additions & 66 deletions

File tree

src/Basescape/CraftSoldiersState.cpp

Lines changed: 103 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ CraftSoldiersState::CraftSoldiersState(Game *game, Base *base, size_t craft) : S
115115
_lstSoldiers->onLeftArrowClick((ActionHandler)&CraftSoldiersState::lstItemsLeftArrowClick);
116116
_lstSoldiers->onRightArrowClick((ActionHandler)&CraftSoldiersState::lstItemsRightArrowClick);
117117
_lstSoldiers->onMouseClick((ActionHandler)&CraftSoldiersState::lstSoldiersClick, 0);
118+
_lstSoldiers->onMousePress((ActionHandler)&CraftSoldiersState::lstSoldiersMousePress);
118119
}
119120

120121
/**
@@ -167,92 +168,104 @@ void CraftSoldiersState::init()
167168
}
168169

169170
/**
170-
* Reorders a soldier.
171+
* Reorders a soldier up.
171172
* @param action Pointer to an action.
172173
*/
173174
void CraftSoldiersState::lstItemsLeftArrowClick(Action *action)
174175
{
175-
if (action->getDetails()->button.button == SDL_BUTTON_LEFT
176-
|| action->getDetails()->button.button == SDL_BUTTON_RIGHT)
176+
int row = _lstSoldiers->getSelectedRow();
177+
if (row > 0)
177178
{
178-
int row = _lstSoldiers->getSelectedRow();
179-
if (row > 0 )
179+
if (action->getDetails()->button.button == SDL_BUTTON_LEFT)
180+
{
181+
moveSoldierUp(action, row);
182+
}
183+
else if (action->getDetails()->button.button == SDL_BUTTON_RIGHT)
180184
{
181-
Soldier *s = _base->getSoldiers()->at(row);
182-
if (SDL_BUTTON_LEFT == action->getDetails()->button.button)
183-
{
184-
_base->getSoldiers()->at(row) = _base->getSoldiers()->at(row-1);
185-
_base->getSoldiers()->at(row-1) = s;
186-
if (row != _lstSoldiers->getScroll())
187-
{
188-
SDL_WarpMouse(action->getLeftBlackBand() + action->getXMouse(), action->getTopBlackBand() + action->getYMouse() - static_cast<Uint16>(8 * action->getYScale()));
189-
}
190-
else
191-
{
192-
_lstSoldiers->scrollUp(false);
193-
}
194-
}
195-
else
196-
{
197-
_base->getSoldiers()->erase(_base->getSoldiers()->begin()+row);
198-
_base->getSoldiers()->insert(_base->getSoldiers()->begin(),s);
199-
}
185+
moveSoldierUp(action, row, true);
200186
}
201-
init();
202187
}
203-
else if (action->getDetails()->button.button == SDL_BUTTON_WHEELUP)
188+
}
189+
190+
/**
191+
* Moves a soldier up on the list.
192+
* @param action Pointer to an action.
193+
* @param row Selected soldier row.
194+
* @param max Move the soldier to the top?
195+
*/
196+
void CraftSoldiersState::moveSoldierUp(Action *action, int row, bool max)
197+
{
198+
Soldier *s = _base->getSoldiers()->at(row);
199+
if (max)
204200
{
205-
_lstSoldiers->scrollUp(false, true);
201+
_base->getSoldiers()->erase(_base->getSoldiers()->begin() + row);
202+
_base->getSoldiers()->insert(_base->getSoldiers()->begin(), s);
206203
}
207-
else if (action->getDetails()->button.button == SDL_BUTTON_WHEELUP)
204+
else
208205
{
209-
_lstSoldiers->scrollDown(false, true);
206+
_base->getSoldiers()->at(row) = _base->getSoldiers()->at(row - 1);
207+
_base->getSoldiers()->at(row - 1) = s;
208+
if (row != _lstSoldiers->getScroll())
209+
{
210+
SDL_WarpMouse(action->getLeftBlackBand() + action->getXMouse(), action->getTopBlackBand() + action->getYMouse() - static_cast<Uint16>(8 * action->getYScale()));
211+
}
212+
else
213+
{
214+
_lstSoldiers->scrollUp(false);
215+
}
210216
}
217+
init();
211218
}
212219

213220
/**
214-
* Reorders a soldier.
221+
* Reorders a soldier down.
215222
* @param action Pointer to an action.
216223
*/
217224
void CraftSoldiersState::lstItemsRightArrowClick(Action *action)
218225
{
219-
if (action->getDetails()->button.button == SDL_BUTTON_LEFT
220-
|| action->getDetails()->button.button == SDL_BUTTON_RIGHT)
226+
int row = _lstSoldiers->getSelectedRow();
227+
size_t numSoldiers = _base->getSoldiers()->size();
228+
if (0 < numSoldiers && INT_MAX >= numSoldiers && row < (int)numSoldiers - 1)
221229
{
222-
int row = _lstSoldiers->getSelectedRow();
223-
size_t numSoldiers = _base->getSoldiers()->size();
224-
if (0 < numSoldiers && INT_MAX >= numSoldiers && row < (int)numSoldiers - 1)
230+
if (action->getDetails()->button.button == SDL_BUTTON_LEFT)
231+
{
232+
moveSoldierDown(action, row);
233+
}
234+
else if (action->getDetails()->button.button == SDL_BUTTON_RIGHT)
225235
{
226-
Soldier *s = _base->getSoldiers()->at(row);
227-
if (SDL_BUTTON_LEFT == action->getDetails()->button.button)
228-
{
229-
_base->getSoldiers()->at(row) = _base->getSoldiers()->at(row+1);
230-
_base->getSoldiers()->at(row+1) = s;
231-
if (row != 15 + _lstSoldiers->getScroll())
232-
{
233-
SDL_WarpMouse(action->getLeftBlackBand() + action->getXMouse(), action->getTopBlackBand() + action->getYMouse() + static_cast<Uint16>(8 * action->getYScale()));
234-
}
235-
else
236-
{
237-
_lstSoldiers->scrollDown(false);
238-
}
239-
}
240-
else
241-
{
242-
_base->getSoldiers()->erase(_base->getSoldiers()->begin()+row);
243-
_base->getSoldiers()->insert(_base->getSoldiers()->end(),s);
244-
}
236+
moveSoldierDown(action, row, true);
245237
}
246-
init();
247238
}
248-
else if (action->getDetails()->button.button == SDL_BUTTON_WHEELUP)
239+
}
240+
241+
/**
242+
* Moves a soldier down on the list.
243+
* @param action Pointer to an action.
244+
* @param row Selected soldier row.
245+
* @param max Move the soldier to the bottom?
246+
*/
247+
void CraftSoldiersState::moveSoldierDown(Action *action, int row, bool max)
248+
{
249+
Soldier *s = _base->getSoldiers()->at(row);
250+
if (max)
249251
{
250-
_lstSoldiers->scrollUp(false, true);
252+
_base->getSoldiers()->erase(_base->getSoldiers()->begin() + row);
253+
_base->getSoldiers()->insert(_base->getSoldiers()->end(), s);
251254
}
252-
else if (action->getDetails()->button.button == SDL_BUTTON_WHEELUP)
255+
else
253256
{
254-
_lstSoldiers->scrollDown(false, true);
257+
_base->getSoldiers()->at(row) = _base->getSoldiers()->at(row + 1);
258+
_base->getSoldiers()->at(row + 1) = s;
259+
if (row != _lstSoldiers->getVisibleRows() - 1 + _lstSoldiers->getScroll())
260+
{
261+
SDL_WarpMouse(action->getLeftBlackBand() + action->getXMouse(), action->getTopBlackBand() + action->getYMouse() + static_cast<Uint16>(8 * action->getYScale()));
262+
}
263+
else
264+
{
265+
_lstSoldiers->scrollDown(false);
266+
}
255267
}
268+
init();
256269
}
257270

258271
/**
@@ -262,7 +275,7 @@ void CraftSoldiersState::lstItemsRightArrowClick(Action *action)
262275
void CraftSoldiersState::lstSoldiersClick(Action *action)
263276
{
264277
double mx = action->getAbsoluteXMouse();
265-
if ( mx >= _lstSoldiers->getArrowsLeftEdge() && mx < _lstSoldiers->getArrowsRightEdge() )
278+
if (mx >= _lstSoldiers->getArrowsLeftEdge() && mx < _lstSoldiers->getArrowsRightEdge())
266279
{
267280
return;
268281
}
@@ -299,4 +312,34 @@ void CraftSoldiersState::lstSoldiersClick(Action *action)
299312
}
300313
}
301314

315+
/**
316+
* Handles the mouse-wheels on the arrow-buttons.
317+
* @param action Pointer to an action.
318+
*/
319+
void CraftSoldiersState::lstSoldiersMousePress(Action *action)
320+
{
321+
if (Options::changeValueByMouseWheel == 0)
322+
return;
323+
int row = _lstSoldiers->getSelectedRow();
324+
size_t numSoldiers = _base->getSoldiers()->size();
325+
if (action->getDetails()->button.button == SDL_BUTTON_WHEELUP &&
326+
row > 0)
327+
{
328+
if (action->getAbsoluteXMouse() >= _lstSoldiers->getArrowsLeftEdge() &&
329+
action->getAbsoluteXMouse() <= _lstSoldiers->getArrowsRightEdge())
330+
{
331+
moveSoldierUp(action, row);
332+
}
333+
}
334+
else if (action->getDetails()->button.button == SDL_BUTTON_WHEELDOWN &&
335+
0 < numSoldiers && INT_MAX >= numSoldiers && row < (int)numSoldiers - 1)
336+
{
337+
if (action->getAbsoluteXMouse() >= _lstSoldiers->getArrowsLeftEdge() &&
338+
action->getAbsoluteXMouse() <= _lstSoldiers->getArrowsRightEdge())
339+
{
340+
moveSoldierDown(action, row);
341+
}
342+
}
302343
}
344+
345+
}

src/Basescape/CraftSoldiersState.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,16 @@ class CraftSoldiersState : public State
5555
void init();
5656
/// Handler for clicking the Soldiers reordering button.
5757
void lstItemsLeftArrowClick(Action *action);
58+
/// Moves a soldier up.
59+
void moveSoldierUp(Action *action, int row, bool max = false);
5860
/// Handler for clicking the Soldiers reordering button.
5961
void lstItemsRightArrowClick(Action *action);
62+
/// Moves a soldier down.
63+
void moveSoldierDown(Action *action, int row, bool max = false);
6064
/// Handler for clicking the Soldiers list.
6165
void lstSoldiersClick(Action *action);
66+
/// Handler for pressing-down a mouse-button in the list.
67+
void lstSoldiersMousePress(Action *action);
6268
};
6369

6470
}

src/Basescape/SoldierInfoState.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ void SoldierInfoState::init()
553553
_numPsiSkill->setText(ss15.str());
554554
_barPsiSkill->setMax(current->psiSkill);
555555
_barPsiSkill->setValue(current->psiSkill);
556-
_barPsiSkill->setValue2(initial->psiSkill);
556+
_barPsiSkill->setValue2(current->psiSkill - _soldier->getImprovement());
557557

558558
_txtPsiSkill->setVisible(true);
559559
_numPsiSkill->setVisible(true);

src/Geoscape/AllocatePsiTrainingState.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ AllocatePsiTrainingState::AllocatePsiTrainingState(Game *game, Base *base) : Sta
104104
_txtTraining->setText(tr("STR_IN_TRAINING"));
105105

106106
_lstSoldiers->setColor(Palette::blockOffset(13)+10);
107-
_lstSoldiers->setArrowColumn(-1, ARROW_VERTICAL);
108-
_lstSoldiers->setColumns(4, 116, 80, 72, 30);
107+
_lstSoldiers->setAlign(ALIGN_RIGHT, 3);
108+
_lstSoldiers->setColumns(4, 114, 80, 62, 30);
109109
_lstSoldiers->setSelectable(true);
110110
_lstSoldiers->setBackground(_window);
111111
_lstSoldiers->setMargin(2);
@@ -118,7 +118,7 @@ AllocatePsiTrainingState::AllocatePsiTrainingState(Game *game, Base *base) : Sta
118118
_soldiers.push_back(*s);
119119
if ((*s)->getCurrentStats()->psiSkill > 0 || (Options::psiStrengthEval && _game->getSavedGame()->isResearched(_game->getRuleset()->getPsiRequirements())))
120120
{
121-
ssStr << ((*s)->getCurrentStats()->psiStrength);
121+
ssStr << L" " << (*s)->getCurrentStats()->psiStrength;
122122
}
123123
else
124124
{

src/Interface/Text.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ int Text::getLineX(int line) const
454454
case ALIGN_LEFT:
455455
break;
456456
case ALIGN_CENTER:
457-
x = (int)ceil((getWidth() - 1 - _lineWidth[line]) / 2.0);
457+
x = (int)ceil((getWidth() + _font->getSpacing() - _lineWidth[line]) / 2.0);
458458
break;
459459
case ALIGN_RIGHT:
460460
x = getWidth() - 1 - _lineWidth[line];
@@ -468,7 +468,7 @@ int Text::getLineX(int line) const
468468
x = getWidth() - 1;
469469
break;
470470
case ALIGN_CENTER:
471-
x = getWidth() - (int)ceil((getWidth() - 1 - _lineWidth[line]) / 2.0);
471+
x = getWidth() - (int)ceil((getWidth() + _font->getSpacing() - _lineWidth[line]) / 2.0);
472472
break;
473473
case ALIGN_RIGHT:
474474
x = _lineWidth[line];

0 commit comments

Comments
 (0)