Compare commits

...

5 Commits

19 changed files with 1004 additions and 558 deletions

View File

@ -3,7 +3,7 @@ TEMPLATE = subdirs
SUBDIRS += \
libGenericConsole \
libSplitView \
WordsIDE \
# WordsIDE \
libConfig \
libProjectManager \
# libTextEdit \

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.15.0, 2024-01-27T09:48:04. -->
<!-- Written by QtCreator 4.15.0, 2024-02-10T14:34:11. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
@ -94,16 +94,16 @@
<variable>ProjectExplorer.Project.Target.0</variable>
<valuemap type="QVariantMap">
<value type="QString" key="DeviceType">Desktop</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.12.11 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.12.11 MinGW 64-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.51211.win64_mingw73_kit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.12.11 MSVC2017 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.12.11 MSVC2017 64bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.51211.win64_msvc2017_64_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Debug</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Debug</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@ -140,8 +140,8 @@
<value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.1">
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Release</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Release</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@ -180,8 +180,8 @@
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
<value type="int" key="EnableQmlDebugging">0</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory">D:\Projects\Cpp\build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Profile</value>
<value type="QString" key="ProjectExplorer.BuildConfiguration.BuildDirectory.shadowDir">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Profile</value>
<valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
<valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
<value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
@ -304,82 +304,9 @@
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Debug/u_test</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MSVC2017_64bit-Debug/u_test</value>
</valuemap>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.RunConfiguration.1">
<value type="QString" key="Analyzer.Perf.CallgraphMode">dwarf</value>
<valuelist type="QVariantList" key="Analyzer.Perf.Events">
<value type="QString">cpu-cycles</value>
</valuelist>
<valuelist type="QVariantList" key="Analyzer.Perf.ExtraArguments"/>
<value type="int" key="Analyzer.Perf.Frequency">250</value>
<valuelist type="QVariantList" key="Analyzer.Perf.RecordArguments">
<value type="QString">-e</value>
<value type="QString">cpu-cycles</value>
<value type="QString">--call-graph</value>
<value type="QString">dwarf,4096</value>
<value type="QString">-F</value>
<value type="QString">250</value>
</valuelist>
<value type="QString" key="Analyzer.Perf.SampleMode">-F</value>
<value type="bool" key="Analyzer.Perf.Settings.UseGlobalSettings">true</value>
<value type="int" key="Analyzer.Perf.StackSize">4096</value>
<value type="bool" key="Analyzer.QmlProfiler.AggregateTraces">false</value>
<value type="bool" key="Analyzer.QmlProfiler.FlushEnabled">false</value>
<value type="uint" key="Analyzer.QmlProfiler.FlushInterval">1000</value>
<value type="QString" key="Analyzer.QmlProfiler.LastTraceFile"></value>
<value type="bool" key="Analyzer.QmlProfiler.Settings.UseGlobalSettings">true</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.AddedSuppressionFiles"/>
<value type="QString" key="Analyzer.Valgrind.Callgrind.Arguments"></value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectBusEvents">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.CollectSystime">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableBranchSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableCacheSim">false</value>
<value type="bool" key="Analyzer.Valgrind.Callgrind.EnableEventToolTips">true</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.MinimumCostRatio">0.01</value>
<value type="double" key="Analyzer.Valgrind.Callgrind.VisualisationMinimumCostRatio">10</value>
<value type="bool" key="Analyzer.Valgrind.FilterExternalIssues">true</value>
<value type="QString" key="Analyzer.Valgrind.KCachegrindExecutable">kcachegrind</value>
<value type="int" key="Analyzer.Valgrind.LeakCheckOnFinish">1</value>
<value type="QString" key="Analyzer.Valgrind.Memcheck.Arguments"></value>
<value type="int" key="Analyzer.Valgrind.NumCallers">25</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.RemovedSuppressionFiles"/>
<value type="int" key="Analyzer.Valgrind.SelfModifyingCodeDetection">1</value>
<value type="bool" key="Analyzer.Valgrind.Settings.UseGlobalSettings">true</value>
<value type="bool" key="Analyzer.Valgrind.ShowReachable">false</value>
<value type="bool" key="Analyzer.Valgrind.TrackOrigins">true</value>
<value type="QString" key="Analyzer.Valgrind.ValgrindArguments"></value>
<value type="QString" key="Analyzer.Valgrind.ValgrindExecutable">valgrind</value>
<valuelist type="QVariantList" key="Analyzer.Valgrind.VisibleErrorKinds">
<value type="int">0</value>
<value type="int">1</value>
<value type="int">2</value>
<value type="int">3</value>
<value type="int">4</value>
<value type="int">5</value>
<value type="int">6</value>
<value type="int">7</value>
<value type="int">8</value>
<value type="int">9</value>
<value type="int">10</value>
<value type="int">11</value>
<value type="int">12</value>
<value type="int">13</value>
<value type="int">14</value>
</valuelist>
<valuelist type="QVariantList" key="CustomOutputParsers"/>
<value type="int" key="PE.EnvironmentAspect.Base">2</value>
<valuelist type="QVariantList" key="PE.EnvironmentAspect.Changes"/>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4RunConfiguration:D:/Projects/Cpp/QtNovelDesc/WordsIDE/WordsIDE.pro</value>
<value type="QString" key="ProjectExplorer.RunConfiguration.BuildKey">D:/Projects/Cpp/QtNovelDesc/WordsIDE/WordsIDE.pro</value>
<value type="bool" key="RunConfiguration.UseCppDebugger">false</value>
<value type="bool" key="RunConfiguration.UseCppDebuggerAuto">true</value>
<value type="bool" key="RunConfiguration.UseLibrarySearchPath">true</value>
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">D:/Projects/Cpp/build-QtNovelDesc-Desktop_Qt_5_12_11_MinGW_64_bit-Debug/WordsIDE</value>
</valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">2</value>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap>
</data>
<data>

View File

