~aleteoryx/muditaos

ref: f4bcc5ce6f0d66f6ee55949f9978ad0c0399fddb muditaos/module-apps/application-music-player/widgets/SongItem.cpp -rw-r--r-- 5.1 KiB
f4bcc5ce — Dawid Wojtas [BH-1758] Fix information about next alarm ring 2 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// 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 <gui/widgets/text/Label.hpp>
#include <i18n/i18n.hpp>

namespace gui
{

    using namespace musicPlayerStyle;

    SongItem::SongItem(const std::string &authorName,
                       const std::string &songName,
                       const std::string &duration,
                       std::function<void(const UTF8 &)> setBtBarCallback,
                       std::function<void()> 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 */