// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright 2012 Canonical Ltd. * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License version 3, as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranties of * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR * PURPOSE. See the applicable version of the GNU Lesser General Public * License for more details. * * You should have received a copy of both the GNU Lesser General Public * License version 3 along with this program. If not, see * * * Authored by: Nick Dedekind * */ #include "Tracks.h" #include #include #include "unity-shared/IntrospectableWrappers.h" #include "unity-shared/PreviewStyle.h" #include namespace unity { namespace dash { namespace previews { namespace { DECLARE_LOGGER(logger, "unity.dash.preview.music.tracks"); const RawPixel CHILDREN_SPACE = 1_em; } NUX_IMPLEMENT_OBJECT_TYPE(Tracks); Tracks::Tracks(dash::Tracks::Ptr tracks, NUX_FILE_LINE_DECL) : ScrollView(NUX_FILE_LINE_PARAM) , tracks_(tracks) { SetupViews(); if (tracks_) { sig_conn_.Add(tracks_->track_added.connect(sigc::mem_fun(this, &Tracks::OnTrackAdded))); sig_conn_.Add(tracks_->track_changed.connect(sigc::mem_fun(this, &Tracks::OnTrackUpdated))); sig_conn_.Add(tracks_->track_removed.connect(sigc::mem_fun(this, &Tracks::OnTrackRemoved))); // Add what we've got. for (std::size_t i = 0; i < tracks_->count.Get(); ++i) OnTrackAdded(tracks_->RowAtIndex(i)); } UpdateScale(scale); scale.changed.connect(sigc::mem_fun(this, &Tracks::UpdateScale)); } std::string Tracks::GetName() const { return "Tracks"; } void Tracks::AddProperties(debug::IntrospectionData& introspection) { introspection .add("track-count", m_tracks.size()); } void Tracks::SetupViews() { EnableHorizontalScrollBar(false); layout_ = new nux::VLayout(); layout_->SetPadding(0, previews::Style::Instance().GetDetailsRightMargin().CP(scale), 0, 0); layout_->SetSpaceBetweenChildren(CHILDREN_SPACE.CP(scale)); SetLayout(layout_); } void Tracks::OnTrackUpdated(dash::Track const& track_row) { auto pos = m_tracks.find(track_row.uri.Get()); if (pos == m_tracks.end()) return; pos->second->Update(track_row); pos->second->scale = scale(); } void Tracks::OnTrackAdded(dash::Track const& track_row) { LOG_TRACE(logger) << "OnTrackAdded for " << track_row.title.Get(); std::string track_uri = track_row.uri.Get(); if (m_tracks.find(track_uri) != m_tracks.end()) return; previews::Style& style = dash::previews::Style::Instance(); previews::Track::Ptr track_view(new previews::Track(NUX_TRACKER_LOCATION)); AddChild(track_view.GetPointer()); track_view->Update(track_row); track_view->SetMinimumHeight(style.GetTrackHeight().CP(scale)); track_view->SetMaximumHeight(style.GetTrackHeight().CP(scale)); track_view->scale = scale(); layout_->AddView(track_view.GetPointer(), 0); m_tracks[track_uri] = track_view; ComputeContentSize(); } void Tracks::OnTrackRemoved(dash::Track const& track_row) { LOG_TRACE(logger) << "OnTrackRemoved for " << track_row.title.Get(); auto pos = m_tracks.find(track_row.uri.Get()); if (pos == m_tracks.end()) return; RemoveChild(pos->second.GetPointer()); layout_->RemoveChildObject(pos->second.GetPointer()); ComputeContentSize(); } void Tracks::UpdateScale(double scale) { int track_height = Style::Instance().GetTrackHeight().CP(scale); for (auto const& track : m_tracks) { track.second->SetMinimumHeight(track_height); track.second->SetMaximumHeight(track_height); track.second->scale = scale; } if (layout_) { layout_->SetPadding(0, Style::Instance().GetDetailsRightMargin().CP(scale), 0, 0); layout_->SetSpaceBetweenChildren(CHILDREN_SPACE.CP(scale)); } QueueRelayout(); QueueDraw(); } } // namespace previews } // namespace dash } // namespace unity