From 4f49d636c1d9034d53980f89a4a8291550f55272 Mon Sep 17 00:00:00 2001 From: alberth Date: Tue, 28 Jul 2015 18:20:54 +0000 Subject: (svn r27346) -Feature: Make the object placement gui an independent window. --- src/object.h | 3 +-- src/object_gui.cpp | 42 ++++++++++++++++++++++++------------------ src/terraform_gui.cpp | 23 +++-------------------- 3 files changed, 28 insertions(+), 40 deletions(-) diff --git a/src/object.h b/src/object.h index e0b0c8eee..0ab92d376 100644 --- a/src/object.h +++ b/src/object.h @@ -20,7 +20,6 @@ void UpdateCompanyHQ(TileIndex tile, uint score); void BuildObject(ObjectType type, TileIndex tile, CompanyID owner = OWNER_NONE, struct Town *town = NULL, uint8 view = 0); -void PlaceProc_Object(TileIndex tile); -void ShowBuildObjectPicker(struct Window *w); +void ShowBuildObjectPicker(); #endif /* OBJECT_H */ diff --git a/src/object_gui.cpp b/src/object_gui.cpp index c31915d57..220f4e385 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -16,6 +16,7 @@ #include "newgrf_text.h" #include "strings_func.h" #include "viewport_func.h" +#include "tilehighlight_func.h" #include "window_gui.h" #include "window_func.h" #include "zoom_func.h" @@ -31,7 +32,7 @@ static int _selected_object_index; ///< the index of the selected obje static uint8 _selected_object_view; ///< the view of the selected object /** The window used for building objects. */ -class BuildObjectWindow : public PickerWindowBase { +class BuildObjectWindow : public Window { static const int OBJECT_MARGIN = 4; ///< The margin (in pixels) around an object. int line_height; ///< The height of a single line. int info_height; ///< The height of the info box. @@ -73,11 +74,13 @@ class BuildObjectWindow : public PickerWindowBase { } public: - BuildObjectWindow(WindowDesc *desc, Window *w) : PickerWindowBase(desc, w), info_height(1) + BuildObjectWindow(WindowDesc *desc, WindowNumber number) : Window(desc), info_height(1) { this->CreateNestedTree(); this->vscroll = this->GetScrollbar(WID_BO_SCROLLBAR); - this->FinishInitNested(0); + this->FinishInitNested(number); + + ResetObjectToPlace(); this->vscroll->SetPosition(0); this->vscroll->SetCount(ObjectClass::GetUIClassCount()); @@ -337,6 +340,10 @@ public: _selected_object_view = 0; } + if (_selected_object_index != -1) { + SetObjectToPlaceWnd(SPR_CURSOR_TRANSMITTER, PAL_NONE, HT_RECT, this); + } + this->UpdateButtons(_selected_object_class, _selected_object_index, _selected_object_view); } @@ -402,14 +409,23 @@ public: case WID_BO_OBJECT_SPRITE: if (_selected_object_index != -1) { _selected_object_view = GB(widget, 16, 16); - this->GetWidget(WID_BO_OBJECT_MATRIX)->SetClicked(_selected_object_view); - this->UpdateSelectSize(); - this->SetDirty(); + this->SelectOtherObject(_selected_object_index); // Re-select the object for a different view. } break; } } + virtual void OnPlaceObject(Point pt, TileIndex tile) + { + DoCommandP(tile, ObjectClass::Get(_selected_object_class)->GetSpec(_selected_object_index)->Index(), + _selected_object_view, CMD_BUILD_OBJECT | CMD_MSG(STR_ERROR_CAN_T_BUILD_OBJECT), CcTerraform); + } + + virtual void OnPlaceObjectAbort() + { + this->UpdateButtons(_selected_object_class, -1, _selected_object_view); + } + /** * Select the first available object. * @param change_class If true, change the class if no object in the current @@ -508,9 +524,9 @@ static WindowDesc _build_object_desc( * Show our object picker. * @param w The toolbar window we're associated with. */ -void ShowBuildObjectPicker(Window *w) +void ShowBuildObjectPicker() { - new BuildObjectWindow(&_build_object_desc, w); + AllocateWindowDescFront(&_build_object_desc, 0); } /** Reset all data of the object GUI. */ @@ -518,13 +534,3 @@ void InitializeObjectGui() { _selected_object_class = (ObjectClassID)0; } - -/** - * PlaceProc function, called when someone pressed the button if the - * object-tool is selected - * @param tile on which to place the object - */ -void PlaceProc_Object(TileIndex tile) -{ - DoCommandP(tile, ObjectClass::Get(_selected_object_class)->GetSpec(_selected_object_index)->Index(), _selected_object_view, CMD_BUILD_OBJECT | CMD_MSG(STR_ERROR_CAN_T_BUILD_OBJECT), CcTerraform); -} diff --git a/src/terraform_gui.cpp b/src/terraform_gui.cpp index 06b66cad4..acc277249 100644 --- a/src/terraform_gui.cpp +++ b/src/terraform_gui.cpp @@ -210,12 +210,7 @@ struct TerraformToolbarWindow : Window { break; case WID_TT_PLACE_OBJECT: // Place object button - /* Don't show the place object button when there are no objects to place. */ - if (ObjectClass::GetUIClassCount() == 0) return; - if (HandlePlacePushButton(this, WID_TT_PLACE_OBJECT, SPR_CURSOR_TRANSMITTER, HT_RECT)) { - ShowBuildObjectPicker(this); - this->last_user_action = widget; - } + ShowBuildObjectPicker(); break; default: NOT_REACHED(); @@ -249,10 +244,6 @@ struct TerraformToolbarWindow : Window { PlaceProc_Sign(tile); break; - case WID_TT_PLACE_OBJECT: // Place object button - PlaceProc_Object(tile); - break; - default: NOT_REACHED(); } } @@ -286,7 +277,6 @@ struct TerraformToolbarWindow : Window { virtual void OnPlaceObjectAbort() { - DeleteWindowById(WC_BUILD_OBJECT, 0); this->RaiseButtons(); } @@ -344,7 +334,7 @@ static const NWidgetPart _nested_terraform_widgets[] = { NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_PLACE_SIGN), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_SIGN, STR_SCENEDIT_TOOLBAR_PLACE_SIGN), NWidget(NWID_SELECTION, INVALID_COLOUR, WID_TT_SHOW_PLACE_OBJECT), - NWidget(WWT_IMGBTN, COLOUR_DARK_GREEN, WID_TT_PLACE_OBJECT), SetMinimalSize(22, 22), + NWidget(WWT_PUSHIMGBTN, COLOUR_DARK_GREEN, WID_TT_PLACE_OBJECT), SetMinimalSize(22, 22), SetFill(0, 1), SetDataTip(SPR_IMG_TRANSMITTER, STR_SCENEDIT_TOOLBAR_PLACE_OBJECT), EndContainer(), EndContainer(), @@ -616,10 +606,7 @@ struct ScenarioEditorLandscapeGenerationWindow : Window { break; case WID_ETT_PLACE_OBJECT: // Place transmitter button - if (HandlePlacePushButton(this, WID_ETT_PLACE_OBJECT, SPR_CURSOR_TRANSMITTER, HT_RECT)) { - ShowBuildObjectPicker(this); - this->last_user_action = widget; - } + ShowBuildObjectPicker(); break; case WID_ETT_INCREASE_SIZE: @@ -687,10 +674,6 @@ struct ScenarioEditorLandscapeGenerationWindow : Window { VpStartPlaceSizing(tile, VPM_X_AND_Y, DDSP_CREATE_DESERT); break; - case WID_ETT_PLACE_OBJECT: // Place transmitter button - PlaceProc_Object(tile); - break; - default: NOT_REACHED(); } } -- cgit v1.2.3-54-g00ecf