110 struct newgrf_add_d { |
110 struct newgrf_add_d { |
111 GRFConfig **list; |
111 GRFConfig **list; |
112 const GRFConfig *sel; |
112 const GRFConfig *sel; |
113 }; |
113 }; |
114 |
114 |
|
115 /* Names of the add a newgrf window widgets */ |
|
116 enum AddNewGRFWindowWidgets { |
|
117 ANGRFW_CLOSEBOX = 0, |
|
118 ANGRFW_CAPTION, |
|
119 ANGRFW_BACKGROUND, |
|
120 ANGRFW_GRF_LIST, |
|
121 ANGRFW_SCROLLBAR, |
|
122 ANGRFW_GRF_INFO, |
|
123 ANGRFW_ADD, |
|
124 ANGRFW_RESCAN, |
|
125 ANGRFW_RESIZE, |
|
126 }; |
115 |
127 |
116 static void NewGRFAddDlgWndProc(Window *w, WindowEvent *e) |
128 static void NewGRFAddDlgWndProc(Window *w, WindowEvent *e) |
117 { |
129 { |
118 switch (e->event) { |
130 switch (e->event) { |
119 case WE_PAINT: { |
131 case WE_PAINT: { |
120 const GRFConfig *c; |
132 const GRFConfig *c; |
121 int y; |
133 const Widget *wl = &w->widget[ANGRFW_GRF_LIST]; |
122 int n = 0; |
134 uint n = 0; |
123 |
135 |
124 /* Count the number of GRFs */ |
136 /* Count the number of GRFs */ |
125 for (c = _all_grfs; c != NULL; c = c->next) n++; |
137 for (c = _all_grfs; c != NULL; c = c->next) n++; |
126 |
138 |
127 w->vscroll.cap = (w->widget[3].bottom - w->widget[3].top) / 10; |
139 w->vscroll.cap = (wl->bottom - wl->top) / 10; |
128 SetVScrollCount(w, n); |
140 SetVScrollCount(w, n); |
129 |
141 |
130 w->SetWidgetDisabledState(6, WP(w, newgrf_add_d).sel == NULL || WP(w, newgrf_add_d).sel->IsOpenTTDBaseGRF()); |
142 w->SetWidgetDisabledState(ANGRFW_ADD, WP(w, newgrf_add_d).sel == NULL || WP(w, newgrf_add_d).sel->IsOpenTTDBaseGRF()); |
131 DrawWindowWidgets(w); |
143 DrawWindowWidgets(w); |
132 |
144 |
133 GfxFillRect(w->widget[3].left + 1, w->widget[3].top + 1, w->widget[3].right, w->widget[3].bottom, 0xD7); |
145 GfxFillRect(wl->left + 1, wl->top + 1, wl->right, wl->bottom, 0xD7); |
134 |
146 |
135 n = 0; |
147 uint y = wl->top + 1; |
136 y = w->widget[3].top + 1; |
148 for (c = _all_grfs, n = 0; c != NULL && n < (w->vscroll.pos + w->vscroll.cap); c = c->next, n++) { |
137 |
149 if (n >= w->vscroll.pos) { |
138 for (c = _all_grfs; c != NULL; c = c->next) { |
|
139 if (n >= w->vscroll.pos && n < w->vscroll.pos + w->vscroll.cap) { |
|
140 bool h = c == WP(w, newgrf_add_d).sel; |
150 bool h = c == WP(w, newgrf_add_d).sel; |
141 const char *text = (c->name != NULL && !StrEmpty(c->name)) ? c->name : c->filename; |
151 const char *text = (c->name != NULL && !StrEmpty(c->name)) ? c->name : c->filename; |
142 |
152 |
143 /* Draw selection background */ |
153 /* Draw selection background */ |
144 if (h) GfxFillRect(3, y, w->width - 15, y + 9, 156); |
154 if (h) GfxFillRect(3, y, w->width - 15, y + 9, 156); |
145 DoDrawStringTruncated(text, 4, y, h ? TC_WHITE : TC_ORANGE, w->width - 18); |
155 DoDrawStringTruncated(text, 4, y, h ? TC_WHITE : TC_ORANGE, w->width - 18); |
146 y += 10; |
156 y += 10; |
147 } |
157 } |
148 n++; |
|
149 } |
158 } |
150 |
159 |
151 if (WP(w, newgrf_add_d).sel != NULL) { |
160 if (WP(w, newgrf_add_d).sel != NULL) { |
152 const Widget *wi = &w->widget[5]; |
161 const Widget *wi = &w->widget[ANGRFW_GRF_INFO]; |
153 ShowNewGRFInfo(WP(w, newgrf_add_d).sel, wi->left + 2, wi->top + 2, wi->right - wi->left - 2, wi->bottom, false); |
162 ShowNewGRFInfo(WP(w, newgrf_add_d).sel, wi->left + 2, wi->top + 2, wi->right - wi->left - 2, wi->bottom, false); |
154 } |
163 } |
155 break; |
164 break; |
156 } |
165 } |
157 |
166 |
158 case WE_DOUBLE_CLICK: |
167 case WE_DOUBLE_CLICK: |
159 if (e->we.click.widget != 3) break; |
168 if (e->we.click.widget != ANGRFW_GRF_LIST) break; |
160 e->we.click.widget = 6; |
169 e->we.click.widget = ANGRFW_ADD; |
161 /* Fall through */ |
170 /* Fall through */ |
162 |
171 |
163 case WE_CLICK: |
172 case WE_CLICK: |
164 switch (e->we.click.widget) { |
173 switch (e->we.click.widget) { |
165 case 3: { |
174 case ANGRFW_GRF_LIST: { |
166 /* Get row... */ |
175 /* Get row... */ |
167 const GRFConfig *c; |
176 const GRFConfig *c; |
168 uint i = (e->we.click.pt.y - w->widget[3].top) / 10 + w->vscroll.pos; |
177 uint i = (e->we.click.pt.y - w->widget[ANGRFW_GRF_LIST].top) / 10 + w->vscroll.pos; |
169 |
178 |
170 for (c = _all_grfs; c != NULL && i > 0; c = c->next, i--); |
179 for (c = _all_grfs; c != NULL && i > 0; c = c->next, i--); |
171 WP(w, newgrf_add_d).sel = c; |
180 WP(w, newgrf_add_d).sel = c; |
172 SetWindowDirty(w); |
181 SetWindowDirty(w); |
173 break; |
182 break; |
174 } |
183 } |
175 |
184 |
176 case 6: // Add selection to list |
185 case ANGRFW_ADD: // Add selection to list |
177 if (WP(w, newgrf_add_d).sel != NULL) { |
186 if (WP(w, newgrf_add_d).sel != NULL) { |
178 const GRFConfig *src = WP(w, newgrf_add_d).sel; |
187 const GRFConfig *src = WP(w, newgrf_add_d).sel; |
179 GRFConfig **list; |
188 GRFConfig **list; |
180 |
189 |
181 /* Find last entry in the list, checking for duplicate grfid on the way */ |
190 /* Find last entry in the list, checking for duplicate grfid on the way */ |
200 DeleteWindowByClass(WC_SAVELOAD); |
209 DeleteWindowByClass(WC_SAVELOAD); |
201 InvalidateWindowData(WC_GAME_OPTIONS, 0); |
210 InvalidateWindowData(WC_GAME_OPTIONS, 0); |
202 } |
211 } |
203 break; |
212 break; |
204 |
213 |
205 case 7: // Rescan list |
214 case ANGRFW_RESCAN: // Rescan list |
206 WP(w, newgrf_add_d).sel = NULL; |
215 WP(w, newgrf_add_d).sel = NULL; |
207 ScanNewGRFFiles(); |
216 ScanNewGRFFiles(); |
208 SetWindowDirty(w); |
217 SetWindowDirty(w); |
209 break; |
218 break; |
210 } |
219 } |
211 break; |
220 break; |
212 } |
221 } |
213 } |
222 } |
214 |
223 |
215 |
224 /* Widget definition for the add a newgrf window */ |
216 static const Widget _newgrf_add_dlg_widgets[] = { |
225 static const Widget _newgrf_add_dlg_widgets[] = { |
217 { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, |
226 { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, // ANGRFW_CLOSEBOX |
218 { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 306, 0, 13, STR_NEWGRF_ADD_CAPTION, STR_018C_WINDOW_TITLE_DRAG_THIS }, |
227 { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 306, 0, 13, STR_NEWGRF_ADD_CAPTION, STR_018C_WINDOW_TITLE_DRAG_THIS }, // ANGRFW_CAPTION |
219 |
228 { WWT_PANEL, RESIZE_RB, 14, 0, 294, 14, 121, 0x0, STR_NULL }, // ANGRFW_BACKGROUND |
220 /* List of files */ |
229 { WWT_INSET, RESIZE_RB, 14, 2, 292, 16, 119, 0x0, STR_NULL }, // ANGRFW_GRF_LIST |
221 { WWT_PANEL, RESIZE_RB, 14, 0, 294, 14, 121, 0x0, STR_NULL }, |
230 { WWT_SCROLLBAR, RESIZE_LRB, 14, 295, 306, 14, 121, 0x0, STR_NULL }, // ANGRFW_SCROLLBAR |
222 { WWT_INSET, RESIZE_RB, 14, 2, 292, 16, 119, 0x0, STR_NULL }, |
231 { WWT_PANEL, RESIZE_RTB, 14, 0, 306, 122, 224, 0x0, STR_NULL }, // ANGRFW_GRF_INFO |
223 { WWT_SCROLLBAR, RESIZE_LRB, 14, 295, 306, 14, 121, 0x0, STR_NULL }, |
232 { WWT_PUSHTXTBTN, RESIZE_RTB, 14, 0, 146, 225, 236, STR_NEWGRF_ADD_FILE, STR_NEWGRF_ADD_FILE_TIP }, // ANGRFW_ADD |
224 |
233 { WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 147, 294, 225, 236, STR_NEWGRF_RESCAN_FILES, STR_NEWGRF_RESCAN_FILES_TIP }, // ANGRFW_RESCAN |
225 /* NewGRF file info */ |
234 { WWT_RESIZEBOX, RESIZE_LRTB, 14, 295, 306, 225, 236, 0x0, STR_RESIZE_BUTTON }, // ANGRFW_RESIZE |
226 { WWT_PANEL, RESIZE_RTB, 14, 0, 306, 122, 224, 0x0, STR_NULL }, |
|
227 |
|
228 { WWT_PUSHTXTBTN, RESIZE_RTB, 14, 0, 146, 225, 236, STR_NEWGRF_ADD_FILE, STR_NEWGRF_ADD_FILE_TIP }, |
|
229 { WWT_PUSHTXTBTN, RESIZE_LRTB, 14, 147, 294, 225, 236, STR_NEWGRF_RESCAN_FILES, STR_NEWGRF_RESCAN_FILES_TIP }, |
|
230 { WWT_RESIZEBOX, RESIZE_LRTB, 14, 295, 306, 225, 236, 0x0, STR_RESIZE_BUTTON }, |
|
231 { WIDGETS_END }, |
235 { WIDGETS_END }, |
232 }; |
236 }; |
233 |
237 |
234 |
238 /* Window definition for the add a newgrf window */ |
235 static const WindowDesc _newgrf_add_dlg_desc = { |
239 static const WindowDesc _newgrf_add_dlg_desc = { |
236 WDP_CENTER, WDP_CENTER, 307, 237, 307, 337, |
240 WDP_CENTER, WDP_CENTER, 307, 237, 307, 337, |
237 WC_SAVELOAD, WC_NONE, |
241 WC_SAVELOAD, WC_NONE, |
238 WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, |
242 WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_STD_BTN | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, |
239 _newgrf_add_dlg_widgets, |
243 _newgrf_add_dlg_widgets, |
523 SetupNewGRFWindow(w); |
532 SetupNewGRFWindow(w); |
524 break; |
533 break; |
525 } |
534 } |
526 } |
535 } |
527 |
536 |
528 |
537 /* Widget definition of the manage newgrfs window */ |
529 static const Widget _newgrf_widgets[] = { |
538 static const Widget _newgrf_widgets[] = { |
530 { WWT_CLOSEBOX, RESIZE_NONE, 10, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, |
539 { WWT_CLOSEBOX, RESIZE_NONE, 10, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, // SNGRFS_CLOSEBOX |
531 { WWT_CAPTION, RESIZE_RIGHT, 10, 11, 299, 0, 13, STR_NEWGRF_SETTINGS_CAPTION, STR_018C_WINDOW_TITLE_DRAG_THIS }, |
540 { WWT_CAPTION, RESIZE_RIGHT, 10, 11, 299, 0, 13, STR_NEWGRF_SETTINGS_CAPTION, STR_018C_WINDOW_TITLE_DRAG_THIS }, // SNGRFS_CAPTION |
532 |
541 { WWT_PANEL, RESIZE_RIGHT, 10, 0, 299, 14, 29, STR_NULL, STR_NULL }, // SNGRFS_BACKGROUND |
533 /* NewGRF file Add, Remove, Move up, Move down */ |
542 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 10, 79, 16, 27, STR_NEWGRF_ADD, STR_NEWGRF_ADD_TIP }, // SNGRFS_ADD |
534 { WWT_PANEL, RESIZE_RIGHT, 10, 0, 299, 14, 29, STR_NULL, STR_NULL }, |
543 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 80, 149, 16, 27, STR_NEWGRF_REMOVE, STR_NEWGRF_REMOVE_TIP }, // SNGRFS_REMOVE |
535 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 10, 79, 16, 27, STR_NEWGRF_ADD, STR_NEWGRF_ADD_TIP }, |
544 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 150, 219, 16, 27, STR_NEWGRF_MOVEUP, STR_NEWGRF_MOVEUP_TIP }, // SNGRFS_MOVE_UP |
536 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 80, 149, 16, 27, STR_NEWGRF_REMOVE, STR_NEWGRF_REMOVE_TIP }, |
545 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 220, 289, 16, 27, STR_NEWGRF_MOVEDOWN, STR_NEWGRF_MOVEDOWN_TIP }, // SNGRFS_MOVE_DOWN |
537 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 150, 219, 16, 27, STR_NEWGRF_MOVEUP, STR_NEWGRF_MOVEUP_TIP }, |
546 { WWT_MATRIX, RESIZE_RB, 10, 0, 287, 30, 99, 0x501, STR_NEWGRF_FILE_TIP }, // SNGRFS_FILE_LIST |
538 { WWT_PUSHTXTBTN, RESIZE_NONE, 3, 220, 289, 16, 27, STR_NEWGRF_MOVEDOWN, STR_NEWGRF_MOVEDOWN_TIP }, |
547 { WWT_SCROLLBAR, RESIZE_LRB, 10, 288, 299, 30, 99, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST }, // SNGRFS_SCROLLBAR |
539 |
548 { WWT_PANEL, RESIZE_RTB, 10, 0, 299, 100, 212, STR_NULL, STR_NULL }, // SNGRFS_NEWGRF_INFO |
540 /* NewGRF file list */ |
549 { WWT_PUSHTXTBTN, RESIZE_TB, 10, 0, 143, 213, 224, STR_NEWGRF_SET_PARAMETERS, STR_NULL }, // SNGRFS_SET_PARAMETERS |
541 { WWT_MATRIX, RESIZE_RB, 10, 0, 287, 30, 99, 0x501, STR_NEWGRF_FILE_TIP }, |
550 { WWT_PUSHTXTBTN, RESIZE_RTB, 10, 144, 287, 213, 224, STR_NEWGRF_APPLY_CHANGES, STR_NULL }, // SNGRFS_APPLY_CHANGES |
542 { WWT_SCROLLBAR, RESIZE_LRB, 10, 288, 299, 30, 99, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST }, |
551 { WWT_RESIZEBOX, RESIZE_LRTB, 10, 288, 299, 213, 224, 0x0, STR_RESIZE_BUTTON }, // SNGRFS_RESIZE |
543 |
|
544 /* NewGRF file info */ |
|
545 { WWT_PANEL, RESIZE_RTB, 10, 0, 299, 100, 212, STR_NULL, STR_NULL }, |
|
546 |
|
547 /* Edit parameter and apply changes button... */ |
|
548 { WWT_PUSHTXTBTN, RESIZE_TB, 10, 0, 143, 213, 224, STR_NEWGRF_SET_PARAMETERS, STR_NULL }, |
|
549 { WWT_PUSHTXTBTN, RESIZE_RTB, 10, 144, 287, 213, 224, STR_NEWGRF_APPLY_CHANGES, STR_NULL }, |
|
550 |
|
551 { WWT_RESIZEBOX, RESIZE_LRTB, 10, 288, 299, 213, 224, 0x0, STR_RESIZE_BUTTON }, |
|
552 |
|
553 { WIDGETS_END }, |
552 { WIDGETS_END }, |
554 }; |
553 }; |
555 |
554 |
556 |
555 /* Window definition of the manage newgrfs window */ |
557 static const WindowDesc _newgrf_desc = { |
556 static const WindowDesc _newgrf_desc = { |
558 WDP_CENTER, WDP_CENTER, 300, 225, 300, 225, |
557 WDP_CENTER, WDP_CENTER, 300, 225, 300, 225, |
559 WC_GAME_OPTIONS, WC_NONE, |
558 WC_GAME_OPTIONS, WC_NONE, |
560 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, |
559 WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE, |
561 _newgrf_widgets, |
560 _newgrf_widgets, |