Files
@ r23537:f6a6d4ce4bd5
Branch filter:
Location: cpp/openttd-patchpack/source/src/linkgraph/linkgraph_gui.h
r23537:f6a6d4ce4bd5
4.6 KiB
text/x-c
Codechange: Declare SmallVector as an alias for std::vector
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | /* $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 linkgraph_gui.h Declaration of linkgraph overlay GUI. */
#ifndef LINKGRAPH_GUI_H
#define LINKGRAPH_GUI_H
#include "../company_func.h"
#include "../station_base.h"
#include "../widget_type.h"
#include "../window_gui.h"
#include "linkgraph_base.h"
#include <map>
#include <vector>
/**
* Properties of a link between two stations.
*/
struct LinkProperties {
LinkProperties() : capacity(0), usage(0), planned(0), shared(false) {}
uint capacity; ///< Capacity of the link.
uint usage; ///< Actual usage of the link.
uint planned; ///< Planned usage of the link.
bool shared; ///< If this is a shared link to be drawn dashed.
};
/**
* Handles drawing of links into some window.
* The window must either be a smallmap or have a valid viewport.
*/
class LinkGraphOverlay {
public:
typedef std::map<StationID, LinkProperties> StationLinkMap;
typedef std::map<StationID, StationLinkMap> LinkMap;
typedef std::vector<std::pair<StationID, uint> > StationSupplyList;
static const uint8 LINK_COLOURS[];
/**
* Create a link graph overlay for the specified window.
* @param w Window to be drawn into.
* @param wid ID of the widget to draw into.
* @param cargo_mask Bitmask of cargoes to be shown.
* @param company_mask Bitmask of companies to be shown.
* @param scale Desired thickness of lines and size of station dots.
*/
LinkGraphOverlay(const Window *w, uint wid, CargoTypes cargo_mask, uint32 company_mask, uint scale) :
window(w), widget_id(wid), cargo_mask(cargo_mask), company_mask(company_mask), scale(scale)
{}
void Draw(const DrawPixelInfo *dpi);
void SetCargoMask(CargoTypes cargo_mask);
void SetCompanyMask(uint32 company_mask);
/** Mark the linkgraph dirty to be rebuilt next time Draw() is called. */
void SetDirty() { this->dirty = true; }
/** Get a bitmask of the currently shown cargoes. */
CargoTypes GetCargoMask() { return this->cargo_mask; }
/** Get a bitmask of the currently shown companies. */
uint32 GetCompanyMask() { return this->company_mask; }
protected:
const Window *window; ///< Window to be drawn into.
const uint widget_id; ///< ID of Widget in Window to be drawn to.
CargoTypes cargo_mask; ///< Bitmask of cargos to be displayed.
uint32 company_mask; ///< Bitmask of companies to be displayed.
LinkMap cached_links; ///< Cache for links to reduce recalculation.
StationSupplyList cached_stations; ///< Cache for stations to be drawn.
uint scale; ///< Width of link lines.
bool dirty; ///< Set if overlay should be rebuilt.
Point GetStationMiddle(const Station *st) const;
void AddLinks(const Station *sta, const Station *stb);
void DrawLinks(const DrawPixelInfo *dpi) const;
void DrawStationDots(const DrawPixelInfo *dpi) const;
void DrawContent(Point pta, Point ptb, const LinkProperties &cargo) const;
bool IsLinkVisible(Point pta, Point ptb, const DrawPixelInfo *dpi, int padding = 0) const;
bool IsPointVisible(Point pt, const DrawPixelInfo *dpi, int padding = 0) const;
void GetWidgetDpi(DrawPixelInfo *dpi) const;
void RebuildCache();
static void AddStats(uint new_cap, uint new_usg, uint new_flow, bool new_shared, LinkProperties &cargo);
static void DrawVertex(int x, int y, int size, int colour, int border_colour);
};
void ShowLinkGraphLegend();
/**
* Menu window to select cargoes and companies to show in a link graph overlay.
*/
struct LinkGraphLegendWindow : Window {
public:
LinkGraphLegendWindow(WindowDesc *desc, int window_number);
void SetOverlay(LinkGraphOverlay *overlay);
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override;
void DrawWidget(const Rect &r, int widget) const override;
bool OnTooltip(Point pt, int widget, TooltipCloseCondition close_cond) override;
void OnClick(Point pt, int widget, int click_count) override;
void OnInvalidateData(int data = 0, bool gui_scope = true) override;
private:
LinkGraphOverlay *overlay;
void UpdateOverlayCompanies();
void UpdateOverlayCargoes();
};
#endif /* LINKGRAPH_GUI_H */
|