]> SALOME platform Git repositories - modules/gui.git/blob - src/STD/STD_TabDesktop.cxx
Salome HOME
Improvement(Add keyboard shortcuts to make ?Split vertical / Split horizontal / Close...
[modules/gui.git] / src / STD / STD_TabDesktop.cxx
1 #include "STD_TabDesktop.h"
2
3 #include <SUIT_Session.h>
4 #include <SUIT_ViewWindow.h>
5 #include <SUIT_ResourceMgr.h>
6
7 #include <QtxAction.h>
8 #include <QtxWorkstack.h>
9 #include <QtxActionMenuMgr.h>
10 #include <QtxWorkstackAction.h>
11
12 #include <qvbox.h>
13 #include <qmenubar.h>
14 #include <qworkspace.h>
15 #include <qobjectlist.h>
16
17 #include <stdarg.h>
18
19 STD_TabDesktop::STD_TabDesktop()
20 : SUIT_Desktop(),
21 myWorkstack( 0 ),
22 myWorkstackAction( 0 )
23 {
24   QVBox* base = new QVBox( this );
25   base->setFrameStyle( QFrame::Panel | QFrame::Sunken );
26
27   setCentralWidget( base );
28
29   myWorkstack = new QtxWorkstack( base );
30
31   myWorkstack->setAccel(QtxWorkstack::SplitVertical,   SHIFT + Key_V);
32   myWorkstack->setAccel(QtxWorkstack::SplitHorizontal, SHIFT + Key_H);
33   myWorkstack->setAccel(QtxWorkstack::Close,           SHIFT + Key_C);
34
35   connect( myWorkstack, SIGNAL( windowActivated( QWidget* ) ),
36            this, SLOT( onWindowActivated( QWidget* ) ) );
37
38   createActions();
39 }
40
41 STD_TabDesktop::~STD_TabDesktop()
42 {
43 }
44
45 SUIT_ViewWindow* STD_TabDesktop::activeWindow() const
46 {
47   SUIT_ViewWindow* wnd = 0;
48
49   QWidget* wid = myWorkstack->activeWindow();
50   if ( wid && wid->inherits( "SUIT_ViewWindow" ) )
51     wnd = (SUIT_ViewWindow*)wid;
52
53   return wnd;
54 }
55
56 QPtrList<SUIT_ViewWindow> STD_TabDesktop::windows() const
57 {
58   QPtrList<SUIT_ViewWindow> winList;
59
60   QWidgetList children = myWorkstack->windowList();
61   for ( QWidgetListIt it( children ); it.current(); ++it )
62   {
63     if ( it.current()->inherits( "SUIT_ViewWindow" ) )
64       winList.append( (SUIT_ViewWindow*)it.current() );
65   }
66
67   return winList;
68 }
69
70 QWidget* STD_TabDesktop::parentArea() const
71 {
72   return workstack();
73 }
74
75 void STD_TabDesktop::windowOperation( const int type )
76 {
77   myWorkstackAction->perform( operationFlag( type ) );
78 }
79
80 void STD_TabDesktop::setWindowOperations( const int first, ... )
81 {
82   va_list ints;
83         va_start( ints, first );
84
85         QValueList<int> typeList;
86
87         int cur = first;
88         while ( cur )
89         {
90           typeList.append( cur );
91                 cur = va_arg( ints, int );
92   }
93
94         setWindowOperations( typeList );
95 }
96
97 void STD_TabDesktop::setWindowOperations( const QValueList<int>& opList )
98 {
99   int flags = 0;
100
101   for ( QValueList<int>::const_iterator it = opList.begin(); it != opList.end(); ++it )
102     flags = flags | operationFlag( *it );
103
104   myWorkstackAction->setItems( flags );
105 }
106
107 QtxWorkstack* STD_TabDesktop::workstack() const
108 {
109   return myWorkstack;
110 }
111
112 void STD_TabDesktop::onWindowActivated( QWidget* w )
113 {
114   if ( w && w->inherits( "SUIT_ViewWindow" ) )
115     emit windowActivated( (SUIT_ViewWindow*)w );
116 }
117
118 void STD_TabDesktop::createActions()
119 {
120   if ( myWorkstackAction )
121     return;
122
123   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
124   if ( !resMgr )
125     return;
126
127   myWorkstackAction = new QtxWorkstackAction( workstack(), this );
128
129   myWorkstackAction->setItems( QtxWorkstackAction::Split | QtxWorkstackAction::Windows );
130
131   // Split Horizontal
132   myWorkstackAction->setIconSet( QtxWorkstackAction::HSplit,
133                                  resMgr->loadPixmap( "STD", tr( "ICON_DESK_WINDOW_HSPLIT" ) ) );
134   myWorkstackAction->setMenuText( QtxWorkstackAction::HSplit, tr( "MEN_DESK_WINDOW_HSPLIT" ) );
135   myWorkstackAction->setStatusTip( QtxWorkstackAction::HSplit, tr( "PRP_DESK_WINDOW_HSPLIT" ) );
136
137   // Split Vertical
138   myWorkstackAction->setIconSet( QtxWorkstackAction::VSplit,
139                                  resMgr->loadPixmap( "STD", tr( "ICON_DESK_WINDOW_VSPLIT" ) ) );
140   myWorkstackAction->setMenuText( QtxWorkstackAction::VSplit, tr( "MEN_DESK_WINDOW_VSPLIT" ) );
141   myWorkstackAction->setStatusTip( QtxWorkstackAction::VSplit, tr( "PRP_DESK_WINDOW_VSPLIT" ) );
142
143   QtxActionMenuMgr* mMgr = menuMgr();
144   if ( !mMgr )
145     return;
146
147   int winMenuId = mMgr->insert( tr( "MEN_DESK_WINDOW" ), -1, 100 );
148   mMgr->insert( myWorkstackAction, winMenuId, -1 );
149   mMgr->insert( QtxActionMenuMgr::separator(), winMenuId, -1 );
150 }
151
152 int STD_TabDesktop::operationFlag( const int type ) const
153 {
154   int res = 0;
155   switch ( type )
156   {
157   case VSplit:
158     res = QtxWorkstackAction::VSplit;
159     break;
160   case HSplit:
161     res = QtxWorkstackAction::HSplit;
162     break;
163   }
164   return res;
165 }