chore: use DrawnButton instead of NotebookButton (#6371)

This commit is contained in:
pajlada
2025-08-03 13:13:42 +02:00
committed by GitHub
parent 6fb3957580
commit 283be8710c
8 changed files with 74 additions and 214 deletions
+1 -1
View File
@@ -81,7 +81,7 @@
- Dev: Simplified string literals to be a re-export of Qt functions. (#6175)
- Dev: Fixed incorrect lua generation of static methods for typescript plugins. (#6190, #6223)
- Dev: Merged top/bottom and left/right notebook layouts. (#6215)
- Dev: Refactored `Button` and friends. (#6102, #6255, #6266, #6302, #6268, #6334)
- Dev: Refactored `Button` and friends. (#6102, #6255, #6266, #6302, #6268, #6334, #6371)
- Dev: Made "add split" button (part of the split header) a natively rendered button. (#6349)
- Dev: Made Settings & Account button on Linux/macOS SVGs. (#6267)
- Dev: Some more setting widget refactors. (#6317)
-2
View File
@@ -623,8 +623,6 @@ set(SOURCE_FILES
widgets/buttons/InitUpdateButton.hpp
widgets/buttons/LabelButton.cpp
widgets/buttons/LabelButton.hpp
widgets/buttons/NotebookButton.cpp
widgets/buttons/NotebookButton.hpp
widgets/buttons/PixmapButton.cpp
widgets/buttons/PixmapButton.hpp
widgets/buttons/SignalLabel.cpp
+31 -8
View File
@@ -10,8 +10,8 @@
#include "singletons/StreamerMode.hpp"
#include "singletons/Theme.hpp"
#include "singletons/WindowManager.hpp"
#include "widgets/buttons/DrawnButton.hpp"
#include "widgets/buttons/InitUpdateButton.hpp"
#include "widgets/buttons/NotebookButton.hpp"
#include "widgets/buttons/PixmapButton.hpp"
#include "widgets/buttons/SvgButton.hpp"
#include "widgets/dialogs/SettingsDialog.hpp"
@@ -38,9 +38,35 @@ namespace chatterino {
Notebook::Notebook(QWidget *parent)
: BaseWidget(parent)
, addButton_(new NotebookButton(NotebookButton::Type::Plus, this))
, addButton_(new DrawnButton(DrawnButton::Symbol::Plus,
{
.padding = 6,
.thickness = 1,
},
this))
{
this->addButton_->setHidden(true);
this->addButton_->enableDrops({"chatterino/split"});
QObject::connect(
this->addButton_, &Button::dropEvent, this, [this](QDropEvent *event) {
auto *draggedSplit = dynamic_cast<Split *>(event->source());
if (!draggedSplit)
{
qCDebug(chatterinoWidget) << "Dropped something that wasn't a "
"split onto a notebook button";
return;
}
event->acceptProposedAction();
auto *page = new SplitContainer(this);
auto *tab = this->addPage(page);
page->setTab(tab);
draggedSplit->setParent(page);
page->insertSplit(draggedSplit);
});
this->lockNotebookLayoutAction_ = new QAction("Lock Tab Layout", this);
@@ -673,6 +699,8 @@ void Notebook::setShowAddButton(bool value)
this->showAddButton_ = value;
this->addButton_->setHidden(!value);
this->refresh();
}
void Notebook::resizeAddButton()
@@ -1157,11 +1185,6 @@ void Notebook::addNotebookActionsToMenu(QMenu *menu)
menu->addAction(this->toggleTopMostAction_);
}
NotebookButton *Notebook::getAddButton()
{
return this->addButton_;
}
NotebookTab *Notebook::getTabFromPage(QWidget *page)
{
for (auto &it : this->items_)
@@ -1222,7 +1245,7 @@ bool Notebook::shouldShowTab(const NotebookTab *tab) const
SplitNotebook::SplitNotebook(Window *parent)
: Notebook(parent)
{
this->connect(this->getAddButton(), &NotebookButton::leftClicked, [this]() {
QObject::connect(this->addButton_, &Button::leftClicked, [this]() {
QTimer::singleShot(80, this, [this] {
this->addPage(true);
});
+2 -3
View File
@@ -19,8 +19,8 @@ class Button;
class PixmapButton;
class SvgButton;
class Window;
class DrawnButton;
class UpdateDialog;
class NotebookButton;
class NotebookTab;
class SplitContainer;
class Split;
@@ -133,7 +133,7 @@ protected:
void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *) override;
NotebookButton *getAddButton();
DrawnButton *addButton_;
template <typename T>
T *addCustomButton(auto &&...args)
@@ -217,7 +217,6 @@ private:
QMenu *menu_ = nullptr;
QWidget *selectedPage_ = nullptr;
NotebookButton *addButton_;
std::vector<Button *> customButtons_;
bool allowUserTabManagement_ = false;
+27
View File
@@ -5,6 +5,7 @@
#include <QApplication>
#include <QDebug>
#include <QMimeData>
#include <QPainter>
#include <QScreen>
@@ -97,6 +98,32 @@ void Button::setMenu(std::unique_ptr<QMenu> menu)
}));
}
void Button::enableDrops(const std::vector<QString> &acceptedDropMimes_)
{
this->setAcceptDrops(true);
this->acceptedDropMimes = acceptedDropMimes_;
}
void Button::dragEnterEvent(QDragEnterEvent *event)
{
auto anyMatches = std::ranges::any_of(
this->acceptedDropMimes, [event](const QString &acceptedMime) {
return event->mimeData()->hasFormat(acceptedMime);
});
if (!anyMatches)
{
return;
}
event->acceptProposedAction();
this->addClickEffect(QPoint{
this->width() / 2,
this->height() / 2,
});
}
void Button::paintEvent(QPaintEvent * /*event*/)
{
QPainter painter(this);
+13
View File
@@ -100,7 +100,13 @@ public:
/// Setter for #menu()
void setMenu(std::unique_ptr<QMenu> menu);
/// Enable drops for this button
void enableDrops(const std::vector<QString> &acceptedDropMimes_);
Q_SIGNALS:
/// Emitted when a successful drop event has occurred on the button.
void dropEvent(QDropEvent *event) override;
/// @brief Emitted after the user left-clicked the button.
///
/// A click is only emitted if the user released the mouse above the button
@@ -121,6 +127,8 @@ Q_SIGNALS:
void leftMousePress();
protected:
void dragEnterEvent(QDragEnterEvent *event) override;
void paintEvent(QPaintEvent * /*event*/) override;
/// @brief Paint the contents to be shown below the button
@@ -216,6 +224,11 @@ private:
bool pixmapValid_ = false;
bool cachePixmap_ = false;
bool opaqueContent_ = false;
/// List of Mimes (e.g. chatterino/split) that are accepted as drop events on this button
///
/// Controlled by the enableDrops function
std::vector<QString> acceptedDropMimes;
};
} // namespace chatterino
-162
View File
@@ -1,162 +0,0 @@
#include "widgets/buttons/NotebookButton.hpp"
#include "Application.hpp"
#include "common/QLogging.hpp"
#include "singletons/Theme.hpp"
#include "widgets/Notebook.hpp"
#include "widgets/splits/DraggedSplit.hpp"
#include "widgets/splits/Split.hpp"
#include "widgets/splits/SplitContainer.hpp"
#include <QMimeData>
#include <QMouseEvent>
#include <QPainter>
#include <QPainterPath>
#include <QRadialGradient>
namespace chatterino {
NotebookButton::NotebookButton(Type type_, Notebook *parent)
: Button(parent)
, parent_(parent)
, type(type_)
{
switch (this->type)
{
case Type::Plus: {
this->setAcceptDrops(true);
}
break;
}
}
void NotebookButton::themeChangedEvent()
{
this->setMouseEffectColor(this->theme->tabs.regular.text);
}
void NotebookButton::paintContent(QPainter &painter)
{
QColor background;
QColor foreground;
if (this->leftMouseButtonDown() || this->mouseOver())
{
background = this->theme->tabs.regular.backgrounds.hover;
foreground = this->theme->tabs.regular.text;
}
else
{
background = this->theme->tabs.regular.backgrounds.regular;
foreground = this->theme->tabs.regular.text;
}
painter.setPen(Qt::NoPen);
float h = height(), w = width();
switch (this->type)
{
case Type::Plus: {
painter.setPen([&] {
QColor tmp = foreground;
if (isDraggingSplit())
{
tmp = this->theme->tabs.selected.line.regular;
}
else if (!this->mouseOver())
{
tmp.setAlpha(180);
}
return tmp;
}());
QRect rect = this->rect();
int s = h * 4 / 9;
painter.drawLine(rect.left() + rect.width() / 2 - (s / 2),
rect.top() + rect.height() / 2,
rect.left() + rect.width() / 2 + (s / 2),
rect.top() + rect.height() / 2);
painter.drawLine(rect.left() + rect.width() / 2,
rect.top() + rect.height() / 2 - (s / 2),
rect.left() + rect.width() / 2,
rect.top() + rect.height() / 2 + (s / 2));
}
break;
}
}
void NotebookButton::dragEnterEvent(QDragEnterEvent *event)
{
if (this->type != Type::Plus)
{
return;
}
if (!event->mimeData()->hasFormat("chatterino/split"))
{
return;
}
event->acceptProposedAction();
this->addClickEffect(QPoint{
this->width() / 2,
this->height() / 2,
});
}
void NotebookButton::dropEvent(QDropEvent *event)
{
if (this->type != Type::Plus)
{
return;
}
auto *draggedSplit = dynamic_cast<Split *>(event->source());
if (!draggedSplit)
{
qCDebug(chatterinoWidget)
<< "Dropped something that wasn't a split onto a notebook button";
return;
}
auto *notebook = dynamic_cast<Notebook *>(this->parentWidget());
if (!notebook)
{
qCDebug(chatterinoWidget) << "Dropped a split onto a notebook button "
"without a parent notebook";
return;
}
event->acceptProposedAction();
auto *page = new SplitContainer(notebook);
auto *tab = notebook->addPage(page);
page->setTab(tab);
draggedSplit->setParent(page);
page->insertSplit(draggedSplit);
}
void NotebookButton::hideEvent(QHideEvent *)
{
if (isAppAboutToQuit())
{
return;
}
this->parent_->refresh();
}
void NotebookButton::showEvent(QShowEvent *)
{
if (isAppAboutToQuit())
{
return;
}
this->parent_->refresh();
}
} // namespace chatterino
-38
View File
@@ -1,38 +0,0 @@
#pragma once
#include "widgets/buttons/Button.hpp"
#include <QWidget>
namespace chatterino {
class Notebook;
class NotebookButton : public Button
{
Q_OBJECT
public:
enum class Type : std::uint8_t {
Plus,
};
NotebookButton(Type type_, Notebook *parent);
protected:
void paintContent(QPainter &painter) override;
void themeChangedEvent() override;
void dragEnterEvent(QDragEnterEvent *) override;
void dropEvent(QDropEvent *) override;
void hideEvent(QHideEvent *) override;
void showEvent(QShowEvent *) override;
private:
Notebook *parent_ = nullptr;
QPoint mousePos_;
Type type = Type::Plus;
};
} // namespace chatterino