diff options
| -rw-r--r-- | dash/DashView.cpp | 118 | ||||
| -rw-r--r-- | dash/DashView.h | 2 | ||||
| -rw-r--r-- | dash/LensView.cpp | 8 | ||||
| -rw-r--r-- | dash/LensView.h | 2 | ||||
| -rw-r--r-- | dash/PreviewStateMachine.cpp | 23 | ||||
| -rw-r--r-- | dash/PreviewStateMachine.h | 1 | ||||
| -rw-r--r-- | dash/ResultView.h | 2 | ||||
| -rw-r--r-- | dash/ResultViewGrid.cpp | 25 |
8 files changed, 112 insertions, 69 deletions
diff --git a/dash/DashView.cpp b/dash/DashView.cpp index a9d6c4bf8..f039b5fd7 100644 --- a/dash/DashView.cpp +++ b/dash/DashView.cpp @@ -82,6 +82,7 @@ DashView::DashView() , home_lens_(new HomeLens(_("Home"), _("Home screen"), _("Search"))) , preview_container_(nullptr) , preview_displaying_(false) + , preview_navigation_mode_(previews::Navigation::NONE) , active_lens_view_(0) , last_activated_uri_("") , search_in_progress_(false) @@ -120,27 +121,57 @@ void DashView::SetMonitorOffset(int x, int y) renderer_.y_offset = y; } -void DashView::SetPreview(Preview::Ptr preview_model) +void DashView::ClosePreview() +{ + preview_displaying_ = false; + preview_container_ = nullptr; // free resources + preview_state_machine_.ClosePreview(); + QueueDraw(); +} + +void DashView::BuildPreview(Preview::Ptr model) { - if (preview_displaying_ == false) + LOG_DEBUG(logger) << "building preview..."; + if (!preview_displaying_) { - // we aren't currently displaying a preview so bootstrap preview_container_ = previews::PreviewContainer::Ptr(new previews::PreviewContainer()); - preview_container_->SetGeometry(GetGeometry()); - preview_container_->Preview(preview_model, previews::Navigation::NONE); + preview_container_->Preview(model, previews::Navigation::NONE); // no swipe left or right + + nux::Geometry preview_geo = layout_->GetGeometry(); + preview_geo.height -= 24; + //preview_geo.width -= 120; + //preview_geo.x += 60; + preview_geo.y += 12; + + preview_container_->SetGeometry(preview_geo); + + preview_displaying_ = true; + + preview_container_->navigate_left.connect([&] () { + preview_navigation_mode_ = previews::Navigation::LEFT; + ubus_manager_.SendMessage(UBUS_DASH_PREVIEW_NAVIGATION_REQUEST, g_variant_new("(iss)", -1, stored_preview_uri_identifier_.c_str(), stored_preview_unique_id_.c_str())); + }); + + preview_container_->navigate_right.connect([&] () { + preview_navigation_mode_ = previews::Navigation::RIGHT; + ubus_manager_.SendMessage(UBUS_DASH_PREVIEW_NAVIGATION_REQUEST, g_variant_new("(iss)", 1, stored_preview_uri_identifier_.c_str(), stored_preview_unique_id_.c_str())); + }); } else { - preview_container_->Preview(preview_model, previews::Navigation::NONE); // actually left/right + // got a new preview whilst already displaying, we probably clicked a navigation button. + preview_container_->Preview(model, preview_navigation_mode_); // TODO } - preview_displaying_ = true; -} + if (G_LIKELY(preview_state_machine_.left_results() > 0 && preview_state_machine_.right_results() > 0)) + preview_container_->DisableNavButton(previews::Navigation::NONE); + else if (preview_state_machine_.left_results() > 0) + preview_container_->DisableNavButton(previews::Navigation::RIGHT); + else if (preview_state_machine_.right_results() > 0) + preview_container_->DisableNavButton(previews::Navigation::LEFT); + else + preview_container_->DisableNavButton(previews::Navigation::BOTH); -void DashView::ClosePreview() -{ - preview_displaying_ = false; - preview_container_ = nullptr; // free resources QueueDraw(); } @@ -227,6 +258,13 @@ void DashView::SetupViews() content_layout_->AddView(lenses_layout_, 1, nux::MINOR_POSITION_LEFT); home_view_ = new LensView(home_lens_, nullptr); + home_view_->uri_preview_activated.connect([&] (std::string const& uri, std::string const& unique_id) + { + LOG_DEBUG(logger) << "got unique id from preview activation: " << unique_id; + stored_preview_unique_id_ = unique_id; + stored_preview_uri_identifier_ = uri; + }); + AddChild(home_view_); active_lens_view_ = home_view_; lens_views_[home_lens_->id] = home_view_; @@ -330,6 +368,10 @@ nux::Geometry DashView::GetBestFitGeometry(nux::Geometry const& for_geo) void DashView::Draw(nux::GraphicsEngine& gfx_context, bool force_draw) { renderer_.DrawFull(gfx_context, content_geo_, GetAbsoluteGeometry(), GetGeometry()); + if (preview_displaying_ && preview_container_) + { + preview_container_->ProcessDraw(gfx_context, force_draw); + } } void DashView::DrawContent(nux::GraphicsEngine& gfx_context, bool force_draw) @@ -486,8 +528,10 @@ void DashView::OnLensAdded(Lens::Ptr& lens) AddChild(view); view->SetVisible(false); view->uri_activated.connect(sigc::mem_fun(this, &DashView::OnUriActivated)); - view->uri_preview_activated.connect([&] (std::string const& uri) + view->uri_preview_activated.connect([&] (std::string const& uri, std::string const& unique_id) { + LOG_DEBUG(logger) << "got unique id from preview activation: " << unique_id; + stored_preview_unique_id_ = unique_id; stored_preview_uri_identifier_ = uri; }); @@ -510,6 +554,7 @@ void DashView::OnLensAdded(Lens::Ptr& lens) // Hook up to the new preview infrastructure lens->preview_ready.connect([&] (std::string const& uri, Preview::Ptr model) { + LOG_DEBUG(logger) << "Got preview for: " << uri; preview_state_machine_.ActivatePreview(model); // this does not immediately display a preview - we now wait. }); @@ -524,49 +569,6 @@ void DashView::OnLensAdded(Lens::Ptr& lens) } } -void DashView::BuildPreview(Preview::Ptr model) -{ - if (!preview_displaying_) - { - preview_container_ = previews::PreviewContainer::Ptr(new previews::PreviewContainer()); - preview_container_->Preview(model, previews::Navigation::NONE); // no swipe left or right - - nux::Geometry preview_geo = GetGeometry(); - preview_geo.height -= 120; - preview_geo.width -= 120; - //preview_geo.x += 60; - //preview_geo.y += 60; - - preview_container_->SetGeometry(preview_geo); - - preview_displaying_ = true; - - preview_container_->navigate_left.connect([&] () { - ubus_manager_.SendMessage(UBUS_DASH_PREVIEW_NAVIGATION_REQUEST, g_variant_new("(is)", -1, stored_preview_uri_identifier_.c_str())); - }); - - preview_container_->navigate_right.connect([&] () { - ubus_manager_.SendMessage(UBUS_DASH_PREVIEW_NAVIGATION_REQUEST, g_variant_new("(is)", 1, stored_preview_uri_identifier_.c_str())); - }); - } - else - { - // got a new preview whilst already displaying, we probably clicked a navigation button. - preview_container_->Preview(model, previews::Navigation::LEFT); // TODO - } - - if (G_LIKELY(preview_state_machine_.left_results() > 0 && preview_state_machine_.right_results() > 0)) - preview_container_->DisableNavButton(previews::Navigation::NONE); - else if (preview_state_machine_.left_results() > 0) - preview_container_->DisableNavButton(previews::Navigation::RIGHT); - else if (preview_state_machine_.right_results() > 0) - preview_container_->DisableNavButton(previews::Navigation::LEFT); - else - preview_container_->DisableNavButton(previews::Navigation::BOTH); - - QueueDraw(); -} - void DashView::OnLensBarActivated(std::string const& id) { if (lens_views_.find(id) == lens_views_.end()) @@ -792,7 +794,9 @@ bool DashView::InspectKeyEvent(unsigned int eventType, { if ((eventType == nux::NUX_KEYDOWN) && (key_sym == NUX_VK_ESCAPE)) { - if (search_bar_->search_string != "") + if (preview_displaying_) + ClosePreview(); + else if (search_bar_->search_string != "") search_bar_->search_string = ""; else ubus_manager_.SendMessage(UBUS_PLACE_VIEW_CLOSE_REQUEST); diff --git a/dash/DashView.h b/dash/DashView.h index f6c74cd64..e057e2f5e 100644 --- a/dash/DashView.h +++ b/dash/DashView.h @@ -123,7 +123,9 @@ private: PreviewStateMachine preview_state_machine_; previews::PreviewContainer::Ptr preview_container_; bool preview_displaying_; + std::string stored_preview_unique_id_; std::string stored_preview_uri_identifier_; + dash::previews::Navigation preview_navigation_mode_; nux::VLayout* layout_; DashLayout* content_layout_; diff --git a/dash/LensView.cpp b/dash/LensView.cpp index 31644e2fd..f64714746 100644 --- a/dash/LensView.cpp +++ b/dash/LensView.cpp @@ -279,6 +279,8 @@ void LensView::OnCategoryAdded(Category const& category) counts_[group] = 0; ResultViewGrid* grid = new ResultViewGrid(NUX_TRACKER_LOCATION); + std::string unique_id = name + lens_->name(); + grid->unique_id = unique_id; grid->expanded = false; if (renderer_name == "tile-horizontal") { @@ -289,7 +291,7 @@ void LensView::OnCategoryAdded(Category const& category) else grid->SetModelRenderer(new ResultRendererTile(NUX_TRACKER_LOCATION)); - grid->UriActivated.connect([&] (std::string const& uri, ResultView::ActivateType type) + grid->UriActivated.connect(sigc::bind([&] (std::string const& uri, ResultView::ActivateType type, std::string const& view_id) { switch (type) { @@ -300,13 +302,13 @@ void LensView::OnCategoryAdded(Category const& category) } break; case ResultView::ActivateType::PREVIEW: { - uri_preview_activated.emit(uri); + uri_preview_activated.emit(uri, view_id); lens_->Preview(uri); } break; default: break; }; - }); + }, unique_id)); group->SetChildView(grid); diff --git a/dash/LensView.h b/dash/LensView.h index 28915b886..bcf239345 100644 --- a/dash/LensView.h +++ b/dash/LensView.h @@ -69,7 +69,7 @@ public: nux::Property<bool> can_refine_search; sigc::signal<void, std::string const&> uri_activated; - sigc::signal<void, std::string const&> uri_preview_activated; + sigc::signal<void, std::string const&, std::string const&> uri_preview_activated; void PerformSearch(std::string const& search_query); void CheckNoResults(Lens::Hints const& hints); diff --git a/dash/PreviewStateMachine.cpp b/dash/PreviewStateMachine.cpp index 7f278af5c..4d4543390 100644 --- a/dash/PreviewStateMachine.cpp +++ b/dash/PreviewStateMachine.cpp @@ -17,17 +17,22 @@ */ #include "PreviewStateMachine.h" - +#include <NuxCore/Logger.h> namespace unity { namespace dash { +namespace +{ +nux::logging::Logger logger("unity.dash.PreviewStateMachine"); +} PreviewStateMachine::PreviewStateMachine() : preview_active(false) , left_results(-1) , right_results(-1) , stored_preview_(nullptr) + , requires_activation_(true) { for (int pos = SplitPosition::START; pos != SplitPosition::END; pos++) { @@ -46,11 +51,17 @@ void PreviewStateMachine::ActivatePreview(Preview::Ptr preview) { stored_preview_ = preview; CheckPreviewRequirementsFulfilled(); + left_results = -1; + right_results = -1; + requires_activation_ = true; } void PreviewStateMachine::ClosePreview() { stored_preview_ = nullptr; + left_results = -1; + right_results = -1; + preview_active = true; SetSplitPosition(SplitPosition::CONTENT_AREA, -1); } @@ -67,9 +78,12 @@ int PreviewStateMachine::GetSplitPosition(SplitPosition position) void PreviewStateMachine::CheckPreviewRequirementsFulfilled() { - if (preview_active()) + if (!requires_activation_) return; + //if (preview_active()) + // return; + if (stored_preview_ == nullptr) return; @@ -82,13 +96,14 @@ void PreviewStateMachine::CheckPreviewRequirementsFulfilled() if (GetSplitPosition(SEARCH_BAR) < 0) return; */ - if (left_results < 0 && + if (left_results < 0 || right_results < 0) return; - + LOG_DEBUG(logger) << "activating preview: " << left_results << " - " << right_results; preview_active = true; PreviewActivated(stored_preview_); + requires_activation_ = false; } } diff --git a/dash/PreviewStateMachine.h b/dash/PreviewStateMachine.h index 5fa76a14a..71ed52ff6 100644 --- a/dash/PreviewStateMachine.h +++ b/dash/PreviewStateMachine.h @@ -63,6 +63,7 @@ private: std::unordered_map<int, int> split_positions_; Preview::Ptr stored_preview_; + bool requires_activation_; }; } diff --git a/dash/ResultView.h b/dash/ResultView.h index 08085b7a0..b035e54ee 100644 --- a/dash/ResultView.h +++ b/dash/ResultView.h @@ -65,7 +65,7 @@ public: nux::Property<bool> expanded; nux::Property<int> results_per_row; - + nux::Property<std::string> unique_id; sigc::signal<void, std::string const&, ActivateType> UriActivated; std::string GetName() const; diff --git a/dash/ResultViewGrid.cpp b/dash/ResultViewGrid.cpp index 217ffe61b..fc82a35f8 100644 --- a/dash/ResultViewGrid.cpp +++ b/dash/ResultViewGrid.cpp @@ -104,26 +104,45 @@ ResultViewGrid::ResultViewGrid(NUX_FILE_LINE_DECL) ubus_.RegisterInterest(UBUS_DASH_PREVIEW_NAVIGATION_REQUEST, [&] (GVariant* data) { int nav_mode = 0; gchar* uri; - g_variant_get(data, "(is)", &nav_mode, &uri); + gchar* proposed_unique_id; + g_variant_get(data, "(iss)", &nav_mode, &uri, &proposed_unique_id); + //LOG_DEBUG(logger) << "got navigation request: " << nav_mode << ", " << uri; + //LOG_DEBUG(logger) << "testing '" << unique_id() << "' vs '" << proposed_unique_id << "'"; + if (std::string(proposed_unique_id) != unique_id()) + return; + if (std::string(uri) == activated_uri_) { int current_index = GetIndexForUri(activated_uri_); - if (nav_mode == -1) + LOG_DEBUG(logger) << "current index: " << current_index << " (" << activated_uri_ << ")"; + if (nav_mode == -1) // left { current_index--; } - else if (nav_mode == 1) + else if (nav_mode == 1) // right { current_index++; } + + if (current_index < 0 || static_cast<unsigned int>(current_index) >= results_.size()) + { + LOG_ERROR(logger) << "requested to activated a result that does not exist: " << current_index; + return; + } + // closed if (nav_mode == 0) { activated_uri_ = ""; } else { + LOG_DEBUG(logger) << "activating preview for index: " << current_index; + int left_results = current_index; + int right_results = (results_.size()) ? (results_.size() - current_index) - 1 : 0; + ubus_.SendMessage(UBUS_DASH_PREVIEW_INFO_PAYLOAD, + g_variant_new("(iii)", 0, left_results, right_results)); activated_uri_ = GetUriForIndex(current_index); UriActivated.emit(activated_uri_, ActivateType::PREVIEW); } |
