blob: 510e7b0a92270e8f5c043cca6d0c9512ea52f645 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_VIEWS_TOOLBAR_READ_LATER_TOOLBAR_BUTTON_H_
#define CHROME_BROWSER_UI_VIEWS_TOOLBAR_READ_LATER_TOOLBAR_BUTTON_H_
#include "base/scoped_observation.h"
#include "chrome/browser/ui/views/bubble/bubble_contents_wrapper.h"
#include "chrome/browser/ui/views/toolbar/toolbar_button.h"
#include "chrome/browser/ui/webui/read_later/read_later_ui.h"
#include "components/reading_list/core/reading_list_model.h"
#include "components/reading_list/core/reading_list_model_observer.h"
class Browser;
namespace views {
class DotIndicator;
} // namespace views
class ReadLaterToolbarButton : public ToolbarButton,
public ReadingListModelObserver {
public:
explicit ReadLaterToolbarButton(Browser* browser);
ReadLaterToolbarButton(const ReadLaterToolbarButton&) = delete;
ReadLaterToolbarButton& operator=(const ReadLaterToolbarButton&) = delete;
~ReadLaterToolbarButton() override;
// ToolbarButton
bool ShouldShowInkdropAfterIphInteraction() override;
// Hides the Read Later side panel if showing, and updates the toolbar button
// accordingly. Can be called to force close the side panel outside of a
// toolbar button press (e.g. if the Lens side panel becomes active).
// TODO(crbug.com/3130644): Remove this method and instead have the toolbar
// button listen for side panel state changes.
void HideSidePanel();
private:
class DotBoundsUpdater : public views::ViewObserver {
public:
DotBoundsUpdater(views::DotIndicator* dot_indicator,
views::ImageView* image);
DotBoundsUpdater(const DotBoundsUpdater&) = delete;
DotBoundsUpdater& operator=(const DotBoundsUpdater&) = delete;
~DotBoundsUpdater() override;
// views::ViewObserver:
void OnViewBoundsChanged(views::View* observed_view) override;
private:
views::DotIndicator* const dot_indicator_;
views::ImageView* const image_;
base::ScopedObservation<views::View, views::ViewObserver> observation_{
this};
};
// ReadingListModelObserver:
void ReadingListModelLoaded(const ReadingListModel* model) override;
void ReadingListModelBeingDeleted(const ReadingListModel* model) override;
void ReadingListDidApplyChanges(ReadingListModel* model) override;
void ButtonPressed();
Browser* const browser_;
views::DotIndicator* dot_indicator_;
std::unique_ptr<DotBoundsUpdater> dot_bounds_updater_;
ReadingListModel* const reading_list_model_;
base::ScopedObservation<ReadingListModel, ReadingListModelObserver>
reading_list_model_scoped_observation_{this};
views::View* side_panel_webview_ = nullptr;
};
#endif // CHROME_BROWSER_UI_VIEWS_TOOLBAR_READ_LATER_TOOLBAR_BUTTON_H_