@@ -224,6 +224,33 @@ struct SignWindow : QueryStringBaseWindo
this->InvalidateWidget(QUERY_EDIT_SIGN_WIDGET_TEXT);
}
/**
* Returns a pointer to the (alphabetically) previous or next sign of the current sign.
* @param next false if the previous sign is wanted, true if the next sign is wanted
* @return pointer to the previous/next sign
*/
const Sign *PrevNextSign(bool next)
{
/* Rebuild the sign list */
this->signs.ForceRebuild();
this->signs.NeedResort();
this->BuildSignsList();
this->SortSignsList();
/* Search through the list for the current sign, excluding
* - the first sign if we want the previous sign or
* - the last sign if we want the next sign */
uint end = this->signs.Length() - (next ? 1 : 0);
for (uint i = next ? 0 : 1; i < end; i++) {
if (this->cur_sign == this->signs[i]->index) {
/* We've found the current sign, so return the sign before/after it */
return this->signs[i + (next ? 1 : -1)];
/* If we haven't found the current sign by now, return the last/first sign */
return this->signs[next ? 0 : this->signs.Length() - 1];
virtual void OnPaint()
SetDParam(0, this->caption);
@@ -234,46 +261,16 @@ struct SignWindow : QueryStringBaseWindo
virtual void OnClick(Point pt, int widget)
switch (widget) {
case QUERY_EDIT_SIGN_WIDGET_PREVIOUS: {
case QUERY_EDIT_SIGN_WIDGET_PREVIOUS:
case QUERY_EDIT_SIGN_WIDGET_NEXT: {
const Sign *si = this->PrevNextSign(widget == QUERY_EDIT_SIGN_WIDGET_NEXT);
/* By default pick the last entry */
const Sign *si = this->signs[this->signs.Length() - 1];
for (uint i = 1; i < this->signs.Length(); i++) {
si = this->signs[i - 1];
break;
/* Scroll to sign and reopen window */
ScrollMainWindowToTile(TileVirtXY(si->x, si->y));
UpdateSignEditWindow(si);
for (uint i = 0; i < this->signs.Length() - 1; i++) {
si = this->signs[i + 1];
Status change: