summaryrefslogtreecommitdiff
diff options
-rw-r--r--dash/DashView.cpp118
-rw-r--r--dash/DashView.h2
-rw-r--r--dash/LensView.cpp8
-rw-r--r--dash/LensView.h2
-rw-r--r--dash/PreviewStateMachine.cpp23
-rw-r--r--dash/PreviewStateMachine.h1
-rw-r--r--dash/ResultView.h2
-rw-r--r--dash/ResultViewGrid.cpp25
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);
}