diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b39f8d..e822cac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,106 +1,100 @@ -PROJECT(upload) +project(upload) set(VERSION_MAJOR 1) set(VERSION_MINOR 9) set(VERSION_PATCH 90) # KDevplatform dependency version set( KDEVPLATFORM_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}" ) configure_file( "${upload_SOURCE_DIR}/version.h.cmake" "${upload_BINARY_DIR}/version.h" @ONLY ) cmake_minimum_required(VERSION 2.8.12) find_package (ECM 0.0.9 REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH}) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${upload_SOURCE_DIR}/cmake/) include(KDECompilerSettings NO_POLICY_SCOPE) include(ECMAddTests) include(KDEInstallDirs) include(KDECMakeSettings) include(FeatureSummary) set(QT_MIN_VERSION "5.5.0") find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Core Widgets) set(KF5_DEP_VERSION "5.15.0") find_package(KF5 ${KF5_DEP_VERSION} REQUIRED COMPONENTS TextEditor I18n KCMUtils JobWidgets Service Parts KIO CoreAddons ItemModels) find_package(KDevPlatform ${KDEVPLATFORM_VERSION} REQUIRED) include_directories(${KDEVPLATFORM_INCLUDE_DIR}) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ) add_subdirectory(tests) #plugin set(kdevupload_PART_SRCS kdevuploadplugin.cpp allprofilesmodel.cpp profilesfiletree.cpp uploaddialog.cpp uploadjob.cpp uploadprofiledlg.cpp uploadprofileitem.cpp uploadprofilemodel.cpp uploadprojectmodel.cpp ) set(kdevupload_UI uploaddialog.ui uploadprofiledlg.ui ) -add_library(kdevupload_PART_SRCS ${kdevupload_UI}) -add_library(kdevupload MODULE ${kdevupload_PART_SRCS}) +add_library(kdevupload_PART_SRCS ${kdevupload_UI}) -configure_file(kdevupload.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/kdevupload.desktop) -kcoreaddons_desktop_to_json(kdevupload ${CMAKE_CURRENT_BINARY_DIR}/kdevupload.desktop) +qt5_add_resources(kdevupload_PART_SRCS kdevupload.qrc) +kdevplatform_add_plugin(kdevupload JSON kdevupload.json SOURCES ${kdevupload_PART_SRCS}) target_link_libraries(kdevupload KDev::Interfaces KDev::Project KDev::Serialization KF5::JobWidgets KF5::KCMUtils KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::KIONTLM KF5::CoreAddons ) -install(TARGETS kdevupload DESTINATION ${PLUGIN_INSTALL_DIR}/kdevplatform/${KDEV_PLUGIN_VERSION}) - -install(FILES kdevupload.rc DESTINATION ${DATA_INSTALL_DIR}/kdevupload) - - #preferences-plugin set(uploadpreferences_PART_SRCS uploadpreferences.cpp uploadprofilemodel.cpp uploadprofileitem.cpp uploadprofiledlg.cpp ) -qt5_wrap_ui(uploadpreferences_PART_SRCS uploadpreferences.ui uploadprofiledlg.ui uploaddialog.ui) +ki18n_wrap_ui(uploadpreferences_PART_SRCS uploadpreferences.ui uploadprofiledlg.ui uploaddialog.ui) add_library(uploadpreferences_PART_SRCS uploadpreferences.ui uploadprofiledlg.ui uploaddialog.ui) add_library(kcm_kdev_upload ${uploadpreferences_PART_SRCS}) target_link_libraries(kcm_kdev_upload KDev::Interfaces KDev::Util KF5::I18n KF5::KCMUtils KF5::Service KF5::Parts KF5::KIOCore KF5::KIOFileWidgets KF5::KIOWidgets KF5::KIONTLM ) install(TARGETS kcm_kdev_upload DESTINATION ${PLUGIN_INSTALL_DIR}) install(FILES kcm_kdev_upload.desktop DESTINATION ${SERVICES_INSTALL_DIR}) diff --git a/kdevupload.json b/kdevupload.json new file mode 100644 index 0000000..3bff80e --- /dev/null +++ b/kdevupload.json @@ -0,0 +1,85 @@ +{ + "GenericName": "Upload Plugin", + "GenericName[bs]": "Pošalji dodatak", + "GenericName[ca@valencia]": "Connector de pujada", + "GenericName[ca]": "Connector de pujada", + "GenericName[cs]": "Modul odesílání", + "GenericName[de]": "Hochladen-Modul", + "GenericName[es]": "Complemento de envío", + "GenericName[et]": "Üleslaadimise plugin", + "GenericName[fr]": "Module externe d'envoi", + "GenericName[ga]": "Breiseán Uasluchtaithe", + "GenericName[gl]": "Complemento de envío", + "GenericName[hu]": "Feltöltés bővítmény", + "GenericName[it]": "Invia estensione", + "GenericName[nl]": "Upload-plugin", + "GenericName[pl]": "Wtyczka wysyłania", + "GenericName[pt]": "'Plugin' de Envio", + "GenericName[pt_BR]": "Plugin de envio", + "GenericName[sk]": "Nahrať plugin", + "GenericName[sv]": "Insticksprogram för uppladdning", + "GenericName[tr]": "Yükleme Eklentisi", + "GenericName[uk]": "Додаток вивантаження", + "GenericName[x-test]": "xxUpload Pluginxx", + "KPlugin": { + "Description": "Upload project files to a remote server", + "Description[bs]": "Pošalji projektne datoteke na udaljeni server", + "Description[ca@valencia]": "Puja els fitxers de projecte a un servidor remot", + "Description[ca]": "Puja els fitxers de projecte a un servidor remot", + "Description[cs]": "Odeslat soubory projektu na vzdálený server", + "Description[de]": "Projektdateien auf einen entfernten Server hochladen", + "Description[es]": "Enviar archivos de proyectos a un servidor remoto", + "Description[et]": "Projektifailide üleslaadimine võrguserverisse", + "Description[fr]": "Envoie des fichiers de projets à un serveur distant", + "Description[ga]": "Uasluchtaigh comhaid tionscadail go cianfhreastalaí", + "Description[gl]": "Enviar ficheiros de proxecto a un servidor remoto.", + "Description[hu]": "Projektfájlok feltöltése egy távoli kiszolgálóra", + "Description[it]": "Invia i file del progetto a un server remoto", + "Description[nl]": "Projectbestanden naar een server op afstand uploaden", + "Description[pl]": "Wysyła pliki projektu na zdalny serwer", + "Description[pt]": "Enviar os ficheiros do projecto para um servidor remoto", + "Description[pt_BR]": "Enviar os arquivos do projeto para um servidor remoto", + "Description[sk]": "Nahrať súbory projektu na vzdialený server", + "Description[sv]": "Ladda upp projektfiler till en fjärrserver", + "Description[tr]": "Proje dosyalraını uzak bir sunucuya yükleyin", + "Description[uk]": "Вивантаження файлів проекту на віддалений сервер", + "Description[x-test]": "xxUpload project files to a remote serverxx", + "Icon": "go-up", + "Id": "KDevUpload", + "Name": "KDevUpload", + "Name[ast]": "KDevUpload", + "Name[bs]": "KDevUpload", + "Name[ca@valencia]": "KDevUpload", + "Name[ca]": "KDevUpload", + "Name[cs]": "KDevUpload", + "Name[de]": "KDevUpload", + "Name[es]": "KDevUpload", + "Name[et]": "KDevUpload", + "Name[fr]": "KDevUpload", + "Name[ga]": "KDevUpload", + "Name[gl]": "KDevUpload", + "Name[hu]": "KDevUpload", + "Name[it]": "KDevUpload", + "Name[nl]": "KDevUpload", + "Name[pl]": "KDevUpload", + "Name[pt]": "KDevUpload", + "Name[pt_BR]": "KDevUpload", + "Name[sk]": "KDevUpload", + "Name[sv]": "Kdevupload", + "Name[tr]": "KDevUpload", + "Name[uk]": "KDevUpload", + "Name[x-test]": "xxKDevUploadxx", + "ServiceTypes": [ + "KDevelop/Plugin" + ] + }, + "X-KDevelop-Args": "", + "X-KDevelop-Category": "Global", + "X-KDevelop-IRequired": "org.kdevelop.IOutputView", + "X-KDevelop-LoadMode": "AlwaysOn", + "X-KDevelop-Mode": "GUI", + "X-KDevelop-Plugin-BugsEmailAddress": "niko.sams@gmail.com", + "X-KDevelop-Plugin-Copyright": "(C) by Niko Sams", + "X-KDevelop-Plugin-Version": "1", + "X-KDevelop-Version": "27" +} diff --git a/kdevupload.qrc b/kdevupload.qrc new file mode 100644 index 0000000..f83693d --- /dev/null +++ b/kdevupload.qrc @@ -0,0 +1,6 @@ + + + + kdevupload.rc + + diff --git a/kdevuploadplugin.cpp b/kdevuploadplugin.cpp index fd45b11..c2e3b41 100644 --- a/kdevuploadplugin.cpp +++ b/kdevuploadplugin.cpp @@ -1,368 +1,368 @@ /*************************************************************************** * Copyright 2007 Niko Sams * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "kdevuploadplugin.h" #include #include #include #include #include #include "kdevuploaddebug.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "uploaddialog.h" #include "profilesfiletree.h" #include "uploadjob.h" #include "uploadprojectmodel.h" #include "uploadprofilemodel.h" #include "uploadprofileitem.h" #include "allprofilesmodel.h" #include #include "version.h" K_PLUGIN_FACTORY_WITH_JSON(UploadFactory, "kdevupload.json", registerPlugin(); ) Q_LOGGING_CATEGORY(KDEVUPLOAD, "kdev.upload"); class FilesTreeViewFactory: public KDevelop::IToolViewFactory{ public: FilesTreeViewFactory(UploadPlugin* plugin, AllProfilesModel* model) : m_plugin(plugin), m_allProfilesModel(model) {} virtual QWidget* create(QWidget *parent = 0) { ProfilesFileTree* w = new ProfilesFileTree(m_plugin, parent); w->setModel(m_allProfilesModel); return w; } virtual QString id() const { return "org.quanta.UploadFactory"; } virtual Qt::DockWidgetArea defaultPosition() { return Qt::RightDockWidgetArea; } private: UploadPlugin* m_plugin; AllProfilesModel* m_allProfilesModel; }; UploadPlugin::UploadPlugin(QObject *parent, const QVariantList &) -: KDevelop::IPlugin(QStringLiteral("uploadplugin"), parent), m_outputModel(0), m_filesTreeViewFactory(0) +: KDevelop::IPlugin(QStringLiteral("kdevupload"), parent), m_outputModel(0), m_filesTreeViewFactory(0) { connect(core()->projectController(), SIGNAL(projectOpened(KDevelop::IProject*)), this, SLOT(projectOpened(KDevelop::IProject*))); connect(core()->projectController(), SIGNAL(projectClosed(KDevelop::IProject*)), this, SLOT(projectClosed(KDevelop::IProject*))); connect(core()->documentController(), SIGNAL(documentActivated(KDevelop::IDocument*)), SLOT(documentActivated(KDevelop::IDocument*))); connect(core()->documentController(), SIGNAL(documentClosed(KDevelop::IDocument*)), SLOT(documentClosed(KDevelop::IDocument*))); - setXMLFile("kdevupload.rc"); + setXMLFile( QStringLiteral( "kdevupload.rc" ) ); m_allProfilesModel = new AllProfilesModel(this); connect(m_allProfilesModel, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(profilesRowChanged())); connect(m_allProfilesModel, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(profilesRowChanged())); connect(m_allProfilesModel, SIGNAL(modelReset()), this, SLOT(profilesRowChanged())); setupActions(); } UploadPlugin::~UploadPlugin() { } void UploadPlugin::setupActions() { m_signalMapper = new QSignalMapper(this); connect(m_signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(projectUpload(QObject*))); m_projectUploadActionMenu = new KActionMenu(i18n("&Upload Project"), this); m_projectUploadActionMenu->setIcon(QIcon::fromTheme("go-up")); m_projectUploadActionMenu->setToolTip(i18n("Upload project")); m_projectUploadActionMenu->setVisible(false); //make it visible when there are upload profiles actionCollection()->addAction("project_upload", m_projectUploadActionMenu); m_quickUploadCurrentFile = actionCollection()->addAction("quick_upload_current_file"); m_quickUploadCurrentFile->setText( i18n("&Quick Upload Current File") ); m_quickUploadCurrentFile->setIcon(QIcon::fromTheme("go-up")); m_projectUploadActionMenu->setEnabled(false); connect(m_quickUploadCurrentFile, SIGNAL(triggered(bool)), SLOT(quickUploadCurrentFile())); } void UploadPlugin::projectOpened(KDevelop::IProject* project) { UploadProfileModel* model = new UploadProfileModel(); model->setProject(project); m_projectProfileModels.insert(project, model); m_allProfilesModel->addModel(model); documentActivated(core()->documentController()->activeDocument()); } void UploadPlugin::projectClosed(KDevelop::IProject* project) { QAction* action = m_projectUploadActions.value(project); if (action) { m_projectUploadActions.remove(project); m_projectUploadActionMenu->removeAction(action); delete action; } UploadProfileModel* model = m_projectProfileModels.value(project); if (model) { m_projectProfileModels.remove(project); m_allProfilesModel->removeModel(model); delete model; } } void UploadPlugin::documentActivated(KDevelop::IDocument* doc) { if (!doc) { m_quickUploadCurrentFile->setEnabled(false); return; } KDevelop::IProject* project = core()->projectController()->findProjectForUrl(doc->url()); if (!project) { m_quickUploadCurrentFile->setEnabled(false); return; } QList files = project->filesForPath(KDevelop::IndexedString(doc->url())); if (files.isEmpty()) { m_quickUploadCurrentFile->setEnabled(false); return; } UploadProfileModel* profileModel = m_projectProfileModels.value(project); if (!profileModel || !profileModel->rowCount()) { m_quickUploadCurrentFile->setEnabled(false); return; } m_quickUploadCurrentFile->setEnabled(true); } void UploadPlugin::documentClosed(KDevelop::IDocument* ) { m_quickUploadCurrentFile->setEnabled(false); } void UploadPlugin::projectUpload(QObject* p) { KDevelop::IProject* project = qobject_cast(p); if (project) { UploadDialog dialog(project, this, core()->uiController()->activeMainWindow()); UploadProfileModel* model = m_projectProfileModels.value(project); dialog.setProfileModel(model); dialog.exec(); } } void UploadPlugin::unload() { } KDevelop::ContextMenuExtension UploadPlugin::contextMenuExtension(KDevelop::Context* context, QWidget* parent) { if (context->type() == KDevelop::Context::ProjectItemContext) { KDevelop::ContextMenuExtension cmExtension; KDevelop::ProjectItemContext *itemCtx = dynamic_cast(context); if (itemCtx) { m_ctxUrlList.clear(); Q_FOREACH (KDevelop::ProjectBaseItem* _item, itemCtx->items()) { if (_item->folder() || _item->file()) { m_ctxUrlList << _item; } } if (!m_ctxUrlList.isEmpty()) { KDevelop::IProject* project = m_ctxUrlList.at(0)->project(); UploadProfileModel* model = m_projectProfileModels.value(project); if (model && model->rowCount()) { QAction *action; action = new QAction(i18n("Upload..."), parent); action->setIcon(QIcon::fromTheme("go-up")); connect(action, SIGNAL(triggered()), this, SLOT(upload())); cmExtension.addAction(KDevelop::ContextMenuExtension::FileGroup, action); action = new QAction(i18n("Quick Upload"), parent); action->setIcon(QIcon::fromTheme("go-up")); connect(action, SIGNAL(triggered()), this, SLOT(quickUpload())); cmExtension.addAction(KDevelop::ContextMenuExtension::FileGroup, action); return cmExtension; } } } } return KDevelop::IPlugin::contextMenuExtension(context, parent); } void UploadPlugin::upload() { if (m_ctxUrlList.isEmpty()) return; KDevelop::IProject* project = m_ctxUrlList.at(0)->project(); UploadDialog dialog(project, this, core()->uiController()->activeMainWindow()); UploadProfileModel* model = m_projectProfileModels.value(project); dialog.setProfileModel(model); dialog.setRootItem(m_ctxUrlList.at(0)); dialog.exec(); } void UploadPlugin::quickUpload() { if (m_ctxUrlList.isEmpty()) return; KDevelop::IProject* project = m_ctxUrlList.at(0)->project(); UploadProjectModel* model = new UploadProjectModel(project); model->setSourceModel(project->projectItem()->model()); model->setRootItem(m_ctxUrlList.at(0)); UploadProfileModel* profileModel = m_projectProfileModels.value(project); for (int i = 0; i < profileModel->rowCount(); i++) { UploadProfileItem* item = profileModel->uploadItem(i); if (item->isDefault()) { KConfigGroup c = item->profileConfigGroup(); if (c.isValid()) { model->setProfileConfigGroup(c); } break; } } UploadJob* job = new UploadJob(project, model, core()->uiController()->activeMainWindow()); job->setQuickUpload(true); job->setOutputModel(outputModel()); job->start(); } void UploadPlugin::quickUploadCurrentFile() { KDevelop::IDocument* doc = core()->documentController()->activeDocument(); if (!doc) return; KDevelop::IProject* project = KDevelop::ICore::self()->projectController()->findProjectForUrl(doc->url()); if (!project) return; QList files = project->filesForPath(KDevelop::IndexedString(doc->url())); if (files.isEmpty()) return; UploadProjectModel* model = new UploadProjectModel(project); model->setSourceModel(project->projectItem()->model()); model->setRootItem(files.first()); UploadProfileModel* profileModel = m_projectProfileModels.value(project); for (int i = 0; i < profileModel->rowCount(); i++) { UploadProfileItem* item = profileModel->uploadItem(i); if (item->isDefault()) { KConfigGroup c = item->profileConfigGroup(); if (c.isValid()) { model->setProfileConfigGroup(c); } break; } } UploadJob* job = new UploadJob(project, model, core()->uiController()->activeMainWindow()); job->setQuickUpload(true); job->setOutputModel(outputModel()); job->start(); } QStandardItemModel* UploadPlugin::outputModel() { if (m_outputModel) return m_outputModel; IPlugin* plugin = core()->pluginController()->pluginForExtension( "org.kdevelop.IOutputView" ); Q_ASSERT(plugin); if (plugin) { KDevelop::IOutputView* view = plugin->extension(); int tvid = view->registerToolView(i18n("Upload")); int id = view->registerOutputInToolView(tvid, i18n("Output"), KDevelop::IOutputView::AllowUserClose | KDevelop::IOutputView::AutoScroll); m_outputModel = new QStandardItemModel(this); view->setModel(id, m_outputModel); view->setDelegate(id, new QItemDelegate(m_outputModel)); return m_outputModel; } return 0; } void UploadPlugin::profilesRowChanged() { if (m_allProfilesModel->rowCount()) { if (!m_filesTreeViewFactory) { m_filesTreeViewFactory = new FilesTreeViewFactory(this, m_allProfilesModel); core()->uiController()->addToolView(i18n("Upload Profiles"), m_filesTreeViewFactory); } } else { if (m_filesTreeViewFactory) { core()->uiController()->removeToolView(m_filesTreeViewFactory); m_filesTreeViewFactory = 0; } } Q_FOREACH(UploadProfileModel* model, m_projectProfileModels) { KDevelop::IProject* project = model->project(); if (model->rowCount()) { if (!m_projectUploadActions.contains(project)) { QAction* action = new QAction(project->name(), m_projectUploadActionMenu); connect(action, SIGNAL(triggered()), m_signalMapper, SLOT(map())); m_signalMapper->setMapping(action, project); m_projectUploadActions.insert(project, action); m_projectUploadActionMenu->addAction(action); m_projectUploadActionMenu->setVisible(true); } } else { if (m_projectUploadActions.contains(project)) { QAction* action = m_projectUploadActions.value(project); m_projectUploadActions.remove(project); m_projectUploadActionMenu->removeAction(action); m_signalMapper->removeMappings(action); delete action; } } } if (m_projectUploadActions.isEmpty()) { m_projectUploadActionMenu->setVisible(false); } } #include "kdevuploadplugin.moc" // kate: space-indent on; indent-width 4; tab-width 4; replace-tabs on