Files
@ r27835:eabfaa878ced
Branch filter:
Location: cpp/openttd-patchpack/source/src/linkgraph/linkgraph_gui.h
r27835:eabfaa878ced
5.1 KiB
text/x-c
Add: calendar date for Survey results
This means no heuristics is possible on around which date people
play the game.
This means no heuristics is possible on around which date people
play the game.
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 121 122 123 124 125 | /*
* 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"
/**
* Monthly statistics for a link between two stations.
* Only the cargo type of the most saturated linkgraph is taken into account.
*/
struct LinkProperties {
LinkProperties() : cargo(CT_INVALID), capacity(0), usage(0), planned(0), shared(false) {}
/** Return the usage of the link to display. */
uint Usage() const { return std::max(this->usage, this->planned); }
CargoID cargo; ///< Cargo type of the link.
uint capacity; ///< Capacity of the link.
uint usage; ///< Actual usage of the link.
uint planned; ///< Planned usage of the link.
uint32_t time; ///< Travel time 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_t LINK_COLOURS[][12];
/**
* 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(Window *w, uint wid, CargoTypes cargo_mask, CompanyMask 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(CompanyMask company_mask);
bool ShowTooltip(Point pt, TooltipCloseCondition close_cond);
/** 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. */
CompanyMask GetCompanyMask() { return this->company_mask; }
protected:
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.
CompanyMask 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(CargoID new_cargo, uint new_cap, uint new_usg, uint new_flow, uint32_t time, 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(std::shared_ptr<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:
std::shared_ptr<LinkGraphOverlay> overlay;
size_t num_cargo;
void UpdateOverlayCompanies();
void UpdateOverlayCargoes();
};
#endif /* LINKGRAPH_GUI_H */
|