Files @ r17167:68f47a8db1b5
Branch filter:

Location: cpp/openttd-patchpack/source/src/transparency_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
r6427:94a91cd8da86
r6427:94a91cd8da86
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r9111:983de9c5a848
r9111:983de9c5a848
r6427:94a91cd8da86
r8107:82461791b7a2
r7849:cfd99cb69695
r8157:cf41aa22cd09
r7849:cfd99cb69695
r8264:d493cb51fe8a
r8264:d493cb51fe8a
r8264:d493cb51fe8a
r7849:cfd99cb69695
r8527:747e853197d7
r8806:1fc0d9e1c2bf
r15520:98d968d59e96
r6427:94a91cd8da86
r11631:7d10a919011c
r11631:7d10a919011c
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r15734:ae8e2e185874
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r12522:08b420f1ca5a
r11631:7d10a919011c
r11631:7d10a919011c
r13573:7ad47963c26b
r11631:7d10a919011c
r11631:7d10a919011c
r9196:80833565de60
r9196:80833565de60
r9196:80833565de60
r12523:03c4f2100c71
r9196:80833565de60
r12523:03c4f2100c71
r9196:80833565de60
r6496:bbfde726b81e
r9196:80833565de60
r9196:80833565de60
r12523:03c4f2100c71
r9273:0df9c11598cc
r12523:03c4f2100c71
r8806:1fc0d9e1c2bf
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r13062:680961bd134a
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r9196:80833565de60
r9196:80833565de60
r6427:94a91cd8da86
r14399:3f819c0da60a
r9196:80833565de60
r12522:08b420f1ca5a
r9196:80833565de60
r9196:80833565de60
r12522:08b420f1ca5a
r9196:80833565de60
r9196:80833565de60
r9196:80833565de60
r12522:08b420f1ca5a
r9196:80833565de60
r9196:80833565de60
r9196:80833565de60
r12522:08b420f1ca5a
r12523:03c4f2100c71
r12523:03c4f2100c71
r13062:680961bd134a
r15542:f6c6d0f8689e
r12523:03c4f2100c71
r15542:f6c6d0f8689e
r12523:03c4f2100c71
r12523:03c4f2100c71
r8806:1fc0d9e1c2bf
r12523:03c4f2100c71
r9196:80833565de60
r8806:1fc0d9e1c2bf
r9196:80833565de60
r12523:03c4f2100c71
r9196:80833565de60
r9196:80833565de60
r13024:48c81d0b078a
r6427:94a91cd8da86
r9196:80833565de60
r6427:94a91cd8da86
r6427:94a91cd8da86
r13784:714b55955586
r13784:714b55955586
r13784:714b55955586
r13784:714b55955586
r13784:714b55955586
r13784:714b55955586
r13784:714b55955586
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r12523:03c4f2100c71
r6427:94a91cd8da86
r6427:94a91cd8da86
r11632:2ff0ad7253de
r11632:2ff0ad7253de
r13742:180ad925befc
r13742:180ad925befc
r13742:180ad925befc
r11632:2ff0ad7253de
r11632:2ff0ad7253de
r13694:4523784084b5
r13694:4523784084b5
r13694:4523784084b5
r13694:4523784084b5
r13694:4523784084b5
r13694:4523784084b5
r13694:4523784084b5
r13694:4523784084b5
r13694:4523784084b5
r13745:49505a0400d8
r11632:2ff0ad7253de
r11632:2ff0ad7253de
r13573:7ad47963c26b
r11632:2ff0ad7253de
r11632:2ff0ad7253de
r11632:2ff0ad7253de
r11368:058349c3a02c
r13788:02dadd01bdbe
r6427:94a91cd8da86
r13739:747ed1f003e3
r13554:d1964ead02ee
r11368:058349c3a02c
r6427:94a91cd8da86
r11962:0e3a6981e508
r6427:94a91cd8da86
r9196:80833565de60
r6427:94a91cd8da86
/* $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 transparency_gui.cpp The transparency GUI. */

