Discman
Loading...
Searching...
No Matches
disc_component.cc
Go to the documentation of this file.
1
6
7 #include "disc_component.h"
8
9DiscComponent::DiscComponent(DriveManager& drive_manager, Glib::RefPtr<Gtk::Builder> builder)
10 : _drive_manager(drive_manager) {
11 _eject_button_stack = builder->get_widget<Gtk::Stack>("ejectButtonStack");
12 _eject_button = builder->get_widget<Gtk::Button>("ejectButton");
13 _double_eject_button = builder->get_widget<Gtk::MenuButton>("doubleEjectButton");
14 _double_eject_button_menu = Gio::Menu::create();
15 _double_eject_button_menu->append("CD", "eject.cd");
16 _double_eject_button_menu->append("iPod", "eject.ipod");
18
19 _eject_action_group = Gio::SimpleActionGroup::create();
20 _eject_action_group->add_action("cd", sigc::bind(sigc::mem_fun(*this, &DiscComponent::on_eject), DriveManager::Drive::Disc));
21 _eject_action_group->add_action("ipod", sigc::bind(sigc::mem_fun(*this, &DiscComponent::on_eject), DriveManager::Drive::Removable));
22
23 Gtk::Root* root = _double_eject_button->get_root();
24 Gtk::Window* window = dynamic_cast<Gtk::Window*>(root);
25 window->insert_action_group("eject", _eject_action_group);
26
27 _ipod_button = builder->get_widget<Gtk::Button>("ipodButton");
28 _album_label = builder->get_widget<Gtk::Label>("albumLabel");
29 _album_artist_label = builder->get_widget<Gtk::Label>("albumArtistLabel");
30 _tracks_tree_view = builder->get_widget<Gtk::TreeView>("tracksTreeView");
31 _tracks_list_store = std::dynamic_pointer_cast<Gtk::ListStore>(builder->get_object("tracksListStore"));
32
34 _tracks_tree_view->append_column_numeric("#", cols.number_column, "%d");
35 _tracks_tree_view->append_column("Title", cols.title_column);
36
37 auto renderer = Gtk::make_managed<Gtk::CellRendererProgress>();
38 int idx = _tracks_tree_view->append_column("", *renderer);
39 _tracks_tree_view->get_column(idx - 1)->set_sizing(Gtk::TreeViewColumn::Sizing::FIXED);
40 _tracks_tree_view->get_column(idx - 1)->set_fixed_width(96);
41 _tracks_tree_view->get_column(idx - 1)->add_attribute(renderer->property_value(), cols.progress_column);
42 _tracks_tree_view->get_column(idx - 1)->set_visible(false);
43
44 _tracks_tree_view->append_column("Length", cols.length_column);
45
46 _tracks_tree_view->get_column_cell_renderer(0)->set_alignment(1.0, 0.5);
47 _tracks_tree_view->get_column_cell_renderer(3)->set_alignment(1.0, 0.5);
48
49 _tracks_tree_view->get_column_cell_renderer(1)->set_property("ellipsize", Pango::EllipsizeMode::END);
50 _tracks_tree_view->get_column(1)->set_property("expand", true);
51
52 _eject_button->signal_clicked().connect(sigc::mem_fun(*this, &DiscComponent::on_eject_button_clicked));
53 _ipod_button->signal_clicked().connect(sigc::mem_fun(*this, &DiscComponent::on_ipod_button_clicked));
54 _tracks_tree_view->signal_row_activated().connect(sigc::mem_fun(*this, &DiscComponent::on_row_activated));
55}
56
63
64void DiscComponent::show_progress(const bool show) {
65 _tracks_tree_view->get_column(_tracks_tree_view->get_n_columns() - 2)->set_visible(show);
66}
67
68void DiscComponent::set_disc(const DiscDB::Disc* const disc) {
69 _album_label->set_text(disc ? disc->title() : "No Disc");
70 _album_artist_label->set_text(disc ? disc->artist() : "Please insert disc.");
71
72 if (!!disc) {
73 const TracksListColumnRecord cols;
74
75 for (unsigned int i = 0; i < disc->tracks().size(); i++) {
76 auto row = *(_tracks_list_store->append());
77 row[cols.number_column] = i + 1;
78 row[cols.title_column] = disc->tracks().at(i).title();
79 row[cols.progress_column] = 0;
80
81 std::stringstream lengthStream;
82 const unsigned int seconds = disc->track_length(i + 1);
83 lengthStream << seconds / 60
84 << ":"
85 << std::setw(2) << std::setfill('0')
86 << seconds % 60;
87
88 row[cols.length_column] = lengthStream.str();
89 }
90 } else {
91 _tracks_list_store->clear();
92 }
93
94 if (!disc) {
95 show_progress(false);
96 }
97}
98
100 _tracks_tree_view->get_selection()->unselect_all();
101}
102
103void DiscComponent::set_selection(unsigned int track) {
104 Glib::RefPtr<Gtk::TreeModel> model = _tracks_tree_view->get_model();
105 Gtk::TreeNodeChildren::iterator it = _tracks_list_store->children().begin();
106 for (unsigned int i = 0; i < track - 1; i++)
107 it++;
108 _tracks_tree_view->get_selection()->select(model->get_path(it));
109}
110
114
118
119
123
124void DiscComponent::update_track_progress(unsigned int track, unsigned int progress) {
125 Glib::RefPtr<Gtk::TreeModel> model = _tracks_tree_view->get_model();
126 Gtk::TreeNodeChildren::iterator it = _tracks_list_store->children().begin();
127 for (unsigned int i = 0; i < track - 1; i++)
128 it++;
129
130 auto row = *it;
131 const TracksListColumnRecord cols;
132 row[cols.progress_column] = progress;
133}
134
135void DiscComponent::show_ipod_button(const bool show) {
136 _ipod_button->set_visible(show);
137}
138
139void DiscComponent::enable_ipod_button(const bool enable) {
140 _ipod_button->set_sensitive(enable);
141}
142
143void DiscComponent::enable_eject_button(const bool enable) {
144 _eject_button->set_sensitive(enable);
145}
146
148 _eject_button_stack->set_visible_child(*_eject_button_stack->get_children()[show]);
149}
150
159
161 if (drive == DriveManager::Drive::Disc) {
162 set_disc(nullptr);
163 }
164 _signal_eject_requested.emit(drive);
165}
166
168 Glib::RefPtr<Gtk::TreeSelection> selection = _tracks_tree_view->get_selection();
169 Gtk::TreeModel::iterator it = selection->get_selected();
170
171 if (it) {
172 Gtk::TreeModel::Path path = _tracks_tree_view->get_model()->get_path(it);
173 unsigned int track = _tracks_list_store->get_iter(path)->get_value(TracksListColumnRecord().number_column);
174
175 _signal_rip_requested.emit(track);
176 } else {
177 _signal_rip_requested.emit(0);
178 }
179}
180
181void DiscComponent::on_row_activated(const Gtk::TreeModel::Path& path, Gtk::TreeView::Column*) {
182 unsigned int track = _tracks_list_store->get_iter(path)->get_value(TracksListColumnRecord().number_column);
183 _signal_track_selected.emit(track);
184}
Gtk::TreeModelColumn< Glib::ustring > title_column
Track title column.
Gtk::TreeModelColumn< Glib::ustring > length_column
Track length column.
Gtk::TreeModelColumn< int > progress_column
Track rip progress column.
Gtk::TreeModelColumn< guint > number_column
Track number column.
void enable_eject_button(const bool enable)
Enables or disables the normal eject button.
Gtk::Button * _eject_button
Normal eject button.
sig_track_selected signal_track_selected()
Getter for _signal_track_selected.
void set_disc(const DiscDB::Disc *const disc)
Sets the DiscDB::Disc containing all information about the inserted disc.
void show_ipod_button(const bool show)
Shows or hides the iPod button (rip button).
Gtk::Label * _album_label
Label displaying the album title.
sig_eject_requested signal_eject_requested()
Getter for _signal_eject_requested.
sig_rip_requested _signal_rip_requested
Emitted when the iPod (rip) button is clicked.
~DiscComponent()
DiscComponent destructor.
void enable_ipod_button(const bool enable)
Enables or disables the iPod button (rip button).
void show_progress(const bool show)
Shows or hides the rip progress column in the track listing.
Gtk::MenuButton * _double_eject_button
Eject button with disc/iPod selection.
sig_eject_requested _signal_eject_requested
Emitted when an eject button is used.
void on_eject_button_clicked()
Called when the normal eject button is clicked.
sigc::signal< void(unsigned int)> sig_track_selected
"Track selected" signal type.
void on_row_activated(const Gtk::TreeModel::Path &path, Gtk::TreeView::Column *)
Called when a track is double-clicked in the track list.
void on_ipod_button_clicked()
Called when the iPod (rip) button is clicked.
void on_eject(const DriveManager::Drive drive)
Called after successful ejection of a drive.
Gtk::TreeView * _tracks_tree_view
Shows the track list.
Gtk::Button * _ipod_button
Shown when the iPod is connected, enabled when ripping is possible.
Gtk::Stack * _eject_button_stack
Stack that switches between eject buttons.
void set_selection(unsigned int track)
Sets the selection in the track listing.
sigc::signal< void(unsigned int)> sig_rip_requested
"Rip requested" signal type.
DriveManager & _drive_manager
Used to eject the disc.
Glib::RefPtr< Gio::SimpleActionGroup > _eject_action_group
Action group for disc/iPod eject button menu.
sig_track_selected _signal_track_selected
Emitted when a track is double-clicked in the track list.
void clear_selection()
Clears the selection in the track listing.
Glib::RefPtr< Gio::Menu > _double_eject_button_menu
Disc/iPod eject button selection menu.
void update_track_progress(unsigned int track, unsigned int progress)
Updates the percentage completion in the track listing for a given track with a given percentage.
sig_rip_requested signal_rip_requested()
Getter for _signal_rip_requested.
DiscComponent(DriveManager &drive_manager, Glib::RefPtr< Gtk::Builder > builder)
DiscComponent constructor.
Gtk::Label * _album_artist_label
Label displaying the album artist.
sigc::signal< void(DriveManager::Drive)> sig_eject_requested
"Drive eject requested" signal type.
void show_double_eject_button(const bool show)
Switches between the normal eject button and the eject button with disc/iPod selection.
Glib::RefPtr< Gtk::ListStore > _tracks_list_store
Track list model.
Manages the state of the disc drive and any removable (iPod) drive.
Drive
The two drives supported.