libplasma
openwidgetassistant.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "plasma/appletbrowser/openwidgetassistant_p.h"
00021
00022 #include <QLabel>
00023 #include <QVBoxLayout>
00024
00025 #include <KDebug>
00026 #include <kfilewidget.h>
00027 #include <KListWidget>
00028 #include <KService>
00029 #include <KServiceTypeTrader>
00030 #include <KStandardDirs>
00031
00032 #include "plasma/packagestructure.h"
00033
00034 namespace Plasma
00035 {
00036
00037 OpenWidgetAssistant::OpenWidgetAssistant(QWidget *parent)
00038 : KAssistantDialog(parent),
00039 m_fileDialog(0),
00040 m_filePageWidget(0)
00041 {
00042 QWidget *selectWidget = new QWidget(this);
00043 QVBoxLayout *selectLayout = new QVBoxLayout(selectWidget);
00044 QLabel *selectLabel = new QLabel(selectWidget);
00045 selectLabel->setText(i18n("Select the type of widget to install from the list below."));
00046 m_widgetTypeList = new KListWidget(selectWidget);
00047 m_widgetTypeList->setSelectionMode(QAbstractItemView::SingleSelection);
00048
00049 connect(m_widgetTypeList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(next()));
00050 connect(m_widgetTypeList, SIGNAL(itemSelectionChanged ()), this, SLOT(slotItemChanged()));
00051
00052 QString constraint("'Applet' in [X-Plasma-ComponentTypes] and exist [X-Plasma-PackageFormat]");
00053 KService::List offers = KServiceTypeTrader::self()->query("Plasma/ScriptEngine", constraint);
00054
00055 QListWidgetItem * item = new QListWidgetItem(KIcon("plasma"), i18n("Plasmoid: Native plasma widget"), m_widgetTypeList);
00056 item->setSelected(true);
00057 m_widgetTypeList->setCurrentItem(item);
00058
00059 foreach (const KService::Ptr &offer, offers) {
00060 QString text(offer->name());
00061 if (!offer->comment().isEmpty()) {
00062 text.append(": ").append(offer->comment());
00063 }
00064
00065 item = new QListWidgetItem(text, m_widgetTypeList);
00066 item->setData(PackageStructureRole, offer->property("X-KDE-PluginInfo-Name"));
00067
00068 if (!offer->icon().isEmpty()) {
00069 item->setIcon(KIcon(offer->icon()));
00070 }
00071 }
00072
00073 selectLayout->addWidget(selectLabel);
00074 selectLayout->addWidget(m_widgetTypeList);
00075
00076 m_typePage = new KPageWidgetItem(selectWidget, i18n("Install New Widget From File"));
00077 m_typePage->setIcon(KIcon("plasma"));
00078 addPage(m_typePage);
00079
00080 m_filePageWidget = new QWidget(this);
00081 m_filePage = new KPageWidgetItem(m_filePageWidget, i18n("Select File"));
00082 addPage(m_filePage);
00083
00084 connect(this, SIGNAL(currentPageChanged(KPageWidgetItem*,KPageWidgetItem*)), SLOT(prepPage(KPageWidgetItem*,KPageWidgetItem*)));
00085 connect(this, SIGNAL(user1Clicked()), this, SLOT(finished()));
00086 enableButton( KDialog::Help, false );
00087
00088 m_widgetTypeList->setFocus();
00089 resize(QSize(560, 400).expandedTo(minimumSizeHint()));
00090 }
00091
00092 void OpenWidgetAssistant::slotItemChanged()
00093 {
00094 enableButton( KDialog::User2, !m_widgetTypeList->selectedItems().isEmpty() );
00095 }
00096
00097 void OpenWidgetAssistant::prepPage(KPageWidgetItem *current, KPageWidgetItem *before)
00098 {
00099 Q_UNUSED(before)
00100 if ( m_widgetTypeList->selectedItems().isEmpty() )
00101 return;
00102
00103 if (current != m_filePage) {
00104 return;
00105 }
00106
00107 if (!m_fileDialog) {
00108 QVBoxLayout *layout = new QVBoxLayout(m_filePageWidget);
00109 m_fileDialog = new KFileWidget(KUrl(), m_filePageWidget);
00110 m_fileDialog->setOperationMode(KFileWidget::Opening);
00111 m_fileDialog->setMode(KFile::File | KFile::ExistingOnly);
00112
00113 layout->addWidget(m_fileDialog);
00114 }
00115
00116 QListWidgetItem *item = m_widgetTypeList->selectedItems().first();
00117 Q_ASSERT(item);
00118
00119 QString type = item->data(PackageStructureRole).toString();
00120
00121 m_fileDialog->setFilter(QString());
00122 if (!type.isEmpty()) {
00123 QString constraint = QString("'%1' == [X-KDE-PluginInfo-Name]").arg(type);
00124 KService::List offers = KServiceTypeTrader::self()->query("Plasma/PackageStructure", constraint);
00125
00126 kDebug() << "looking for a Plasma/PackageStructure with" << constraint << type;
00127 Q_ASSERT(offers.count() > 0);
00128
00129 m_packageStructureService = offers.first();
00130 QStringList mimes = m_packageStructureService->property("X-Plasma-PackageFileMimetypes").toStringList();
00131
00132 if (mimes.count() > 0) {
00133 m_fileDialog->setMimeFilter(mimes);
00134 } else {
00135 QString filter = m_packageStructureService->property("X-Plasma-PackageFileFilter").toString();
00136 if (!filter.isEmpty()) {
00137 m_fileDialog->setFilter( + '|' + m_packageStructureService->name());
00138 }
00139 }
00140 } else {
00141 QStringList mimes;
00142 mimes << "application/x-plasma";
00143 m_fileDialog->setMimeFilter(mimes);
00144 }
00145 }
00146
00147 void OpenWidgetAssistant::slotHelpClicked()
00148 {
00149
00150 }
00151
00152 void OpenWidgetAssistant::finished()
00153 {
00154 m_fileDialog->slotOk();
00155 m_fileDialog->accept();
00156
00157 if (m_fileDialog->selectedFile().isEmpty()) {
00158
00159 return;
00160 }
00161
00162
00163 PackageStructure *installer = 0;
00164 if (m_packageStructureService) {
00165 QString error;
00166 installer = m_packageStructureService->createInstance<Plasma::PackageStructure>(0, QVariantList(), &error);
00167 if (!installer) {
00168 kDebug() << "Could not load requested PackageStructure installer "
00169 << m_packageStructureService << ". Error given: " << error;
00170 return;
00171 }
00172 } else {
00173 installer = new PackageStructure;
00174 }
00175
00176 QString root = KStandardDirs::locateLocal("data", "plasma/plasmoids/");
00177
00178 bool success = installer->installPackage(m_fileDialog->selectedFile(), root);
00179
00180 delete installer;
00181 kDebug() << "install returned. were we successful?" << success;
00182
00183 }
00184
00185 }
00186
00187 #include "openwidgetassistant_p.moc"