/** * Sets up the main window. */ GtkMainWindow::GtkMainWindow(GtkWindow *win, const Glib::RefPtr<Gtk::Builder> rbuilder) : Gtk::Window(win), builder(rbuilder), m_core(Application::getSingleton()->getCore()) { notify_init ("gTorrent"); GtkTorrentSideBar *sidebar; Gtk::Revealer *revealer; builder->get_widget( "addTorrentButton", addTorrentButton); builder->get_widget( "addTorrentButton", addTorrentButton); builder->get_widget( "addMagnetButton", addMagnetButton); builder->get_widget( "resumeButton", resumeButton); builder->get_widget( "pauseButton", pauseButton); builder->get_widget( "deleteButton", removeButton); //builder->get_widget( "preferencesButton", propertiesButton); builder->get_widget( "settingsButton", settingsButton); builder->get_widget( "panel", panel); builder->get_widget( "scrolledWindow", scrolledWindow); builder->get_widget( "vSepOne", vSeparatorOne); builder->get_widget( "vSepTwo", vSeparatorTwo); builder->get_widget( "sidebarRev", revealer); builder->get_widget_derived( "infobar", m_infobar); builder->get_widget_derived( "treeview", m_treeview); builder->get_widget_derived( "sidebar", sidebar); panel->pack2(*m_infobar); // Apparently can't use lambdas on these two unless doing something awful Glib::signal_timeout().connect_seconds(sigc::mem_fun(*this, &GtkMainWindow::onSecTick), 1); signal_delete_event().connect(sigc::mem_fun(*this, &GtkMainWindow::onDestroy)); addTorrentButton->signal_clicked().connect([this](){ onAddBtnClicked();}); pauseButton ->signal_clicked().connect([this](){ onPauseBtnClicked();}); resumeButton ->signal_clicked().connect([this](){ onResumeBtnClicked();}); removeButton ->signal_clicked().connect([this](){ onRemoveBtnClicked();}); settingsButton ->signal_clicked().connect([this](){ onSettingsBtnClicked();}); addMagnetButton ->signal_clicked().connect([this](){ onAddMagnetBtnClicked();}); //propertiesButton->signal_clicked().connect([revealer](){ revealer->set_reveal_child(!revealer->get_reveal_child());}); magEntry = Gtk::manage(new Gtk::Entry()); revealer->set_reveal_child(true); magEntry->set_visible(); magEntry->set_width_chars(75); magPopover = Gtk::manage(new Gtk::Popover()); magPopover->add(*magEntry); magPopover->set_relative_to(*addMagnetButton); addMagnetButton->set_popover(*magPopover); magPopover->set_position(Gtk::POS_LEFT); sidebar_scrolledwindow->set_min_content_width(150); for(auto tor : Application::getSingleton()->getCore()->getTorrents()) { tor->onStateChanged = [this](int oldstate, std::shared_ptr<gt::Torrent> t){ torrentStateChangedCallback(oldstate, t); }; m_treeview->addCell(tor); } if (gt::Settings::settings["FileAssociation"] == "" || gt::Settings::settings["FileAssociation"] == "-1") { GtkAssociationDialog *dialog = 0; builder->get_widget_derived("fileAssociationDialog", dialog); dialog->set_transient_for(*this); dialog->set_default_response(1); int code = dialog->run(); if(code != -1) gt::Platform::associate(dialog->aWithMagnets, dialog->aWithTorrents); gt::Settings::settings["FileAssociation"] = std::to_string(code); delete dialog; } d = new GtkSettingsDialog(this); }
/** * Sets up the main window. */ GtkMainWindow::GtkMainWindow() : m_core(Application::getSingleton()->getCore()) { //TODO:This needs to be refactored this->set_position(Gtk::WIN_POS_CENTER); this->set_default_size(800, 500); Gtk::Paned *panel = Gtk::manage(new Gtk::Paned(Gtk::ORIENTATION_VERTICAL)); m_infobar = Gtk::manage(new GtkTorrentInfoBar()); m_treeview = Gtk::manage(new GtkTorrentTreeView(m_infobar)); panel->pack1(*m_treeview); panel->pack2(*m_infobar); Glib:: signal_timeout().connect(sigc::mem_fun(*this, &GtkMainWindow::onSecTick), 1000); this->signal_delete_event().connect(sigc::mem_fun(*this, &GtkMainWindow::onDestroy)); header = Gtk::manage(new Gtk::HeaderBar()); header->set_show_close_button(true); header->set_title("gTorrent"); Gtk::Button *btn_add_link = Gtk::manage(new Gtk::Button()); Gtk::Button *btn_add_torrent = Gtk::manage(new Gtk::Button()); Gtk::Button *btn_connect = Gtk::manage(new Gtk::Button()); Gtk::Button *btn_pause = Gtk::manage(new Gtk::Button()); Gtk::Button *btn_properties = Gtk::manage(new Gtk::Button()); Gtk::Button *btn_remove = Gtk::manage(new Gtk::Button()); Gtk::Button *btn_resume = Gtk::manage(new Gtk::Button()); Gtk::Button *btn_settings = Gtk::manage(new Gtk::Button()); Gtk::VSeparator *separator0 = Gtk::manage(new Gtk::VSeparator()); Gtk::VSeparator *separator1 = Gtk::manage(new Gtk::VSeparator()); Gtk::VSeparator *separator2 = Gtk::manage(new Gtk::VSeparator()); btn_add_link ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onAddMagnetBtnClicked)); btn_add_torrent->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onAddBtnClicked)); btn_pause ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onPauseBtnClicked)); btn_resume ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onResumeBtnClicked)); btn_remove ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onRemoveBtnClicked)); btn_settings ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onSettingsBtnClicked)); btn_add_link ->set_image_from_icon_name("edit-paste"); btn_add_torrent->set_image_from_icon_name("gtk-add"); btn_connect ->set_image_from_icon_name("gtk-directory"); btn_pause ->set_image_from_icon_name("media-playback-pause"); btn_properties ->set_image_from_icon_name("gtk-properties"); btn_remove ->set_image_from_icon_name("gtk-cancel"); btn_resume ->set_image_from_icon_name("media-playback-start"); btn_settings ->set_image_from_icon_name("emblem-system-symbolic"); //TODO:align properties button to right of top bar //btn_properties->set_alignment(1.0f,0.0f); header->add(*btn_add_torrent); header->add(*btn_add_link); header->add(*btn_connect); header->add(*separator0); header->add(*btn_pause); header->add(*btn_resume); header->add(*btn_remove); header->add(*separator1); header->add(*btn_properties); header->add(*separator2); header->pack_end(*btn_settings); // Let's add some DnD goodness vector<Gtk::TargetEntry> listTargets; listTargets.push_back(Gtk::TargetEntry("STRING")); listTargets.push_back(Gtk::TargetEntry("text/plain")); listTargets.push_back(Gtk::TargetEntry("text/uri-list")); listTargets.push_back(Gtk::TargetEntry("application/x-bittorrent")); m_treeview->drag_dest_set(listTargets, Gtk::DEST_DEFAULT_MOTION | Gtk::DEST_DEFAULT_DROP, Gdk::ACTION_COPY | Gdk::ACTION_MOVE | Gdk::ACTION_LINK | Gdk::ACTION_PRIVATE); m_treeview->signal_drag_data_received().connect(sigc::mem_fun(*this, &GtkMainWindow::onFileDropped)); set_titlebar(*header); add(*panel); show_all(); m_infobar->set_visible(false); if (gt::Settings::getOptionAsString("FileAssociation") == "" || gt::Settings::getOptionAsInt("FileAssociation") == -1) { GtkAssociationDialog *dialog = new GtkAssociationDialog(*this); int code = dialog->run();// code = -1 (Remind me later), 0(Do not associate), 1(Associate with torrents), 2(Associate with magnets), 3(Assiciate with both) if(code != -1) gt::Platform::associate(code & 2, code & 1); gt::Settings::setOption("FileAssociation", code); delete dialog; } d = new GtkSettingsDialog(this); }
/** * Sets up the main window. */ GtkMainWindow::GtkMainWindow() : m_core(Application::getSingleton()->getCore()) { //TODO:This needs to be refactored notify_init ("Hello world!"); set_position(Gtk::WIN_POS_CENTER); set_default_size(800, 500); magtxt->set_visible(); magtxt->set_width_chars(75); magPop->add(*magtxt); btn_add_link->set_popover(*magPop); Gtk::Paned *panel = Gtk::manage(new Gtk::Paned(Gtk::ORIENTATION_VERTICAL)); m_swin = Gtk::manage(new Gtk::ScrolledWindow()); m_infobar = Gtk::manage(new GtkTorrentInfoBar()); m_treeview = Gtk::manage(new GtkTorrentTreeView(this, m_infobar)); m_infobar->set_margin_left(5); m_infobar->set_margin_right(5); m_swin->add(*m_treeview); panel->pack1(*m_swin); panel->pack2(*m_infobar); Glib::signal_timeout().connect_seconds(sigc::mem_fun(*this, &GtkMainWindow::onSecTick), 1); signal_delete_event().connect(sigc::mem_fun(*this, &GtkMainWindow::onDestroy)); signal_key_press_event().connect(sigc::mem_fun(*this, &GtkMainWindow::onKeyPress), false); header = Gtk::manage(new Gtk::HeaderBar()); header->set_show_close_button(true); header->set_title("gTorrent"); Gtk::VSeparator *separator0 = Gtk::manage(new Gtk::VSeparator()); Gtk::VSeparator *separator2 = Gtk::manage(new Gtk::VSeparator()); btn_add_link ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onAddMagnetBtnClicked)); btn_add_torrent->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onAddBtnClicked)); btn_pause ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onPauseBtnClicked)); btn_resume ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onResumeBtnClicked)); btn_remove ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onRemoveBtnClicked)); btn_settings ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onSettingsBtnClicked)); btn_properties ->signal_clicked().connect(sigc::mem_fun(*this, &GtkMainWindow::onPropertiesBtnClicked)); btn_add_link ->set_image_from_icon_name("insert-link-symbolic"); btn_add_torrent->set_image_from_icon_name("list-add-symbolic"); btn_pause ->set_image_from_icon_name("media-playback-pause-symbolic"); btn_properties ->set_image_from_icon_name("preferences-system-symbolic"); btn_remove ->set_image_from_icon_name("edit-delete-symbolic"); btn_resume ->set_image_from_icon_name("media-playback-start-symbolic"); btn_settings ->set_image_from_icon_name("emblem-system-symbolic"); //TODO:align properties button to right of top bar //btn_properties->set_alignment(1.0f,0.0f); header->add(*btn_add_torrent); header->add(*btn_add_link); header->add(*separator0); header->add(*btn_resume); header->add(*btn_pause); header->add(*btn_remove); header->add(*separator1); header->add(*btn_properties); header->add(*separator2); header->pack_end(*btn_settings); // Let's add some DnD goodness std::vector<Gtk::TargetEntry> listTargets; listTargets.push_back(Gtk::TargetEntry("STRING")); listTargets.push_back(Gtk::TargetEntry("text/plain")); listTargets.push_back(Gtk::TargetEntry("text/uri-list")); listTargets.push_back(Gtk::TargetEntry("application/x-bittorrent")); m_treeview->drag_dest_set(listTargets, Gtk::DEST_DEFAULT_MOTION | Gtk::DEST_DEFAULT_DROP, Gdk::ACTION_COPY | Gdk::ACTION_MOVE | Gdk::ACTION_LINK | Gdk::ACTION_PRIVATE); m_treeview->signal_drag_data_received().connect(sigc::mem_fun(*this, &GtkMainWindow::onFileDropped)); set_titlebar(*header); add(*panel); show_all(); btn_pause->hide(); m_infobar->set_visible(false); // for some reason, the treeview start with its first element selected m_treeview->get_selection()->unselect_all(); for(auto tor : Application::getSingleton()->getCore()->getTorrents()) { tor->onStateChanged = std::bind(&GtkMainWindow::torrentStateChangedCallback, this, std::placeholders::_1, std::placeholders::_2); m_treeview->addCell(tor); } gt::Log::Debug(gt::Settings::settings["FileAssociation"].c_str()); if (gt::Settings::settings["FileAssociation"] == "" || gt::Settings::settings["FileAssociation"] == "-1") { GtkAssociationDialog *dialog = new GtkAssociationDialog(*this); int code = dialog->run();// code = -1 (Remind me later), 0(Do not associate), 1(Associate with torrents), 2(Associate with magnets), 3(Assiciate with both) if(code != -1) gt::Platform::associate(code & 2, code & 1); gt::Settings::settings["FileAssociation"] = std::to_string(code); delete dialog; } d = new GtkSettingsDialog(this); }