Skip to content

Commit

Permalink
refactor: tabs rewrite to clean up API
Browse files Browse the repository at this point in the history
Tabs relied heavily on `ViewExt`'s `title()` function, while also
requiring a separate `id`. The `id`, if used, should be an internal part
of the struct and not part of its API. This also removes the hashmap as
it will never be faster than sequentially looking up all the names,
since there will most likely never be that many tabs in a `TabbedView`.
  • Loading branch information
ThomasFrans authored and hrkfdn committed Dec 3, 2023
1 parent b37fb7c commit 0a1a9bd
Show file tree
Hide file tree
Showing 9 changed files with 358 additions and 246 deletions.
76 changes: 76 additions & 0 deletions src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,79 @@ impl<V: ViewExt> IntoBoxedViewExt for V {
Box::new(self)
}
}

pub struct BoxedViewExt {
boxed_view: Box<dyn ViewExt>,
}

impl BoxedViewExt {
pub fn new(view: Box<dyn ViewExt>) -> Self {
Self { boxed_view: view }
}
}

impl View for BoxedViewExt {
fn draw(&self, printer: &cursive::Printer) {
self.boxed_view.draw(printer);
}

fn layout(&mut self, xy: cursive::Vec2) {
self.boxed_view.layout(xy);
}

fn needs_relayout(&self) -> bool {
self.boxed_view.needs_relayout()
}

fn required_size(&mut self, constraint: cursive::Vec2) -> cursive::Vec2 {
self.boxed_view.required_size(constraint)
}

fn on_event(&mut self, event: cursive::event::Event) -> cursive::event::EventResult {
self.boxed_view.on_event(event)
}

fn call_on_any(&mut self, selector: &cursive::view::Selector, callback: cursive::event::AnyCb) {
self.boxed_view.call_on_any(selector, callback);
}

fn focus_view(
&mut self,
selector: &cursive::view::Selector,
) -> Result<cursive::event::EventResult, cursive::view::ViewNotFound> {
self.boxed_view.focus_view(selector)
}

fn take_focus(
&mut self,
source: cursive::direction::Direction,
) -> Result<cursive::event::EventResult, cursive::view::CannotFocus> {
self.boxed_view.take_focus(source)
}

fn important_area(&self, view_size: cursive::Vec2) -> cursive::Rect {
self.boxed_view.important_area(view_size)
}

fn type_name(&self) -> &'static str {
std::any::type_name::<Self>()
}
}

impl ViewExt for BoxedViewExt {
fn title(&self) -> String {
self.boxed_view.title()
}

fn title_sub(&self) -> String {
self.boxed_view.title_sub()
}

fn on_leave(&self) {
self.boxed_view.on_leave();
}

fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> Result<CommandResult, String> {
self.boxed_view.on_command(s, cmd)
}
}
33 changes: 16 additions & 17 deletions src/ui/album.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ use crate::model::artist::Artist;
use crate::queue::Queue;
use crate::traits::ViewExt;
use crate::ui::listview::ListView;
use crate::ui::tabview::TabView;
use crate::ui::tabbedview::TabbedView;

pub struct AlbumView {
album: Album,
tabs: TabView,
tabs: TabbedView,
}

impl AlbumView {
Expand All @@ -37,27 +37,26 @@ impl AlbumView {
.map(|(id, name)| Artist::new(id.clone(), name.clone()))
.collect();

let tabs = TabView::new()
.tab(
"tracks",
ListView::new(
Arc::new(RwLock::new(tracks)),
queue.clone(),
library.clone(),
)
.with_title("Tracks"),
)
.tab(
"artists",
ListView::new(Arc::new(RwLock::new(artists)), queue, library).with_title("Artists"),
);
let mut tabs = TabbedView::new();
tabs.add_tab(
"Tracks",
ListView::new(
Arc::new(RwLock::new(tracks)),
queue.clone(),
library.clone(),
),
);
tabs.add_tab(
"Artists",
ListView::new(Arc::new(RwLock::new(artists)), queue, library),
);

Self { album, tabs }
}
}

impl ViewWrapper for AlbumView {
wrap_impl!(self.tabs: TabView);
wrap_impl!(self.tabs: TabbedView);
}

impl ViewExt for AlbumView {
Expand Down
29 changes: 11 additions & 18 deletions src/ui/artist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@ use crate::model::track::Track;
use crate::queue::Queue;
use crate::traits::ViewExt;
use crate::ui::listview::ListView;
use crate::ui::tabview::TabView;
use crate::ui::tabbedview::TabbedView;

pub struct ArtistView {
artist: Artist,
tabs: TabView,
tabs: TabbedView,
}

impl ArtistView {
Expand Down Expand Up @@ -61,34 +61,27 @@ impl ArtistView {
});
}

