从项目操作(创建、打开、关闭、保存)到文件操作(新建、打开、删除、显示编辑)机制完成

This commit is contained in:
玉宇清音 2023-09-04 22:35:14 +08:00
parent fc86521d1e
commit 165d7f85f1
18 changed files with 304 additions and 95 deletions

View File

@ -6,5 +6,5 @@ SUBDIRS += \
WordsIDE \
libConfig \
libProjectManager \
libTextEdit \
# libTextEdit \
u_test

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.15.0, 2023-09-01T00:30:22. -->
<!-- Written by QtCreator 4.15.0, 2023-09-04T07:38:38. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

View File

@ -24,10 +24,7 @@ void NewProject::fromText(const QString &line) {
name_val = list[1];
}
NewPackage::NewPackage(const QString &path_string)
{
sequence = path_string.split("/");
}
NewPackage::NewPackage(const QString &path_string) { sequence = path_string.split("/", QString::SplitBehavior::SkipEmptyParts); }
QString NewPackage::name() const
{
@ -188,3 +185,23 @@ void CloseProject::run(Schedule::CommandsDispatcher *core) const {
QString CloseProject::toText() const { return ""; }
void CloseProject::fromText(const QString &line) {}
DeleteTarget::DeleteTarget(const Core::Route &target) : node_path(target) {}
DeleteTarget::DeleteTarget(const QModelIndex &target) : node_index(target) {}
QString DeleteTarget::name() const { return NAME(DeleteTarget); }
void DeleteTarget::run(Schedule::CommandsDispatcher *core) const {
auto vmgr = core->get<DocumentsManager>(NAME(DocumentsManager));
if (!node_index.isValid())
vmgr->deleteNode(node_path);
else {
auto node_path = vmgr->convertPath(node_index);
vmgr->deleteNode(node_path);
}
}
QString DeleteTarget::toText() const { return node_path.links().join("/"); }
void DeleteTarget::fromText(const QString &line) { Route::collect(line.split("/", QString::SplitBehavior::SkipEmptyParts)); }

View File

@ -3,6 +3,7 @@
#include "route.h"
#include <QModelIndex>
#include <commandsdispatcher.h>
namespace Presents {
@ -85,8 +86,26 @@ namespace CommandList {
virtual QString toText() const override;
virtual void fromText(const QString &line) override;
};
class DeleteTarget : public Schedule::GeCommand {
public:
DeleteTarget(const Core::Route &target);
DeleteTarget(const QModelIndex &target);
// GeCommand interface
public:
virtual QString name() const override;
virtual void run(Schedule::CommandsDispatcher *core) const override;
virtual QString toText() const override;
virtual void fromText(const QString &line) override;
private:
QModelIndex node_index = QModelIndex();
Core::Route node_path;
};
class OpenFile : public Schedule::GeCommand {
public:
public:
OpenFile(const Core::Route &path_node);
OpenFile(const QFileInfo &f);

View File

@ -97,9 +97,14 @@ void DocumentsManager::openFile(const QList<Route> &doc_paths) {
view->load(info);
view->applySetting(it.links().last());
for (auto con : present_ui)
if (con->avaliable(view))
for (auto &con : present_ui)
if (con->avaliable(view)) {
con->append(view);
return;
}
// 默认第一个打开
present_ui.first()->append(view);
}
}
@ -158,7 +163,7 @@ QList<Route> DocumentsManager::actives() const { return doc_openning.keys(); }
void DocumentsManager::active(const Core::Route &node_path) {
if (doc_openning.contains(node_path)) {
auto inst = convertPresent(node_path);
for (auto vit : present_ui)
for (auto &vit : present_ui)
if (vit->contains(inst))
vit->active(inst);
}

View File

@ -26,9 +26,11 @@ PresentContainerView::PresentContainerView(ViewPresent *host)
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);
@ -51,12 +53,15 @@ void PresentContainerView::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());
}
throw new SimpleException<bool>("非法操作", "重复添加视图:" + ins->name());
active(ins);
} else
throw new SimpleException<bool>("非法操作", "重复添加视图:" + ins->name());
}
#include <QDebug>
bool PresentContainerView::active(const FilePresent *ins) {
if (!items_store.contains(ins))
return false;
@ -87,9 +92,10 @@ bool PresentContainerView::contains(const FilePresent *ins) const {
}
bool PresentContainerView::avaliable(FilePresent *vins) {
if (!QApplication::activeWindow())
auto global_test = QApplication::activeWindow();
if (!global_test)
return true;
return this->hasFocus();
return this->isActiveWindow();
}
void PresentContainerView::change_view(int view_index) {

View File

@ -3,6 +3,7 @@
#include "manager_docs.h"
#include <QPushButton>
#include <QStackedLayout>
#include <QStackedWidget>
#include <splitpanel.h>

View File

@ -55,7 +55,7 @@ void ProjectView::menu_popup(const QPoint &p)
}
m.addSeparator();
m.addAction("移除节点");
m.addAction("移除节点", [&index, this]() { source->postCommand(DeleteTarget(index)); });
}

