20 #include "GraphFileBackendManager.h"
24 #include <KAboutApplicationDialog>
25 #include <KComponentData>
26 #include <KWidgetItemDelegate>
27 #include <KPushButton>
28 #include <KTitleWidget>
30 #include <QApplication>
31 #include <QAbstractListModel>
32 #include <QAbstractItemView>
33 #include <QVBoxLayout>
41 bool sortPlugins(GraphFilePluginInterface* pluginL, GraphFilePluginInterface* pluginR)
43 return pluginL->aboutData()->programName() < pluginR->aboutData()->programName();
46 class PluginsModel :
public QAbstractListModel
50 CommentRole = Qt::UserRole+1
52 PluginsModel(
QObject* parent = 0)
53 : QAbstractListModel(parent)
55 _plugins = GraphFileBackendManager::self()->backends();
56 qSort(_plugins.begin(), _plugins.end(),
sortPlugins);
59 GraphFilePluginInterface* pluginData(
const QModelIndex& index)
const
61 if (!index.isValid()) {
64 if (index.parent().isValid()) {
67 if (index.column() != 0) {
70 if (index.row() >= _plugins.count()) {
73 return _plugins[index.row()];
76 virtual QVariant data(
const QModelIndex& index,
int role = Qt::DisplayRole)
const
78 GraphFilePluginInterface* plugin = pluginData(index);
85 QString name(plugin->aboutData()->programName());
89 return plugin->aboutData()->shortDescription();
95 virtual int rowCount(
const QModelIndex& parent = QModelIndex())
const
97 if (!parent.isValid()) {
98 return _plugins.count();
104 QList<GraphFilePluginInterface*> _plugins;
108 class LoadedPluginsDelegate :
public KWidgetItemDelegate
114 LoadedPluginsDelegate(QAbstractItemView *itemView,
QObject *parent = 0)
115 : KWidgetItemDelegate(itemView, parent)
116 , pushButton(new KPushButton)
118 pushButton->setIcon(KIcon(
"dialog-information"));
121 ~LoadedPluginsDelegate()
126 QSize sizeHint(
const QStyleOptionViewItem &option,
const QModelIndex &index)
const
131 QFont font = titleFont(option.font);
132 QFontMetrics fmTitle(font);
134 return QSize(qMax(fmTitle.width(index.model()->data(index, Qt::DisplayRole).toString()),
135 option.fontMetrics.width(index.model()->data(index, PluginsModel::CommentRole).toString())) +
136 KIconLoader::SizeMedium +
MARGIN * i + pushButton->sizeHint().width() * j,
137 qMax(KIconLoader::SizeMedium +
MARGIN * 2, fmTitle.height() + option.fontMetrics.height() +
MARGIN * 2));
141 void paint(QPainter *painter,
const QStyleOptionViewItem &option,
142 const QModelIndex &index)
const
144 if (!index.isValid()) {
150 QApplication::style()->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, 0);
152 QRect contentsRect(dependantLayoutValue(
MARGIN * 2 + option.rect.left(), option.rect.width() -
MARGIN * 3, option.rect.width()),
MARGIN + option.rect.top(), option.rect.width() -
MARGIN * 3, option.rect.height() -
MARGIN * 2);
154 int lessHorizontalSpace =
MARGIN * 2 + pushButton->sizeHint().width();
156 contentsRect.setWidth(contentsRect.width() - lessHorizontalSpace);
158 if (option.state & QStyle::State_Selected) {
159 painter->setPen(option.palette.highlightedText().color());
162 if (itemView()->layoutDirection() == Qt::RightToLeft) {
163 contentsRect.translate(lessHorizontalSpace, 0);
169 QFont font = titleFont(option.font);
170 QFontMetrics fmTitle(font);
171 painter->setFont(font);
172 painter->drawText(contentsRect, Qt::AlignLeft | Qt::AlignTop, fmTitle.elidedText(index.model()->data(index, Qt::DisplayRole).toString(), Qt::ElideRight, contentsRect.width()));
175 painter->drawText(contentsRect, Qt::AlignLeft | Qt::AlignBottom, option.fontMetrics.elidedText(index.model()->data(index, PluginsModel::CommentRole).toString(), Qt::ElideRight, contentsRect.width()));
181 QList<QWidget*> createItemWidgets()
const
183 KPushButton *button =
new KPushButton();
184 button->setIcon(KIcon(
"dialog-information"));
185 setBlockedEventTypes(button, QList<QEvent::Type>() << QEvent::MouseButtonPress
186 << QEvent::MouseButtonRelease << QEvent::MouseButtonDblClick);
188 connect(button, SIGNAL(clicked(
bool)),
this, SLOT(info()));
189 return QList<QWidget*>()
193 void updateItemWidgets(
const QList<QWidget*> widgets,
194 const QStyleOptionViewItem &option,
195 const QPersistentModelIndex &index)
const
198 KPushButton *aboutPushButton =
static_cast<KPushButton*
>(widgets[0]);
199 QSize aboutPushButtonSizeHint = aboutPushButton->sizeHint();
200 aboutPushButton->resize(aboutPushButtonSizeHint);
201 aboutPushButton->move(dependantLayoutValue(option.rect.width() -
MARGIN - aboutPushButtonSizeHint.width(), aboutPushButtonSizeHint.width(), option.rect.width()), option.rect.height() / 2 - aboutPushButtonSizeHint.height() / 2);
204 int dependantLayoutValue(
int value,
int width,
int totalWidth)
const
206 if (itemView()->layoutDirection() == Qt::LeftToRight) {
209 return totalWidth - width - value;
212 QFont titleFont(
const QFont &baseFont)
const
214 QFont retFont(baseFont);
215 retFont.setBold(
true);
222 PluginsModel *model =
static_cast<PluginsModel*
>(itemView()->model());
223 GraphFilePluginInterface* plugin = model->pluginData(focusedIndex());
225 QPointer<KAboutApplicationDialog> aboutPlugin =
new KAboutApplicationDialog(plugin->aboutData(), itemView());
231 QPushButton *pushButton;
235 class PluginsView :
public QListView
238 PluginsView(
QWidget* parent = 0)
241 setModel(
new PluginsModel());
242 setItemDelegate(
new LoadedPluginsDelegate(
this));
243 setVerticalScrollMode(QListView::ScrollPerPixel);
246 virtual ~PluginsView()
251 delete itemDelegate();
254 virtual QSize sizeHint()
const
256 QSize ret = QListView::sizeHint();
257 ret.setWidth(qMax(ret.width(), sizeHintForColumn(0) + 30));
266 setPlainCaption(i18n(
"Loaded Plugins"));
267 setButtons(KDialog::Close);
268 setDefaultButton(KDialog::Close);
270 QVBoxLayout* vbox =
new QVBoxLayout(mainWidget());
271 KTitleWidget* title =
new KTitleWidget(
this);
272 title->setText(i18n(
"Graph File Plugins loaded for %1", KGlobal::mainComponent().aboutData()->programName()));
273 vbox->addWidget(title);
274 vbox->addWidget(
new PluginsView());
277 #include "moc_LoadedPluginsDialog.cpp"
278 #include "LoadedPluginsDialog.moc"
bool sortPlugins(GraphFilePluginInterface *pluginL, GraphFilePluginInterface *pluginR)
LoadedPluginsDialog(QWidget *parent=0)