Create personal favorites panel

Is there anything in the pipeline to let a user colocate all their favorites tools on one panel?

If it’s Pyrevit tools that you are talking about, you can strip, mix patch, do whatever you like with the toolbar, even host under another tab name.

I assume what you’re asking is a per user ‘favourites’ bar that they can store common-used tools? It would be possible - I personally don’t see a huge benefit - however the way I would tackle it working would be to store the info about the saved favorites in some sort of config file (format of your choice), read it in the app-init hook, and ‘clone’ the buttons from their original location using adwindows to your ‘favorites’ panel. a quick and dirty example below. it gets more complicated if the buttons are nested within dropdowns etc. but it should give you a starting point. Using app-init would require a restart of revit/pyrevit for the favorites to repopulate also I would suggest limiting the max number of favorites that can be added to the bar.

from pyrevit.api import AdWindows as adWin
ribbon = adWin.ComponentManager.Ribbon

def ribbon_button_clone_to_panel(ribbon,sourceTabName,sourcePanelName,sourceButtonName,targetTabName,targetPanelName,newButtonName=None,HideOriginal=False):
	sourceTab = next((x for x in ribbon.Tabs if sourceTabName in x.Title))
	for x in sourceTab.Panels:
		#print (x.Source.Name)
		if sourcePanelName == x.Source.Name:
			sourcePanel=x
			break

	sourceButton = next((x for x in sourcePanel.Source.Items if getattr(x, 'Text', None) == sourceButtonName))

	targetTab = next((x for x in ribbon.Tabs if targetTabName in x.Title)) # Revit sometimes hides other tabs with the same name and x.IsVisible
	#print (targetTab)
	for y in targetTab.Panels:
		#print (y.Source.Id)
		if targetPanelName == y.Source.Id:
			newPanel=y
			break
			
	newPanel.Source.Items.Add(sourceButton.Clone()) # .Clone() is useful if you want to change the text on just this new button
	newPanel.IsEnabled = True
	newPanel.IsVisible = True

	newButton = [x for x in newPanel.Source.Items][-1] # last one in Items should be the newly created button
	if newButtonName:newButton.Text = newButtonName
	else: newButton.Text=sourceButton.Text
	newButton.IsEnabled = True
	newButton.IsVisible = True

	if HideOriginal:
		sourceButton.IsEnabled = False
		sourceButton.IsVisible = False