JFrame(改进扩展点和扩展实现)
首先看看配置文件的改动:
{ "Extension": [ { "ExtensionPoint": { "pointName": "Logger", "pointIcon": "./images/plane.png" }, "ExtensionImpl": { "pluginName": "JLogger", "widgetName": "LoggerPanel" } }, { "ExtensionPoint": { "pointName": "Test", "pointIcon": "./images/config.png" }, "ExtensionImpl": { "pluginName": "TestPlugin", "widgetName": "Widget" } } ] }配置文件中,加入了 widgetName ,这样的话具体到了一个扩展点的实现是由具体的一个插件里面的widget! 同样很大的改动是扩展实现的逻辑是由 ActionManager 来实现,而不是由负责扩展点实现的插件来负担!
1 void ActionManager::slotTriggered(QString _aName) 2 { 3 auto _it = m_actionExtensionMap.begin(); 4 for(;_it!= m_actionExtensionMap.end(); _it++) 5 { 6 if(_it->first.pointName == _aName) 7 { 8 break; 9 } 10 } 11 12 std::shared_ptr_widget; 13 if(_it == m_actionExtensionMap.end()) 14 { 15 return; 16 } 17 _widget = _it->second.widget; 18 19 if(_widget.get()) 20 { 21 if(m_mainWindow->centralWidget() != _widget.get()) 22 { 23 JLogger::INFO(QString("[ %1 ] 窗体被加入到 centeralWidget!").arg(_widget->objectName())); 24 m_mainWindow->takeCentralWidget(); 25 m_mainWindow->setCentralWidget(_widget.get()); 26 } 27 } 28 }
ActionManager.h
1 #ifndef ACTIONMANAGER_H 2 #define ACTIONMANAGER_H 3 4 #include5 #include 6 #include 7 #include
1 void TestPlugin::initWidgets() 2 { 3 m_widget = new Widget; 4 m_widget->setObjectName("Widget"); 5 m_widgetList.append(std::shared_ptr(m_widget)); 6