// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- /* * Copyright 2012-2013 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: Diego Sarmentero * Manuel de la Pena * */ #include "TabIterator.h" #include "unity-shared/IntrospectableWrappers.h" #include "unity-shared/PreviewStyle.h" #include "unity-shared/CoverArt.h" #include "unity-shared/StaticCairoText.h" #include #include #include #include #include #include "ErrorPreview.h" #include "PreviewInfoHintWidget.h" #include "stdio.h" #include "config.h" #include namespace unity { namespace dash { namespace previews { namespace { nux::logging::Logger logger("unity.dash.previews.ErrorPreview"); const RawPixel TITLE_DATA_MAX_SIZE = 76_em; const RawPixel TITLE_DATA_CHILDREN_SPACE = 10_em; const RawPixel LINE_SPACING = 10_em; const RawPixel TITLE_MAX_WIDTH = 480_em; const RawPixel CHILDREN_SPACE = 5_em; const RawPixel BUTTONS_DATA_SPACE = 20_em; const RawPixel INTRO_SPACE = 110_em; } const std::string ErrorPreview::CANCEL_ACTION = "cancel"; const std::string ErrorPreview::GO_TO_U1_ACTION = "open_u1_link"; NUX_IMPLEMENT_OBJECT_TYPE(ErrorPreview) ErrorPreview::ErrorPreview(dash::Preview::Ptr preview_model) : PaymentPreview(preview_model) { PaymentPreview::SetupBackground(); SetupViews(); UpdateScale(scale); scale.changed.connect(sigc::mem_fun(this, &ErrorPreview::UpdateScale)); } ErrorPreview::~ErrorPreview() { } nux::Area* ErrorPreview::FindKeyFocusArea(unsigned int key_symbol, unsigned long x11_key_code, unsigned long special_keys_state) { return Preview::FindKeyFocusArea(key_symbol, x11_key_code, special_keys_state); } std::string ErrorPreview::GetName() const { return "ErrorPreview"; } void ErrorPreview::AddProperties(debug::IntrospectionData& introspection) { PaymentPreview::AddProperties(introspection); } void ErrorPreview::OnActionActivated(ActionButton* button, std::string const& id) { Preview::OnActionActivated(button, id); } void ErrorPreview::OnActionLinkActivated(ActionLink *link, std::string const& id) { if (preview_model_) preview_model_->PerformAction(id); } void ErrorPreview::LoadActions() { // Loop over the buttons and add them to the correct var // this is not efficient but is the only way we have atm for (dash::Preview::ActionPtr action : preview_model_->GetActions()) { nux::ObjectPtr button = this->CreateButton(action); button->scale = scale(); button->activate.connect(sigc::mem_fun(this, &ErrorPreview::OnActionActivated)); buttons_map_.insert(std::make_pair(action->id, button)); } } nux::Layout* ErrorPreview::GetTitle() { previews::Style& style = dash::previews::Style::Instance(); nux::VLayout* title_data_layout = new nux::VLayout(); title_data_layout->SetMaximumHeight(TITLE_DATA_MAX_SIZE.CP(scale)); title_data_layout->SetSpaceBetweenChildren(TITLE_DATA_CHILDREN_SPACE.CP(scale)); title_ = new StaticCairoText( preview_model_->title.Get(), true, NUX_TRACKER_LOCATION); title_->SetFont(style.payment_title_font()); title_->SetLines(-1); title_->SetFont(style.title_font()); title_->SetMaximumWidth(TITLE_MAX_WIDTH.CP(scale)); title_->SetTextEllipsize(StaticCairoText::EllipsizeState::NUX_ELLIPSIZE_END); title_data_layout->AddView(title_.GetPointer(), 1); subtitle_ = new StaticCairoText( preview_model_->subtitle.Get(), true, NUX_TRACKER_LOCATION); subtitle_->SetLines(-1); subtitle_->SetFont(style.payment_subtitle_font()); title_data_layout->AddView(subtitle_.GetPointer(), 1); title_data_layout->AddSpace(1, 1); return title_data_layout; } nux::Layout* ErrorPreview::GetPrice() { previews::Style& style = dash::previews::Style::Instance(); nux::VLayout *prize_data_layout = new nux::VLayout(); prize_data_layout->SetMaximumHeight(TITLE_DATA_MAX_SIZE.CP(scale)); prize_data_layout->SetSpaceBetweenChildren(CHILDREN_SPACE.CP(scale)); prize_data_layout->SetPadding(0, TITLE_DATA_CHILDREN_SPACE.CP(scale), 0, 0); purchase_prize_ = new StaticCairoText( error_preview_model_->purchase_prize.Get(), true, NUX_TRACKER_LOCATION); purchase_prize_->SetLines(-1); purchase_prize_->SetFont(style.payment_prize_title_font()); prize_data_layout->AddView(purchase_prize_.GetPointer(), 1, nux::MINOR_POSITION_END); purchase_hint_ = new StaticCairoText( _("Ubuntu One best offer"), true, NUX_TRACKER_LOCATION); purchase_hint_->SetLines(-1); purchase_hint_->SetFont(style.payment_prize_subtitle_font()); prize_data_layout->AddView(purchase_hint_.GetPointer(), 1, nux::MINOR_POSITION_END); purchase_type_ = new StaticCairoText( error_preview_model_->purchase_type.Get(), true, NUX_TRACKER_LOCATION); purchase_type_->SetLines(-1); purchase_type_->SetFont(style.payment_prize_subtitle_font()); prize_data_layout->AddView(purchase_type_.GetPointer(), 1, nux::MINOR_POSITION_END); return prize_data_layout; } nux::Layout* ErrorPreview::GetBody() { previews::Style& style = dash::previews::Style::Instance(); nux::HLayout *body_layout = new nux::HLayout(); nux::HLayout *intro_layout = new nux::HLayout(); nux::VLayout *icon_layout = new nux::VLayout(); icon_layout->SetPadding((78_em).CP(scale), (10_em).CP(scale), (90_em).CP(scale), (43_em).CP(scale)); intro_layout->SetPadding((75_em).CP(scale), (20_em).CP(scale), 0, 0); intro_layout->SetSpaceBetweenChildren(CHILDREN_SPACE.CP(scale)); intro_ = new StaticCairoText( error_preview_model_->header.Get(), true, NUX_TRACKER_LOCATION); intro_->SetFont(style.payment_intro_font().c_str()); intro_->SetScale(scale); intro_->SetLines(-3); intro_->SetLineSpacing(LINE_SPACING.CP(scale)); intro_->SetTextEllipsize(StaticCairoText::EllipsizeState::NUX_ELLIPSIZE_END); intro_layout->AddView(intro_.GetPointer());//, 0, nux::MINOR_POSITION_CENTER); warning_texture_ = new IconTexture(style.GetWarningIcon()); icon_layout->AddView(warning_texture_.GetPointer(), 0, nux::MINOR_POSITION_END); body_layout->AddLayout(icon_layout, 0); body_layout->AddLayout(intro_layout, 0); body_layout->AddSpace(1, 1); return body_layout; } nux::Layout* ErrorPreview::GetFooter() { previews::Style& style = dash::previews::Style::Instance(); nux::HLayout* actions_buffer_h = new nux::HLayout(); actions_buffer_h->AddSpace(0, 1); nux::HLayout* buttons_data_layout = new TabIteratorHLayout(tab_iterator_); buttons_data_layout->SetSpaceBetweenChildren(style.GetSpaceBetweenActions().CP(scale)); buttons_data_layout->AddSpace(BUTTONS_DATA_SPACE.CP(scale), 1); if(buttons_map_[ErrorPreview::CANCEL_ACTION].GetPointer()){ ActionButton* button = (ActionButton*)buttons_map_[ErrorPreview::CANCEL_ACTION].GetPointer(); buttons_data_layout->AddView(buttons_map_[ErrorPreview::CANCEL_ACTION].GetPointer(), 1, nux::MINOR_POSITION_CENTER, nux::MINOR_SIZE_FULL, 100.0f, nux::NUX_LAYOUT_END); AddChild(button); tab_iterator_->Append(button); } if(buttons_map_[ErrorPreview::GO_TO_U1_ACTION].GetPointer()){ ActionButton* button = (ActionButton*)buttons_map_[ErrorPreview::GO_TO_U1_ACTION].GetPointer(); buttons_data_layout->AddView(buttons_map_[ErrorPreview::GO_TO_U1_ACTION].GetPointer(), 1, nux::MINOR_POSITION_CENTER, nux::MINOR_SIZE_FULL, 100.0f, nux::NUX_LAYOUT_END); AddChild(button); tab_iterator_->Prepend(button); } return buttons_data_layout; } void ErrorPreview::PreLayoutManagement() { nux::Geometry geo = GetGeometry(); GetLayout()->SetGeometry(geo); previews::Style& style = dash::previews::Style::Instance(); int width = std::max(0, geo.width - style.GetPanelSplitWidth().CP(scale) - style.GetDetailsLeftMargin().CP(scale) - style.GetDetailsRightMargin().CP(scale)); if(full_data_layout_) { full_data_layout_->SetMaximumWidth(width); } if(header_layout_) { header_layout_->SetMaximumWidth(width); } if(intro_) { intro_->SetMaximumWidth(width - INTRO_SPACE.CP(scale)); } if(footer_layout_) { footer_layout_->SetMaximumWidth(width); } Preview::PreLayoutManagement(); } void ErrorPreview::SetupViews() { error_preview_model_ = dynamic_cast(preview_model_.get()); if (!error_preview_model_) { LOG_ERROR(logger) << "Could not derive preview model from given parameter."; return; } // load the buttons so that they can be accessed in order LoadActions(); PaymentPreview::SetupViews(); } void ErrorPreview::UpdateScale(double scale) { if (intro_) intro_->SetScale(scale); if (purchase_hint_) purchase_hint_->SetScale(scale); if (purchase_prize_) purchase_prize_->SetScale(scale); if (purchase_type_) purchase_type_->SetScale(scale); if (warning_texture_) { previews::Style& style = dash::previews::Style::Instance(); RawPixel width(style.GetWarningIcon()->GetWidth()); RawPixel height(style.GetWarningIcon()->GetHeight()); warning_texture_->SetSize(std::max(width, height).CP(scale)); warning_texture_->ReLoadIcon(); } if (title_) title_->SetMaximumWidth(TITLE_MAX_WIDTH.CP(scale)); Preview::UpdateScale(scale); } } } }