let mut tabs = TabView::new();
let mut tabs = TabbedView::new();

if let Some(tracks) = artist.tracks.as_ref() {
let tracks = tracks.clone();

tabs.add_tab(
"tracks",
"Saved Tracks",
ListView::new(
Arc::new(RwLock::new(tracks)),
queue.clone(),
library.clone(),
)
.with_title("Saved Tracks"),
),
);
}

tabs.add_tab(
"top_tracks",
ListView::new(top_tracks, queue.clone(), library.clone()).with_title("Top 10"),
);

tabs.add_tab("albums", albums_view.with_title("Albums"));
tabs.add_tab("singles", singles_view.with_title("Singles"));

tabs.add_tab(
"related",
ListView::new(related, queue, library).with_title("Related Artists"),
"Top 10",
ListView::new(top_tracks, queue.clone(), library.clone()),
);
tabs.add_tab("Albums", albums_view);
tabs.add_tab("Singles", singles_view);
tabs.add_tab("Related Artists", ListView::new(related, queue, library));

Self {
artist: artist.clone(),
Expand Down Expand Up @@ -116,7 +109,7 @@ impl ArtistView {
}

impl ViewWrapper for ArtistView {
wrap_impl!(self.tabs: TabView);
wrap_impl!(self.tabs: TabbedView);
}

impl ViewExt for ArtistView {
Expand Down
32 changes: 14 additions & 18 deletions src/ui/library.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,16 @@ use crate::traits::ViewExt;
use crate::ui::browse::BrowseView;
use crate::ui::listview::ListView;
use crate::ui::playlists::PlaylistsView;
use crate::ui::tabview::TabView;
use crate::ui::tabbedview::TabbedView;

pub struct LibraryView {
tabs: TabView,
tabs: TabbedView,
display_name: Option<String>,
}

impl LibraryView {
pub fn new(queue: Arc<Queue>, library: Arc<Library>) -> Self {
let mut tabview = TabView::new();
let mut tabview = TabbedView::new();
let selected_tabs = library
.cfg
.values()
Expand All @@ -33,31 +33,27 @@ impl LibraryView {
for tab in selected_tabs {
match tab {
LibraryTab::Tracks => tabview.add_tab(
"tracks",
ListView::new(library.tracks.clone(), queue.clone(), library.clone())
.with_title("Tracks"),
"Tracks",
ListView::new(library.tracks.clone(), queue.clone(), library.clone()),
),
LibraryTab::Albums => tabview.add_tab(
"albums",
ListView::new(library.albums.clone(), queue.clone(), library.clone())
.with_title("Albums"),
"Albums",
ListView::new(library.albums.clone(), queue.clone(), library.clone()),
),
LibraryTab::Artists => tabview.add_tab(
"artists",
ListView::new(library.artists.clone(), queue.clone(), library.clone())
.with_title("Artists"),
"Artists",
ListView::new(library.artists.clone(), queue.clone(), library.clone()),
),
LibraryTab::Playlists => tabview.add_tab(
"playlists",
"Playlists",
PlaylistsView::new(queue.clone(), library.clone()),
),
LibraryTab::Podcasts => tabview.add_tab(
"podcasts",
ListView::new(library.shows.clone(), queue.clone(), library.clone())
.with_title("Podcasts"),
"Podcasts",
ListView::new(library.shows.clone(), queue.clone(), library.clone()),
),
LibraryTab::Browse => {
tabview.add_tab("browse", BrowseView::new(queue.clone(), library.clone()))
tabview.add_tab("Browse", BrowseView::new(queue.clone(), library.clone()))
}
}
}
Expand All @@ -77,7 +73,7 @@ impl LibraryView {
}

impl ViewWrapper for LibraryView {
wrap_impl!(self.tabs: TabView);
wrap_impl!(self.tabs: TabbedView);
}

impl ViewExt for LibraryView {
Expand Down
2 changes: 1 addition & 1 deletion src/ui/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ pub mod search;
pub mod search_results;
pub mod show;
pub mod statusbar;
pub mod tabview;
pub mod tabbedview;

#[cfg(feature = "cover")]
pub mod cover;
Expand Down
2 changes: 1 addition & 1 deletion src/ui/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use crate::ui::layout::Layout;
use crate::ui::listview::ListView;
use crate::ui::pagination::Pagination;
use crate::ui::search_results::SearchResultsView;
use crate::ui::tabview::TabView;
use crate::ui::tabbedview::TabbedView;
use rspotify::model::search::SearchResult;

pub struct SearchView {
Expand Down
Loading

0 comments on commit 0a1a9bd

Please sign in to comment.