-// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
base->setMargin( frameWidth() );
base->setSpacing( 0 );
- QWidget* top = new QWidget( this );
- base->addWidget( top );
+ myTop = new QWidget( this );
+ base->addWidget( myTop );
- QHBoxLayout* tl = new QHBoxLayout( top );
+ QHBoxLayout* tl = new QHBoxLayout( myTop );
tl->setMargin( 0 );
- myBar = new QtxWorkstackTabBar( top );
+ myBar = new QtxWorkstackTabBar( myTop );
tl->addWidget( myBar, 1 );
- CloseButton* close = new CloseButton( top );
+ CloseButton* close = new CloseButton( myTop );
close->setIcon( style()->standardIcon( QStyle::SP_TitleBarCloseButton ) );
myClose = close;
tl->addWidget( myClose );
return true;
}
+/*!
+ \brief Show/Hide tab bar.
+*/
+void QtxWorkstackArea::showTabBar( bool visible)
+{
+ myTop->setVisible(visible);
+ myBar->setVisible(visible);
+}
+
+
/*!
\brief Get rectangle to be drawn when highlighting drop area.
\return area drop rectangle
{
case ActivateWidget:
myBar->updateActiveState();
+ // IMN 27/03/2015: This workaround caused by the bug INT PAL 0052623: OCC view blinking when
+ // using polyline sketcher which is reproduced on Unix systems with qt-4.8.4.
+ myStack->setUpdatesEnabled( false );
+ updateCurrent();
+ myStack->setUpdatesEnabled( true );
emit activated( activeWidget() );
break;
case FocusWidget:
*/
void QtxWorkstackArea::updateCurrent()
{
- QWidget* cur = child( widget( myBar->tabId( myBar->currentIndex() ) ) );
+ QWidget* cur = child( myBar->tabId( myBar->currentIndex() ) );
if ( cur )
myStack->setCurrentWidget( cur );
}
return myWin;
}
+/*!
+ \brief Set active widget
+ \param wid widget to activate
+*/
+void QtxWorkstack::setActiveWindow( QWidget* wid )
+{
+ if ( activeArea() )
+ activeArea()->setActiveWidget( wid );
+}
+
/*!
\brief Split workstack.
{
int res = 0;
if ( myActionsMap.contains( id ) )
- res = myActionsMap[id]->shortcut();
+ res = myActionsMap[id]->shortcut()[0];
return res;
}
for ( QWidgetList::iterator itr = moveList.begin(); itr != moveList.end(); ++itr )
{
(*itr)->setParent( pWid );
- (*itr)->setShown( map.contains( *itr ) ? map[*itr] : false );
+ (*itr)->setVisible( map.contains( *itr ) ? map[*itr] : false );
}
}
if ( lst.count() > 1 )
{
- if ( myActionsMap[SplitVertical]->isEnabled() )
- pm->addAction( myActionsMap[SplitVertical] );
- if ( myActionsMap[SplitHorizontal]->isEnabled() )
- pm->addAction( myActionsMap[SplitHorizontal] );
+ if ( !myActionsMap[SplitVertical]->isEnabled() )
+ myActionsMap[SplitVertical]->setEnabled(true);
+ pm->addAction( myActionsMap[SplitVertical] );
+ if ( !myActionsMap[SplitHorizontal]->isEnabled() )
+ myActionsMap[SplitHorizontal]->setEnabled(true);
+ pm->addAction( myActionsMap[SplitHorizontal] );
pm->addSeparator();
}
return mySplit->opaqueResize();
}
+/*!
+ \brief Show/hide splitter state and area.
+ \param wid widget (and parent area) will be shown/hidden
+ \param parent_list parent splitters list
+ \param split splitter will be shown/hidden
+ \param visible splitter
+*/
+void QtxWorkstack::splitterVisible(QWidget* wid, QList<QSplitter*>& parent_list, QSplitter* split, bool visible)
+{
+ QList<QSplitter*> recList;
+ splitters( split, recList, false );
+ for ( QList<QSplitter*>::iterator itr = recList.begin(); itr != recList.end(); ++itr ) {
+ parent_list.prepend( *itr );
+ splitterVisible( wid, parent_list, *itr, visible );
+ }
+
+ QList<QtxWorkstackArea*> areaList;
+ areas( split, areaList, false );
+ for ( QList<QtxWorkstackArea*>::const_iterator it = areaList.begin(); it != areaList.end(); ++it ) {
+ QtxWorkstackArea* area = *it;
+ bool isCurrentWidget = false;
+
+ area->showTabBar(visible);
+
+ // 1. Looking for the selected widget at the lowest level among all splitted areas.
+ QList<QtxWorkstackChild*> childList = area->childList();
+ for ( QList<QtxWorkstackChild*>::iterator itr = childList.begin(); itr != childList.end(); ++itr ) {
+ QWidget* aCurWid = (*itr)->widget();
+ if ( aCurWid == wid ) {
+ isCurrentWidget = true;
+ aCurWid->setVisible( true );
+ }
+ else
+ aCurWid->setVisible( visible );
+ }
+
+ // 2. Show/Hide other areas and widgets that don't contain the desired widget
+ if ( !isCurrentWidget || visible )
+ area->setVisible( visible );
+
+ if ( !isCurrentWidget && !visible )
+ continue;
+
+ // 3. Show/hide all parent widgets
+ QSplitter* pSplit = splitter( area );
+ int count = pSplit->count();
+ for ( int i = 0; i < count; i++ ) {
+ if ( pSplit->indexOf( area ) == i && !visible )
+ continue;
+ pSplit->widget(i)->setVisible( visible );
+ }
+
+ // 4. Show/hide all parent splitters don't contain the selected widget
+ if ( visible )
+ pSplit->setVisible( true );
+
+ if ( isCurrentWidget && !visible ) {
+ for ( QList<QSplitter*>::iterator itr = parent_list.begin(); itr != parent_list.end() && pSplit != mySplit; ++itr ) {
+ if ( pSplit == *itr )
+ continue;
+ QList<QSplitter*> splitList;
+ splitters( *itr, splitList, false );
+ for ( QList<QSplitter*>::iterator iter = splitList.begin(); iter != splitList.end(); ++iter ) {
+ if ( pSplit == (*iter) ) {
+ pSplit = *itr;
+ continue;
+ }
+ (*iter)->setVisible( false );
+ }
+ }
+ }
+ }
+}
+
+/*!
+ \brief Show/hide splitters state and area.
+ \param wid widget (and parent area) will be shown/hidden
+ \param visible splitters
+*/
+void QtxWorkstack::splittersVisible( QWidget* wid, bool visible )
+{
+ QList<QSplitter*> parent_list;
+ parent_list.append( mySplit );
+ splitterVisible( wid, parent_list, mySplit, visible );
+}
/*!
\fn void QtxWorkstack::windowActivated( QWidget* w )
\param wid_to widget specified the destination area
\param before specifies whether the first widget has to be moved before or after
the second widget
- \return TRUE if operation is completed successfully, FALSE otherwise
+ \return \c true if operation is completed successfully, \c false otherwise
*/
bool QtxWorkstack::move( QWidget* wid, QWidget* wid_to, const bool before )
{
idx++;
area_src->removeWidget( wid, true );
area_to->insertWidget( wid, idx );
+ wid->showMaximized();
return true;
}
}
/*!
\brief Group all windows in one area
- \return TRUE if operation is completed successfully, FALSE otherwise
+ \return \c true if operation is completed successfully, \c false otherwise
*/
void QtxWorkstack::stack()
{