mirror of
https://github.com/clangen/musikcube.git
synced 2024-10-02 04:52:32 +00:00
A couple more focus optimizations
This commit is contained in:
parent
712be61b32
commit
19d7d10543
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user