1
////////////////////////////////////////////////////////////////////////////////
5
// Copyright (C) 2002-2005 Renchi Raju <renchi at pooh.tam.uiuc.edu>
6
// Gilles Caulier <caulier dot gilles at free.fr>
7
// Copyright (C) 2006 Tom Albers <tomalbers@kde.nl>
9
// This program is free software; you can redistribute it and/or modify
10
// it under the terms of the GNU General Public License as published by
11
// the Free Software Foundation; either version 2 of the License, or
12
// (at your option) any later version.
14
// This program is distributed in the hope that it will be useful,
15
// but WITHOUT ANY WARRANTY; without even the implied warranty of
16
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
// GNU General Public License for more details.
19
// You should have received a copy of the GNU General Public License
20
// along with this program; if not, write to the Free Software
21
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23
//////////////////////////////////////////////////////////////////////////////
1
/* ============================================================
3
* This file is a part of digiKam project
4
* http://www.digikam.org
7
* Description : main digiKam interface implementation
9
* Copyright (C) 2002-2005 by Renchi Raju <renchi@pooh.tam.uiuc.edu>
10
* Copyright (C) 2006 by Tom Albers <tomalbers@kde.nl>
11
* Copyright (C) 2002-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
13
* This program is free software; you can redistribute it
14
* and/or modify it under the terms of the GNU General
15
* Public License as published by the Free Software Foundation;
16
* either version 2, or (at your option)
19
* This program is distributed in the hope that it will be useful,
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
* GNU General Public License for more details.
24
* ============================================================ */
28
28
#include <qdatastream.h>
29
29
#include <qlabel.h>
30
30
#include <qstringlist.h>
31
#include <qkeysequence.h>
32
#include <qwhatsthis.h>
32
33
#include <qsignalmapper.h>
34
#include <qdockarea.h>
39
#include <kaboutdata.h>
39
40
#include <klocale.h>
40
41
#include <kstandarddirs.h>
43
43
#include <kstdaction.h>
44
44
#include <kstdaccel.h>
45
45
#include <kkeydialog.h>
46
46
#include <kedittoolbar.h>
47
#include <kiconloader.h>
48
#include <kpopupmenu.h>
49
49
#include <kdeversion.h>
50
50
#include <kapplication.h>
52
#include <kglobalsettings.h>
53
#include <kfiledialog.h>
51
54
#include <kmessagebox.h>
52
#include <kautomount.h>
53
#include <kio/netaccess.h>
56
using KIO::UDSEntryList;
59
// Includes files for plugins support.
61
#include "kipiinterface.h"
62
#include <libkipi/pluginloader.h>
63
61
#include <libkipi/plugin.h>
63
// LibKDcraw includes.
65
#include <libkdcraw/dcrawbinary.h>
67
#include "albummanager.h"
70
#include "dlogoaction.h"
68
72
#include "albumlister.h"
70
#include "themeengine.h"
71
#include "cameralist.h"
73
#include "albumthumbnailloader.h"
74
#include "albumiconviewfilter.h"
72
75
#include "cameratype.h"
73
76
#include "cameraui.h"
74
#include "albumsettings.h"
76
78
#include "setupplugins.h"
77
79
#include "setupeditor.h"
78
#include "digikamview.h"
79
#include "imagepluginloader.h"
81
#include "rawcameradlg.h"
82
#include "lighttablewindow.h"
80
83
#include "imagewindow.h"
81
#include "digikamapp.h"
82
#include "splashscreen.h"
84
#include "imageinfo.h"
83
85
#include "thumbnailsize.h"
86
#include "themeengine.h"
84
87
#include "scanlib.h"
85
#include "dcrawbinary.h"
88
#include "loadingcacheinterface.h"
89
#include "imageattributeswatch.h"
90
#include "batchthumbsgenerator.h"
91
#include "batchalbumssyncmetadata.h"
92
#include "dcopiface.h"
93
#include "digikamappprivate.h"
94
#include "digikamapp.h"
95
#include "digikamapp.moc"
98
using KIO::UDSEntryList;
104
DigikamApp* DigikamApp::m_instance = 0;
87
106
DigikamApp::DigikamApp()
88
107
: KMainWindow( 0, "Digikam" )
109
d = new DigikamAppPriv;
90
110
m_instance = this;
91
m_config = kapp->config();
97
if(m_config->readBoolEntry("Show Splash", true) &&
111
d->config = kapp->config();
112
d->config->setGroup("General Settings");
114
if(d->config->readBoolEntry("Show Splash", true) &&
98
115
!kapp->isRestored())
100
mSplash = new SplashScreen("digikam-splash.png");
117
d->splashScreen = new SplashScreen("digikam-splash.png");
118
d->splashScreen->show();
103
mAlbumSettings = new AlbumSettings();
104
mAlbumSettings->readSettings();
106
mAlbumManager = AlbumManager::instance();
122
d->splashScreen->message(i18n("Initializing..."), AlignLeft, white);
124
// Register image formats (especially for TIFF )
125
KImageIO::registerFormats();
127
d->albumSettings = new AlbumSettings();
128
d->albumSettings->readSettings();
130
d->albumManager = new Digikam::AlbumManager();
107
132
AlbumLister::instance();
109
mCameraMediaList = new QPopupMenu;
110
connect( mCameraMediaList, SIGNAL( aboutToShow() ),
111
SLOT( slotCameraMediaMenu() ) );
113
mCameraList = new CameraList(this, locateLocal("appdata", "cameras.xml"));
115
connect(mCameraList, SIGNAL(signalCameraAdded(CameraType *)),
134
d->cameraMediaList = new KPopupMenu;
136
connect(d->cameraMediaList, SIGNAL( aboutToShow() ),
137
this, SLOT(slotCameraMediaMenu()));
139
d->cameraList = new CameraList(this, locateLocal("appdata", "cameras.xml"));
141
connect(d->cameraList, SIGNAL(signalCameraAdded(CameraType *)),
116
142
this, SLOT(slotCameraAdded(CameraType *)));
118
connect(mCameraList, SIGNAL(signalCameraRemoved(CameraType *)),
144
connect(d->cameraList, SIGNAL(signalCameraRemoved(CameraType *)),
119
145
this, SLOT(slotCameraRemoved(CameraType *)));
123
updateDeleteTrashMenu();
125
applyMainWindowSettings(m_config);
127
mAlbumManager->setLibraryPath(mAlbumSettings->getAlbumLibraryPath());
128
mAlbumManager->startScan();
152
applyMainWindowSettings(d->config);
154
// Check ICC profiles repository availability
157
d->splashScreen->message(i18n("Checking ICC repository"), AlignLeft, white);
159
d->validIccPath = SetupICC::iccRepositoryIsValid();
161
// Check witch dcraw version available
164
d->splashScreen->message(i18n("Checking dcraw version"), AlignLeft, white);
166
KDcrawIface::DcrawBinary::instance()->checkSystem();
169
d->splashScreen->message(i18n("Scan Albums"), AlignLeft, white);
171
d->albumManager->setLibraryPath(d->albumSettings->getAlbumLibraryPath(), d->splashScreen);
173
// Read albums from database
175
d->splashScreen->message(i18n("Reading database"), AlignLeft, white);
177
d->albumManager->startScan();
130
179
// Load KIPI Plugins.
169
237
void DigikamApp::show()
239
// Remove Splashscreen.
173
mSplash->finish(this);
243
d->splashScreen->finish(this);
244
delete d->splashScreen;
248
// Display application window.
177
250
KMainWindow::show();
252
// Report errors from ICC repository path.
256
QString message = i18n("<qt><p>ICC profiles path seems to be invalid.</p>"
257
"<p>If you want to set it now, select \"Yes\", otherwise "
258
"select \"No\". In this case, \"Color Management\" feature "
259
"will be disabled until you solve this issue</p></qt>");
261
if (KMessageBox::warningYesNo(this, message) == KMessageBox::Yes)
265
d->config->setGroup("Color Management");
266
d->config->writeEntry("EnableCM", false);
272
d->config->setGroup("Color Management");
273
d->config->writeEntry("EnableCM", false);
278
// Report errors from dcraw detection.
279
KDcrawIface::DcrawBinary::instance()->checkReport();
281
// Init album icon view zoom factor.
282
slotThumbSizeChanged(d->albumSettings->getDefaultIconSize());
180
285
const QPtrList<KAction>& DigikamApp::menuImageActions()
182
return m_kipiImageActions;
287
return d->kipiImageActions;
185
290
const QPtrList<KAction>& DigikamApp::menuBatchActions()
187
return m_kipiBatchActions;
292
return d->kipiBatchActions;
190
295
const QPtrList<KAction>& DigikamApp::menuAlbumActions()
192
return m_kipiAlbumActions;
297
return d->kipiAlbumActions;
195
300
const QPtrList<KAction> DigikamApp::menuImportActions()
197
302
QPtrList<KAction> importMenu;
198
importMenu = m_kipiFileActionsImport;
199
importMenu.append( mAlbumImportAction );
200
importMenu.append( mAddImagesAction );
303
importMenu = d->kipiFileActionsImport;
304
importMenu.append( d->albumImportAction );
305
importMenu.append( d->addImagesAction );
201
306
return importMenu;
309
const QPtrList<KAction> DigikamApp::menuExportActions()
311
return d->kipiFileActionsExport;
204
314
void DigikamApp::autoDetect()
206
// Auto-detect camera if requested so
208
mSplash->message(i18n("Auto-detect camera"), AlignLeft, white);
316
// Called from main if command line option is set
319
d->splashScreen->message(i18n("Auto-detect camera"), AlignLeft, white);
209
321
QTimer::singleShot(0, this, SLOT(slotCameraAutoDetect()));
212
324
void DigikamApp::downloadFrom(const QString &cameraGuiPath)
326
// Called from main if command line option is set
214
328
if (!cameraGuiPath.isNull())
216
mCameraGuiPath = cameraGuiPath;
219
mSplash->message(i18n("Opening Download Dialog"), AlignLeft, white);
330
d->cameraGuiPath = cameraGuiPath;
333
d->splashScreen->message(i18n("Opening Download Dialog"), AlignLeft, white);
221
335
QTimer::singleShot(0, this, SLOT(slotDownloadImages()));
225
339
bool DigikamApp::queryClose()
341
if (ImageWindow::imagewindowCreated())
343
return ImageWindow::imagewindow()->queryClose();
230
349
void DigikamApp::setupView()
232
mView = new DigikamView(this);
233
setCentralWidget(mView);
234
mView->applySettings(mAlbumSettings);
236
connect(mView, SIGNAL(signal_albumSelected(bool)),
237
this, SLOT(slot_albumSelected(bool)));
238
connect(mView, SIGNAL(signal_tagSelected(bool)),
239
this, SLOT(slot_tagSelected(bool)));
241
connect(mView, SIGNAL(signal_imageSelected(bool)),
242
this, SLOT(slot_imageSelected(bool)));
352
d->splashScreen->message(i18n("Initializing Main View"), AlignLeft, white);
354
d->view = new DigikamView(this);
355
setCentralWidget(d->view);
356
d->view->applySettings();
358
connect(d->view, SIGNAL(signalAlbumSelected(bool)),
359
this, SLOT(slotAlbumSelected(bool)));
361
connect(d->view, SIGNAL(signalTagSelected(bool)),
362
this, SLOT(slotTagSelected(bool)));
364
connect(d->view, SIGNAL(signalImageSelected(const QPtrList<ImageInfo>&, bool, bool, const KURL::List&)),
365
this, SLOT(slotImageSelected(const QPtrList<ImageInfo>&, bool, bool, const KURL::List&)));
368
void DigikamApp::setupStatusBar()
370
d->statusProgressBar = new StatusProgressBar(statusBar());
371
d->statusProgressBar->setAlignment(Qt::AlignLeft|Qt::AlignVCenter);
372
d->statusProgressBar->setMaximumHeight(fontMetrics().height()+4);
373
statusBar()->addWidget(d->statusProgressBar, 100, true);
375
//------------------------------------------------------------------------------
377
d->albumIconViewFilter = new AlbumIconViewFilter(statusBar());
378
d->albumIconViewFilter->setMaximumHeight(fontMetrics().height()+4);
379
statusBar()->addWidget(d->albumIconViewFilter, 100, true);
381
//------------------------------------------------------------------------------
383
d->statusZoomBar = new StatusZoomBar(statusBar());
384
d->statusZoomBar->setMaximumHeight(fontMetrics().height()+4);
385
statusBar()->addWidget(d->statusZoomBar, 1, true);
387
//------------------------------------------------------------------------------
389
d->statusNavigateBar = new StatusNavigateBar(statusBar());
390
d->statusNavigateBar->setMaximumHeight(fontMetrics().height()+4);
391
statusBar()->addWidget(d->statusNavigateBar, 1, true);
393
//------------------------------------------------------------------------------
395
connect(d->statusZoomBar, SIGNAL(signalZoomMinusClicked()),
396
d->view, SLOT(slotZoomOut()));
398
connect(d->statusZoomBar, SIGNAL(signalZoomPlusClicked()),
399
d->view, SLOT(slotZoomIn()));
401
connect(d->statusZoomBar, SIGNAL(signalZoomSliderChanged(int)),
402
this, SLOT(slotZoomSliderChanged(int)));
404
connect(d->view, SIGNAL(signalThumbSizeChanged(int)),
405
this, SLOT(slotThumbSizeChanged(int)));
407
connect(d->view, SIGNAL(signalZoomChanged(double, int)),
408
this, SLOT(slotZoomChanged(double, int)));
410
connect(d->view, SIGNAL(signalTogglePreview(bool)),
411
this, SLOT(slotTogglePreview(bool)));
413
connect(d->albumIconViewFilter, SIGNAL(signalResetTagFilters()),
414
this, SIGNAL(signalResetTagFilters()));
416
connect(d->statusNavigateBar, SIGNAL(signalFirstItem()),
417
d->view, SLOT(slotFirstItem()));
419
connect(d->statusNavigateBar, SIGNAL(signalNextItem()),
420
d->view, SLOT(slotNextItem()));
422
connect(d->statusNavigateBar, SIGNAL(signalPrevItem()),
423
d->view, SLOT(slotPrevItem()));
425
connect(d->statusNavigateBar, SIGNAL(signalLastItem()),
426
d->view, SLOT(slotLastItem()));
428
connect(d->statusProgressBar, SIGNAL(signalCancelButtonPressed()),
429
this, SIGNAL(signalCancelButtonPressed()));
432
void DigikamApp::setupAccelerators()
434
d->accelerators = new KAccel(this);
436
d->accelerators->insert("Exit Preview Mode", i18n("Exit Preview"),
437
i18n("Exit preview mode"),
438
Key_Escape, this, SIGNAL(signalEscapePressed()),
441
d->accelerators->insert("Next Image Key_Space", i18n("Next Image"),
443
Key_Space, this, SIGNAL(signalNextItem()),
446
d->accelerators->insert("Previous Image SHIFT+Key_Space", i18n("Previous Image"),
447
i18n("Previous Image"),
448
SHIFT+Key_Space, this, SIGNAL(signalPrevItem()),
451
d->accelerators->insert("Previous Image Key_Backspace", i18n("Previous Image"),
452
i18n("Previous Image"),
453
Key_Backspace, this, SIGNAL(signalPrevItem()),
456
d->accelerators->insert("Next Image Key_Next", i18n("Next Image"),
458
Key_Next, this, SIGNAL(signalNextItem()),
461
d->accelerators->insert("Previous Image Key_Prior", i18n("Previous Image"),
462
i18n("Previous Image"),
463
Key_Prior, this, SIGNAL(signalPrevItem()),
466
d->accelerators->insert("First Image Key_Home", i18n("First Image"),
468
Key_Home, this, SIGNAL(signalFirstItem()),
471
d->accelerators->insert("Last Image Key_End", i18n("Last Image"),
473
Key_End, this, SIGNAL(signalLastItem()),
476
d->accelerators->insert("Copy Album Items Selection CTRL+Key_C", i18n("Copy Album Items Selection"),
477
i18n("Copy Album Items Selection"),
478
CTRL+Key_C, this, SIGNAL(signalCopyAlbumItemsSelection()),
481
d->accelerators->insert("Paste Album Items Selection CTRL+Key_V", i18n("Paste Album Items Selection"),
482
i18n("Paste Album Items Selection"),
483
CTRL+Key_V, this, SIGNAL(signalPasteAlbumItemsSelection()),
245
487
void DigikamApp::setupActions()
247
489
// -----------------------------------------------------------------
249
mCameraMenuAction = new KActionMenu(i18n("&Camera"),
491
d->cameraMenuAction = new KActionMenu(i18n("&Camera"),
251
493
actionCollection(),
253
mCameraMenuAction->setDelayed(false);
255
// -----------------------------------------------------------------
257
mThemeMenuAction = new KSelectAction(i18n("&Themes"), 0,
260
connect(mThemeMenuAction, SIGNAL(activated(const QString&)),
261
SLOT(slotChangeTheme(const QString&)));
263
// -----------------------------------------------------------------
265
mBackwardActionMenu = new KToolBarPopupAction(i18n("&Back"),
495
d->cameraMenuAction->setDelayed(false);
497
// -----------------------------------------------------------------
499
d->themeMenuAction = new KSelectAction(i18n("&Themes"), 0, actionCollection(), "theme_menu");
500
connect(d->themeMenuAction, SIGNAL(activated(const QString&)),
501
this, SLOT(slotChangeTheme(const QString&)));
503
connect(ThemeEngine::instance(), SIGNAL(signalThemeChanged()),
504
this, SLOT(slotThemeChanged()));
506
// -----------------------------------------------------------------
508
d->backwardActionMenu = new KToolBarPopupAction(i18n("&Back"),
269
512
SLOT(slotAlbumHistoryBack()),
270
513
actionCollection(),
272
mBackwardActionMenu->setEnabled(false);
273
connect(mBackwardActionMenu->popupMenu(),
274
SIGNAL(aboutToShow()),
276
SLOT(slotAboutToShowBackwardMenu()));
277
connect(mBackwardActionMenu->popupMenu(),
278
SIGNAL(activated(int)),
280
SLOT(slotAlbumHistoryBack(int)));
282
mForwardActionMenu = new KToolBarPopupAction(i18n("Forward"),
515
d->backwardActionMenu->setEnabled(false);
517
connect(d->backwardActionMenu->popupMenu(), SIGNAL(aboutToShow()),
518
this, SLOT(slotAboutToShowBackwardMenu()));
520
connect(d->backwardActionMenu->popupMenu(), SIGNAL(activated(int)),
521
d->view, SLOT(slotAlbumHistoryBack(int)));
523
d->forwardActionMenu = new KToolBarPopupAction(i18n("Forward"),
286
527
SLOT(slotAlbumHistoryForward()),
287
528
actionCollection(),
288
529
"album_forward");
289
mForwardActionMenu->setEnabled(false);
290
connect(mForwardActionMenu->popupMenu(),
291
SIGNAL(aboutToShow()),
293
SLOT(slotAboutToShowForwardMenu()));
294
connect(mForwardActionMenu->popupMenu(),
295
SIGNAL(activated(int)),
297
SLOT(slotAlbumHistoryForward(int)));
299
mNewAction = new KAction(i18n("&New Album..."),
301
KStdAccel::shortcut(KStdAccel::New),
303
SLOT(slot_newAlbum()),
306
mNewAction->setWhatsThis(i18n("This option creates a new empty Album in the database."));
308
mAlbumSortAction = new KSelectAction(i18n("&Sort Albums"),
530
d->forwardActionMenu->setEnabled(false);
532
connect(d->forwardActionMenu->popupMenu(), SIGNAL(aboutToShow()),
533
this, SLOT(slotAboutToShowForwardMenu()));
535
connect(d->forwardActionMenu->popupMenu(), SIGNAL(activated(int)),
536
d->view, SLOT(slotAlbumHistoryForward(int)));
538
d->newAction = new KAction(i18n("&New..."),
540
KStdAccel::shortcut(KStdAccel::New),
542
SLOT(slotNewAlbum()),
545
d->newAction->setWhatsThis(i18n("Creates a new empty Album in the database."));
547
d->albumSortAction = new KSelectAction(i18n("&Sort Albums"),
311
550
actionCollection(),
314
connect(mAlbumSortAction, SIGNAL(activated(int)),
315
mView, SLOT(slot_sortAlbums(int)));
553
connect(d->albumSortAction, SIGNAL(activated(int)),
554
d->view, SLOT(slotSortAlbums(int)));
317
556
// Use same list order as in albumsettings enum
318
557
QStringList sortActionList;
319
558
sortActionList.append(i18n("By Folder"));
320
559
sortActionList.append(i18n("By Collection"));
321
560
sortActionList.append(i18n("By Date"));
322
mAlbumSortAction->setItems(sortActionList);
324
mDeleteAction = new KAction(i18n("Delete Album"),
561
d->albumSortAction->setItems(sortActionList);
563
d->recurseAlbumsAction = new KToggleAction(i18n("Include Album Sub-Tree"),
569
d->recurseAlbumsAction->setWhatsThis(i18n("Activate this option to recursively show all sub-albums below "
570
"the current album."));
572
connect(d->recurseAlbumsAction, SIGNAL(toggled(bool)),
573
this, SLOT(slotRecurseAlbums(bool)));
575
d->recurseTagsAction = new KToggleAction(i18n("Include Tag Sub-Tree"),
581
d->recurseTagsAction->setWhatsThis(i18n("Activate this option to show all images marked by the given tag "
582
"and its all its sub-tags."));
584
connect(d->recurseTagsAction, SIGNAL(toggled(bool)),
585
this, SLOT(slotRecurseTags(bool)));
587
d->deleteAction = new KAction(i18n("Delete"),
328
SLOT(slot_deleteAlbum()),
591
SLOT(slotDeleteAlbum()),
329
592
actionCollection(),
332
mAddImagesAction = new KAction( i18n("Add Images..."),
595
d->addImagesAction = new KAction( i18n("Add Images..."),
596
"albumfolder-importimages",
336
SLOT(slot_albumAddImages()),
599
SLOT(slotAlbumAddImages()),
337
600
actionCollection(),
338
601
"album_addImages");
339
mAddImagesAction->setWhatsThis(i18n("This option adds new images to the current Album."));
602
d->addImagesAction->setWhatsThis(i18n("Adds new items to the current Album."));
341
mAlbumImportAction = new KAction( i18n("Import Folders..."),
604
d->albumImportAction = new KAction( i18n("Add Folders..."),
605
"albumfolder-importdir",
345
608
SLOT(slotAlbumImportFolder()),
346
609
actionCollection(),
347
610
"album_importFolder");
350
mPropsEditAction = new KAction( i18n("Edit Album Properties..."),
351
"albumfoldercomment",
612
d->propsEditAction = new KAction( i18n("Properties..."),
613
"albumfolder-properties",
354
SLOT(slot_albumPropsEdit()),
616
SLOT(slotAlbumPropsEdit()),
355
617
actionCollection(),
356
618
"album_propsEdit");
357
mPropsEditAction->setWhatsThis(i18n("This option allows you to set the Album Properties information "
358
"about the Collection."));
360
mOpenInKonquiAction = new KAction( i18n("Open in Konqueror"),
619
d->propsEditAction->setWhatsThis(i18n("Edit Album Properties and Collection information."));
621
d->refreshAlbumAction = new KAction( i18n("Refresh"),
625
SLOT(slotAlbumRefresh()),
628
d->refreshAlbumAction->setWhatsThis(i18n("Refresh all album contents"));
630
d->syncAlbumMetadataAction = new KAction( i18n("Synchronize images with database"),
634
SLOT(slotAlbumSyncPicturesMetadata()),
636
"album_syncmetadata");
637
d->syncAlbumMetadataAction->setWhatsThis(i18n("Updates all image metadata of the current "
638
"album with the contents of the digiKam database "
639
"(image metadata will be over-written with data from the database)."));
641
d->openInKonquiAction = new KAction( i18n("Open in Konqueror"),
364
SLOT(slot_albumOpenInKonqui()),
645
SLOT(slotAlbumOpenInKonqui()),
365
646
actionCollection(),
366
647
"album_openinkonqui");
368
649
// -----------------------------------------------------------
370
mNewTagAction = new KAction(i18n("New &Tag..."), "tag",
371
0, mView, SLOT(slotNewTag()),
651
d->newTagAction = new KAction(i18n("New &Tag..."), "tag-new",
652
0, d->view, SLOT(slotNewTag()),
372
653
actionCollection(), "tag_new");
374
mDeleteTagAction = new KAction(i18n("Delete Tag"), "tag",
375
0, mView, SLOT(slotDeleteTag()),
655
d->editTagAction = new KAction(i18n("Edit Tag Properties..."), "tag-properties",
656
0, d->view, SLOT(slotEditTag()),
657
actionCollection(), "tag_edit");
659
d->deleteTagAction = new KAction(i18n("Delete Tag"), "tag-delete",
660
0, d->view, SLOT(slotDeleteTag()),
376
661
actionCollection(), "tag_delete");
378
mEditTagAction = new KAction( i18n("Edit Tag Properties..."), "tag",
379
0, mView, SLOT(slotEditTag()),
380
actionCollection(), "tag_edit");
382
663
// -----------------------------------------------------------
384
mImageViewAction = new KAction(i18n("View/Edit..."),
665
d->imagePreviewAction = new KToggleAction(i18n("View..."),
669
SLOT(slotImagePreview()),
673
d->imageViewAction = new KAction(i18n("Edit..."),
388
SLOT(slot_imageView()),
391
mImageViewAction->setWhatsThis(i18n("This option allows you to open the Image Editor with the currently selected "
394
mImageCommentsAction = new KAction(i18n("Edit Image Comments && Tags..."),
398
SLOT(slot_imageCommentsEdit()),
401
mImageCommentsAction->setWhatsThis(i18n("This option allows you to edit the comments and tags of the currently "
404
mImageRenameAction = new KAction(i18n("Rename..."),
677
SLOT(slotImageEdit()),
680
d->imageViewAction->setWhatsThis(i18n("Open the selected item in the image editor."));
682
d->imageLightTableAction = new KAction(i18n("Place onto Light Table"),
686
SLOT(slotImageLightTable()),
689
d->imageLightTableAction->setWhatsThis(i18n("Place the selected items on the light table thumbbar."));
691
d->imageAddLightTableAction = new KAction(i18n("Add to Light Table"),
695
SLOT(slotImageAddToLightTable()),
697
"image_add_to_lighttable");
698
d->imageAddLightTableAction->setWhatsThis(i18n("Add selected items to the light table thumbbar."));
700
d->imageRenameAction = new KAction(i18n("Rename..."),
408
SLOT(slot_imageRename()),
704
SLOT(slotImageRename()),
409
705
actionCollection(),
411
mImageRenameAction->setWhatsThis(i18n("This option allows you to rename the filename of the currently selected "
414
mImageDeleteAction = new KAction(i18n("Delete"),
418
SLOT(slot_imageDelete()),
422
mImagePropsAction = new KAction(i18n("Properties"),
426
SLOT(slotImageProperties()),
429
mImagePropsAction->setWhatsThis(i18n("This option allows you to display the file properties, the meta-data "
430
"and the histogram of the currently selected image."));
432
mImageSortAction = new KSelectAction(i18n("&Sort Images"),
438
connect(mImageSortAction, SIGNAL(activated(int)),
439
mView, SLOT(slotSortImages(int)));
707
d->imageRenameAction->setWhatsThis(i18n("Change the filename of the currently selected item."));
709
// Pop up dialog to ask user whether to move to trash
710
d->imageDeleteAction = new KAction(i18n("Delete"),
714
SLOT(slotImageDelete()),
718
// Pop up dialog to ask user whether to permanently delete
719
d->imageDeletePermanentlyAction = new KAction(i18n("Delete permanently"),
723
SLOT(slotImageDeletePermanently()),
725
"image_delete_permanently");
727
// These two actions are hidden, no menu entry, no toolbar entry, no shortcut.
728
// Power users may add them.
729
d->imageDeletePermanentlyDirectlyAction = new KAction(i18n("Delete permanently without confirmation"),
733
SLOT(slotImageDeletePermanentlyDirectly()),
735
"image_delete_permanently_directly");
737
d->imageTrashDirectlyAction = new KAction(i18n("Move to trash without confirmation"),
741
SLOT(slotImageTrashDirectly()),
743
"image_trash_directly");
745
d->imageSortAction = new KSelectAction(i18n("&Sort Images"),
751
connect(d->imageSortAction, SIGNAL(activated(int)),
752
d->view, SLOT(slotSortImages(int)));
441
754
// Use same list order as in albumsettings enum
442
755
QStringList sortImagesActionList;
445
758
sortImagesActionList.append(i18n("By Date"));
446
759
sortImagesActionList.append(i18n("By File Size"));
447
760
sortImagesActionList.append(i18n("By Rating"));
448
mImageSortAction->setItems(sortImagesActionList);
450
// -----------------------------------------------------------------
452
QSignalMapper *exifOrientationMapper = new QSignalMapper( mView );
453
connect( exifOrientationMapper, SIGNAL( mapped( int ) ),
454
mView, SLOT( slot_imageExifOrientation( int ) ) );
456
mImageExifOrientationActionMenu = new KActionMenu(i18n("Correct Exif Orientation Tag"),
458
"image_set_exif_orientation");
459
mImageExifOrientationActionMenu->setDelayed(false);
461
mImageSetExifOrientation1Action =
462
new KAction(i18n("Normal"),0,mImageExifOrientationActionMenu);
463
mImageSetExifOrientation2Action =
464
new KAction(i18n("Flipped Horizontally"),0,mImageExifOrientationActionMenu);
465
mImageSetExifOrientation3Action =
466
new KAction(i18n("Rotated 180 Degrees"),0,mImageExifOrientationActionMenu);
467
mImageSetExifOrientation4Action =
468
new KAction(i18n("Flipped Vertically"),0,mImageExifOrientationActionMenu);
469
mImageSetExifOrientation5Action =
470
new KAction(i18n("Rotated 90 Degrees / Horiz. Flipped"),
471
0, mImageExifOrientationActionMenu);
472
mImageSetExifOrientation6Action =
473
new KAction(i18n("Rotated 90 Degrees"),0,mImageExifOrientationActionMenu);
474
mImageSetExifOrientation7Action =
475
new KAction(i18n("Rotated 90 Degrees / Vert. Flipped"),
476
0, mImageExifOrientationActionMenu);
477
mImageSetExifOrientation8Action =
478
new KAction(i18n("Rotated 270 Degrees"),0,mImageExifOrientationActionMenu);
480
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation1Action);
481
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation2Action);
482
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation3Action);
483
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation4Action);
484
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation5Action);
485
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation6Action);
486
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation7Action);
487
mImageExifOrientationActionMenu->insert(mImageSetExifOrientation8Action);
489
connect( mImageSetExifOrientation1Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
490
connect( mImageSetExifOrientation2Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
491
connect( mImageSetExifOrientation3Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
492
connect( mImageSetExifOrientation4Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
493
connect( mImageSetExifOrientation5Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
494
connect( mImageSetExifOrientation6Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
495
connect( mImageSetExifOrientation7Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
496
connect( mImageSetExifOrientation8Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) );
498
exifOrientationMapper->setMapping( mImageSetExifOrientation1Action, 1);
499
exifOrientationMapper->setMapping( mImageSetExifOrientation2Action, 2);
500
exifOrientationMapper->setMapping( mImageSetExifOrientation3Action, 3);
501
exifOrientationMapper->setMapping( mImageSetExifOrientation4Action, 4);
502
exifOrientationMapper->setMapping( mImageSetExifOrientation5Action, 5);
503
exifOrientationMapper->setMapping( mImageSetExifOrientation6Action, 6);
504
exifOrientationMapper->setMapping( mImageSetExifOrientation7Action, 7);
505
exifOrientationMapper->setMapping( mImageSetExifOrientation8Action, 8);
507
// -----------------------------------------------------------------
509
mSelectAllAction = new KAction(i18n("Select All"),
513
SLOT(slotSelectAll()),
517
mSelectNoneAction = new KAction(i18n("Select None"),
521
SLOT(slotSelectNone()),
525
mSelectInvertAction = new KAction(i18n("Invert Selection"),
529
SLOT(slotSelectInvert()),
761
d->imageSortAction->setItems(sortImagesActionList);
763
// -----------------------------------------------------------------
765
QSignalMapper *exifOrientationMapper = new QSignalMapper( d->view );
767
connect(exifOrientationMapper, SIGNAL(mapped(int) ),
768
d->view, SLOT(slotImageExifOrientation(int)));
770
d->imageExifOrientationActionMenu = new KActionMenu(i18n("Adjust Exif orientation tag"),
772
"image_set_exif_orientation");
773
d->imageExifOrientationActionMenu->setDelayed(false);
775
d->imageSetExifOrientation1Action =
776
new KAction(i18n("Normal"),0,d->imageExifOrientationActionMenu);
777
d->imageSetExifOrientation2Action =
778
new KAction(i18n("Flipped Horizontally"),0,d->imageExifOrientationActionMenu);
779
d->imageSetExifOrientation3Action =
780
new KAction(i18n("Rotated upside down"),0,d->imageExifOrientationActionMenu);
781
d->imageSetExifOrientation4Action =
782
new KAction(i18n("Flipped Vertically"),0,d->imageExifOrientationActionMenu);
783
d->imageSetExifOrientation5Action =
784
new KAction(i18n("Rotated right / Horiz. Flipped"), 0, d->imageExifOrientationActionMenu);
785
d->imageSetExifOrientation6Action =
786
new KAction(i18n("Rotated right"),0,d->imageExifOrientationActionMenu);
787
d->imageSetExifOrientation7Action =
788
new KAction(i18n("Rotated right / Vert. Flipped"), 0, d->imageExifOrientationActionMenu);
789
d->imageSetExifOrientation8Action =
790
new KAction(i18n("Rotated left"),0,d->imageExifOrientationActionMenu);
792
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation1Action);
793
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation2Action);
794
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation3Action);
795
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation4Action);
796
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation5Action);
797
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation6Action);
798
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation7Action);
799
d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation8Action);
801
connect(d->imageSetExifOrientation1Action, SIGNAL(activated()),
802
exifOrientationMapper, SLOT(map()));
804
connect(d->imageSetExifOrientation2Action, SIGNAL(activated()),
805
exifOrientationMapper, SLOT(map()));
807
connect(d->imageSetExifOrientation3Action, SIGNAL(activated()),
808
exifOrientationMapper, SLOT(map()));
810
connect(d->imageSetExifOrientation4Action, SIGNAL(activated()),
811
exifOrientationMapper, SLOT(map()));
813
connect(d->imageSetExifOrientation5Action, SIGNAL(activated()),
814
exifOrientationMapper, SLOT(map()));
816
connect(d->imageSetExifOrientation6Action, SIGNAL(activated()),
817
exifOrientationMapper, SLOT(map()));
819
connect(d->imageSetExifOrientation7Action, SIGNAL(activated()),
820
exifOrientationMapper, SLOT(map()));
822
connect(d->imageSetExifOrientation8Action, SIGNAL(activated()),
823
exifOrientationMapper, SLOT(map()));
825
exifOrientationMapper->setMapping(d->imageSetExifOrientation1Action, 1);
826
exifOrientationMapper->setMapping(d->imageSetExifOrientation2Action, 2);
827
exifOrientationMapper->setMapping(d->imageSetExifOrientation3Action, 3);
828
exifOrientationMapper->setMapping(d->imageSetExifOrientation4Action, 4);
829
exifOrientationMapper->setMapping(d->imageSetExifOrientation5Action, 5);
830
exifOrientationMapper->setMapping(d->imageSetExifOrientation6Action, 6);
831
exifOrientationMapper->setMapping(d->imageSetExifOrientation7Action, 7);
832
exifOrientationMapper->setMapping(d->imageSetExifOrientation8Action, 8);
834
// -----------------------------------------------------------------
836
d->selectAllAction = new KAction(i18n("Select All"),
840
SLOT(slotSelectAll()),
844
d->selectNoneAction = new KAction(i18n("Select None"),
848
SLOT(slotSelectNone()),
852
d->selectInvertAction = new KAction(i18n("Invert Selection"),
856
SLOT(slotSelectInvert()),
533
860
// -----------------------------------------------------------
578
952
actionCollection(),
581
mTipAction = KStdAction::tipOfDay(this,
955
d->tipAction = KStdAction::tipOfDay(this,
582
956
SLOT(slotShowTip()),
583
957
actionCollection(),
584
958
"help_tipofday");
586
mGammaAdjustmentAction = new KAction(i18n("Gamma Adjustment..."),
960
d->donateMoneyAction = new KAction(i18n("Donate..."),
590
SLOT(slot_gammaAdjustment()),
964
SLOT(slotDonateMoney()),
591
965
actionCollection(),
968
d->contributeAction = new KAction(i18n("Contribute..."),
970
this, SLOT(slotContribute()),
974
new DLogoAction(actionCollection(), "logo_action" );
594
976
// -- Rating actions ---------------------------------------------------------------
596
m_0Star = new KAction(i18n("No Star"), CTRL+Key_0,
597
mView, SLOT(slotAssignRatingNoStar()),
598
actionCollection(), "imageview_ratenostar");
599
m_1Star = new KAction(i18n("One Star"), CTRL+Key_1,
600
mView, SLOT(slotAssignRatingOneStar()),
601
actionCollection(), "imageview_rateonestar");
602
m_2Star = new KAction(i18n("Two Star"), CTRL+Key_2,
603
mView, SLOT(slotAssignRatingTwoStar()),
604
actionCollection(), "imageview_ratetwostar");
605
m_3Star = new KAction(i18n("Three Star"), CTRL+Key_3,
606
mView, SLOT(slotAssignRatingThreeStar()),
607
actionCollection(), "imageview_ratethreestar");
608
m_4Star = new KAction(i18n("Four Star"), CTRL+Key_4,
609
mView, SLOT(slotAssignRatingFourStar()),
610
actionCollection(), "imageview_ratefourstar");
611
m_5Star = new KAction(i18n("Five Star"), CTRL+Key_5,
612
mView, SLOT(slotAssignRatingFiveStar()),
613
actionCollection(), "imageview_ratefivestar");
978
d->rating0Star = new KAction(i18n("Assign Rating \"No Stars\""), CTRL+Key_0,
979
d->view, SLOT(slotAssignRatingNoStar()),
980
actionCollection(), "ratenostar");
981
d->rating1Star = new KAction(i18n("Assign Rating \"One Star\""), CTRL+Key_1,
982
d->view, SLOT(slotAssignRatingOneStar()),
983
actionCollection(), "rateonestar");
984
d->rating2Star = new KAction(i18n("Assign Rating \"Two Stars\""), CTRL+Key_2,
985
d->view, SLOT(slotAssignRatingTwoStar()),
986
actionCollection(), "ratetwostar");
987
d->rating3Star = new KAction(i18n("Assign Rating \"Three Stars\""), CTRL+Key_3,
988
d->view, SLOT(slotAssignRatingThreeStar()),
989
actionCollection(), "ratethreestar");
990
d->rating4Star = new KAction(i18n("Assign Rating \"Four Stars\""), CTRL+Key_4,
991
d->view, SLOT(slotAssignRatingFourStar()),
992
actionCollection(), "ratefourstar");
993
d->rating5Star = new KAction(i18n("Assign Rating \"Five Stars\""), CTRL+Key_5,
994
d->view, SLOT(slotAssignRatingFiveStar()),
995
actionCollection(), "ratefivestar");
615
997
// -----------------------------------------------------------
617
KAction* findAction = KStdAction::find(mView, SLOT(slotNewQuickSearch()),
999
KAction* findAction = KStdAction::find(d->view, SLOT(slotNewQuickSearch()),
618
1000
actionCollection(), "search_quick");
619
findAction->setText(i18n("Quick Search..."));
621
findAction = KStdAction::find(mView, SLOT(slotNewAdvancedSearch()),
622
actionCollection(), "search_advanced");
623
findAction->setText(i18n("Advanced Search..."));
624
findAction->setShortcut("Ctrl+Alt+F");
1001
findAction->setText(i18n("Search..."));
1002
findAction->setIconSet(BarIcon("filefind"));
1004
KAction* advFindAction = KStdAction::find(d->view, SLOT(slotNewAdvancedSearch()),
1005
actionCollection(), "search_advanced");
1006
advFindAction->setText(i18n("Advanced Search..."));
1007
advFindAction->setShortcut("Ctrl+Alt+F");
1009
new KAction(i18n("Light Table"), "idea", SHIFT+Key_F6,
1010
d->view, SLOT(slotLightTable()), actionCollection(),
626
1013
new KAction(i18n("Scan for New Images"), "reload_page", 0,
627
1014
this, SLOT(slotDatabaseRescan()), actionCollection(),
628
1015
"database_rescan");
1017
new KAction(i18n("Rebuild all Thumbnails..."), "reload_page", 0,
1018
this, SLOT(slotRebuildAllThumbs()), actionCollection(),
1021
new KAction(i18n("Update Metadata Database..."), "reload_page", 0,
1022
this, SLOT(slotSyncAllPicturesMetadata()), actionCollection(),
630
1025
// -----------------------------------------------------------
632
1027
// Provides a menu entry that allows showing/hiding the toolbar(s)
633
1028
setStandardToolBarMenuEnabled(true);
1030
// Provides a menu entry that allows showing/hiding the statusbar
1031
createStandardStatusBarAction();
635
1033
// Load Cameras -- do this before the createGUI so that the cameras
636
1034
// are plugged into the toolbar at startup
638
mSplash->message(i18n("Loading cameras"), AlignLeft, white);
1035
if (d->splashScreen)
1036
d->splashScreen->message(i18n("Loading cameras"), AlignLeft, white);
641
1040
createGUI(QString::fromLatin1( "digikamui.rc" ), false);
643
1042
// Initialize Actions ---------------------------------------
645
mDeleteAction->setEnabled(false);
646
mAddImagesAction->setEnabled(false);
647
mPropsEditAction->setEnabled(false);
648
mOpenInKonquiAction->setEnabled(false);
650
mImageViewAction->setEnabled(false);
651
mImageCommentsAction->setEnabled(false);
652
mImageRenameAction->setEnabled(false);
653
mImageDeleteAction->setEnabled(false);
654
mImagePropsAction->setEnabled(false);
655
mImagePropsAction->setEnabled(false);
656
mImageExifOrientationActionMenu->setEnabled(false);
658
mAlbumSortAction->setCurrentItem((int)mAlbumSettings->getAlbumSortOrder());
659
mImageSortAction->setCurrentItem((int)mAlbumSettings->getImageSortOrder());
661
int size = mAlbumSettings->getDefaultIconSize();
662
if (size == ThumbnailSize::Huge)
664
enableThumbSizePlusAction(false);
665
enableThumbSizeMinusAction(true);
667
else if (size == ThumbnailSize::Small)
669
enableThumbSizePlusAction(true);
670
enableThumbSizeMinusAction(false);
674
enableThumbSizePlusAction(true);
675
enableThumbSizeMinusAction(true);
679
void DigikamApp::enableThumbSizePlusAction(bool val)
681
mThumbSizePlusAction->setEnabled(val);
684
void DigikamApp::enableThumbSizeMinusAction(bool val)
686
mThumbSizeMinusAction->setEnabled(val);
1044
d->deleteAction->setEnabled(false);
1045
d->addImagesAction->setEnabled(false);
1046
d->propsEditAction->setEnabled(false);
1047
d->openInKonquiAction->setEnabled(false);
1049
d->imageViewAction->setEnabled(false);
1050
d->imagePreviewAction->setEnabled(false);
1051
d->imageLightTableAction->setEnabled(false);
1052
d->imageAddLightTableAction->setEnabled(false);
1053
d->imageRenameAction->setEnabled(false);
1054
d->imageDeleteAction->setEnabled(false);
1055
d->imageExifOrientationActionMenu->setEnabled(false);
1056
d->slideShowSelectionAction->setEnabled(false);
1058
d->albumSortAction->setCurrentItem((int)d->albumSettings->getAlbumSortOrder());
1059
d->imageSortAction->setCurrentItem((int)d->albumSettings->getImageSortOrder());
1061
d->recurseAlbumsAction->setChecked(d->albumSettings->getRecurseAlbums());
1062
d->recurseTagsAction->setChecked(d->albumSettings->getRecurseTags());
1063
slotRecurseAlbums(d->recurseAlbumsAction->isChecked());
1064
slotRecurseTags(d->recurseTagsAction->isChecked());
1066
// Setting the filter condition also updates the tooltip.
1067
// (So `setRating` is called first, as otherwise the filter value is not respected).
1068
d->albumIconViewFilter->readSettings();
1071
void DigikamApp::enableZoomPlusAction(bool val)
1073
d->zoomPlusAction->setEnabled(val);
1074
d->statusZoomBar->setEnableZoomPlus(val);
1077
void DigikamApp::enableZoomMinusAction(bool val)
1079
d->zoomMinusAction->setEnabled(val);
1080
d->statusZoomBar->setEnableZoomMinus(val);
689
1083
void DigikamApp::enableAlbumBackwardHistory(bool enable)
691
mBackwardActionMenu->setEnabled(enable);
1085
d->backwardActionMenu->setEnabled(enable);
694
1088
void DigikamApp::enableAlbumForwardHistory(bool enable)
696
mForwardActionMenu->setEnabled(enable);
1090
d->forwardActionMenu->setEnabled(enable);
699
1093
void DigikamApp::slotAboutToShowBackwardMenu()
701
mBackwardActionMenu->popupMenu()->clear();
1095
d->backwardActionMenu->popupMenu()->clear();
702
1096
QStringList titles;
703
mView->getBackwardHistory(titles);
1097
d->view->getBackwardHistory(titles);
704
1098
if(!titles.isEmpty())
707
1101
QStringList::Iterator iter = titles.begin();
708
1102
for(; iter != titles.end(); ++iter,++id)
710
mBackwardActionMenu->popupMenu()->insertItem(*iter, id);
1104
d->backwardActionMenu->popupMenu()->insertItem(*iter, id);
715
1109
void DigikamApp::slotAboutToShowForwardMenu()
717
mForwardActionMenu->popupMenu()->clear();
1111
d->forwardActionMenu->popupMenu()->clear();
718
1112
QStringList titles;
719
mView->getForwardHistory(titles);
1113
d->view->getForwardHistory(titles);
720
1115
if(!titles.isEmpty())
723
1118
QStringList::Iterator iter = titles.begin();
724
1119
for(; iter != titles.end(); ++iter,++id)
726
mForwardActionMenu->popupMenu()->insertItem(*iter, id);
1121
d->forwardActionMenu->popupMenu()->insertItem(*iter, id);
731
void DigikamApp::slot_albumSelected(bool val)
1126
void DigikamApp::slotAlbumSelected(bool val)
733
Album *album = mAlbumManager->currentAlbum();
1128
Album *album = d->albumManager->currentAlbum();
735
1130
if(album && !val)
737
1132
// No PAlbum is selected
738
mDeleteAction->setEnabled(false);
739
mAddImagesAction->setEnabled(false);
740
mPropsEditAction->setEnabled(false);
741
mOpenInKonquiAction->setEnabled(false);
742
mNewAction->setEnabled(false);
743
mAlbumImportAction->setEnabled(false);
1133
d->deleteAction->setEnabled(false);
1134
d->addImagesAction->setEnabled(false);
1135
d->propsEditAction->setEnabled(false);
1136
d->openInKonquiAction->setEnabled(false);
1137
d->newAction->setEnabled(false);
1138
d->albumImportAction->setEnabled(false);
746
1141
else if(!album && !val)
748
1143
// Groupitem selected (Collection/date)
749
mDeleteAction->setEnabled(false);
750
mAddImagesAction->setEnabled(false);
751
mPropsEditAction->setEnabled(false);
752
mOpenInKonquiAction->setEnabled(false);
753
mNewAction->setEnabled(false);
754
mAlbumImportAction->setEnabled(false);
1144
d->deleteAction->setEnabled(false);
1145
d->addImagesAction->setEnabled(false);
1146
d->propsEditAction->setEnabled(false);
1147
d->openInKonquiAction->setEnabled(false);
1148
d->newAction->setEnabled(false);
1149
d->albumImportAction->setEnabled(false);
756
1151
KAction *action;
757
for (action = m_kipiFileActionsImport.first(); action;
758
action = m_kipiFileActionsImport.next())
1152
for (action = d->kipiFileActionsImport.first(); action;
1153
action = d->kipiFileActionsImport.next())
760
1155
action->setEnabled(false);
763
for (action = m_kipiFileActionsExport.first(); action;
764
action = m_kipiFileActionsExport.next())
1158
for (action = d->kipiFileActionsExport.first(); action;
1159
action = d->kipiFileActionsExport.next())
766
1161
action->setEnabled(false);
792
1187
else if(album && album->isRoot() && album->type() == Album::PHYSICAL)
794
1189
// Root Album selected
795
mDeleteAction->setEnabled(false);
796
mAddImagesAction->setEnabled(false);
797
mPropsEditAction->setEnabled(false);
1190
d->deleteAction->setEnabled(false);
1191
d->addImagesAction->setEnabled(false);
1192
d->propsEditAction->setEnabled(false);
800
1195
if(album->type() == Album::PHYSICAL)
802
mNewAction->setEnabled(true);
803
mOpenInKonquiAction->setEnabled(true);
804
mAlbumImportAction->setEnabled(true);
1197
d->newAction->setEnabled(true);
1198
d->openInKonquiAction->setEnabled(true);
1199
d->albumImportAction->setEnabled(true);
808
mNewAction->setEnabled(false);
809
mOpenInKonquiAction->setEnabled(false);
810
mAlbumImportAction->setEnabled(false);
1203
d->newAction->setEnabled(false);
1204
d->openInKonquiAction->setEnabled(false);
1205
d->albumImportAction->setEnabled(false);
813
1208
KAction *action;
814
for (action = m_kipiFileActionsImport.first(); action;
815
action = m_kipiFileActionsImport.next())
1209
for (action = d->kipiFileActionsImport.first(); action;
1210
action = d->kipiFileActionsImport.next())
817
1212
action->setEnabled(false);
820
for (action = m_kipiFileActionsExport.first(); action;
821
action = m_kipiFileActionsExport.next())
1215
for (action = d->kipiFileActionsExport.first(); action;
1216
action = d->kipiFileActionsExport.next())
823
1218
action->setEnabled(true);
828
void DigikamApp::slot_tagSelected(bool val)
1223
void DigikamApp::slotTagSelected(bool val)
830
Album *album = mAlbumManager->currentAlbum();
1225
Album *album = d->albumManager->currentAlbum();
834
mDeleteTagAction->setEnabled(false);
835
mEditTagAction->setEnabled(false);
1230
d->deleteTagAction->setEnabled(false);
1231
d->editTagAction->setEnabled(false);
837
1233
else if(!album->isRoot())
839
mDeleteTagAction->setEnabled(true);
840
mEditTagAction->setEnabled(true);
843
for (action = m_kipiFileActionsImport.first(); action;
844
action = m_kipiFileActionsImport.next())
846
action->setEnabled(false);
849
for (action = m_kipiFileActionsExport.first(); action;
850
action = m_kipiFileActionsExport.next())
852
action->setEnabled(true);
857
mDeleteTagAction->setEnabled(false);
858
mEditTagAction->setEnabled(false);
861
for (action = m_kipiFileActionsImport.first(); action;
862
action = m_kipiFileActionsImport.next())
864
action->setEnabled(false);
867
for (action = m_kipiFileActionsExport.first(); action;
868
action = m_kipiFileActionsExport.next())
870
action->setEnabled(true);
875
void DigikamApp::slot_imageSelected(bool val)
877
mImageViewAction->setEnabled(val);
878
mImageCommentsAction->setEnabled(val);
879
mImageRenameAction->setEnabled(val);
880
mImageDeleteAction->setEnabled(val);
881
mImagePropsAction->setEnabled(val);
882
mImageExifOrientationActionMenu->setEnabled(val);
885
void DigikamApp::slot_gammaAdjustment()
892
int ValRet = KApplication::kdeinitExec(QString::fromLatin1("kcmshell"), args, perror, ppid);
895
KMessageBox::error(this, i18n("Cannot start \"KGamma\" extension from KDE control center;\n"
896
"please check your installation."));
899
void DigikamApp::slot_exit()
1235
d->deleteTagAction->setEnabled(true);
1236
d->editTagAction->setEnabled(true);
1239
for (action = d->kipiFileActionsImport.first(); action;
1240
action = d->kipiFileActionsImport.next())
1242
action->setEnabled(false);
1245
for (action = d->kipiFileActionsExport.first(); action;
1246
action = d->kipiFileActionsExport.next())
1248
action->setEnabled(true);
1253
d->deleteTagAction->setEnabled(false);
1254
d->editTagAction->setEnabled(false);
1257
for (action = d->kipiFileActionsImport.first(); action;
1258
action = d->kipiFileActionsImport.next())
1260
action->setEnabled(false);
1263
for (action = d->kipiFileActionsExport.first(); action;
1264
action = d->kipiFileActionsExport.next())
1266
action->setEnabled(true);
1271
void DigikamApp::slotImageSelected(const QPtrList<ImageInfo>& list, bool hasPrev, bool hasNext,
1272
const KURL::List& listAll)
1274
QPtrList<ImageInfo> selection = list;
1275
KURL::List all = listAll;
1276
int num_images = listAll.count();
1277
bool val = selection.isEmpty() ? false : true;
1281
d->imageViewAction->setEnabled(val);
1282
d->imagePreviewAction->setEnabled(val);
1283
d->imageLightTableAction->setEnabled(val);
1284
d->imageAddLightTableAction->setEnabled(val);
1285
d->imageRenameAction->setEnabled(val);
1286
d->imageDeleteAction->setEnabled(val);
1287
d->imageExifOrientationActionMenu->setEnabled(val);
1288
d->slideShowSelectionAction->setEnabled(selection.count() != 0);
1290
switch (selection.count())
1293
d->statusProgressBar->setText(i18n("No item selected"));
1297
KURL first = selection.first()->kurl();
1299
for (KURL::List::iterator it = all.begin();
1300
it != all.end(); ++it)
1308
text = selection.first()->kurl().fileName()
1309
+ i18n(" (%1 of %2)")
1310
.arg(QString::number(index))
1311
.arg(QString::number(num_images));
1312
d->statusProgressBar->setText(text);
1316
d->statusProgressBar->setText(i18n("%1/%2 items selected")
1317
.arg(selection.count()).arg(QString::number(num_images)));
1322
d->statusNavigateBar->setNavigateBarState(hasPrev, hasNext);
1325
void DigikamApp::slotProgressBarMode(int mode, const QString& text)
1327
d->statusProgressBar->progressBarMode(mode, text);
1330
void DigikamApp::slotProgressValue(int count)
1332
d->statusProgressBar->setProgressValue(count);
1335
void DigikamApp::slotExit()
1337
if (d->fullScreen) {
1338
slotToggleFullScreen();
1339
QTimer::singleShot(0, this, SLOT(close()));
905
1345
QString DigikamApp::convertToLocalUrl( const QString& folder )
907
1347
// This function is copied from k3b.
908
1349
KURL url( folder );
909
if( !url.isLocalFile() )
1350
if( !url.isLocalFile() )
911
1352
#if KDE_IS_VERSION(3,4,91)
912
return KIO::NetAccess::mostLocalURL( url, 0 ).path();
1353
// Support for system:/ and media:/ (c) Stephan Kulow
1354
KURL mlu = KIO::NetAccess::mostLocalURL( url, 0 );
1355
if (mlu.isLocalFile())
1358
DWarning() << folder << " mlu " << mlu << endl;
1360
QString path = mlu.path();
1362
if ( mlu.protocol() == "system" && path.startsWith("/media") )
1364
else if (mlu.protocol() == "media")
1367
return folder; // nothing to see - go on
1369
DDebug() << "parsed import path is: " << path << endl;
1370
DCOPRef ref("kded", "mediamanager");
1371
DCOPReply reply = ref.call("properties", path);
1372
if (reply.isValid()) {
1373
QStringList slreply;
1375
if ((slreply.count()>=9) && !slreply[9].isEmpty())
1380
DWarning() << "dcop call failed\n";
914
1385
#ifndef UDS_LOCAL_PATH
915
1386
#define UDS_LOCAL_PATH (72 | KIO::UDS_STRING)
917
1388
using namespace KIO;
919
1390
KIO::UDSEntry e;
920
if( KIO::NetAccess::stat( url, e, 0 ) )
1391
if( KIO::NetAccess::stat( url, e, 0 ) )
922
1393
const KIO::UDSEntry::ConstIterator end = e.end();
923
for( KIO::UDSEntry::ConstIterator it = e.begin(); it != end; ++it )
1394
for( KIO::UDSEntry::ConstIterator it = e.begin(); it != end; ++it )
925
1396
if( (*it).m_uds == UDS_LOCAL_PATH && !(*it).m_str.isEmpty() )
926
1397
return KURL::fromPathOrURL( (*it).m_str ).path();
931
1403
return url.path();
1406
void DigikamApp::slotDcopDownloadImages( const QString& folder )
1408
if (!folder.isNull())
1410
// activate window when called by media menu and DCOP
1412
KWin::deIconifyWindow(winId());
1413
KWin::activateWindow(winId());
1415
slotDownloadImages(folder);
1419
void DigikamApp::slotDcopCameraAutoDetect()
1421
// activate window when called by media menu and DCOP
1423
KWin::deIconifyWindow(winId());
1424
KWin::activateWindow(winId());
1426
slotCameraAutoDetect();
934
1429
void DigikamApp::slotDownloadImages( const QString& folder)
936
1431
if (!folder.isNull())
938
mCameraGuiPath = folder;
1433
d->cameraGuiPath = folder;
939
1435
QTimer::singleShot(0, this, SLOT(slotDownloadImages()));
943
1439
void DigikamApp::slotDownloadImages()
945
if (mCameraGuiPath.isNull())
1441
if (d->cameraGuiPath.isNull())
948
// Fetch the contents of the device. This is needed to make sure that the
1444
// Fetch the contents of the device. This is needed to make sure that the
949
1445
// media:/device gets mounted.
950
// KIO::ListJob *job = KIO::listDir(KURL(mCameraGuiPath), false, false);
952
// cant use this, as this is not in old kdelibs
953
// KIO::NetAccess::synchronousRun(job,0);
955
QString cameraGuiPath = convertToLocalUrl(mCameraGuiPath);
956
kdDebug() << "IN: " << mCameraGuiPath << " OUT: " << cameraGuiPath << endl;
958
if (cameraGuiPath.isNull())
1446
KIO::ListJob *job = KIO::listDir(KURL(d->cameraGuiPath), false, false);
1447
KIO::NetAccess::synchronousRun(job,0);
1449
QString localUrl = convertToLocalUrl(d->cameraGuiPath);
1450
DDebug() << "slotDownloadImages: convertToLocalUrl " << d->cameraGuiPath << " to " << localUrl << endl;
1452
if (localUrl.isNull())
961
1455
bool alreadyThere = false;
962
1457
for (uint i = 0 ; i != actionCollection()->count() ; i++)
964
if (actionCollection()->action(i)->name() == mCameraGuiPath)
1459
if (actionCollection()->action(i)->name() == d->cameraGuiPath)
965
1460
alreadyThere = true;
968
1463
if (!alreadyThere)
970
1465
KAction *cAction = new KAction(
971
i18n("Browse %1").arg(mCameraGuiPath),
975
SLOT(slotDownloadImages()),
977
mCameraGuiPath.latin1() );
1466
i18n("Browse %1").arg(KURL(d->cameraGuiPath).prettyURL()),
1470
SLOT(slotDownloadImages()),
1472
d->cameraGuiPath.latin1() );
979
mCameraMenuAction->insert(cAction, 0);
1474
d->cameraMenuAction->insert(cAction, 0);
982
CameraUI* cgui = new CameraUI(this,
983
i18n("Images found in %1").arg(cameraGuiPath),
984
"directory browse","Fixed", cameraGuiPath);
1477
// the CameraUI will delete itself when it has finished
1478
CameraUI* cgui = new CameraUI(this,
1479
i18n("Images found in %1").arg(d->cameraGuiPath),
1480
"directory browse","Fixed", localUrl, QDateTime::currentDateTime());
986
1483
connect(cgui, SIGNAL(signalLastDestination(const KURL&)),
987
mView, SLOT(slotSelectAlbum(const KURL&)));
1484
d->view, SLOT(slotSelectAlbum(const KURL&)));
988
1486
connect(cgui, SIGNAL(signalAlbumSettingsChanged()),
989
SLOT(slotSetupChanged()));
990
connect(cgui, SIGNAL(close()), SLOT(slotCameraUmount()));
993
void DigikamApp::slotCameraUmount()
995
int items = mMediaItems.count();
996
for (int i=0 ; i != items ; i++)
998
if (mMediaItems[i].first == mCameraGuiPath && mMediaItems[i].second)
1000
// Ok, item is now mounted and not before, umount it.
1001
kdDebug() << "Trying to umount device" << endl;
1002
KIO::SimpleJob *job = KIO::unmount(convertToLocalUrl(mCameraGuiPath));
1003
// cant use this, as this is not in old kdelibs
1004
// KIO::NetAccess::synchronousRun(job,0);
1487
this, SLOT(slotSetupChanged()));
1009
1490
void DigikamApp::slotCameraConnect()
1011
CameraType* ctype = mCameraList->find(QString::fromUtf8(sender()->name()));
1492
CameraType* ctype = d->cameraList->find(QString::fromUtf8(sender()->name()));
1015
CameraUI* cgui = new CameraUI(this, ctype->title(), ctype->model(),
1016
ctype->port(), ctype->path());
1018
connect(cgui, SIGNAL(signalLastDestination(const KURL&)),
1019
mView, SLOT(slotSelectAlbum(const KURL&)));
1020
connect(cgui, SIGNAL(signalAlbumSettingsChanged()),
1021
SLOT(slotSetupChanged()));
1496
// check not to open two dialogs for the same camera
1497
if (ctype->currentCameraUI() && !ctype->currentCameraUI()->isClosed())
1499
// show and raise dialog
1500
if (ctype->currentCameraUI()->isMinimized())
1501
KWin::deIconifyWindow(ctype->currentCameraUI()->winId());
1502
KWin::activateWindow(ctype->currentCameraUI()->winId());
1506
// the CameraUI will delete itself when it has finished
1507
CameraUI* cgui = new CameraUI(this, ctype->title(), ctype->model(),
1508
ctype->port(), ctype->path(), ctype->lastAccess());
1510
ctype->setCurrentCameraUI(cgui);
1514
connect(cgui, SIGNAL(signalLastDestination(const KURL&)),
1515
d->view, SLOT(slotSelectAlbum(const KURL&)));
1517
connect(cgui, SIGNAL(signalAlbumSettingsChanged()),
1518
this, SLOT(slotSetupChanged()));
1371
1914
void DigikamApp::populateThemes()
1373
Digikam::ThemeEngine::instance()->scanThemes();
1374
QStringList themes(Digikam::ThemeEngine::instance()->themeNames());
1376
mThemeMenuAction->setItems(themes);
1377
int index = themes.findIndex(mAlbumSettings->getCurrentTheme());
1917
d->splashScreen->message(i18n("Loading themes"), AlignLeft, white);
1919
ThemeEngine::instance()->scanThemes();
1920
d->themeMenuAction->setItems(ThemeEngine::instance()->themeNames());
1922
ThemeEngine::instance()->slotChangeTheme(d->themeMenuAction->currentText());
1925
void DigikamApp::slotChangeTheme(const QString& theme)
1927
d->albumSettings->setCurrentTheme(theme);
1928
ThemeEngine::instance()->slotChangeTheme(theme);
1931
void DigikamApp::slotThemeChanged()
1933
QStringList themes(ThemeEngine::instance()->themeNames());
1934
int index = themes.findIndex(d->albumSettings->getCurrentTheme());
1378
1935
if (index == -1)
1379
1936
index = themes.findIndex(i18n("Default"));
1380
mThemeMenuAction->setCurrentItem(index);
1381
Digikam::ThemeEngine::instance()->slotChangeTheme(mThemeMenuAction->currentText());
1384
void DigikamApp::slotChangeTheme(const QString& theme)
1386
mAlbumSettings->setCurrentTheme(theme);
1387
Digikam::ThemeEngine::instance()->slotChangeTheme(theme);
1390
void DigikamApp::updateDeleteTrashMenu()
1392
if (mAlbumSettings->getUseTrash())
1394
mDeleteAction->setText(i18n("Move Album to Trash"));
1395
mDeleteAction->setIcon("edittrash");
1396
mImageDeleteAction->setText(i18n("Move to Trash"));
1397
mImageDeleteAction->setIcon("edittrash");
1401
mDeleteAction->setText(i18n("Delete Album"));
1402
mDeleteAction->setIcon("editdelete");
1403
mImageDeleteAction->setText(i18n("Delete"));
1404
mImageDeleteAction->setIcon("editdelete");
1938
d->themeMenuAction->setCurrentItem(index);
1408
1941
void DigikamApp::slotDatabaseRescan()
1411
1944
sLib.startScan();
1414
DigikamApp* DigikamApp::m_instance = 0;
1416
#include "digikamapp.moc"
1946
d->view->refreshView();
1948
if (ImageWindow::imagewindowCreated())
1949
ImageWindow::imagewindow()->refreshView();
1951
if (LightTableWindow::lightTableWindowCreated())
1952
LightTableWindow::lightTableWindow()->refreshView();
1955
void DigikamApp::slotRebuildAllThumbs()
1957
QString msg = i18n("Rebuilding all image thumbnails can take some time.\n"
1958
"Do you want to continue?");
1959
int result = KMessageBox::warningContinueCancel(this, msg);
1960
if (result != KMessageBox::Continue)
1963
BatchThumbsGenerator *thumbsGenerator = new BatchThumbsGenerator(this);
1965
connect(thumbsGenerator, SIGNAL(signalRebuildAllThumbsDone()),
1966
this, SLOT(slotRebuildAllThumbsDone()));
1968
thumbsGenerator->exec();
1971
void DigikamApp::slotRebuildAllThumbsDone()
1973
d->view->applySettings();
1976
void DigikamApp::slotSyncAllPicturesMetadata()
1978
QString msg = i18n("Updating the metadata database can take some time. \nDo you want to continue?");
1979
int result = KMessageBox::warningContinueCancel(this, msg);
1980
if (result != KMessageBox::Continue)
1983
BatchAlbumsSyncMetadata *syncMetadata = new BatchAlbumsSyncMetadata(this);
1985
connect(syncMetadata, SIGNAL(signalComplete()),
1986
this, SLOT(slotSyncAllPicturesMetadataDone()));
1988
syncMetadata->exec();
1991
void DigikamApp::slotSyncAllPicturesMetadataDone()
1993
d->view->applySettings();
1996
void DigikamApp::slotDonateMoney()
1998
KApplication::kApplication()->invokeBrowser("http://www.digikam.org/?q=donation");
2001
void DigikamApp::slotContribute()
2003
KApplication::kApplication()->invokeBrowser("http://www.digikam.org/?q=contrib");
2006
void DigikamApp::slotRecurseAlbums(bool checked)
2008
AlbumLister::instance()->setRecurseAlbums(checked);
2011
void DigikamApp::slotRecurseTags(bool checked)
2013
AlbumLister::instance()->setRecurseTags(checked);
2016
void DigikamApp::slotZoomSliderChanged(int size)
2018
d->view->setThumbSize(size);
2021
void DigikamApp::slotThumbSizeChanged(int size)
2023
d->statusZoomBar->setZoomSliderValue(size);
2024
d->statusZoomBar->setZoomTrackerText(i18n("Size: %1").arg(size));
2027
void DigikamApp::slotZoomChanged(double zoom, int size)
2029
d->statusZoomBar->setZoomSliderValue(size);
2030
d->statusZoomBar->setZoomTrackerText(i18n("zoom: %1%").arg((int)(zoom*100.0)));
2033
void DigikamApp::slotTogglePreview(bool t)
2035
// NOTE: if 't' is true, we are in Preview Mode, else we are in AlbumView Mode
2037
// This is require if ESC is pressed to go out of Preview Mode.
2038
// imagePreviewAction is handled by F3 key only.
2039
d->imagePreviewAction->setChecked(t);
2041
// Here, we will toggle some menu actions depending of current Mode.
2044
d->selectAllAction->setEnabled(!t);
2045
d->selectNoneAction->setEnabled(!t);
2046
d->selectInvertAction->setEnabled(!t);
2049
d->albumSortAction->setEnabled(!t);
2050
d->imageSortAction->setEnabled(!t);
2051
d->zoomTo100percents->setEnabled(t);
2052
d->zoomFitToWindowAction->setEnabled(t);
2055
void DigikamApp::slotAlbumAddImages()
2057
QString path = KFileDialog::getExistingDirectory(KGlobalSettings::documentPath(), this,
2058
i18n("Select folder to parse"));
2063
// The folder contents will be parsed by Camera interface in "Directory Browse" mode.
2067
} // namespace Digikam