View File

@ -15,7 +15,6 @@ QString StorySourceEdit::file_suffix = "storyboard";
StorySourceEdit::StorySourceEdit(DocumentsManager *mgr, const Route &p, QObject *parent)
: FilePresent(parent), mgr_inst(mgr), path_store(p), edit_square(new QTextEdit) {
// words_highlighter->setDocument(this->edit_square->document());
connect(edit_square, &QTextEdit::textChanged, [this](){
emit this->dataChanged(filepath_store);
});

View File

@ -1,10 +1,17 @@
#include "welcomepanel.h"
#include <QPainter>
using namespace Core;
using namespace Presents;
WelcomePanel::WelcomePanel(QWidget *parent) : QWidget(parent) {}
void WelcomePanel::paintEvent(QPaintEvent *event) {
QPainter p(this);
p.fillRect(this->rect(), Qt::green);
}
QWidget *WelcomePanel::widget() const { return (QWidget *)this; }
QString WelcomePanel::name() const { return "WelcomePanel"; }

View File

@ -11,6 +11,9 @@ namespace Presents {
public:
WelcomePanel(QWidget *parent = nullptr);
protected:
virtual void paintEvent(QPaintEvent *event) override;
// FilePresent interface
public:
virtual QWidget *widget() const override;

View File

@ -50,6 +50,7 @@ void XApp::init_commands(Schedule::CommandsDispatcher *host) {
host->registerCommand(new OpenFile(Route()));
host->registerCommand(new OpenProject(""));
host->registerCommand(new SaveAll());
host->registerCommand(new DeleteTarget(Route()));
}
CommandsDispatcher *const XApp::disp_core = new CommandsDispatcher(QDir("./"), true);

View File

@ -0,0 +1,24 @@
#include "blockdatas.h"
using namespace PresentDatas;
DisplayGroup::DisplayGroup(const QString &uid) : SpecificEntityData(EntityType::DISPLAY_GROUP, uid) {}
QString DisplayGroup::styledText() const {
QString retvs = QString("<group id='%1'>\n").arg(this->uID());
for (auto &i : children())
retvs += i->styledText();
retvs += "</group>\n";
return retvs;
}
QString DisplayGroup::plainText() const {
QString retvs = "";
for (auto &i : children())
retvs += i->plainText();
retvs += "\n";
return retvs;
}
TextRange::TextRange(const QString &uid) : SpecificEntityData(EntityType::TEXT_RANGE, uid) {}

46
libTextEdit/blockdatas.h Normal file
View File

@ -0,0 +1,46 @@
#ifndef BLOCKDATAS_H
#define BLOCKDATAS_H
#include "entitydata.h"
namespace PresentDatas {
/* enum class EntityType {
TEXT_RANGE, // 字符集合,包含段落和句子
IMAGE_CUBE, // 图片展示块
HREF_FRAGS, // 超链接
TABLE_VIEW, // 表格视图
LIST_VIEW, // 列表视图
INTERACTIVE_EXTENSION, // 交互式拓展插件视图
DISPLAY_GROUP, // 元素混合组织成包
DOCUMENT_ENTITY
};*/
class DisplayGroup : public SpecificEntityData {
public:
DisplayGroup(const QString &uid);
public:
// EntityData interface
public:
virtual QString styledText() const override;
virtual QString plainText() const override;
};
class TextRange : public SpecificEntityData {
public:
TextRange(const QString &uid);
void setStyledText(const QString &content);
void setPlainText(const QString &content);
// EntityData interface
public:
virtual QString styledText() const override;
virtual QString plainText() const override;
private:
};
} // namespace PresentDatas
#endif // BLOCKDATAS_H

View File

@ -1,12 +1,22 @@
#include "entitydata.h"
#include <QList>
using namespace PresentDatas;
SpecificEntityData::SpecificEntityData(EntityType type, const QString &uid) : type_store(type), document_id(uid) {}
SpecificEntityData::SpecificEntityData(EntityType type, const QString &uid) : type_store(type), document_id(uid) {
visible_bool = true;
oritation_store = MemberOri::H_LEFT_TO_RIGHT;
}
void SpecificEntityData::resetContentLayout(MemberOri oritation, MemberType child_type) {
this->oritation_store = oritation;
this->layout_type = child_type;
this->layout_type = MemberType::BLOCKS;
this->anchor_info = std::make_tuple(AnchorTarget::NONE, nullptr, AnchorPos::POINT_LEFT_TOP, 0, 0);
this->size_min = QSizeF(20, 20);
}
void SpecificEntityData::setVisible(bool state){
this->visible_bool = state;
}
void SpecificEntityData::setAnchorTo(AnchorTarget type, EntityData *tptr) {
@ -17,6 +27,21 @@ void SpecificEntityData::setAnchorPos(AnchorPos point, offset_h hoffset, offset_
anchor_info = std::make_tuple(std::get<0>(anchor_info), std::get<1>(anchor_info), point, hoffset, v_offset);
}
void SpecificEntityData::insertChild(EntityData *inst, int index) {
if (index >= 0 && index < children_store.size())
this->children_store.insert(index, inst);
else
this->children_store.append(inst);
}
void SpecificEntityData::removeChild(EntityData *inst) { this->children_store.removeAll(inst); }
void SpecificEntityData::setMinSizeHint(const QSizeF &hint) { this->size_min = hint; }
void SpecificEntityData::setMaxSizeHint(const QSizeF &hint) { this->size_max = hint; }
void SpecificEntityData::setStretchHint(const std::pair<float, float> &hint) { this->stretch_pair = hint; }
QString SpecificEntityData::uID() const { return document_id; }
EntityType SpecificEntityData::type() const { return type_store; }
@ -33,8 +58,40 @@ std::tuple<AnchorPos, EntityData::offset_h, EntityData::offset_v> SpecificEntity
return std::make_tuple(std::get<2>(anchor_info), std::get<3>(anchor_info), std::get<4>(anchor_info));
}
DocumentData::DocumentData(const QString &name) : SpecificEntityData(EntityType::DOCUMENT_ENTITY, "Document-Unique") {
QList<EntityData *> SpecificEntityData::children() const { return children_store; }
bool SpecificEntityData::isVisible() const { return visible_bool; }
QSizeF SpecificEntityData::minSizeHint() const { return this->size_min; }
QSizeF SpecificEntityData::maxSizeHint() const { return this->size_max; }
std::pair<float, float> SpecificEntityData::sizeStretchHint() const { return stretch_pair; }
Document::Document(const QString &name) : SpecificEntityData(EntityType::DOCUMENT_ENTITY, "Document-Unique") {
resetContentLayout(MemberOri::H_LEFT_TO_RIGHT, MemberType::BLOCKS);
}
void DocumentData::resetContentLayout(MemberOri oritation, MemberType) { SpecificEntityData::resetContentLayout(oritation, MemberType::BLOCKS); }
QString Document::styledText() const
{
QString values = "<docment type = '7' visible='true' >\n";
for(auto &i : children())
values += i->styledText();
values += "</document>";
return values;
}
QString Document::plainText() const
{
QString values = "";
for(auto &i : children())
if(i->isVisible())
values += i->plainText();
return values;
}
void Document::resetContentLayout(MemberOri oritation, MemberType) { SpecificEntityData::resetContentLayout(oritation, MemberType::BLOCKS); }

View File

@ -1,6 +1,7 @@
#ifndef ENTITYDATA_H
#define ENTITYDATA_H
#include <QList>
#include <QRectF>
#include <QString>
#include <tuple>
@ -124,19 +125,9 @@ namespace PresentDatas {
*/
virtual std::tuple<AnchorPos, offset_h, offset_v> anchorPos() const = 0;
/**
* @brief
* @param outline
* @return
*/
virtual QSizeF minSizeHint(const QRectF &outline) const = 0;
/**
* @brief
* @param outline
* @return
*/
virtual QSizeF sizeHint(const QRectF &outline) const = 0;
virtual QSizeF minSizeHint() const = 0;
virtual QSizeF maxSizeHint() const = 0;
virtual std::pair<float, float> sizeStretchHint() const = 0;
/**
* @brief
@ -160,6 +151,12 @@ namespace PresentDatas {
*/
virtual void resetContentLayout(MemberOri oritation, MemberType child_type);
/**
* @brief
* @param state
*/
virtual void setVisible(bool state);
/**
* @brief
* @param type
@ -187,43 +184,56 @@ namespace PresentDatas {
*/
virtual void removeChild(EntityData *inst);
virtual void setMinSizeHint(const QSizeF &hint);
virtual void setMaxSizeHint(const QSizeF &hint);
virtual void setStretchHint(const std::pair<float, float> &hint);
virtual void setStyledText(const QString &content) = 0;
virtual void setPlainText(const QString &content) = 0;
// EntityData ====================================================
virtual QString uID() const;
virtual EntityType type() const;
virtual MemberOri oritation() const;
virtual MemberType displayType() const;
virtual std::pair<AnchorTarget, EntityData *> anchorTarget() const;
virtual std::tuple<AnchorPos, EntityData::offset_h, EntityData::offset_v> anchorPos() const;
virtual QList<EntityData *> children() const;
virtual QString uID() const override;
virtual EntityType type() const override;
virtual MemberOri oritation() const override;
virtual MemberType displayType() const override;
virtual std::pair<AnchorTarget, EntityData *> anchorTarget() const override;
virtual std::tuple<AnchorPos, EntityData::offset_h, EntityData::offset_v> anchorPos() const override;
virtual QList<EntityData *> children() const override;
virtual bool isVisible() const override;
virtual QSizeF minSizeHint() const override;
virtual QSizeF maxSizeHint() const override;
virtual std::pair<float, float> sizeStretchHint() const override;
private:
bool visible_bool;
EntityType type_store;
QString document_id;
MemberOri oritation_store;
MemberType layout_type;
std::tuple<AnchorTarget, EntityData *, AnchorPos, EntityData::offset_h, EntityData::offset_v> anchor_info;
QList<EntityData *> children_store;
QSizeF size_min, size_max;
std::pair<float, float> stretch_pair;
protected:
float appoint_layout_minvalue() const;
};
/**
* @brief
*/
class DocumentData : public SpecificEntityData {
class Document : public SpecificEntityData {
public:
DocumentData(const QString &name);
Document(const QString &name);
// EntityData interface
public:
virtual QString styledText() const override;
virtual QString plainText() const override;
virtual bool isVisible() const override;
virtual QSizeF minSizeHint(const QRectF &outline) const override;
virtual QSizeF sizeHint(const QRectF &outline) const override;
// SpecificEntityData interface
public:
virtual void resetContentLayout(MemberOri oritation, MemberType) override;
private:
};
} // namespace PresentDatas

View File

@ -10,10 +10,12 @@ CONFIG += c++11
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += \
blockdatas.cpp \
entitydata.cpp \
libtextedit.cpp
HEADERS += \
blockdatas.h \
entitydata.h \
libTextEdit_global.h \
libtextedit.h

View File

@ -7,6 +7,7 @@
#include <QMainWindow>
#include <QMenuBar>
#include <QPushButton>
#include <QStackedWidget>
#include <QStyle>
#include <QToolBar>
#include <baseview.h>
@ -23,61 +24,72 @@ int main(int argc, char *argv[]) {
// qDebug() << QString("%1").arg((int)XEnum::ONE);
auto win = new QMainWindow();
win->setMinimumSize(800, 600);
win->menuBar()->addMenu("文件");
auto tbar = new QToolBar();
win->addToolBar(Qt::ToolBarArea::LeftToolBarArea, tbar);
// win->setMinimumSize(800, 600);
// win->menuBar()->addMenu("文件");
// auto tbar = new QToolBar();
// win->addToolBar(Qt::ToolBarArea::LeftToolBarArea, tbar);
auto conv = new ViewPresent();
auto aview = new XWidget(conv, Qt::black);
auto bview = new XWidget(conv, Qt::green);
auto cview = new XWidget(conv, Qt::yellow);
auto dview = new YWidget(conv);
// auto conv = new ViewPresent();
// auto aview = new XWidget(conv, Qt::black);
// auto bview = new XWidget(conv, Qt::green);
// auto cview = new XWidget(conv, Qt::yellow);
// auto dview = new YWidget(conv);
auto rect0 = conv->appendView(aview, QIcon(), "hello0");
auto rect1 = conv->appendView(bview, QIcon(), "hello1");
auto rect2 = conv->appendView(cview, QIcon(), "hello2");
auto rect3 = conv->appendView(dview, QIcon(), "hello3");
conv->markFreedom(rect0);
conv->markFreedom(rect1);
conv->markFreedom(rect2);
conv->markFreedom(rect3);
// auto rect0 = conv->appendView(aview, QIcon(), "hello0");
// auto rect1 = conv->appendView(bview, QIcon(), "hello1");
// auto rect2 = conv->appendView(cview, QIcon(), "hello2");
// auto rect3 = conv->appendView(dview, QIcon(), "hello3");
// conv->markFreedom(rect0);
// conv->markFreedom(rect1);
// conv->markFreedom(rect2);
// conv->markFreedom(rect3);
conv->objsRelateRebuild();
conv->resetEngross(static_cast<RectCom *>(rect3));
// conv->objsRelateRebuild();
// conv->resetEngross(static_cast<RectCom *>(rect3));
win->setCentralWidget(conv->bind());
// win->setCentralWidget(conv->bind());
auto b_left = tbar->addAction("左侧添加");
win->connect(b_left, &QAction::triggered, [=](bool v) {
auto items = conv->freedomViews();
if (items.size()) {
conv->temporaryVisible(SplitFrame::DockType::LEFT, items.last());
}
});
auto b_right = tbar->addAction(" 右侧添加");
win->connect(b_right, &QAction::triggered, [=](bool v) {
auto items = conv->freedomViews();
if (items.size()) {
conv->temporaryVisible(SplitFrame::DockType::RIGHT, items.last());
}
});
auto b_top = tbar->addAction("上侧添加");
win->connect(b_top, &QAction::triggered, [=](bool v) {
auto items = conv->freedomViews();
if (items.size()) {
conv->temporaryVisible(SplitFrame::DockType::TOP, items.last());
}
});
auto b_bottom = tbar->addAction("下侧添加");
win->connect(b_bottom, &QAction::triggered, [=](bool v) {
auto items = conv->freedomViews();
if (items.size()) {
conv->temporaryVisible(SplitFrame::DockType::BOTTOM, items.last());
}
});
// auto b_left = tbar->addAction("左侧添加");
// win->connect(b_left, &QAction::triggered, [=](bool v) {
// auto items = conv->freedomViews();
// if (items.size()) {
// conv->temporaryVisible(SplitFrame::DockType::LEFT, items.last());
// }
// });
// auto b_right = tbar->addAction(" 右侧添加");
// win->connect(b_right, &QAction::triggered, [=](bool v) {
// auto items = conv->freedomViews();
// if (items.size()) {
// conv->temporaryVisible(SplitFrame::DockType::RIGHT, items.last());
// }
// });
// auto b_top = tbar->addAction("上侧添加");
// win->connect(b_top, &QAction::triggered, [=](bool v) {
// auto items = conv->freedomViews();
// if (items.size()) {
// conv->temporaryVisible(SplitFrame::DockType::TOP, items.last());
// }
// });
// auto b_bottom = tbar->addAction("下侧添加");
// win->connect(b_bottom, &QAction::triggered, [=](bool v) {
// auto items = conv->freedomViews();
// if (items.size()) {
// conv->temporaryVisible(SplitFrame::DockType::BOTTOM, items.last());
// }
// });
win->show();
QWidget *firstPageWidget = new XWidget(nullptr, Qt::GlobalColor::green);
QWidget *secondPageWidget = new XWidget(nullptr, Qt::black);
QWidget *thirdPageWidget = new XWidget(nullptr, Qt::black);
QStackedWidget *stackedWidget = new QStackedWidget;
stackedWidget->addWidget(firstPageWidget);
stackedWidget->addWidget(secondPageWidget);
stackedWidget->addWidget(thirdPageWidget);
win->setCentralWidget(stackedWidget);
return a.exec();
}