Files @ r17167:68f47a8db1b5
Branch filter:

Location: cpp/openttd-patchpack/source/src/waypoint_gui.cpp - annotation

rubidium
(svn r21916) -Fix [FS#4442]: the minimum speed needed for (realistic) acceleration to work properly can sometimes be more than the (temporary) maximum speed causing Clamp to "fail". Make sure that the minimum speed always overrules the maximum speed
r9953:8c469baed535
r9953:8c469baed535
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r16069:5049a8060a4d
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r11058:03ccd99b7533
r15305:1b8d2fb07238
r10120:b4e83b1335af
r12465:c1b760a56db7
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r11487:9f589d1f7929
r11487:9f589d1f7929
r11487:9f589d1f7929
r12575:7a6d47e4fe35
r11487:9f589d1f7929
r11487:9f589d1f7929
r12456:451e8e6b0dc4
r11487:9f589d1f7929
r11487:9f589d1f7929
r16302:da2795c3f261
r9953:8c469baed535
r9953:8c469baed535
r16302:da2795c3f261
r16302:da2795c3f261
r16302:da2795c3f261
r16302:da2795c3f261
r16302:da2795c3f261
r16302:da2795c3f261
r16302:da2795c3f261
r16302:da2795c3f261
r16302:da2795c3f261
r16317:c87cb97b6914
r16317:c87cb97b6914
r16317:c87cb97b6914
r16317:c87cb97b6914
r16317:c87cb97b6914
r16302:da2795c3f261
r9953:8c469baed535
r9953:8c469baed535
r12575:7a6d47e4fe35
r9953:8c469baed535
r12575:7a6d47e4fe35
r12462:a7cb564c6c56
r12456:451e8e6b0dc4
r12575:7a6d47e4fe35
r12580:d40855379543
r13062:680961bd134a
r13062:680961bd134a
r13062:680961bd134a
r12580:d40855379543
r12575:7a6d47e4fe35
r9953:8c469baed535
r15339:7114af1a8eb1
r12575:7a6d47e4fe35
r15339:7114af1a8eb1
r13062:680961bd134a
r16302:da2795c3f261
r12456:451e8e6b0dc4
r12575:7a6d47e4fe35
r9953:8c469baed535
r9953:8c469baed535
r15305:1b8d2fb07238
r15305:1b8d2fb07238
r15305:1b8d2fb07238
r15305:1b8d2fb07238
r16069:5049a8060a4d
r15305:1b8d2fb07238
r15305:1b8d2fb07238
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r14399:3f819c0da60a
r9953:8c469baed535
r9953:8c469baed535
r11363:6906c490a00e
r9953:8c469baed535
r16302:da2795c3f261
r9953:8c469baed535
r16302:da2795c3f261
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r11363:6906c490a00e
r9953:8c469baed535
r16674:a2c7f634c52e
r9953:8c469baed535
r9953:8c469baed535
r12456:451e8e6b0dc4
r15306:1e95a9ffc6fb
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9986:70a888f9bda9
r9986:70a888f9bda9
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r16302:da2795c3f261
r9986:70a888f9bda9
r9986:70a888f9bda9
r13745:49505a0400d8
r13745:49505a0400d8
r13745:49505a0400d8
r13745:49505a0400d8
r13745:49505a0400d8
r16107:0e7cd852debf
r16303:9fce015471e1
r16303:9fce015471e1
r13745:49505a0400d8
r13745:49505a0400d8
r13745:49505a0400d8
r9953:8c469baed535
r9953:8c469baed535
r10148:ec65442a5187
r10148:ec65442a5187
r12622:202e83a6cee7
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r11487:9f589d1f7929
r11487:9f589d1f7929
r13742:180ad925befc
r13591:48a163a06543
r14035:4f06488d5a62
r13742:180ad925befc
r11487:9f589d1f7929
r13745:49505a0400d8
r13745:49505a0400d8
r13745:49505a0400d8
r11487:9f589d1f7929
r11487:9f589d1f7929
r11487:9f589d1f7929
r13745:49505a0400d8
r13745:49505a0400d8
r12622:202e83a6cee7
r13745:49505a0400d8
r11487:9f589d1f7929
r11487:9f589d1f7929
r11487:9f589d1f7929
r11368:058349c3a02c
r13786:6205ecbdf2fa
r9953:8c469baed535
r13739:747ed1f003e3
r13554:d1964ead02ee
r11368:058349c3a02c
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
/* $Id$ */

/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 */

/** @file waypoint_gui.cpp Handling of waypoints gui. */

#include "stdafx.h"
#include "window_gui.h"
#include "gui.h"
#include "textbuf_gui.h"
#include "vehiclelist.h"
#include "vehicle_gui.h"
#include "viewport_func.h"
#include "strings_func.h"
#include "command_func.h"
#include "company_func.h"
#include "company_base.h"
#include "window_func.h"
#include "waypoint_base.h"

#include "table/strings.h"

/** Widget definitions for the waypoint window. */
enum WaypointWindowWidgets {
	WAYPVW_CAPTION,
	WAYPVW_VIEWPORT,
	WAYPVW_CENTERVIEW,
	WAYPVW_RENAME,
	WAYPVW_SHOW_VEHICLES,
};

/** GUI for accessing waypoints and buoys. */
struct WaypointWindow : Window {
private:
	VehicleType vt; ///< Vehicle type using the waypoint.
	Waypoint *wp;   ///< Waypoint displayed by the window.

	/**
	 * Get the center tile of the waypoint.
	 * @return The center tile if the waypoint exists, otherwise the tile with the waypoint name.
	 */
	TileIndex GetCenterTile() const
	{
		if (!this->wp->IsInUse()) return this->wp->xy;

		TileArea ta;
		this->wp->GetTileArea(&ta, this->vt == VEH_TRAIN ? STATION_WAYPOINT : STATION_BUOY);
		return ta.GetCenterTile();
	}

public:
	WaypointWindow(const WindowDesc *desc, WindowNumber window_number) : Window()
	{
		this->wp = Waypoint::Get(window_number);
		this->vt = (wp->string_id == STR_SV_STNAME_WAYPOINT) ? VEH_TRAIN : VEH_SHIP;

		this->CreateNestedTree(desc);
		if (this->vt == VEH_TRAIN) {
			this->GetWidget<NWidgetCore>(WAYPVW_SHOW_VEHICLES)->SetDataTip(STR_TRAIN, STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP);
			this->GetWidget<NWidgetCore>(WAYPVW_CENTERVIEW)->tool_tip = STR_WAYPOINT_VIEW_CENTER_TOOLTIP;
			this->GetWidget<NWidgetCore>(WAYPVW_RENAME)->tool_tip = STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME;
		}
		this->FinishInitNested(desc, window_number);

		if (this->wp->owner != OWNER_NONE) this->owner = this->wp->owner;
		this->flags4 |= WF_DISABLE_VP_SCROLL;

		NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WAYPVW_VIEWPORT);
		nvp->InitializeViewport(this, this->GetCenterTile(), ZOOM_LVL_MIN);

		this->OnInvalidateData(0);
	}

	~WaypointWindow()
	{
		Owner owner = this->owner;
		if (!Company::IsValidID(owner)) owner = _local_company;
		DeleteWindowById(GetWindowClassForVehicleType(this->vt), VehicleListIdentifier(VL_STATION_LIST, this->vt, owner, this->window_number).Pack(), false);
	}

	virtual void SetStringParameters(int widget) const
	{
		if (widget == WAYPVW_CAPTION) SetDParam(0, this->wp->index);
	}

	virtual void OnClick(Point pt, int widget, int click_count)
	{
		switch (widget) {
			case WAYPVW_CENTERVIEW: // scroll to location
				if (_ctrl_pressed) {
					ShowExtraViewPortWindow(this->GetCenterTile());
				} else {
					ScrollMainWindowToTile(this->GetCenterTile());
				}
				break;

			case WAYPVW_RENAME: // rename
				SetDParam(0, this->wp->index);
				ShowQueryString(STR_WAYPOINT_NAME, STR_EDIT_WAYPOINT_NAME, MAX_LENGTH_STATION_NAME_CHARS, MAX_LENGTH_STATION_NAME_PIXELS, this, CS_ALPHANUMERAL, QSF_ENABLE_DEFAULT | QSF_LEN_IN_CHARS);
				break;

			case WAYPVW_SHOW_VEHICLES: // show list of vehicles having this waypoint in their orders
				ShowVehicleListWindow(this->owner, this->vt, this->wp->index);
				break;
		}
	}

	virtual void OnInvalidateData(int data)
	{
		/* You can only change your own waypoints */
		this->SetWidgetDisabledState(WAYPVW_RENAME, !this->wp->IsInUse() || (this->wp->owner != _local_company && this->wp->owner != OWNER_NONE));
		/* Disable the widget for waypoints with no use */
		this->SetWidgetDisabledState(WAYPVW_SHOW_VEHICLES, !this->wp->IsInUse());

		ScrollWindowToTile(this->GetCenterTile(), this, true);
	}

	virtual void OnResize()
	{
		if (this->viewport != NULL) {
			NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WAYPVW_VIEWPORT);
			nvp->UpdateViewportCoordinates(this);
			this->wp->UpdateVirtCoord();

			ScrollWindowToTile(this->GetCenterTile(), this, true); // Re-center viewport.
		}
	}

	virtual void OnQueryTextFinished(char *str)
	{
		if (str == NULL) return;

		DoCommandP(0, this->window_number, 0, CMD_RENAME_WAYPOINT | CMD_MSG(STR_ERROR_CAN_T_CHANGE_WAYPOINT_NAME), NULL, str);
	}

};

