diff --git a/src/object.h b/src/object.h index e0b0c8eee4..0ab92d3769 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 25856c1727..220f4e3854 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,10 +340,11 @@ public: _selected_object_view = 0; } - this->GetWidget(WID_BO_OBJECT_MATRIX)->SetClicked(_selected_object_view); - this->GetWidget(WID_BO_SELECT_MATRIX)->SetClicked(_selected_object_index != -1 ? ObjectClass::Get(_selected_object_class)->GetUIFromIndex(_selected_object_index) : -1); - this->UpdateSelectSize(); - this->SetDirty(); + 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); } void UpdateSelectSize() @@ -355,6 +359,29 @@ public: } } + /** + * Update buttons to show the selection to the user. + * @param sel_class The class of the selected object. + * @param sel_index Index of the object to select, or \c -1 . + * @param sel_view View of the object to select. + */ + void UpdateButtons(ObjectClassID sel_class, int sel_index, uint sel_view) + { + int view_number, object_number; + if (sel_index == -1) { + view_number = -1; // If no object selected, also hide the selected view. + object_number = -1; + } else { + view_number = sel_view; + object_number = ObjectClass::Get(sel_class)->GetUIFromIndex(sel_index); + } + + this->GetWidget(WID_BO_OBJECT_MATRIX)->SetClicked(view_number); + this->GetWidget(WID_BO_SELECT_MATRIX)->SetClicked(object_number); + this->UpdateSelectSize(); + this->SetDirty(); + } + virtual void OnResize() { this->vscroll->SetCapacityFromWidget(this, WID_BO_CLASS_LIST); @@ -382,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 @@ -488,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. */ @@ -498,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 06b66cad44..acc277249c 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(); } } diff --git a/src/viewport.cpp b/src/viewport.cpp index 0dfc894f93..a1bb2c81d1 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -3141,6 +3141,13 @@ EventState VpHandlePlaceSizingDrag() return ES_HANDLED; } +/** + * Change the cursor and mouse click/drag handling to a mode for performing special operations like tile area selection, object placement, etc. + * @param icon New shape of the mouse cursor. + * @param pal Palette to use. + * @param mode Mode to perform. + * @param w %Window requesting the mode change. + */ void SetObjectToPlaceWnd(CursorID icon, PaletteID pal, HighLightStyle mode, Window *w) { SetObjectToPlace(icon, pal, mode, w->window_class, w->window_number); @@ -3148,6 +3155,14 @@ void SetObjectToPlaceWnd(CursorID icon, PaletteID pal, HighLightStyle mode, Wind #include "table/animcursors.h" +/** + * Change the cursor and mouse click/drag handling to a mode for performing special operations like tile area selection, object placement, etc. + * @param icon New shape of the mouse cursor. + * @param pal Palette to use. + * @param mode Mode to perform. + * @param window_class %Window class of the window requesting the mode change. + * @param window_num Number of the window in its class requesting the mode change. + */ void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowClass window_class, WindowNumber window_num) { if (_thd.window_class != WC_INVALID) { @@ -3192,6 +3207,7 @@ void SetObjectToPlace(CursorID icon, PaletteID pal, HighLightStyle mode, WindowC } +/** Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows). */ void ResetObjectToPlace() { SetObjectToPlace(SPR_CURSOR_MOUSE, PAL_NONE, HT_NONE, WC_MAIN_WINDOW, 0);