A couple more focus optimizations

This commit is contained in:
casey langen 2019-03-06 22:15:12 -08:00
parent 712be61b32
commit 19d7d10543
3 changed files with 17 additions and 23 deletions

View File

@ -168,13 +168,12 @@ void AppLayout::SetLayout(std::shared_ptr<cursespp::LayoutBase> layout) {
this->AddWindow(this->layout);
this->layout->SetFocusOrder(0);
this->Layout();
if (!this->shortcuts->IsFocused()) {
auto lastFocusIndex = last(this->layout.get());
this->layout->SetFocusIndex(lastFocusIndex);
}
this->Layout();
}
}
}

View File

@ -77,8 +77,9 @@ LayoutBase::~LayoutBase() {
}
}
IWindowPtr LayoutBase::AdjustFocus(IWindowPtr oldFocus, IWindowPtr newFocus) {
if (this->IsVisible() && newFocus) {
IWindowPtr LayoutBase::EnsureValidFocus() {
auto newFocus = this->GetFocus();
if (newFocus && this->IsVisible()) {
newFocus->Focus();
}
return newFocus;
@ -256,13 +257,13 @@ IWindowPtr LayoutBase::GetWindowAt(size_t position) {
bool LayoutBase::SetFocus(IWindowPtr focus) {
if (!focus) {
this->AdjustFocus(GetFocus(), focus);
this->EnsureValidFocus();
return true;
}
else {
for (size_t i = 0; i < this->focusable.size(); i++) {
if (this->focusable[i] == focus) {
this->AdjustFocus(GetFocus(), focus);
this->EnsureValidFocus();
this->focused = i;
return true;
}
@ -274,7 +275,6 @@ bool LayoutBase::SetFocus(IWindowPtr focus) {
IWindowPtr LayoutBase::FocusNext() {
sigslot::signal1<FocusDirection>* notify = nullptr;
IWindowPtr oldFocus = GetFocus();
if (this->focused == NO_FOCUS && this->focusMode == FocusModeTerminating) {
/* nothing. we're already terminated. */
notify = &FocusTerminated;
@ -293,20 +293,18 @@ IWindowPtr LayoutBase::FocusNext() {
}
}
IWindowPtr newFocus = GetFocus();
this->AdjustFocus(oldFocus, newFocus);
this->EnsureValidFocus();
if (notify) {
(*notify)(FocusForward);
}
return newFocus;
return this->GetFocus();
}
IWindowPtr LayoutBase::FocusPrev() {
sigslot::signal1<FocusDirection>* notify = nullptr;
IWindowPtr oldFocus = GetFocus();
--this->focused;
if (this->focused < 0) {
if (this->focusMode == FocusModeCircular) {
@ -319,26 +317,23 @@ IWindowPtr LayoutBase::FocusPrev() {
}
}
IWindowPtr newFocus = GetFocus();
this->AdjustFocus(oldFocus, newFocus);
this->EnsureValidFocus();
if (notify) {
(*notify)(FocusBackward);
}
return newFocus;
return GetFocus();
}
IWindowPtr LayoutBase::FocusFirst() {
IWindowPtr oldFocus = GetFocus();
this->focused = 0;
return this->AdjustFocus(oldFocus, GetFocus());
return this->EnsureValidFocus();
}
IWindowPtr LayoutBase::FocusLast() {
IWindowPtr oldFocus = GetFocus();
this->focused = (int) this->focusable.size() - 1;
return this->AdjustFocus(oldFocus, GetFocus());
return this->EnsureValidFocus();
}
IWindowPtr LayoutBase::GetFocus() {
@ -357,11 +352,11 @@ int LayoutBase::GetFocusIndex() {
}
void LayoutBase::SetFocusIndex(int index) {
if (this->focused != index) {
IWindowPtr oldFocus = GetFocus();
this->focused = index;
this->AdjustFocus(oldFocus, GetFocus());
if (!this->focusable.size()) {
this->IndexFocusables();
}
this->focused = index;
this->EnsureValidFocus();
}
int LayoutBase::GetFocusableCount() {

View File

@ -105,7 +105,7 @@ namespace cursespp {
virtual void OnVisibilityChanged(bool visible);
virtual void OnLayout();
IWindowPtr AdjustFocus(IWindowPtr oldFocus, IWindowPtr newFocus);
IWindowPtr EnsureValidFocus();
private:
void AddFocusable(IWindowPtr window);