#include "previewssettingspage.h"
#include "dolphin_generalsettings.h"
+#include "configurepreviewplugindialog.h"
#include <KConfigGroup>
#include <KDialog>
#include <KService>
#include <settings/dolphinsettings.h>
+#include <settings/serviceitemdelegate.h>
+#include <settings/servicemodel.h>
#include <QCheckBox>
#include <QGroupBox>
#include <QLabel>
-#include <QListWidget>
-#include <QRadioButton>
+#include <QListView>
+#include <QPainter>
+#include <QScrollBar>
#include <QShowEvent>
#include <QSlider>
+#include <QSortFilterProxyModel>
#include <QGridLayout>
+#include <QVBoxLayout>
// default settings
namespace {
PreviewsSettingsPage::PreviewsSettingsPage(QWidget* parent) :
SettingsPageBase(parent),
m_initialized(false),
- m_previewPluginsList(0),
+ m_listView(0),
m_enabledPreviewPlugins(),
m_localFileSizeBox(0),
m_remoteFileSizeBox(0)
// Create group box "Show previews for:"
QGroupBox* listBox = new QGroupBox(i18nc("@title:group", "Show previews for"), this);
- m_previewPluginsList = new QListWidget(this);
- m_previewPluginsList->setSortingEnabled(true);
- m_previewPluginsList->setSelectionMode(QAbstractItemView::NoSelection);
+ m_listView = new QListView(this);
+
+ ServiceItemDelegate* delegate = new ServiceItemDelegate(m_listView, m_listView);
+ connect(delegate, SIGNAL(requestServiceConfiguration(QModelIndex)),
+ this, SLOT(configureService(QModelIndex)));
+
+ ServiceModel* serviceModel = new ServiceModel(this);
+ QSortFilterProxyModel* proxyModel = new QSortFilterProxyModel(this);
+ proxyModel->setSourceModel(serviceModel);
+ proxyModel->setSortRole(Qt::DisplayRole);
+
+ m_listView->setModel(proxyModel);
+ m_listView->setItemDelegate(delegate);
+ m_listView->setVerticalScrollMode(QListView::ScrollPerPixel);
QVBoxLayout* listBoxLayout = new QVBoxLayout(listBox);
- listBoxLayout->addWidget(m_previewPluginsList);
+ listBoxLayout->addWidget(m_listView);
// Create group box "Don't create previews for"
QGroupBox* fileSizeBox = new QGroupBox(i18nc("@title:group", "Do not create previews for"), this);
m_localFileSizeBox = new KIntSpinBox(this);
m_localFileSizeBox->setSingleStep(1);
m_localFileSizeBox->setSuffix(QLatin1String(" MB"));
- m_localFileSizeBox->setRange(0, 9999); /* MB */
+ m_localFileSizeBox->setRange(0, 9999999); /* MB */
QLabel* remoteFileSizeLabel = new QLabel(i18nc("@label Don't create previews for: <Remote files above:> XX MByte",
"Remote files above:"), this);
m_remoteFileSizeBox = new KIntSpinBox(this);
m_remoteFileSizeBox->setSingleStep(1);
m_remoteFileSizeBox->setSuffix(QLatin1String(" MB"));
- m_remoteFileSizeBox->setRange(0, 9999); /* MB */
+ m_remoteFileSizeBox->setRange(0, 9999999); /* MB */
QGridLayout* fileSizeBoxLayout = new QGridLayout(fileSizeBox);
fileSizeBoxLayout->addWidget(localFileSizeLabel, 0, 0, Qt::AlignRight);
loadSettings();
- connect(m_previewPluginsList, SIGNAL(itemClicked(QListWidgetItem*)), this, SIGNAL(changed()));
+ connect(m_listView, SIGNAL(clicked(QModelIndex)), this, SIGNAL(changed()));
connect(m_localFileSizeBox, SIGNAL(valueChanged(int)), this, SIGNAL(changed()));
connect(m_remoteFileSizeBox, SIGNAL(valueChanged(int)), this, SIGNAL(changed()));
}
-
PreviewsSettingsPage::~PreviewsSettingsPage()
{
}
void PreviewsSettingsPage::applySettings()
{
- const int count = m_previewPluginsList->count();
- if (count > 0) {
+ const QAbstractItemModel* model = m_listView->model();
+ const int rowCount = model->rowCount();
+ if (rowCount > 0) {
m_enabledPreviewPlugins.clear();
- for (int i = 0; i < count; ++i) {
- const QListWidgetItem* item = m_previewPluginsList->item(i);
- if (item->checkState() == Qt::Checked) {
- const QString enabledPlugin = item->data(Qt::UserRole).toString();
+ for (int i = 0; i < rowCount; ++i) {
+ const QModelIndex index = model->index(i, 0);
+ const bool checked = model->data(index, Qt::CheckStateRole).toBool();
+ if (checked) {
+ const QString enabledPlugin = model->data(index, Qt::UserRole).toString();
m_enabledPreviewPlugins.append(enabledPlugin);
}
}
KConfigGroup globalConfig(KGlobal::config(), QLatin1String("PreviewSettings"));
globalConfig.writeEntry("Plugins", m_enabledPreviewPlugins);
+ const qulonglong maximumLocalSize = static_cast<qulonglong>(m_localFileSizeBox->value()) * 1024 * 1024;
globalConfig.writeEntry("MaximumSize",
- m_localFileSizeBox->value() * 1024 * 1024,
+ maximumLocalSize,
KConfigBase::Normal | KConfigBase::Global);
+ const qulonglong maximumRemoteSize = static_cast<qulonglong>(m_remoteFileSizeBox->value()) * 1024 * 1024;
globalConfig.writeEntry("MaximumRemoteSize",
- m_remoteFileSizeBox->value() * 1024 * 1024,
+ maximumRemoteSize,
KConfigBase::Normal | KConfigBase::Global);
globalConfig.sync();
}
void PreviewsSettingsPage::showEvent(QShowEvent* event)
{
if (!event->spontaneous() && !m_initialized) {
- QMetaObject::invokeMethod(this, "loadPreviewPlugins", Qt::QueuedConnection);
+ loadPreviewPlugins();
m_initialized = true;
}
SettingsPageBase::showEvent(event);
}
+void PreviewsSettingsPage::configureService(const QModelIndex& index)
+{
+ const QAbstractItemModel* model = index.model();
+ const QString pluginName = model->data(index).toString();
+ const QString desktopEntryName = model->data(index, ServiceModel::DesktopEntryNameRole).toString();
+
+ ConfigurePreviewPluginDialog* dialog = new ConfigurePreviewPluginDialog(pluginName, desktopEntryName, this);
+ dialog->setAttribute(Qt::WA_DeleteOnClose);
+ dialog->show();
+}
+
void PreviewsSettingsPage::loadPreviewPlugins()
{
+ QAbstractItemModel* model = m_listView->model();
+
const KService::List plugins = KServiceTypeTrader::self()->query(QLatin1String("ThumbCreator"));
foreach (const KSharedPtr<KService>& service, plugins) {
- QListWidgetItem* item = new QListWidgetItem(service->name(),
- m_previewPluginsList);
- item->setData(Qt::UserRole, service->desktopEntryName());
+ const bool configurable = service->property("Configurable", QVariant::Bool).toBool();
const bool show = m_enabledPreviewPlugins.contains(service->desktopEntryName());
- item->setCheckState(show ? Qt::Checked : Qt::Unchecked);
+
+ model->insertRow(0);
+ const QModelIndex index = model->index(0, 0);
+ model->setData(index, show, Qt::CheckStateRole);
+ model->setData(index, configurable, ServiceModel::ConfigurableRole);
+ model->setData(index, service->name(), Qt::DisplayRole);
+ model->setData(index, service->desktopEntryName(), ServiceModel::DesktopEntryNameRole);
}
+
+ model->sort(Qt::DisplayRole);
}
void PreviewsSettingsPage::loadSettings()
m_enabledPreviewPlugins = globalConfig.readEntry("Plugins", QStringList()
<< QLatin1String("directorythumbnail")
<< QLatin1String("imagethumbnail")
- << QLatin1String("jpegrotatedthumbnail"));
+ << QLatin1String("jpegthumbnail"));
+
+ // If the user is upgrading from KDE <= 4.6, we must check if he had the 'jpegrotatedthumbnail' plugin enabled.
+ // This plugin does not exist any more in KDE >= 4.7, so we have to replace it with the 'jpegthumbnail' plugin.
+ //
+ // Note that the upgrade to the correct plugin is done already in KFilePreviewGenerator. However, if Konqueror is
+ // opened in web browsing mode and the Settings dialog is opened, we might end up here before KFilePreviewGenerator's
+ // constructor is ever called -> the plugin replacement should be done here as well.
+ if(m_enabledPreviewPlugins.contains(QLatin1String("jpegrotatedthumbnail"))) {
+ m_enabledPreviewPlugins.removeAll(QLatin1String("jpegrotatedthumbnail"));
+ m_enabledPreviewPlugins.append(QLatin1String("jpegthumbnail"));
+ globalConfig.writeEntry("Plugins", m_enabledPreviewPlugins);
+ globalConfig.sync();
+ }
- const int maxLocalByteSize = globalConfig.readEntry("MaximumSize", MaxLocalPreviewSize * 1024 * 1024);
+ const qulonglong defaultLocalPreview = static_cast<qulonglong>(MaxLocalPreviewSize) * 1024 * 1024;
+ const qulonglong maxLocalByteSize = globalConfig.readEntry("MaximumSize", defaultLocalPreview);
const int maxLocalMByteSize = maxLocalByteSize / (1024 * 1024);
m_localFileSizeBox->setValue(maxLocalMByteSize);
- const int maxRemoteByteSize = globalConfig.readEntry("MaximumRemoteSize", MaxRemotePreviewSize * 1024 * 1024);
+ const qulonglong defaultRemotePreview = static_cast<qulonglong>(MaxRemotePreviewSize) * 1024 * 1024;
+ const qulonglong maxRemoteByteSize = globalConfig.readEntry("MaximumRemoteSize", defaultRemotePreview);
const int maxRemoteMByteSize = maxRemoteByteSize / (1024 * 1024);
m_remoteFileSizeBox->setValue(maxRemoteMByteSize);
}