static const NWidgetPart _nested_waypoint_view_widgets[] = {
	NWidget(NWID_HORIZONTAL),
		NWidget(WWT_CLOSEBOX, COLOUR_GREY),
		NWidget(WWT_CAPTION, COLOUR_GREY, WAYPVW_CAPTION), SetDataTip(STR_WAYPOINT_VIEW_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
		NWidget(WWT_SHADEBOX, COLOUR_GREY),
		NWidget(WWT_STICKYBOX, COLOUR_GREY),
	EndContainer(),
	NWidget(WWT_PANEL, COLOUR_GREY),
		NWidget(WWT_INSET, COLOUR_GREY), SetPadding(2, 2, 2, 2),
			NWidget(NWID_VIEWPORT, COLOUR_GREY, WAYPVW_VIEWPORT), SetMinimalSize(256, 88), SetPadding(1, 1, 1, 1), SetResize(1, 1),
		EndContainer(),
	EndContainer(),
	NWidget(NWID_HORIZONTAL),
		NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WAYPVW_CENTERVIEW), SetMinimalSize(100, 12), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_BUTTON_LOCATION, STR_BUOY_VIEW_CENTER_TOOLTIP),
		NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WAYPVW_RENAME), SetMinimalSize(100, 12), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_BUTTON_RENAME, STR_BUOY_VIEW_CHANGE_BUOY_NAME),
		NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WAYPVW_SHOW_VEHICLES), SetMinimalSize(15, 12), SetDataTip(STR_SHIP, STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP),
		NWidget(WWT_RESIZEBOX, COLOUR_GREY),
	EndContainer(),
};

static const WindowDesc _waypoint_view_desc(
	WDP_AUTO, 260, 118,
	WC_WAYPOINT_VIEW, WC_NONE,
	WDF_UNCLICK_BUTTONS,
	_nested_waypoint_view_widgets, lengthof(_nested_waypoint_view_widgets)
);

void ShowWaypointWindow(const Waypoint *wp)
{
	AllocateWindowDescFront<WaypointWindow>(&_waypoint_view_desc, wp->index);
}