Add LayerManager for any RpWidget.

This commit is contained in:
John Preston 2019-09-20 10:35:47 +03:00
parent 15b0e73d3b
commit d3e8eb4292
3 changed files with 128 additions and 0 deletions

View file

@ -22,6 +22,8 @@
<(src_loc)/ui/layers/box_layer_widget.h <(src_loc)/ui/layers/box_layer_widget.h
<(src_loc)/ui/layers/generic_box.cpp <(src_loc)/ui/layers/generic_box.cpp
<(src_loc)/ui/layers/generic_box.h <(src_loc)/ui/layers/generic_box.h
<(src_loc)/ui/layers/layer_manager.cpp
<(src_loc)/ui/layers/layer_manager.h
<(src_loc)/ui/layers/layer_widget.cpp <(src_loc)/ui/layers/layer_widget.cpp
<(src_loc)/ui/layers/layer_widget.h <(src_loc)/ui/layers/layer_widget.h
<(src_loc)/ui/platform/ui_platform_utility.h <(src_loc)/ui/platform/ui_platform_utility.h

View file

@ -0,0 +1,85 @@
// 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/layers/layer_manager.h"
namespace Ui {
LayerManager::LayerManager(not_null<RpWidget*> widget) : _widget(widget) {
}
void LayerManager::setHideByBackgroundClick(bool hide) {
_hideByBackgroundClick = hide;
if (_layer) {
_layer->setHideByBackgroundClick(hide);
}
}
void LayerManager::showBox(
object_ptr<BoxContent> box,
LayerOptions options,
anim::type animated) {
ensureLayerCreated();
_layer->showBox(std::move(box), options, animated);
}
void LayerManager::hideAll(anim::type animated) {
if (animated == anim::type::instant) {
destroyLayer();
} else if (_layer) {
_layer->hideAll(animated);
}
}
void LayerManager::raise() {
if (_layer) {
_layer->raise();
}
}
bool LayerManager::setFocus() {
if (!_layer) {
return false;
}
_layer->setInnerFocus();
return true;
}
void LayerManager::ensureLayerCreated() {
if (_layer) {
return;
}
_layer.emplace(_widget);
_layer->setHideByBackgroundClick(_hideByBackgroundClick);
_layer->hideFinishEvents(
) | rpl::filter([=] {
return _layer != nullptr; // Last hide finish is sent from destructor.
}) | rpl::start_with_next([=] {
destroyLayer();
}, _layer->lifetime());
_layer->move(0, 0);
_widget->sizeValue(
) | rpl::start_with_next([=](QSize size) {
_layer->resize(size);
}, _layer->lifetime());
}
void LayerManager::destroyLayer() {
if (!_layer) {
return;
}
auto layer = base::take(_layer);
const auto resetFocus = Ui::InFocusChain(layer);
if (resetFocus) {
_widget->setFocus();
}
layer = nullptr;
}
} // namespace Ui

41
ui/layers/layer_manager.h Normal file
View file

@ -0,0 +1,41 @@
// 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/layers/layer_widget.h"
#include <QtCore/QMargins>
namespace Ui {
class BoxContent;
class RpWidget;
class LayerManager final {
public:
explicit LayerManager(not_null<RpWidget*> widget);
void setHideByBackgroundClick(bool hide);
void showBox(
object_ptr<BoxContent> box,
LayerOptions options = LayerOption::KeepOther,
anim::type animated = anim::type::normal);
void hideAll(anim::type animated = anim::type::normal);
void raise();
bool setFocus();
private:
void ensureLayerCreated();
void destroyLayer();
const not_null<RpWidget*> _widget;
base::unique_qptr<LayerStackWidget> _layer;
bool _hideByBackgroundClick = false;
};
} // namespace Ui