#pragma once #include "gtkmm/box.h" #include "gtkmm/button.h" #include "gtkmm/label.h" #include "gtkmm/overlay.h" #include "gtkmm/picture.h" #include "gtkmm/scale.h" #include "gtkmm/scrolledwindow.h" #include "connection/dbus/mpris.hpp" class MediaControlWidget : public Gtk::Box { public: explicit MediaControlWidget(std::shared_ptr controller); private: std::shared_ptr mprisController; int64_t currentPositionUs = 0; int64_t totalLengthUs = 0; sigc::connection seekTimerConnection; bool suppressSeekSignal = false; std::string currentTrackId; MprisController::PlaybackStatus playbackStatus = MprisController::PlaybackStatus::Stopped; bool canSeek = true; void setCurrentPosition(int64_t position_us); void setTotalLength(int64_t length_us); void resetSeekTimer(int64_t start_position_us); bool onSeekTick(); void schedulePauseAfterSeek(); void setCanSeek(bool can_seek); Gtk::Box spotifyContainer; // image as background, artist, title Gtk::Overlay topContainer; Gtk::Picture backgroundImage; Gtk::Box infoContainer; Gtk::Label artistLabel; Gtk::Label titleLabel; // Gtk::Box seekBarContainer; Gtk::Label currentTimeLabel; Gtk::Scale seekBar; Gtk::Label totalTimeLabel; // playback controls Gtk::Box bottomContainer; Gtk::Button previousButton; Gtk::Button playPauseButton; Gtk::Button nextButton; Gtk::ScrolledWindow imageWrapper; void onSpotifyMprisUpdated(const MprisPlayer2Message &message); void onRunningStateChanged(MprisController::PlaybackStatus status); void onPlay(); void onPause(); void onStop(); };