Refactor Empty states
This commit is contained in:
parent
acaa06749e
commit
d4a822fa7e
@ -5,7 +5,6 @@ podcasts-gtk/resources/org.gnome.Podcasts.desktop
|
|||||||
podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml
|
podcasts-gtk/resources/org.gnome.Podcasts.appdata.xml
|
||||||
|
|
||||||
# ui files
|
# ui files
|
||||||
podcasts-gtk/resources/gtk/empty_show.ui
|
|
||||||
podcasts-gtk/resources/gtk/empty_view.ui
|
podcasts-gtk/resources/gtk/empty_view.ui
|
||||||
podcasts-gtk/resources/gtk/episode_widget.ui
|
podcasts-gtk/resources/gtk/episode_widget.ui
|
||||||
podcasts-gtk/resources/gtk/hamburger.ui
|
podcasts-gtk/resources/gtk/hamburger.ui
|
||||||
|
|||||||
@ -1,63 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Generated with glade 3.22.0 -->
|
|
||||||
<interface>
|
|
||||||
<requires lib="gtk+" version="3.20"/>
|
|
||||||
<object class="GtkBox" id="empty_show">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="halign">center</property>
|
|
||||||
<property name="valign">center</property>
|
|
||||||
<property name="hexpand">True</property>
|
|
||||||
<property name="vexpand">True</property>
|
|
||||||
<property name="orientation">vertical</property>
|
|
||||||
<property name="spacing">12</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkImage">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="pixel_size">128</property>
|
|
||||||
<property name="icon_name">application-rss+xml-symbolic</property>
|
|
||||||
<property name="use_fallback">True</property>
|
|
||||||
<style>
|
|
||||||
<class name="dim-label"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">This show does not have any episodes</property>
|
|
||||||
<attributes>
|
|
||||||
<attribute name="weight" value="bold"/>
|
|
||||||
<attribute name="scale" value="1.4399999999999999"/>
|
|
||||||
</attributes>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkLabel">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="label" translatable="yes">If you think this is an error, please consider opening a bug report.</property>
|
|
||||||
<style>
|
|
||||||
<class name="dim-label"/>
|
|
||||||
</style>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">2</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</interface>
|
|
||||||
@ -30,6 +30,47 @@ Tobias Bernard
|
|||||||
<!-- interface-description A podcast client for the GNOME Desktop -->
|
<!-- interface-description A podcast client for the GNOME Desktop -->
|
||||||
<!-- interface-copyright 2017 - 2018 -->
|
<!-- interface-copyright 2017 - 2018 -->
|
||||||
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
|
<!-- interface-authors Jordan Petridis\nTobias Bernard -->
|
||||||
|
<object class="GtkBox" id="empty_show">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="halign">center</property>
|
||||||
|
<property name="valign">center</property>
|
||||||
|
<property name="hexpand">True</property>
|
||||||
|
<property name="vexpand">True</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="spacing">12</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">This show does not have episodes yet</property>
|
||||||
|
<attributes>
|
||||||
|
<attribute name="weight" value="bold"/>
|
||||||
|
<attribute name="scale" value="1.4399999999999999"/>
|
||||||
|
</attributes>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="label" translatable="yes">If you think this is an error, please consider writting a bug report.</property>
|
||||||
|
<style>
|
||||||
|
<class name="dim-label"/>
|
||||||
|
</style>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">True</property>
|
||||||
|
<property name="position">2</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
<object class="GtkBox" id="empty_view">
|
<object class="GtkBox" id="empty_view">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
|
|||||||
@ -4,7 +4,6 @@
|
|||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/episode_widget.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/episode_widget.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/show_widget.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/show_widget.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/empty_view.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/empty_view.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/empty_show.ui</file>
|
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/home_view.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/home_view.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/home_episode.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/home_episode.ui</file>
|
||||||
<file compressed="true" preprocess="xml-stripblanks">gtk/headerbar.ui</file>
|
<file compressed="true" preprocess="xml-stripblanks">gtk/headerbar.ui</file>
|
||||||
|
|||||||
@ -10,6 +10,7 @@ use podcasts_data::errors::DataError;
|
|||||||
use app::Action;
|
use app::Action;
|
||||||
use widgets::{EmptyView, HomeView};
|
use widgets::{EmptyView, HomeView};
|
||||||
|
|
||||||
|
use std::ops::Deref;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
@ -30,12 +31,12 @@ pub(crate) struct HomeStack {
|
|||||||
impl HomeStack {
|
impl HomeStack {
|
||||||
pub(crate) fn new(sender: Sender<Action>) -> Result<HomeStack, Error> {
|
pub(crate) fn new(sender: Sender<Action>) -> Result<HomeStack, Error> {
|
||||||
let episodes = HomeView::new(sender.clone(), None)?;
|
let episodes = HomeView::new(sender.clone(), None)?;
|
||||||
let empty = EmptyView::new();
|
let empty = EmptyView::default();
|
||||||
let stack = gtk::Stack::new();
|
let stack = gtk::Stack::new();
|
||||||
let state = State::Empty;
|
let state = State::Empty;
|
||||||
|
|
||||||
stack.add_named(episodes.view.container(), "home");
|
stack.add_named(episodes.view.container(), "home");
|
||||||
stack.add_named(&empty.container, "empty");
|
stack.add_named(empty.deref(), "empty");
|
||||||
|
|
||||||
let mut home = HomeStack {
|
let mut home = HomeStack {
|
||||||
empty,
|
empty,
|
||||||
|
|||||||
@ -11,6 +11,7 @@ use utils::get_ignored_shows;
|
|||||||
use widgets::EmptyView;
|
use widgets::EmptyView;
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
|
use std::ops::Deref;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
@ -31,12 +32,12 @@ pub(crate) struct ShowStack {
|
|||||||
impl ShowStack {
|
impl ShowStack {
|
||||||
pub(crate) fn new(sender: Sender<Action>) -> Self {
|
pub(crate) fn new(sender: Sender<Action>) -> Self {
|
||||||
let populated = Rc::new(RefCell::new(PopulatedStack::new(sender.clone())));
|
let populated = Rc::new(RefCell::new(PopulatedStack::new(sender.clone())));
|
||||||
let empty = EmptyView::new();
|
let empty = EmptyView::default();
|
||||||
let stack = gtk::Stack::new();
|
let stack = gtk::Stack::new();
|
||||||
let state = ShowState::Empty;
|
let state = ShowState::Empty;
|
||||||
|
|
||||||
stack.add_named(&populated.borrow().container(), "populated");
|
stack.add_named(&populated.borrow().container(), "populated");
|
||||||
stack.add_named(&empty.container, "empty");
|
stack.add_named(empty.deref(), "empty");
|
||||||
|
|
||||||
let mut show = ShowStack {
|
let mut show = ShowStack {
|
||||||
empty,
|
empty,
|
||||||
|
|||||||
@ -1,21 +1,38 @@
|
|||||||
use gtk;
|
use gtk;
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Clone, Debug)]
|
||||||
pub(crate) struct EmptyView {
|
pub(crate) struct EmptyView(gtk::Box);
|
||||||
pub(crate) container: gtk::Box,
|
|
||||||
|
impl Deref for EmptyView {
|
||||||
|
type Target = gtk::Box;
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for EmptyView {
|
impl Default for EmptyView {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/empty_view.ui");
|
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/empty_view.ui");
|
||||||
let view: gtk::Box = builder.get_object("empty_view").unwrap();
|
let view: gtk::Box = builder.get_object("empty_view").unwrap();
|
||||||
|
EmptyView(view)
|
||||||
EmptyView { container: view }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EmptyView {
|
#[derive(Clone, Debug)]
|
||||||
pub(crate) fn new() -> EmptyView {
|
pub(crate) struct EmptyShow(gtk::Box);
|
||||||
EmptyView::default()
|
|
||||||
|
impl Deref for EmptyShow {
|
||||||
|
type Target = gtk::Box;
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for EmptyShow {
|
||||||
|
fn default() -> Self {
|
||||||
|
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/empty_view.ui");
|
||||||
|
let box_: gtk::Box = builder.get_object("empty_show").unwrap();
|
||||||
|
EmptyShow(box_)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ mod shows_view;
|
|||||||
|
|
||||||
pub(crate) use self::aboutdialog::about_dialog;
|
pub(crate) use self::aboutdialog::about_dialog;
|
||||||
pub(crate) use self::base_view::BaseView;
|
pub(crate) use self::base_view::BaseView;
|
||||||
pub(crate) use self::empty::EmptyView;
|
pub(crate) use self::empty::{EmptyShow, EmptyView};
|
||||||
pub(crate) use self::episode::EpisodeWidget;
|
pub(crate) use self::episode::EpisodeWidget;
|
||||||
pub(crate) use self::home_view::HomeView;
|
pub(crate) use self::home_view::HomeView;
|
||||||
pub(crate) use self::show::ShowWidget;
|
pub(crate) use self::show::ShowWidget;
|
||||||
|
|||||||
@ -13,8 +13,9 @@ use podcasts_data::Show;
|
|||||||
|
|
||||||
use app::Action;
|
use app::Action;
|
||||||
use utils::{self, lazy_load};
|
use utils::{self, lazy_load};
|
||||||
use widgets::{BaseView, EpisodeWidget, ShowMenu};
|
use widgets::{BaseView, EmptyShow, EpisodeWidget, ShowMenu};
|
||||||
|
|
||||||
|
use std::ops::Deref;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
@ -122,11 +123,8 @@ fn populate_listbox(
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/empty_show.ui");
|
let empty = EmptyShow::default();
|
||||||
let container: gtk::Box = builder
|
show.episodes.add(empty.deref());
|
||||||
.get_object("empty_show")
|
|
||||||
.ok_or_else(|| format_err!("FOO"))?;
|
|
||||||
show.episodes.add(&container);
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user