// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "module-apps/application-music-player/widgets/SongItem.hpp" #include #include namespace gui { using namespace musicPlayerStyle; SongItem::SongItem(const std::string &authorName, const std::string &songName, const std::string &duration, std::function setBtBarCallback, std::function restoreBtBarCallback) : navBarTemporaryMode(setBtBarCallback), navBarRestoreFromTemporaryMode(restoreBtBarCallback) { setMinimumSize(songItem::w, songItem::h); setMargins(Margins(0, style::margins::small, 0, style::margins::small)); vBox = new VBox(this, 0, 0, 0, 0); vBox->setEdges(RectangleEdge::None); firstHBox = new HBox(vBox, 0, 0, 0, 0); firstHBox->setMinimumSize(songItem::w, songItem::bold_text_h); firstHBox->setMargins(Margins(0, songItem::topMargin, 0, 0)); firstHBox->setReverseOrder(true); firstHBox->setEdges(RectangleEdge::None); secondHBox = new HBox(vBox, 0, 0, 0, 0); secondHBox->setMinimumSize(songItem::w, songItem::text_h); secondHBox->setMargins(Margins(0, songItem::topMargin, 0, 0)); secondHBox->setReverseOrder(true); secondHBox->setEdges(RectangleEdge::None); durationText = new TextFixedSize(firstHBox, 0, 0, 0, 0); durationText->setMinimumWidthToFitText(duration); durationText->setMinimumHeight(songItem::text_h); durationText->setMargins(Margins(0, 0, songItem::rightMargin, 0)); durationText->setEdges(RectangleEdge::None); durationText->drawUnderline(false); durationText->setFont(style::window::font::verysmall); durationText->setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); durationText->setEditMode(EditMode::Browse); durationText->setText(duration); songText = new Label(firstHBox, 0, 0, 0, 0); songText->setMinimumHeight(songItem::bold_text_h); songText->setMaximumWidth(songItem::w); songText->setMargins(Margins(songItem::leftMargin, 0, 0, 0)); songText->setEdges(RectangleEdge::None); songText->setFont(style::window::font::bigbold); songText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); songText->setText(songName); playedSong = new Image(secondHBox, 0, 0, ""); playedSong->setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); playedSong->setVisible(false); authorText = new Label(secondHBox, 0, 0, 0, 0); authorText->setMinimumHeight(songItem::text_h); authorText->setMaximumWidth(songItem::w); authorText->setMargins(Margins(songItem::leftMargin, 0, 0, 0)); authorText->setEdges(RectangleEdge::None); authorText->setFont(style::window::font::medium); authorText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); authorText->setText(authorName); dimensionChangedCallback = [&]([[maybe_unused]] gui::Item &item, const BoundingBox &newDim) -> bool { vBox->setArea({0, 0, newDim.w, newDim.h}); return true; }; focusChangedCallback = [&](gui::Item &item) { if (item.focus) { std::string bottorBarText; switch (itemState) { case ItemState::Playing: bottorBarText = utils::translate("common_pause"); break; case ItemState::Paused: bottorBarText = utils::translate("common_resume"); break; case ItemState::None: bottorBarText = utils::translate("common_play"); break; } if (navBarTemporaryMode != nullptr) { navBarTemporaryMode(bottorBarText); } } else { setFocusItem(nullptr); if (navBarRestoreFromTemporaryMode != nullptr) { navBarRestoreFromTemporaryMode(); } } setState(itemState); return true; }; } void SongItem::setState(ItemState state) { itemState = state; switch (state) { case ItemState::Paused: playedSong->set("mp_nowplaying_paused_list", ImageTypeSpecifier::W_M); playedSong->setVisible(true); break; case ItemState::Playing: playedSong->set("mp_nowplaying_play_list", ImageTypeSpecifier::W_M); playedSong->setVisible(true); break; case ItemState::None: playedSong->set(""); playedSong->setVisible(false); break; } secondHBox->resizeItems(); } } /* namespace gui */