#include "stdafx.h"
#include "window_gui.h"
#include "transparency.h"
#include "sound_func.h"

#include "table/sprites.h"
#include "table/strings.h"

TransparencyOptionBits _transparency_opt;
TransparencyOptionBits _transparency_lock;
TransparencyOptionBits _invisibility_opt;
byte _display_opt;

/** Widget numbers of the transparency window. */
enum TransparencyToolbarWidgets {
	/* Button row. */
	TTW_WIDGET_BEGIN,                    ///< First toggle button.
	TTW_WIDGET_SIGNS = TTW_WIDGET_BEGIN, ///< Signs background transparency toggle button.
	TTW_WIDGET_TREES,                    ///< Trees transparency toggle button.
	TTW_WIDGET_HOUSES,                   ///< Houses transparency toggle button.
	TTW_WIDGET_INDUSTRIES,               ///< industries transparency toggle button.
	TTW_WIDGET_BUILDINGS,                ///< Company buildings and structures transparency toggle button.
	TTW_WIDGET_BRIDGES,                  ///< Bridges transparency toggle button.
	TTW_WIDGET_STRUCTURES,               ///< Object structure transparency toggle button.
	TTW_WIDGET_CATENARY,                 ///< Catenary transparency toggle button.
	TTW_WIDGET_LOADING,                  ///< Loading indicators transparency toggle button.
	TTW_WIDGET_END,                      ///< End of toggle buttons.

	/* Panel with buttons for invisibility */
	TTW_WIDGET_BUTTONS,                  ///< Panel with 'invisibility' buttons.
};

class TransparenciesWindow : public Window
{
public:
	TransparenciesWindow(const WindowDesc *desc, int window_number) : Window()
	{
		this->InitNested(desc, window_number);
	}

	virtual void OnPaint()
	{
		OnInvalidateData(0); // Must be sure that the widgets show the transparency variable changes, also when we use shortcuts.
		this->DrawWidgets();
	}

	virtual void DrawWidget(const Rect &r, int widget) const
	{
		switch (widget) {
			case TTW_WIDGET_SIGNS:
			case TTW_WIDGET_TREES:
			case TTW_WIDGET_HOUSES:
			case TTW_WIDGET_INDUSTRIES:
			case TTW_WIDGET_BUILDINGS:
			case TTW_WIDGET_BRIDGES:
			case TTW_WIDGET_STRUCTURES:
			case TTW_WIDGET_CATENARY:
			case TTW_WIDGET_LOADING: {
				uint i = widget - TTW_WIDGET_BEGIN;
				if (HasBit(_transparency_lock, i)) DrawSprite(SPR_LOCK, PAL_NONE, r.left + 1, r.top + 1);
				break;
			}
			case TTW_WIDGET_BUTTONS:
				for (uint i = TTW_WIDGET_BEGIN; i < TTW_WIDGET_END; i++) {
					if (i == TTW_WIDGET_LOADING) continue; // Do not draw button for invisible loading indicators.

					const NWidgetBase *wi = this->GetWidget<NWidgetBase>(i);
					DrawFrameRect(wi->pos_x + 1, r.top + 2, wi->pos_x + wi->current_x - 2, r.bottom - 2, COLOUR_PALE_GREEN,
							HasBit(_invisibility_opt, i - TTW_WIDGET_BEGIN) ? FR_LOWERED : FR_NONE);
				}
				break;
		}
	}

