system_nudge_label.cc 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/tray/system_nudge_label.h"
  5. #include <memory>
  6. #include "ash/style/ash_color_provider.h"
  7. #include "ui/views/controls/styled_label.h"
  8. #include "ui/views/layout/box_layout.h"
  9. namespace ash {
  10. SystemNudgeLabel::SystemNudgeLabel(std::u16string text, int fixed_width)
  11. : styled_label_(AddChildView(std::make_unique<views::StyledLabel>())) {
  12. SetLayoutManager(std::make_unique<views::BoxLayout>());
  13. styled_label_->SetDisplayedOnBackgroundColor(SK_ColorTRANSPARENT);
  14. styled_label_->SetText(std::move(text));
  15. styled_label_->SizeToFit(fixed_width);
  16. }
  17. SystemNudgeLabel::~SystemNudgeLabel() = default;
  18. void SystemNudgeLabel::AddCustomView(std::unique_ptr<View> custom_view,
  19. size_t offset) {
  20. DCHECK_LT(offset, styled_label_->GetText().size());
  21. views::StyledLabel::RangeStyleInfo custom_view_style;
  22. custom_view_style.custom_view = custom_view.get();
  23. custom_view_styles_by_offset_.insert_or_assign(offset,
  24. std::move(custom_view_style));
  25. styled_label_->AddCustomView(std::move(custom_view));
  26. }
  27. const std::u16string& SystemNudgeLabel::GetText() const {
  28. return styled_label_->GetText();
  29. }
  30. void SystemNudgeLabel::OnThemeChanged() {
  31. views::View::OnThemeChanged();
  32. views::StyledLabel::RangeStyleInfo text_style;
  33. text_style.override_color = AshColorProvider::Get()->GetContentLayerColor(
  34. AshColorProvider::ContentLayerType::kTextColorPrimary);
  35. text_style.custom_font =
  36. styled_label_->GetFontList().DeriveWithSizeDelta(font_size_delta_);
  37. styled_label_->ClearStyleRanges();
  38. size_t i = 0;
  39. for (const auto& [offset, custom_view_style] :
  40. custom_view_styles_by_offset_) {
  41. if (i < offset) {
  42. // Add a style range for text that precedes a custom view.
  43. styled_label_->AddStyleRange(gfx::Range(i, offset), text_style);
  44. }
  45. i = offset + 1;
  46. // Add a style range for a custom view within the text.
  47. styled_label_->AddStyleRange(gfx::Range(offset, offset + 1),
  48. custom_view_style);
  49. }
  50. // Add a style range for any text that follows the last custom view.
  51. size_t text_length = styled_label_->GetText().length();
  52. if (i < text_length) {
  53. styled_label_->AddStyleRange(gfx::Range(i, text_length), text_style);
  54. }
  55. }
  56. } // namespace ash