Skip to content

Commit

Permalink
Scroll to class when using picker tool on object
Browse files Browse the repository at this point in the history
See: #572
  • Loading branch information
JGRennison committed Jul 20, 2023
1 parent c8ca16e commit 40faaa4
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 0 deletions.
36 changes: 36 additions & 0 deletions src/object_gui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,24 @@ class BuildObjectWindow : public Window {
}
}

/**
* Clear class filter if the selected class is not included in the filter.
* @param object_class Object class select.
*/
void ClearFilterIsClassNotIncluded(ObjectClassID object_class)
{
/* Filter is not enabled */
if (!this->object_classes.IsFilterEnabled()) return;

for (auto oc : this->object_classes) {
if (oc == object_class) {
return;
}
}

this->ClearEditBox(WID_BO_FILTER);
}

/**
* Select the specified object class.
* @param object_class Object class select.
Expand Down Expand Up @@ -456,6 +474,22 @@ class BuildObjectWindow : public Window {
this->UpdateButtons(_selected_object_class, _selected_object_index, _selected_object_view);
}

/**
* Scrolls #WID_BO_SCROLLBAR so that the selected class is visible.
*/
void EnsureSelectedClassIsVisible()
{
uint pos = 0;
for (auto object_class : this->object_classes) {
if (object_class == _selected_object_class) {
this->vscroll->SetCount(this->object_classes.size());
this->vscroll->ScrollTowards(pos);
return;
}
pos++;
}
}

void UpdateSelectSize()
{
if (_selected_object_index == -1) {
Expand Down Expand Up @@ -760,8 +794,10 @@ void ShowBuildObjectPickerAndSelect(const ObjectSpec *spec)

BuildObjectWindow *w = AllocateWindowDescFront<BuildObjectWindow>(&_build_object_desc, 0, true);
if (w != nullptr) {
w->ClearFilterIsClassNotIncluded(spec->cls_id);
w->SelectOtherClass(spec->cls_id);
w->SelectOtherObject(spec_id);
w->EnsureSelectedClassIsVisible();
}
}

Expand Down
16 changes: 16 additions & 0 deletions src/window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2755,6 +2755,22 @@ EventState Window::HandleEditBoxKey(int wid, WChar key, uint16 keycode)
return ES_HANDLED;
}

/**
* Clear editbox widget.
* @param wid Editbox widget.
* @return if the Editbox was successfully cleared
*/
bool Window::ClearEditBox(int wid)
{
QueryString *query = this->GetQueryString(wid);
if (query == nullptr) return false;

query->text.DeleteAll();
this->SetWidgetDirty(wid);
this->OnEditboxChanged(wid);
return true;
}

/**
* Focus a window by its class and window number (if it is open).
* @param cls Window class.
Expand Down
1 change: 1 addition & 0 deletions src/window_gui.h
Original file line number Diff line number Diff line change
Expand Up @@ -506,6 +506,7 @@ struct Window : WindowBase {
bool SetFocusedWidget(int widget_index);

EventState HandleEditBoxKey(int wid, WChar key, uint16 keycode);
bool ClearEditBox(int wid);
virtual void InsertTextString(int wid, const char *str, bool marked, const char *caret, const char *insert_location, const char *replacement_end);

void HandleButtonClick(byte widget);
Expand Down

0 comments on commit 40faaa4

Please sign in to comment.