Skip to content

Commit

Permalink
WIP A/B playback sync
Browse files Browse the repository at this point in the history
  • Loading branch information
darbyjohnston committed Mar 6, 2024
1 parent fc743ae commit 08cc68c
Show file tree
Hide file tree
Showing 16 changed files with 297 additions and 66 deletions.
18 changes: 18 additions & 0 deletions lib/tlPlay/FilesModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ namespace tl
std::shared_ptr<observer::List<std::shared_ptr<FilesModelItem> > > active;
std::shared_ptr<observer::List<int> > layers;
std::shared_ptr<observer::Value<timeline::CompareOptions> > compareOptions;
std::shared_ptr<observer::Value<timeline::CompareTimeMode> > compareTime;
};

void FilesModel::_init(const std::shared_ptr<system::Context>& context)
Expand All @@ -37,6 +38,7 @@ namespace tl
p.active = observer::List<std::shared_ptr<FilesModelItem> >::create();
p.layers = observer::List<int>::create();
p.compareOptions = observer::Value<timeline::CompareOptions>::create();
p.compareTime = observer::Value<timeline::CompareTimeMode>::create();
}

FilesModel::FilesModel() :
Expand Down Expand Up @@ -521,6 +523,22 @@ namespace tl
}
}

timeline::CompareTimeMode FilesModel::getCompareTime() const
{
return _p->compareTime->get();
}

std::shared_ptr<observer::IValue<timeline::CompareTimeMode> > FilesModel::observeCompareTime() const
{
return _p->compareTime;
}

void FilesModel::setCompareTime(timeline::CompareTimeMode value)
{
TLRENDER_P();
p.compareTime->setIfChanged(value);
}

int FilesModel::_index(const std::shared_ptr<FilesModelItem>& item) const
{
TLRENDER_P();
Expand Down
9 changes: 9 additions & 0 deletions lib/tlPlay/FilesModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,15 @@ namespace tl
//! Observe the compare options.
std::shared_ptr<observer::IValue<timeline::CompareOptions> > observeCompareOptions() const;

//! Set the compare time mode.
void setCompareTime(timeline::CompareTimeMode);

//! Get the compare time mode.
timeline::CompareTimeMode getCompareTime() const;

//! Observe the compare time mode.
std::shared_ptr<observer::IValue<timeline::CompareTimeMode> > observeCompareTime() const;

//! Set the compare options.
void setCompareOptions(const timeline::CompareOptions&);

Expand Down
11 changes: 11 additions & 0 deletions lib/tlPlayApp/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ namespace tl
std::shared_ptr<observer::ListObserver<std::shared_ptr<play::FilesModelItem> > > filesObserver;
std::shared_ptr<observer::ListObserver<std::shared_ptr<play::FilesModelItem> > > activeObserver;
std::shared_ptr<observer::ListObserver<int> > layersObserver;
std::shared_ptr<observer::ValueObserver<timeline::CompareTimeMode> > compareTimeObserver;
std::shared_ptr<observer::ValueObserver<size_t> > recentFilesMaxObserver;
std::shared_ptr<observer::ListObserver<file::Path> > recentFilesObserver;
std::shared_ptr<observer::ValueObserver<bool> > mainWindowObserver;
Expand Down Expand Up @@ -499,6 +500,15 @@ namespace tl
}
}*/
});
p.compareTimeObserver = observer::ValueObserver<timeline::CompareTimeMode>::create(
p.filesModel->observeCompareTime(),
[this](timeline::CompareTimeMode value)
{
if (auto player = _p->player->get())
{
player->setCompareTime(value);
}
});

auto fileBrowserSystem = _context->getSystem<ui::FileBrowserSystem>();
auto recentFilesModel = fileBrowserSystem->getRecentFilesModel();
Expand Down Expand Up @@ -949,6 +959,7 @@ namespace tl
}
}
player->setCompare(compare);
player->setCompareTime(p.filesModel->getCompareTime());
}

p.activeFiles = files;
Expand Down
52 changes: 37 additions & 15 deletions lib/tlPlayApp/CompareActions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ namespace tl
}
});

