1 #include <QTabBar>
2 #include <QEvent>
3 #include <QCoreApplication>
4 #include<QFile>
5 #include "mwainwindow.h"
6 #include "plughandler.h"
7 #include "messagebox.h"
8 #include "iwidget.h"
9 #include "systemmanager.h"
10 #include "titlebar.h"
11 #include <QWidget>
12 #include <QFrame>
13 #include <QListView>
14 #include <QStringListModel>
15 #include <QScrollBar>
16 #include <QDomElement>
17 #include "boxwidget.h"
18
19 Q_LOGGING_CATEGORY(flapp, "app.mainwindow")
20 class MWainWindowPrivate
21 {
22 public:
23 TitleBar *bar=Q_NULLPTR;
24 QWidget *app=Q_NULLPTR;
25 QDomElement root;
26 };
27
MWainWindow(const QString & id,QWidget * parent)28 MWainWindow::MWainWindow(const QString &id, QWidget *parent)
29 :QStackedWidget(parent),
30 m_d(new MWainWindowPrivate)
31 {
32 m_d->app = new QWidget;
33 m_d->app->setWindowFlags(Qt::FramelessWindowHint);
34 m_d->app->setAttribute(Qt::WA_DeleteOnClose);
35 QVBoxLayout *pVLayout = new QVBoxLayout(m_d->app);
36 pVLayout->setContentsMargins(0,0,0,0);
37 pVLayout->setSpacing(0);
38 m_d->bar = new TitleBar;
39 pVLayout->addWidget(m_d->bar);
40 pVLayout->addWidget(this);
41 this->setFrameShape(QFrame::NoFrame);
42
43 //打开XML 配置文件.
44 QString fileName=qApp->applicationDirPath() + "/test.xml";
45 QFile file(fileName);
46 QDomDocument doc("test");
47 if(!file.open(QFile::ReadOnly) || !doc.setContent(&file)) {
48 qCDebug(flapp)<<"not config find!";
49 exit(0);
50 }
51
52 m_d->root = doc.firstChildElement("APP");
53 if( m_d->root.attribute("titblebar")=="0"){
54 setTitleBarVisible(false);
55 }
56 if( m_d->root.hasAttribute("version")){
57 m_d->bar->setVersion(m_d->root.attribute("version"));
58 }
59 if(SystemManager::instance()->platformInfo().isEmpty()){
60 QString info = m_d->root.attribute("platforminfo").trimmed();
61 if(!info.isEmpty()){
62 SystemManager::instance()->setPlatformInfo(info);
63 }
64 }
65
66 qCDebug(flapp)<<"id= "<<id;
67 if(!id.isEmpty())
68 {
69 loadWidget(id);
70 }
71
72 //当app 无参数时/或者指定参数插件不存在时/应用会获取plugins目录下的所有可用显示插件名称.
73 if(this->count() ==0){
74 //设置是否关闭应用.
75 m_d->bar->setAppMayClose(false);
76
77 //创建网格主页.
78 BoxWidget *box = new BoxWidget;
79 connect(box, &BoxWidget::showPlugins, this, [=](const QString &id){
80 this->showWidgt(id);
81 });
82 //当前显示插件关闭插件,返回主页,如果当前是主页关闭应用程序.
83 connect(m_d->bar, &TitleBar::showBoxWidget, [=, box](){
84 if(currentWidget() == box){
85 qApp->quit();
86 }
87
88 IWidget *iwidget = dynamic_cast<IWidget*>(currentWidget());
89 if(iwidget != Q_NULLPTR)
90 {
91 unloadWidget(iwidget->id());
92 }
93 this->setCurrentWidget(box);
94 });
95 this->addWidget(box);
96
97 }
98 m_d->app->showMaximized();
99
100 }
101
~MWainWindow()102 MWainWindow::~MWainWindow()
103 {
104 IWidget *pWidget =dynamic_cast<IWidget*>(this->currentWidget());
105 if(pWidget){
106 this->removeWidget(pWidget);
107 PlugHandler::instance()->unloadPlugins(pWidget->id());
108 }
109
110 delete m_d;
111 }
112
setTitleBarVisible(bool bShow)113 void MWainWindow::setTitleBarVisible(bool bShow)
114 {
115 m_d->bar->setVisible(bShow);
116 }
117
showWidgt(const QString & id)118 void MWainWindow::showWidgt(const QString &id)
119 {
120 PlugHandler *pInstance = PlugHandler::instance();
121 if(pInstance->plugins().contains(id))
122 {
123 IWidget *pWidget =dynamic_cast<IWidget*>(pInstance->plugins().value(id));
124 if(pWidget){
125 setCurrentWidget(pWidget);
126 }
127 qCDebug(flapp)<<"show plugin ="<< id;
128 }else{
129 qCDebug(flapp)<<"load plugin ="<< id;
130 loadWidget(id);
131 }
132 }
133
134
loadWidget(const QString & id)135 void MWainWindow::loadWidget(const QString &id)
136 {
137 PlugHandler *pInstance = PlugHandler::instance();
138 pInstance->loadPlugins(id);
139 QMap<QString, IPlugin *> plugins = pInstance->plugins();
140
141 if(plugins.contains(id)){
142 IWidget*pluginWidget = dynamic_cast<IWidget*>(plugins.value(id));
143 if(pluginWidget){
144 int index = addWidget(pluginWidget);
145 setCurrentIndex(index);
146
147 pluginWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
148 pluginWidget->setBrigde(this);
149
150 QDomElement head = m_d->root.firstChildElement("head");
151 QDomElement headChild = head.firstChildElement( pluginWidget->id());
152 qCDebug(flapp)<< headChild.tagName() << headChild.attribute("devName");;
153
154 QDomElement body = m_d->root.firstChildElement("body");
155 QDomElement bodyChild =body.firstChildElement( pluginWidget->id());
156 qCDebug(flapp)<< bodyChild.tagName() << bodyChild.attribute("devName");
157
158 pluginWidget->loadData(headChild, bodyChild);
159 pluginWidget->initUi();
160
161 qCDebug(flapp)<<QString("id =%1, root=%2, head=%3, headChild=%4, body=%5")
162 .arg(pluginWidget->id())
163 .arg(m_d->root.tagName())
164 .arg(head.tagName())
165 .arg(headChild.tagName())
166 .arg(body.tagName());
167 }
168 }
169 }
170
unloadWidget(const QString & id)171 bool MWainWindow::unloadWidget(const QString &id)
172 {
173 bool bResult = false;
174 PlugHandler *pInstance = PlugHandler::instance();
175 IWidget *pWidget =dynamic_cast<IWidget*>(pInstance->plugins().value(id));
176 if(pWidget){
177 this->removeWidget(pWidget);
178 bResult = pInstance->unloadPlugins(id);
179 if(!bResult)
180 addWidget(pWidget);
181 }
182 }
183