tdf#114260: Add gear button to Customize dialog
* Allow renaming custom toolbars, custom menus, and standard sub-menus.
* Move plus and minus buttons into the gear button
Change-Id: Id856da2498412b52e44b5623c4a5b9a3ed439fe3
Reviewed-on: https://gerrit.libreoffice.org/50553
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Muhammet Kara <muhammet.kara@pardus.org.tr>
Tested-by: Muhammet Kara <muhammet.kara@pardus.org.tr>
Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
diff --git a/cui/source/customize/SvxMenuConfigPage.cxx b/cui/source/customize/SvxMenuConfigPage.cxx
index 882c578..1737744 100644
--- a/cui/source/customize/SvxMenuConfigPage.cxx
+++ b/cui/source/customize/SvxMenuConfigPage.cxx
@@ -117,10 +117,8 @@ SvxMenuConfigPage::SvxMenuConfigPage(vcl::Window *pParent, const SfxItemSet& rSe
m_pContentsListBox->SetSelectHdl(
LINK( this, SvxMenuConfigPage, SelectMenuEntry ) );
m_pPlusBtn->SetClickHdl(
LINK( this, SvxMenuConfigPage, AddMenuHdl ) );
m_pMinusBtn->SetClickHdl(
LINK( this, SvxMenuConfigPage, RemoveMenuHdl ) );
m_pGearBtn->SetSelectHdl(
LINK( this, SvxMenuConfigPage, GearHdl ) );
m_pCommandCategoryListBox->SetSelectHdl(
LINK( this, SvxMenuConfigPage, SelectCategory ) );
@@ -147,18 +145,9 @@ SvxMenuConfigPage::SvxMenuConfigPage(vcl::Window *pParent, const SfxItemSet& rSe
if ( !bIsMenuBar )
{
// Context menus cannot be added/removed
// These height requests are needed to keep the height of
// the top level list boxes consistent for all tabs
m_pTopLevelListBox->set_height_request(
m_pPlusBtn->GetOptimalSize().Height() );
m_pCommandCategoryListBox->set_height_request(
m_pPlusBtn->GetOptimalSize().Height() );
m_pPlusBtn->Disable();
m_pMinusBtn->Disable();
m_pPlusBtn->Hide();
m_pMinusBtn->Hide();
//TODO: Remove this when the gear button is implemented for context menus
m_pGearBtn->Disable();
m_pGearBtn->Hide();
}
else
{
@@ -225,6 +214,16 @@ void SvxMenuConfigPage::UpdateButtonStates()
m_pRemoveCommandButton->Enable( bIsValidSelection );
m_pModifyBtn->Enable( bIsValidSelection && !bIsSeparator);
//Handle the gear button
if (m_bIsMenuBar)
{
SvxConfigEntry* pMenuData = GetTopLevelSelection();
PopupMenu* pGearPopup = m_pGearBtn->GetPopupMenu();
// Add option (gear_add) will always be enabled
pGearPopup->EnableItem( "gear_delete", pMenuData->IsDeletable() );
pGearPopup->EnableItem( "gear_rename", pMenuData->IsRenamable() );
}
}
void SvxMenuConfigPage::DeleteSelectedTopLevel()
@@ -298,9 +297,6 @@ IMPL_LINK_NOARG( SvxMenuConfigPage, SelectMenu, ListBox&, void )
if ( pMenuData )
{
// Built-in menus cannot be deleted
m_pMinusBtn->Enable( pMenuData->IsDeletable() );
SvxEntries* pEntries = pMenuData->GetEntries();
for (auto const& entry : *pEntries)
@@ -312,22 +308,59 @@ IMPL_LINK_NOARG( SvxMenuConfigPage, SelectMenu, ListBox&, void )
UpdateButtonStates();
}
IMPL_LINK_NOARG( SvxMenuConfigPage, AddMenuHdl, Button *, void )
IMPL_LINK( SvxMenuConfigPage, GearHdl, MenuButton *, pButton, void )
{
VclPtrInstance<SvxMainMenuOrganizerDialog> pDialog(
nullptr, GetSaveInData()->GetEntries(), nullptr, true );
OString sIdent = pButton->GetCurItemIdent();
if ( pDialog->Execute() == RET_OK )
if (sIdent == "gear_add")
{
GetSaveInData()->SetEntries( pDialog->GetEntries() );
ReloadTopLevelListBox( pDialog->GetSelectedEntry() );
GetSaveInData()->SetModified();
}
}
VclPtrInstance<SvxMainMenuOrganizerDialog> pDialog(
nullptr, GetSaveInData()->GetEntries(), nullptr, true );
IMPL_LINK_NOARG( SvxMenuConfigPage, RemoveMenuHdl, Button *, void )
{
DeleteSelectedTopLevel();
if ( pDialog->Execute() == RET_OK )
{
GetSaveInData()->SetEntries( pDialog->GetEntries() );
ReloadTopLevelListBox( pDialog->GetSelectedEntry() );
GetSaveInData()->SetModified();
}
}
else if (sIdent == "gear_delete")
{
DeleteSelectedTopLevel();
}
else if (sIdent == "gear_rename")
{
SvxConfigEntry* pMenuData = GetTopLevelSelection();
OUString sCurrentName( SvxConfigPageHelper::stripHotKey( pMenuData->GetName() ) );
OUString sDesc = CuiResId( RID_SVXSTR_LABEL_NEW_NAME );
SvxNameDialog aNameDialog( GetFrameWeld(), sCurrentName, sDesc );
aNameDialog.set_help_id( HID_SVX_CONFIG_RENAME_MENU );
aNameDialog.set_title( CuiResId( RID_SVXSTR_RENAME_MENU ) );
if ( aNameDialog.run() == RET_OK )
{
OUString sNewName = aNameDialog.GetName();
if ( sCurrentName == sNewName )
return;
pMenuData->SetName( sNewName );
ReloadTopLevelListBox();
GetSaveInData()->SetModified();
}
}
else
{
//This block should never be reached
SAL_WARN("cui.customize", "Unknown gear menu option: " << sIdent);
return;
}
UpdateButtonStates();
}
IMPL_LINK_NOARG( SvxMenuConfigPage, SelectCategory, ListBox&, void )
diff --git a/cui/source/customize/SvxToolbarConfigPage.cxx b/cui/source/customize/SvxToolbarConfigPage.cxx
index f8a530c..5354265 100644
--- a/cui/source/customize/SvxToolbarConfigPage.cxx
+++ b/cui/source/customize/SvxToolbarConfigPage.cxx
@@ -126,10 +126,8 @@ SvxToolbarConfigPage::SvxToolbarConfigPage(vcl::Window *pParent, const SfxItemSe
m_pCommandCategoryListBox->SetSelectHdl(
LINK( this, SvxToolbarConfigPage, SelectCategory ) );
m_pPlusBtn->SetClickHdl(
LINK( this, SvxToolbarConfigPage, AddToolbarHdl ) );
m_pMinusBtn->SetClickHdl(
LINK( this, SvxToolbarConfigPage, RemoveToolbarHdl ) );
m_pGearBtn->SetSelectHdl(
LINK( this, SvxToolbarConfigPage, GearHdl ) );
m_pMoveUpButton->SetClickHdl ( LINK( this, SvxToolbarConfigPage, MoveHdl) );
m_pMoveDownButton->SetClickHdl ( LINK( this, SvxToolbarConfigPage, MoveHdl) );
@@ -334,77 +332,119 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, SelectToolbarEntry, SvTreeListBox *, void
UpdateButtonStates();
}
IMPL_LINK_NOARG( SvxToolbarConfigPage, AddToolbarHdl, Button *, void )
IMPL_LINK( SvxToolbarConfigPage, GearHdl, MenuButton *, pButton, void )
{
OUString prefix = CuiResId( RID_SVXSTR_NEW_TOOLBAR );
OString sIdent = pButton->GetCurItemIdent();
OUString aNewName =
SvxConfigPageHelper::generateCustomName( prefix, GetSaveInData()->GetEntries() );
OUString aNewURL =
SvxConfigPageHelper::generateCustomURL( GetSaveInData()->GetEntries() );
VclPtrInstance< SvxNewToolbarDialog > pNameDialog( nullptr, aNewName );
// Reflect the actual m_pSaveInListBox into the new toolbar dialog
for ( sal_Int32 i = 0; i < m_pSaveInListBox->GetEntryCount(); ++i )
if (sIdent == "gear_add")
{
SaveInData* pData =
static_cast<SaveInData*>(m_pSaveInListBox->GetEntryData( i ));
OUString prefix = CuiResId( RID_SVXSTR_NEW_TOOLBAR );
const sal_Int32 nInsertPos =
pNameDialog->m_pSaveInListBox->InsertEntry( m_pSaveInListBox->GetEntry( i ) );
OUString aNewName =
SvxConfigPageHelper::generateCustomName( prefix, GetSaveInData()->GetEntries() );
pNameDialog->m_pSaveInListBox->SetEntryData( nInsertPos, pData );
}
OUString aNewURL =
SvxConfigPageHelper::generateCustomURL( GetSaveInData()->GetEntries() );
pNameDialog->m_pSaveInListBox->SelectEntryPos(
m_pSaveInListBox->GetSelectedEntryPos() );
VclPtrInstance< SvxNewToolbarDialog > pNameDialog( nullptr, aNewName );
if ( pNameDialog->Execute() == RET_OK )
{
aNewName = pNameDialog->GetName();
// Where to save the new toolbar? (i.e. Modulewise or documentwise)
sal_Int32 nInsertPos = pNameDialog->m_pSaveInListBox->GetSelectedEntryPos();
ToolbarSaveInData* pData =
static_cast<ToolbarSaveInData*>(
pNameDialog->m_pSaveInListBox->GetEntryData( nInsertPos ) );
if ( GetSaveInData() != pData )
// Reflect the actual m_pSaveInListBox into the new toolbar dialog
for ( sal_Int32 i = 0; i < m_pSaveInListBox->GetEntryCount(); ++i )
{
m_pSaveInListBox->SelectEntryPos( nInsertPos );
m_pSaveInListBox->GetSelectHdl().Call(*m_pSaveInListBox);
SaveInData* pData =
static_cast<SaveInData*>(m_pSaveInListBox->GetEntryData( i ));
const sal_Int32 nInsertPos =
pNameDialog->m_pSaveInListBox->InsertEntry( m_pSaveInListBox->GetEntry( i ) );
pNameDialog->m_pSaveInListBox->SetEntryData( nInsertPos, pData );
}
SvxConfigEntry* pToolbar =
new SvxConfigEntry( aNewName, aNewURL, true, /*bParentData*/false );
pNameDialog->m_pSaveInListBox->SelectEntryPos(
m_pSaveInListBox->GetSelectedEntryPos() );
pToolbar->SetUserDefined();
pToolbar->SetMain();
if ( pNameDialog->Execute() == RET_OK )
{
aNewName = pNameDialog->GetName();
pData->CreateToolbar( pToolbar );
// Where to save the new toolbar? (i.e. Modulewise or documentwise)
sal_Int32 nInsertPos = pNameDialog->m_pSaveInListBox->GetSelectedEntryPos();
nInsertPos = m_pTopLevelListBox->InsertEntry( pToolbar->GetName() );
m_pTopLevelListBox->SetEntryData( nInsertPos, pToolbar );
m_pTopLevelListBox->SelectEntryPos( nInsertPos );
m_pTopLevelListBox->GetSelectHdl().Call(*m_pTopLevelListBox);
ToolbarSaveInData* pData =
static_cast<ToolbarSaveInData*>(
pNameDialog->m_pSaveInListBox->GetEntryData( nInsertPos ) );
pData->SetModified();
if ( GetSaveInData() != pData )
{
m_pSaveInListBox->SelectEntryPos( nInsertPos );
m_pSaveInListBox->GetSelectHdl().Call(*m_pSaveInListBox);
}
SvxConfigEntry* pToolbar =
new SvxConfigEntry( aNewName, aNewURL, true, false );
pToolbar->SetUserDefined();
pToolbar->SetMain();
pData->CreateToolbar( pToolbar );
nInsertPos = m_pTopLevelListBox->InsertEntry( pToolbar->GetName() );
m_pTopLevelListBox->SetEntryData( nInsertPos, pToolbar );
m_pTopLevelListBox->SelectEntryPos( nInsertPos );
m_pTopLevelListBox->GetSelectHdl().Call(*m_pTopLevelListBox);
pData->SetModified();
}
}
}
IMPL_LINK_NOARG( SvxToolbarConfigPage, RemoveToolbarHdl, Button *, void )
{
SvxConfigEntry* pToolbar = GetTopLevelSelection();
if ( pToolbar && pToolbar->IsDeletable() )
else if (sIdent == "gear_delete")
{
DeleteSelectedTopLevel();
UpdateButtonStates();
}
SvxConfigEntry* pToolbar = GetTopLevelSelection();
if ( pToolbar && pToolbar->IsDeletable() )
{
DeleteSelectedTopLevel();
UpdateButtonStates();
}
}
else if (sIdent == "gear_rename")
{
sal_Int32 nSelectionPos = m_pTopLevelListBox->GetSelectedEntryPos();
SvxConfigEntry* pToolbar =
static_cast<SvxConfigEntry*>(m_pTopLevelListBox->GetEntryData( nSelectionPos ));
ToolbarSaveInData* pSaveInData = static_cast<ToolbarSaveInData*>( GetSaveInData() );
//Rename the toolbar
OUString sCurrentName( SvxConfigPageHelper::stripHotKey( pToolbar->GetName() ) );
OUString sDesc = CuiResId( RID_SVXSTR_LABEL_NEW_NAME );
SvxNameDialog aNameDialog( GetFrameWeld(), sCurrentName, sDesc );
aNameDialog.set_help_id( HID_SVX_CONFIG_RENAME_TOOLBAR );
aNameDialog.set_title( CuiResId( RID_SVXSTR_RENAME_TOOLBAR ) );
if ( aNameDialog.run() == RET_OK )
{
OUString sNewName = aNameDialog.GetName();
if (sCurrentName == sNewName)
return;
pToolbar->SetName( sNewName );
pSaveInData->ApplyToolbar( pToolbar );
// have to use remove and insert to change the name
m_pTopLevelListBox->RemoveEntry( nSelectionPos );
nSelectionPos =
m_pTopLevelListBox->InsertEntry( sNewName, nSelectionPos );
m_pTopLevelListBox->SetEntryData( nSelectionPos, pToolbar );
m_pTopLevelListBox->SelectEntryPos( nSelectionPos );
}
}
else
{
//This block should never be reached
SAL_WARN("cui.customize", "Unknown gear menu option: " << sIdent);
return;
}
}
IMPL_LINK_NOARG( SvxToolbarConfigPage, SelectCategory, ListBox&, void )
@@ -697,6 +737,7 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, ResetToolbarHdl, Button *, void )
void SvxToolbarConfigPage::UpdateButtonStates()
{
SvxConfigEntry* pToolbar = GetTopLevelSelection();
SvTreeListEntry* selection = m_pContentsListBox->GetCurEntry();
bool bIsSeparator =
@@ -710,6 +751,12 @@ void SvxToolbarConfigPage::UpdateButtonStates()
m_pRemoveCommandButton->Enable( bIsValidSelection );
m_pModifyBtn->Enable( bIsValidSelection && !bIsSeparator );
// Handle the gear button
PopupMenu* pPopup = m_pGearBtn->GetPopupMenu();
// "gear_add" option is always enabled
pPopup->EnableItem( "gear_delete", pToolbar && pToolbar->IsDeletable() );
pPopup->EnableItem( "gear_rename", pToolbar && pToolbar->IsRenamable() );
}
short SvxToolbarConfigPage::QueryReset()
@@ -735,8 +782,6 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, SelectToolbar, ListBox&, void )
if ( pToolbar == nullptr )
{
//TODO: Disable related buttons
m_pPlusBtn->Enable( false );
m_pMinusBtn->Enable( false );
m_pInsertBtn->Enable( false );
m_pResetBtn->Enable( false );
@@ -744,8 +789,6 @@ IMPL_LINK_NOARG( SvxToolbarConfigPage, SelectToolbar, ListBox&, void )
}
else
{
m_pPlusBtn->Enable();
m_pMinusBtn->Enable( pToolbar->IsDeletable() );
m_pInsertBtn->Enable();
m_pResetBtn->Enable();
}
diff --git a/cui/source/customize/cfg.cxx b/cui/source/customize/cfg.cxx
index b7aa0a2..8ee0080 100644
--- a/cui/source/customize/cfg.cxx
+++ b/cui/source/customize/cfg.cxx
@@ -1141,8 +1141,7 @@ SvxConfigPage::SvxConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
get(m_pRemoveCommandButton, "remove");
get(m_pTopLevelListBox, "toplevellist");
get(m_pPlusBtn, "plusbtn");
get(m_pMinusBtn, "minusbtn");
get(m_pGearBtn, "gearbtn");
get(m_pMoveUpButton, "up");
get(m_pMoveDownButton, "down");
get(m_pSaveInListBox, "savein");
@@ -1180,6 +1179,7 @@ SvxConfigPage::SvxConfigPage(vcl::Window *pParent, const SfxItemSet& rSet)
m_pFunctions->SetDoubleClickHdl( LINK( this, SvxConfigPage, FunctionDoubleClickHdl ) );
m_pFunctions->SetSelectHdl(
LINK( this, SvxConfigPage, SelectFunctionHdl ) );
m_pGearBtn->SetDropDown(PushButtonDropdownStyle::NONE);
}
SvxConfigPage::~SvxConfigPage()
@@ -1190,8 +1190,7 @@ SvxConfigPage::~SvxConfigPage()
void SvxConfigPage::dispose()
{
m_pTopLevelListBox.clear();
m_pPlusBtn.clear();
m_pMinusBtn.clear();
m_pGearBtn.clear();
m_pSearchEdit.clear();
m_pCommandCategoryListBox.clear();
m_pEntries.clear();
@@ -2106,6 +2105,11 @@ bool SvxConfigEntry::IsDeletable()
return !IsMain() || IsUserDefined();
}
bool SvxConfigEntry::IsRenamable()
{
return !IsMain() || IsUserDefined();
}
ToolbarSaveInData::ToolbarSaveInData(
const uno::Reference < css::ui::XUIConfigurationManager >& xCfgMgr,
const uno::Reference < css::ui::XUIConfigurationManager >& xParentCfgMgr,
diff --git a/cui/source/inc/SvxMenuConfigPage.hxx b/cui/source/inc/SvxMenuConfigPage.hxx
index 7f5eb33..f944ce3 100644
--- a/cui/source/inc/SvxMenuConfigPage.hxx
+++ b/cui/source/inc/SvxMenuConfigPage.hxx
@@ -53,8 +53,7 @@ private:
DECL_LINK( SelectMenu, ListBox&, void );
DECL_LINK( SelectMenuEntry, SvTreeListBox *, void );
DECL_LINK( AddMenuHdl, Button *, void );
DECL_LINK( RemoveMenuHdl, Button *, void );
DECL_LINK( GearHdl, MenuButton *, void );
DECL_LINK( SelectCategory, ListBox&, void );
diff --git a/cui/source/inc/SvxToolbarConfigPage.hxx b/cui/source/inc/SvxToolbarConfigPage.hxx
index d854f45..2129db9 100644
--- a/cui/source/inc/SvxToolbarConfigPage.hxx
+++ b/cui/source/inc/SvxToolbarConfigPage.hxx
@@ -54,8 +54,7 @@ private:
DECL_LINK( SelectToolbarEntry, SvTreeListBox*, void );
DECL_LINK( MoveHdl, Button *, void );
DECL_LINK( AddToolbarHdl, Button *, void );
DECL_LINK( RemoveToolbarHdl, Button *, void );
DECL_LINK( GearHdl, MenuButton *, void );
DECL_LINK( SelectCategory, ListBox&, void );
diff --git a/cui/source/inc/cfg.hxx b/cui/source/inc/cfg.hxx
index 52bb3fa..c1c85c8 100644
--- a/cui/source/inc/cfg.hxx
+++ b/cui/source/inc/cfg.hxx
@@ -320,6 +320,7 @@ public:
bool IsModified() { return bIsModified; }
bool IsDeletable();
bool IsRenamable();
void SetVisible( bool b ) { bIsVisible = b; }
bool IsVisible() const { return bIsVisible; }
@@ -390,8 +391,7 @@ protected:
// menu or toolbar are displayed
VclPtr<ListBox> m_pTopLevelListBox;
// Used to add and remove toolbars/menus
VclPtr<PushButton> m_pPlusBtn;
VclPtr<PushButton> m_pMinusBtn;
VclPtr<MenuButton> m_pGearBtn;
VclPtr<VclContainer> m_pEntries;
VclPtr<SvTreeListBox> m_pContentsListBox;
diff --git a/cui/uiconfig/ui/menuassignpage.ui b/cui/uiconfig/ui/menuassignpage.ui
index e435280..bd77bf0 100644
--- a/cui/uiconfig/ui/menuassignpage.ui
+++ b/cui/uiconfig/ui/menuassignpage.ui
@@ -3,6 +3,34 @@
<interface domain="cui">
<requires lib="gtk+" version="3.18"/>
<requires lib="LibreOffice" version="1.0"/>
<object class="GtkMenu" id="gearmenu">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkMenuItem" id="gear_add">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="menuassignpage|gear_add">_Add...</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="gear_delete">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="menuassignpage|gear_delete">_Delete</property>
<property name="use_underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem" id="gear_rename">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes" context="menuassignpage|gear_rename">_Rename...</property>
<property name="use_underline">True</property>
</object>
</child>
</object>
<object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -23,15 +51,10 @@
<property name="can_focus">False</property>
<property name="stock">gtk-go-back</property>
</object>
<object class="GtkImage" id="image5">
<object class="GtkImage" id="image7">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">svtools/res/list_add.png</property>
</object>
<object class="GtkImage" id="image6">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">extensions/res/buttonminus.png</property>
<property name="pixbuf">sfx2/res/actionaction013.png</property>
</object>
<object class="GtkBox" id="MenuAssignPage">
<property name="visible">True</property>
@@ -220,32 +243,23 @@
</packing>
</child>
<child>
<object class="GtkButton" id="plusbtn">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">end</property>
<property name="margin_left">5</property>
<property name="image">image5</property>
<property name="always_show_image">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="minusbtn">
<object class="GtkButton" id="gearbtn:gearmenu">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="halign">end</property>
<property name="margin_left">1</property>
<property name="image">image6</property>
<property name="image">image7</property>
<property name="always_show_image">True</property>
<child internal-child="accessible">
<object class="AtkObject" id="gearbtn:gearmenu-atkobject">
<property name="AtkObject::accessible-name" translatable="yes" context="menuassignpage|gearbtn">Gear Menu</property>
<property name="AtkObject::accessible-description" translatable="yes" context="menuassignpage|gearbtn">Contains commands to modify or delete the selected toolbar or the top level menu, and the command to add new toolbars or top level menus.</property>
</object>
</child>
</object>
<packing>
<property name="left_attach">2</property>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
</packing>
</child>
@@ -595,8 +609,7 @@
<widgets>
<widget name="commandcategorylist"/>
<widget name="toplevellist"/>
<widget name="plusbtn"/>
<widget name="minusbtn"/>
<widget name="gearbtn:gearmenu"/>
<widget name="searchEntry"/>
<widget name="savein"/>
<widget name="functionbtn"/>