Add WindowManager::getLastSelectedWindow() to replace getMainWindow() (#4816)

1. No longer can return a nullptr if no window was ever focused
  2. When closing a window, it will no longer return an invalid pointer
This commit is contained in:
Mm2PL 2023-09-16 22:53:44 +02:00 committed by GitHub
parent 38c994be49
commit d752ce86fd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 25 additions and 4 deletions

View file

@ -18,6 +18,7 @@
- Dev: Fix clang-tidy `cppcoreguidelines-pro-type-member-init` warnings. (#4426)
- Dev: Immediate layout for invisible `ChannelView`s is skipped. (#4811)
- Dev: Refactor `Image` & Image's `Frames`. (#4773)
- Dev: Add `WindowManager::getLastSelectedWindow()` to replace `getMainWindow()`. (#4816)
- Dev: Clarify signal connection lifetimes where applicable. (#4818)
## 2.4.5

View file

@ -243,11 +243,15 @@ Window &WindowManager::getMainWindow()
return *this->mainWindow_;
}
Window &WindowManager::getSelectedWindow()
Window *WindowManager::getLastSelectedWindow() const
{
assertInGuiThread();
if (this->selectedWindow_ == nullptr)
{
return this->mainWindow_;
}
return *this->selectedWindow_;
return this->selectedWindow_;
}
Window &WindowManager::createWindow(WindowType type, bool show, QWidget *parent)

View file

@ -65,7 +65,14 @@ public:
void repaintGifEmotes();
Window &getMainWindow();
Window &getSelectedWindow();
// Returns a pointer to the last selected window.
// Edge cases:
// - If the application was not focused since the start, this will return a pointer to the main window.
// - If the window was closed this points to the main window.
// - If the window was unfocused since being selected, this function will still return it.
Window *getLastSelectedWindow() const;
Window &createWindow(WindowType type, bool show = true,
QWidget *parent = nullptr);
@ -153,6 +160,8 @@ private:
QTimer *saveTimer;
QTimer miscUpdateTimer_;
friend class Window; // this is for selectedWindow_
};
} // namespace chatterino

View file

@ -103,8 +103,10 @@ bool Window::event(QEvent *event)
{
switch (event->type())
{
case QEvent::WindowActivate:
case QEvent::WindowActivate: {
getApp()->windows->selectedWindow_ = this;
break;
}
case QEvent::WindowDeactivate: {
auto page = this->notebook_->getOrAddSelectedPage();
@ -142,6 +144,11 @@ void Window::closeEvent(QCloseEvent *)
app->windows->closeAll();
}
// Ensure selectedWindow_ is never an invalid pointer.
// WindowManager will return the main window if no window is pointed to by
// `selectedWindow_`.
getApp()->windows->selectedWindow_ = nullptr;
this->closed.invoke();
if (this->type_ == WindowType::Main)