@@ -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 */
173174void 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 */
217224void 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)
262275void 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+ }
0 commit comments