Files
test2/source/blender/sequencer/intern/channels.cc
John Kiril Swenson 5a2a6da0a2 VSE: Blade Tool Cursor
This patch adds initial cursor support for the blade tool, with bitmaps
for 16x16, 24x24, and 32x32 cursors.

Additional Changes:
- Locked strips now show a "stop" icon when hovered over.
- Previously, the frame to split was truncated when clicking in between frames.
  Now, round to the closest frame.
- Previously, the blade operator was able to select padded strip handles
  outside of strip bounds. This bug has been resolved, so that selection with
  the blade tool can only happen via box-select passthrough.

Pull Request: https://projects.blender.org/blender/blender/pulls/136749
2025-04-13 22:49:18 +02:00

102 lines
2.3 KiB
C++

/* SPDX-FileCopyrightText: 2022 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup sequencer
*/
#include <cstring>
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
#include "DNA_sequence_types.h"
#include "BLI_listbase.h"
#include "BLI_string.h"
#include "BLT_translation.hh"
#include "sequencer.hh"
#include "SEQ_channels.hh"
#include "SEQ_sequencer.hh"
namespace blender::seq {
ListBase *channels_displayed_get(const Editing *ed)
{
return ed->displayed_channels;
}
void channels_displayed_set(Editing *ed, ListBase *channels)
{
ed->displayed_channels = channels;
}
void channels_ensure(ListBase *channels)
{
/* Allocate channels. Channel 0 is never used, but allocated to prevent off by 1 issues. */
for (int i = 0; i < MAX_CHANNELS + 1; i++) {
SeqTimelineChannel *channel = MEM_callocN<SeqTimelineChannel>("seq timeline channel");
SNPRINTF(channel->name, DATA_("Channel %d"), i);
channel->index = i;
BLI_addtail(channels, channel);
}
}
void channels_duplicate(ListBase *channels_dst, ListBase *channels_src)
{
LISTBASE_FOREACH (SeqTimelineChannel *, channel, channels_src) {
SeqTimelineChannel *channel_duplicate = static_cast<SeqTimelineChannel *>(
MEM_dupallocN(channel));
BLI_addtail(channels_dst, channel_duplicate);
}
}
void channels_free(ListBase *channels)
{
LISTBASE_FOREACH_MUTABLE (SeqTimelineChannel *, channel, channels) {
MEM_freeN(channel);
}
}
SeqTimelineChannel *channel_get_by_index(const ListBase *channels, const int channel_index)
{
return static_cast<SeqTimelineChannel *>(BLI_findlink(channels, channel_index));
}
char *channel_name_get(ListBase *channels, const int channel_index)
{
SeqTimelineChannel *channel = channel_get_by_index(channels, channel_index);
return channel->name;
}
int channel_index_get(const SeqTimelineChannel *channel)
{
return channel->index;
}
bool channel_is_locked(const SeqTimelineChannel *channel)
{
return (channel->flag & SEQ_CHANNEL_LOCK) != 0;
}
bool channel_is_muted(const SeqTimelineChannel *channel)
{
return (channel->flag & SEQ_CHANNEL_MUTE) != 0;
}
ListBase *get_channels_by_seq(Editing *ed, const Strip *strip)
{
Strip *strip_owner = lookup_meta_by_strip(ed, strip);
if (strip_owner != nullptr) {
return &strip_owner->channels;
}
return &ed->channels;
}
} // namespace blender::seq