const std::array<std::string, static_cast<size_t>(timeline::CompareMode::Count)> icons =
const std::array<std::string, static_cast<size_t>(timeline::CompareMode::Count)> compareIcons =
{
"CompareA",
"CompareB",
Expand All @@ -63,7 +63,7 @@ namespace tl
"CompareVertical",
"CompareTile"
};
const std::array<ui::Key, static_cast<size_t>(timeline::CompareMode::Count)> shortcuts =
const std::array<ui::Key, static_cast<size_t>(timeline::CompareMode::Count)> compareShortcuts =
{
ui::Key::A,
ui::Key::B,
Expand All @@ -74,21 +74,21 @@ namespace tl
ui::Key::Unknown,
ui::Key::T
};
const std::array<std::string, static_cast<size_t>(timeline::CompareMode::Count)> toolTips =
const std::array<std::string, static_cast<size_t>(timeline::CompareMode::Count)> compareToolTips =
{
string::Format(
"Show the A file\n"
"\n"
"Shortcut: {0}").
arg(ui::getLabel(
shortcuts[static_cast<size_t>(timeline::CompareMode::A)],
compareShortcuts[static_cast<size_t>(timeline::CompareMode::A)],
static_cast<int>(ui::KeyModifier::Control))),
string::Format(
"Show the B file\n"
"\n"
"Shortcut: {0}").
arg(ui::getLabel(
shortcuts[static_cast<size_t>(timeline::CompareMode::B)],
compareShortcuts[static_cast<size_t>(timeline::CompareMode::B)],
static_cast<int>(ui::KeyModifier::Control))),
string::Format(
"Wipe between the A and B files\n"
Expand All @@ -97,7 +97,7 @@ namespace tl
"\n"
"Shortcut: {0}").
arg(ui::getLabel(
shortcuts[static_cast<size_t>(timeline::CompareMode::Wipe)],
compareShortcuts[static_cast<size_t>(timeline::CompareMode::Wipe)],
static_cast<int>(ui::KeyModifier::Control))),
"Show the A file over the B file with transparency",
"Show the difference between the A and B files",
Expand All @@ -108,18 +108,18 @@ namespace tl
"\n"
"Shortcut: {0}").
arg(ui::getLabel(
shortcuts[static_cast<size_t>(timeline::CompareMode::Tile)],
compareShortcuts[static_cast<size_t>(timeline::CompareMode::Tile)],
static_cast<int>(ui::KeyModifier::Control))),
};
const auto enums = timeline::getCompareModeEnums();
const auto labels = timeline::getCompareModeLabels();
for (size_t i = 0; i < enums.size(); ++i)
const auto compareEnums = timeline::getCompareModeEnums();
const auto comapreLabels = timeline::getCompareModeLabels();
for (size_t i = 0; i < compareEnums.size(); ++i)
{
const auto mode = enums[i];
p.actions[labels[i]] = std::make_shared<ui::Action>(
const auto mode = compareEnums[i];
p.actions[comapreLabels[i]] = std::make_shared<ui::Action>(
timeline::getLabel(mode),
icons[i],
shortcuts[i],
compareIcons[i],
compareShortcuts[i],
static_cast<int>(ui::KeyModifier::Control),
[appWeak, mode]
{
Expand All @@ -130,7 +130,29 @@ namespace tl
app->getFilesModel()->setCompareOptions(options);
}
});
p.actions[labels[i]]->toolTip = toolTips[i];
p.actions[comapreLabels[i]]->toolTip = compareToolTips[i];
}

const auto compareTimeEnums = timeline::getCompareTimeModeEnums();
const auto comapreTimeLabels = timeline::getCompareTimeModeLabels();
const std::array<std::string, static_cast<size_t>(timeline::CompareMode::Count)> compareTimeToolTips =
{
"Compare relative times",
"Compare absolute times"
};
for (size_t i = 0; i < compareTimeEnums.size(); ++i)
{
const auto mode = compareTimeEnums[i];
p.actions[comapreTimeLabels[i]] = std::make_shared<ui::Action>(
comapreTimeLabels[i],
[appWeak, mode]
{
if (auto app = appWeak.lock())
{
app->getFilesModel()->setCompareTime(mode);
}
});
p.actions[comapreTimeLabels[i]]->toolTip = compareTimeToolTips[i];
}
}

Expand Down
31 changes: 29 additions & 2 deletions lib/tlPlayApp/CompareMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ namespace tl
std::map<std::string, std::shared_ptr<ui::Action> > actions;
std::shared_ptr<Menu> bMenu;
std::vector<std::shared_ptr<ui::Action> > bActions;
std::shared_ptr<Menu> timeMenu;

