diff options
Diffstat (limited to 'src/object_gui.cpp')
-rw-r--r-- | src/object_gui.cpp | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/src/object_gui.cpp b/src/object_gui.cpp index 5fd9b1fcc..4b8f70447 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -42,7 +42,7 @@ public: this->vscroll = this->GetScrollbar(WID_BO_SCROLLBAR); this->vscroll->SetCapacity(5); this->vscroll->SetPosition(0); - this->vscroll->SetCount(ObjectClass::GetClassCount()); + this->vscroll->SetCount(ObjectClass::GetUIClassCount()); this->FinishInitNested(desc, 0); @@ -51,7 +51,7 @@ public: NWidgetMatrix *matrix = this->GetWidget<NWidgetMatrix>(WID_BO_SELECT_MATRIX); matrix->SetScrollbar(this->GetScrollbar(WID_BO_SELECT_SCROLL)); - matrix->SetCount(ObjectClass::Get(_selected_object_class)->GetSpecCount()); + matrix->SetCount(ObjectClass::Get(_selected_object_class)->GetUISpecCount()); } virtual ~BuildObjectWindow() @@ -78,7 +78,9 @@ public: switch (widget) { case WID_BO_CLASS_LIST: { for (uint i = 0; i < ObjectClass::GetClassCount(); i++) { - size->width = max(size->width, GetStringBoundingBox(ObjectClass::Get((ObjectClassID)i)->name).width); + ObjectClass *objclass = ObjectClass::Get((ObjectClassID)i); + if (objclass->GetUISpecCount() == 0) continue; + size->width = max(size->width, GetStringBoundingBox(objclass->name).width); } size->width += padding.width; this->line_height = FONT_HEIGHT_NORMAL + WD_MATRIX_TOP + WD_MATRIX_BOTTOM; @@ -106,7 +108,7 @@ public: /* Get the height and view information. */ for (int i = 0; i < NUM_OBJECTS; i++) { const ObjectSpec *spec = ObjectSpec::Get(i); - if (!spec->enabled) continue; + if (!spec->IsEverAvailable()) continue; two_wide |= spec->views >= 2; height[spec->views / 4] = max<int>(ObjectSpec::Get(i)->height, height[spec->views / 4]); } @@ -155,8 +157,12 @@ public: switch (GB(widget, 0, 16)) { case WID_BO_CLASS_LIST: { int y = r.top; - for (uint i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < ObjectClass::GetClassCount(); i++) { - SetDParam(0, ObjectClass::Get((ObjectClassID)i)->name); + uint pos = 0; + for (uint i = 0; i < ObjectClass::GetClassCount(); i++) { + ObjectClass *objclass = ObjectClass::Get((ObjectClassID)i); + if (objclass->GetUISpecCount() == 0) continue; + if (!this->vscroll->IsVisible(pos++)) continue; + SetDParam(0, objclass->name); DrawString(r.left + WD_MATRIX_LEFT, r.right + WD_MATRIX_RIGHT, y + WD_MATRIX_TOP, STR_JUST_STRING, ((int)i == _selected_object_class) ? TC_WHITE : TC_BLACK); y += this->line_height; @@ -188,8 +194,10 @@ public: case WID_BO_SELECT_IMAGE: { if (_selected_object_index < 0) break; - int obj_index = GB(widget, 16, 16); - const ObjectSpec *spec = ObjectClass::Get(_selected_object_class)->GetSpec(obj_index); + ObjectClass *objclass = ObjectClass::Get(_selected_object_class); + int obj_index = objclass->GetIndexFromUI(GB(widget, 16, 16)); + if (obj_index < 0) break; + const ObjectSpec *spec = objclass->GetSpec(obj_index); if (spec == NULL) break; if (!spec->IsAvailable()) { @@ -261,7 +269,7 @@ public: } this->GetWidget<NWidgetMatrix>(WID_BO_OBJECT_MATRIX)->SetClicked(_selected_object_view); - this->GetWidget<NWidgetMatrix>(WID_BO_SELECT_MATRIX)->SetClicked(_selected_object_index); + this->GetWidget<NWidgetMatrix>(WID_BO_SELECT_MATRIX)->SetClicked(_selected_object_index != -1 ? ObjectClass::Get(_selected_object_class)->GetUIFromIndex(_selected_object_index) : -1); this->UpdateSelectSize(); this->SetDirty(); } @@ -289,18 +297,18 @@ public: switch (GB(widget, 0, 16)) { case WID_BO_CLASS_LIST: { int num_clicked = this->vscroll->GetPosition() + (pt.y - this->nested_array[widget]->pos_y) / this->line_height; - if (num_clicked >= (int)ObjectClass::GetClassCount()) break; + if (num_clicked >= (int)ObjectClass::GetUIClassCount()) break; - _selected_object_class = (ObjectClassID)num_clicked; - this->GetWidget<NWidgetMatrix>(WID_BO_SELECT_MATRIX)->SetCount(ObjectClass::Get(_selected_object_class)->GetSpecCount()); + _selected_object_class = ObjectClass::GetUIClass(num_clicked); + this->GetWidget<NWidgetMatrix>(WID_BO_SELECT_MATRIX)->SetCount(ObjectClass::Get(_selected_object_class)->GetUISpecCount()); this->SelectFirstAvailableObject(false); break; } case WID_BO_SELECT_IMAGE: { - int num_clicked = GB(widget, 16, 16); - const ObjectSpec *spec = ObjectClass::Get(_selected_object_class)->GetSpec(num_clicked); - if (spec->IsAvailable()) this->SelectOtherObject(num_clicked); + ObjectClass *objclass = ObjectClass::Get(_selected_object_class); + int num_clicked = objclass->GetIndexFromUI(GB(widget, 16, 16)); + if (num_clicked >= 0 && objclass->GetSpec(num_clicked)->IsAvailable()) this->SelectOtherObject(num_clicked); break; } |