1
// vim: set tabstop=4 shiftwidth=4 noexpandtab
3
Gwenview - A simple image viewer for KDE
4
Copyright 2000-2004 Aur�lien G�teau
6
This program is free software; you can redistribute it and/or
7
modify it under the terms of the GNU General Public License
8
as published by the Free Software Foundation; either version 2
9
of the License, or (at your option) any later version.
11
This program is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
GNU General Public License for more details.
16
You should have received a copy of the GNU General Public License
17
along with this program; if not, write to the Free Software
18
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
#include <qbuttongroup.h>
23
#include <qcheckbox.h>
25
#include <qlineedit.h>
27
#include <qradiobutton.h>
29
#include <qstylesheet.h>
32
#include <kcolorbutton.h>
33
#include <kdeversion.h>
35
#include <kfiledialog.h>
36
#include <kiconloader.h>
38
#include <kio/netaccess.h>
39
#include <kmessagebox.h>
40
#include <kurlrequester.h>
45
#include <libkipi/pluginloader.h>
49
#include "fileoperation.h"
50
#include "gvconfigfileoperationspage.h"
51
#include "gvconfigfullscreenpage.h"
52
#include "gvconfigimagelistpage.h"
53
#include "gvconfigimageviewpage.h"
54
#include "gvconfigmiscpage.h"
55
#include "gvdocument.h"
56
#include "gvfilethumbnailview.h"
57
#include "gvfileviewstack.h"
58
#include "gvmainwindow.h"
59
#include "gvscrollpixmapview.h"
60
#include "thumbnailloadjob.h"
62
#include "gvconfigdialog.moc"
64
class GVConfigDialogPrivate {
66
GVConfigImageViewPage* mImageViewPage;
67
GVConfigImageListPage* mImageListPage;
68
GVConfigFullScreenPage* mFullScreenPage;
69
GVConfigFileOperationsPage* mFileOperationsPage;
70
GVConfigMiscPage* mMiscPage;
71
GVMainWindow* mMainWindow;
73
KIPI::ConfigWidget* mKIPIConfigWidget;
78
// Two helper functions to create the config pages
80
T* addConfigPage(KDialogBase* dialog, const QString& header, const QString& name, const char* iconName) {
82
addConfigPage(dialog, content, header, name, iconName);
87
void addConfigPage(KDialogBase* dialog, T* content, const QString& header, const QString& name, const char* iconName) {
88
QFrame* page=dialog->addPage(name, header, BarIcon(iconName, 32));
89
content->reparent(page, QPoint(0,0));
90
QVBoxLayout* layout=new QVBoxLayout(page, 0, KDialog::spacingHint());
91
layout->addWidget(content);
96
GVConfigDialog::GVConfigDialog(GVMainWindow* mainWindow)
98
KDialogBase::IconList,
100
KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Apply,
107
d=new GVConfigDialogPrivate;
108
d->mMainWindow=mainWindow;
110
// Create dialog pages
111
d->mImageListPage = addConfigPage<GVConfigImageListPage>(
112
this, i18n("Configure Image List"), i18n("Image List"), "view_icon");
114
d->mImageViewPage = addConfigPage<GVConfigImageViewPage>(
115
this, i18n("Configure Image View"), i18n("Image View"), "looknfeel");
117
d->mFullScreenPage = addConfigPage<GVConfigFullScreenPage>(
118
this, i18n("Configure Full Screen Mode"), i18n("Full Screen"), "window_fullscreen");
120
d->mFileOperationsPage = addConfigPage<GVConfigFileOperationsPage>(
121
this, i18n("Configure File Operations"), i18n("File Operations"), "folder");
124
d->mKIPIConfigWidget = mainWindow->pluginLoader()->configWidget(this);
126
this, d->mKIPIConfigWidget, i18n("Configure KIPI Plugins"), i18n("KIPI Plugins"), "kipi");
129
d->mMiscPage = addConfigPage<GVConfigMiscPage>(
130
this, i18n("Miscellaneous Settings"), i18n("Misc"), "gear");
132
GVFileViewStack* fileViewStack=d->mMainWindow->fileViewStack();
133
GVScrollPixmapView* pixmapView=d->mMainWindow->pixmapView();
134
GVDocument* document=d->mMainWindow->document();
137
d->mImageListPage->mThumbnailMargin->setValue(fileViewStack->fileThumbnailView()->marginSize());
138
d->mImageListPage->mWordWrapFilename->setChecked(fileViewStack->fileThumbnailView()->wordWrapIconText());
139
d->mImageListPage->mShowDirs->setChecked(fileViewStack->showDirs());
140
d->mImageListPage->mShownColor->setColor(fileViewStack->shownColor());
141
d->mImageListPage->mStoreThumbnailsInCache->setChecked(ThumbnailLoadJob::storeThumbnailsInCache());
142
d->mImageListPage->mAutoDeleteThumbnailCache->setChecked(d->mMainWindow->showAutoDeleteThumbnailCache());
144
connect(d->mImageListPage->mCalculateCacheSize,SIGNAL(clicked()),
145
this,SLOT(calculateCacheSize()));
146
connect(d->mImageListPage->mEmptyCache,SIGNAL(clicked()),
147
this,SLOT(emptyCache()));
150
d->mImageViewPage->mSmoothGroup->setButton(pixmapView->smoothAlgorithm());
151
d->mImageViewPage->mDelayedSmoothing->setChecked(pixmapView->delayedSmoothing());
152
d->mImageViewPage->mBackgroundColor->setColor(pixmapView->normalBackgroundColor());
153
d->mImageViewPage->mAutoZoomEnlarge->setChecked(pixmapView->enlargeSmallImages());
154
d->mImageViewPage->mShowScrollBars->setChecked(pixmapView->showScrollBars());
155
d->mImageViewPage->mMouseWheelGroup->setButton(pixmapView->mouseWheelScroll()?1:0);
158
d->mFullScreenPage->mOSDModeGroup->setButton(pixmapView->osdMode());
159
d->mFullScreenPage->mFreeOutputFormat->setText(pixmapView->freeOutputFormat());
160
d->mFullScreenPage->mShowBusyPtrInFullScreen->setChecked(d->mMainWindow->showBusyPtrInFullScreen());
162
// File Operations tab
163
d->mFileOperationsPage->mShowCopyDialog->setChecked(FileOperation::confirmCopy());
164
d->mFileOperationsPage->mShowMoveDialog->setChecked(FileOperation::confirmMove());
166
d->mFileOperationsPage->mDefaultDestDir->setURL(FileOperation::destDir());
167
d->mFileOperationsPage->mDefaultDestDir->fileDialog()->setMode(
168
static_cast<KFile::Mode>(KFile::Directory | KFile::ExistingOnly | KFile::LocalOnly));
170
d->mFileOperationsPage->mConfirmBeforeDelete->setChecked(FileOperation::confirmDelete());
171
d->mFileOperationsPage->mDeleteGroup->setButton(FileOperation::deleteToTrash()?1:0);
174
d->mMiscPage->mModifiedBehaviorGroup->setButton( int(document->modifiedBehavior()) );
179
GVConfigDialog::~GVConfigDialog() {
184
void GVConfigDialog::slotOk() {
190
#if QT_VERSION<0x030200
191
// This function emulates int QButtonGroup::selectedId() which does not exist
193
inline int buttonGroupSelectedId(const QButtonGroup* group) {
194
QButton* button=group->selected();
195
if (!button) return -1;
196
return group->id(button);
200
void GVConfigDialog::slotApply() {
201
GVFileViewStack* fileViewStack=d->mMainWindow->fileViewStack();
202
GVScrollPixmapView* pixmapView=d->mMainWindow->pixmapView();
203
GVDocument* document=d->mMainWindow->document();
206
fileViewStack->fileThumbnailView()->setMarginSize(d->mImageListPage->mThumbnailMargin->value());
207
fileViewStack->fileThumbnailView()->setWordWrapIconText(d->mImageListPage->mWordWrapFilename->isChecked());
208
fileViewStack->fileThumbnailView()->arrangeItemsInGrid();
209
fileViewStack->setShowDirs(d->mImageListPage->mShowDirs->isChecked());
210
fileViewStack->setShownColor(d->mImageListPage->mShownColor->color());
211
ThumbnailLoadJob::setStoreThumbnailsInCache(d->mImageListPage->mStoreThumbnailsInCache->isChecked());
212
d->mMainWindow->setAutoDeleteThumbnailCache(d->mImageListPage->mAutoDeleteThumbnailCache->isChecked());
215
#if QT_VERSION>=0x030200
216
int algo=d->mImageViewPage->mSmoothGroup->selectedId();
218
int algo=buttonGroupSelectedId(d->mImageViewPage->mSmoothGroup);
221
pixmapView->setSmoothAlgorithm( static_cast<GVImageUtils::SmoothAlgorithm>(algo));
222
pixmapView->setNormalBackgroundColor(d->mImageViewPage->mBackgroundColor->color());
223
pixmapView->setDelayedSmoothing(d->mImageViewPage->mDelayedSmoothing->isChecked());
224
pixmapView->setEnlargeSmallImages(d->mImageViewPage->mAutoZoomEnlarge->isChecked());
225
pixmapView->setShowScrollBars(d->mImageViewPage->mShowScrollBars->isChecked());
226
pixmapView->setMouseWheelScroll(d->mImageViewPage->mMouseWheelGroup->selected()==d->mImageViewPage->mMouseWheelScroll);
229
#if QT_VERSION>=0x030200
230
int osdMode=d->mFullScreenPage->mOSDModeGroup->selectedId();
232
int osdMode=buttonGroupSelectedId(d->mFullScreenPage->mOSDModeGroup);
234
pixmapView->setOSDMode( static_cast<GVScrollPixmapView::OSDMode>(osdMode) );
235
pixmapView->setFreeOutputFormat( d->mFullScreenPage->mFreeOutputFormat->text() );
236
d->mMainWindow->setShowBusyPtrInFullScreen(d->mFullScreenPage->mShowBusyPtrInFullScreen->isChecked() );
238
// File Operations tab
239
FileOperation::setConfirmCopy(d->mFileOperationsPage->mShowCopyDialog->isChecked());
240
FileOperation::setConfirmMove(d->mFileOperationsPage->mShowMoveDialog->isChecked());
241
FileOperation::setDestDir(d->mFileOperationsPage->mDefaultDestDir->url());
242
FileOperation::setConfirmDelete(d->mFileOperationsPage->mConfirmBeforeDelete->isChecked());
243
FileOperation::setDeleteToTrash(d->mFileOperationsPage->mDeleteGroup->selected()==d->mFileOperationsPage->mDeleteToTrash);
247
d->mKIPIConfigWidget->apply();
251
#if QT_VERSION>=0x030200
252
int behavior=d->mMiscPage->mModifiedBehaviorGroup->selectedId();
254
int behavior=buttonGroupSelectedId(d->mMiscPage->mModifiedBehaviorGroup);
256
document->setModifiedBehavior( static_cast<GVDocument::ModifiedBehavior>(behavior) );
260
void GVConfigDialog::calculateCacheSize() {
262
url.setPath(ThumbnailLoadJob::thumbnailBaseDir());
263
unsigned long size=KDirSize::dirSize(url);
264
KMessageBox::information( this,i18n("Cache size is %1").arg(KIO::convertSize(size)) );
268
void GVConfigDialog::emptyCache() {
269
QString dir=ThumbnailLoadJob::thumbnailBaseDir();
271
if (!QFile::exists(dir)) {
272
KMessageBox::information( this,i18n("Cache is already empty.") );
276
int response=KMessageBox::questionYesNo(this,
277
"<qt>" + i18n("Are you sure you want to empty the thumbnail cache?"
278
" This will remove the folder <b>%1</b>.").arg(QStyleSheet::escape(dir)) + "</qt>");
280
if (response==KMessageBox::No) return;
284
#if KDE_IS_VERSION(3, 2, 0)
285
if (KIO::NetAccess::del(url, 0)) {
287
if (KIO::NetAccess::del(url)) {
289
KMessageBox::information( this,i18n("Cache emptied.") );
294
void GVConfigDialog::onCacheEmptied(KIO::Job* job) {
295
if ( job->error() ) {
296
job->showErrorDialog(this);
299
KMessageBox::information( this,i18n("Cache emptied.") );