void QToolBar::setIconSize(const QSize &iconSize) { Q_D(QToolBar); QSize sz = iconSize; if (!sz.isValid()) { QMainWindow *mw = qobject_cast<QMainWindow *>(parentWidget()); if (mw && mw->layout()) { QLayout *layout = mw->layout(); int i = 0; QLayoutItem *item = 0; do { item = layout->itemAt(i++); if (item && (item->widget() == this)) sz = mw->iconSize(); } while (!sz.isValid() && item != 0); } } if (!sz.isValid()) { const int metric = style()->pixelMetric(QStyle::PM_ToolBarIconSize, 0, this); sz = QSize(metric, metric); } if (d->iconSize != sz) { d->iconSize = sz; setMinimumSize(0, 0); emit iconSizeChanged(d->iconSize); } d->explicitIconSize = iconSize.isValid(); d->layout->invalidate(); }
void QToolBarPrivate::startDrag(bool moving) { Q_Q(QToolBar); Q_ASSERT(state != 0); if ((moving && state->moving) || state->dragging) return; QMainWindow *win = qobject_cast<QMainWindow*>(parent); Q_ASSERT(win != 0); QMainWindowLayout *layout = qobject_cast<QMainWindowLayout*>(win->layout()); Q_ASSERT(layout != 0); if (!moving) { state->widgetItem = layout->unplug(q); #if defined(Q_WS_MAC) && !defined(QT_MAC_USE_COCOA) if (q->isWindow()) { setWindowState(true, true); //set it to floating } #endif Q_ASSERT(state->widgetItem != 0); } state->dragging = !moving; state->moving = moving; }
/*! \internal */ void QToolBar::initStyleOption(QStyleOptionToolBar *option) const { Q_D(const QToolBar); if (!option) return; option->initFrom(this); if (orientation() == Qt::Horizontal) option->state |= QStyle::State_Horizontal; option->lineWidth = style()->pixelMetric(QStyle::PM_ToolBarFrameWidth, 0, this); option->features = d->layout->movable() ? QStyleOptionToolBar::Movable : QStyleOptionToolBar::None; // if the tool bar is not in a QMainWindow, this will make the painting right option->toolBarArea = Qt::NoToolBarArea; // Add more styleoptions if the toolbar has been added to a mainwindow. QMainWindow *mainWindow = qobject_cast<QMainWindow *>(parentWidget()); if (!mainWindow) return; QMainWindowLayout *layout = qobject_cast<QMainWindowLayout *>(mainWindow->layout()); Q_ASSERT_X(layout != 0, "QToolBar::initStyleOption()", "QMainWindow->layout() != QMainWindowLayout"); layout->getStyleOptionInfo(option, const_cast<QToolBar *>(this)); }
/*! \reimp */ void QDockWidget::changeEvent(QEvent *event) { Q_D(QDockWidget); QDockWidgetLayout *layout = qobject_cast<QDockWidgetLayout*>(this->layout()); switch (event->type()) { case QEvent::ModifiedChange: case QEvent::WindowTitleChange: update(layout->titleArea()); #ifndef QT_NO_ACTION d->fixedWindowTitle = qt_setWindowTitle_helperHelper(windowTitle(), this); d->toggleViewAction->setText(d->fixedWindowTitle); #endif #ifndef QT_NO_TABBAR { QMainWindow *win = qobject_cast<QMainWindow*>(parentWidget()); if (QMainWindowLayout *winLayout = (win ? qobject_cast<QMainWindowLayout*>(win->layout()) : 0)) if (QDockAreaLayoutInfo *info = winLayout->layoutState.dockAreaLayout.info(this)) info->updateTabBar(); } #endif // QT_NO_TABBAR break; default: break; } QWidget::changeEvent(event); }
/*! Destroys the toolbar. */ QToolBar::~QToolBar() { // Remove the toolbar button if there is nothing left. QMainWindow *mainwindow = qobject_cast<QMainWindow *>(parentWidget()); if (mainwindow) { #ifdef Q_WS_MAC QMainWindowLayout *mainwin_layout = qobject_cast<QMainWindowLayout *>(mainwindow->layout()); if (mainwin_layout && mainwin_layout->layoutState.toolBarAreaLayout.isEmpty() && mainwindow->testAttribute(Qt::WA_WState_Created)) macWindowToolbarShow(mainwindow, false); #endif } }
bool QDockWidgetPrivate::isAnimating() const { Q_Q(const QDockWidget); QMainWindow *mainWin = qobject_cast<QMainWindow*>(parent); if (mainWin == 0) return false; QMainWindowLayout *mainWinLayout = qobject_cast<QMainWindowLayout*>(mainWin->layout()); if (mainWinLayout == 0) return false; return (void*)mainWinLayout->pluggingWidget == (void*)q; }
void QDockWidgetPrivate::initDrag(const QPoint &pos, bool nca) { if (state != 0) return; QMainWindow *win = qobject_cast<QMainWindow*>(parent); Q_ASSERT(win != 0); QMainWindowLayout *layout = qobject_cast<QMainWindowLayout*>(win->layout()); Q_ASSERT(layout != 0); if (layout->pluggingWidget != 0) // the main window is animating a docking operation return; state = new QDockWidgetPrivate::DragState; state->pressPos = pos; state->dragging = false; state->widgetItem = 0; state->ownWidgetItem = false; state->nca = nca; state->ctrlDrag = false; }
void QRasterWindowSurface::setGeometry(const QRect &rect) { QWindowSurface::setGeometry(rect); Q_D(QRasterWindowSurface); d->inSetGeometry = true; if (d->image == 0 || d->image->width() < rect.width() || d->image->height() < rect.height()) { #if (defined(Q_WS_X11) && !defined(QT_NO_XRENDER)) || (defined(Q_WS_WIN)) #ifndef Q_WS_WIN if (d_ptr->translucentBackground) #else if (!qt_widget_private(window())->isOpaque) #endif prepareBuffer(QImage::Format_ARGB32_Premultiplied, window()); else #endif prepareBuffer(QNativeImage::systemFormat(), window()); } d->inSetGeometry = false; #if defined(Q_WS_MAC) && defined(QT_MAC_USE_COCOA) QMainWindow* mWindow = qobject_cast<QMainWindow*>(window()); if (mWindow) { QMainWindowLayout *mLayout = qobject_cast<QMainWindowLayout*>(mWindow->layout()); QList<QToolBar *> toolbarList = mLayout->qtoolbarsInUnifiedToolbarList; for (int i = 0; i < toolbarList.size(); ++i) { QToolBar* toolbar = toolbarList.at(i); if (mLayout->toolBarArea(toolbar) == Qt::TopToolBarArea) { QWidget* tbWidget = (QWidget*) toolbar; if (tbWidget->d_func()->unifiedSurface) { tbWidget->d_func()->unifiedSurface->setGeometry(rect); } } } } #endif // Q_WS_MAC && QT_MAC_USE_COCOA }
void QToolBarPrivate::initDrag(const QPoint &pos) { Q_Q(QToolBar); if (state != 0) return; QMainWindow *win = qobject_cast<QMainWindow*>(parent); Q_ASSERT(win != 0); QMainWindowLayout *layout = qobject_cast<QMainWindowLayout*>(win->layout()); Q_ASSERT(layout != 0); if (layout->pluggingWidget != 0) // the main window is animating a docking operation return; state = new DragState; state->pressPos = pos; state->dragging = false; state->moving = false; state->widgetItem = 0; if (q->isRightToLeft()) state->pressPos = QPoint(q->width() - state->pressPos.x(), state->pressPos.y()); }
bool QToolBarPrivate::mouseMoveEvent(QMouseEvent *event) { Q_Q(QToolBar); if (!state) { #ifdef Q_WS_MAC if (!macWindowDragging) return false; QWidget *w = q->window(); const QPoint delta = event->pos() - macWindowDragPressPosition; w->move(w->pos() + delta); return true; #endif return false; } QMainWindow *win = qobject_cast<QMainWindow*>(parent); if (win == 0) return true; QMainWindowLayout *layout = qobject_cast<QMainWindowLayout*>(win->layout()); Q_ASSERT(layout != 0); if (layout->pluggingWidget == 0 && (event->pos() - state->pressPos).manhattanLength() > QApplication::startDragDistance()) { const bool wasDragging = state->dragging; const bool moving = !q->isWindow() && (orientation == Qt::Vertical ? event->x() >= 0 && event->x() < q->width() : event->y() >= 0 && event->y() < q->height()); startDrag(moving); if (!moving && !wasDragging) { #ifdef Q_OS_WIN grabMouseWhileInWindow(); #else q->grabMouse(); #endif } } if (state->dragging) { QPoint pos = event->globalPos(); // if we are right-to-left, we move so as to keep the right edge the same distance // from the mouse if (q->isLeftToRight()) pos -= state->pressPos; else pos += QPoint(state->pressPos.x() - q->width(), -state->pressPos.y()); q->move(pos); layout->hover(state->widgetItem, event->globalPos()); } else if (state->moving) { const QPoint rtl(q->width() - state->pressPos.x(), state->pressPos.y()); //for RTL const QPoint globalPressPos = q->mapToGlobal(q->isRightToLeft() ? rtl : state->pressPos); int pos = 0; QPoint delta = event->globalPos() - globalPressPos; if (orientation == Qt::Vertical) { pos = q->y() + delta.y(); } else { if (q->isRightToLeft()) { pos = win->width() - q->width() - q->x() - delta.x(); } else { pos = q->x() + delta.x(); } } layout->moveToolBar(q, pos); } return true; }
/*! \reimp */ bool QDockWidget::event(QEvent *event) { Q_D(QDockWidget); QMainWindow *win = qobject_cast<QMainWindow*>(parentWidget()); QMainWindowLayout *layout = 0; if (win != 0) layout = qobject_cast<QMainWindowLayout*>(win->layout()); switch (event->type()) { #ifndef QT_NO_ACTION case QEvent::Hide: if (layout != 0) layout->keepSize(this); d->toggleViewAction->setChecked(false); emit visibilityChanged(false); break; case QEvent::Show: d->toggleViewAction->setChecked(true); emit visibilityChanged(geometry().right() >= 0 && geometry().bottom() >= 0); break; #endif case QEvent::ApplicationLayoutDirectionChange: case QEvent::LayoutDirectionChange: case QEvent::StyleChange: case QEvent::ParentChange: d->updateButtons(); break; case QEvent::ZOrderChange: { bool onTop = false; if (win != 0) { const QObjectList &siblings = win->children(); onTop = siblings.count() > 0 && siblings.last() == (QObject*)this; } if (!isFloating() && layout != 0 && onTop) layout->raise(this); break; } case QEvent::WindowActivate: case QEvent::WindowDeactivate: update(qobject_cast<QDockWidgetLayout *>(this->layout())->titleArea()); break; case QEvent::ContextMenu: if (d->state) { event->accept(); return true; } break; // return true after calling the handler since we don't want // them to be passed onto the default handlers case QEvent::MouseButtonPress: if (d->mousePressEvent(static_cast<QMouseEvent *>(event))) return true; break; case QEvent::MouseButtonDblClick: if (d->mouseDoubleClickEvent(static_cast<QMouseEvent *>(event))) return true; break; case QEvent::MouseMove: if (d->mouseMoveEvent(static_cast<QMouseEvent *>(event))) return true; break; #ifdef Q_OS_WIN case QEvent::Leave: if (d->state != 0 && d->state->dragging && !d->state->nca) { // This is a workaround for loosing the mouse on Vista. QPoint pos = QCursor::pos(); QMouseEvent fake(QEvent::MouseMove, mapFromGlobal(pos), pos, Qt::NoButton, QApplication::mouseButtons(), QApplication::keyboardModifiers()); d->mouseMoveEvent(&fake); } break; #endif case QEvent::MouseButtonRelease: if (d->mouseReleaseEvent(static_cast<QMouseEvent *>(event))) return true; break; case QEvent::NonClientAreaMouseMove: case QEvent::NonClientAreaMouseButtonPress: case QEvent::NonClientAreaMouseButtonRelease: case QEvent::NonClientAreaMouseButtonDblClick: d->nonClientAreaMouseEvent(static_cast<QMouseEvent*>(event)); return true; case QEvent::Move: d->moveEvent(static_cast<QMoveEvent*>(event)); break; case QEvent::Resize: // if the mainwindow is plugging us, we don't want to update undocked geometry if (isFloating() && layout != 0 && layout->pluggingWidget != this) d->undockedGeometry = geometry(); break; default: break; } return QWidget::event(event); }