3 // Author: Frantisek Vacek <fanda.vacek@volny.cz>, (C) 2006
5 // Copyright: See COPYING file that comes with this distribution
8 #include "qfdialogwidgetstack.h"
10 #include <qfdialogwidget.h>
11 #include <qftoolbar.h>
13 #include <QVBoxLayout>
15 #include <QPushButton>
17 #include <qflogcust.h>
19 QFDialogWidgetStack::QFDialogWidgetStack(QWidget
*parent
)
20 : QStackedWidget(parent
)
24 QFDialogWidgetStack::~QFDialogWidgetStack()
28 void QFDialogWidgetStack::pushDialogWidget(QFDialogWidget
*dw
)//, bool connect_want_close)
30 qfLogFuncFrame();// << "caption:" << caption << "icon serial:" << icon.serialNumber();
32 QWidget
*w
= new QWidget();
33 QBoxLayout
*ly
= new QVBoxLayout(w
);
37 QFDialogWidgetCaptionFrame
*cf
= dw
->captionFrame();
43 if(dw->hasCaption()) {
45 QWidget *w = dw->createCaption();
46 if(w) ly->addWidget(w);
50 QMenuBar
*mb
= new QMenuBar(NULL
);
51 dw
->updateMenuOrBar(mb
);
52 if(mb
->actions().isEmpty()) { delete mb
; }
53 else { ly
->addWidget(mb
); }
56 QFPart::ToolBarList tool_bars
= dw
->createToolBars();
57 int toolbars_cnt
= tool_bars
.count() + ((dw
->hasMenuOnToolBar())? 1: 0);
58 qfTrash() << "\ttoolbars cnt:" << toolbars_cnt
;
60 if(toolbars_cnt
== 1) {
61 if(!tool_bars
.isEmpty()) {
62 QFToolBar
*tb
= tool_bars
[0];
63 tb
->setSizePolicy(QSizePolicy::Expanding
, QSizePolicy::Fixed
);
66 else if(dw
->hasMenuOnToolBar()) {
67 QFToolBar
*tb
= new QFToolBar();
68 tb
->addWidget(dw
->createToolBarMenuButton());
72 else if(toolbars_cnt
> 1) {
73 /// toolbary dej vedle sebe
74 //ly->setObjectName("boxLayout");
75 QFrame
*frm
= new QFrame();
76 QBoxLayout
*ly1
= new QHBoxLayout(frm
);
78 ly1
->setObjectName("ly1");
79 if(!tool_bars
.isEmpty()) {
80 foreach(QFToolBar
*tb
, tool_bars
) {
81 tb
->setSizePolicy(QSizePolicy::Expanding
, QSizePolicy::Fixed
);
85 if(dw
->hasMenuOnToolBar()) {
86 //QFToolBar *tb = new QFToolBar();
87 //tb->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
88 QPushButton
*bt
= dw
->createToolBarMenuButton();
89 qfTrash() << "\ttool bar button:" << bt
;
96 //ly->dumpObjectTree();
104 if(connect_want_close) {
105 connect(dw, SIGNAL(wantClose(QFDialogWidget*, int)), this, SLOT(closeDialogWidget(QFDialogWidget*, int)));
108 dw
->refreshActions();
109 /// QueuedConnection tu nemuze bejt, nefungovala by funkce closeAllDialogWidgetsButCount
110 connect(dw
, SIGNAL(wantClose(QFDialogWidget
*, int)), this, SLOT(closeDialogWidget(QFDialogWidget
*, int)));//, Qt::QueuedConnection);
114 void QFDialogWidgetStack::closeTopLevelDialogWidget(int result
)
117 //emit aboutToCloseTopLevelDialogWidget(result);
118 //qfInfo() << QFLog::stackTrace();
121 QWidget
*w
= currentWidget();
122 //QFDialogWidget *dw = topDialogWidget();
124 //qfTrash() << "\t removing dialog widget name:" << dw->objectName() << "type:" << dw->metaObject()->className();
125 /// dialog widget je umisten spolu s toolbary, menu a ostatnimi kramy ve Widgetu
126 //QWidget *w = dw->parentWidget();
132 void QFDialogWidgetStack::saveAndCloseDialogWidget() throw(QFException)
134 qfTrash() << QF_FUNC_NAME;
135 QWidget *w = currentWidget();
137 QFDialogWidget *dw = w->findChild<QFDialogWidget*>();
139 //qfTrash() << "\tclosing object of type:" << dw->metaObject()->className();
140 //qfTrash() << "\tindex of slot save():" << dw->metaObject()->indexOfMethod("save()");
141 //qfTrash() << "\tinvoking slot save():" << ;
142 QMetaObject::invokeMethod(dw, "save", Qt::DirectConnection);
149 QFDialogWidget
* QFDialogWidgetStack::topLevelDialogWidget()
151 QWidget
*w
= currentWidget();
153 QFDialogWidget
*dw
= w
->findChild
<QFDialogWidget
*>();
157 void QFDialogWidgetStack::closeAllDialogWidgetsButCount(int leaved_widget_cnt
, bool save_data
) throw( QFException
)
159 qfLogFuncFrame() << "widget count:" << count();
160 while(count() > leaved_widget_cnt
) {
161 int old_cnt
= count();
162 QFDialogWidget
*dw
= topLevelDialogWidget();
164 if(save_data
) dw
->accept();
167 if(count() == old_cnt
) {
168 /// accept() nebo reject() nezavreli, coz je chyba
170 qfWarning() << "accept() or reject() did not close widget:" << dw
;
176 void QFDialogWidgetStack::closeDialogWidget(QFDialogWidget
* w
, int result
)
178 if(!w
->canBeClosed(result
)) return;
179 closeTopLevelDialogWidget(result
);