Added action menu item with toggle view.

This commit is contained in:
23rd 2021-01-13 18:58:09 +03:00
parent 3640f69369
commit 5e37c06a6a
8 changed files with 148 additions and 36 deletions

View file

@ -150,11 +150,14 @@ PRIVATE
ui/widgets/menu/menu.h
ui/widgets/menu/menu_action.cpp
ui/widgets/menu/menu_action.h
ui/widgets/menu/menu_common.cpp
ui/widgets/menu/menu_common.h
ui/widgets/menu/menu_item_base.cpp
ui/widgets/menu/menu_item_base.h
ui/widgets/menu/menu_separator.cpp
ui/widgets/menu/menu_separator.h
ui/widgets/menu/menu_toggle.cpp
ui/widgets/menu/menu_toggle.h
ui/widgets/popup_menu.cpp
ui/widgets/popup_menu.h
ui/widgets/scroll_area.cpp

View file

@ -58,14 +58,8 @@ not_null<QAction*> Menu::addAction(
Fn<void()> callback,
const style::icon *icon,
const style::icon *iconOver) {
const auto action = addAction(new QAction(text, this), icon, iconOver);
connect(
action,
&QAction::triggered,
action,
std::move(callback),
Qt::QueuedConnection);
return action;
auto action = CreateAction(this, text, std::move(callback));
return addAction(std::move(action), icon, iconOver);
}
not_null<QAction*> Menu::addAction(
@ -288,10 +282,6 @@ void Menu::setSelected(int selected) {
const auto source = _mouseSelection
? TriggeredSource::Mouse
: TriggeredSource::Keyboard;
// updateSelectedItem();
// if (_selected >= 0 && _selected != _pressed && _actionsData[_selected].toggle) {
// _actionsData[_selected].toggle->setStyle(_st.itemToggle);
// }
if (_selected >= 0) {
_actionWidgets[_selected]->setSelected(false, source);
}
@ -299,17 +289,6 @@ void Menu::setSelected(int selected) {
if (_selected >= 0) {
_actionWidgets[_selected]->setSelected(true, source);
}
// if (_selected >= 0 && _actionsData[_selected].toggle && _actions[_selected]->isEnabled()) {
// _actionsData[_selected].toggle->setStyle(_st.itemToggleOver);
// }
// updateSelectedItem();
// if (_activatedCallback) {
// auto source = _mouseSelection ? TriggeredSource::Mouse : TriggeredSource::Keyboard;
// _activatedCallback(
// (_selected >= 0) ? _actions[_selected].get() : nullptr,
// itemTop(_selected),
// source);
// }
}
}

View file

@ -16,7 +16,6 @@
namespace Ui::Menu {
class ItemBase;
//class ToggleView;
class RippleAnimation;
class Menu : public RpWidget {

View file

@ -161,18 +161,7 @@ void Action::processAction() {
+ textWidth
+ padding.right()
+ additionalWidth;
// if (action->isCheckable()) {
// auto updateCallback = [this, index] { updateItem(index); };
// if (_toggle) {
// _toggle->setUpdateCallback(updateCallback);
// _toggle->setChecked(action->isChecked(), anim::type::normal);
// } else {
// _toggle = std::make_unique<ToggleView>(_st.itemToggle, action->isChecked(), updateCallback);
// }
// goodWidth += _st.itemPadding.right() + _toggle->getSize().width() - _st.itemToggleShift;
// } else {
// _toggle.reset();
// }
const auto w = std::clamp(goodWidth, _st.widthMin, _st.widthMax);
_textWidth = w - (goodWidth - textWidth);
_shortcut = actionShortcut;

View file

@ -0,0 +1,27 @@
// This file is part of Desktop App Toolkit,
// a set of libraries for developing nice desktop applications.
//
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
#include "ui/widgets/menu/menu_common.h"
#include <QtWidgets/QAction>
namespace Ui::Menu {
not_null<QAction*> CreateAction(
QWidget *parent,
const QString &text,
Fn<void()> &&callback) {
const auto action = new QAction(text, parent);
parent->connect(
action,
&QAction::triggered,
action,
std::move(callback),
Qt::QueuedConnection);
return action;
}
} // namespace Ui::Menu

View file

@ -21,4 +21,9 @@ struct CallbackData {
bool selected = false;
};
not_null<QAction*> CreateAction(
QWidget *parent,
const QString &text,
Fn<void()> &&callback);
} // namespace Ui::Menu

View file

@ -0,0 +1,70 @@
// This file is part of Desktop App Toolkit,
// a set of libraries for developing nice desktop applications.
//
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
#include "ui/widgets/menu/menu_toggle.h"
#include "ui/widgets/checkbox.h"
namespace Ui::Menu {
Toggle::Toggle(
not_null<RpWidget*> parent,
const style::Menu &st,
const QString &text,
Fn<void()> &&callback,
const style::icon *icon,
const style::icon *iconOver)
: Action(
parent,
st,
CreateAction(parent, text, std::move(callback)),
icon,
iconOver)
, _padding(st.itemPadding)
, _toggleShift(st.itemToggleShift)
, _itemToggle(st.itemToggle)
, _itemToggleOver(st.itemToggleOver) {
const auto processAction = [=] {
if (!action()->isCheckable()) {
_toggle.reset();
return;
}
if (_toggle) {
_toggle->setChecked(action()->isChecked(), anim::type::normal);
} else {
_toggle = std::make_unique<ToggleView>(
st.itemToggle,
action()->isChecked(),
[=] { update(); });
}
};
processAction();
connect(action(), &QAction::changed, [=] { processAction(); });
selects(
) | rpl::start_with_next([=](const CallbackData &data) {
if (!_toggle) {
return;
}
_toggle->setStyle(data.selected ? _itemToggleOver : _itemToggle);
}, lifetime());
}
void Toggle::paintEvent(QPaintEvent *e) {
Action::paintEvent(e);
if (_toggle) {
Painter p(this);
const auto toggleSize = _toggle->getSize();
_toggle->paint(
p,
width() - _padding.right() - toggleSize.width() + _toggleShift,
(contentHeight() - toggleSize.height()) / 2, width());
}
}
} // namespace Ui::Menu

View file

@ -0,0 +1,40 @@
// This file is part of Desktop App Toolkit,
// a set of libraries for developing nice desktop applications.
//
// For license and copyright information please follow this link:
// https://github.com/desktop-app/legal/blob/master/LEGAL
//
#pragma once
#include "ui/widgets/menu/menu_action.h"
#include "styles/style_widgets.h"
namespace Ui {
class ToggleView;
} // namespace Ui
namespace Ui::Menu {
class Toggle : public Action {
public:
Toggle(
not_null<RpWidget*> parent,
const style::Menu &st,
const QString &text,
Fn<void()> &&callback,
const style::icon *icon,
const style::icon *iconOver);
protected:
void paintEvent(QPaintEvent *e) override;
private:
const style::margins &_padding;
const int _toggleShift;
const style::Toggle &_itemToggle;
const style::Toggle &_itemToggleOver;
std::unique_ptr<ToggleView> _toggle;
};
} // namespace Ui::Menu