// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
/*
* Copyright 2012 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License version 3, as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the applicable version of the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of both the GNU Lesser General Public
* License version 3 along with this program. If not, see
*
*
* Authored by: Nick Dedekind
*
*/
#include "PreviewNavigator.h"
#include
#include
#include
#include
namespace unity
{
namespace dash
{
namespace previews
{
NUX_IMPLEMENT_OBJECT_TYPE(PreviewNavigator);
PreviewNavigator::PreviewNavigator(Orientation direction, NUX_FILE_LINE_DECL)
: View(NUX_FILE_LINE_PARAM)
, scale(1.0)
, direction_(direction)
, texture_(nullptr)
, visual_state_(VisualState::NORMAL)
{
SetupViews();
UpdateTexture();
UpdateScale(scale);
scale.changed.connect(sigc::mem_fun(this, &PreviewNavigator::UpdateScale));
}
void PreviewNavigator::SetEnabled(bool enabled)
{
if (enabled != texture_->IsVisible())
{
texture_->SetVisible(enabled);
QueueRelayout();
}
}
std::string PreviewNavigator::GetName() const
{
return "PreviewNavigator";
}
void PreviewNavigator::AddProperties(debug::IntrospectionData& introspection)
{
introspection
.add("button-x", texture_->GetAbsoluteX())
.add("button-y", texture_->GetAbsoluteY())
.add("button-width", texture_->GetGeometry().width)
.add("button-height", texture_->GetGeometry().height)
.add("button-geo", texture_->GetAbsoluteGeometry())
.add("direction", static_cast(direction_));
}
void PreviewNavigator::Draw(nux::GraphicsEngine& gfx_engine, bool force_draw)
{
}
void PreviewNavigator::DrawContent(nux::GraphicsEngine& gfx_engine, bool force_draw)
{
nux::Geometry base = GetGeometry();
gfx_engine.PushClippingRectangle(base);
unsigned int alpha, src, dest = 0;
gfx_engine.GetRenderStates().GetBlend(alpha, src, dest);
gfx_engine.GetRenderStates().SetBlend(true, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
if (GetCompositionLayout())
GetCompositionLayout()->ProcessDraw(gfx_engine, force_draw);
gfx_engine.GetRenderStates().SetBlend(alpha, src, dest);
gfx_engine.PopClippingRectangle();
}
void PreviewNavigator::SetupViews()
{
previews::Style& style = dash::previews::Style::Instance();
if (direction_ == Orientation::LEFT || direction_ == Orientation::RIGHT)
{
nux::VLayout* vlayout = new nux::VLayout();
nux::HLayout* hlayout = new nux::HLayout();
vlayout->SetSpaceBetweenChildren(0);
hlayout->SetSpaceBetweenChildren(0);
layout_ = hlayout;
if (direction_ == Orientation::LEFT)
texture_ = new IconTexture(Style::Instance().GetNavLeftIcon(), style.GetNavigatorIconSize().CP(scale), style.GetNavigatorIconSize().CP(scale));
else
texture_ = new IconTexture(Style::Instance().GetNavRightIcon(), style.GetNavigatorIconSize().CP(scale), style.GetNavigatorIconSize().CP(scale));
texture_->SetDrawMode(IconTexture::DrawMode::STRETCH_WITH_ASPECT);
vlayout->AddSpace(0,1);
vlayout->AddLayout(hlayout);
vlayout->AddSpace(0,1);
SetLayout(vlayout);
}
else if (direction_ == Orientation::UP || direction_ == Orientation::DOWN)
{
// No support for this Yet
g_assert(false);
nux::HLayout* hlayout = new nux::HLayout();
nux::VLayout* vlayout = new nux::VLayout();
hlayout->SetSpaceBetweenChildren(0);
vlayout->SetSpaceBetweenChildren(0);
layout_ = vlayout;
hlayout->AddSpace(0,1);
hlayout->AddLayout(vlayout);
hlayout->AddSpace(0,1);
SetLayout(hlayout);
}
layout_->AddSpace(0, 1);
if (texture_)
{
AddChild(texture_);
layout_->AddView(texture_, 0, nux::MINOR_POSITION_CENTER, nux::MINOR_SIZE_FULL);
texture_->mouse_click.connect([this](int, int, unsigned long, unsigned long) { activated.emit(); });
texture_->mouse_enter.connect(sigc::mem_fun(this, &PreviewNavigator::TexRecvMouseEnter));
texture_->mouse_leave.connect(sigc::mem_fun(this, &PreviewNavigator::TexRecvMouseLeave));
}
layout_->AddSpace(0, 1);
}
void PreviewNavigator::TexRecvMouseEnter(int x, int y, unsigned long button_flags, unsigned long key_flags)
{
visual_state_ = VisualState::ACTIVE;
UpdateTexture();
QueueDraw();
}
void PreviewNavigator::TexRecvMouseLeave(int x, int y, unsigned long button_flags, unsigned long key_flags)
{
visual_state_ = VisualState::NORMAL;
UpdateTexture();
QueueDraw();
}
void PreviewNavigator::UpdateTexture()
{
if (!texture_)
return;
switch (visual_state_)
{
case VisualState::ACTIVE:
texture_->SetOpacity(1.0);
break;
case VisualState::NORMAL:
default:
texture_->SetOpacity(0.2);
break;
}
}
void PreviewNavigator::UpdateScale(double scale)
{
previews::Style& style = dash::previews::Style::Instance();
if (texture_)
{
int icon_size = style.GetNavigatorIconSize().CP(scale);
texture_->SetMinMaxSize(icon_size, icon_size);
}
QueueRelayout();
QueueDraw();
}
} // namespace previews
} // namespace dash
} // namespace unity