	virtual void OnClick(Point pt, int widget, int click_count)
	{
		if (widget >= TTW_WIDGET_BEGIN && widget < TTW_WIDGET_END) {
			if (_ctrl_pressed) {
				/* toggle the bit of the transparencies lock variable */
				ToggleTransparencyLock((TransparencyOption)(widget - TTW_WIDGET_BEGIN));
				this->SetDirty();
			} else {
				/* toggle the bit of the transparencies variable and play a sound */
				ToggleTransparency((TransparencyOption)(widget - TTW_WIDGET_BEGIN));
				SndPlayFx(SND_15_BEEP);
				MarkWholeScreenDirty();
			}
		} else if (widget == TTW_WIDGET_BUTTONS) {
			uint i;
			for (i = TTW_WIDGET_BEGIN; i < TTW_WIDGET_END; i++) {
				const NWidgetBase *nwid = this->GetWidget<NWidgetBase>(i);
				if (IsInsideBS(pt.x, nwid->pos_x, nwid->current_x)) {
					break;
				}
			}
			if (i == TTW_WIDGET_LOADING || i == TTW_WIDGET_END) return;

			ToggleInvisibility((TransparencyOption)(i - TTW_WIDGET_BEGIN));
			SndPlayFx(SND_15_BEEP);

			/* Redraw whole screen only if transparency is set */
			if (IsTransparencySet((TransparencyOption)(i - TTW_WIDGET_BEGIN))) {
				MarkWholeScreenDirty();
			} else {
				this->SetWidgetDirty(TTW_WIDGET_BUTTONS);
			}
		}
	}

	virtual Point OnInitialPosition(const WindowDesc *desc, int16 sm_width, int16 sm_height, int window_number)
	{
		Point pt = GetToolbarAlignedWindowPosition(sm_width);
		pt.y += 2 * (sm_height - this->GetWidget<NWidgetBase>(TTW_WIDGET_BUTTONS)->current_y);
		return pt;
	}

	virtual void OnInvalidateData(int data)
	{
		for (uint i = TTW_WIDGET_BEGIN; i < TTW_WIDGET_END; i++) {
			this->SetWidgetLoweredState(i, IsTransparencySet((TransparencyOption)(i - TTW_WIDGET_BEGIN)));
		}
	}
};

static const NWidgetPart _nested_transparency_widgets[] = {
	NWidget(NWID_HORIZONTAL),
		NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
		NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_TRANSPARENCY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
		NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
	EndContainer(),
	NWidget(NWID_HORIZONTAL),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_SIGNS), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SIGN, STR_TRANSPARENT_SIGNS_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_TREES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_PLANTTREES, STR_TRANSPARENT_TREES_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_HOUSES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TOWN, STR_TRANSPARENT_HOUSES_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_INDUSTRIES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_INDUSTRY, STR_TRANSPARENT_INDUSTRIES_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_BUILDINGS), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_COMPANY_LIST, STR_TRANSPARENT_BUILDINGS_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_BRIDGES), SetMinimalSize(43, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BRIDGE, STR_TRANSPARENT_BRIDGES_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_STRUCTURES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRANSMITTER, STR_TRANSPARENT_STRUCTURES_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_CATENARY), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_BUILD_X_ELRAIL, STR_TRANSPARENT_CATENARY_TOOLTIP),
		NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, TTW_WIDGET_LOADING), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRAINLIST, STR_TRANSPARENT_LOADING_TOOLTIP),
		NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(1, 1), EndContainer(),
	EndContainer(),
	/* Panel with 'inivisibility' buttons. */
	NWidget(WWT_PANEL, COLOUR_DARK_GREEN, TTW_WIDGET_BUTTONS), SetMinimalSize(219, 13), SetDataTip(0x0, STR_TRANSPARENT_INVISIBLE_TOOLTIP),
	EndContainer(),
};

static const WindowDesc _transparency_desc(
	WDP_MANUAL, 0, 0,
	WC_TRANSPARENCY_TOOLBAR, WC_NONE,
	0,
	_nested_transparency_widgets, lengthof(_nested_transparency_widgets)
);

void ShowTransparencyToolbar()
{
	AllocateWindowDescFront<TransparenciesWindow>(&_transparency_desc, 0);
}