- Move Behavior-General options (hover focus, slider ladder, scroll zooms) into the General preferences tab. - Move Behavior-Audio option (audio scrubbing) into the Audio preferences tab. - Promote remaining Behavior categories (Timeline, Playback, Project, Nodes, Rendering) to top-level sidebar entries without the 'Behavior - ' prefix. - Update Chinese translations for the new sidebar titles and fill unfinished Behavior tab strings. NodeView: - Remove double-click jump-to-parameter-editor behavior; keep expand/collapse. - Add right-click context menu item 'Show in Parameter Editor'. - Add Shift+P shortcut bound to the same action. Render: - Fix crash in PreviewAutoCacher::ClearSingleFrameRenders when proxy playback causes a render ticket to finish synchronously before the watcher pointer is returned. Defer the watcher Finished signal via queued connection so the caller can safely register the watcher before it is deleted.
157 lines
4.7 KiB
C++
157 lines
4.7 KiB
C++
/***
|
|
|
|
Olive - Non-Linear Video Editor
|
|
Copyright (C) 2022 Olive Team
|
|
Modifications Copyright (C) 2025 mikesolar
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
***/
|
|
|
|
#include "preferencesbehaviortab.h"
|
|
|
|
#include <QLabel>
|
|
|
|
#include "config/config.h"
|
|
|
|
namespace olive
|
|
{
|
|
|
|
PreferencesBehaviorTab::PreferencesBehaviorTab(Category category)
|
|
: category_(category)
|
|
, graphics_backend_combobox_(nullptr)
|
|
{
|
|
QVBoxLayout *layout = new QVBoxLayout(this);
|
|
layout->setAlignment(Qt::AlignTop);
|
|
|
|
switch (category_) {
|
|
case kCategoryTimeline:
|
|
AddItems({
|
|
{ tr("Auto-Seek to Imported Clips"),
|
|
QStringLiteral("EnableSeekToImport") },
|
|
{ tr("Edit Tool Also Seeks"),
|
|
QStringLiteral("EditToolAlsoSeeks") },
|
|
{ tr("Edit Tool Selects Links"),
|
|
QStringLiteral("EditToolSelectsLinks") },
|
|
{ tr("Enable Drag Files to Timeline"),
|
|
QStringLiteral("EnableDragFilesToTimeline") },
|
|
{ tr("Invert Timeline Scroll Axes"),
|
|
QStringLiteral("InvertTimelineScrollAxes"),
|
|
tr("Hold ALT on any UI element to switch scrolling axes") },
|
|
{ tr("Seek Also Selects"), QStringLiteral("SeekAlsoSelects") },
|
|
{ tr("Seek to the End of Pastes"), QStringLiteral("PasteSeeks") },
|
|
{ tr("Selecting Also Seeks"), QStringLiteral("SelectAlsoSeeks") },
|
|
});
|
|
break;
|
|
|
|
case kCategoryPlayback:
|
|
AddItems({
|
|
{ tr("Ask For Name When Setting Marker"),
|
|
QStringLiteral("SetNameWithMarker") },
|
|
{ tr("Automatically rewind at the end of a sequence"),
|
|
QStringLiteral("AutoSeekToBeginning") },
|
|
});
|
|
break;
|
|
|
|
case kCategoryProject:
|
|
AddItem(tr("Drop Files on Media to Replace"),
|
|
QStringLiteral("DropFileOnMediaToReplace"));
|
|
break;
|
|
|
|
case kCategoryNodes:
|
|
AddItems({
|
|
{ tr("Add Default Effects to New Clips"),
|
|
QStringLiteral("AddDefaultEffectsToClips") },
|
|
{ tr("Auto-Scale By Default"),
|
|
QStringLiteral("AutoscaleByDefault") },
|
|
{ tr("Splitting Clips Copies Dependencies"),
|
|
QStringLiteral("SplitClipsCopyNodes"),
|
|
tr("Multiple clips can share the same nodes. Disable this to "
|
|
"automatically share node dependencies among clips when copying "
|
|
"or splitting them.") },
|
|
});
|
|
break;
|
|
|
|
case kCategoryRendering:
|
|
{
|
|
QLabel *backend_label = new QLabel(tr("Graphics Backend"));
|
|
backend_label->setToolTip(
|
|
tr("Selects the graphics API Oak should request on next launch. "
|
|
"Vulkan is experimental: on most systems it will fall back to "
|
|
"OpenGL or use a prototype Vulkan path that is not yet fully "
|
|
"validated."));
|
|
|
|
graphics_backend_combobox_ = new QComboBox();
|
|
graphics_backend_combobox_->addItem(tr("OpenGL"),
|
|
QStringLiteral("opengl"));
|
|
graphics_backend_combobox_->addItem(tr("Vulkan (experimental)"),
|
|
QStringLiteral("vulkan"));
|
|
const QString current_backend =
|
|
OLIVE_CONFIG("GraphicsBackend").toString().toLower();
|
|
const int backend_index = graphics_backend_combobox_->findData(
|
|
current_backend.isEmpty() ? QStringLiteral("opengl")
|
|
: current_backend);
|
|
graphics_backend_combobox_->setCurrentIndex(backend_index >= 0
|
|
? backend_index
|
|
: 0);
|
|
|
|
QHBoxLayout *backend_layout = new QHBoxLayout();
|
|
backend_layout->addWidget(backend_label);
|
|
backend_layout->addWidget(graphics_backend_combobox_, 1);
|
|
layout->addLayout(backend_layout);
|
|
|
|
AddItem(tr("Use glFinish"), QStringLiteral("UseGLFinish"));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void PreferencesBehaviorTab::Accept(MultiUndoCommand *command)
|
|
{
|
|
Q_UNUSED(command)
|
|
|
|
for (auto it = config_map_.cbegin(); it != config_map_.cend(); ++it) {
|
|
OLIVE_CONFIG_STR(it.value()) = it.key()->isChecked();
|
|
}
|
|
|
|
if (graphics_backend_combobox_) {
|
|
OLIVE_CONFIG("GraphicsBackend") =
|
|
graphics_backend_combobox_->currentData().toString();
|
|
}
|
|
}
|
|
|
|
void PreferencesBehaviorTab::AddItems(const QVector<Item> &items)
|
|
{
|
|
for (const Item &i : items) {
|
|
AddItem(i.text, i.config_key, i.tooltip);
|
|
}
|
|
}
|
|
|
|
QCheckBox *PreferencesBehaviorTab::AddItem(const QString &text,
|
|
const QString &config_key,
|
|
const QString &tooltip)
|
|
{
|
|
QCheckBox *checkbox = new QCheckBox(text);
|
|
checkbox->setToolTip(tooltip);
|
|
checkbox->setChecked(OLIVE_CONFIG_STR(config_key).toBool());
|
|
|
|
config_map_.insert(checkbox, config_key);
|
|
|
|
layout()->addWidget(checkbox);
|
|
|
|
return checkbox;
|
|
}
|
|
|
|
}
|