[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-core-devel
Subject:    Re: New KPluginSelector. Finished.
From:       David Faure <faure () kde ! org>
Date:       2008-05-16 11:15:00
Message-ID: 200805161315.01543.faure () kde ! org
[Download RAW message or body]

On Thursday 15 May 2008, Rafael =?utf-8?q?Fern=C3=A1ndez_L=C3=B3pez?= wrote:
> The patch is at http://media.ereslibre.es/2008/05/kdelibs-kpluginselector.diff. 

Yay, more code for me to review :-)

Here are some (rather minor) implementation comments:

+int KPluginSelector::Private::PluginModel::rowCount(const QModelIndex &parent) const
 {
+    Q_UNUSED(parent)
+    return pluginEntryList.count();
 }
Better write something like
    if (parent.isValid()) return 0; else return pluginEntryList.count();
to ensure that your model doesn't look like a tree (if the view asks for \
rowCount(childIndex), you want to return 0, not >0).

+        case PluginInfoRole: {
+            QVariant var;
+            var.setValue(pluginEntry->pluginInfo);
+            return var;
=> return QVariant::fromValue(pluginEntry->pluginInfo);

setData() does static_cast<PluginEntry*>(index.internalPointer())-> without an \
invalid-index check and/or a null check.

+    , checkBox(new QCheckBox)
+    , pushButton(new KPushButton)
Any reason why you're not passing this as parent object instead of the explicit \
delete in the destructor?

+    KPushButton *aboutPushButton = static_cast<KPushButton*>(widgets[2]);
+    aboutPushButton->resize(aboutPushButton->sizeHint());
+    aboutPushButton->move(option.rect.width() - MARGIN - \
aboutPushButton->sizeHint().width(), option.rect.height() / 2 - \
widgets[2]->sizeHint().height() / 2); This calls widgets[2] twice, and sizeHint() on \
it three times. sizeHint can do quite a lot of font metrics and calculations, I \
suggest using a temporary var for holding the sizeHint() value. Same thing with the \
other two buttons of course.

+    configurePushButton->setVisible(index.model()->data(index, \
ServicesCountRole).toBool()); Hmm, should it really be created and then hidden, \
instead of not being created at all if this role says false?

+    const QModelIndex index = focusedIndex();
+    pluginSelector_d->dependenciesWidget->clearDependencies();
+    KPluginInfo pluginInfo = index.model()->data(index, \
PluginInfoRole).value<KPluginInfo>(); +    \
pluginSelector_d->updateDependencies(pluginInfo, state); +    \
const_cast<QAbstractItemModel*>(index.model())->setData(index, state, \
Qt::CheckStateRole); You can avoid the const_cast if you don't make the index const. \
Const temps are good, but not if they introduce a const_cast :-)

(qobject_cast<KCModuleProxy*>(mainWidget))->moduleInfo()
Should this cast be checked? I'm not 100% sure from reading the code, that in this \
code path, mainWidget will always be a KCModuleProxy. Another solution would be a \
KCModuleProxy* temp variable.

+    KDialog *configDialog = new KDialog(itemView());
+        if (configDialog->exec() == QDialog::Accepted) {
[...]
+    delete configDialog;
Create the modal dialog on the stack instead? Safer in case there's an early return \
in the code one day.

+    struct PluginEntry; [...]
+class KPluginSelector::Private::PluginEntry
The struct/class mismatch will give a warning on windows. Choose one or the other.
I also suggest grouping the two bools next to each other, to save 4 bytes of padding.

-- 
David Faure, faure@kde.org, sponsored by Trolltech to work on KDE,
Konqueror (http://www.konqueror.org), and KOffice (http://www.koffice.org).


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic