Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
darbyjohnston committed Jul 4, 2024
1 parent d297048 commit f4a4859
Show file tree
Hide file tree
Showing 27 changed files with 420 additions and 413 deletions.
5 changes: 4 additions & 1 deletion lib/tlPlay/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ set(HEADERS
Util.h
Viewport.h
ViewportModel.h)
set(PRIVATE_HEADERS
ViewportPrivate.h)

set(SOURCE
App.cpp
Expand All @@ -25,9 +27,10 @@ set(SOURCE
Settings.cpp
Util.cpp
Viewport.cpp
ViewportColorWidget.cpp
ViewportModel.cpp)

add_library(tlPlay ${HEADERS} ${SOURCE})
add_library(tlPlay ${HEADERS} ${PRIVATE_HEADERS} ${SOURCE})
target_link_libraries(tlPlay tlTimelineUI tlDevice)
set_target_properties(tlPlay PROPERTIES FOLDER lib)
set_target_properties(tlPlay PROPERTIES PUBLIC_HEADER "${HEADERS}")
Expand Down
164 changes: 153 additions & 11 deletions lib/tlPlay/Viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// Copyright (c) 2021-2024 Darby Johnston
// All rights reserved.

#include <tlPlay/Viewport.h>
#include <tlPlay/ViewportPrivate.h>

#include <tlUI/GridLayout.h>
#include <tlUI/Label.h>
Expand All @@ -20,12 +20,32 @@ namespace tl
size_t droppedFrames = 0;

std::shared_ptr<ui::Label> fpsLabel;
std::shared_ptr<ui::Label> colorPickerLabel;
std::shared_ptr<ui::GridLayout> hudLayout;
struct ColorPicker
{
image::Color4f color;
math::Vector2i pos;
std::shared_ptr<ViewportColorWidget> widget;
};
std::vector<ColorPicker> colorPickers;

enum class MouseMode
{
None,
ColorPicker,
DragWidget
};
struct MouseData
{
MouseMode mode = MouseMode::None;
size_t index = 0;
math::Vector2i offset;
};
MouseData mouse;

std::shared_ptr<observer::ValueObserver<double> > fpsObserver;
std::shared_ptr<observer::ValueObserver<size_t> > droppedFramesObserver;
std::shared_ptr<observer::ValueObserver<image::Color4f> > colorPickerObserver;
std::shared_ptr<observer::ListObserver<image::Color4f> > colorPickersObserver;
};

void Viewport::_init(
Expand All @@ -38,11 +58,10 @@ namespace tl
p.hud = observer::Value<bool>::create(false);

p.fpsLabel = ui::Label::create(context);
p.fpsLabel->setFontRole(ui::FontRole::Mono);
p.fpsLabel->setMarginRole(ui::SizeRole::MarginInside);
p.fpsLabel->setBackgroundRole(ui::ColorRole::Base);

p.colorPickerLabel = ui::Label::create(context);

p.hudLayout = ui::GridLayout::create(context, shared_from_this());
p.hudLayout->setMarginRole(ui::SizeRole::MarginSmall);
p.fpsLabel->setParent(p.hudLayout);
Expand All @@ -54,19 +73,24 @@ namespace tl
[this](double value)
{
_p->fps = value;
_textUpdate();
_hudUpdate();
});
p.droppedFramesObserver = observer::ValueObserver<size_t>::create(
observeDroppedFrames(),
[this](size_t value)
{
_p->droppedFrames = value;
_textUpdate();
_hudUpdate();
});
p.colorPickerObserver = observer::ValueObserver<image::Color4f>::create(
observeColorPicker(),
[this](const image::Color4f& value)
p.colorPickersObserver = observer::ListObserver<image::Color4f>::create(
observeColorPickers(),
[this](const std::vector<image::Color4f>& value)
{
for (size_t i = 0; i < value.size() && i < _p->colorPickers.size(); ++i)
{
_p->colorPickers[i].color = value[i];
}
_colorWidgetsUpdate();
});
}

Expand Down Expand Up @@ -110,6 +134,33 @@ namespace tl
TimelineViewport::setGeometry(value);
TLRENDER_P();
p.hudLayout->setGeometry(value);
for (const auto& colorPicker : p.colorPickers)
{
math::Size2i sizeHint = colorPicker.widget->getSizeHint();
colorPicker.widget->setGeometry(math::Box2i(
colorPicker.pos.x,
colorPicker.pos.y,
sizeHint.w,
sizeHint.h));
}
}

void Viewport::childRemovedEvent(const ui::ChildEvent& event)
{
TimelineViewport::childRemovedEvent(event);
TLRENDER_P();
const auto i = std::find_if(
p.colorPickers.begin(),
p.colorPickers.end(),
[event](const Private::ColorPicker& value)
{
return event.child == value.widget;
});
if (i != p.colorPickers.end())
{
p.colorPickers.erase(i);
_colorPickersUpdate();
}
}

void Viewport::sizeHintEvent(const ui::SizeHintEvent& event)
Expand All @@ -119,13 +170,104 @@ namespace tl
_sizeHint = p.hudLayout->getSizeHint();
}

void Viewport::_textUpdate()
void Viewport::mouseMoveEvent(ui::MouseMoveEvent& event)
{
TimelineViewport::mouseMoveEvent(event);
TLRENDER_P();
switch (p.mouse.mode)
{
case Private::MouseMode::ColorPicker:
if (!p.colorPickers.empty())
{
p.colorPickers.back().pos = event.pos;
_colorPickersUpdate();
_updates |= ui::Update::Size;
_updates |= ui::Update::Draw;
}
break;
case Private::MouseMode::DragWidget:
if (p.mouse.index < p.colorPickers.size())
{
p.colorPickers[p.mouse.index].pos = event.pos - p.mouse.offset;
_colorPickersUpdate();
_updates |= ui::Update::Size;
_updates |= ui::Update::Draw;
}
break;
default: break;
}
}

void Viewport::mousePressEvent(ui::MouseClickEvent& event)
{
TimelineViewport::mousePressEvent(event);
TLRENDER_P();
takeKeyFocus();
if (0 == event.button)
{
for (size_t i = 0; i < p.colorPickers.size(); ++i)
{
if (p.colorPickers[i].widget->getGeometry().contains(event.pos))
{
p.mouse.mode = Private::MouseMode::DragWidget;
p.mouse.index = i;
p.mouse.offset = event.pos - p.colorPickers[i].widget->getGeometry().min;
}
}
}
if (Private::MouseMode::None == p.mouse.mode &&
0 == event.button &&
event.modifiers & static_cast<int>(ui::KeyModifier::Shift))
{
if (auto context = _context.lock())
{
p.mouse.mode = Private::MouseMode::ColorPicker;
p.colorPickers.push_back({
image::Color4f(),
event.pos,
ViewportColorWidget::create(context, shared_from_this()) });
_colorPickersUpdate();
_colorWidgetsUpdate();
_updates |= ui::Update::Size;
_updates |= ui::Update::Draw;
}
}
}

void Viewport::mouseReleaseEvent(ui::MouseClickEvent& event)
{
TimelineViewport::mouseReleaseEvent(event);
TLRENDER_P();
p.mouse = Private::MouseData();
}

void Viewport::_hudUpdate()
{
TLRENDER_P();
p.fpsLabel->setText(
string::Format("FPS: {0} ({1} dropped)").
arg(p.fps, 2, 4).
arg(p.droppedFrames));
}

void Viewport::_colorPickersUpdate()
{
TLRENDER_P();
std::vector<math::Vector2i> colorPickers;
for (const auto& colorPicker : p.colorPickers)
{
colorPickers.push_back(colorPicker.pos);
}
setColorPickers(colorPickers);
}

void Viewport::_colorWidgetsUpdate()
{
TLRENDER_P();
for (const auto& colorPicker : p.colorPickers)
{
colorPicker.widget->setColor(colorPicker.color);
}
}
}
}
8 changes: 7 additions & 1 deletion lib/tlPlay/Viewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,16 @@ namespace tl
void setHUD(bool);

void setGeometry(const math::Box2i&) override;
void childRemovedEvent(const ui::ChildEvent&) override;
void sizeHintEvent(const ui::SizeHintEvent&) override;
void mouseMoveEvent(ui::MouseMoveEvent&) override;
void mousePressEvent(ui::MouseClickEvent&) override;
void mouseReleaseEvent(ui::MouseClickEvent&) override;

private:
void _textUpdate();
void _hudUpdate();
void _colorPickersUpdate();
void _colorWidgetsUpdate();

TLRENDER_PRIVATE();
};
Expand Down
Loading

0 comments on commit f4a4859

Please sign in to comment.