OpenTTD
transparency_gui.cpp
Go to the documentation of this file.
1 /* $Id: transparency_gui.cpp 26482 2014-04-23 20:13:33Z rubidium $ */
2 
3 /*
4  * This file is part of OpenTTD.
5  * 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.
6  * 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.
7  * 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/>.
8  */
9 
12 #include "stdafx.h"
13 #include "window_gui.h"
14 #include "transparency.h"
15 #include "sound_func.h"
16 #include "settings_type.h"
17 
19 
20 #include "table/sprites.h"
21 #include "table/strings.h"
22 
23 #include "safeguards.h"
24 
29 
31 {
32 public:
34  {
35  this->InitNested(window_number);
36  }
37 
38  virtual void OnPaint()
39  {
40  this->OnInvalidateData(0); // Must be sure that the widgets show the transparency variable changes, also when we use shortcuts.
41  this->DrawWidgets();
42  }
43 
44  virtual void DrawWidget(const Rect &r, int widget) const
45  {
46  switch (widget) {
47  case WID_TT_SIGNS:
48  case WID_TT_TREES:
49  case WID_TT_HOUSES:
50  case WID_TT_INDUSTRIES:
51  case WID_TT_BUILDINGS:
52  case WID_TT_BRIDGES:
53  case WID_TT_STRUCTURES:
54  case WID_TT_CATENARY:
55  case WID_TT_LOADING: {
56  uint i = widget - WID_TT_BEGIN;
57  if (HasBit(_transparency_lock, i)) DrawSprite(SPR_LOCK, PAL_NONE, r.left + 1, r.top + 1);
58  break;
59  }
60  case WID_TT_BUTTONS:
61  for (uint i = WID_TT_BEGIN; i < WID_TT_END; i++) {
62  if (i == WID_TT_LOADING) continue; // Do not draw button for invisible loading indicators.
63 
64  const NWidgetBase *wi = this->GetWidget<NWidgetBase>(i);
65  DrawFrameRect(wi->pos_x + 1, r.top + 2, wi->pos_x + wi->current_x - 2, r.bottom - 2, COLOUR_PALE_GREEN,
67  }
68  break;
69  }
70  }
71 
72  virtual void OnClick(Point pt, int widget, int click_count)
73  {
74  if (widget >= WID_TT_BEGIN && widget < WID_TT_END) {
75  if (_ctrl_pressed) {
76  /* toggle the bit of the transparencies lock variable */
78  this->SetDirty();
79  } else {
80  /* toggle the bit of the transparencies variable and play a sound */
82  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
84  }
85  } else if (widget == WID_TT_BUTTONS) {
86  uint i;
87  for (i = WID_TT_BEGIN; i < WID_TT_END; i++) {
88  const NWidgetBase *nwid = this->GetWidget<NWidgetBase>(i);
89  if (IsInsideBS(pt.x, nwid->pos_x, nwid->current_x)) {
90  break;
91  }
92  }
93  if (i == WID_TT_LOADING || i == WID_TT_END) return;
94 
96  if (_settings_client.sound.click_beep) SndPlayFx(SND_15_BEEP);
97 
98  /* Redraw whole screen only if transparency is set */
101  } else {
103  }
104  }
105  }
106 
107  virtual Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number)
108  {
109  Point pt = GetToolbarAlignedWindowPosition(sm_width);
110  pt.y += 2 * (sm_height - this->GetWidget<NWidgetBase>(WID_TT_BUTTONS)->current_y);
111  return pt;
112  }
113 
119  virtual void OnInvalidateData(int data = 0, bool gui_scope = true)
120  {
121  if (!gui_scope) return;
122  for (uint i = WID_TT_BEGIN; i < WID_TT_END; i++) {
124  }
125  }
126 };
127 
128 static const NWidgetPart _nested_transparency_widgets[] = {
130  NWidget(WWT_CLOSEBOX, COLOUR_DARK_GREEN),
131  NWidget(WWT_CAPTION, COLOUR_DARK_GREEN), SetDataTip(STR_TRANSPARENCY_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
132  NWidget(WWT_STICKYBOX, COLOUR_DARK_GREEN),
133  EndContainer(),
135  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_SIGNS), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SIGN, STR_TRANSPARENT_SIGNS_TOOLTIP),
136  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_TREES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_PLANTTREES, STR_TRANSPARENT_TREES_TOOLTIP),
137  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_HOUSES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TOWN, STR_TRANSPARENT_HOUSES_TOOLTIP),
138  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_INDUSTRIES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_INDUSTRY, STR_TRANSPARENT_INDUSTRIES_TOOLTIP),
139  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_BUILDINGS), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_COMPANY_LIST, STR_TRANSPARENT_BUILDINGS_TOOLTIP),
140  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_BRIDGES), SetMinimalSize(43, 22), SetFill(0, 1), SetDataTip(SPR_IMG_BRIDGE, STR_TRANSPARENT_BRIDGES_TOOLTIP),
141  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_STRUCTURES), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRANSMITTER, STR_TRANSPARENT_STRUCTURES_TOOLTIP),
142  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_CATENARY), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_BUILD_X_ELRAIL, STR_TRANSPARENT_CATENARY_TOOLTIP),
143  NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_LOADING), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRAINLIST, STR_TRANSPARENT_LOADING_TOOLTIP),
144  NWidget(WWT_PANEL, COLOUR_DARK_GREEN), SetFill(1, 1), EndContainer(),
145  EndContainer(),
146  /* Panel with 'invisibility' buttons. */
147  NWidget(WWT_PANEL, COLOUR_DARK_GREEN, WID_TT_BUTTONS), SetMinimalSize(219, 13), SetDataTip(0x0, STR_TRANSPARENT_INVISIBLE_TOOLTIP),
148  EndContainer(),
149 };
150 
151 static WindowDesc _transparency_desc(
152  WDP_MANUAL, "toolbar_transparency", 0, 0,
154  0,
155  _nested_transparency_widgets, lengthof(_nested_transparency_widgets)
156 );
157 
162 {
163  AllocateWindowDescFront<TransparenciesWindow>(&_transparency_desc, 0);
164 }
End of toggle buttons.
virtual Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number)
Compute the initial position of the window.
Window(WindowDesc *desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
Definition: window.cpp:1843
void SetWidgetLoweredState(byte widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
Definition: window_gui.h:448
Signs background transparency toggle button.
High level window description.
Definition: window_gui.h:168
Bridges transparency toggle button.
void DrawWidgets() const
Paint all widgets of a window.
Definition: widget.cpp:604
void SetWidgetDirty(byte widget_index) const
Invalidate a widget, i.e.
Definition: window.cpp:577
Horizontal container.
Definition: widget_type.h:75
TransparencyOptionBits _transparency_opt
The bits that should be transparent.
industries transparency toggle button.
static bool IsInsideBS(const T x, const uint base, const uint size)
Checks if a value is between a window started at some base point.
Definition: math_func.hpp:250
virtual void OnPaint()
The window must be repainted.
Close box (at top-left of a window)
Definition: widget_type.h:69
TransparencyOptionBits _invisibility_opt
The bits that should be invisible.
Types related to the transparency widgets.
Functions, definitions and such used only by the GUI.
void DrawFrameRect(int left, int top, int right, int bottom, Colours colour, FrameFlags flags)
Draw frame rectangle.
Definition: widget.cpp:177
Object structure transparency toggle button.
Partial widget specification to allow NWidgets to be written nested.
Definition: widget_type.h:910
Data structure for an opened window.
Definition: window_gui.h:271
bool _ctrl_pressed
Is Ctrl pressed?
Definition: gfx.cpp:36
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
Definition: window.cpp:1833
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
Transparency toolbar; Window numbers:
Definition: window_type.h:87
static void ToggleInvisibility(TransparencyOption to)
Toggle the invisibility option bit.
Definition: transparency.h:81
SoundSettings sound
sound effect settings
Point GetToolbarAlignedWindowPosition(int window_width)
Computer the position of the top-left corner of a window to be opened right under the toolbar...
Definition: window.cpp:1708
static NWidgetPart SetDataTip(uint32 data, StringID tip)
Widget part function for setting the data and tooltip.
Definition: widget_type.h:1014
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:76
byte _display_opt
What do we want to draw/do?
Types related to global configuration settings.
static NWidgetPart SetMinimalSize(int16 x, int16 y)
Widget part function for setting the minimal size.
Definition: widget_type.h:947
Definition of base types and functions in a cross-platform compatible way.
A number of safeguards to prevent using unsafe methods.
Company buildings and structures transparency toggle button.
Simple depressed panel.
Definition: widget_type.h:50
static NWidgetPart NWidget(WidgetType tp, Colours col, int16 idx=-1)
Widget part function for starting a new &#39;real&#39; widget.
Definition: widget_type.h:1114
Baseclass for nested widgets.
Definition: widget_type.h:126
Loading indicators transparency toggle button.
static void ToggleTransparency(TransparencyOption to)
Toggle the transparency option bit.
Definition: transparency.h:71
#define lengthof(x)
Return the length of an fixed size array.
Definition: depend.cpp:42
uint pos_x
Horizontal position of top-left corner of the widget in the window.
Definition: widget_type.h:177
static void ToggleTransparencyLock(TransparencyOption to)
Toggle the transparency lock bit.
Definition: transparency.h:109
Functions related to sound.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Definition: window.cpp:959
Catenary transparency toggle button.
No window, redirects to WC_MAIN_WINDOW.
Definition: window_type.h:40
Window caption (window title between closebox and stickybox)
Definition: widget_type.h:61
If set the frame is lowered and the background colour brighter (ie. buttons when pressed) ...
Definition: window_gui.h:31
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
Functions related to transparency.
uint TransparencyOptionBits
transparency option bits
Definition: transparency.h:38
Trees transparency toggle button.
static NWidgetPart EndContainer()
Widget part function for denoting the end of a container (horizontal, vertical, WWT_FRAME, WWT_INSET, or WWT_PANEL).
Definition: widget_type.h:999
uint current_x
Current horizontal size (after resizing).
Definition: widget_type.h:174
Houses transparency toggle button.
Coordinates of a point in 2D.
Sticky box (at top-right of a window, after WWT_DEFSIZEBOX)
Definition: widget_type.h:66
First toggle button.
static NWidgetPart SetFill(uint fill_x, uint fill_y)
Widget part function for setting filling.
Definition: widget_type.h:983
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Panel with &#39;invisibility&#39; buttons.
Specification of a rectangle with absolute coordinates of all edges.
WindowNumber window_number
Window number within the window class.
Definition: window_gui.h:307
(Toggle) Button with image
Definition: widget_type.h:52
Manually align the window (so no automatic location finding)
Definition: window_gui.h:155
bool click_beep
Beep on a random selection of buttons.
void ShowTransparencyToolbar()
Show the transparency toolbar.
This file contains all sprite-related enums and defines.
static bool IsTransparencySet(TransparencyOption to)
Check if the transparency option bit is set and if we aren&#39;t in the game menu (there&#39;s never transpar...
Definition: transparency.h:50
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
Definition: gfx.cpp:833
TransparencyOption
Transparency option bits: which position in _transparency_opt stands for which transparency.
Definition: transparency.h:24
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
Definition: gfx.cpp:1461
TransparencyOptionBits _transparency_lock
Prevent these bits from flipping with X.