std::shared_ptr<observer::ListObserver<std::shared_ptr<play::FilesModelItem> > > filesObserver;
std::shared_ptr<observer::ListObserver<int> > bIndexesObserver;
std::shared_ptr<observer::ValueObserver<timeline::CompareOptions> > compareOptionsObserver;
std::shared_ptr<observer::ValueObserver<timeline::CompareTimeMode> > compareTimeObserver;
};

void CompareMenu::_init(
Expand All @@ -39,11 +41,18 @@ namespace tl
addItem(p.actions["Next"]);
addItem(p.actions["Prev"]);
addDivider();
const auto labels = timeline::getCompareModeLabels();
for (const auto& label : labels)
const auto compareLabels = timeline::getCompareModeLabels();
for (const auto& label : compareLabels)
{
addItem(p.actions[label]);
}
addDivider();
p.timeMenu = addSubMenu("Time");
const auto timeLabels = timeline::getCompareTimeModeLabels();
for (const auto& label : timeLabels)
{
p.timeMenu->addItem(p.actions[label]);
}

p.filesObserver = observer::ListObserver<std::shared_ptr<play::FilesModelItem> >::create(
app->getFilesModel()->observeFiles(),
Expand All @@ -65,6 +74,13 @@ namespace tl
{
_compareUpdate(value);
});

p.compareTimeObserver = observer::ValueObserver<timeline::CompareTimeMode>::create(
app->getFilesModel()->observeCompareTime(),
[this](timeline::CompareTimeMode value)
{
_compareTimeUpdate(value);
});
}

CompareMenu::CompareMenu() :
Expand Down Expand Up @@ -147,5 +163,16 @@ namespace tl
setItemChecked(p.actions[labels[i]], enums[i] == value.mode);
}
}

void CompareMenu::_compareTimeUpdate(timeline::CompareTimeMode value)
{
TLRENDER_P();
const auto enums = timeline::getCompareTimeModeEnums();
const auto labels = timeline::getCompareTimeModeLabels();
for (size_t i = 0; i < enums.size(); ++i)
{
p.timeMenu->setItemChecked(p.actions[labels[i]], enums[i] == value);
}
}
}
}
1 change: 1 addition & 0 deletions lib/tlPlayApp/CompareMenu.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ namespace tl
const std::vector<std::shared_ptr<play::FilesModelItem> >&);
void _bUpdate(const std::vector<int>&);
void _compareUpdate(const timeline::CompareOptions&);
void _compareTimeUpdate(timeline::CompareTimeMode);

TLRENDER_PRIVATE();
};
Expand Down
13 changes: 12 additions & 1 deletion lib/tlPlayQtApp/App.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,15 @@ namespace tl
#if defined(TLRENDER_BMD)
std::shared_ptr<bmd::DevicesModel> bmdDevicesModel;
std::shared_ptr<bmd::OutputDevice> bmdOutputDevice;
image::VideoLevels bmdOutputVideoLevels;
image::VideoLevels bmdOutputVideoLevels = image::VideoLevels::First;
#endif // TLRENDER_BMD
std::unique_ptr<QTimer> timer;

std::shared_ptr<observer::ValueObserver<std::string> > settingsObserver;
std::shared_ptr<observer::ListObserver<std::shared_ptr<play::FilesModelItem> > > filesObserver;
std::shared_ptr<observer::ListObserver<std::shared_ptr<play::FilesModelItem> > > activeObserver;
std::shared_ptr<observer::ListObserver<int> > layersObserver;
std::shared_ptr<observer::ValueObserver<timeline::CompareTimeMode> > compareTimeObserver;
std::shared_ptr<observer::ValueObserver<size_t> > recentFilesMaxObserver;
std::shared_ptr<observer::ListObserver<file::Path> > recentFilesObserver;
std::shared_ptr<observer::ValueObserver<float> > volumeObserver;
Expand Down Expand Up @@ -505,6 +506,15 @@ namespace tl
}
}*/
});
p.compareTimeObserver = observer::ValueObserver<timeline::CompareTimeMode>::create(
p.filesModel->observeCompareTime(),
[this](timeline::CompareTimeMode value)
{
if (_p->player)
{
_p->player->setCompareTime(value);
}
});

p.recentFilesMaxObserver = observer::ValueObserver<size_t>::create(
p.recentFilesModel->observeRecentMax(),
Expand Down Expand Up @@ -963,6 +973,7 @@ namespace tl
}
}
player->setCompare(compare);
player->setCompareTime(p.filesModel->getCompareTime());
}

p.activeFiles = files;
Expand Down
Loading

0 comments on commit 08cc68c

Please sign in to comment.