Files
blender-portable-repo/scripts/addons/RetopoFlow/retopoflow/rf/rf_tools.py
T
2026-03-17 14:30:01 -06:00

97 lines
3.7 KiB
Python

'''
Copyright (C) 2023 CG Cookie
http://cgcookie.com
hello@cgcookie.com
Created by Jonathan Denning, Jonathan Williamson, and Patrick Moore
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/>.
'''
# the order of these tools dictates the order tools show in UI
from ..rftool_select.select import Select
from ..rftool_contours.contours import Contours
from ..rftool_polystrips.polystrips import PolyStrips
from ..rftool_strokes.strokes import Strokes
from ..rftool_patches.patches import Patches
from ..rftool_polypen.polypen import PolyPen
from ..rftool_knife.knife import Knife
from ..rftool_loops.loops import Loops
from ..rftool_tweak.tweak import Tweak
from ..rftool_relax.relax import Relax
from ..rftool import RFTool
from ...config.options import options
class RetopoFlow_Tools:
def setup_rftools(self):
self.rftool = None
self.rftools = [rftool(self) for rftool in RFTool.registry]
self._rftool_return = None
def reset_rftool(self):
self.rftool._reset()
def _select_rftool(self, rftool, *, reset=True, quick=False):
assert rftool in self.rftools
# return if tool already set
if rftool == self.rftool:
if reset: self.reset_rftool()
return False
self.rftool = rftool
if reset:
self.reset_rftool()
self._update_rftool_ui()
self.update_ui()
if quick:
self.rftool._callback('quickswitch start')
return True
def _update_rftool_ui(self):
rftool = self.rftool
self.ui_main.getElementById(f'tool-{rftool.name.lower()}').checked = True
self.ui_tiny.getElementById(f'ttool-{rftool.name.lower()}').checked = True
self.ui_main.dirty(cause='changed tools', children=True)
self.ui_tiny.dirty(cause='changed tools', children=True)
statusbar_keymap = self.substitute_keymaps(rftool.statusbar, wrap='', pre='', post=':', separator='/', onlyfirst=2)
statusbar_keymap = statusbar_keymap.replace('\t', ' ')
if self._rftool_return and self._rftool_return != rftool:
statusbar = f'{self._rftool_return.name}{rftool.name}: {statusbar_keymap}'
else:
statusbar = f'{rftool.name}: {statusbar_keymap}'
self.context.workspace.status_text_set(statusbar)
def select_rftool(self, rftool, *, reset=True):
self.rftool_return = None
if self._select_rftool(rftool, reset=reset):
# remember this tool as last used, so clicking diamond can start with this tool
options['starting tool'] = rftool.name
def quick_select_rftool(self, rftool, *, reset=True):
prev_tool = self.rftool
if self._select_rftool(rftool, reset=reset, quick=True):
self._rftool_return = prev_tool
self._update_rftool_ui()
def quick_restore_rftool(self, *, reset=True):
if not self._rftool_return: return
if self.select_rftool(self._rftool_return, reset=reset):
self._rftool_return = None
self._update_rftool_ui()