Update capabilities
[kdenetwork.git] / kget / mainwindow.cpp
blob886eef3910db2e734d3a22c22e801814e0c0115c
1 /* This file is part of the KDE project
3 Copyright (C) 2002 by Patrick Charbonnier <pch@freeshell.org>
4 Based On Caitoo v.0.7.3 (c) 1998 - 2000, Matej Koss
5 Copyright (C) 2002 Carsten Pfeiffer <pfeiffer@kde.org>
6 Copyright (C) 2006, 2007 Urs Wolfer <uwolfer @ kde.org>
7 Copyright (C) 2006 Dario Massarin <nekkar@libero.it>
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public
11 License as published by the Free Software Foundation; either
12 version 2 of the License, or (at your option) any later version.
15 #include <QClipboard>
16 #include <QTimer>
18 #include <kapplication.h>
19 #include <kstandarddirs.h>
20 #include <kmessagebox.h>
21 #include <kkeydialog.h>
22 #include <kedittoolbar.h>
23 #include <knotifyconfigwidget.h>
24 #include <kfiledialog.h>
25 #include <ktoolinvocation.h>
26 #include <kmenubar.h>
27 #include <kiconloader.h>
28 #include <kstandardaction.h>
29 #include <klocale.h>
30 #include <kicon.h>
31 #include <kactionmenu.h>
33 #include "mainwindow.h"
34 #include "core/kget.h"
35 #include "core/transferhandler.h"
36 #include "settings.h"
37 #include "conf/preferencesdialog.h"
39 #include "ui/viewscontainer.h"
40 #include "ui/tray.h"
41 #include "ui/droptarget.h"
42 #include "ui/groupseditdialog.h"
44 MainWindow::MainWindow( QWidget * parent )
45 : KMainWindow( parent ),
46 m_drop(0), m_dock(0)
48 // create the model
49 KGet::self( this );
51 // create actions
52 setupActions();
54 createGUI("kgetui.rc");
56 m_viewsContainer = new ViewsContainer(this);
58 setCentralWidget(m_viewsContainer);
60 // restore position, size and visibility
61 move( Settings::mainPosition() );
62 setAutoSaveSettings();
63 setPlainCaption(i18n("KGet"));
65 if ( Settings::showMain() )
66 show();
67 else
68 hide();
70 //Some of the widgets are initialized in slotDelayedInit()
71 QTimer::singleShot( 0, this, SLOT(slotDelayedInit()) );
74 MainWindow::~MainWindow()
76 //Save the user's transfers
77 KGet::save();
79 slotSaveMyself();
80 delete clipboardTimer;
81 delete m_drop;
82 delete m_dock;
83 // reset konqueror integration (necessary if user enabled / disabled temporarily integration from tray)
84 slotKonquerorIntegration( Settings::konquerorIntegration() );
85 // the following call saves options set in above dtors
86 Settings::writeConfig();
90 void MainWindow::setupActions()
92 QAction *newDownloadAction = actionCollection()->addAction("new_download");
93 newDownloadAction->setText(i18n("&New Download..."));
94 newDownloadAction->setIcon(KIcon("document-new"));
95 newDownloadAction->setShortcuts(KShortcut("Ctrl+N"));
96 connect(newDownloadAction, SIGNAL(triggered()), SLOT(slotNewTransfer()));
98 QAction *openAction = actionCollection()->addAction("open");
99 openAction->setText(i18n("&Open..."));
100 openAction->setIcon(KIcon("document-open"));
101 openAction->setShortcuts(KShortcut("Ctrl+O"));
102 connect(openAction, SIGNAL(triggered()), SLOT(slotOpen()));
104 QAction *exportAction = actionCollection()->addAction("export_downloads");
105 exportAction->setText(i18n("&Export Transfers List..."));
106 exportAction->setIcon(KIcon("fileexport"));
107 exportAction->setShortcuts(KShortcut("Ctrl+E"));
108 connect(exportAction, SIGNAL(triggered()), SLOT(slotExportTransfers()));
110 QAction *editGroupAction = actionCollection()->addAction("edit_groups");
111 editGroupAction->setText(i18n("Edit Groups.."));
112 editGroupAction->setIcon(KIcon("todolist"));
113 connect(editGroupAction, SIGNAL(triggered()), SLOT(slotEditGroups()));
115 m_autoPasteAction = new KToggleAction(KIcon("klipper"),
116 i18n("Auto-Paste Mode"), actionCollection());
117 actionCollection()->addAction("auto_paste", m_autoPasteAction);
118 m_autoPasteAction->setChecked(Settings::autoPaste());
119 m_autoPasteAction->setWhatsThis(i18n("<b>Auto paste</b> button toggles the auto-paste mode "
120 "on and off.\nWhen set, KGet will periodically scan "
121 "the clipboard for URLs and paste them automatically."));
122 connect(m_autoPasteAction, SIGNAL(triggered()), SLOT(slotToggleAutoPaste()));
124 KToggleAction *m_konquerorIntegration = new KToggleAction(KIcon("konqueror"),
125 i18n("Use KGet as Konqueror Download Manager"),
126 actionCollection());
127 actionCollection()->addAction("konqueror_integration", m_konquerorIntegration);
128 connect(m_konquerorIntegration, SIGNAL(triggered()), SLOT(slotTrayKonquerorIntegration()));
129 m_konquerorIntegration->setChecked(Settings::konquerorIntegration());
131 // local - Destroys all sub-windows and exits
132 QAction *quitAction = KStandardAction::quit(this, SLOT(slotQuit()), actionCollection());
133 actionCollection()->addAction("quit", quitAction);
134 // local - Standard configure actions
135 QAction *preferencesAction = KStandardAction::preferences(this, SLOT(slotPreferences()), actionCollection());
136 actionCollection()->addAction("preferences", preferencesAction);
137 QAction *configToolbarAction = KStandardAction::configureToolbars(this, SLOT(slotConfigureToolbars()), actionCollection());
138 actionCollection()->addAction("configure_toolbars", configToolbarAction);
139 QAction *keyBindingsAction = KStandardAction::keyBindings(this, SLOT(slotConfigureKeys()), actionCollection());
140 actionCollection()->addAction("configure_keys", keyBindingsAction);
141 QAction *cinfigNotifyAction = KStandardAction::configureNotifications(this, SLOT(slotConfigureNotifications()), actionCollection());
142 actionCollection()->addAction("configure_notifications", cinfigNotifyAction);
143 m_menubarAction = KStandardAction::showMenubar(this, SLOT(slotShowMenubar()), actionCollection());
144 m_menubarAction->setChecked(!menuBar()->isHidden());
145 actionCollection()->addAction("settings_showmenubar", m_menubarAction);
147 // Transfer related actions
148 QAction *deleteSelectedAction = actionCollection()->addAction("delete_selected_download");
149 deleteSelectedAction->setText(i18n("Delete Selected"));
150 deleteSelectedAction->setIcon(KIcon("edit-delete"));
151 deleteSelectedAction->setShortcuts(KShortcut("Del"));
152 connect(deleteSelectedAction, SIGNAL(triggered()), SLOT(slotDeleteSelected()));
154 QAction *startAllAction = actionCollection()->addAction("start_all_download");
155 startAllAction->setText(i18n("Start / Resume All"));
156 startAllAction->setIcon(KIcon("media-seek-forward"));
157 connect(startAllAction, SIGNAL(triggered()), SLOT(slotStartAllDownload()));
159 QAction *startSelectedAction = actionCollection()->addAction("start_selected_download");
160 startSelectedAction->setText(i18n("Start / Resume Selected"));
161 startSelectedAction->setIcon(KIcon("media-playback-start"));
162 connect(startSelectedAction, SIGNAL(triggered()), SLOT(slotStartSelectedDownload()));
164 QAction *stopAllAction = actionCollection()->addAction("stop_all_download");
165 stopAllAction->setText(i18n("Stop All"));
166 stopAllAction->setIcon(KIcon("media-playback-pause"));
167 connect(stopAllAction, SIGNAL(triggered()), SLOT(slotStopAllDownload()));
169 QAction *stopSelectedAction = actionCollection()->addAction("stop_selected_download");
170 stopSelectedAction->setText(i18n("Stop Selected"));
171 stopSelectedAction->setIcon(KIcon("media-playback-pause"));
172 connect(stopSelectedAction, SIGNAL(triggered()), SLOT(slotStopSelectedDownload()));
174 KActionMenu *startActionMenu = new KActionMenu(KIcon("media-playback-start"), i18n("Start / Resume"),
175 actionCollection());
176 actionCollection()->addAction("start_menu", startActionMenu);
177 startActionMenu->setDelayed(true);
178 startActionMenu->addAction(startAllAction);
179 startActionMenu->addAction(startSelectedAction);
180 connect(startActionMenu, SIGNAL(triggered()), SLOT(slotStartDownload()));
182 KActionMenu *stopActionMenu = new KActionMenu(KIcon("media-playback-pause"), i18n("Stop"),
183 actionCollection());
184 actionCollection()->addAction("stop_menu", stopActionMenu);
185 stopActionMenu->setDelayed(true);
186 stopActionMenu->addAction(stopAllAction);
187 stopActionMenu->addAction(stopSelectedAction);
188 connect(stopActionMenu, SIGNAL(triggered()), SLOT(slotStopDownload()));
190 QAction *openDestAction = actionCollection()->addAction("transfer_open_dest");
191 openDestAction->setText(i18n("Open Destination"));
192 openDestAction->setIcon(KIcon("folder"));
193 connect(openDestAction, SIGNAL(triggered()), SLOT(slotTransfersOpenDest()));
195 QAction *showDetailsAction = actionCollection()->addAction("transfer_show_details");
196 showDetailsAction->setText(i18n("Show Details"));
197 showDetailsAction->setIcon(KIcon("configure"));
198 connect(showDetailsAction, SIGNAL(triggered()), SLOT(slotTransfersShowDetails()));
200 QAction *copyUrlAction = actionCollection()->addAction("transfer_copy_source_url");
201 copyUrlAction->setText(i18n("Copy URL to Clipboard"));
202 copyUrlAction->setIcon(KIcon("klipper"));
203 connect(copyUrlAction, SIGNAL(triggered()), SLOT(slotTransfersCopySourceUrl()));
206 void MainWindow::slotDelayedInit()
208 //Here we import the user's transfers.
209 KGet::load( KStandardDirs::locateLocal("appdata", "transfers.kgt") );
211 // DropTarget
212 m_drop = new DropTarget(this);
214 if ( Settings::showDropTarget() || Settings::firstRun() )
215 m_drop->setVisible(true);
217 // DockWidget
218 m_dock = new Tray(this);
219 m_dock->show();
221 // enable dropping
222 setAcceptDrops(true);
224 // enable hide toolbar
225 setStandardToolBarMenuEnabled(true);
227 // session management stuff
228 connect(kapp, SIGNAL(saveYourself()), SLOT(slotSaveMyself()));
230 // set auto-resume in kioslaverc (is there a cleaner way?)
231 KConfig cfg("kioslaverc", KConfig::NoGlobals);
232 cfg.group(QString()).writeEntry("AutoResume", true);
233 cfg.sync();
235 // immediately start downloading if configured this way
236 if ( Settings::downloadAtStartup() )
237 slotStartDownload();
239 // reset the FirstRun config option
240 Settings::setFirstRun(false);
242 //auto paste stuff
243 lastClipboard = QApplication::clipboard()->text( QClipboard::Clipboard ).trimmed();
244 clipboardTimer = new QTimer(this);
245 connect(clipboardTimer, SIGNAL(timeout()), SLOT(slotCheckClipboard()));
246 if ( Settings::autoPaste() )
247 clipboardTimer->start(1000);
250 void MainWindow::slotNewTransfer()
252 KGet::addTransfer(KUrl());
255 void MainWindow::slotOpen()
257 QString filename = KFileDialog::getOpenFileName
258 (KUrl(),
259 "*.kgt *.torrent *.metalink|" + i18n("All openable files") + " (*.kgt *.torrent *.metalink)",
260 this,
261 i18n("Open file")
264 if(filename.endsWith(".kgt"))
266 KGet::load(filename);
267 return;
270 if(filename.endsWith(".metalink"))
272 KGet::addMetaLink( KUrl( filename ) );
273 return;
276 if(!filename.isEmpty())
277 KGet::addTransfer( KUrl( filename ) );
280 void MainWindow::slotQuit()
282 // if (m_scheduler->countRunningJobs() > 0)
283 // {
284 // if (KMessageBox::warningYesNo(this,
285 // i18n("Some transfers are still running.\n"
286 // "Are you sure you want to close KGet?"),
287 // i18n("Warning"), KStdGuiItem::yes(), KStdGuiItem::no(),
288 // "ExitWithActiveTransfers") == KMessageBox::No)
289 // return;
290 // }
292 Settings::writeConfig();
293 kapp->quit();
296 void MainWindow::slotPreferences()
298 // an instance the dialog could be already created and could be cached,
299 // in which case you want to display the cached dialog
300 if ( PreferencesDialog::showDialog( "preferences" ) )
301 return;
303 // we didn't find an instance of this dialog, so lets create it
304 PreferencesDialog * dialog = new PreferencesDialog( this, Settings::self() );
305 KGet::setPluginsSettingsWidget( dialog->pluginsWidget() );
306 // keep us informed when the user changes settings
307 connect( dialog, SIGNAL(settingsChanged(const QString&)),
308 this, SLOT(slotNewConfig()) );
310 dialog->show();
313 void MainWindow::slotExportTransfers()
315 QString filename = KFileDialog::getSaveFileName
316 (KUrl(),
317 "*.kgt|" + i18n("KGet transfer list") + " (*.kgt)",
318 this,
319 i18n("Export transfers")
322 if(!filename.isEmpty())
323 KGet::save(filename);
326 void MainWindow::slotEditGroups()
328 GroupsEditDialog dialog(this);
330 dialog.exec();
333 void MainWindow::slotStartDownload()
335 if(KGet::selectedTransfers().size() == 0)
336 slotStartAllDownload();
337 else
338 slotStartSelectedDownload();
341 void MainWindow::slotStartAllDownload()
343 m_dock->setDownloading(true);
345 KGet::setSchedulerRunning(true);
348 void MainWindow::slotStartSelectedDownload()
350 m_dock->setDownloading(true);
352 foreach(TransferHandler * it, KGet::selectedTransfers())
353 it->start();
356 void MainWindow::slotStopDownload()
358 if(KGet::selectedTransfers().size() == 0)
359 slotStopAllDownload();
360 else
361 slotStopSelectedDownload();
364 void MainWindow::slotStopAllDownload()
366 m_dock->setDownloading(false);
368 KGet::setSchedulerRunning(false);
371 void MainWindow::slotStopSelectedDownload()
373 m_dock->setDownloading(false);
375 foreach(TransferHandler * it, KGet::selectedTransfers())
376 it->stop();
379 void MainWindow::slotDeleteSelected()
381 foreach(TransferHandler * it, KGet::selectedTransfers())
383 it->stop();
384 KGet::delTransfer(it);
388 void MainWindow::slotTransfersOpenDest()
390 QStringList openedDirs;
391 foreach(TransferHandler * it, KGet::selectedTransfers())
393 QString directory = it->dest().directory();
394 if( !openedDirs.contains( directory ) )
396 KToolInvocation::invokeBrowser( directory );
397 openedDirs.append( directory );
402 void MainWindow::slotTransfersShowDetails()
404 foreach(TransferHandler * it, KGet::selectedTransfers())
406 m_viewsContainer->showTransferDetails(it);
410 void MainWindow::slotTransfersCopySourceUrl()
412 foreach(TransferHandler * it, KGet::selectedTransfers())
414 QString sourceurl = it->source().url();
415 QClipboard *cb = QApplication::clipboard();
416 cb->setText(sourceurl, QClipboard::Selection);
417 cb->setText(sourceurl, QClipboard::Clipboard);
421 void MainWindow::slotConfigureNotifications()
423 KNotifyConfigWidget::configure(this);
426 void MainWindow::slotConfigureKeys()
428 KKeyDialog::configure(actionCollection());
431 void MainWindow::slotConfigureToolbars()
433 KEditToolbar edit( "kget_toolbar", actionCollection() );
434 connect(&edit, SIGNAL( newToolbarConfig() ), this, SLOT( slotNewToolbarConfig() ));
435 edit.exec();
439 void MainWindow::slotSaveMyself()
441 // save last parameters ..
442 Settings::setMainPosition( pos() );
443 // .. and write config to disk
444 Settings::writeConfig();
447 void MainWindow::slotNewToolbarConfig()
449 createGUI();
452 void MainWindow::slotNewConfig()
454 // Update here properties modified in the config dialog and not
455 // parsed often by the code. When clicking Ok or Apply of
456 // PreferencesDialog, this function is called.
458 m_drop->setVisible(Settings::showDropTarget(), false);
460 slotKonquerorIntegration(Settings::konquerorIntegration());
462 if (Settings::autoPaste())
463 clipboardTimer->start(1000);
464 else
465 clipboardTimer->stop();
466 m_autoPasteAction->setChecked(Settings::autoPaste());
469 void MainWindow::slotToggleAutoPaste()
471 bool autoPaste = !Settings::autoPaste();
472 Settings::setAutoPaste( autoPaste );
474 if (autoPaste)
475 clipboardTimer->start(1000);
476 else
477 clipboardTimer->stop();
478 m_autoPasteAction->setChecked(autoPaste);
481 void MainWindow::slotCheckClipboard()
483 QString clipData = QApplication::clipboard()->text( QClipboard::Clipboard ).trimmed();
485 if (clipData != lastClipboard)
487 lastClipboard = clipData;
488 if (lastClipboard.isEmpty())
489 return;
491 KUrl url = KUrl(lastClipboard);
493 if (url.isValid() && !url.isLocalFile())
494 KGet::addTransfer( url );
498 void MainWindow::slotTrayKonquerorIntegration()
500 static bool tempIntegration = Settings::konquerorIntegration();
501 tempIntegration = !tempIntegration;
502 slotKonquerorIntegration(tempIntegration);
503 if (!tempIntegration && Settings::konquerorIntegration() && !Settings::expertMode())
505 KMessageBox::information(this,
506 i18n("KGet has been temporarily disabled as download manager for Konqueror. "
507 "If you want to disable it forever, go to Settings->Advanced and disable \"Use "
508 "as download manager for Konqueror\"."),
509 i18n("Konqueror Integration disabled"),
510 "KonquerorIntegrationDisabled");
514 void MainWindow::slotKonquerorIntegration(bool konquerorIntegration)
516 KConfig cfgKonqueror("konquerorrc", KConfig::NoGlobals);
517 cfgKonqueror.group("HTML Settings").writeEntry("DownloadManager",
518 QString(konquerorIntegration ? "kget" : QString()));
519 cfgKonqueror.sync();
522 void MainWindow::slotShowMenubar()
524 if(m_menubarAction->isChecked())
525 menuBar()->show();
526 else
527 menuBar()->hide();
530 /** widget events */
532 void MainWindow::closeEvent( QCloseEvent * e )
534 e->ignore();
535 hide();
538 void MainWindow::dragEnterEvent(QDragEnterEvent * event)
540 event->setAccepted(KUrl::List::canDecode(event->mimeData())
541 || event->mimeData()->hasText());
544 void MainWindow::dropEvent(QDropEvent * event)
546 KUrl::List list = KUrl::List::fromMimeData(event->mimeData());
547 QString str;
549 if (!list.isEmpty())
550 KGet::addTransfer(list);
551 else
553 str = event->mimeData()->text();
554 KGet::addTransfer(KUrl(str));
559 /** DBUS interface */
561 void MainWindow::addTransfers(const QString& src, const QString& dest)
563 // split src for the case it is a QStringList (e.g. from konqueror plugin)
564 KGet::addTransfer(src.split(";"), dest);
567 bool MainWindow::isDropTargetVisible() const
569 return m_drop->isVisible();
572 void MainWindow::setDropTargetVisible( bool setVisible )
574 if ( setVisible != Settings::showDropTarget() )
575 m_drop->setVisible( setVisible );
578 void MainWindow::setOfflineMode( bool offline )
580 Q_UNUSED(offline);
581 //TODO Re-enable this
582 // schedRequestOperation( offline ? OpStop : OpRun );
585 bool MainWindow::isOfflineMode() const
587 //TODO Re-enable this
588 // return scheduler->isRunning();
589 return false;
592 #include "mainwindow.moc"