Files @ r24860:fb2788d47d86
Branch filter:

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

Michael Lutz
Codechange: [OSX] Only keep a total dirty rect for drawing.

When drawing an 8bpp screen buffer, palette resolving was done for each
dirty rectangle. In areas with high activity, this would mean a pixel might
have been resolved multiple times. Also, if too many individual updates
were queued, the whole screen would be refreshed, even if unnecessary.

All other drivers only keep one overall dirty rect, so do it here as well.
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
r18670:f122c356353c
r9953:8c469baed535
r18670:f122c356353c
r11487:9f589d1f7929
r21383:942c32fb8b0e
r21383:942c32fb8b0e
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
r17625:366001a31c88
r17625:366001a31c88
r17625:366001a31c88
r17625:366001a31c88
r17625:366001a31c88
r20280:ca1fc41725ff
r9953:8c469baed535
r12575:7a6d47e4fe35
r12462:a7cb564c6c56
r12456:451e8e6b0dc4
r20280:ca1fc41725ff
r12580:d40855379543
r18672:eaa1571567c5
r18672:eaa1571567c5
r18672:eaa1571567c5
r12580:d40855379543
r20280:ca1fc41725ff
r9953:8c469baed535
r21876:bc55b65c2f4f
r18667:3b72643a9c00
r15339:7114af1a8eb1
r18672:eaa1571567c5
r18467:be6d7226508e
r12456:451e8e6b0dc4
r12575:7a6d47e4fe35
r9953:8c469baed535
r9953:8c469baed535
r15305:1b8d2fb07238
r15305:1b8d2fb07238
r21876:bc55b65c2f4f
r15305:1b8d2fb07238
r15305:1b8d2fb07238
r23499:f9bf6ad58697
r12575:7a6d47e4fe35
r18672:eaa1571567c5
r12575:7a6d47e4fe35
r12575:7a6d47e4fe35
r23499:f9bf6ad58697
r9953:8c469baed535
r9953:8c469baed535
r18672:eaa1571567c5
r9953:8c469baed535
r24333:94ef0c6c84e2
r9953:8c469baed535
r16302:da2795c3f261
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r18672:eaa1571567c5
r9953:8c469baed535
r17569:79cc833a8f35
r9953:8c469baed535
r9953:8c469baed535
r18672:eaa1571567c5
r19645:699e1ec880f0
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r17476:d3b7a183536d
r17476:d3b7a183536d
r17476:d3b7a183536d
r17476:d3b7a183536d
r17476:d3b7a183536d
r23499:f9bf6ad58697
r9986:70a888f9bda9
r17476:d3b7a183536d
r12575:7a6d47e4fe35
r18672:eaa1571567c5
r12575:7a6d47e4fe35
r18672:eaa1571567c5
r12575:7a6d47e4fe35
r16302:da2795c3f261
r9986:70a888f9bda9
r9986:70a888f9bda9
r23499:f9bf6ad58697
r13745:49505a0400d8
r23607:36c15679007d
r18672:eaa1571567c5
r13745:49505a0400d8
r16107:0e7cd852debf
r16303:9fce015471e1
r16303:9fce015471e1
r13745:49505a0400d8
r13745:49505a0400d8
r13745:49505a0400d8
r23499:f9bf6ad58697
r9953:8c469baed535
r23607:36c15679007d
r10148:ec65442a5187
r23607:36c15679007d
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r17624:f2c5f47dceaa
r11487:9f589d1f7929
r11487:9f589d1f7929
r13742:180ad925befc
r24646:583bcdcccced
r18672:eaa1571567c5
r24646:583bcdcccced
r14035:4f06488d5a62
r20287:5b9a8691769e
r13742:180ad925befc
r11487:9f589d1f7929
r13745:49505a0400d8
r13745:49505a0400d8
r18672:eaa1571567c5
r11487:9f589d1f7929
r11487:9f589d1f7929
r11487:9f589d1f7929
r24646:583bcdcccced
r18672:eaa1571567c5
r13745:49505a0400d8
r11487:9f589d1f7929
r11487:9f589d1f7929
r11487:9f589d1f7929
r17624:f2c5f47dceaa
r20280:ca1fc41725ff
r20283:2a199c78224c
r9953:8c469baed535
r19745:d8f95208ad9e
r13554:d1964ead02ee
r11368:058349c3a02c
r9953:8c469baed535
r17624:f2c5f47dceaa
r17624:f2c5f47dceaa
r17624:f2c5f47dceaa
r17624:f2c5f47dceaa
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
r9953:8c469baed535
/*
 * 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 "widgets/waypoint_widget.h"

#include "table/strings.h"

#include "safeguards.h"

/** 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:
	/**
	 * Construct the window.
	 * @param desc The description of the window.
	 * @param window_number The window number, in this case the waypoint's ID.
	 */
	WaypointWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc)
	{
		this->wp = Waypoint::Get(window_number);
		this->vt = (wp->string_id == STR_SV_STNAME_WAYPOINT) ? VEH_TRAIN : VEH_SHIP;

		this->CreateNestedTree();
		if (this->vt == VEH_TRAIN) {
			this->GetWidget<NWidgetCore>(WID_W_SHOW_VEHICLES)->SetDataTip(STR_TRAIN, STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP);
			this->GetWidget<NWidgetCore>(WID_W_CENTER_VIEW)->tool_tip = STR_WAYPOINT_VIEW_CENTER_TOOLTIP;
			this->GetWidget<NWidgetCore>(WID_W_RENAME)->tool_tip = STR_WAYPOINT_VIEW_CHANGE_WAYPOINT_NAME;
		}
		this->FinishInitNested(window_number);

		this->owner = this->wp->owner;
		this->flags |= WF_DISABLE_VP_SCROLL;

		NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_W_VIEWPORT);
		nvp->InitializeViewport(this, this->GetCenterTile(), ZOOM_LVL_VIEWPORT);

		this->OnInvalidateData(0);
	}

	~WaypointWindow()
	{
		DeleteWindowById(GetWindowClassForVehicleType(this->vt), VehicleListIdentifier(VL_STATION_LIST, this->vt, this->owner, this->window_number).Pack(), false);
	}

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

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

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

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

	/**
	 * Some data on this window has become invalid.
	 * @param data Information about the changed data.
	 * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
	 */
	void OnInvalidateData(int data = 0, bool gui_scope = true) override
	{
		if (!gui_scope) return;
		/* You can only change your own waypoints */
		this->SetWidgetDisabledState(WID_W_RENAME, !this->wp->IsInUse() || (this->wp->owner != _local_company && this->wp->owner != OWNER_NONE));
		/* Disable the widget for waypoints with no use */
		this->SetWidgetDisabledState(WID_W_SHOW_VEHICLES, !this->wp->IsInUse());

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

	void OnResize() override
	{
		if (this->viewport != nullptr) {
			NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_W_VIEWPORT);
			nvp->UpdateViewportCoordinates(this);
			this->wp->UpdateVirtCoord();

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

	void OnQueryTextFinished(char *str) override
	{
		if (str == nullptr) return;

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

};

/** The widgets of the waypoint view. */
static const NWidgetPart _nested_waypoint_view_widgets[] = {
	NWidget(NWID_HORIZONTAL),
		NWidget(WWT_CLOSEBOX, COLOUR_GREY),
		NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_W_RENAME), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_BUOY_VIEW_CHANGE_BUOY_NAME),
		NWidget(WWT_CAPTION, COLOUR_GREY, WID_W_CAPTION), SetDataTip(STR_WAYPOINT_VIEW_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
		NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_W_CENTER_VIEW), SetMinimalSize(12, 14), SetDataTip(SPR_GOTO_LOCATION, STR_BUOY_VIEW_CENTER_TOOLTIP),
		NWidget(WWT_SHADEBOX, COLOUR_GREY),
		NWidget(WWT_DEFSIZEBOX, 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, WID_W_VIEWPORT), SetMinimalSize(256, 88), SetPadding(1, 1, 1, 1), SetResize(1, 1),
		EndContainer(),
	EndContainer(),
	NWidget(NWID_HORIZONTAL),
		NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 0), EndContainer(),
		NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_W_SHOW_VEHICLES), SetMinimalSize(15, 12), SetDataTip(STR_SHIP, STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP),
		NWidget(WWT_RESIZEBOX, COLOUR_GREY),
	EndContainer(),
};

/** The description of the waypoint view. */
static WindowDesc _waypoint_view_desc(
	WDP_AUTO, "view_waypoint", 260, 118,
	WC_WAYPOINT_VIEW, WC_NONE,
	0,
	_nested_waypoint_view_widgets, lengthof(_nested_waypoint_view_widgets)
);

/**
 * Show the window for the given waypoint.
 * @param wp The waypoint to show the window for.
 */
void ShowWaypointWindow(const Waypoint *wp)
{
	AllocateWindowDescFront<WaypointWindow>(&_waypoint_view_desc, wp->index);
}