Fixes crash #504

This commit is contained in:
fourtf 2018-06-24 11:45:30 +02:00
parent f5a05543cd
commit 5673cefd1b
6 changed files with 79 additions and 6 deletions

View file

@ -381,7 +381,8 @@ HEADERS += \
src/util/clamp.hpp \ src/util/clamp.hpp \
src/widgets/label.hpp \ src/widgets/label.hpp \
src/util/combine_path.hpp \ src/util/combine_path.hpp \
src/widgets/settingspages/browserextensionpage.hpp src/widgets/settingspages/browserextensionpage.hpp \
src/nullableptr.hpp
RESOURCES += \ RESOURCES += \
resources/resources.qrc resources/resources.qrc

59
src/nullableptr.hpp Normal file
View file

@ -0,0 +1,59 @@
#pragma once
namespace chatterino {
template <typename T>
class NullablePtr
{
public:
NullablePtr()
: element_(nullptr)
{
}
NullablePtr(T *element)
: element_(element)
{
}
T *operator->() const
{
assert(this->hasElement());
return element_;
}
T &operator*() const
{
assert(this->hasElement());
return *element_;
}
T *get() const
{
assert(this->hasElement());
return this->element_;
}
bool isNull() const
{
return this->element_ == nullptr;
}
bool hasElement() const
{
return this->element_ != nullptr;
}
operator bool() const
{
return this->hasElement();
}
private:
T *element_;
};
} // namespace chatterino

View file

@ -16,8 +16,8 @@
namespace chatterino { namespace chatterino {
namespace widgets { namespace widgets {
SelectChannelDialog::SelectChannelDialog() SelectChannelDialog::SelectChannelDialog(QWidget *parent)
: BaseWindow((QWidget *)nullptr, BaseWindow::EnableCustomFrame) : BaseWindow(parent, BaseWindow::EnableCustomFrame)
, selectedChannel(Channel::getEmpty()) , selectedChannel(Channel::getEmpty())
{ {
this->setWindowTitle("Select a channel to join"); this->setWindowTitle("Select a channel to join");

View file

@ -15,7 +15,7 @@ namespace widgets {
class SelectChannelDialog : public BaseWindow class SelectChannelDialog : public BaseWindow
{ {
public: public:
SelectChannelDialog(); SelectChannelDialog(QWidget *parent = nullptr);
void setSelectedChannel(IndirectChannel selectedChannel); void setSelectedChannel(IndirectChannel selectedChannel);
IndirectChannel getSelectedChannel() const; IndirectChannel getSelectedChannel() const;

View file

@ -45,7 +45,7 @@ pajlada::Signals::Signal<Qt::KeyboardModifiers> Split::modifierStatusChanged;
Qt::KeyboardModifiers Split::modifierStatus = Qt::NoModifier; Qt::KeyboardModifiers Split::modifierStatus = Qt::NoModifier;
Split::Split(SplitContainer *parent) Split::Split(SplitContainer *parent)
: Split((QWidget *)parent) : Split(static_cast<QWidget *>(parent))
{ {
this->container = parent; this->container = parent;
} }
@ -232,7 +232,13 @@ bool Split::getModerationMode() const
void Split::showChangeChannelPopup(const char *dialogTitle, bool empty, void Split::showChangeChannelPopup(const char *dialogTitle, bool empty,
std::function<void(bool)> callback) std::function<void(bool)> callback)
{ {
SelectChannelDialog *dialog = new SelectChannelDialog(); if (this->selectChannelDialog.hasElement()) {
this->selectChannelDialog->raise();
return;
}
SelectChannelDialog *dialog = new SelectChannelDialog(this);
if (!empty) { if (!empty) {
dialog->setSelectedChannel(this->getIndirectChannel()); dialog->setSelectedChannel(this->getIndirectChannel());
} }
@ -247,7 +253,9 @@ void Split::showChangeChannelPopup(const char *dialogTitle, bool empty,
} }
callback(dialog->hasSeletedChannel()); callback(dialog->hasSeletedChannel());
this->selectChannelDialog = nullptr;
}); });
this->selectChannelDialog = dialog;
} }
void Split::layoutMessages() void Split::layoutMessages()
@ -362,6 +370,7 @@ void Split::doCloseSplit()
void Split::doChangeChannel() void Split::doChangeChannel()
{ {
this->showChangeChannelPopup("Change channel", false, [](bool) {}); this->showChangeChannelPopup("Change channel", false, [](bool) {});
auto popup = this->findChildren<QDockWidget *>(); auto popup = this->findChildren<QDockWidget *>();
if (popup.size() && popup.at(0)->isVisible() && !popup.at(0)->isFloating()) { if (popup.size() && popup.at(0)->isVisible() && !popup.at(0)->isFloating()) {
popup.at(0)->hide(); popup.at(0)->hide();

View file

@ -5,6 +5,7 @@
#include "messages/layouts/messagelayoutelement.hpp" #include "messages/layouts/messagelayoutelement.hpp"
#include "messages/limitedqueuesnapshot.hpp" #include "messages/limitedqueuesnapshot.hpp"
#include "messages/messageelement.hpp" #include "messages/messageelement.hpp"
#include "nullableptr.hpp"
#include "util/serialize-custom.hpp" #include "util/serialize-custom.hpp"
#include "widgets/basewidget.hpp" #include "widgets/basewidget.hpp"
#include "widgets/helper/channelview.hpp" #include "widgets/helper/channelview.hpp"
@ -22,6 +23,7 @@ namespace widgets {
class SplitContainer; class SplitContainer;
class SplitOverlay; class SplitOverlay;
class SelectChannelDialog;
// Each ChatWidget consists of three sub-elements that handle their own part of the chat widget: // Each ChatWidget consists of three sub-elements that handle their own part of the chat widget:
// ChatWidgetHeader // ChatWidgetHeader
@ -96,6 +98,8 @@ private:
SplitInput input; SplitInput input;
SplitOverlay *overlay; SplitOverlay *overlay;
NullablePtr<SelectChannelDialog> selectChannelDialog;
bool moderationMode = false; bool moderationMode = false;
bool isMouseOver = false; bool isMouseOver = false;