|
@@ -13,19 +13,45 @@ namespace components {
|
|
|
set_default_size(800, 600);
|
|
|
set_icon_name("youtube");
|
|
|
|
|
|
+ // Searchbar
|
|
|
m_search_btn.set_child(*(this->getButtonContents("Поиск", "find")));
|
|
|
m_search_btn.signal_clicked().connect(sigc::mem_fun(
|
|
|
*this,
|
|
|
&MainWindow::on_btn_clicked
|
|
|
));
|
|
|
-
|
|
|
- // Searchbar
|
|
|
+ m_search_field.set_hexpand(true);
|
|
|
m_search_box.append(m_search_field);
|
|
|
m_search_box.append(m_search_btn);
|
|
|
+ m_search_box.set_margin(8);
|
|
|
+
|
|
|
+ // --Body-
|
|
|
+ // Модель видео
|
|
|
+ m_video_storage = Gio::ListStore<VideoModel>::create();
|
|
|
+ m_video_storage->append(VideoModel::create(1, "7yZvzo4_s6Q", "Hermitcraft 10 - Ep 12: Who Has The Best Storage System???"));
|
|
|
+
|
|
|
+ // Модель выбора
|
|
|
+ auto selection_model = Gtk::SingleSelection::create(m_video_storage);
|
|
|
+ selection_model->set_autoselect(false);
|
|
|
+ selection_model->set_can_unselect(true);
|
|
|
+ m_video_list.set_model(selection_model);
|
|
|
|
|
|
- // Body
|
|
|
+ // Создание фабрики
|
|
|
+ auto factory = Gtk::SignalListItemFactory::create();
|
|
|
+ factory->signal_setup().connect(
|
|
|
+ sigc::mem_fun(*this, &MainWindow::onVideoSetup));
|
|
|
+ factory->signal_bind().connect(
|
|
|
+ sigc::mem_fun(*this, &MainWindow::onVideoBind));
|
|
|
+ m_video_list.set_factory(factory);
|
|
|
+
|
|
|
+ // Прокручиваемое окно
|
|
|
+ m_video_scroll.set_policy(Gtk::PolicyType::AUTOMATIC, Gtk::PolicyType::AUTOMATIC);
|
|
|
+ m_video_scroll.set_expand(true);
|
|
|
+ m_video_scroll.set_child(m_video_list);
|
|
|
+
|
|
|
+ m_body.append(m_video_scroll);
|
|
|
|
|
|
// Layout
|
|
|
+ m_layout.set_homogeneous(false);
|
|
|
m_layout.append(m_search_box);
|
|
|
m_layout.append(m_body);
|
|
|
|
|
@@ -38,7 +64,59 @@ namespace components {
|
|
|
|
|
|
void MainWindow::on_btn_clicked()
|
|
|
{
|
|
|
- std::cout << "CLICK!" << std::endl;
|
|
|
+ //m_video_storage->append(VideoModel::create(2, "test."));
|
|
|
+ }
|
|
|
+
|
|
|
+ void MainWindow::onVideoSetup(const Glib::RefPtr<Gtk::ListItem>& list_item)
|
|
|
+ {
|
|
|
+ auto box_main = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
|
|
|
+ auto thumbnail = Gtk::make_managed<Gtk::Picture>();
|
|
|
+ auto label = Gtk::make_managed<Gtk::Label>("", Gtk::Align::START);
|
|
|
+ box_main->append(*thumbnail);
|
|
|
+ box_main->append(*label);
|
|
|
+ list_item->set_child(*box_main);
|
|
|
+ }
|
|
|
+
|
|
|
+ void MainWindow::onVideoBind(const Glib::RefPtr<Gtk::ListItem>& list_item)
|
|
|
+ {
|
|
|
+ auto pos = list_item->get_position();
|
|
|
+ if (pos == GTK_INVALID_LIST_POSITION) return;
|
|
|
+ auto item = m_video_storage->get_item(pos);
|
|
|
+
|
|
|
+ auto box_main = dynamic_cast<Gtk::Box*>(list_item->get_child());
|
|
|
+ if (!box_main) return;
|
|
|
+
|
|
|
+ auto thumbnail = dynamic_cast<Gtk::Picture*>(box_main->get_first_child());
|
|
|
+ if (!thumbnail) return;
|
|
|
+
|
|
|
+ // Загрузка изображения превью видео с диска
|
|
|
+ std::string thumbnail_path = "thumbnails/default/" + item->m_yt_id + ".jpg";
|
|
|
+ Glib::RefPtr<Gdk::Pixbuf> thumbnail_pixbuf;
|
|
|
+ try {
|
|
|
+ thumbnail_pixbuf = Gdk::Pixbuf::create_from_file(thumbnail_path);
|
|
|
+ } catch (Glib::FileError& e) {
|
|
|
+ switch (e.code()) {
|
|
|
+ case Glib::FileError::Code::NO_SUCH_ENTITY:
|
|
|
+ // Превью на диске не найдено. Скачиваем...
|
|
|
+ ytapi::downloadMediumThumnail(item->m_yt_id, thumbnail_path);
|
|
|
+ // ...и присваиваем
|
|
|
+ thumbnail_pixbuf = Gdk::Pixbuf::create_from_file(thumbnail_path);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ std::cout << "Unhandled error when creating thumbnail. Code is: " << e.code();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ auto thumbnail_texture = Gdk::Texture::create_for_pixbuf(thumbnail_pixbuf);
|
|
|
+ thumbnail->set_paintable(thumbnail_texture);
|
|
|
+ thumbnail->set_can_shrink(false);
|
|
|
+ thumbnail->set_content_fit(Gtk::ContentFit::COVER);
|
|
|
+
|
|
|
+ auto lbl_title = dynamic_cast<Gtk::Label*>(thumbnail->get_next_sibling());
|
|
|
+ if (!lbl_title) return;
|
|
|
+
|
|
|
+ lbl_title->set_text(item->m_title);
|
|
|
}
|
|
|
|
|
|
Gtk::Box* MainWindow::getButtonContents(Glib::ustring text, std::string icon_name)
|
|
@@ -47,7 +125,7 @@ namespace components {
|
|
|
auto icon = Gio::Icon::create(icon_name);
|
|
|
auto img_icon = Gtk::make_managed<Gtk::Image>(icon);
|
|
|
auto lbl_main = Gtk::make_managed<Gtk::Label>(text);
|
|
|
- lbl_main->set_expand(true);
|
|
|
+ lbl_main->set_hexpand(false);
|
|
|
|
|
|
// Добавление в контейнер
|
|
|
auto box_main = Gtk::make_managed<Gtk::Box>(
|