xref: /OK3568_Linux_fs/app/forlinx/flapp/src/app/mwainwindow.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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