QtNovelUI/WordsIDE/present_container.cpp

120 lines
3.4 KiB
C++

#include "present_container.h"
#include "DocsManager.h"
#include "welcomepanel.h"
#include <QApplication>
#include <QComboBox>
#include <QGridLayout>
#include <QMenu>
#include <QPushButton>
using namespace Components;
using namespace Core;
using namespace Presents;
PresentContainer::PresentContainer(QWidget *ptr)
: QWidget(ptr),
title_store(new QComboBox(this)),
stack_container(new QStackedWidget(this)),
welcome_list(new WelcomePanel(this)),
close_btn(new QPushButton("X", this)) {
auto layout = new QGridLayout(this);
layout->setSpacing(0);
layout->setMargin(0);
layout->addWidget(title_store, 0, 0, 1, 3);
layout->addWidget(close_btn, 0, 3);
close_btn->setMaximumSize(QSize(30, 30));
close_btn->setEnabled(false);
items_store << welcome_list;
stack_container->addWidget(welcome_list->widget());
layout->addWidget(stack_container, 1, 0, 1, 4);
title_store->addItem(welcome_list->name());
layout->setRowStretch(0, 0);
layout->setRowStretch(1, 1);
layout->setColumnStretch(0, 1);
layout->setColumnStretch(1, 1);
layout->setColumnStretch(2, 1);
layout->setColumnStretch(3, 0);
connect(title_store, QOverload<int>::of(&QComboBox::currentIndexChanged), this, &PresentContainer::change_view);
connect(close_btn, &QPushButton::toggled, this, &PresentContainer::close_current_view);
connect(stack_container, &QStackedWidget::currentChanged, [this](int idx){
if(idx >= 0){
auto inst = items_store.at(idx);
for(auto &l : listeners_store)
l->currentChanged(inst);
}
});
}
QWidget *PresentContainer::hostWidget() const { return (QWidget *)this; }
#include <libConfig.h>
using namespace Config;
void PresentContainer::append(FilePresent *ins) {
if (!items_store.contains(ins)) {
items_store.append(ins);
title_store->addItem(ins->name());
ins->widget()->setParent(nullptr);
stack_container->addWidget(ins->widget());
active(ins);
} else
throw new SimpleException<bool>("非法操作", "重复添加视图:" + ins->name());
}
#include <QDebug>
bool PresentContainer::active(const FilePresent *ins) {
if (!items_store.contains(ins))
return false;
auto index = items_store.indexOf(ins);
title_store->setCurrentIndex(index);
title_store->setItemText(index, ins->name());
stack_container->setCurrentIndex(index);
return true;
}
void PresentContainer::remove(const FilePresent *ins) {
if (!items_store.contains(ins))
return;
auto index = items_store.indexOf(ins);
items_store.removeAt(index);
title_store->removeItem(index);
stack_container->removeWidget(ins->widget());
}
bool PresentContainer::contains(const FilePresent *ins) const {
for (auto &insit : items_store) {
if (insit == ins)
return true;
}
return false;
}
bool PresentContainer::avaliable(FilePresent *vins) {
auto global_test = QApplication::activeWindow();
if (!global_test)
return true;
return this->isActiveWindow();
}
void PresentContainer::change_view(int view_index) {
auto view_inst = items_store[view_index];
active(view_inst);
close_btn->setEnabled(view_index);
}
#include <QMessageBox>
void PresentContainer::close_current_view() {
auto index = title_store->currentIndex();
const_cast<FilePresent *>(items_store[index])->beforeClose();
}