/** Load a plugin by its location on the hard drive. */ bool PluginManager::loadPlugin(const QString &pluginAbsPath) { QPluginLoader pluginLoader(pluginAbsPath, this); QObject *plugin = pluginLoader.instance(); if (plugin) { BasicPlugin *basic = dynamic_cast<BasicPlugin*>(plugin); basic->setParent(this); SettingsPrivate *settings = SettingsPrivate::instance(); if (basic) { PluginInfo pluginInfo; pluginInfo.setAbsFilePath(pluginAbsPath); pluginInfo.setPluginName(basic->name()); pluginInfo.setVersion(basic->version()); pluginInfo.setConfigPage(basic->isConfigurable()); pluginInfo.setEnabled(true); settings->addPlugin(pluginInfo); if (basic->isConfigurable()) { QString pluginLang(":/translations/" + basic->name() + "_" + settings->language()); if (basic->translator.load(pluginLang)) { QApplication::installTranslator(&basic->translator); } } // Keep references of loaded plugins, to be able to unload them later _loadedPlugins.insert(pluginAbsPath, basic); } else { return false; } basic->init(); if (MediaPlayerPlugin *mediaPlayerPlugin = qobject_cast<MediaPlayerPlugin*>(plugin)) { this->loadMediaPlayerPlugin(mediaPlayerPlugin); } else if (ItemViewPlugin *itemViewPlugin = qobject_cast<ItemViewPlugin*>(plugin)) { this->loadItemViewPlugin(itemViewPlugin); } else if (RemoteMediaPlayerPlugin *remoteMediaPlayerPlugin = qobject_cast<RemoteMediaPlayerPlugin*>(plugin)) { this->loadRemoteMediaPlayerPlugin(remoteMediaPlayerPlugin); } else if (TagEditorPlugin *tagEditorPlugin = qobject_cast<TagEditorPlugin*>(plugin)) { this->loadTagEditorPlugin(tagEditorPlugin); } } return plugin != nullptr; }