HomeView: Use the new BaseView abstraction
This commit is contained in:
parent
7538e76537
commit
4e59d648ef
@ -3,20 +3,20 @@
|
|||||||
|
|
||||||
Copyright (C) 2017 - 2018
|
Copyright (C) 2017 - 2018
|
||||||
|
|
||||||
This file is part of Hammond.
|
This file is part of GNOME Podcasts.
|
||||||
|
|
||||||
Hammond is free software: you can redistribute it and/or modify
|
GNOME Podcasts is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
Hammond is distributed in the hope that it will be useful,
|
GNOME Podcasts is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Hammond. If not, see <http://www.gnu.org/licenses/>.
|
along with GNOME Podcasts. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
Jordan Petridis
|
Jordan Petridis
|
||||||
@ -24,55 +24,15 @@ Tobias Bernard
|
|||||||
|
|
||||||
-->
|
-->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.20"/>
|
<requires lib="gtk+" version="3.22"/>
|
||||||
<!-- interface-license-type gplv3 -->
|
<!-- interface-license-type gplv3 -->
|
||||||
<!-- interface-name Hammond -->
|
<!-- interface-name GNOME Podcasts -->
|
||||||
<!-- 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="container">
|
|
||||||
<property name="name">container</property>
|
|
||||||
<property name="width_request">290</property>
|
|
||||||
<property name="height_request">420</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="orientation">vertical</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkScrolledWindow" id="scrolled_window">
|
|
||||||
<property name="name">scrolled_window</property>
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">True</property>
|
|
||||||
<property name="hscrollbar_policy">never</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkViewport">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkBox">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<child>
|
|
||||||
<object class="GtkBox">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="hexpand">True</property>
|
|
||||||
<property name="orientation">vertical</property>
|
|
||||||
<child>
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkBox" id="frame_parent">
|
<object class="GtkBox" id="frame_parent">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="margin_left">32</property>
|
|
||||||
<property name="margin_right">32</property>
|
|
||||||
<property name="margin_top">32</property>
|
<property name="margin_top">32</property>
|
||||||
<property name="margin_bottom">32</property>
|
<property name="margin_bottom">32</property>
|
||||||
<property name="hexpand">True</property>
|
<property name="hexpand">True</property>
|
||||||
@ -362,38 +322,4 @@ Tobias Bernard
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">1</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkBox">
|
|
||||||
<property name="visible">True</property>
|
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="hexpand">True</property>
|
|
||||||
<property name="orientation">vertical</property>
|
|
||||||
<child>
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">False</property>
|
|
||||||
<property name="fill">False</property>
|
|
||||||
<property name="position">2</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
<packing>
|
|
||||||
<property name="expand">True</property>
|
|
||||||
<property name="fill">True</property>
|
|
||||||
<property name="position">0</property>
|
|
||||||
</packing>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</interface>
|
</interface>
|
||||||
|
|||||||
@ -34,7 +34,7 @@ impl HomeStack {
|
|||||||
let stack = gtk::Stack::new();
|
let stack = gtk::Stack::new();
|
||||||
let state = State::Empty;
|
let state = State::Empty;
|
||||||
|
|
||||||
stack.add_named(&episodes.container, "home");
|
stack.add_named(episodes.container(), "home");
|
||||||
stack.add_named(&empty.container, "empty");
|
stack.add_named(&empty.container, "empty");
|
||||||
|
|
||||||
let mut home = HomeStack {
|
let mut home = HomeStack {
|
||||||
@ -67,14 +67,14 @@ impl HomeStack {
|
|||||||
|
|
||||||
fn replace_view(&mut self) -> Result<(), Error> {
|
fn replace_view(&mut self) -> Result<(), Error> {
|
||||||
// Get the container of the view
|
// Get the container of the view
|
||||||
let old = &self.episodes.container.clone();
|
let old = &self.episodes.container().clone();
|
||||||
let eps = HomeView::new(self.sender.clone())?;
|
let eps = HomeView::new(self.sender.clone())?;
|
||||||
|
|
||||||
// Remove the old widget and add the new one
|
// Remove the old widget and add the new one
|
||||||
// during this the previous view is removed,
|
// during this the previous view is removed,
|
||||||
// and the visible child falls back to empty view.
|
// and the visible child falls back to empty view.
|
||||||
self.stack.remove(old);
|
self.stack.remove(old);
|
||||||
self.stack.add_named(&eps.container, "home");
|
self.stack.add_named(eps.container(), "home");
|
||||||
// Keep the previous state.
|
// Keep the previous state.
|
||||||
let s = self.state;
|
let s = self.state;
|
||||||
// Set the visible child back to the previous one to avoid
|
// Set the visible child back to the previous one to avoid
|
||||||
|
|||||||
@ -11,7 +11,7 @@ use podcasts_data::EpisodeWidgetModel;
|
|||||||
|
|
||||||
use app::Action;
|
use app::Action;
|
||||||
use utils::{self, lazy_load_full};
|
use utils::{self, lazy_load_full};
|
||||||
use widgets::EpisodeWidget;
|
use widgets::{BaseView, EpisodeWidget};
|
||||||
|
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
@ -33,8 +33,7 @@ enum ListSplit {
|
|||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub(crate) struct HomeView {
|
pub(crate) struct HomeView {
|
||||||
pub(crate) container: gtk::Box,
|
view: BaseView,
|
||||||
scrolled_window: gtk::ScrolledWindow,
|
|
||||||
frame_parent: gtk::Box,
|
frame_parent: gtk::Box,
|
||||||
today_box: gtk::Box,
|
today_box: gtk::Box,
|
||||||
yday_box: gtk::Box,
|
yday_box: gtk::Box,
|
||||||
@ -50,9 +49,8 @@ pub(crate) struct HomeView {
|
|||||||
|
|
||||||
impl Default for HomeView {
|
impl Default for HomeView {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
|
let view = BaseView::default();
|
||||||
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/home_view.ui");
|
let builder = gtk::Builder::new_from_resource("/org/gnome/Podcasts/gtk/home_view.ui");
|
||||||
let container: gtk::Box = builder.get_object("container").unwrap();
|
|
||||||
let scrolled_window: gtk::ScrolledWindow = builder.get_object("scrolled_window").unwrap();
|
|
||||||
let frame_parent: gtk::Box = builder.get_object("frame_parent").unwrap();
|
let frame_parent: gtk::Box = builder.get_object("frame_parent").unwrap();
|
||||||
let today_box: gtk::Box = builder.get_object("today_box").unwrap();
|
let today_box: gtk::Box = builder.get_object("today_box").unwrap();
|
||||||
let yday_box: gtk::Box = builder.get_object("yday_box").unwrap();
|
let yday_box: gtk::Box = builder.get_object("yday_box").unwrap();
|
||||||
@ -65,9 +63,10 @@ impl Default for HomeView {
|
|||||||
let month_list: gtk::ListBox = builder.get_object("month_list").unwrap();
|
let month_list: gtk::ListBox = builder.get_object("month_list").unwrap();
|
||||||
let rest_list: gtk::ListBox = builder.get_object("rest_list").unwrap();
|
let rest_list: gtk::ListBox = builder.get_object("rest_list").unwrap();
|
||||||
|
|
||||||
|
view.add(&frame_parent);
|
||||||
|
|
||||||
HomeView {
|
HomeView {
|
||||||
container,
|
view,
|
||||||
scrolled_window,
|
|
||||||
frame_parent,
|
frame_parent,
|
||||||
today_box,
|
today_box,
|
||||||
yday_box,
|
yday_box,
|
||||||
@ -116,10 +115,18 @@ impl HomeView {
|
|||||||
};
|
};
|
||||||
|
|
||||||
lazy_load_full(episodes, func, callback);
|
lazy_load_full(episodes, func, callback);
|
||||||
view.container.show_all();
|
view.container().show_all();
|
||||||
Ok(view)
|
Ok(view)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn container(&self) -> >k::Box {
|
||||||
|
self.view.container()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn scrolled_window(&self) -> >k::ScrolledWindow {
|
||||||
|
self.view.scrolled_window()
|
||||||
|
}
|
||||||
|
|
||||||
/// Set scrolled window vertical adjustment.
|
/// Set scrolled window vertical adjustment.
|
||||||
fn set_vadjustment(&self) -> Result<(), Error> {
|
fn set_vadjustment(&self) -> Result<(), Error> {
|
||||||
let guard = EPISODES_VIEW_VALIGNMENT
|
let guard = EPISODES_VIEW_VALIGNMENT
|
||||||
@ -130,7 +137,7 @@ impl HomeView {
|
|||||||
// Copy the vertical scrollbar adjustment from the old view into the new one.
|
// Copy the vertical scrollbar adjustment from the old view into the new one.
|
||||||
let res = fragile
|
let res = fragile
|
||||||
.try_get()
|
.try_get()
|
||||||
.map(|x| utils::smooth_scroll_to(&self.scrolled_window, &x))
|
.map(|x| utils::smooth_scroll_to(self.scrolled_window(), &x))
|
||||||
.map_err(From::from);
|
.map_err(From::from);
|
||||||
|
|
||||||
debug_assert!(res.is_ok());
|
debug_assert!(res.is_ok());
|
||||||
@ -144,7 +151,7 @@ impl HomeView {
|
|||||||
pub(crate) fn save_alignment(&self) -> Result<(), Error> {
|
pub(crate) fn save_alignment(&self) -> Result<(), Error> {
|
||||||
if let Ok(mut guard) = EPISODES_VIEW_VALIGNMENT.lock() {
|
if let Ok(mut guard) = EPISODES_VIEW_VALIGNMENT.lock() {
|
||||||
let adj = self
|
let adj = self
|
||||||
.scrolled_window
|
.scrolled_window()
|
||||||
.get_vadjustment()
|
.get_vadjustment()
|
||||||
.ok_or_else(|| format_err!("Could not get the adjustment"))?;
|
.ok_or_else(|| format_err!("Could not get the adjustment"))?;
|
||||||
*guard = Some(Fragile::new(adj));
|
*guard = Some(Fragile::new(adj));
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user