subsidy_gui.cpp

Go to the documentation of this file.
00001 /* $Id: subsidy_gui.cpp 15723 2009-03-15 15:12:06Z rubidium $ */
00002 
00005 #include "stdafx.h"
00006 #include "station_base.h"
00007 #include "industry.h"
00008 #include "town.h"
00009 #include "economy_func.h"
00010 #include "cargotype.h"
00011 #include "window_gui.h"
00012 #include "strings_func.h"
00013 #include "date_func.h"
00014 #include "viewport_func.h"
00015 #include "gfx_func.h"
00016 #include "gui.h"
00017 
00018 #include "table/strings.h"
00019 
00020 struct SubsidyListWindow : Window {
00021   SubsidyListWindow(const WindowDesc *desc, WindowNumber window_number) : Window(desc, window_number)
00022   {
00023     this->FindWindowPlacementAndResize(desc);
00024   }
00025 
00026   virtual void OnClick(Point pt, int widget)
00027   {
00028     if (widget != 3) return;
00029 
00030     int y = pt.y - 25;
00031 
00032     if (y < 0) return;
00033 
00034     uint num = 0;
00035     for (const Subsidy *s = _subsidies; s != endof(_subsidies); s++) {
00036       if (s->cargo_type != CT_INVALID && s->age < 12) {
00037         y -= 10;
00038         if (y < 0) {
00039           this->HandleClick(s);
00040           return;
00041         }
00042         num++;
00043       }
00044     }
00045 
00046     if (num == 0) {
00047       y -= 10; // "None"
00048       if (y < 0) return;
00049     }
00050 
00051     y -= 11; // "Services already subsidised:"
00052     if (y < 0) return;
00053 
00054     for (const Subsidy *s = _subsidies; s != endof(_subsidies); s++) {
00055       if (s->cargo_type != CT_INVALID && s->age >= 12) {
00056         y -= 10;
00057         if (y < 0) {
00058           this->HandleClick(s);
00059           return;
00060         }
00061       }
00062     }
00063   }
00064 
00065   void HandleClick(const Subsidy *s)
00066   {
00067     TownEffect te = GetCargo(s->cargo_type)->town_effect;
00068     TileIndex xy;
00069 
00070     /* determine from coordinate for subsidy and try to scroll to it */
00071     uint offs = s->from;
00072     if (s->age >= 12) {
00073       xy = GetStation(offs)->xy;
00074     } else if (te == TE_PASSENGERS || te == TE_MAIL) {
00075       xy = GetTown(offs)->xy;
00076     } else {
00077       xy = GetIndustry(offs)->xy;
00078     }
00079 
00080     if (_ctrl_pressed || !ScrollMainWindowToTile(xy)) {
00081       if (_ctrl_pressed) ShowExtraViewPortWindow(xy);
00082 
00083       /* otherwise determine to coordinate for subsidy and scroll to it */
00084       offs = s->to;
00085       if (s->age >= 12) {
00086         xy = GetStation(offs)->xy;
00087       } else if (te == TE_PASSENGERS || te == TE_MAIL || te == TE_GOODS || te == TE_FOOD) {
00088         xy = GetTown(offs)->xy;
00089       } else {
00090         xy = GetIndustry(offs)->xy;
00091       }
00092 
00093       if (_ctrl_pressed) {
00094         ShowExtraViewPortWindow(xy);
00095       } else {
00096         ScrollMainWindowToTile(xy);
00097       }
00098     }
00099   }
00100 
00101   virtual void OnPaint()
00102   {
00103     YearMonthDay ymd;
00104     const Subsidy *s;
00105 
00106     this->DrawWidgets();
00107 
00108     ConvertDateToYMD(_date, &ymd);
00109 
00110     int width = this->width - 13;  // scroll bar = 11 + pixel each side
00111     int y = 15;
00112     int x = 1;
00113 
00114     /* Section for drawing the offered subisidies */
00115     DrawStringTruncated(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, TC_FROMSTRING, width);
00116     y += 10;
00117     uint num = 0;
00118 
00119     for (s = _subsidies; s != endof(_subsidies); s++) {
00120       if (s->cargo_type != CT_INVALID && s->age < 12) {
00121         int x2;
00122 
00123         /* Displays the two offered towns */
00124         SetupSubsidyDecodeParam(s, 1);
00125         x2 = DrawStringTruncated(x + 2, y, STR_2027_FROM_TO, TC_FROMSTRING, width - 2);
00126 
00127         if (width - x2 > 10) {
00128           /* Displays the deadline before voiding the proposal */
00129           SetDParam(0, _date - ymd.day + 384 - s->age * 32);
00130           DrawStringTruncated(x2, y, STR_2028_BY, TC_FROMSTRING, width - x2);
00131         }
00132 
00133         y += 10;
00134         num++;
00135       }
00136     }
00137 
00138     if (num == 0) {
00139       DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
00140       y += 10;
00141     }
00142 
00143     /* Section for drawing the already granted subisidies */
00144     DrawStringTruncated(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, TC_FROMSTRING, width);
00145     y += 10;
00146     num = 0;
00147 
00148     for (s = _subsidies; s != endof(_subsidies); s++) {
00149       if (s->cargo_type != CT_INVALID && s->age >= 12) {
00150         int xt;
00151 
00152         SetupSubsidyDecodeParam(s, 1);
00153 
00154         SetDParam(3, GetStation(s->to)->owner);
00155 
00156         /* Displays the two connected stations */
00157         xt = DrawStringTruncated(x + 2, y, STR_202C_FROM_TO, TC_FROMSTRING, width - 2);
00158 
00159         /* Displays the date where the granted subsidy will end */
00160         if ((xt > 3) && (width - xt) > 9 ) { // do not draw if previous drawing failed or if it will overlap on scrollbar
00161           SetDParam(0, _date - ymd.day + 768 - s->age * 32);
00162           DrawStringTruncated(xt, y, STR_202D_UNTIL, TC_FROMSTRING, width - xt);
00163         }
00164         y += 10;
00165         num++;
00166       }
00167     }
00168 
00169     if (num == 0) DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
00170   }
00171 };
00172 
00173 static const Widget _subsidies_list_widgets[] = {
00174 {   WWT_CLOSEBOX, RESIZE_NONE,   COLOUR_BROWN,   0,  10,   0,  13, STR_00C5,           STR_018B_CLOSE_WINDOW},
00175 {    WWT_CAPTION, RESIZE_RIGHT,  COLOUR_BROWN,  11, 307,   0,  13, STR_2025_SUBSIDIES, STR_018C_WINDOW_TITLE_DRAG_THIS},
00176 {  WWT_STICKYBOX, RESIZE_LR,     COLOUR_BROWN, 308, 319,   0,  13, STR_NULL,           STR_STICKY_BUTTON},
00177 {      WWT_PANEL, RESIZE_RB,     COLOUR_BROWN,   0, 307,  14, 126, 0x0,                STR_01FD_CLICK_ON_SERVICE_TO_CENTER},
00178 {  WWT_SCROLLBAR, RESIZE_LRB,    COLOUR_BROWN, 308, 319,  14, 114, 0x0,                STR_0190_SCROLL_BAR_SCROLLS_LIST},
00179 {  WWT_RESIZEBOX, RESIZE_LRTB,   COLOUR_BROWN, 308, 319, 115, 126, 0x0,                STR_RESIZE_BUTTON},
00180 
00181 {   WIDGETS_END},
00182 };
00183 
00184 static const WindowDesc _subsidies_list_desc(
00185   WDP_AUTO, WDP_AUTO, 320, 127, 320, 127,
00186   WC_SUBSIDIES_LIST, WC_NONE,
00187   WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_RESIZABLE,
00188   _subsidies_list_widgets
00189 );
00190 
00191 
00192 void ShowSubsidiesList()
00193 {
00194   AllocateWindowDescFront<SubsidyListWindow>(&_subsidies_list_desc, 0);
00195 }

Generated on Thu Oct 1 11:03:17 2009 for OpenTTD by  doxygen 1.5.6