@ -0,0 +1,162 @@
#include "AcceptPanel.h"
#include <QDragMoveEvent>
#include <QPainter>
using namespace split_frame;
accept_panel::AcceptPanel::AcceptPanel(QMainWindow *win, split_frame::ResManager *mgr)
: QWidget(nullptr), bind_win(win), view_manager(mgr) {
this->setMouseTracking(true);
this->setAcceptDrops(true);
}
void accept_panel::AcceptPanel::bindWith(split_frame::ViewBase *target)
{
if (target) {
this->setParent(target->widget());
if(this->anchor_view != target || this->paint_panel.rect() != target->widget()->rect()){
this->paint_panel = target->widget()->grab();
}
this->setGeometry(QRect(QPoint(), target->widget()->size()));
}
else {
this->setParent(bind_win);
}
this->anchor_view = target;
}
void accept_panel::AcceptPanel::resizeEvent(QResizeEvent *ev)
{
QWidget::resizeEvent(ev);
auto render_width = this->width() / 3;
auto render_height = this->height() / 3;
this->cube_center = QRectF(render_width, render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_left = QRectF(0, render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_right = QRectF(this->width() - render_width, render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_top = QRectF(render_width, 0, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_bottom = QRectF(render_width, this->height() - render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->target_type = HoverType::CUBE_UNDEFINED;
}
#include <QDebug>
void accept_panel::AcceptPanel::paintEvent(QPaintEvent *ev)
{
QWidget::paintEvent(ev);
QPainter t(this);
t.fillRect(this->rect(), this->paint_panel);
switch(this->target_type){
case HoverType::CUBE_LEFT:
t.fillRect(this->cube_left + QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_RIGHT:
t.fillRect(this->cube_right + QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_TOP:
t.fillRect(this->cube_top+ QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_BOTTOM:
t.fillRect(this->cube_bottom + QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_CENTER:
t.fillRect(this->cube_center + QMargins(15, 15, 15, 15), Qt::gray);
break;
default:
break;
}
t.fillRect(this->cube_left, Qt::green);
t.fillRect(this->cube_right, Qt::green);
t.fillRect(this->cube_top, Qt::green);
t.fillRect(this->cube_bottom, Qt::green);
t.fillRect(this->cube_center, Qt::green);
}
void accept_panel::AcceptPanel::dragMoveEvent(QDragMoveEvent *ev)
{
QWidget::dragMoveEvent(ev);
if(this->cube_left.contains(ev->pos()))
this->target_type = HoverType::CUBE_LEFT;
else if(this->cube_right.contains(ev->pos()))
this->target_type = HoverType::CUBE_RIGHT;
else if(this->cube_top.contains(ev->pos()))
this->target_type = HoverType::CUBE_TOP;
else if(this->cube_bottom.contains(ev->pos()))
this->target_type = HoverType::CUBE_BOTTOM;
else if(this->cube_center.contains(ev->pos()))
this->target_type = HoverType::CUBE_CENTER;
else
this->target_type = HoverType::CUBE_UNDEFINED;
this->update();
}
void accept_panel::AcceptPanel::dragEnterEvent(QDragEnterEvent *ev)
{
QWidget::dragEnterEvent(ev);
if(view_manager->adjustView())
ev->acceptProposedAction();
}
#include "SplitPanel.h"
#include <QDebug>
void accept_panel::AcceptPanel::dropEvent(QDropEvent *ev)
{
auto view = view_manager->adjustView();
if(view && anchor_view != view){
switch (target_type) {
case HoverType::CUBE_LEFT:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_H_LFIRST);
break;
case HoverType::CUBE_RIGHT:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_H_RFIRST);
break;
case HoverType::CUBE_TOP:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_V_TFIRST);
break;
case HoverType::CUBE_BOTTOM:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_V_BFIRST);
break;
case HoverType::CUBE_CENTER:
view_manager->doRetrieve(view);
anchor_view->parentRes()->replaceView(view, anchor_view);
view_manager->doRetrieve(anchor_view);
break;
default:
break;
}
view_manager->setAdjustView();
target_type = HoverType::CUBE_UNDEFINED;
}
this->bindWith(nullptr);
}

View File

@ -0,0 +1,40 @@
#ifndef ACCEPTPANEL_H
#define ACCEPTPANEL_H
#include <QMainWindow>
#include <QWidget>
#include "libSplitView.h"
namespace accept_panel {
enum class HoverType{
CUBE_LEFT, CUBE_RIGHT, CUBE_TOP, CUBE_BOTTOM, CUBE_CENTER, CUBE_UNDEFINED,
};
class AcceptPanel : public QWidget
{
Q_OBJECT
public:
AcceptPanel(QMainWindow* win, split_frame::ResManager *mgr);
void bindWith(split_frame::ViewBase *target);
protected:
void resizeEvent(QResizeEvent *ev) override;
void paintEvent(QPaintEvent *ev) override;
void dragMoveEvent(QDragMoveEvent *ev) override;
void dragEnterEvent(QDragEnterEvent *ev) override;
void dropEvent(QDropEvent *ev) override;
private:
QWidget *const bind_win;
QRectF cube_left, cube_right, cube_top, cube_bottom, cube_center;
split_frame::ResManager *const view_manager;
split_frame::ViewBase *anchor_view = nullptr;
HoverType target_type = HoverType::CUBE_UNDEFINED;
QPixmap paint_panel;
};
}
#endif // ACCEPTPANEL_H

View File

@ -1,4 +1,4 @@
#include "dockpanel.h"
#include "DockPanel.h"
#include <QApplication>
#include <QDebug>
@ -8,7 +8,7 @@
#include <QMouseEvent>
#include <QPushButton>
using namespace base_view;
using namespace dock_panel;
DragHeader::DragHeader(const QString &title, DockableView *bind_core)
: QFrame(bind_core),
@ -69,7 +69,9 @@ void DragHeader::mouseReleaseEvent(QMouseEvent *event)
void DragHeader::mouseMoveEvent(QMouseEvent *event)
{
QFrame::mouseMoveEvent(event);
if(std::get<0>(this->press_flag)){
auto sub = event->pos() - std::get<1>(press_flag);
if(std::get<0>(this->press_flag) && sub.manhattanLength() > QApplication::startDragDistance()){
emit this->adjustRequest(event->pos());
}
}
@ -91,7 +93,7 @@ DockableView::DockableView(split_frame::ResManager *mgr, QWidget *present, bool
auto layout = new QVBoxLayout(this);
layout->addWidget(title_header);
if(present_cube){\
if(present_cube){
layout->addWidget(present);
}
else {
@ -106,10 +108,14 @@ DockableView::DockableView(split_frame::ResManager *mgr, QWidget *present, bool
this->title_header->setFrameShadow(QFrame::Shadow::Raised);
this->title_header->setLineWidth(3);
this->manager_inst->appendPresentView(this);
connect(this, &QObject::destroyed, [this](){
this->manager_inst->removePresentView(this);
});
connect(this->title_header, &DragHeader::retrieveRequest, this, &DockableView::retrieveAccept);
connect(this->title_header, &DragHeader::closeRequest, this, &DockableView::closeAccept);
connect(this->title_header, &DragHeader::adjustRequest, this, &DockableView::adjustAccept);
}
DockableView::~DockableView() {
manager_inst->removePresentView(this);
qDebug() << "view-deleted";
}
void DockableView::viewConfig(bool replace, bool close, bool retrieve)
@ -134,10 +140,10 @@ void DockableView::adjustAccept(const QPoint &pos)
{
Q_UNUSED(pos);
manager_inst->setAdjustView(this);
auto drag_trans = new QDrag(this);
auto mime_date = new QMimeData();
mime_date->setText(QString("view-drags(view-id:%1)").arg(this->hashCode()));
drag_trans->setMimeData(mime_date);
drag_trans->setMimeData(new QMimeData);
drag_trans->setPixmap(this->grab(this->rect()));
drag_trans->setHotSpot(QPoint(5,5));
drag_trans->exec();
@ -145,6 +151,7 @@ void DockableView::adjustAccept(const QPoint &pos)
void DockableView::closeAccept()
{
this->manager_inst->doRetrieve(this);
this->manager_inst->doClose(this);
}
@ -166,6 +173,12 @@ split_frame::SplitView *DockableView::parentRes() const
void DockableView::setParentRes(split_frame::SplitView *inst)
{
this->parent_res = inst;
if(inst){
this->setParent(inst->widget());
}
else{
this->setParent(nullptr);
}
}
QWidget *DockableView::widget() const
@ -193,6 +206,16 @@ qulonglong DockableView::hashCode() const
return (qulonglong)this;
}
void DockableView::setVisible(bool state)
{
QWidget::setVisible(state);
}
bool DockableView::isVisible() const
{
return QWidget::isVisible();
}
QIcon DockableView::icon() const
{
return icon_store;
@ -210,12 +233,12 @@ QSizeF DockableView::stiffSize() const
return sizex;
}
QSizeF DockableView::viewSize() const
QRectF DockableView::outlineRect() const
{
return this->size();
return this->rect();
}
void DockableView::resizeView(const QSizeF &outline)
void DockableView::setOutline(const QRectF &rect)
{
this->resize(outline.toSize());
this->setGeometry(rect.toRect());
}

View File

@ -1,14 +1,14 @@
#ifndef BASEVIEW_H
#define BASEVIEW_H
#include "splitview_interface.h"
#include "libSplitView.h"
#include <QFrame>
#include <QIcon>
#include <QLabel>
#include <QPushButton>
#include <QString>
namespace base_view {
namespace dock_panel {
class DockableView;
/**
@ -54,7 +54,7 @@ namespace base_view {
/**
* @brief
*/
class SPLITVIEW_EXPORT DockableView : public QWidget, public split_frame::ViewBase, public split_frame::ViewRes {
class SPLITVIEW_EXPORT DockableView : public QWidget, public split_frame::ViewBase {
public:
/**
* @brief
@ -62,6 +62,7 @@ namespace base_view {
* @param custom_header
*/
DockableView(split_frame::ResManager*mgr, QWidget *present, bool drag_header = false);
virtual ~DockableView();
/**
* @brief
* @param replace
@ -77,7 +78,7 @@ namespace base_view {
void setTitle(const QString &title);
void setTitle(const QIcon &icon, const QString &title);
public slots:
void adjustAccept(const QPoint &pos);
void closeAccept();
void retrieveAccept();
@ -96,18 +97,21 @@ namespace base_view {
virtual split_frame::SplitView *parentRes() const override;
virtual void setParentRes(split_frame::SplitView *inst) override;
virtual QWidget *widget() const override;
virtual bool canRetrieve() const override;
virtual bool canClose() const override;
virtual bool canReplace() const override;
virtual QSizeF stiffSize() const override;
virtual QRectF outlineRect() const override;
virtual void setOutline(const QRectF &rect) override;
virtual qulonglong hashCode() const override;
virtual void setVisible(bool state) override;
virtual bool isVisible() const override;
// ViewBase interface
public:
virtual QIcon icon() const override;
virtual QString title() const override;
virtual QSizeF stiffSize() const override;
virtual QSizeF viewSize() const override;
virtual void resizeView(const QSizeF &outline) override;
virtual bool canRetrieve() const override;
virtual bool canClose() const override;
virtual bool canReplace() const override;
};
}

228
libSplitView/SplitPanel.cpp Normal file
View File

@ -0,0 +1,228 @@
#include "SplitPanel.h"
#include "DockPanel.h"
#include <QPainter>
#include <libConfig.h>
using namespace split_frame;
using namespace split_panel;
using namespace Config;
DragSplitter::DragSplitter(split_frame::SplitType split, split_frame::ViewRes *parent)
: QFrame(parent->widget()){
this->setFrameShape(QFrame::Shape::WinPanel);
this->setFrameShadow(QFrame::Shadow::Raised);
switch (split) {
case split_frame::SplitType::SPLIT_H_LFIRST:
case split_frame::SplitType::SPLIT_H_RFIRST:
this->setCursor(Qt::CursorShape::SplitHCursor);
break;
default:
this->setCursor(Qt::CursorShape::SizeVerCursor);
}
}
void DragSplitter::mouseMoveEvent(QMouseEvent *event)
{
QFrame::mouseMoveEvent(event);
emit this->adjustRequest(mapToParent(event->pos()));
}
//=====================================================
SplitPanel::SplitPanel(ResManager *mgr, SplitType split)
: QWidget(nullptr),
manager_inst(mgr),
parent_inst(nullptr),
splitter_inst(new DragSplitter(split, this))
{
connect(this->splitter_inst, &DragSplitter::adjustRequest, this, &SplitPanel::splitter_adjust);
this->split_info = std::make_tuple(split, 0.5, 8);
}
#include <QDebug>
SplitPanel::~SplitPanel() {
}
void SplitPanel::resizeEvent(QResizeEvent *e)
{
QWidget::resizeEvent(e);
this->sync_status();
}
ResManager *SplitPanel::splitManager() const { return this->manager_inst; }
SplitView *SplitPanel::parentRes() const { return parent_inst; }
void SplitPanel::setParentRes(SplitView *inst) {
this->parent_inst = inst;
if(inst){
this->setParent(inst->widget());
}
else{
this->setParent(nullptr);
}
}
qulonglong SplitPanel::hashCode() const { return (qulonglong)this; }
void SplitPanel::setVisible(bool state)
{
QWidget::setVisible(state);
}
bool SplitPanel::isVisible() const
{
return QWidget::isVisible();
}
void SplitPanel::initViews(ViewRes *a, ViewRes *b)
{
a->setParentRes(this);
manager_inst->appendPresentView(dynamic_cast<ViewBase*>(a));
b->setParentRes(this);
manager_inst->appendPresentView(dynamic_cast<ViewBase*>(b));
this->split_member = std::make_pair(a, b);
}
QWidget *SplitPanel::widget() const { return const_cast<SplitPanel *>(this); }
QSizeF SplitPanel::stiffSize() const
{
auto size_a = split_member.first->stiffSize();
auto size_b = split_member.second->stiffSize();
switch (this->splitType()) {
case SplitType::SPLIT_H_LFIRST:
case SplitType::SPLIT_H_RFIRST:
return QSizeF(size_a.width() + size_b.width() + std::get<2>(split_info), std::max(size_a.height(), size_b.height()));
default:
return QSizeF(std::max(size_a.width(), size_b.width()), size_a.height() + size_b.height() + std::get<2>(split_info));
}
}
QRectF SplitPanel::outlineRect() const { return this->rect(); }
void SplitPanel::setOutline(const QRectF &outline)
{
if(outline != this->outlineRect()){
this->setGeometry(outline.toRect());
this->sync_status();
}
}
std::pair<ViewRes *, int> SplitPanel::except(ViewRes *inst) const
{
if(!contains(inst))
throw new SimpleException<QString>("运行异常", "传入的视图实例不属于本组件");
if(split_member.first == inst)
return std::make_pair(split_member.second, 1);
return std::make_pair(split_member.first, 0);
}
bool SplitPanel::contains(ViewRes *inst) const
{
return split_member.first == inst || split_member.second == inst;
}
void SplitPanel::replaceView(ViewRes *_new, ViewRes *_old)
{
if(!contains(_old)){
throw new SimpleException<QString>("运行异常", "指定替换的视图不属于本组件");
}
auto elsev = except(_old);
_new->setParentRes(this);
switch (elsev.second) {
case 0:
this->split_member = std::make_pair(elsev.first, _new);
break;
default:
this->split_member = std::make_pair(_new, elsev.first);
}
_old->setParentRes(nullptr);
sync_status();
this->update();
}
float SplitPanel::splitterWidth() const
{
return std::get<2>(split_info);
}
float SplitPanel::splitterPos() const
{
return std::get<1>(split_info);
}
SplitType SplitPanel::splitType() const
{
return std::get<0>(split_info);
}
void SplitPanel::setSplitInfo(float pos, float width)
{
this->split_info = std::make_tuple(std::get<0>(split_info), pos, width);
this->sync_status();
this->update();
}
void SplitPanel::sync_status()
{
auto total_w = this->width();
auto total_h = this->height();
switch (std::get<0>(split_info)) {
case SplitType::SPLIT_H_LFIRST:
case SplitType::SPLIT_H_RFIRST: {
auto width_a = total_w * std::get<1>(split_info);
auto width_b = total_w - width_a - std::get<2>(split_info);
auto first = this->split_member.first;
auto second = this->split_member.second;
first->setOutline(QRectF(0, 0, width_a, total_h));
second->setOutline(QRectF(width_a + std::get<2>(split_info), 0, width_b, total_h));
this->splitter_inst->setGeometry(QRect(width_a, 0, std::get<2>(split_info), total_h));
} break;
case SplitType::SPLIT_V_BFIRST:
case SplitType::SPLIT_V_TFIRST: {
auto height_a = total_h * std::get<1>(split_info);
auto height_b = total_h - height_a - std::get<2>(split_info);
auto first = this->split_member.first;
auto second = this->split_member.second;
first->setOutline(QRectF(0, 0, total_w, height_a));
second->setOutline(QRectF(0, height_a + std::get<2>(split_info) - 1, total_w, height_b + 1));
splitter_inst->setGeometry(QRect(0, height_a, total_w, std::get<2>(split_info)));
} break;
}
split_member.first->setVisible(true);
split_member.second->setVisible(true);
}
void SplitPanel::splitter_adjust(const QPoint &pos)
{
switch (std::get<0>(split_info)) {
case SplitType::SPLIT_H_LFIRST:
case SplitType::SPLIT_H_RFIRST:{
auto lwidth = split_member.first->stiffSize().width();
auto rwidth = split_member.second->stiffSize().width();
if(pos.x() >= lwidth && pos.x() <= this->width() - rwidth - std::get<2>(split_info))
this->split_info = std::make_tuple(std::get<0>(split_info), pos.x()/(float)this->width(), std::get<2>(split_info));
}break;
case SplitType::SPLIT_V_BFIRST:
case SplitType::SPLIT_V_TFIRST:{
auto theight = split_member.first->stiffSize().height();
auto bheight = split_member.second->stiffSize().height();
if(pos.y() >= theight && pos.y() <= this->height() - bheight - std::get<2>(split_info))
this->split_info = std::make_tuple(std::get<0>(split_info), pos.y()/this->height(), std::get<2>(split_info));
}break;
}
this->sync_status();
}

81
libSplitView/SplitPanel.h Normal file
View File

@ -0,0 +1,81 @@
#ifndef SPLITPANEL
#define SPLITPANEL
#include "SplitWindow.h"
#include <QFrame>
namespace split_panel {
/**
* @brief
*/
class SPLITVIEW_EXPORT DragSplitter : public QFrame{
Q_OBJECT
signals:
void adjustRequest(const QPoint&);
public:
DragSplitter(split_frame::SplitType split, split_frame::ViewRes *parent);
// QWidget interface
protected:
virtual void mouseMoveEvent(QMouseEvent *event) override;
};
/**
* @brief
*/
class SPLITVIEW_EXPORT SplitPanel : public QWidget, public split_frame::SplitView
{
typedef float split_pos;
typedef float split_width;
private:
split_frame::ResManager *const manager_inst;
SplitView *parent_inst;
DragSplitter *const splitter_inst;
std::pair<split_frame::ViewRes*, split_frame::ViewRes*> split_member;
// type, pos, width
std::tuple<split_frame::SplitType, split_pos, split_width> split_info;
void sync_status();
void splitter_adjust(const QPoint &pos);
public:
SplitPanel(split_frame::ResManager *mgr,split_frame::SplitType split);
virtual ~SplitPanel();
protected:
void resizeEvent(QResizeEvent *e) override;
// ViewRes interface
public:
virtual split_frame::ResManager *splitManager() const override;
virtual split_frame::SplitView *parentRes() const override;
virtual void setParentRes(SplitView *inst) override;
virtual QWidget* widget() const override;
virtual QSizeF stiffSize() const override;
virtual QRectF outlineRect() const override;
virtual void setOutline(const QRectF &outline) override;
virtual qulonglong hashCode() const override;
virtual void setVisible(bool state) override;
virtual bool isVisible() const override;
// SplitView interface
public:
virtual void initViews(ViewRes *a, ViewRes *b) override;
virtual std::pair<split_frame::ViewRes*, int> except(split_frame::ViewRes *inst) const override;
virtual bool contains(split_frame::ViewRes *inst) const override;
virtual void replaceView(split_frame::ViewRes *_new, split_frame::ViewRes *_old) override;
virtual void setSplitInfo(float pos, float width) override;
virtual float splitterWidth() const override;
virtual float splitterPos() const override;
virtual split_frame::SplitType splitType() const override;
};
} // namespace SplitFrame
#endif // SPLITPANEL

View File

@ -0,0 +1,231 @@
#include "SplitWindow.h"
#include "DockPanel.h"
#include "SplitPanel.h"
#include <QApplication>
#include <QDebug>
#include <QDrag>
#include <QHBoxLayout>
#include <QLineF>
#include <QMimeData>
#include <QPainter>
#include <QPushButton>
#include <QResizeEvent>
#include <QStyleOption>
#include <QWindow>
#include <libConfig.h>
using namespace split_window;
using namespace split_frame;
SplitWindow::SplitWindow(QWidget *parent) : QMainWindow(parent), accept_port(new accept_panel::AcceptPanel(this, this)), view_root(nullptr) {
accept_port->setVisible(false);
}
SplitWindow::~SplitWindow() {}
void SplitWindow::tempShow(split_frame::DockType t, split_frame::ViewBase *target)
{
this->temp_show = target;
target->setVisible(true);
}
void SplitWindow::setPresentTarget(split_frame::ViewRes *inst)
{
if(inst && this->view_root != inst){
this->takeCentralWidget();
this->view_root = nullptr;
inst->setParentRes(nullptr);
inst->widget()->setParent(this);
this->setCentralWidget(inst->widget());
} else if (!inst) {
this->takeCentralWidget();
}
this->view_root = inst;
this->update();
}
bool SplitWindow::eventFilter(QObject *sender, QEvent *ev)
{
switch (ev->type()) {
case QEvent::Type::DragMove: {
if (sender->isWidgetType() || sender->isWindowType()) {
auto evn_pos = static_cast<QDragMoveEvent *>(ev)->pos();
QPoint global_pos;
if (sender->isWindowType()) {
dynamic_cast<QWindow *>(sender)->requestActivate();
global_pos = dynamic_cast<QWindow *>(sender)->mapToGlobal(evn_pos);
} else if (sender->isWidgetType()) {
global_pos = dynamic_cast<QWidget *>(sender)->mapToGlobal(evn_pos);
}
for (auto &cmp : this->presents_store) {
auto local_pos = cmp->widget()->mapFromGlobal(global_pos);
auto rect_shape = cmp->outlineRect();
rect_shape.moveTopLeft(QPointF());
if (rect_shape.contains(local_pos) && cmp->widget()->isActiveWindow()) {
accept_port->bindWith(cmp);
accept_port->raise();
accept_port->setVisible(true);
break;
}
}
}
} break;
case QEvent::Type::MouseButtonRelease:
accept_port->setVisible(false);
break;
default:
break;
}
return QMainWindow::eventFilter(sender, ev);
}
void SplitWindow::addListener(split_frame::FreedomViewsListener *lsn)
{
if(listener_list.contains(lsn))
return;
listener_list << lsn;
}
void SplitWindow::removeListener(split_frame::FreedomViewsListener *lsn)
{
this->listener_list.removeAll(lsn);
}
void SplitWindow::appendPresentView(split_frame::ViewBase *inst)
{
if(inst)
this->presents_store[inst->hashCode()] = inst;
}
void SplitWindow::removePresentView(split_frame::ViewBase *inst)
{
if(inst)
this->presents_store.remove(inst->hashCode());
}
bool SplitWindow::isPresented(split_frame::ViewBase *inst) const
{
return inst && presents_store.contains(inst->hashCode());
}
#include <libConfig.h>
void SplitWindow::doRetrieve(split_frame::ViewBase *inst)
{
if(!isPresented(inst)){
throw new Config::SimpleException<QString>("参数错误", "无法回收空闲视图!");
}
// 呈现视图结构调整
if(inst == temp_show){
temp_show->setVisible(false);
return;
}
else if (inst == view_root) {
setPresentTarget();
inst->setParentRes(nullptr);
}
else if(inst->parentRes() == view_root){
auto pinst = inst->parentRes();
auto remains = pinst->except(inst);
inst->setParentRes(nullptr);
remains.first->setParentRes(nullptr);
auto awidget = inst->widget()->parent();
auto cwidget = inst->widget()->parentWidget();
auto bwidget = inst->widget()->parent();
setPresentTarget(remains.first);
delete pinst;
}
else if(inst->parentRes()){
auto pinst = inst->parentRes();
auto remains = pinst->except(inst);
remains.first->setParentRes(nullptr);
inst->setParentRes(nullptr);
auto ppinst = pinst->parentRes();
ppinst->replaceView(remains.first, pinst);
delete pinst;
}
inst->setParentRes(nullptr);
inst->setVisible(false);
removePresentView(inst);
// 当前视图已被回收
for(auto &lsn : listener_list)
lsn->freedomAppend(inst);
}
void SplitWindow::doClose(split_frame::ViewBase *inst)
{
if(isPresented(inst))
throw new Config::SimpleException<QString>("编码异常", "不能关闭非空闲视图!");
// 回收当前视图
for(auto &lsn : listener_list)
lsn->aboutToBeDelete(inst);
delete inst;
}
void SplitWindow::siblingAttach(ViewBase *view, ViewBase *pos, SplitType ori)
{
if(isPresented(view) && view != temp_show){
throw new Config::SimpleException<QString>("参数错误", "只能使用空闲视图吸附重组!");
}
if(!isPresented(pos)){
throw new Config::SimpleException<QString>("参数错误", "不能依据空闲视图吸附重组!");
}
auto remains_frm = pos->parentRes();
auto split_slot = new split_panel::SplitPanel(this, ori);
if(pos == view_root){
setPresentTarget(split_slot);
}
else{
if(!remains_frm)
throw new Config::SimpleException<QString>("参数错误", "指定吸附视图父引用为空");
remains_frm->replaceView(split_slot, pos);
}
switch (ori) {
case SplitType::SPLIT_H_LFIRST:
split_slot->initViews(view, pos);
split_slot->setSplitInfo(0.333, 8);
break;
case SplitType::SPLIT_H_RFIRST:
split_slot->initViews(pos, view);
split_slot->setSplitInfo(0.666, 8);
break;
case SplitType::SPLIT_V_TFIRST:
split_slot->initViews(view, pos);
split_slot->setSplitInfo(0.333, 8);
break;
case SplitType::SPLIT_V_BFIRST:
split_slot->initViews(pos, view);
split_slot->setSplitInfo(0.666, 8);
break;
}
for(auto &lsn : listener_list)
lsn->freedomRemove(view);
}
ViewBase *SplitWindow::adjustView() const
{
return adjust_target;
}
void SplitWindow::setAdjustView(split_frame::ViewBase *target)
{
this->adjust_target = target;
}

View File

@ -0,0 +1,65 @@
#ifndef SPLITWINDOW_H
#define SPLITWINDOW_H
#include "libSplitView.h"
#include "AcceptPanel.h"
#include <QMainWindow>
#include <QWidget>
#include <libConfig.h>
namespace split_window {
/**
* @brief
*/
class SPLITVIEW_EXPORT SplitWindow : public QMainWindow, public split_frame::ResManager {
typedef float pos;
typedef float width;
private:
QList<split_frame::FreedomViewsListener*> listener_list;
QHash<qulonglong, split_frame::ViewBase*> presents_store;
accept_panel::AcceptPanel *const accept_port;
split_frame::ViewRes *view_root = nullptr, *temp_show = nullptr;
split_frame::ViewBase *adjust_target = nullptr;
public:
SplitWindow(QWidget *parent = nullptr);
virtual ~SplitWindow();
//======================================================
/**
* @brief
* @param t
* @param target
*/
void tempShow(split_frame::DockType t, split_frame::ViewBase *target);
/**
* @brief * @param inst
*/
void setPresentTarget(split_frame::ViewRes *inst = nullptr);
bool eventFilter(QObject *sender, QEvent *ev) override;
// ResManager interface
public:
virtual void addListener(split_frame::FreedomViewsListener *lsn) override;
virtual void removeListener(split_frame::FreedomViewsListener *lsn) override;
virtual void appendPresentView(split_frame::ViewBase *inst) override;
virtual void removePresentView(split_frame::ViewBase *inst) override;
virtual bool isPresented(split_frame::ViewBase *inst) const override;
virtual void doRetrieve(split_frame::ViewBase *inst) override;
virtual void doClose(split_frame::ViewBase *inst) override;
virtual void siblingAttach(split_frame::ViewBase *view, split_frame::ViewBase *pos, split_frame::SplitType ori) override;
virtual split_frame::ViewBase *adjustView() const override;
virtual void setAdjustView(split_frame::ViewBase *target) override;
};
} // namespace split_panel
#endif // SPLITWINDOW_H

View File

@ -1,15 +1,9 @@
#ifndef SPLITVIEW_INTERFACE_H
#define SPLITVIEW_INTERFACE_H
#include <QtCore/qglobal.h>
#if defined(SPLITVIEW_LIBRARY)
# define SPLITVIEW_EXPORT Q_DECL_EXPORT
#else
# define SPLITVIEW_EXPORT Q_DECL_IMPORT
#endif
#ifndef LIBSPLITVIEW_H
#define LIBSPLITVIEW_H
#include "libSplitView_Global.h"
#include <QWidget>
#include <QSizeF>
namespace split_frame {
class SplitView;
@ -18,7 +12,7 @@ namespace split_frame {
/**
* @brief
*/
enum class SplitType { SPLIT_H = 0, SPLIT_V = 1 };
enum class SplitType { SPLIT_H_LFIRST = 0, SPLIT_H_RFIRST = 1, SPLIT_V_TFIRST = 2, SPLIT_V_BFIRST = 3 };
/**
* @brief
*/
@ -36,19 +30,73 @@ namespace split_frame {
*/
virtual ResManager *splitManager() const = 0;
/**
* @brief
* @return
*/
virtual SplitView *parentRes() const = 0;
/**
* @brief
* @param inst
*/
virtual void setParentRes(SplitView *inst) = 0;
/**
* @brief
* @return
*/
virtual QWidget *widget() const = 0;
/**
* @brief
* @return
*/
virtual QSizeF stiffSize() const = 0;
/**
* @brief
* @return
*/
virtual QRectF outlineRect() const = 0;
/**
* @brief
* @param outline
*/
virtual void setOutline(const QRectF &rect) = 0;
/**
* @brief
* @param state
*/
virtual void setVisible(bool state) = 0;
virtual bool isVisible() const = 0;
/**
* @brief
* @return
*/
virtual qulonglong hashCode() const = 0;
};
/**
* @brief
*/
class ViewBase : public ViewRes {
public:
virtual ~ViewBase() = default;
/**
* @brief
* @return
*/
virtual QIcon icon() const = 0;
/**
* @brief
* @return
*/
virtual QString title() const = 0;
/**
* @brief
*/
@ -64,63 +112,26 @@ namespace split_frame {
* @return
*/
virtual bool canReplace() const = 0;
/**
* @brief
* @return
*/
virtual qulonglong hashCode() const = 0;
};
/**
* @brief
*/
class ViewBase {
public:
virtual ~ViewBase() = default;
/**
* @brief
* @return
*/
virtual QIcon icon() const = 0;
/**
* @brief
* @return
*/
virtual QString title() const = 0;
/**
* @brief
* @return
*/
virtual QSizeF stiffSize() const = 0;
/**
* @brief
* @return
*/
virtual QSizeF viewSize() const = 0;
/**
* @brief
* @param outline
*/
virtual void resizeView(const QSizeF &outline) = 0;
};
/**
* @brief
*/
class SplitView {
class SplitView : public ViewRes {
public:
virtual ~SplitView() = default;
/**
* @brief
* @param view
* @param old
* @brief
* @param a a
* @param b b
*/
virtual void replaceComp(ViewBase *view, ViewBase *old) = 0;
virtual void initViews(ViewRes *a, ViewRes *b) = 0;
/**
* @brief * @param view * @param pos
*/
virtual void replaceView(ViewRes *_new, ViewRes *_old) = 0;
/**
* @brief
@ -128,13 +139,19 @@ namespace split_frame {
* @param pos
* @param width
*/
virtual void setSplitInfo(SplitType type, float pos, float width) = 0;
virtual void setSplitInfo(float pos, float width) = 0;
/**
* @brief
* @brief
* @return std::pair<ptr, index>
*/
virtual std::pair<ViewRes*, int> except(ViewRes *inst) const = 0;
/**
* @brief
* @param inst
* @return
*/
virtual std::tuple<ViewBase *, ViewBase *, SplitType> child() const = 0;
virtual bool contains(ViewRes *inst) const = 0;
/**
* @brief
* @return
@ -145,6 +162,11 @@ namespace split_frame {
* @return
*/
virtual float splitterPos() const = 0;
/**
* @brief
* @return
*/
virtual SplitType splitType() const = 0;
};
@ -158,12 +180,23 @@ namespace split_frame {
* @brief
* @param ins
*/
virtual void freedomAppended(ViewBase *ins) = 0;
virtual void freedomAppend(ViewBase *ins) = 0;
/**
* @brief
* @param ins
*/
virtual void freedomRemoved(ViewBase *ins) = 0;
virtual void freedomRemove(ViewBase *ins) = 0;
/**
* @brief
* @param inst
*/
virtual void aboutToBeDelete(ViewBase *inst) = 0;
/**
* @brief
* @param inst
*/
virtual void hasBeenAppend(ViewBase *inst) = 0;
};
/**
@ -176,6 +209,9 @@ namespace split_frame {
virtual void addListener(FreedomViewsListener *lsn) = 0;
virtual void removeListener(FreedomViewsListener *lsn) = 0;
virtual ViewBase* adjustView() const = 0;
virtual void setAdjustView(ViewBase *target = nullptr) = 0;
/**
* @brief
* @param inst
@ -191,21 +227,26 @@ namespace split_frame {
* @brief
* @param inst
*/
virtual void doRetrieve(ViewRes *inst) = 0;
virtual bool isPresented(ViewBase *inst) const = 0;
/**
* @brief * @param inst
*/
virtual void doRetrieve(ViewBase *inst) = 0;
/**
* @brief
*/
virtual void doClose(ViewRes *inst) = 0;
virtual void doClose(ViewBase *inst) = 0;
/**
* @brief
* @param view
* @param old
*/
virtual void doReplace(ViewRes *view, ViewRes *old) = 0;
virtual void siblingAttach(ViewBase *view, ViewBase *pos, SplitType ori) = 0;
};
} // namespace SplitFrame
#endif // SPLITVIEW_INTERFACE_H
#endif // LIBSPLITVIEW_H

View File

@ -15,15 +15,18 @@ msvc{
}
SOURCES += \
dockpanel.cpp \
splitpanel.cpp \
splitwindow.cpp
AcceptPanel.cpp \
DockPanel.cpp \
SplitPanel.cpp \
SplitWindow.cpp
HEADERS += \
dockpanel.h \
splitpanel.h \
splitview_interface.h \
splitwindow.h
AcceptPanel.h \
DockPanel.h \
SplitPanel.h \
SplitWindow.h \
libSplitView.h \
libSplitView_Global.h
# Default rules for deployment.
unix {

View File

@ -1,175 +0,0 @@
#include "splitpanel.h"
#include "dockpanel.h"
#include <QPainter>
#include <libConfig.h>
using namespace split_frame;
using namespace split_panel;
using namespace Config;
DragSplitter::DragSplitter(split_frame::SplitType split, split_frame::ViewRes *parent)
: QFrame(parent->widget()){
this->setFrameShape(QFrame::Shape::WinPanel);
this->setFrameShadow(QFrame::Shadow::Raised);
switch (split) {
case split_frame::SplitType::SPLIT_H:
this->setCursor(Qt::CursorShape::SplitHCursor);
break;
default:
this->setCursor(Qt::CursorShape::SizeVerCursor);
}
}
void DragSplitter::mouseMoveEvent(QMouseEvent *event)
{
QFrame::mouseMoveEvent(event);
emit this->adjustRequest(mapToParent(event->pos()));
}
//=====================================================
SplitPanel::SplitPanel(ResManager *mgr, ViewBase *a, ViewBase *b, SplitType split, ViewRes *parent)
: QWidget(parent->widget()), parent_inst(parent)
{
this->split_member = std::make_tuple(a, b);
this->split_info_value = std::make_tuple(SplitType::SPLIT_H, 0.5, 8);
}
SplitPanel::~SplitPanel()
{
}
ResManager *SplitPanel::splitManager() const { return this->parent_inst->splitManager(); }
SplitView *SplitPanel::parentRes() const
{
return parent_inst;
}
bool SplitPanel::canRetrieve() const
{
return true;
}
bool SplitPanel::canClose() const
{
return true;
}
bool SplitPanel::canReplace() const
{
return true;
}
qulonglong SplitPanel::hashCode() const
{
return (qulonglong)this;
}
QIcon SplitPanel::icon() const
{
return QIcon();
}
QString SplitPanel::title() const
{
return QString("split-view%1").arg((int64_t)this);
}
QWidget *SplitPanel::widget() const
{
return const_cast<SplitPanel*>(this);
}
QSizeF SplitPanel::viewSize() const
{
return this->size();
}
void SplitPanel::resizeView(const QSizeF &outline)
{
if(outline != this->size()){
this->resize(outline.toSize());
}
auto tuple_values = this->child();
if(view_list().size() == 1){
view_list().first()->resizeView(this->viewSize());
}
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());
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);
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;
}
}
}
std::tuple<ViewBase *, ViewBase *, SplitType> SplitPanel::child() const
{
return std::make_tuple(std::get<0>(split_member), std::get<1>(split_member), std::get<0>(split_info_value));
}
void SplitPanel::replaceComp(ViewBase *view, ViewBase *old)
{
QList<ViewBase*> mbrs = view_list();
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);
}
else if(std::get<0>(split_member) == old){
this->split_member = std::make_tuple(view, std::get<1>(split_member));
}
view->setParentRes(this);
view->widget()->setParent(this);
old->widget()->setParent(nullptr);
this->resizeView(this->viewSize());
}
}
float SplitPanel::splitterWidth() const
{
return std::get<1>(split_info_value);
}
float SplitPanel::splitterPos() const
{
return std::get<1>(split_info_value);
}
void SplitPanel::setSplitInfo(split_frame::SplitType type, float pos, float width)
{
this->split_info_value = std::make_tuple(type, pos, width);
}
QList<ViewBase *> SplitPanel::view_list() const
{
QList<ViewBase*> items;
if(std::get<0>(split_member))
items << std::get<0>(split_member);
if(std::get<1>(split_member))
items << std::get<1>(split_member);
return items;
}

View File

@ -1,81 +0,0 @@
#ifndef SPLITPANEL
#define SPLITPANEL
#include "splitwindow.h"
#include <QFrame>
namespace split_panel {
class DragSplitter : public QFrame{
Q_OBJECT
signals:
void adjustRequest(QPoint);
public:
DragSplitter(split_frame::SplitType split, split_frame::ViewRes *parent);
// QWidget interface
protected:
virtual void mouseMoveEvent(QMouseEvent *event) override;
};
/**
* @brief
*/
class SPLITVIEW_EXPORT SplitPanel :
public QWidget,
public split_frame::SplitView,
public split_frame::ViewBase,
public split_frame::ViewRes
{
typedef float split_pos;
typedef float split_width;
private:
split_frame::ResManager *const manager_inst;
ViewRes *parent_inst;
std::tuple<ViewBase*, ViewBase*> split_member;
// type, pos, width
std::tuple<split_frame::SplitType, split_pos, split_width> split_info_value;
QList<split_frame::ViewBase*> view_list() const;
public:
SplitPanel(split_frame::ResManager *mgr, ViewBase *a, ViewBase *b, split_frame::SplitType split, ViewRes *parent);
virtual ~SplitPanel();
// ViewRes interface
public:
virtual split_frame::ResManager *splitManager() const override;
virtual split_frame::SplitView *parentRes() const override;
virtual void setParentRes(SplitView *inst) override;
virtual bool canRetrieve() const override;
virtual bool canClose() const override;
virtual bool canReplace() const override;
virtual qulonglong hashCode() const override;
// ViewBase interface
public:
virtual QIcon icon() const override;
virtual QString title() const override;
virtual QWidget* widget() const override;
virtual QSizeF stiffSize() const override;
virtual QSizeF viewSize() const override;
virtual void resizeView(const QSizeF &outline) override;
// SplitView interface
public:
virtual std::tuple<split_frame::ViewBase *, split_frame::ViewBase *, split_frame::SplitType> child() const override;
virtual void replaceComp(ViewBase *view, ViewBase *old) override;
virtual float splitterWidth() const override;
virtual float splitterPos() const override;
virtual void setSplitInfo(split_frame::SplitType type, float pos, float width) override;
};
} // namespace SplitFrame
#endif // SPLITPANEL

View File

@ -1,21 +0,0 @@
#include "splitwindow.h"
#include "dockpanel.h"
#include "splitpanel.h"
#include <QApplication>
#include <QDebug>
#include <QDrag>
#include <QHBoxLayout>
#include <QLineF>
#include <QMimeData>
#include <QPainter>
#include <QPushButton>
#include <QResizeEvent>
#include <QStyleOption>
#include <libConfig.h>
using namespace split_panel;
using namespace split_frame;
SplitWindow::SplitWindow(QWidget *parent) : QMainWindow(parent) {}
SplitWindow::~SplitWindow() {}

View File

@ -1,37 +0,0 @@
#ifndef SPLITWINDOW_H
#define SPLITWINDOW_H
#include "splitview_interface.h"
#include <QMainWindow>
#include <QWidget>
#include <libConfig.h>
namespace split_panel {
/**
* @brief
*/
class SPLITVIEW_EXPORT SplitWindow : public QMainWindow, public split_frame::SplitView {
typedef float pos;
typedef float width;
public:
SplitWindow(QWidget *parent = nullptr);
virtual ~SplitWindow();
//======================================================
/**
* @brief
* @param t
* @param target
*/
void tempShow(split_frame::DockType t, split_frame::ViewBase *target);
};
} // namespace split_panel
#endif // SPLITWINDOW_H

View File

@ -10,28 +10,23 @@
#include <QStackedWidget>
#include <QStyle>
#include <QToolBar>
#include <dockpanel.h>
#include <splitwindow.h>
#include <splitpanel.h>
using namespace SplitFrame;
#include <DockPanel.h>
#include <SplitWindow.h>
#include <SplitPanel.h>
#include <DockPanel.h>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
auto win = new QMainWindow();
win->show();
auto w = new split_window::SplitWindow;
auto spb = new split_panel::SplitPanel(w, split_frame::SplitType::SPLIT_H_LFIRST);
auto bview = new dock_panel::DockableView(w, new QWidget, true);
auto dview = new dock_panel::DockableView(w, new QWidget, true);
spb->initViews(bview, dview);
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);
w->setPresentTarget(spb);
a.installEventFilter(w);
w->show();
return a.exec();
}

View File

@ -1,22 +1,3 @@
#include "unnnn.h"
#include <QPainter>
using namespace SplitFrame;
XWidget::XWidget(SplitPanel *host, Qt::GlobalColor c, QWidget *parent) : FnWrap<XWidget, false>(host), c_store(c) {}
void XWidget::paintEvent(QPaintEvent *ev) {
QPainter p(this);
p.fillRect(this->rect(), c_store);
}
void XWidget::closeProcess() {}
YWidget::YWidget(SplitPanel *host, QWidget *parent) : FnWrap<XWidget, true>(host) {}
void YWidget::paintEvent(QPaintEvent *ev) {
QPainter p(this);
p.fillRect(this->rect(), Qt::blue);
}
void YWidget::closeProcess() {}

View File

@ -3,28 +3,7 @@
#include <QString>
#include <QWidget>
#include <splitwindow.h>
#include <SplitWindow.h>
class XWidget : public SplitFrame::FnWrap<XWidget, false> {
public:
XWidget(SplitFrame::SplitPanel *host, Qt::GlobalColor c, QWidget *parent = nullptr);
virtual void paintEvent(QPaintEvent *ev) override;
// FnWrap interface
public:
virtual void closeProcess() override;
private:
Qt::GlobalColor c_store;
};
class YWidget : public SplitFrame::FnWrap<XWidget, true> {
public:
YWidget(SplitFrame::SplitPanel *host, QWidget *parent = nullptr);
virtual void paintEvent(QPaintEvent *ev) override;
// FnWrap interface
public:
virtual void closeProcess() override;
};
#endif // UNNNN_H