25 #include <QApplication> 29 #include <QResizeEvent> 30 #include <QStackedLayout> 39 #include "klfsidewidget_p.h" 43 struct KLFSideWidgetManagerBasePrivate
47 sideWidgetParentConsistency =
false;
53 bool sideWidgetParentConsistency;
58 bool consistency,
QObject *parent)
65 d->sideWidgetParentConsistency = consistency;
68 d->pSideWidget = NULL;
69 d->pParentWidget = NULL;
71 Q_UNUSED(parentWidget);
87 return d->pSideWidget;
91 return d->pParentWidget;
98 if (d->pParentWidget == p) {
103 klfDbg(
"old="<<d->pParentWidget<<
", new parentWidget="<<p) ;
104 QWidget *oldpw = d->pParentWidget;
105 d->pParentWidget = p;
106 if (d->pSideWidget != NULL && d->sideWidgetParentConsistency) {
107 d->pSideWidget->setParent(d->pParentWidget);
116 if (d->pSideWidget == sideWidget) {
121 klfDbg(
"old="<<(
void*)d->pSideWidget<<
", new sideWidget="<<(
void*)sideWidget) ;
122 klfDbg(
"old="<<d->pSideWidget<<
", new sideWidget="<<sideWidget) ;
123 QWidget *oldw = d->pSideWidget;
127 if (d->pSideWidget != NULL && d->sideWidgetParentConsistency) {
128 if (d->pSideWidget->parentWidget() != d->pParentWidget) {
129 klfDbg(
"Adjusting side widget's parent to satisfy parent consistency...") ;
130 d->pSideWidget->setParent(d->pParentWidget);
131 d->pSideWidget->show();
135 klfDbg(
"about to call virtual method.") ;
155 qApp->processEvents();
156 if (tm.
elapsed() > timeout_ms) {
157 klfDbg(
"timeout while waiting for action-finished signal. timeout_ms="<<timeout_ms) ;
172 struct KLFShowHideSideWidgetManagerPrivate
179 orientation = Qt::Horizontal;
188 Qt::Orientation orientation;
220 oldw->removeEventFilter(
this);
225 "Adding a widget that is not a child of our 'parent widget' ! Correcting parent.",
241 if (neww->parentWidget()->layout() != NULL) {
248 neww->installEventFilter(
this);
260 if (d->oldParent != NULL)
261 d->oldParent->removeEventFilter(
this);
263 d->msize =
QSize(-1, -1);
266 d->msize = pw->size();
267 pw->installEventFilter(
this);
280 "We have a side widget that is not a child of our 'parent widget' ! Correcting parent.",
283 if (pw != NULL && obj == pw) {
284 if (event->
type() == QEvent::Resize) {
287 <<
"; sidewidget->isvisible="<<
sideWidget()->isVisible()) ;
288 if (
sideWidget()->isVisible() && !d->infunction) {
290 klfDbg(
"Readjusting inner widget size") ;
296 if (event->
type() == QEvent::ParentAboutToChange) {
298 }
else if (event->
type() == QEvent::ParentChange) {
328 "We have a side widget that is not a child of our 'parent widget' ! Correcting parent.",
333 d->msize = pw->size();
334 klfDbg(
"Store inner widget size as "<<d->msize) ;
336 if (d->orientation & Qt::Horizontal)
337 newSize +=
QSize(d->calcSpacing +
sideWidget()->sizeHint().width(), 0);
338 if (d->orientation & Qt::Vertical)
339 newSize +=
QSize(0, d->calcSpacing +
sideWidget()->sizeHint().height());
347 d->infunction =
true;
348 klfDbg(
"newSize is "<<newSize<<
"; d->msize is "<<d->msize) ;
349 if (newSize.isValid()) {
357 void KLFShowHideSideWidgetManager::resizeParentWidget(
const QSize& size)
365 QWidget *window = sw->window();
367 QSize diffsize = size - sw->parentWidget()->size();
368 QSize winsize = window->size() + diffsize;
369 klfDbg(
"resizing window to "<<winsize) ;
370 window->setFixedSize(winsize);
371 window->setFixedSize(
QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
372 d->infunction =
false;
386 struct KLFContainerSideWidgetManagerPrivate
390 isdestroying =
false;
393 init_pw = init_sw = NULL;
395 want_restore_saved =
true;
400 QStackedLayout *dlayout;
406 bool want_restore_saved;
409 void restore_saved_parent(QWidget *oldw)
413 klfDbg(
"oldw="<<(
void*)oldw<<
"; saved_pw="<<(
void*)saved_pw) ;
414 klfDbg(
"oldw="<<oldw<<
"; saved_pw="<<saved_pw) ;
416 oldw->setParent(saved_pw);
420 if (saved_pw != NULL && saved_pw->layout() != NULL) {
421 klfDbg(
"About to reinsert into layout "<<saved_pw->layout()) ;
422 saved_pw->layout()->addWidget(oldw);
435 klfDbg(
"parentWidget="<<parentWidget<<
", sideWidget="<<sideWidget) ;
437 d->init_pw = parentWidget;
446 d->dwidget->installEventFilter(
this);
450 d->dlayout =
new QStackedLayout(d->dwidget);
451 d->dlayout->setContentsMargins(0,0,0,0);
452 d->dlayout->setSpacing(0);
470 d->isdestroying =
true;
472 if (d->dwidget != NULL) {
477 klfDbg(
"d->dwidget="<<(
void*)d->dwidget) ;
478 klfDbg(
"d->dwidget="<<d->dwidget) ;
493 if (obj == d->dwidget) {
494 if (event->
type() == QEvent::Close) {
495 klfDbg(
"intercepting close event.") ;
507 KLF_ASSERT_NOT_NULL(d->dwidget,
"Container Widget is NULL! Did you forget to call init()?",
return false; ) ;
508 return d->dwidget->isVisible();
513 KLF_ASSERT_NOT_NULL(d->dwidget,
"Container Widget is NULL! Did you forget to call init()?",
return; ) ;
516 d->dwidget->setVisible(show);
517 d->dwidget->setFocus();
529 KLF_ASSERT_NOT_NULL(d->dwidget,
"Container Widget is NULL! Did you forget to call init()?",
return; ) ;
531 klfDbg(
"new side widget: old="<<oldw<<
", new="<<neww<<
"; want restore saved="<<d->want_restore_saved) ;
532 if (oldw != NULL && d->want_restore_saved) {
533 d->dlayout->removeWidget(oldw);
535 d->restore_saved_parent(oldw);
537 if (d->saved_pw != NULL) {
538 klfDbg(
"Disconnecting the saved parent widget.") ;
543 d->saved_pw = neww->parentWidget();
544 if (d->saved_pw != NULL) {
546 Q_UNUSED(connected) ;
547 klfDbg(
"saving pw : "<<d->saved_pw<<
" and connected to destroyed(QObject*) signal?="<<connected) ;
549 d->want_restore_saved =
true;
550 neww->setParent(NULL) ;
551 neww->setParent(d->dwidget);
552 d->dlayout->addWidget(neww);
561 if (d->dwidget->parentWidget() != newWidget)
562 d->dwidget->setParent(newWidget);
566 void KLFContainerSideWidgetManager::aWidgetDestroyed(
QObject *w)
570 if (w == d->saved_pw) {
571 klfDbg(
"saved parent "<<d->saved_pw<<
" or our own parent = "<<
parent()<<
" was destroyed!") ;
572 d->want_restore_saved =
false;
591 struct KLFFloatSideWidgetManagerPrivate
627 return new QWidget(pw, Qt::Tool|Qt::CustomizeWindowHint|Qt::WindowTitleHint
628 |Qt::WindowSystemMenuHint
629 #
if QT_VERSION >= 0x040500
630 |Qt::WindowCloseButtonHint
647 d->dwgeom = w->geometry();
649 if (show && d->dwgeom.isValid()) {
651 w->setGeometry(d->dwgeom);
703 KLF_ASSERT_NOT_NULL(f,
"Can't find factory for side widget manager type="<<type<<
"!",
return NULL; ) ;
723 return QObject::tr(
"Expand/Shrink Window",
"[[KLFSideWidgetManagerFactory]]");
725 return QObject::tr(
"Floating Tool Window",
"[[KLFSideWidgetManagerFactory]]");
727 return QObject::tr(
"Side Drawer",
"[[KLFSideWidgetManagerFactory]]");
734 QWidget *sideWidget,
QObject *parent)
744 return new KLFDrawerSideWidgetManager(parentWidget, sideWidget, parent);
760 struct KLFSideWidgetPrivate
789 _inqtdesigner =
false;
809 return d->manager->sideWidgetVisible();
836 klfDbg(
"We're in Qt Designer. DUMMY ACTION.") ;
841 if (d->swmtype == mtype) {
846 if (d->manager != NULL) {
847 d->manager->hideSideWidget();
848 klfDbg(
"deleting current manager") ;
857 KLF_ASSERT_NOT_NULL(d->manager,
"Factory returned NULL manager for type "<<mtype<<
"!",
return; ) ;
870 KLF_ASSERT_NOT_NULL(d->manager,
"Manager is NULL! For debugging purposes, I'm creating a 'float' manager !",
873 d->manager->showSideWidget(show);
879 _inqtdesigner =
false;
#define KLF_PRIVATE_HEAD(ClassName)
Base declarations for klatexformula and some utilities.
#define klfDbg(streamableItems)
print debug stream items
#define KLF_DEBUG_BLOCK(msg)
Utility to debug the execution of a block.
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QString tr(const char *sourceText, const char *disambiguation, int n)
Base class for factories.
#define KLF_ASSERT_NOT_NULL(ptr, msg, failaction)
Asserting Non-NULL pointers (NON-FATAL)
virtual bool event(QEvent *e)
#define KLF_DELETE_PRIVATE
const QSize & oldSize() const
A base abstract factory manager class.
virtual bool eventFilter(QObject *watched, QEvent *event)
QStringList allSupportedTypes()
const QSize & size() const
KLFFactoryBase * findFactoryFor(const QString &objType)
#define KLF_INIT_PRIVATE(ClassName)
#define KLF_ASSERT_CONDITION(expr, msg, failaction)
Asserting Conditions (NON-FATAL)
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
void destroyed(QObject *obj)