Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Unified Diff: ash/system/toast/toast_manager.cc

Issue 1978313002: Support cancelling toast (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ash/system/toast/toast_manager.cc
diff --git a/ash/system/toast/toast_manager.cc b/ash/system/toast/toast_manager.cc
index 86f8653be2f0e51c9499bf7b00f44397c40c6b94..cec98ba887b4be3b0589c3e947fd9716d20e3fa2 100644
--- a/ash/system/toast/toast_manager.cc
+++ b/ash/system/toast/toast_manager.cc
@@ -21,15 +21,42 @@ ToastManager::ToastManager() : weak_ptr_factory_(this) {}
ToastManager::~ToastManager() {}
-void ToastManager::Show(const std::string& text, uint64_t duration_ms) {
- queue_.emplace(std::make_pair(text, duration_ms));
+void ToastManager::Show(const ToastData& data) {
+ const std::string& id = data.id;
+ DCHECK(!id.empty());
+
+ Queue::iterator existing_toast =
oshima 2016/05/18 16:59:44 optional: you may use auto and remove using Queue.
yoshiki 2016/05/19 09:14:12 Done.
+ std::find_if(queue_.begin(), queue_.end(),
+ [id](const ToastData& data) { return data.id == id; });
+
+ if (current_toast_id_ == id) {
+ // TODO(yoshiki): Replaces the toast;
oshima 2016/05/18 16:59:44 note: you can do this before looking up the toast.
yoshiki 2016/05/19 09:14:12 Done.
+ } else if (existing_toast == queue_.end()) {
+ queue_.emplace_back(data);
+ } else {
+ *existing_toast = data;
+ }
if (queue_.size() == 1 && overlay_ == nullptr)
ShowLatest();
}
+void ToastManager::Cancel(const std::string& id) {
+ if (id == current_toast_id_) {
+ overlay_->Show(false);
+ return;
+ }
+
+ Queue::iterator cancelled_toast =
+ std::find_if(queue_.begin(), queue_.end(),
+ [id](const ToastData& data) { return data.id == id; });
+ if (cancelled_toast != queue_.end())
+ queue_.erase(cancelled_toast);
+}
+
void ToastManager::OnClosed() {
overlay_.reset();
+ current_toast_id_.clear();
// Show the next toast if available.
if (queue_.size() != 0)
@@ -39,24 +66,25 @@ void ToastManager::OnClosed() {
void ToastManager::ShowLatest() {
DCHECK(!overlay_);
- auto data = queue_.front();
- uint64_t duration_ms = std::max(data.second, kMinimumDurationMs);
+ const ToastData& data = queue_.front(); // Can be used until pop_front().
+ uint64_t duration_ms = std::max(data.duration_ms, kMinimumDurationMs);
- toast_id_++;
+ current_toast_id_ = data.id;
+ serial_++;
- overlay_.reset(new ToastOverlay(this, data.first /* text */));
+ overlay_.reset(new ToastOverlay(this, data.text /* text */));
overlay_->Show(true);
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE, base::Bind(&ToastManager::OnDurationPassed,
- weak_ptr_factory_.GetWeakPtr(), toast_id_),
+ weak_ptr_factory_.GetWeakPtr(), serial_),
base::TimeDelta::FromMilliseconds(duration_ms));
- queue_.pop();
+ queue_.pop_front();
}
-void ToastManager::OnDurationPassed(int toast_id) {
- if (overlay_ && toast_id_ == toast_id)
+void ToastManager::OnDurationPassed(int toast_number) {
+ if (overlay_ && serial_ == toast_number)
overlay_->Show(false);
}

Powered by Google App Engine
This is Rietveld 408576698