QtNovelUI/libSplitView/splitpanel.cpp

148 lines
3.6 KiB
C++
Raw Normal View History

2023-08-26 12:40:57 +00:00
#include "splitpanel.h"
#include "baseview.h"
#include <QPainter>
#include <libConfig.h>
2023-12-30 05:04:51 +00:00
using namespace split_frame;
using namespace split_panel;
2023-08-26 12:40:57 +00:00
using namespace Config;
2023-12-30 05:04:51 +00:00
SplitPanel::SplitPanel(ViewBase *first, ViewBase *next, ViewRes *parent)
: QWidget(parent->widget()), parent_inst(parent)
{
this->split_member = std::make_tuple(first, next, SplitType::SPLIT_H);
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
SplitPanel::~SplitPanel()
{
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
ResManager *SplitPanel::splitManager() const { return this->parent_inst->splitManager(); }
2023-08-26 12:40:57 +00:00
2023-12-30 05:04:51 +00:00
ViewRes *SplitPanel::parentRes() const
{
return parent_inst;
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
bool SplitPanel::canRetrieve() const
{
return true;
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
bool SplitPanel::canClose() const
{
return true;
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
bool SplitPanel::canReplace() const
{
return true;
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
QIcon SplitPanel::icon() const
{
return QIcon();
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
QString SplitPanel::title() const
{
return QString("split-view%1").arg((int64_t)this);
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
QWidget *SplitPanel::widget() const
{
return const_cast<SplitPanel*>(this);
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
QSizeF SplitPanel::viewSize() const
{
return this->size();
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
void SplitPanel::resizeView(const QSizeF &outline)
{
if(outline != this->size()){
this->resize(outline.toSize());
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
auto tuple_values = this->child();
2023-08-27 14:09:46 +00:00
2023-12-30 05:04:51 +00:00
if(view_list().size() == 1){
view_list().first()->resizeView(this->viewSize());
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
else{
switch (std::get<2>(tuple_values)) {
case SplitType::SPLIT_H: {
auto width_value = QWidget::width() * this->splitterPos();
std::get<0>(tuple_values)->widget()->setGeometry(0, 0, width_value, QWidget::height());
2023-08-26 12:40:57 +00:00
2023-12-30 05:04:51 +00:00
auto second_pos = width_value + splitterWidth();
auto second_width = QWidget::width() - second_pos;
std::get<1>(tuple_values)->widget()->setGeometry(second_pos, 0, second_width, QWidget::height());
} break;
case SplitType::SPLIT_V: {
auto height_value = QWidget::height() * this->splitterPos();
std::get<0>(tuple_values)->widget()->setGeometry(0, 0, QWidget::width(), height_value);
2023-08-26 12:40:57 +00:00
2023-12-30 05:04:51 +00:00
auto second_pos = height_value + splitterWidth();
auto second_height = QWidget::height() - second_pos;
std::get<1>(tuple_values)->widget()->setGeometry(0, second_pos, QWidget::width(), second_height);
} break;
2023-08-26 12:40:57 +00:00
}
}
}
2023-12-30 05:04:51 +00:00
std::tuple<ViewBase *, ViewBase *, SplitType> SplitPanel::child() const
{
return this->split_member;
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
void SplitPanel::replaceComp(ViewBase *view, ViewBase *old)
{
QList<ViewBase*> mbrs = view_list();
2023-08-26 12:40:57 +00:00
2023-12-30 05:04:51 +00:00
if(!mbrs.contains(view) && mbrs.contains(old)){
if(std::get<1>(split_member) == old){
this->split_member = std::make_tuple(std::get<0>(split_member), view, std::get<2>(split_member));
}
else if(std::get<0>(split_member) == old){
this->split_member = std::make_tuple(view, std::get<1>(split_member), std::get<2>(split_member));
}
2023-08-27 14:29:53 +00:00
2023-12-30 05:04:51 +00:00
old->widget()->setParent(nullptr);
view->widget()->setParent(this);
this->resizeView(this->viewSize());
2023-08-26 12:40:57 +00:00
}
}
2023-12-30 05:04:51 +00:00
float SplitPanel::splitterWidth() const
{
return std::get<1>(split_info_value);
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
float SplitPanel::splitterPos() const
{
return std::get<0>(split_info_value);
2023-08-26 12:40:57 +00:00
}
2023-12-30 05:04:51 +00:00
void SplitPanel::setSplitInfo(split_frame::SplitType type, float pos, float width)
{
this->split_member = std::make_tuple(std::get<0>(split_member), std::get<1>(split_member), type);
this->split_info_value = std::make_tuple(pos, width);
2023-08-26 12:40:57 +00:00
}
2023-08-27 14:09:46 +00:00
2023-12-30 05:04:51 +00:00
QList<ViewBase *> SplitPanel::view_list() const
{
QList<ViewBase*> items;
2023-08-26 12:40:57 +00:00
2023-12-30 05:04:51 +00:00
if(std::get<0>(split_member))
items << std::get<0>(split_member);
if(std::get<1>(split_member))
items << std::get<1>(split_member);
2023-08-26 12:40:57 +00:00
2023-12-30 05:04:51 +00:00
return items;
2023-08-27 14:09:46 +00:00
}