X-Git-Url: http://git.maemo.org/git/?p=qtrapids;a=blobdiff_plain;f=src%2Fgui%2FMainWindow.cpp;h=884ced03a3b00801cb86406af5ff60a9f6b10ff0;hp=7412e5b29ab9a7fb07f4ca5f1b9895cddd60fe09;hb=a44247edceca59d140d8fbdf85f0cbaac962e581;hpb=fae8a254e669105080d54a43ea9aec418d612ec9 diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 7412e5b..884ced0 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -21,40 +21,99 @@ #include - +#include #include #include #include +#include +#include +#include #include "DownloadView.h" #include "SeedView.h" +#include "PreferencesDialog.h" #include "MainWindow.h" +const QString ABOUT_TEXT += QString(QObject::trUtf8("QtRapids, a simple BitTorrent client based on" + "\nQt and Libtorrent." + "\n\nURL: http://qtrapids.garage.maemo.org/" + "\n\nAuthors:\nLassi Väätämöinen, lassi.vaatamoinen@ixonos.com" + "\nDenis Zalevskiy, denis.zalewsky@ixonos.com" + "\n\nIxonos Plc, Finland\n")); - -MainWindow::MainWindow() +// Consturctor +MainWindow::MainWindow(): + QMainWindow(), // Superclass + tabWidget_(NULL), + dlView_(NULL), + seedView_(NULL), + preferencesDialog_(NULL), + settings_(), +// torrentHandles_(), + btSession_() { - + // MENUBAR + QMenuBar *menuBar = new QMenuBar(); + QMenu *tempMenu = NULL; + + tempMenu = menuBar->addMenu(tr("&File")); + QAction *openAction = tempMenu->addAction(tr("&Open")); + QAction *removeAction = tempMenu->addAction(tr("&Remove")); + removeAction->setEnabled(false); + QAction *quitAction = tempMenu->addAction(tr("&Quit")); + + tempMenu = menuBar->addMenu(tr("&Settings")); + QAction *preferencesAction = tempMenu->addAction(tr("&Preferences")); + + tempMenu = menuBar->addMenu(tr("&Help")); + QAction *aboutAction = tempMenu->addAction(tr("&About")); + QAction *aboutQtAction = tempMenu->addAction(tr("About &Qt")); + + setMenuBar(menuBar); + connect(openAction, SIGNAL(triggered()), this, SLOT(on_openAction_clicked())); + connect(removeAction, SIGNAL(triggered()), this, SLOT(on_removeAction_clicked())); + connect(this, SIGNAL(itemSelected(bool)), removeAction, SLOT(setEnabled(bool))); + connect(quitAction, SIGNAL(triggered()), this, SLOT(on_quitAction_clicked())); + connect(preferencesAction, SIGNAL(triggered()), this, SLOT(on_preferencesAction_clicked())); + connect(aboutAction, SIGNAL(triggered()), this, SLOT(on_aboutAction_clicked())); + connect(aboutQtAction, SIGNAL(triggered()), this, SLOT(on_aboutQtAction_clicked())); + + // TABWIDGET (central widget) tabWidget_ = new QTabWidget(); - + tabWidget_->setTabsClosable(true); + /// @todo Exception handling dlView_ = new DownloadView(this); seedView_ = new SeedView(this); - - tabWidget_->addTab(dlView_, "Downloads"); - tabWidget_->addTab(seedView_, "Seeds"); - + tabWidget_->addTab(dlView_, tr("Downloads")); + tabWidget_->addTab(seedView_, tr("Seeds")); + connect(dlView_, SIGNAL(itemSelectionChanged()), this, + SLOT(on_downloadItemSelectionChanged())); + connect(seedView_, SIGNAL(itemSelectionChanged()), this, + SLOT(on_seedItemSelectionChanged())); + + // Tab widget as central widget. setCentralWidget(tabWidget_); - + + // TOOLBAR QToolBar *toolBar = new QToolBar(); - toolBar->addAction("Open"); - + toolBar->addAction(tr("Open")); + removeAction = toolBar->addAction(tr("Remove")); + removeAction->setEnabled(false); addToolBar(Qt::TopToolBarArea, toolBar); - - connect(toolBar, SIGNAL(actionTriggered(QAction*)), this, SLOT(handleToolBarAction(QAction*))); - + + connect(this, SIGNAL(itemSelected(bool)), removeAction, + SLOT(setEnabled(bool))); + connect(toolBar, SIGNAL(actionTriggered(QAction*)), this, + SLOT(handleToolBarAction(QAction*))); + + connect(&btSession_, SIGNAL(alert(std::auto_ptr)), + this, SLOT(on_alert(std::auto_ptr))); + + LoadPlugins(); } @@ -62,17 +121,242 @@ MainWindow::~MainWindow() { } +// ===================== Implements PluginInterface ========================= +bool MainWindow::setGui(QWidget* widget, PluginWidgetType type) +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << "MainWindow::setGui():" << dlView_->currentItem(); +#endif + tabWidget_->addTab(widget, tr("Search")); + return true; +} -void MainWindow::handleToolBarAction(QAction* action) +/// @todo Add PluginInterface parameter check which plugin gives the widget to handle appropriately +void MainWindow::addPluginWidget(QWidget* widget, PluginWidgetType type) +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << "MainWindow::addPluginWidget():" << dlView_->currentItem(); +#endif + + if (type == qtrapids::PluginHostInterface::TAB_PAGE) { + int index = tabWidget_->addTab(widget, tr("Test")); + tabWidget_->setCurrentIndex(index); + //layout_->addWidget(widget); + } +} +void MainWindow::addToolbar(QWidget* widget, PluginWidgetType type) +{ +} + +void MainWindow::addToolItem(QWidget* widget, PluginWidgetType type) +{ +} + +void MainWindow::addMenu(QWidget* widget, PluginWidgetType type) +{ +} + +void MainWindow::addMenuItem(QWidget* widget, PluginWidgetType type) +{ +} + +bool MainWindow::eventRequest(QVariant param, PluginRequest req) { + if (req == qtrapids::PluginHostInterface::OPEN_FILE) { + QString sourceFile = param.toString(); + + // Get the source files name from the full path: + QFileInfo fInfo(sourceFile); + QString targetFile = fInfo.fileName(); + targetFile = settings_.value("download/directory").toString() + targetFile; + + // Copy temoporary file to Downloads directory... + if (!QFile::copy(sourceFile, targetFile)) { + qDebug() << "File copying failed"; + return false; + } else { + // If copying was successful, remove the original temporary file. + QFile::remove(sourceFile); + } + + // ...and start the torrent: + on_torrentFileSelected(targetFile); + } - if (action->text() == "Open") { - QFileDialog *dialog = new QFileDialog( this, "Open torrent file", QString(), tr("Torrent files (*.torrent)")); - dialog->setFileMode(QFileDialog::ExistingFile); - dialog->show(); + return true; +} + + +//=========================== PRIVATE ================================ + +void MainWindow::LoadPlugins() +{ + /// @todo get plugin directory from settings or go through multiple directories + /// Now we only check the application directory + pluginsDir_ = QDir(qApp->applicationDirPath()); + pluginsDir_.cd("plugins"); + QStringList nameFilters; + nameFilters << "*.so"; + + foreach (QString fileName, pluginsDir_.entryList(nameFilters, QDir::Files)) { + QPluginLoader pluginLoader(pluginsDir_.absoluteFilePath(fileName)); + + if (!QLibrary::isLibrary(fileName)) { + qDebug() << fileName << " not a library"; + } + + if (pluginLoader.load()) { + qDebug() << "Plugin loaded: " << fileName; + } else { + qDebug() << "Plugin load failed: " << pluginLoader.errorString(); + } + + QObject *baseInstance = pluginLoader.instance(); + if (!baseInstance) { + qDebug() << "Base instance = NULL."; + } + + qtrapids::PluginInterface *plugin = qobject_cast(baseInstance); + + if (!plugin) { + qDebug() << "Cast failed."; + } else { + plugin->initialize(this); + pluginFileNames_ += fileName; + } + } +} + +// =========================== SLOTS ================================= +void MainWindow::on_openAction_clicked() +{ + QFileDialog *dialog = new QFileDialog( this, "Open torrent file", QString(), tr("Torrent files (*.torrent)")); + dialog->setFileMode(QFileDialog::ExistingFile); + connect(dialog, SIGNAL(fileSelected(const QString&)), this, SLOT(on_torrentFileSelected(const QString&))); + dialog->show(); +} + +void MainWindow::on_removeAction_clicked() +{ + qtrapids::QTorrentHandle handle = dlView_->removeSelected(); + btSession_.removeTorrent(handle); +} + +void MainWindow::on_quitAction_clicked() +{ + close(); +} + +void MainWindow::on_preferencesAction_clicked() +{ + if (!preferencesDialog_) { + preferencesDialog_ = new PreferencesDialog(this); + } + preferencesDialog_->show(); + preferencesDialog_->raise(); + preferencesDialog_->activateWindow(); +} + +void MainWindow::on_aboutAction_clicked() +{ + QMessageBox::about(this, tr("About QtRapids"), ABOUT_TEXT); +} + + +void MainWindow::on_aboutQtAction_clicked() +{ + QMessageBox::aboutQt (this, tr("About Qt")); +} + + +void MainWindow::on_downloadItemSelectionChanged() +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << "MainWindow::on_seedItemSelectionChanged():" << dlView_->currentItem(); +#endif + if (dlView_->currentItem() != NULL) { + emit(itemSelected(true)); } else { + emit(itemSelected(false)); + } +} + +void MainWindow::on_seedItemSelectionChanged() +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << "MainWindow::on_seedItemSelectionChanged():" << seedView_->currentItem(); +#endif + if (seedView_->currentItem() != NULL) { + emit(itemSelected(true)); + } else { + emit(itemSelected(false)); + } +} + +void MainWindow::handleToolBarAction(QAction* action) +{ + if (action->text() == "Open") { + on_openAction_clicked(); + } else if (action->text() == "Remove") { + on_removeAction_clicked(); + } +} + +void MainWindow::on_torrentFileSelected(const QString& file) +{ +#ifdef QTRAPIDS_DEBUG + qDebug() << " MainWindow::on_torrentFileSelected(): " << file; +#endif + // Torrent filename empty, do nothing. + if (file == "") { + return; } + // Otherwise add torrent + // For params, see: http://www.rasterbar.com/products/libtorrent/manual.html#add-torrent + AddTorrentParams addParams; + boost::intrusive_ptr tiTmp = + new libtorrent::torrent_info(boost::filesystem::path(file.toStdString())); + addParams.ti = tiTmp; + // save_path is the only mandatory parameter, rest are optional. + addParams.save_path = boost::filesystem::path(settings_.value("download/directory").toString().toStdString()); + //addParams.storage_mode = libtorrent::storage_mode_allocate; + qtrapids::QTorrentHandle handle = btSession_.addTorrent(addParams); + dlView_->newItem(handle); +// torrentHandles_.push_back(handlePtr); +#ifdef QTRAPIDS_DEBUG + qDebug() << "Is valid: " << handle.isValid(); +#endif +} + + +void MainWindow::on_alert(std::auto_ptr al) +{ + if (al.get() != NULL) { +// qDebug() +// << "MainWindow::on_torrentAlert(): " +// << QString::fromStdString(al->message()); + TorrentAlert *torrentAlert + = dynamic_cast (al.get()); + + if (torrentAlert) { + qtrapids::QTorrentHandle torrentHandle = qtrapids::QTorrentHandle(torrentAlert->handle); + dlView_->updateItem(qtrapids::QTorrentHandle(torrentAlert->handle)); + } + + } } +/* +bool MainWindow::IsNewTorrent(std::auto_ptr handlePtr) +{ + for (unsigned i = 0; i < torrentHandles_.size(); ++i) { + if (torrentHandles_.at(i).get() == handlePtr.get()) { + return false; + } else { + return true; + } + } +} +*/