tahoma2d/toonz/sources/toonzqt/functiontoolbar.cpp

243 lines
7.1 KiB
C++
Raw Normal View History

2016-03-19 06:57:51 +13:00
#include "toonzqt/functiontoolbar.h"
// TnzQt includes
#include "toonzqt/doublefield.h"
#include "toonzqt/functionkeyframenavigator.h"
#include "toonzqt/functionselection.h"
#include "toonzqt/framenavigator.h"
#include "toonzqt/gutil.h"
#include "toonzqt/menubarcommand.h"
// TnzLib includes
#include "toonz/tframehandle.h"
#include "toonz/doubleparamcmd.h"
// Qt includes
#include <QLabel>
#include <QApplication>
//=========================================================================
/*
* two states: curve_defined / curve_not_defined
2016-06-15 18:43:10 +12:00
* three widgets: value_fld, frame_nav, keyframe_nav
2016-03-19 06:57:51 +13:00
(if curve_not_defined only keyframe_nav is visible)
* user actions
2016-06-15 18:43:10 +12:00
- value_fld changed / keyframe_nav changed (key icon) => modify current
curve
- frame_nav changed / keyframe_nav changed (arrows) => modify the 'extern'
frame
2016-03-19 06:57:51 +13:00
* 'extern' events:
- 'extern' frame changed => update fields
- curve selected => update fields (and possibly change status)
*/
//=========================================================================
FunctionToolbar::FunctionToolbar(QWidget *parent)
2016-06-15 18:43:10 +12:00
: DVGui::ToolBar(parent), m_frameHandle(0), m_curve(0), m_selection(0) {
setFixedHeight(28);
UI update and Icons from Konero (#126) * add multi arc mockup * implement mutli arc * add join and smooth option * reset multiarc and arc when deactivated * create self loop if the last point is the same as the first * make join option in multiarc consistent with tape tool * fix a bug where thickness don't affect mutliarc in vector level * remove join option in geometric tool * stop mutliarc after closing shape * double click can also end multi arc * fix a bug where multiArc will produce buggy stroke * fix a bug where geometric tools is not deactivated * add multiArc shortcut * rewrite multiArc * revert changes to tvectorimage * add undo data for multiArc * Paste as Copy Command for XSheet * Remove unneeded code * Bug fix * prevent guide lines from jumping around in MultiArc * make stroke color consistent in MultiArc * remove color in MultiArc's undo data * make color consistent in MultiArc with previous version * Fix single image raster levels * fix compilation error * fix a bug where multiArc might generate bugged stroke * Remove ICONV dep (#3304) * fix crash on saving studio palette * Move to Paste Special Menu * Don't Set Fixed Width if Docking a Floating Panel * Update how_to_build_win.md New draft of pr for requested changes to windows build instructions. * fix geometric tool multiarc smooth option * fix level saving failure * fix wrong warning after saving palette * fix a bug where moving a control point while holding alt has unintended result * fix travis-install (#3389) * Fix assert debug crash in flipconsole.cpp Fix crash when using the viewer controls in the console (debug) * Redraw Audio Waveform Fills the waveform rather than outlines it. * Update .gitignore * fix undo data when drawing arc and mutliarc * fix overwriting raster drawing palette (#3387) * mode sensitive fx settings * Create New Style Command Button (#3394) * Create New Style Command Button This PR creates a new button in the pallette editor that creates a new style. Button is large and easy access for a faster and easier workflow. Original code developed by Turtletooth for Tahoma. Given permission to develop within Openoonz. Co-Authored-By: Jeremy Bullock <turtletooth@users.noreply.github.com> * Update paletteviewergui.cpp Made changes to the PR per request by Shun. * Fixed a space within the code that wasn't suppose to be there. Co-authored-by: Jeremy Bullock <turtletooth@users.noreply.github.com> * tahoma license (#3396) * new style button optional * fix loading pegbars (removing updateKeyframes) * periodic random expression * add fx in linear color space this commit is based on source for the ComposeAdd plugin fx by DWANGO Co., Ltd. in dwango_opentoonz_plugins and opentoonz_plugin_utility repositories. * fractal noise iwa fx * skip unnecessary icon invalidation * fix frame range fill with tablet * stop function editor to open by dbl clicking key * Expanding the radius of the rotation handle. This just changes when the cursor transforms into the rotation tool. (cherry picked from commit 7722ae989bbdc6aa5cb48df7a4c08bae1fe6ea39) * fix vector img patern stroke style * Update Stylesheets - Support the new icon sizes - XSheet and Timeline significantly redesigned - Lots of margin fixes and refactoring - Remove deprecated icons, as some icons are moved into binary - New Light theme * New Icons - Redesigns almost every icon as symbolic - Adds icons for most commands * Add Option for Icon Themes - Adds option for icon themes - Removes useless label from Preferences category list * Update Icon Functions - Adds themePath() boolean - Adds function for recoloring black pixels in pixmaps to any color - Rebuilds createQIcon to use fromTheme() and recolorPixmap() - Removes createQIconOnOff as it seemed to be a rarely used duplicate of createQIcon - Removes a grey horizontal line drawn above the console play bar in the viewer * Set Default Icon Theme and Paths - Sets search paths for icons for use with QIcon::fromTheme() - Sets default start icon theme on first install - Sets flag for displaying icons in menus, so we can selectively hide them * Set Icons for Commands - Sets icons for the commands - Hides icons being displayed in menus as most icons are 20x20, they will look blurry when shrunk to 16x16 - Selectively allows icons to display for Tools in menus * Change Icon Sizes, General Fixes and Stylesheet Additions - Change icon sizes to new size - Remove margin around FX Editor window - Remove white line under color sliders in Style Editor - Make keyframe icons uniform and color stylable in the stylesheets - Removes deprecated stylesheet strings - Redesign GUI for palette list view - Make tree list header sort row stylable - Remove black lines from scrollbars in New Project window - Remove margin around combobox in Level Strip - Alter how some lines are drawn in the Timeline to fix some alpha issues - Make conditional fixed onion skin and normal onion skin dots contrast more against a light background area to make sure they have good visibility - Make text always viewable in the FPS field in console bar - Increase size of radio buttons in Cleanup Settings - Increase size of switches in motion path nodes - Remove unessesary "Layer" label in Timeline and other rects - Various colors made stylable in the stylesheets; palette numpad and selection frame, cleanup settings border, scene cast folder path, schematic lines, ruler, xsheet lines, keyframes, cell input box and more - Moves some external stylesheet icons into binary * Make TPanelTitleBar Icon States Stylable - Makes icon states for TPanelTitleBar buttons stylable in stylesheets * Travis Fixes * Swap Startup Popup Logos They were in the wrong folders * Revert "Swap Startup Popup Logos" This reverts commit 815908a9f3e725f48507dab8a2270bdfa045649d. * Fix Startup Popup Logo It wasn't switching * Feedback Changes - Change render visualization to clapboard - Fix text contrast on levels in XSheet * Make Cell Selection More Clear * Darken Light Theme and Tint Empty Cell Selection * Fix missing icons * Fix memo button * Bring back colors * Hide Motion Tab * Fix Play Range Area (Light) Make play range area more visible * Vector Column Color Co-authored-by: pojienie <pojienie@gmail.com> Co-authored-by: rim <11380091+rozhuk-im@users.noreply.github.com> Co-authored-by: shun-iwasawa <shun.iwasawa@ghibli.jp> Co-authored-by: Rodney <rodney.baker@gmail.com> Co-authored-by: DoctorRyan <65507211+DoctorRyan@users.noreply.github.com> Co-authored-by: shun-iwasawa <shun-iwasawa@users.noreply.github.com> Co-authored-by: Kite <konero@users.noreply.github.com> Co-authored-by: Jeremy Bullock <turtletooth@users.noreply.github.com> Co-authored-by: DoctorRyan <doctorryan1969.gmail.com>
2020-09-01 06:51:22 +12:00
setIconSize(QSize(20, 20));
2016-06-15 18:43:10 +12:00
m_valueToolbar = new DVGui::ToolBar();
m_keyframeToolbar = new DVGui::ToolBar();
// value field
m_valueToolbar->addWidget(new QLabel(tr("Value")));
m_valueFld = new DVGui::MeasuredDoubleLineEdit();
2020-05-23 09:31:30 +12:00
m_valueFld->setDecimals(2);
2016-06-15 18:43:10 +12:00
// frame navigator
m_frameNavigator = new FrameNavigator(this);
// keyframe navigator
m_keyframeNavigator = new FunctionKeyframeNavigator(this);
QWidget *space = new QWidget(this);
DVGui::ToolBar *spaceToolBar = new DVGui::ToolBar();
spaceToolBar->addWidget(space);
m_valueFld->setStyleSheet("height:14px;margin-right:5px;margin-top:2px;");
space->setMinimumHeight(22);
space->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
UI update and Icons from Konero (#126) * add multi arc mockup * implement mutli arc * add join and smooth option * reset multiarc and arc when deactivated * create self loop if the last point is the same as the first * make join option in multiarc consistent with tape tool * fix a bug where thickness don't affect mutliarc in vector level * remove join option in geometric tool * stop mutliarc after closing shape * double click can also end multi arc * fix a bug where multiArc will produce buggy stroke * fix a bug where geometric tools is not deactivated * add multiArc shortcut * rewrite multiArc * revert changes to tvectorimage * add undo data for multiArc * Paste as Copy Command for XSheet * Remove unneeded code * Bug fix * prevent guide lines from jumping around in MultiArc * make stroke color consistent in MultiArc * remove color in MultiArc's undo data * make color consistent in MultiArc with previous version * Fix single image raster levels * fix compilation error * fix a bug where multiArc might generate bugged stroke * Remove ICONV dep (#3304) * fix crash on saving studio palette * Move to Paste Special Menu * Don't Set Fixed Width if Docking a Floating Panel * Update how_to_build_win.md New draft of pr for requested changes to windows build instructions. * fix geometric tool multiarc smooth option * fix level saving failure * fix wrong warning after saving palette * fix a bug where moving a control point while holding alt has unintended result * fix travis-install (#3389) * Fix assert debug crash in flipconsole.cpp Fix crash when using the viewer controls in the console (debug) * Redraw Audio Waveform Fills the waveform rather than outlines it. * Update .gitignore * fix undo data when drawing arc and mutliarc * fix overwriting raster drawing palette (#3387) * mode sensitive fx settings * Create New Style Command Button (#3394) * Create New Style Command Button This PR creates a new button in the pallette editor that creates a new style. Button is large and easy access for a faster and easier workflow. Original code developed by Turtletooth for Tahoma. Given permission to develop within Openoonz. Co-Authored-By: Jeremy Bullock <turtletooth@users.noreply.github.com> * Update paletteviewergui.cpp Made changes to the PR per request by Shun. * Fixed a space within the code that wasn't suppose to be there. Co-authored-by: Jeremy Bullock <turtletooth@users.noreply.github.com> * tahoma license (#3396) * new style button optional * fix loading pegbars (removing updateKeyframes) * periodic random expression * add fx in linear color space this commit is based on source for the ComposeAdd plugin fx by DWANGO Co., Ltd. in dwango_opentoonz_plugins and opentoonz_plugin_utility repositories. * fractal noise iwa fx * skip unnecessary icon invalidation * fix frame range fill with tablet * stop function editor to open by dbl clicking key * Expanding the radius of the rotation handle. This just changes when the cursor transforms into the rotation tool. (cherry picked from commit 7722ae989bbdc6aa5cb48df7a4c08bae1fe6ea39) * fix vector img patern stroke style * Update Stylesheets - Support the new icon sizes - XSheet and Timeline significantly redesigned - Lots of margin fixes and refactoring - Remove deprecated icons, as some icons are moved into binary - New Light theme * New Icons - Redesigns almost every icon as symbolic - Adds icons for most commands * Add Option for Icon Themes - Adds option for icon themes - Removes useless label from Preferences category list * Update Icon Functions - Adds themePath() boolean - Adds function for recoloring black pixels in pixmaps to any color - Rebuilds createQIcon to use fromTheme() and recolorPixmap() - Removes createQIconOnOff as it seemed to be a rarely used duplicate of createQIcon - Removes a grey horizontal line drawn above the console play bar in the viewer * Set Default Icon Theme and Paths - Sets search paths for icons for use with QIcon::fromTheme() - Sets default start icon theme on first install - Sets flag for displaying icons in menus, so we can selectively hide them * Set Icons for Commands - Sets icons for the commands - Hides icons being displayed in menus as most icons are 20x20, they will look blurry when shrunk to 16x16 - Selectively allows icons to display for Tools in menus * Change Icon Sizes, General Fixes and Stylesheet Additions - Change icon sizes to new size - Remove margin around FX Editor window - Remove white line under color sliders in Style Editor - Make keyframe icons uniform and color stylable in the stylesheets - Removes deprecated stylesheet strings - Redesign GUI for palette list view - Make tree list header sort row stylable - Remove black lines from scrollbars in New Project window - Remove margin around combobox in Level Strip - Alter how some lines are drawn in the Timeline to fix some alpha issues - Make conditional fixed onion skin and normal onion skin dots contrast more against a light background area to make sure they have good visibility - Make text always viewable in the FPS field in console bar - Increase size of radio buttons in Cleanup Settings - Increase size of switches in motion path nodes - Remove unessesary "Layer" label in Timeline and other rects - Various colors made stylable in the stylesheets; palette numpad and selection frame, cleanup settings border, scene cast folder path, schematic lines, ruler, xsheet lines, keyframes, cell input box and more - Moves some external stylesheet icons into binary * Make TPanelTitleBar Icon States Stylable - Makes icon states for TPanelTitleBar buttons stylable in stylesheets * Travis Fixes * Swap Startup Popup Logos They were in the wrong folders * Revert "Swap Startup Popup Logos" This reverts commit 815908a9f3e725f48507dab8a2270bdfa045649d. * Fix Startup Popup Logo It wasn't switching * Feedback Changes - Change render visualization to clapboard - Fix text contrast on levels in XSheet * Make Cell Selection More Clear * Darken Light Theme and Tint Empty Cell Selection * Fix missing icons * Fix memo button * Bring back colors * Hide Motion Tab * Fix Play Range Area (Light) Make play range area more visible * Vector Column Color Co-authored-by: pojienie <pojienie@gmail.com> Co-authored-by: rim <11380091+rozhuk-im@users.noreply.github.com> Co-authored-by: shun-iwasawa <shun.iwasawa@ghibli.jp> Co-authored-by: Rodney <rodney.baker@gmail.com> Co-authored-by: DoctorRyan <65507211+DoctorRyan@users.noreply.github.com> Co-authored-by: shun-iwasawa <shun-iwasawa@users.noreply.github.com> Co-authored-by: Kite <konero@users.noreply.github.com> Co-authored-by: Jeremy Bullock <turtletooth@users.noreply.github.com> Co-authored-by: DoctorRyan <doctorryan1969.gmail.com>
2020-09-01 06:51:22 +12:00
QIcon toggleIcon = createQIcon("swap");
2017-06-26 14:43:02 +12:00
QAction *toggleAction = new QAction(tr("&Open Function Curve Editor"), this);
2016-06-15 18:43:10 +12:00
assert(toggleAction);
toggleAction->setIcon(toggleIcon);
//-----layout
m_valueFldAction = addWidget(m_valueToolbar);
m_keyframeNavigatorAction = addWidget(m_keyframeToolbar);
m_valueToolbar->addWidget(m_valueFld);
m_valueToolbar->addSeparator();
m_keyframeToolbar->addWidget(m_keyframeNavigator);
m_keyframeToolbar->addSeparator();
addWidget(m_frameNavigator);
addSeparator();
addWidget(spaceToolBar);
addSeparator();
addAction(toggleAction);
bool ret = connect(m_valueFld, SIGNAL(valueChanged()), this,
SLOT(onValueFieldChanged()));
ret = ret && connect(m_frameNavigator, SIGNAL(frameSwitched()), this,
SLOT(onNavFrameSwitched()));
ret = ret && connect(toggleAction, SIGNAL(triggered()), this,
SIGNAL(numericalColumnToggled()));
m_valueFldAction->setVisible(false);
m_keyframeNavigatorAction->setVisible(false);
assert(ret);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
FunctionToolbar::~FunctionToolbar() {
if (m_curve) {
m_curve->removeObserver(this);
m_curve->release();
}
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
bool FunctionToolbar::anyWidgetHasFocus() {
return hasFocus() || m_valueToolbar->hasFocus() ||
m_keyframeToolbar->hasFocus() || m_valueFld->hasFocus() ||
m_frameNavigator->anyWidgetHasFocus() ||
m_keyframeNavigator->hasFocus();
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::setCurve(TDoubleParam *curve) {
if (curve == m_curve) return;
bool curveDefined = curve != 0;
m_valueFldAction->setVisible(curveDefined);
m_keyframeNavigatorAction->setVisible(curveDefined);
m_keyframeNavigator->setCurve(curve);
if (curve) {
curve->addObserver(this);
curve->addRef();
}
if (m_curve) {
m_curve->removeObserver(this);
m_curve->release();
}
m_curve = curve;
if (m_curve) {
m_valueFld->setMeasure(m_curve->getMeasureName());
setFrame(m_frameNavigator->getFrame());
} else {
m_valueFld->setMeasure("");
m_valueFld->setValue(0);
}
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::setFrame(double frame) {
m_frameNavigator->setFrame(tround(frame), false);
if (m_curve)
m_valueFld->setValue(m_curve->getValue(frame));
else
m_valueFld->setValue(0);
2016-03-19 06:57:51 +13:00
}
2019-08-27 15:55:22 +12:00
void FunctionToolbar::onNextKeyframe(QWidget *panel) {
m_keyframeNavigator->onNextKeyframe(panel);
}
//-------------------------------------------------------------------
void FunctionToolbar::onPrevKeyframe(QWidget *panel) {
m_keyframeNavigator->onPrevKeyframe(panel);
}
2016-03-19 06:57:51 +13:00
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::onValueFieldChanged() {
if (!m_curve) return;
int frame = m_frameNavigator->getFrame();
double value = m_valueFld->getValue();
double fValue = m_curve->getValue(frame);
if (value == fValue) return;
KeyframeSetter::setValue(m_curve, frame, value);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::onFrameSwitched() { setFrame(m_frameHandle->getFrame()); }
2016-03-19 06:57:51 +13:00
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::onNavFrameSwitched() {
if (m_frameHandle) m_frameHandle->setFrame(m_frameNavigator->getFrame());
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::onSelectionChanged() {
if (m_selection) {
if (m_selection->getSelectedKeyframeCount() == 1) {
QPair<TDoubleParam *, int> k = m_selection->getSelectedKeyframe(0);
if (k.first == m_curve) {
int frame = m_curve->keyframeIndexToFrame(k.second);
setFrame(frame);
return;
}
} else if (m_selection->getSelectedKeyframeCount() > 1) {
setFrame(m_frameHandle->getFrame());
m_valueFld->setText("");
return;
}
}
if (m_frameHandle && m_curve)
setFrame(m_frameHandle->getFrame());
else
m_valueFld->setText("");
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::setFrameHandle(TFrameHandle *frameHandle) {
if (m_frameHandle) m_frameHandle->disconnect(this);
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
m_frameHandle = frameHandle;
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
if (m_frameHandle)
connect(m_frameHandle, SIGNAL(frameSwitched()), this,
SLOT(onFrameSwitched()));
2016-03-19 06:57:51 +13:00
2016-06-15 18:43:10 +12:00
m_keyframeNavigator->setFrameHandle(frameHandle);
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::setSelection(FunctionSelection *selection) {
if (m_selection != selection) {
if (m_selection)
disconnect(m_selection, SIGNAL(selectionChanged()), this,
SLOT(onSelectionChanged()));
m_selection = selection;
if (m_selection)
connect(m_selection, SIGNAL(selectionChanged()), this,
SLOT(onSelectionChanged()));
}
2016-03-19 06:57:51 +13:00
}
//-------------------------------------------------------------------
2016-06-15 18:43:10 +12:00
void FunctionToolbar::onChange(const TParamChange &) {
m_keyframeNavigator->update();
2016-03-19 06:57:51 +13:00
}